first commit

This commit is contained in:
DATAEXPRESS\4734
2026-02-06 15:09:39 +08:00
commit 3f342cee87
35 changed files with 3572 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
DELIMITER //
CREATE OR REPLACE PROCEDURE api_log(
IN p_token VARCHAR(100),
IN p_cont TEXT
)
/*
Function : server.js 呼叫使用, 主要是將執行過的 api 都記錄到 log 中
Description:
Build Date : 2023-12-10
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2023-12-10 改寫為 MySQL 版
*/
BEGIN
DECLARE v_userid VARCHAR(20);
-- 根據傳入的 token 取得 userid
SELECT userid INTO v_userid FROM sys_users WHERE token = p_token;
-- 新增一筆 api log record (移到 server.js 的共用程式處理較適合)
INSERT INTO sys_apilog (calldate, calluser, api_content) VALUES (NOW(), v_userid, p_cont);
-- 獨立執行的存儲過程不需要回傳值
END //
DELIMITER ;
+99
View File
@@ -0,0 +1,99 @@
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 ;
+59
View File
@@ -0,0 +1,59 @@
DELIMITER //
CREATE OR REPLACE FUNCTION checktoken(
p_token VARCHAR(200)
)
/*
Function : 判斷傳入的 Token 是否過期, 若未過期, 傳回 userid, 已過期傳回空白
Description: 判斷 Token 是否過期, 若未過期, 傳回 0, 已過期傳回 9
簡單的測試 ok
Build Date : 2018/03/02
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2018/01/08 開始改寫為 MySQL 版
*/
RETURNS VARCHAR(100)
DETERMINISTIC
BEGIN
DECLARE v_lastlogintime DATETIME;
DECLARE v_recno INT;
DECLARE v_diffhour INT;
DECLARE v_statuscode INT;
DECLARE v_errMsg VARCHAR(200);
DECLARE v_longday INT; -- 0: token 永久有效 其他: token 的效期天數
DECLARE v_userid VARCHAR(100);
SET v_longday = 0; -- token 預設永久有效
SET v_statuscode = 4;
SET v_userid = '';
SET v_errMsg = '帳號或密碼錯誤!';
SELECT COUNT(*), userid, lastlogintime
INTO v_recno, v_userid, v_lastlogintime
FROM sys_users
WHERE IFNULL(isstop, '') <> 'Y'
AND IFNULL(token, 'null') = p_token
GROUP BY userid, lastlogintime;
IF v_recno > 0 THEN
-- 如果傳入 token
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 已過期,請重新登入!';
SET v_userid = '';
ELSE
SET v_statuscode = 0;
SET v_errMsg = 'token 有效!';
END IF;
END IF;
-- 回傳值 dataset[0], 前3個欄位有固定的內容
RETURN IFNULL(v_userid, '');
END //
DELIMITER ;
+53
View File
@@ -0,0 +1,53 @@
delimiter //
create or replace procedure editmember(
in token varchar(100),
in userid varchar(100),
in username nvarchar(100),
in email varchar(100),
in pwd varchar(200)
)
/*
Function : 修改會員資料
Description: 原則: 傳入內容若是空白就不更新
Build Date : 2018/04/12
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2018/01/08 開始改寫為 MySQL 版
*/
begin
/*
先寫一個簡單的 insert 版本
uuid 寫入驗證碼(ddmmyy)
後面還要再加入判斷檢查的機制, 及 error code 回傳等 ..
*/
if username <> '' then
update sys_users set username = username where userid = userid and username <> username;
end if;
if email <> '' then
update sys_users set email = email where userid = userid and email <> email;
end if;
if pwd <> '' and pwd <> 'nopwd' then
update sys_users set pwd = pwd where userid = userid and pwd <> pwd;
end if;
-- 回傳 ds1
select 0 as code, '修改會員成功' as msg, 1 as recno;
-- 回傳 ds2
select
coalesce(userid, '') as userid,
coalesce(username, '') as username,
coalesce(email, '') as email,
token
from sys_users where coalesce(token, 'null') = token;
end //
delimiter ;
+102
View File
@@ -0,0 +1,102 @@
delimiter //
create or replace procedure get_menustructure()
/*
Function : 配合 amis 的 transfer, 取得 module-menu 資料, 主要是建立 role-menu permissions 用
Description: 本 sp 修改自 get_orgstructure
Build Date : 2021/10/19
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2021/10/19
*/
begin
declare max_val int;
declare curr_id int;
declare group_id int;
declare next_group_id int;
declare datas nvarchar(max);
declare footer varchar(600);
declare dept_name varchar(100);
declare emp_name varchar(100);
declare person_id varchar(100);
declare crlf varchar(2);
declare comm varchar(1);
set crlf = char(10) + char(13);
select
bp.moduleid, bp.menuid, '(' || bp.moduleid || ')' || bm.modulename as deptname,
'(' || bp.menuid || ')' || bp.caption as empname,
ROW_NUMBER() OVER(PARTITION BY bp.moduleid ORDER BY bp.moduleid, bp.menuid) AS groupid,
ROW_NUMBER() OVER(ORDER BY bp.moduleid, bp.menuid) AS rowid
into #tmp
from sys_menutable bp
left join sys_module bm on bp.moduleid = bm.moduleid
where coalesce(bp.moduleid, '') <> ''
order by bp.moduleid, bp.menuid;
select count(*) into max_val from #tmp;
select min(rowid) into curr_id from #tmp;
set datas = '';
set comm = '';
while (curr_id <= max_val) do
-- 取得現有資料
select groupid, deptname, empname, menuid into group_id, dept_name, emp_name, person_id
from #tmp where rowid = curr_id;
if curr_id = max_val then
set comm = '';
else
select groupid into next_group_id from #tmp where rowid = curr_id + 1;
if next_group_id = 1 then
set comm = '';
else
set comm = ',';
end if;
end if;
if group_id = 1 then
if curr_id > 1 then
set footer = ' ]' || crlf ||
' },' || crlf;
else
set footer = '';
end if;
set datas = datas || footer ||
' {' || crlf ||
' "label": "' || dept_name || '",' || crlf ||
' "children": [' || crlf ||
' {' || crlf ||
' "label": "' || emp_name || '",' || crlf ||
' "value": "' || person_id || '"' || crlf ||
' }' || comm || crlf;
else
set datas = datas ||
' {' || crlf ||
' "label": "' || emp_name || '",' || crlf ||
' "value": "' || person_id || '"' || crlf ||
' }' || comm || crlf;
end if;
set curr_id = curr_id + 1;
end while;
set datas = ' [' || crlf || datas ||
' ]' || crlf ||
' }' || crlf ||
' ]';
drop table #tmp;
select 0 as code, 'ok' as msg;
select datas as jsoncode;
end //
delimiter ;
+42
View File
@@ -0,0 +1,42 @@
DELIMITER //
CREATE PROCEDURE get_module_security (
IN p_token VARCHAR(100), -- 新增 token 判斷
IN p_moduleid VARCHAR(20)
)
/*
Function : 依 Security 的設定, 判斷該 user 所有 menu 的權限
Description: 配合 login 後, 寫入 localStorage
Build Date : 2023-12-10
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2023-12-10 改寫為 MySQL 版
*/
BEGIN
DECLARE v_recno INT;
DECLARE v_statuscode INT;
DECLARE v_errMsg NVARCHAR(200);
DECLARE v_userid VARCHAR(20);
SET v_statuscode = 0;
SET v_errMsg = '成功!';
SET v_recno = 1;
-- 根據傳入的 token 取得 userid
SELECT userid INTO v_userid FROM sys_users WHERE token = p_token;
-- 回傳值 dataset[0], 前3個欄位有固定的內容
SELECT v_statuscode AS code, v_errMsg AS msg, v_recno AS recno;
-- 回傳值 dataset[1], 實際的資料
SELECT DISTINCT menuid, controlname FROM sys_rolemenusecurity
WHERE (roleid IN (SELECT DISTINCT roleid FROM sys_userroles WHERE userid = v_userid) OR roleid = '00')
AND EXISTS (SELECT * FROM sys_menutable x WHERE x.menuid = sys_rolemenusecurity.menuid AND moduleid = p_moduleid)
AND controlname <> 'read';
END //
DELIMITER ;
+264
View File
@@ -0,0 +1,264 @@
delimiter //
create procedure get_treedata(
in p_type varchar(20) default 'sprintid', -- sprint etc..
in p_para01 nvarchar(100) default '1' -- 特別傳入的參數, 目前是 bookid 會傳入 1, 擴充用途(說明如下)
)
/*
Function : 配合 amis 的 treeview, 取得 year-sprint 類的2階資料
目前的寫法只適用於固定2階, 如果階數不固定, 要找時間修改(bom 展開), 暫時不適用
擴充 @para, 目前是電子書專用, 如果有 @, @後的就是內文的全文檢索內容
Description: 可以用在 pbi, 會計科目等左方有 tree-view 的 UX, api 回傳用 6
新增 @type 參數
sprint 取得 year-sprint 資料(給 menu 使用)
basdepartment
acctitle 取得 類別-科目 資料(大部分都是用這個)
eipmxx.idno 避免 key 重複導致的錯誤
Build Date : 2021/10/19
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2021/11/26
2 Michael 2021/12/31 新增 on lone books
3 Michael 2022/04/14 新增 sys_aside_setup, aside 改為依設定即可產生 aside 相關 json 設定
4 Michael 2022/06/19 @type 加上 tag.type 以防止重複, tag 僅供識別用
5 Michael 2022/07/18 key-value 擴充能支援2層式的 tree(開發中)
6 Michael 2022/07/27 擴充 @para01 內容, 支援內文查詢過濾
7 Michael 2023/01/13 將 @para01 第一碼的 bookid 改為傳入 functag
*/
as
declare max_val int;
declare curr_id int;
declare group_id int;
declare next_group_id int;
declare datas nvarchar(max);
declare footer varchar(600);
declare dept_name varchar(100);
declare emp_name varchar(100);
declare person_id varchar(100);
declare crlf varchar(2);
declare comm varchar(1);
declare aside_id varchar(100);
declare group_partitionby varchar(100);
declare group_orderby varchar(100);
declare row_orderby varchar(100);
declare filter_field varchar(100);
declare tablename varchar(100);
declare rel_tablename varchar(100);
declare g_partition1 varchar(100);
declare g_partition2 varchar(100);
declare filter_value varchar(100);
declare para02 varchar(100);
declare pos int;
declare cnt int;
declare sql_cmd nvarchar(max);
set crlf = char(10) + char(13);
declare data table (
xr_id varchar(100), x_id varchar(100),
xr_name varchar(100), x_name varchar(100),
groupid int, rowid int
);
-- 取得相關設定參數
select
aside_id, group_partitionby, group_orderby, row_orderby,
filter_field, tablename, rel_tablename, filter_value
into aside_id, group_partitionby, group_orderby, row_orderby,
filter_field, tablename, rel_tablename, filter_value
from sys_aside_setup where aside_id = p_type;
-- 去除 p_type 中的 tag
set pos = charindex('.', p_type);
if pos > 0 then
set p_type = substring(p_type, pos + 1, len(p_type));
end if;
set sql_cmd = '';
set pos = charindex('@', p_para01);
set para02 = '';
if pos > 0 then
set para02 = substring(p_para01, pos + 1, 100);
set p_para01 = substring(p_para01, 1, pos - 1);
-- 將 p_para01 由 functag 改為 bookid, add by Michael 2023/01/13
select keyid into p_para01 from zen_keyvalue where fieldname = 'book_mapping_id' and keyvalue = p_para01;
if isnull(p_para01, '') = '' then
set p_para01 = '1';
end if;
end if;
set cnt = 0;
select count(*) into cnt from zen_keyvalue where fieldname = 'classid' and isnull(keydesc, '') <> '';
if isnull(filter_field, '') <> '' and isnull(filter_value, '') <> '' then
set filter_value = char(39) + filter_value + char(39);
end if;
set sql_cmd = '';
if p_type <> 'classid' then
if isnull(group_partitionby, '') <> '' then
set g_partition1 = 'Partition by ' + group_partitionby;
set g_partition2 = 'R.' + group_partitionby + ',';
end if;
if rel_tablename = '' then
if cnt > 0 then
set g_partition1 = 'Partition by keydesc';
set g_partition2 = 'keydesc,';
set sql_cmd =
'insert into sys_aside_temp (aside_guid, xr_id, x_id, xr_name, x_name, groupid, rowid)' +
' select ' + char(39) + p_type + char(39) + ',' +
case when group_id = '*' then char(39) + group_id + char(39) else group_id end + ',' + row_id + ',' +
case when group_id = '*' then char(39) + group_name + char(39) else group_name end + ',' + row_name + ',' +
' ROW_NUMBER() OVER(' + g_partition1 + ' ORDER BY ' + group_orderby + ') AS groupid,' +
' ROW_NUMBER() OVER(ORDER BY ' + g_partition2 + row_orderby + ') AS rowid' +
' from ' + tablename +
' where coalesce(' + row_id + ', char(39) + char(39)) <> ' + char(39) + char(39) + filter_value;
else
set sql_cmd =
'insert into sys_aside_temp (aside_guid, xr_id, x_id, xr_name, x_name, groupid, rowid)' +
' select ' + char(39) + p_type + char(39) + ',' +
case when group_id = '*' then char(39) + group_id + char(39) else group_id end + ',' + row_id + ',' +
case when group_id = '*' then char(39) + group_name + char(39) else group_name end + ',' + row_name + ',' +
' ROW_NUMBER() OVER(' + g_partition1 + ' ORDER BY ' + group_orderby + ') AS groupid,' +
' ROW_NUMBER() OVER(ORDER BY ' + g_partition2 + row_orderby + ') AS rowid' +
' from ' + tablename +
' where coalesce(' + row_id + ', char(39) + char(39)) <> ' + char(39) + char(39) + filter_value;
end if;
else
set sql_cmd =
'insert into sys_aside_temp (aside_guid, xr_id, x_id, xr_name, x_name, groupid, rowid)' +
' select ' + char(39) + p_type + char(39) + ',' +
case when group_id = '*' then char(39) + 'R.' + group_id + char(39) else 'R.' + group_id end + ',' + 'M.' + row_id + ',' +
case when group_id = '*' then char(39) + 'R.' + group_name + char(39) else 'R.' + group_name end + ',' + 'M.' + row_name + ',' +
' ROW_NUMBER() OVER(' + g_partition1 + ' ORDER BY ' + 'M.' + group_orderby + ') AS groupid,' +
' ROW_NUMBER() OVER(ORDER BY ' + g_partition2 + 'M.' + row_orderby + ') AS rowid' +
' from ' + tablename + ' M' +
' left join ' + rel_tablename + ' R on M.' + group_partitionby + ' = R.' + group_partitionby +
' where coalesce(' + 'M.' + row_id + ', char(39) + char(39)) <> ' + char(39) + char(39) + filter_value;
end if;
else
if isnull(group_partitionby, '') = '' then
set sql_cmd =
'insert into sys_aside_temp (aside_guid, xr_id, x_id, xr_name, x_name, groupid, rowid) ' +
'select ' + char(39) + p_type + char(39) + ',' +
' x.' + group_id + ', x.' + row_id + ', b.' + group_name + ', x.' + group_name + ', groupid, rowid' + crlf +
'from' + crlf +
'(' + crlf +
' select ' + group_id + ',' + row_id + ',' + group_name + ',' +
case when group_name <> row_name then row_name + ',' else '' end +
group_id + ' as p_classid,' + crlf +
' ROW_NUMBER() OVER(ORDER BY ' + group_orderby + ') AS groupid,' + crlf +
' ROW_NUMBER() OVER(ORDER BY ' + row_orderby + ') AS rowid' + crlf +
' from ' + tablename + crlf +
' where coalesce(' + group_id + ', char(39) + char(39)) <> ' + char(39) + char(39) + ' and ' + filter_field + ' = ' + p_para01 + crlf +
case when para02 <> '' then ' and book_desc like ' + char(39) + '%' + para02 + '%' + char(39) else '' end + crlf +
') x' + crlf +
'left join ' + tablename + ' b on x.p_classid = b.' + row_id + ' and ' + filter_field + ' = ' + p_para01;
else
set sql_cmd =
'insert into sys_aside_temp (aside_guid, xr_id, x_id, xr_name, x_name, groupid, rowid) ' +
'select ' + char(39) + p_type + char(39) + ',' +
' x.' + group_id + ', x.' + row_id + ', b.' + group_name + ', x.' + group_name + ', groupid, rowid' + crlf +
'from' + crlf +
'(' + crlf +
' select ' + group_id + ',' + row_id + ',' + group_name + ',' +
case when group_name <> row_name then row_name + ',' else '' end +
group_id + ' as p_classid,' + crlf +
' ROW_NUMBER() OVER(Partition by ' + group_partitionby + ' ORDER BY ' + group_orderby + ') AS groupid,' + crlf +
' ROW_NUMBER() OVER(ORDER BY ' + row_orderby + ') AS rowid' + crlf +
' from ' + tablename + crlf +
' where coalesce(' + group_id + ', char(39) + char(39)) <> ' + char(39) + char(39) + ' and ' + filter_field + ' = ' + p_para01 + crlf +
case when para02 <> '' then ' and book_desc like ' + char(39) + '%' + para02 + '%' + char(39) else '' end + crlf +
') x' + crlf +
'left join ' + tablename + ' b on x.p_classid = b.' + row_id + ' and ' + filter_field + ' = ' + p_para01;
end if;
end if;
print sql_cmd;
execute immediate sql_cmd;
-- 配合原程式, 將資料寫入 data
insert into data select xr_id, x_id, xr_name, x_name, groupid, rowid from sys_aside_temp where aside_guid = p_type;
delete from sys_aside_temp where aside_guid = p_type;
/* 開始 main loop */
select count(*) into max_val from data;
select min(rowid) into curr_id from data;
set datas = '';
set comm = '';
while (curr_id <= max_val) do
-- get data
select groupid, xr_name, x_id, x_name into group_id, deptname, personid, empname from data where rowid = curr_id;
if curr_id = max_val then
set comm = '';
else
select groupid into next_group_id from data where rowid = curr_id + 1;
if next_group_id = 1 then
set comm = '';
else
set comm = ',';
end if;
end if;
if group_id = 1 then
if curr_id > 1 then
/* 開始 main loop */
select @max=count(*) from @data;
select @currid=min(rowid) from @data;
set @datas = '';
set @comm = '';
while (@currid <= @max)
begin
-- get data
select @groupid=groupid,@deptname=xr_name,@personid=x_id,@empname=x_name from @data where rowid = @currid;
if @currid = @max
set @comm = ''
else begin
select @next_groupid=groupid from @data where rowid = @currid + 1;
if @next_groupid = 1 set @comm = '' else set @comm = ',';
end;
if @groupid = 1 begin
if @currid > 1
set @footer = ' ]' + @crlf +
' },' + @crlf
else
set @footer = '';
set @datas = @datas + @footer +
' {' + @crlf +
' "label": "'+@deptname+'",' + @crlf +
' "children": [' + @crlf +
' {' + @crlf +
' "label": "'+@empname+'",' + @crlf +
' "value": "'+@personid+'"' + @crlf +
' }' + @comm + @crlf;
end
else
set @datas = @datas +
' {' + @crlf +
' "label": "'+@empname+'",' + @crlf +
' "value": "'+@personid+'"' + @crlf +
' }' + @comm + @crlf;
set @currid = @currid + 1;
end;
set @datas = ' [' + @crlf + @datas +
' ]' + @crlf +
' }' + @crlf +
' ]';
select 0 as code,'ok' as msg;
select @datas as jsoncode;
+48
View File
@@ -0,0 +1,48 @@
DELIMITER //
CREATE PROCEDURE resetpwd (
IN p_token VARCHAR(100),
IN p_orgpwd VARCHAR(200),
IN p_newpwd VARCHAR(200),
IN p_newpwd2 VARCHAR(200)
)
/*
Function : 重置密碼
Description: 修改自 sp=regmember
Build Date : 2023-12-10
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2023-12-10 改寫為 MySQL 版
*/
BEGIN
DECLARE v_userid VARCHAR(100);
DECLARE v_err_code SMALLINT;
DECLARE v_err_msg NVARCHAR(100);
IF p_newpwd <> p_newpwd2 THEN
SET v_err_code = 2;
SET v_err_msg = '新密碼輸入錯誤, 請重新設定';
ELSE
-- 根據傳入的 token 取得 userid
SELECT userid INTO v_userid FROM sys_users WHERE token = p_token AND pwd = p_orgpwd;
SET v_err_code = 0;
SET v_err_msg = 'reset pwd ok';
IF COALESCE(v_userid, '') <> '' THEN
UPDATE sys_users SET pwd = p_newpwd WHERE userid = v_userid;
ELSE
SET v_err_code = 4;
SET v_err_msg = '原密碼輸入錯誤, 請重新輸入';
END IF;
END IF;
-- 回傳 ds1
SELECT v_err_code AS code, v_err_msg AS msg;
END //
DELIMITER ;
+38
View File
@@ -0,0 +1,38 @@
DELIMITER //
CREATE PROCEDURE sysexec (
IN p_token VARCHAR(100),
IN p_sql TEXT
)
BEGIN
DECLARE v_userid VARCHAR(100);
DECLARE v_exstr TEXT;
-- 根據傳入的 token 取得 userid
SET v_userid = '';
SELECT userid INTO v_userid FROM sys_users WHERE token = p_token;
IF COALESCE(v_userid, '') = '' THEN
SELECT 9 AS code, '請先登入系統再執行!!' AS msg;
SELECT '';
ELSEIF LOCATE('delete ', p_sql) > 0 OR LOCATE('drop ', p_sql) > 0 THEN
SELECT 4 AS code, '內含不允許執行的 SQL 語法, 請重新輸入?!' AS msg;
SELECT '';
ELSE
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 9 AS code, '語法有錯,請檢查語法後再重新執行!!' AS msg;
SELECT '';
END;
SELECT 0 AS code, '成功執行 SQL 語法' AS msg;
SET @v_exstr = p_sql;
PREPARE v_exstr FROM @v_exstr;
EXECUTE v_exstr;
END;
END IF;
END //
DELIMITER ;
+125
View File
@@ -0,0 +1,125 @@
DELIMITER //
CREATE OR REPLACE FUNCTION udf_myfavor(
p_moduleid VARCHAR(100),
p_userid VARCHAR(20),
p_ver_type VARCHAR(10),
p_ip VARCHAR(100),
p_db2 VARCHAR(100)
)
RETURNS LONGTEXT
DETERMINISTIC
/*
function : 將傳入的字串, 依 @split 固定切割為 2筆資料, 仍傳回 table, 這是特殊的用法
description:
呼叫範例 SELECT udf_myfavor('eip','admin','beta','','')
build date : 2023/11/01
modify history
item who date modify docs
==== ========== ========== ================================================
1 michael 2023/11/01 新增
*/
BEGIN
DECLARE v_ret_menu LONGTEXT;
DECLARE v_imax2 INT;
DECLARE v_y2 INT;
DECLARE v_comma VARCHAR(1);
DECLARE v_id2 VARCHAR(100);
DECLARE v_name2 VARCHAR(100);
DECLARE v_isLocalMenu VARCHAR(1);
DECLARE v_crlf VARCHAR(2);
-- 創建臨時表來存儲數據
DROP TEMPORARY TABLE IF EXISTS temp_menu_favor;
CREATE TEMPORARY TABLE temp_menu_favor (
menuid VARCHAR(100),
caption VARCHAR(100),
isLocalMenu VARCHAR(1),
rowid INT AUTO_INCREMENT PRIMARY KEY
) ENGINE=MEMORY;
-- 插入數據到臨時表
INSERT INTO temp_menu_favor (menuid, caption, isLocalMenu)
SELECT a.functiontag, b.caption, IFNULL(b.isLocalMenu, 'N')
FROM sys_myfavor a
LEFT JOIN sys_menutable b ON a.functiontag = b.menuid
WHERE module = p_moduleid AND userid = p_userid;
SET v_ret_menu = '';
SET v_crlf = CHAR(10);
-- 內層迴圈
SELECT IFNULL(MAX(rowid), 0) INTO v_imax2 FROM temp_menu_favor;
SELECT IFNULL(MIN(rowid), 0) INTO v_y2 FROM temp_menu_favor;
WHILE v_y2 <= v_imax2 AND v_imax2 > 0 DO
IF v_y2 = v_imax2 THEN
SET v_comma = '';
ELSE
SET v_comma = ',';
END IF;
SELECT menuid, caption, isLocalMenu
INTO v_id2, v_name2, v_isLocalMenu
FROM temp_menu_favor
WHERE rowid = v_y2;
IF v_isLocalMenu = 'Y' THEN
-- 本地端 json 程式
SET v_ret_menu = CONCAT(
v_ret_menu,
' {', v_crlf,
' "label": "', v_name2, '",', v_crlf,
' "url": "/', p_moduleid, '/', v_id2, '",', v_crlf,
' "schemaApi": "get:/pages/', v_id2, '.json"', v_crlf,
' }', v_comma, v_crlf
);
ELSE
-- 真正的動態載入 code(test ok, but wait to use)
SET v_ret_menu = CONCAT(
v_ret_menu,
' {', v_crlf,
' "label": "', v_name2, '",', v_crlf,
' "url": "/', p_moduleid, '/', v_id2, '",', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "', v_id2, '",', v_crlf,
' "para02": "', p_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' }', v_comma, v_crlf
);
END IF;
SET v_y2 = v_y2 + 1;
END WHILE;
IF v_ret_menu <> '' THEN
SET v_ret_menu = CONCAT(
' {', v_crlf,
' "children": [', v_crlf,
' {', v_crlf,
' "label": "我的最愛",', v_crlf,
' "url": "/sys",', v_crlf,
' "icon": "fa fa-heart-o",', v_crlf,
' "children": [', v_crlf,
v_ret_menu,
' ]', v_crlf,
' }', v_crlf,
' ]', v_crlf,
' },', v_crlf
);
END IF;
-- 清理臨時表
DROP TEMPORARY TABLE IF EXISTS temp_menu_favor;
RETURN v_ret_menu;
END //
DELIMITER ;
+39
View File
@@ -0,0 +1,39 @@
DELIMITER //
CREATE PROCEDURE verifycode (
IN site NVARCHAR(100),
IN email VARCHAR(100)
)
/*
Function : 取得驗證碼, 目前是 for 忘記密碼
Description: 修改自 sp=regmember
Build Date : 2023-12-10
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2023-12-10 改寫為 MySQL 版
*/
BEGIN
/*
先寫一個簡單的版本
後面還要再加入判斷檢查的機制, 及 error code 回傳等 ..
*/
DECLARE verifycode VARCHAR(10);
DECLARE randnum INT;
SET randnum = ROUND(RAND() * 20, 0);
IF randnum < 3 THEN
SET randnum = 7;
END IF;
SET verifycode = randnum * (DAY(NOW()) + MONTH(NOW())) * YEAR(NOW());
-- 回傳 ds1
SELECT 0 AS code, '取得驗證碼' AS msg, 1 AS recno;
-- 回傳 verifycode
SELECT verifycode AS verifycode;
END//
DELIMITER ;
+103
View File
@@ -0,0 +1,103 @@
DELIMITER //
CREATE PROCEDURE zen_codeinit (
IN p_new_ip VARCHAR(100),
IN p_new_db1 VARCHAR(100), -- Business
IN p_new_db2 VARCHAR(100) -- Wizard
)
/*
Function : 登入後設定 zen_jsoncode 的 ip 及 db
Description: 原本想自動化執行, 但穩妥起見, 目前先仍維持手動執行一次(切換環境時), 目前暫不使用, 手動改 ip 即可
Sample:
Build Date : 2023-12-10
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2023-12-10 改寫為 MySQL 版
*/
BEGIN
DECLARE v_cnt INT;
DECLARE v_org_ip VARCHAR(100);
DECLARE v_org_db1 VARCHAR(100); -- Business
DECLARE v_org_db2 VARCHAR(100); -- Wizard
/*
要先想辦法解析(或手工設定) 在 zen_jsoncode 內的 ip 及 db
目前僅先考慮出廠的變更, 也就是
org 的內容
ip 只會有 127.0.0.1 和 gcp-api.gex.com.tw 或 api.gex.com.tw
db 只會有 zenBusiness / zenWizard / zenEIS
db 二合一很簡單, 但是一分為二, 就麻煩了
*/
SET v_org_ip = '';
SELECT COUNT(*) INTO v_cnt FROM zen_jsoncode WHERE jsoncode LIKE '%127.0.0.1%';
IF v_cnt > 0 THEN
SET v_org_ip = '127.0.0.1';
ELSE
SELECT COUNT(*) INTO v_cnt FROM zen_jsoncode WHERE jsoncode LIKE '%gcp-api.gex.com.tw%';
IF v_cnt > 0 THEN
SET v_org_ip = 'gcp-api.gex.com.tw';
ELSE
SELECT COUNT(*) INTO v_cnt FROM zen_jsoncode WHERE jsoncode LIKE '%api.gex.com.tw%';
IF v_cnt > 0 THEN
SET v_org_ip = 'api.gex.com.tw';
END IF;
END IF;
END IF;
SET v_org_db1 = '';
SELECT COUNT(*) INTO v_cnt FROM zen_jsoncode WHERE jsoncode LIKE '%zenEIS%';
IF v_cnt > 0 THEN
SET v_org_db1 = 'zenEIS';
SET v_org_db2 = 'zenEIS';
ELSE
SET v_org_db1 = 'zenBusiness';
SET v_org_db2 = 'zenWizard';
END IF;
-- 如果是其他非出廠 SOP 的特殊作業, 只能手工設定
/*
SET v_org_ip = '127.0.0.1';
SET v_org_db1 = 'xxxdb1';
SET v_org_db2 = 'xxxdb2';
*/
-- update ip
UPDATE zen_jsoncode
SET jsoncode = REPLACE(jsoncode, v_org_ip, p_new_ip),
jsoncode2 = REPLACE(jsoncode2, v_org_ip, p_new_ip),
jsoncode3 = REPLACE(jsoncode3, v_org_ip, p_new_ip);
-- 如果 db 是一分為二, 要多判斷 sys
IF v_org_db1 = 'zenEIS' AND p_new_db1 <> 'zenEIS' THEN
UPDATE zen_jsoncode
SET jsoncode = REPLACE(jsoncode, v_org_db1, p_new_db1),
jsoncode2 = REPLACE(jsoncode2, v_org_db1, p_new_db1),
jsoncode3 = REPLACE(jsoncode3, v_org_db1, p_new_db1);
UPDATE zen_jsoncode
SET jsoncode = REPLACE(jsoncode, v_org_db2, p_new_db2),
jsoncode2 = REPLACE(jsoncode2, v_org_db2, p_new_db2),
jsoncode3 = REPLACE(jsoncode3, v_org_db2, p_new_db2);
ELSE
UPDATE zen_jsoncode
SET jsoncode = REPLACE(jsoncode, v_org_db1, p_new_db1),
jsoncode2 = REPLACE(jsoncode2, v_org_db1, p_new_db1),
jsoncode3 = REPLACE(jsoncode3, v_org_db1, p_new_db1);
UPDATE zen_jsoncode
SET jsoncode = REPLACE(jsoncode, v_org_db2, p_new_db2),
jsoncode2 = REPLACE(jsoncode2, v_org_db2, p_new_db2),
jsoncode3 = REPLACE(jsoncode3, v_org_db2, p_new_db2);
END IF;
-- 回傳 ds1
SELECT 0 AS code, 'ok' AS msg;
END //
DELIMITER ;
+402
View File
@@ -0,0 +1,402 @@
DELIMITER //
CREATE OR REPLACE PROCEDURE zen_dynamicMenu(
IN p_token VARCHAR(100),
IN p_moduleid VARCHAR(10),
IN p_ip VARCHAR(100),
IN p_db1 VARCHAR(100),
IN p_db2 VARCHAR(100)
)
/*
Function : 根據 menu 產生 amis 所需的 site.json 內容
Description: 每一筆 menu 都預設先有一個 00 role(EveryOne)
Build Date : 2021/08/14
CALL zen_dynamicMenu('89b179f7-72a0-11f0-9c5f-d8bbc15c1404','zen','https://api.gex.com.tw:8033','EIS_demo','EIS_demo');
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2022-05-05 微調2個判斷, 避免組出的 site menu 因逗號錯誤無法顯示 menu
2 Michael 2022-05-21 修改 @ip 內容(配合 https 的大改版), 刪除原程式的 http:// 內容
3 Michael 2023-02-01 為了更加彈性, @ip 及 @db 這2個欄位改傳入 ${ls:xxxx}, 測試可行(程式要調整前端呼叫的程式)
4 Michael 2023-02-04 修改 menu 的排序, 改為依 seq_no(原先是 menuid)
5 Michael 2023-04-04 改依參數檔設定的程式版本別
6 Michael 2023-04-22 新增 Wizard 為 zen 模組的相關判斷
*/
BEGIN
DECLARE v_rets, v_ret_menu, v_all_menu, v_myfavor LONGTEXT;
DECLARE v_userid VARCHAR(20);
DECLARE v_imax1, v_imax2, v_y1, v_y2, v_x1, v_x2 INT DEFAULT 0;
DECLARE v_pid, v_id1, v_name1, v_id2, v_name2 VARCHAR(100);
DECLARE v_isLocalMenu, v_crlf, v_comma CHAR(1);
DECLARE v_ver_type, v_wizard_model VARCHAR(100);
-- 宣告一級選單游標
DECLARE cur_menu00 CURSOR FOR
SELECT menuid, caption
FROM tmp_menu00
ORDER BY rowid;
-- 宣告二級選單游標
DECLARE cur_menu99 CURSOR FOR
SELECT parent_menuid, menuid, caption, isLocalMenu
FROM tmp_menu99
ORDER BY rowid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @done = TRUE;
-- 初始化變數
SET v_crlf = CHAR(10);
SET v_wizard_model = 'zen';
-- 取得版本類型(預設 beta)
SELECT COALESCE(pvalue, 'beta') INTO v_ver_type
FROM sys_parameter
WHERE systemid = 'base' AND pid = 'ver_type'
LIMIT 1;
-- 根據 token 取得使用者 ID
SELECT userid INTO v_userid
FROM sys_users
WHERE token = p_token
LIMIT 1;
-- 建立臨時表 (取代原來的表變數)
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_menu00 (
menuid VARCHAR(100),
caption NVARCHAR(100),
rowid INT AUTO_INCREMENT PRIMARY KEY
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_menu99 (
parent_menuid VARCHAR(100),
menuid VARCHAR(100),
caption NVARCHAR(100),
isLocalMenu CHAR(1),
rowid INT AUTO_INCREMENT PRIMARY KEY
);
TRUNCATE TABLE tmp_menu00;
TRUNCATE TABLE tmp_menu99;
-- 插入一級選單 (排序用)
INSERT INTO tmp_menu00 (menuid, caption)
SELECT DISTINCT m.menuid, m.caption
FROM sys_menutable m
WHERE m.moduleid = p_moduleid
AND (
EXISTS (
SELECT 1
FROM sys_rolemenusecurity rms
JOIN sys_userroles ur ON ur.roleid = rms.roleid
WHERE ur.userid = v_userid
AND rms.controlname = 'read'
AND rms.menuid = m.menuid
)
OR EXISTS (
SELECT 1
FROM sys_rolemenusecurity rms
WHERE rms.roleid = '00'
AND rms.menuid = m.menuid
)
)
AND COALESCE(m.parent_menuid, '') = ''
ORDER BY (SELECT seq_no FROM sys_menutable WHERE menuid = m.menuid);
-- 插入二級選單 (排序用)
INSERT INTO tmp_menu99 (parent_menuid, menuid, caption, isLocalMenu)
SELECT DISTINCT m.parent_menuid, m.menuid, m.caption, COALESCE(m.isLocalMenu, 'N')
FROM sys_menutable m
WHERE m.moduleid = p_moduleid
AND (
EXISTS (
SELECT 1
FROM sys_rolemenusecurity rms
JOIN sys_userroles ur ON ur.roleid = rms.roleid
WHERE ur.userid = v_userid
AND rms.controlname = 'read'
AND rms.menuid = m.menuid
)
OR EXISTS (
SELECT 1
FROM sys_rolemenusecurity rms
WHERE rms.roleid = '00'
AND rms.menuid = m.menuid
)
)
AND COALESCE(m.parent_menuid, '') <> ''
ORDER BY m.parent_menuid, (SELECT seq_no FROM sys_menutable WHERE menuid = m.menuid);
-- 取得我的最愛選單
SET v_myfavor = udf_myfavor(p_moduleid, v_userid, v_ver_type, p_ip, p_db2);
-- 初始化固定 JSON 結構
SET v_rets = CONCAT(
'{', v_crlf,
' "pages": [', v_crlf,
' {', v_crlf,
' "label": "Home",', v_crlf,
' "url": "/",', v_crlf,
' "redirect": "/', CASE WHEN p_moduleid = 'bpm' THEN 'bpm' ELSE 'sys' END, '/dashboard"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "children": [', v_crlf
);
-- 加入 Dashboard 項目
IF p_moduleid <> 'bpm' THEN
SET v_rets = CONCAT(v_rets,
' {', v_crlf,
' "label": "Dash Board",', v_crlf,
' "url": "/sys/dashboard",', v_crlf,
' "icon": "fas fa-chart-pie",', v_crlf,
' "schemaApi": "get:/pages/sys-dashboard.json"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "電子簽核主頁",', v_crlf,
' "visible": false,', v_crlf,
' "url": "/bpm/dashboard",', v_crlf,
' "icon": "fas fa-chart-pie",', v_crlf,
' "schemaApi": "get:/pages/bpm-dashboard.json"', v_crlf,
' }', v_crlf
);
ELSE
SET v_rets = CONCAT(v_rets,
' {', v_crlf,
' "label": "電子簽核主頁",', v_crlf,
' "url": "/bpm/dashboard",', v_crlf,
' "icon": "fas fa-chart-pie",', v_crlf,
' "schemaApi": "get:/pages/bpm-dashboard.json"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "Dash Board",', v_crlf,
' "visible": false,', v_crlf,
' "url": "/sys/dashboard",', v_crlf,
' "icon": "fas fa-chart-pie",', v_crlf,
' "schemaApi": "get:/pages/sys-dashboard.json"', v_crlf,
' }', v_crlf
);
END IF;
-- 加入我的最愛
SET v_rets = CONCAT(v_rets,
' ]', v_crlf,
' },', v_crlf,
v_myfavor, v_crlf
-- CASE WHEN v_myfavor IS NOT NULL AND v_myfavor <> '' THEN
-- CONCAT(v_crlf, ',') -- 只有當有內容時才加逗號和內容
-- ELSE v_crlf
-- END
);
-- 處理一級選單
SET v_imax1 = (SELECT COALESCE(MAX(rowid), 0) FROM tmp_menu00);
SET v_y1 = 1;
WHILE v_y1 <= v_imax1 DO
-- 取得一級選單資料
SELECT menuid, caption INTO v_id1, v_name1
FROM tmp_menu00
WHERE rowid = v_y1;
SET v_ret_menu = CONCAT(
' {', v_crlf,
' "children": [', v_crlf,
' {', v_crlf,
' "label": "', v_name1, '",', v_crlf,
' "url": "/', p_moduleid, '",', v_crlf,
' "icon": "fa fa-cube",', v_crlf,
' "children": [', v_crlf
);
-- 處理二級選單
SET v_imax2 = (SELECT COALESCE(MAX(rowid), 0) FROM tmp_menu99 WHERE parent_menuid = v_id1);
SET v_y2 = (SELECT COALESCE(MIN(rowid), 0) FROM tmp_menu99 WHERE parent_menuid = v_id1);
WHILE v_y2 <= v_imax2 DO
-- 取得二級選單資料
SELECT menuid, caption, isLocalMenu INTO v_id2, v_name2, v_isLocalMenu
FROM tmp_menu99
WHERE rowid = v_y2
AND parent_menuid = v_id1;
-- 判斷是否為最後一項
IF v_y2 = v_imax2 THEN
SET v_comma = '';
ELSE
SET v_comma = ',';
END IF;
-- 根據是否為本地選單生成不同結構
IF v_isLocalMenu = 'Y' THEN
SET v_ret_menu = CONCAT(v_ret_menu,
' {', v_crlf,
' "label": "', v_name2, '",', v_crlf,
' "url": "/', p_moduleid, '/', v_id2, '",', v_crlf,
' "schemaApi": "get:/pages/', v_id2, '.json"', v_crlf,
' }', v_comma, v_crlf
);
ELSE
SET v_ret_menu = CONCAT(v_ret_menu,
' {', v_crlf,
' "label": "', v_name2, '",', v_crlf,
' "url": "/', p_moduleid, '/', v_id2, '",', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "', v_id2, '",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' }', v_comma, v_crlf
);
END IF;
-- 特殊處理 Wizard 模組
IF (v_id2 = 'zen01' OR v_id2 = 'zen11') AND p_moduleid = v_wizard_model THEN
-- 加入四項 Wizard 相關功能
SET v_ret_menu = CONCAT(v_ret_menu,
' {', v_crlf,
' "label": "Wizard Function",', v_crlf,
' "url": "/', v_wizard_model, '/function",', v_crlf,
' "visible": false,', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "zen02",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "Wizard Fields",', v_crlf,
' "url": "/', v_wizard_model, '/fields",', v_crlf,
' "visible": false,', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "zen03",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "Query Wizard Function",', v_crlf,
' "url": "/', v_wizard_model, '/query_function",', v_crlf,
' "visible": false,', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "zen12",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "Query Wizard Fields",', v_crlf,
' "url": "/', v_wizard_model, '/query_fields",', v_crlf,
' "visible": false,', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "zen13",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' }', v_comma, v_crlf
);
END IF;
SET v_y2 = v_y2 + 1;
END WHILE;
-- 關閉一級選單結構
SET v_ret_menu = CONCAT(v_ret_menu,
' ]', v_crlf,
' }', v_crlf,
' ]', v_crlf,
' }'
);
-- 加入開發測試區(僅 Wizard 模組的最後一項)
IF v_y1 = v_imax1 AND p_moduleid = v_wizard_model THEN
SET v_ret_menu = CONCAT(v_ret_menu, ',', v_crlf,
' {', v_crlf,
' "children": [', v_crlf,
' {', v_crlf,
' "label": "開發公測區",', v_crlf,
' "url": "/dev",', v_crlf,
' "icon": "fab fa-dev",', v_crlf,
-- ' "visibleOn": "1=0",', v_crlf,
' "children": [', v_crlf,
' {', v_crlf,
' "label": "測試程式01",', v_crlf,
' "url": "/dev/dev01",', v_crlf,
' "schemaApi": "get:/pages/dev-test01.json"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "測試程式02",', v_crlf,
' "url": "/dev/dev02",', v_crlf,
' "schemaApi": "get:/pages/dev-test02.json"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "測試程式03",', v_crlf,
' "url": "/dev/dev03",', v_crlf,
' "schemaApi": "get:/pages/dev-test03.json"', v_crlf,
' }', v_crlf,
' ]', v_crlf,
' }', v_crlf,
' ]', v_crlf,
' }'
);
END IF;
-- 判斷是否為最後一項
IF v_y1 = v_imax1 THEN
SET v_comma = '';
ELSE
SET v_comma = ',';
END IF;
SET v_ret_menu = CONCAT(v_ret_menu, v_comma, v_crlf);
SET v_all_menu = CONCAT(COALESCE(v_all_menu, ''), v_ret_menu);
SET v_y1 = v_y1 + 1;
END WHILE;
-- 組合最終 JSON
IF v_imax1 <= 0 THEN
-- 移除最後的逗號,保留換行
IF RIGHT(v_rets, 11) = '},\n\n ]\n}' THEN
SET v_rets = CONCAT(LEFT(v_rets, CHAR_LENGTH(v_rets) - 8), '\n\n ]\n}');
ELSEIF RIGHT(v_rets, 3) = '},\n' THEN
SET v_rets = CONCAT(LEFT(v_rets, CHAR_LENGTH(v_rets) - 2), '\n ]', v_crlf, '}');
ELSE
SET v_rets = CONCAT(v_rets, ' ]', v_crlf, '}');
END IF;
ELSE
SET v_rets = CONCAT(v_rets, v_all_menu, v_crlf, ' ]', v_crlf, '}');
END IF;
-- 返回結果
SELECT 0 AS code, '選單生成成功!' AS msg;
SELECT v_rets AS jsoncode;
-- 清理臨時表
DROP TEMPORARY TABLE IF EXISTS tmp_menu00;
DROP TEMPORARY TABLE IF EXISTS tmp_menu99;
END //
DELIMITER ;
+81
View File
@@ -0,0 +1,81 @@
DELIMITER //
CREATE PROCEDURE zen_sync_base_security(
IN p_token VARCHAR(100),
IN p_functiontag VARCHAR(100)
)
/*
Function : 在單一資料庫的架構下, 在 Wizard 產生程式後, 直接同步 menu 及基本權限設定
Description: 目的是產生程式後, 就可以直接在測試環境執行
Build Date : 2023-12-10
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2023-12-10 改寫為 MySQL 版
*/
BEGIN
DECLARE parenttag VARCHAR(100);
DECLARE cnt INT;
DECLARE user_id VARCHAR(100);
DECLARE err_code SMALLINT;
DECLARE err_msg NVARCHAR(100);
SET err_code = 0;
SET err_msg = '選單及權限設定成功 !!';
SELECT userid INTO user_id FROM sys_users WHERE token = p_token;
IF COALESCE(user_id, '') = '' THEN
SET err_code = 4;
SET err_msg = '原密碼輸入錯誤, 請重新輸入';
ELSE
-- step 1: 先判斷是否是單一 db 架構
-- if EXISTS (SELECT * FROM information_schema.tables WHERE table_name = 'sys_menutable')
IF 1 = 1 THEN -- 利用同義字(Synonym) 解決括資料庫問題 20230823 Michael
-- step 2: 根據 zen_function 寫入 menu
-- 如果 parent_menuid 不存在, 要一併自動產生
SELECT parenttag INTO parenttag FROM zen_function WHERE functiontag = p_functiontag;
IF COALESCE(parenttag, '') = '' THEN
SET parenttag = '';
END IF;
SELECT COUNT(*) INTO cnt FROM sys_menutable WHERE menuid = parenttag AND parenttag <> '';
IF cnt = 0 THEN
INSERT INTO sys_menutable (menuid, parent_menuid, caption, moduleid, seq_no, owned)
SELECT parenttag, '', functionname + '(目錄)', projectid, functiontag, '00' FROM zen_function WHERE functiontag = p_functiontag;
INSERT INTO sys_rolemenusecurity (roleid, menuid, controlname)
SELECT '00', p_functiontag, 'read';
END IF;
SELECT COUNT(*) INTO cnt FROM sys_menutable WHERE menuid = p_functiontag;
IF cnt = 0 THEN
INSERT INTO sys_menutable (menuid, parent_menuid, caption, moduleid, seq_no, owned)
SELECT functiontag, parenttag, functionname, projectid, functiontag, '00' FROM zen_function WHERE functiontag = p_functiontag;
END IF;
-- step 3: 根據 zen_fields 寫入 security
SELECT COUNT(*) INTO cnt FROM sys_rolemenusecurity WHERE menuid = p_functiontag;
IF cnt = 0 THEN
INSERT INTO sys_rolemenusecurity (roleid, menuid, controlname)
SELECT '00', p_functiontag, 'read'
UNION
SELECT '00', p_functiontag, 'insert'
UNION
SELECT '00', p_functiontag, 'update'
UNION
SELECT '00', p_functiontag, 'delete';
END IF;
ELSE
SET err_code = 9;
SET err_msg = '必須是單一資料庫架構才能執行 !!';
END IF;
END IF;
SELECT err_code AS code, err_msg AS msg;
END //
DELIMITER ;