Files
hzdyjs/docs/设计文档/database/fix_朱茏_学生管理员设置分配范围权限.sql
T
2026-10-20 11:50:53 +08:00

343 lines
12 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================
-- 临时权限修复:学生管理员设置「分配管理范围」
-- 背景:
-- 页面:学生管理员设置 / 自定义管理员 / 为【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;