|
|
@@ -0,0 +1,342 @@
|
|
|
+-- ============================================================
|
|
|
+-- 临时权限修复:学生管理员设置「分配管理范围」
|
|
|
+-- 背景:
|
|
|
+-- 页面:学生管理员设置 / 自定义管理员 / 为【xxx】分配管理范围
|
|
|
+-- 提交接口:POST /xgStudentManagerSource/studentManagerSource/grantDeptAuth
|
|
|
+-- 后端权限:xgStudentManagerSource:studentManagerSource:grantDeptAuth
|
|
|
+-- 前端无按钮权限控制,点确定后接口 403:
|
|
|
+-- 黄条「无访问权限,可能原因:1. 用户权限不足…」
|
|
|
+-- 红字「分配失败,请重试」
|
|
|
+-- 该权限码是后加的自定义接口,菜单里往往没有对应按钮,角色也就授不了
|
|
|
+-- 适用:
|
|
|
+-- 朱茏老师(user_id=223,角色含 3003-学生信息管理)
|
|
|
+-- 以及已经能打开本模块(已有管理员列表/授权查询权限)的同类角色
|
|
|
+-- 执行后:
|
|
|
+-- 相关用户需重新登录,使权限缓存生效
|
|
|
+-- ============================================================
|
|
|
+
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- A) 先查(只读,可单独执行)
|
|
|
+-- ------------------------------------------------------------
|
|
|
+
|
|
|
+-- A1. 朱茏当前角色,以及本模块相关权限(无行=该权限没有)
|
|
|
+SELECT
|
|
|
+ u.user_id,
|
|
|
+ u.user_name,
|
|
|
+ u.nick_name,
|
|
|
+ r.role_id,
|
|
|
+ r.role_name,
|
|
|
+ m.menu_id,
|
|
|
+ m.menu_name,
|
|
|
+ m.perms
|
|
|
+FROM sys_user u
|
|
|
+JOIN sys_user_role ur ON ur.user_id = u.user_id
|
|
|
+JOIN sys_role r ON r.role_id = ur.role_id
|
|
|
+JOIN sys_role_menu rm ON rm.role_id = r.role_id
|
|
|
+JOIN sys_menu m ON m.menu_id = rm.menu_id
|
|
|
+WHERE u.user_id = 223
|
|
|
+ AND (
|
|
|
+ m.perms LIKE 'xgStudentManager%'
|
|
|
+ OR m.menu_name LIKE '%学生管理员%'
|
|
|
+ )
|
|
|
+ORDER BY m.perms, r.role_id;
|
|
|
+
|
|
|
+-- A2. 关键权限是否已具备(1=有,0=没有)
|
|
|
+SELECT
|
|
|
+ p.perms,
|
|
|
+ EXISTS (
|
|
|
+ SELECT 1
|
|
|
+ FROM sys_user_role ur
|
|
|
+ JOIN sys_role_menu rm ON rm.role_id = ur.role_id
|
|
|
+ JOIN sys_menu m ON m.menu_id = rm.menu_id
|
|
|
+ WHERE ur.user_id = 223 AND m.perms = p.perms
|
|
|
+ ) AS has_perm
|
|
|
+FROM (
|
|
|
+ SELECT 'xgStudentManager:studentManager:list' AS perms
|
|
|
+ UNION ALL SELECT 'xgStudentManagerSource:studentManagerSource:list'
|
|
|
+ UNION ALL SELECT 'xgStudentManagerSource:studentManagerSource:query'
|
|
|
+ UNION ALL SELECT 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+) p;
|
|
|
+
|
|
|
+-- A3. 库里是否已有这些菜单权限码(grantDeptAuth 无行=需要下面的修复段补菜单)
|
|
|
+SELECT menu_id, menu_name, parent_id, menu_type, perms, status, visible
|
|
|
+FROM sys_menu
|
|
|
+WHERE perms IN (
|
|
|
+ 'xgStudentManager:studentManager:list',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:list',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:query',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:edit',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+)
|
|
|
+ OR menu_name LIKE '%学生管理员%'
|
|
|
+ORDER BY parent_id, order_num, menu_id;
|
|
|
+
|
|
|
+-- ============================================================
|
|
|
+-- 以下为修复段:确认缺 grantDeptAuth 后再执行;先备份再改
|
|
|
+-- ============================================================
|
|
|
+
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- 0) 修改前备份(带时间戳后缀,避免覆盖)
|
|
|
+-- ------------------------------------------------------------
|
|
|
+SET @bak_suffix = DATE_FORMAT(NOW(), '%Y%m%d_%H%i%s');
|
|
|
+
|
|
|
+SET @sql_bak_menu = CONCAT(
|
|
|
+ 'CREATE TABLE IF NOT EXISTS sys_menu_bak_', @bak_suffix,
|
|
|
+ ' AS SELECT * FROM sys_menu'
|
|
|
+);
|
|
|
+PREPARE stmt_bak_menu FROM @sql_bak_menu;
|
|
|
+EXECUTE stmt_bak_menu;
|
|
|
+DEALLOCATE PREPARE stmt_bak_menu;
|
|
|
+
|
|
|
+SET @sql_bak_role_menu = CONCAT(
|
|
|
+ 'CREATE TABLE IF NOT EXISTS sys_role_menu_bak_', @bak_suffix,
|
|
|
+ ' AS SELECT * FROM sys_role_menu'
|
|
|
+);
|
|
|
+PREPARE stmt_bak_role_menu FROM @sql_bak_role_menu;
|
|
|
+EXECUTE stmt_bak_role_menu;
|
|
|
+DEALLOCATE PREPARE stmt_bak_role_menu;
|
|
|
+
|
|
|
+SELECT
|
|
|
+ CONCAT('sys_menu_bak_', @bak_suffix) AS menu_backup_table,
|
|
|
+ CONCAT('sys_role_menu_bak_', @bak_suffix) AS role_menu_backup_table;
|
|
|
+
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- 1) 解析父菜单(一条 SELECT,避免 Navicat 把 SET+子查询拆段)
|
|
|
+-- 优先级:授权关系列表菜单 > 其父级 > 同模块按钮父级 > 学生管理员设置 > 管理员列表父级
|
|
|
+-- ------------------------------------------------------------
|
|
|
+SET @parent_id = NULL;
|
|
|
+
|
|
|
+SELECT picked.menu_id INTO @parent_id
|
|
|
+FROM (
|
|
|
+ SELECT menu_id, 1 AS ord
|
|
|
+ FROM sys_menu
|
|
|
+ WHERE perms = 'xgStudentManagerSource:studentManagerSource:list'
|
|
|
+ AND menu_type IN ('C', 'M')
|
|
|
+ UNION ALL
|
|
|
+ SELECT parent_id, 2
|
|
|
+ FROM sys_menu
|
|
|
+ WHERE perms = 'xgStudentManagerSource:studentManagerSource:list'
|
|
|
+ UNION ALL
|
|
|
+ SELECT parent_id, 3
|
|
|
+ FROM sys_menu
|
|
|
+ WHERE perms IN (
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:query',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:edit',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:add'
|
|
|
+ )
|
|
|
+ UNION ALL
|
|
|
+ SELECT menu_id, 4
|
|
|
+ FROM sys_menu
|
|
|
+ WHERE menu_name LIKE '%学生管理员设置%'
|
|
|
+ AND menu_type IN ('C', 'M')
|
|
|
+ UNION ALL
|
|
|
+ SELECT parent_id, 5
|
|
|
+ FROM sys_menu
|
|
|
+ WHERE perms = 'xgStudentManager:studentManager:list'
|
|
|
+) picked
|
|
|
+WHERE picked.menu_id IS NOT NULL
|
|
|
+ORDER BY picked.ord, picked.menu_id
|
|
|
+LIMIT 1;
|
|
|
+
|
|
|
+SELECT @parent_id AS resolved_parent_id;
|
|
|
+
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- 2) 新增「分配管理范围」按钮权限(若不存在,且已解析到父菜单)
|
|
|
+-- ------------------------------------------------------------
|
|
|
+INSERT INTO sys_menu (
|
|
|
+ menu_id, menu_name, parent_id, order_num, path, component, query_param,
|
|
|
+ is_frame, is_cache, menu_type, visible, status, perms, icon,
|
|
|
+ create_dept, create_by, create_time, update_by, update_time, remark
|
|
|
+)
|
|
|
+SELECT
|
|
|
+ 2005461500000000003,
|
|
|
+ '分配管理范围',
|
|
|
+ @parent_id,
|
|
|
+ 6,
|
|
|
+ '',
|
|
|
+ NULL,
|
|
|
+ NULL,
|
|
|
+ 1,
|
|
|
+ 0,
|
|
|
+ 'F',
|
|
|
+ '0',
|
|
|
+ '0',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:grantDeptAuth',
|
|
|
+ '',
|
|
|
+ 100,
|
|
|
+ 1,
|
|
|
+ NOW(),
|
|
|
+ 1,
|
|
|
+ NOW(),
|
|
|
+ '补齐自定义管理员分配管理范围接口权限,解决提交403'
|
|
|
+FROM DUAL
|
|
|
+WHERE @parent_id IS NOT NULL
|
|
|
+ AND NOT EXISTS (
|
|
|
+ SELECT 1 FROM sys_menu
|
|
|
+ WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+ );
|
|
|
+
|
|
|
+-- 父菜单没解析到时,这条会提示,且上面的 INSERT 不会写入
|
|
|
+SELECT
|
|
|
+ CASE
|
|
|
+ WHEN @parent_id IS NULL THEN '未找到父菜单,未插入按钮。请先看 A3 的菜单结果,手工指定 parent_id 后再执行第 2 步'
|
|
|
+ WHEN EXISTS (
|
|
|
+ SELECT 1 FROM sys_menu
|
|
|
+ WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+ ) THEN 'grantDeptAuth 菜单已存在(含本次新建)'
|
|
|
+ ELSE '未插入,请检查 sys_menu'
|
|
|
+ END AS menu_insert_result;
|
|
|
+
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- 3) 给「学生信息管理」角色(3003)授权(朱茏已拥有该角色)
|
|
|
+-- ------------------------------------------------------------
|
|
|
+INSERT INTO sys_role_menu (role_id, menu_id)
|
|
|
+SELECT 3003, m.menu_id
|
|
|
+FROM sys_menu m
|
|
|
+WHERE m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+ AND NOT EXISTS (
|
|
|
+ SELECT 1 FROM sys_role_menu rm
|
|
|
+ WHERE rm.role_id = 3003 AND rm.menu_id = m.menu_id
|
|
|
+ );
|
|
|
+
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- 4) 兼容:已能使用本模块的角色,一并补上分配范围权限
|
|
|
+-- 判定:已有管理员列表、授权关系查询/列表/修改,或菜单名含「学生管理员设置」
|
|
|
+-- ------------------------------------------------------------
|
|
|
+INSERT INTO sys_role_menu (role_id, menu_id)
|
|
|
+SELECT DISTINCT rm.role_id, grant_menu.menu_id
|
|
|
+FROM sys_role_menu rm
|
|
|
+JOIN sys_menu owned ON owned.menu_id = rm.menu_id
|
|
|
+JOIN sys_menu grant_menu
|
|
|
+ ON grant_menu.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+WHERE (
|
|
|
+ owned.perms IN (
|
|
|
+ 'xgStudentManager:studentManager:list',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:list',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:query',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:edit',
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:add'
|
|
|
+ )
|
|
|
+ OR owned.menu_name LIKE '%学生管理员设置%'
|
|
|
+ )
|
|
|
+ AND NOT EXISTS (
|
|
|
+ SELECT 1 FROM sys_role_menu x
|
|
|
+ WHERE x.role_id = rm.role_id AND x.menu_id = grant_menu.menu_id
|
|
|
+ );
|
|
|
+
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- 5) 校验:朱茏是否已具备分配范围权限
|
|
|
+-- ------------------------------------------------------------
|
|
|
+SELECT
|
|
|
+ u.user_id,
|
|
|
+ u.user_name,
|
|
|
+ u.nick_name,
|
|
|
+ r.role_id,
|
|
|
+ r.role_name,
|
|
|
+ m.menu_id,
|
|
|
+ m.menu_name,
|
|
|
+ m.perms
|
|
|
+FROM sys_user u
|
|
|
+JOIN sys_user_role ur ON ur.user_id = u.user_id
|
|
|
+JOIN sys_role r ON r.role_id = ur.role_id
|
|
|
+JOIN sys_role_menu rm ON rm.role_id = r.role_id
|
|
|
+JOIN sys_menu m ON m.menu_id = rm.menu_id
|
|
|
+WHERE u.user_id = 223
|
|
|
+ AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth';
|
|
|
+
|
|
|
+-- 有行=已具备。无行时看她的角色是否在第 3/4 步的授权范围内
|
|
|
+SELECT
|
|
|
+ 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' AS perms,
|
|
|
+ EXISTS (
|
|
|
+ SELECT 1
|
|
|
+ FROM sys_user_role ur
|
|
|
+ JOIN sys_role_menu rm ON rm.role_id = ur.role_id
|
|
|
+ JOIN sys_menu m ON m.menu_id = rm.menu_id
|
|
|
+ WHERE ur.user_id = 223
|
|
|
+ AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+ ) AS has_perm;
|
|
|
+
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- 6) 复查是否执行成功(只读,可单独反复执行)
|
|
|
+-- 期望:menu_ready=1,role_3003_ready=1,zhulong_ready=1
|
|
|
+-- ------------------------------------------------------------
|
|
|
+SELECT
|
|
|
+ EXISTS (
|
|
|
+ SELECT 1 FROM sys_menu
|
|
|
+ WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+ AND menu_type = 'F'
|
|
|
+ AND status = '0'
|
|
|
+ AND parent_id IS NOT NULL
|
|
|
+ ) AS menu_ready,
|
|
|
+ EXISTS (
|
|
|
+ SELECT 1
|
|
|
+ FROM sys_role_menu rm
|
|
|
+ JOIN sys_menu m ON m.menu_id = rm.menu_id
|
|
|
+ WHERE rm.role_id = 3003
|
|
|
+ AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+ ) AS role_3003_ready,
|
|
|
+ EXISTS (
|
|
|
+ SELECT 1
|
|
|
+ FROM sys_user u
|
|
|
+ JOIN sys_user_role ur ON ur.user_id = u.user_id
|
|
|
+ JOIN sys_role_menu rm ON rm.role_id = ur.role_id
|
|
|
+ JOIN sys_menu m ON m.menu_id = rm.menu_id
|
|
|
+ WHERE u.user_id = 223
|
|
|
+ AND u.nick_name = '朱茏'
|
|
|
+ AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+ AND m.status = '0'
|
|
|
+ ) AS zhulong_ready;
|
|
|
+
|
|
|
+-- 明细:按钮挂在哪个菜单下,哪些角色拿到了
|
|
|
+SELECT
|
|
|
+ m.menu_id,
|
|
|
+ m.menu_name,
|
|
|
+ m.parent_id,
|
|
|
+ p.menu_name AS parent_menu_name,
|
|
|
+ m.perms,
|
|
|
+ m.menu_type,
|
|
|
+ m.status,
|
|
|
+ r.role_id,
|
|
|
+ r.role_name
|
|
|
+FROM sys_menu m
|
|
|
+LEFT JOIN sys_menu p ON p.menu_id = m.parent_id
|
|
|
+LEFT JOIN sys_role_menu rm ON rm.menu_id = m.menu_id
|
|
|
+LEFT JOIN sys_role r ON r.role_id = rm.role_id
|
|
|
+WHERE m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+ORDER BY r.role_id;
|
|
|
+
|
|
|
+-- 明细:朱茏通过哪个角色拥有该权限(有行即成功)
|
|
|
+SELECT
|
|
|
+ u.user_id,
|
|
|
+ u.user_name,
|
|
|
+ u.nick_name,
|
|
|
+ r.role_id,
|
|
|
+ r.role_name,
|
|
|
+ m.menu_id,
|
|
|
+ m.menu_name,
|
|
|
+ m.perms,
|
|
|
+ m.status AS menu_status
|
|
|
+FROM sys_user u
|
|
|
+JOIN sys_user_role ur ON ur.user_id = u.user_id
|
|
|
+JOIN sys_role r ON r.role_id = ur.role_id
|
|
|
+JOIN sys_role_menu rm ON rm.role_id = r.role_id
|
|
|
+JOIN sys_menu m ON m.menu_id = rm.menu_id
|
|
|
+WHERE u.user_id = 223
|
|
|
+ AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth';
|
|
|
+
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- 回滚示例(按需执行,把后缀换成上面查出的备份表名)
|
|
|
+-- ------------------------------------------------------------
|
|
|
+-- DELETE FROM sys_role_menu
|
|
|
+-- WHERE menu_id IN (
|
|
|
+-- SELECT menu_id FROM sys_menu
|
|
|
+-- WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+-- );
|
|
|
+-- DELETE FROM sys_menu
|
|
|
+-- WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
|
|
|
+-- AND menu_id = 2005461500000000003;
|
|
|
+-- -- 或整表回滚:
|
|
|
+-- -- TRUNCATE TABLE sys_role_menu;
|
|
|
+-- -- INSERT INTO sys_role_menu SELECT * FROM sys_role_menu_bak_YYYYMMDD_HHMMSS;
|
|
|
+-- -- TRUNCATE TABLE sys_menu;
|
|
|
+-- -- INSERT INTO sys_menu SELECT * FROM sys_menu_bak_YYYYMMDD_HHMMSS;
|