288 lines
11 KiB
SQL
288 lines
11 KiB
SQL
USE g3fo_base;
|
||||
|
|
|
|||
|
|
-- ===================================================================
|
|||
|
|
-- 存储过程:插入系统菜单数据
|
|||
|
|
-- 功能:
|
|||
|
|
-- 1. 自动生成ID(最大ID+1)并插入系统菜单记录
|
|||
|
|
-- 2. 当menu_type为'ADMIN'时,自动为所有管理员角色模板创建权限记录
|
|||
|
|
-- 3. 当menu_type为'USER'时,自动为所有用户角色模板创建权限记录
|
|||
|
|
-- 4. 数据去重检查:
|
|||
|
|
-- - m_system_menus: 检查 menu_name + menu_type 组合
|
|||
|
|
-- - m_admin_role_rights: 检查 user_role_templates_id + user_right_id + user_right_type 组合
|
|||
|
|
-- - m_user_role_rights: 检查 user_role_templates_id + user_right_id + user_right_type 组合
|
|||
|
|
-- 参数:
|
|||
|
|
-- p_remark: 备注
|
|||
|
|
-- p_menu_name: 菜单名称
|
|||
|
|
-- p_title_remark: 标题备注
|
|||
|
|
-- p_menu_type: 菜单类型('ADMIN' 或 'USER')
|
|||
|
|
-- p_description_i18n_id: 描述国际化ID(可选,默认为NULL)
|
|||
|
|
-- p_active_flag: 激活标志(可选,默认为1)
|
|||
|
|
-- ===================================================================
|
|||
|
|
|
|||
|
|
DROP PROCEDURE IF EXISTS InsertSystemMenu;
|
|||
|
|
|
|||
|
|
DELIMITER $$
|
|||
|
|
|
|||
|
|
CREATE PROCEDURE InsertSystemMenu(
|
|||
|
|
IN p_remark VARCHAR(50),
|
|||
|
|
IN p_menu_name VARCHAR(255),
|
|||
|
|
IN p_title_remark VARCHAR(50),
|
|||
|
|
IN p_menu_type CHAR(8),
|
|||
|
|
IN p_description_i18n_id CHAR(32),
|
|||
|
|
IN p_active_flag SMALLINT
|
|||
|
|
)
|
|||
|
|
proc_label: BEGIN
|
|||
|
|
DECLARE v_new_menu_id INT;
|
|||
|
|
DECLARE v_done INT DEFAULT FALSE;
|
|||
|
|
DECLARE v_template_id BIGINT;
|
|||
|
|
DECLARE v_new_right_id INT;
|
|||
|
|
DECLARE v_rights_count INT DEFAULT 0;
|
|||
|
|
DECLARE v_existing_menu_id INT DEFAULT NULL;
|
|||
|
|
DECLARE v_existing_right_count INT DEFAULT 0;
|
|||
|
|
|
|||
|
|
-- 声明游标结束处理器
|
|||
|
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
|
|||
|
|
|
|||
|
|
-- ============================================================
|
|||
|
|
-- 第一步:检查菜单是否已存在(menu_name + menu_type 组合去重)
|
|||
|
|
-- ============================================================
|
|||
|
|
|
|||
|
|
SELECT id INTO v_existing_menu_id
|
|||
|
|
FROM g3fo_base.m_system_menus
|
|||
|
|
WHERE menu_name = p_menu_name AND menu_type = p_menu_type
|
|||
|
|
LIMIT 1;
|
|||
|
|
|
|||
|
|
-- 如果菜单已存在,直接退出存储过程
|
|||
|
|
IF v_existing_menu_id IS NOT NULL THEN
|
|||
|
|
LEAVE proc_label; -- 退出存储过程
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- ============================================================
|
|||
|
|
-- 第二步:插入系统菜单数据
|
|||
|
|
-- ============================================================
|
|||
|
|
|
|||
|
|
-- 获取当前最大ID并加1
|
|||
|
|
SELECT COALESCE(MAX(id), 0) + 1 INTO v_new_menu_id
|
|||
|
|
FROM g3fo_base.m_system_menus;
|
|||
|
|
|
|||
|
|
-- 设置默认值
|
|||
|
|
IF p_active_flag IS NULL THEN
|
|||
|
|
SET p_active_flag = 1;
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- 插入系统菜单数据
|
|||
|
|
INSERT INTO g3fo_base.m_system_menus (
|
|||
|
|
id,
|
|||
|
|
remark,
|
|||
|
|
menu_name,
|
|||
|
|
description_i18n_id,
|
|||
|
|
active_flag,
|
|||
|
|
title_remark,
|
|||
|
|
menu_type,
|
|||
|
|
create_by,
|
|||
|
|
create_on,
|
|||
|
|
update_by,
|
|||
|
|
update_on
|
|||
|
|
) VALUES (
|
|||
|
|
v_new_menu_id,
|
|||
|
|
p_remark,
|
|||
|
|
p_menu_name,
|
|||
|
|
p_description_i18n_id,
|
|||
|
|
p_active_flag,
|
|||
|
|
p_title_remark,
|
|||
|
|
p_menu_type,
|
|||
|
|
'sys',
|
|||
|
|
NOW(),
|
|||
|
|
'sys',
|
|||
|
|
NOW()
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- ============================================================
|
|||
|
|
-- 第三步:根据menu_type创建相应的角色权限记录
|
|||
|
|
-- ============================================================
|
|||
|
|
|
|||
|
|
IF UPPER(p_menu_type) = 'ADMIN' THEN
|
|||
|
|
-- ========================================================
|
|||
|
|
-- 为管理员角色模板创建权限记录
|
|||
|
|
-- ========================================================
|
|||
|
|
BEGIN
|
|||
|
|
DECLARE admin_cursor CURSOR FOR
|
|||
|
|
SELECT id FROM g3fo_admin.m_admin_role_templates;
|
|||
|
|
|
|||
|
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
|
|||
|
|
|
|||
|
|
SET v_done = FALSE;
|
|||
|
|
OPEN admin_cursor;
|
|||
|
|
|
|||
|
|
admin_loop: LOOP
|
|||
|
|
FETCH admin_cursor INTO v_template_id;
|
|||
|
|
|
|||
|
|
IF v_done THEN
|
|||
|
|
LEAVE admin_loop;
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- 检查该权限记录是否已存在(去重检查)
|
|||
|
|
SET v_existing_right_count = 0;
|
|||
|
|
SELECT COUNT(*) INTO v_existing_right_count
|
|||
|
|
FROM g3fo_admin.m_admin_role_rights
|
|||
|
|
WHERE user_role_templates_id = v_template_id
|
|||
|
|
AND user_right_id = v_new_menu_id
|
|||
|
|
AND user_right_type = 'MENU';
|
|||
|
|
|
|||
|
|
-- 只有当权限记录不存在时才插入
|
|||
|
|
IF v_existing_right_count = 0 THEN
|
|||
|
|
-- 获取当前最大的权限ID并加1
|
|||
|
|
SELECT COALESCE(MAX(id), 0) + 1 INTO v_new_right_id
|
|||
|
|
FROM g3fo_admin.m_admin_role_rights;
|
|||
|
|
|
|||
|
|
-- 插入管理员角色权限记录
|
|||
|
|
INSERT INTO g3fo_admin.m_admin_role_rights (
|
|||
|
|
id,
|
|||
|
|
user_role_templates_id,
|
|||
|
|
user_right_id,
|
|||
|
|
user_right_type,
|
|||
|
|
create_on,
|
|||
|
|
update_on
|
|||
|
|
) VALUES (
|
|||
|
|
v_new_right_id,
|
|||
|
|
v_template_id,
|
|||
|
|
v_new_menu_id,
|
|||
|
|
'MENU',
|
|||
|
|
NOW(),
|
|||
|
|
NOW()
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
SET v_rights_count = v_rights_count + 1;
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
END LOOP;
|
|||
|
|
|
|||
|
|
CLOSE admin_cursor;
|
|||
|
|
END;
|
|||
|
|
|
|||
|
|
ELSEIF UPPER(p_menu_type) = 'USER' THEN
|
|||
|
|
-- ========================================================
|
|||
|
|
-- 为用户角色模板创建权限记录(排除id=9)
|
|||
|
|
-- ========================================================
|
|||
|
|
BEGIN
|
|||
|
|
DECLARE user_cursor CURSOR FOR
|
|||
|
|
SELECT id FROM g3fo_user.m_user_role_templates WHERE id != 9;
|
|||
|
|
|
|||
|
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
|
|||
|
|
|
|||
|
|
SET v_done = FALSE;
|
|||
|
|
OPEN user_cursor;
|
|||
|
|
|
|||
|
|
user_loop: LOOP
|
|||
|
|
FETCH user_cursor INTO v_template_id;
|
|||
|
|
|
|||
|
|
IF v_done THEN
|
|||
|
|
LEAVE user_loop;
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- 检查该权限记录是否已存在(去重检查)
|
|||
|
|
SET v_existing_right_count = 0;
|
|||
|
|
SELECT COUNT(*) INTO v_existing_right_count
|
|||
|
|
FROM g3fo_user.m_user_role_rights
|
|||
|
|
WHERE user_role_templates_id = v_template_id
|
|||
|
|
AND user_right_id = v_new_menu_id
|
|||
|
|
AND user_right_type = 'MENU';
|
|||
|
|
|
|||
|
|
-- 只有当权限记录不存在时才插入
|
|||
|
|
IF v_existing_right_count = 0 THEN
|
|||
|
|
-- 获取当前最大的权限ID并加1
|
|||
|
|
SELECT COALESCE(MAX(id), 0) + 1 INTO v_new_right_id
|
|||
|
|
FROM g3fo_user.m_user_role_rights;
|
|||
|
|
|
|||
|
|
-- 插入用户角色权限记录
|
|||
|
|
INSERT INTO g3fo_user.m_user_role_rights (
|
|||
|
|
id,
|
|||
|
|
user_role_templates_id,
|
|||
|
|
user_right_id,
|
|||
|
|
user_right_type,
|
|||
|
|
create_on,
|
|||
|
|
update_on
|
|||
|
|
) VALUES (
|
|||
|
|
v_new_right_id,
|
|||
|
|
v_template_id,
|
|||
|
|
v_new_menu_id,
|
|||
|
|
'MENU',
|
|||
|
|
NOW(),
|
|||
|
|
NOW()
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
SET v_rights_count = v_rights_count + 1;
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
END LOOP;
|
|||
|
|
|
|||
|
|
CLOSE user_cursor;
|
|||
|
|
END;
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
-- ============================================================
|
|||
|
|
-- 返回结果
|
|||
|
|
-- ============================================================
|
|||
|
|
END$$
|
|||
|
|
|
|||
|
|
DELIMITER ;
|
|||
|
|
|
|||
|
|
-- ===================================================================
|
|||
|
|
-- 在这里添加需要插入的菜单
|
|||
|
|
-- ===================================================================
|
|||
|
|
|
|||
|
|
-- CALL InsertSystemMenu('菜单备注', 'menu-name', 'title_remark', 'ADMIN', NULL, 1);
|
|||
|
|
-- CALL InsertSystemMenu('菜单备注', 'menu-name', 'title_remark', 'USER', NULL, 1);
|
|||
|
|
|
|||
|
|
|
|||
|
|
-- ===================================================================
|
|||
|
|
-- 使用示例:
|
|||
|
|
-- ===================================================================
|
|||
|
|
|
|||
|
|
-- 示例1: 插入管理员菜单(会在 m_system_menus 中插入一条记录,
|
|||
|
|
-- 同时在 m_admin_role_rights 中为所有管理员角色模板创建权限记录)
|
|||
|
|
-- CALL InsertSystemMenu('用户管理', 'user-management', 'user', 'ADMIN', NULL, 1);
|
|||
|
|
|
|||
|
|
-- 示例2: 插入用户菜单(会在 m_system_menus 中插入一条记录,
|
|||
|
|
-- 同时在 m_user_role_rights 中为所有用户角色模板(除了id=9)创建权限记录)
|
|||
|
|
-- CALL InsertSystemMenu('订单查询', 'order-query', 'order', 'USER', NULL, 1);
|
|||
|
|
|
|||
|
|
-- 示例3: 插入带国际化ID的管理员菜单
|
|||
|
|
-- CALL InsertSystemMenu('报表管理', 'report-management', 'report', 'ADMIN', 'REPORT-0001', 1);
|
|||
|
|
|
|||
|
|
-- ===================================================================
|
|||
|
|
-- 说明:
|
|||
|
|
-- ===================================================================
|
|||
|
|
-- 当 menu_type = 'ADMIN' 时:
|
|||
|
|
-- - 在 g3fo_base.m_system_menus 中插入一条菜单记录
|
|||
|
|
-- - 自动获取 g3fo_admin.m_admin_role_templates 中所有id
|
|||
|
|
-- - 为每个角色模板在 g3fo_admin.m_admin_role_rights 中创建一条权限记录
|
|||
|
|
-- * id: 自动递增(最大ID + 1)
|
|||
|
|
-- * user_role_templates_id: 角色模板ID
|
|||
|
|
-- * user_right_id: 新插入的菜单ID
|
|||
|
|
-- * user_right_type: 'MENU'
|
|||
|
|
--
|
|||
|
|
-- 当 menu_type = 'USER' 时:
|
|||
|
|
-- - 在 g3fo_base.m_system_menus 中插入一条菜单记录
|
|||
|
|
-- - 自动获取 g3fo_user.m_user_role_templates 中所有id(排除 id=9)
|
|||
|
|
-- - 为每个角色模板在 g3fo_user.m_user_role_rights 中创建一条权限记录
|
|||
|
|
-- * id: 自动递增(最大ID + 1)
|
|||
|
|
-- * user_role_templates_id: 角色模板ID
|
|||
|
|
-- * user_right_id: 新插入的菜单ID
|
|||
|
|
-- * user_right_type: 'MENU'
|
|||
|
|
--
|
|||
|
|
-- 去重逻辑:
|
|||
|
|
-- 1. 菜单去重:如果 menu_name + menu_type 组合已存在,返回错误,不插入任何数据
|
|||
|
|
-- 2. 权限去重:对于每个角色模板,检查 user_role_templates_id + user_right_id + user_right_type
|
|||
|
|
-- 组合是否已存在,如果已存在则跳过该条记录,继续处理下一个
|
|||
|
|
--
|
|||
|
|
-- 参数说明:
|
|||
|
|
-- p_remark: 菜单备注(varchar(50))
|
|||
|
|
-- p_menu_name: 菜单名称,唯一标识(varchar(255))
|
|||
|
|
-- p_title_remark: 标题备注(varchar(50))
|
|||
|
|
-- p_menu_type: 菜单类型,'ADMIN' 或 'USER'(char(8))
|
|||
|
|
-- p_description_i18n_id: 描述国际化ID,可选(char(32)),默认为NULL
|
|||
|
|
-- p_active_flag: 激活标志,可选(smallint),默认为1
|
|||
|
|
-- ===================================================================
|
|||
|
|
|