DELIMITER // CREATE OR REPLACE PROCEDURE checklogin( IN p_token VARCHAR(100), IN p_userid VARCHAR(100), IN p_pwd VARCHAR(200), IN p_logintype VARCHAR(10) -- 由 app 或 web 或其他來源登入 ) /* Function : 判斷能否 Login(前端登入時呼叫), 如果可以就傳回 Token Description: 判斷 Token 是否過期, 若未過期, 傳回 0, 已過期傳回 9, 密碼錯誤傳回 4 Build Date : 2018/03/02 Modify History Item Who Date Modify Docs ==== ========== ========== ================================================ 1 Michael 2018/01/08 開始改寫為 MySQL 版 2 Michael 2018-03-20 新增 isstop 帳號停用的判斷 3 Michael 2018-03-26 回傳值改為 2個 dataset 傳回 code,msg,recno 後面才接 data 內容 4 Michael 2022-11-26 新增 join 部門資料, 存在 localStoreage 5 Michael 2023-02-04 新增 join 公司名稱, 存在 localStoreage Call Sample: CALL checklogin('token123', 'user01', 'password123', 'web'); */ BEGIN DECLARE v_uuid VARCHAR(36); DECLARE v_lastlogintime DATETIME; DECLARE v_recno INT; DECLARE v_diffhour INT; DECLARE v_statuscode INT; DECLARE v_errMsg VARCHAR(200); DECLARE v_newtoken VARCHAR(100); DECLARE v_longday INT; -- 0: token 永久有效 其他: token 的效期天數 SET v_longday = 0; -- token 預設永久有效 SET v_statuscode = 9; SET v_errMsg = 'Token 過期或錯誤!'; SET v_recno = 0; SET v_newtoken = ''; -- 檢查 token 是否有效 SELECT COUNT(*), MAX(lastlogintime) INTO v_recno, v_lastlogintime FROM sys_users WHERE userid = p_userid AND IFNULL(isstop, '') <> 'Y' AND IFNULL(token, 'null') = p_token GROUP BY token; IF v_recno > 0 THEN SELECT TIMESTAMPDIFF(HOUR, v_lastlogintime, NOW()) INTO v_diffhour; IF v_diffhour >= 24*v_longday AND v_longday > 0 THEN SET v_statuscode = 9; SET v_errMsg = 'token 已過期,請重新登入!'; ELSE SET v_statuscode = 0; SET v_errMsg = '登入成功!'; SET v_newtoken = p_token; END IF; ELSE SET v_recno = 0; SELECT COUNT(*) INTO v_recno FROM sys_users WHERE userid = p_userid AND IFNULL(isstop, '') <> 'Y' AND IFNULL(pwd, '') = p_pwd; IF v_recno > 0 THEN SET v_uuid = UUID(); UPDATE sys_users SET token = v_uuid, lastlogintime=NOW() WHERE userid = p_userid; SET v_newtoken = v_uuid; SET v_statuscode = 0; SET v_errMsg = '登入成功!'; ELSE SET v_statuscode = 4; SET v_errMsg = '帳號或密碼輸入錯誤!'; END IF; END IF; -- 寫入 log(return error) CALL api_log(v_newtoken, v_errMsg); -- 回傳值 dataset[0], 前3個欄位有固定的內容 SELECT v_statuscode AS code, v_errMsg AS msg, v_recno AS recno; -- 回傳值 dataset[1], 順便回傳 user info SELECT u.*, d.departmentid, d.departmentcname, IFNULL(x.pvalue, 'Kylin Admin') AS corpname FROM sys_users u LEFT JOIN basperson p ON p.personid = u.userid LEFT JOIN basdepartment d ON d.departmentid = p.departmentid LEFT JOIN sys_parameter x ON x.pid = 'corpname' WHERE IFNULL(u.token, 'null') = v_newtoken; END// DELIMITER ;