fix_朱茏_学生管理员设置分配范围权限.sql 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. -- ============================================================
  2. -- 临时权限修复:学生管理员设置「分配管理范围」
  3. -- 背景:
  4. -- 页面:学生管理员设置 / 自定义管理员 / 为【xxx】分配管理范围
  5. -- 提交接口:POST /xgStudentManagerSource/studentManagerSource/grantDeptAuth
  6. -- 后端权限:xgStudentManagerSource:studentManagerSource:grantDeptAuth
  7. -- 前端无按钮权限控制,点确定后接口 403:
  8. -- 黄条「无访问权限,可能原因:1. 用户权限不足…」
  9. -- 红字「分配失败,请重试」
  10. -- 该权限码是后加的自定义接口,菜单里往往没有对应按钮,角色也就授不了
  11. -- 适用:
  12. -- 朱茏老师(user_id=223,角色含 3003-学生信息管理)
  13. -- 以及已经能打开本模块(已有管理员列表/授权查询权限)的同类角色
  14. -- 执行后:
  15. -- 相关用户需重新登录,使权限缓存生效
  16. -- ============================================================
  17. -- ------------------------------------------------------------
  18. -- A) 先查(只读,可单独执行)
  19. -- ------------------------------------------------------------
  20. -- A1. 朱茏当前角色,以及本模块相关权限(无行=该权限没有)
  21. SELECT
  22. u.user_id,
  23. u.user_name,
  24. u.nick_name,
  25. r.role_id,
  26. r.role_name,
  27. m.menu_id,
  28. m.menu_name,
  29. m.perms
  30. FROM sys_user u
  31. JOIN sys_user_role ur ON ur.user_id = u.user_id
  32. JOIN sys_role r ON r.role_id = ur.role_id
  33. JOIN sys_role_menu rm ON rm.role_id = r.role_id
  34. JOIN sys_menu m ON m.menu_id = rm.menu_id
  35. WHERE u.user_id = 223
  36. AND (
  37. m.perms LIKE 'xgStudentManager%'
  38. OR m.menu_name LIKE '%学生管理员%'
  39. )
  40. ORDER BY m.perms, r.role_id;
  41. -- A2. 关键权限是否已具备(1=有,0=没有)
  42. SELECT
  43. p.perms,
  44. EXISTS (
  45. SELECT 1
  46. FROM sys_user_role ur
  47. JOIN sys_role_menu rm ON rm.role_id = ur.role_id
  48. JOIN sys_menu m ON m.menu_id = rm.menu_id
  49. WHERE ur.user_id = 223 AND m.perms = p.perms
  50. ) AS has_perm
  51. FROM (
  52. SELECT 'xgStudentManager:studentManager:list' AS perms
  53. UNION ALL SELECT 'xgStudentManagerSource:studentManagerSource:list'
  54. UNION ALL SELECT 'xgStudentManagerSource:studentManagerSource:query'
  55. UNION ALL SELECT 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  56. ) p;
  57. -- A3. 库里是否已有这些菜单权限码(grantDeptAuth 无行=需要下面的修复段补菜单)
  58. SELECT menu_id, menu_name, parent_id, menu_type, perms, status, visible
  59. FROM sys_menu
  60. WHERE perms IN (
  61. 'xgStudentManager:studentManager:list',
  62. 'xgStudentManagerSource:studentManagerSource:list',
  63. 'xgStudentManagerSource:studentManagerSource:query',
  64. 'xgStudentManagerSource:studentManagerSource:edit',
  65. 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  66. )
  67. OR menu_name LIKE '%学生管理员%'
  68. ORDER BY parent_id, order_num, menu_id;
  69. -- ============================================================
  70. -- 以下为修复段:确认缺 grantDeptAuth 后再执行;先备份再改
  71. -- ============================================================
  72. -- ------------------------------------------------------------
  73. -- 0) 修改前备份(带时间戳后缀,避免覆盖)
  74. -- ------------------------------------------------------------
  75. SET @bak_suffix = DATE_FORMAT(NOW(), '%Y%m%d_%H%i%s');
  76. SET @sql_bak_menu = CONCAT(
  77. 'CREATE TABLE IF NOT EXISTS sys_menu_bak_', @bak_suffix,
  78. ' AS SELECT * FROM sys_menu'
  79. );
  80. PREPARE stmt_bak_menu FROM @sql_bak_menu;
  81. EXECUTE stmt_bak_menu;
  82. DEALLOCATE PREPARE stmt_bak_menu;
  83. SET @sql_bak_role_menu = CONCAT(
  84. 'CREATE TABLE IF NOT EXISTS sys_role_menu_bak_', @bak_suffix,
  85. ' AS SELECT * FROM sys_role_menu'
  86. );
  87. PREPARE stmt_bak_role_menu FROM @sql_bak_role_menu;
  88. EXECUTE stmt_bak_role_menu;
  89. DEALLOCATE PREPARE stmt_bak_role_menu;
  90. SELECT
  91. CONCAT('sys_menu_bak_', @bak_suffix) AS menu_backup_table,
  92. CONCAT('sys_role_menu_bak_', @bak_suffix) AS role_menu_backup_table;
  93. -- ------------------------------------------------------------
  94. -- 1) 解析父菜单(一条 SELECT,避免 Navicat 把 SET+子查询拆段)
  95. -- 优先级:授权关系列表菜单 > 其父级 > 同模块按钮父级 > 学生管理员设置 > 管理员列表父级
  96. -- ------------------------------------------------------------
  97. SET @parent_id = NULL;
  98. SELECT picked.menu_id INTO @parent_id
  99. FROM (
  100. SELECT menu_id, 1 AS ord
  101. FROM sys_menu
  102. WHERE perms = 'xgStudentManagerSource:studentManagerSource:list'
  103. AND menu_type IN ('C', 'M')
  104. UNION ALL
  105. SELECT parent_id, 2
  106. FROM sys_menu
  107. WHERE perms = 'xgStudentManagerSource:studentManagerSource:list'
  108. UNION ALL
  109. SELECT parent_id, 3
  110. FROM sys_menu
  111. WHERE perms IN (
  112. 'xgStudentManagerSource:studentManagerSource:query',
  113. 'xgStudentManagerSource:studentManagerSource:edit',
  114. 'xgStudentManagerSource:studentManagerSource:add'
  115. )
  116. UNION ALL
  117. SELECT menu_id, 4
  118. FROM sys_menu
  119. WHERE menu_name LIKE '%学生管理员设置%'
  120. AND menu_type IN ('C', 'M')
  121. UNION ALL
  122. SELECT parent_id, 5
  123. FROM sys_menu
  124. WHERE perms = 'xgStudentManager:studentManager:list'
  125. ) picked
  126. WHERE picked.menu_id IS NOT NULL
  127. ORDER BY picked.ord, picked.menu_id
  128. LIMIT 1;
  129. SELECT @parent_id AS resolved_parent_id;
  130. -- ------------------------------------------------------------
  131. -- 2) 新增「分配管理范围」按钮权限(若不存在,且已解析到父菜单)
  132. -- ------------------------------------------------------------
  133. INSERT INTO sys_menu (
  134. menu_id, menu_name, parent_id, order_num, path, component, query_param,
  135. is_frame, is_cache, menu_type, visible, status, perms, icon,
  136. create_dept, create_by, create_time, update_by, update_time, remark
  137. )
  138. SELECT
  139. 2005461500000000003,
  140. '分配管理范围',
  141. @parent_id,
  142. 6,
  143. '',
  144. NULL,
  145. NULL,
  146. 1,
  147. 0,
  148. 'F',
  149. '0',
  150. '0',
  151. 'xgStudentManagerSource:studentManagerSource:grantDeptAuth',
  152. '',
  153. 100,
  154. 1,
  155. NOW(),
  156. 1,
  157. NOW(),
  158. '补齐自定义管理员分配管理范围接口权限,解决提交403'
  159. FROM DUAL
  160. WHERE @parent_id IS NOT NULL
  161. AND NOT EXISTS (
  162. SELECT 1 FROM sys_menu
  163. WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  164. );
  165. -- 父菜单没解析到时,这条会提示,且上面的 INSERT 不会写入
  166. SELECT
  167. CASE
  168. WHEN @parent_id IS NULL THEN '未找到父菜单,未插入按钮。请先看 A3 的菜单结果,手工指定 parent_id 后再执行第 2 步'
  169. WHEN EXISTS (
  170. SELECT 1 FROM sys_menu
  171. WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  172. ) THEN 'grantDeptAuth 菜单已存在(含本次新建)'
  173. ELSE '未插入,请检查 sys_menu'
  174. END AS menu_insert_result;
  175. -- ------------------------------------------------------------
  176. -- 3) 给「学生信息管理」角色(3003)授权(朱茏已拥有该角色)
  177. -- ------------------------------------------------------------
  178. INSERT INTO sys_role_menu (role_id, menu_id)
  179. SELECT 3003, m.menu_id
  180. FROM sys_menu m
  181. WHERE m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  182. AND NOT EXISTS (
  183. SELECT 1 FROM sys_role_menu rm
  184. WHERE rm.role_id = 3003 AND rm.menu_id = m.menu_id
  185. );
  186. -- ------------------------------------------------------------
  187. -- 4) 兼容:已能使用本模块的角色,一并补上分配范围权限
  188. -- 判定:已有管理员列表、授权关系查询/列表/修改,或菜单名含「学生管理员设置」
  189. -- ------------------------------------------------------------
  190. INSERT INTO sys_role_menu (role_id, menu_id)
  191. SELECT DISTINCT rm.role_id, grant_menu.menu_id
  192. FROM sys_role_menu rm
  193. JOIN sys_menu owned ON owned.menu_id = rm.menu_id
  194. JOIN sys_menu grant_menu
  195. ON grant_menu.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  196. WHERE (
  197. owned.perms IN (
  198. 'xgStudentManager:studentManager:list',
  199. 'xgStudentManagerSource:studentManagerSource:list',
  200. 'xgStudentManagerSource:studentManagerSource:query',
  201. 'xgStudentManagerSource:studentManagerSource:edit',
  202. 'xgStudentManagerSource:studentManagerSource:add'
  203. )
  204. OR owned.menu_name LIKE '%学生管理员设置%'
  205. )
  206. AND NOT EXISTS (
  207. SELECT 1 FROM sys_role_menu x
  208. WHERE x.role_id = rm.role_id AND x.menu_id = grant_menu.menu_id
  209. );
  210. -- ------------------------------------------------------------
  211. -- 5) 校验:朱茏是否已具备分配范围权限
  212. -- ------------------------------------------------------------
  213. SELECT
  214. u.user_id,
  215. u.user_name,
  216. u.nick_name,
  217. r.role_id,
  218. r.role_name,
  219. m.menu_id,
  220. m.menu_name,
  221. m.perms
  222. FROM sys_user u
  223. JOIN sys_user_role ur ON ur.user_id = u.user_id
  224. JOIN sys_role r ON r.role_id = ur.role_id
  225. JOIN sys_role_menu rm ON rm.role_id = r.role_id
  226. JOIN sys_menu m ON m.menu_id = rm.menu_id
  227. WHERE u.user_id = 223
  228. AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth';
  229. -- 有行=已具备。无行时看她的角色是否在第 3/4 步的授权范围内
  230. SELECT
  231. 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' AS perms,
  232. EXISTS (
  233. SELECT 1
  234. FROM sys_user_role ur
  235. JOIN sys_role_menu rm ON rm.role_id = ur.role_id
  236. JOIN sys_menu m ON m.menu_id = rm.menu_id
  237. WHERE ur.user_id = 223
  238. AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  239. ) AS has_perm;
  240. -- ------------------------------------------------------------
  241. -- 6) 复查是否执行成功(只读,可单独反复执行)
  242. -- 期望:menu_ready=1,role_3003_ready=1,zhulong_ready=1
  243. -- ------------------------------------------------------------
  244. SELECT
  245. EXISTS (
  246. SELECT 1 FROM sys_menu
  247. WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  248. AND menu_type = 'F'
  249. AND status = '0'
  250. AND parent_id IS NOT NULL
  251. ) AS menu_ready,
  252. EXISTS (
  253. SELECT 1
  254. FROM sys_role_menu rm
  255. JOIN sys_menu m ON m.menu_id = rm.menu_id
  256. WHERE rm.role_id = 3003
  257. AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  258. ) AS role_3003_ready,
  259. EXISTS (
  260. SELECT 1
  261. FROM sys_user u
  262. JOIN sys_user_role ur ON ur.user_id = u.user_id
  263. JOIN sys_role_menu rm ON rm.role_id = ur.role_id
  264. JOIN sys_menu m ON m.menu_id = rm.menu_id
  265. WHERE u.user_id = 223
  266. AND u.nick_name = '朱茏'
  267. AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  268. AND m.status = '0'
  269. ) AS zhulong_ready;
  270. -- 明细:按钮挂在哪个菜单下,哪些角色拿到了
  271. SELECT
  272. m.menu_id,
  273. m.menu_name,
  274. m.parent_id,
  275. p.menu_name AS parent_menu_name,
  276. m.perms,
  277. m.menu_type,
  278. m.status,
  279. r.role_id,
  280. r.role_name
  281. FROM sys_menu m
  282. LEFT JOIN sys_menu p ON p.menu_id = m.parent_id
  283. LEFT JOIN sys_role_menu rm ON rm.menu_id = m.menu_id
  284. LEFT JOIN sys_role r ON r.role_id = rm.role_id
  285. WHERE m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  286. ORDER BY r.role_id;
  287. -- 明细:朱茏通过哪个角色拥有该权限(有行即成功)
  288. SELECT
  289. u.user_id,
  290. u.user_name,
  291. u.nick_name,
  292. r.role_id,
  293. r.role_name,
  294. m.menu_id,
  295. m.menu_name,
  296. m.perms,
  297. m.status AS menu_status
  298. FROM sys_user u
  299. JOIN sys_user_role ur ON ur.user_id = u.user_id
  300. JOIN sys_role r ON r.role_id = ur.role_id
  301. JOIN sys_role_menu rm ON rm.role_id = r.role_id
  302. JOIN sys_menu m ON m.menu_id = rm.menu_id
  303. WHERE u.user_id = 223
  304. AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth';
  305. -- ------------------------------------------------------------
  306. -- 回滚示例(按需执行,把后缀换成上面查出的备份表名)
  307. -- ------------------------------------------------------------
  308. -- DELETE FROM sys_role_menu
  309. -- WHERE menu_id IN (
  310. -- SELECT menu_id FROM sys_menu
  311. -- WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  312. -- );
  313. -- DELETE FROM sys_menu
  314. -- WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'
  315. -- AND menu_id = 2005461500000000003;
  316. -- -- 或整表回滚:
  317. -- -- TRUNCATE TABLE sys_role_menu;
  318. -- -- INSERT INTO sys_role_menu SELECT * FROM sys_role_menu_bak_YYYYMMDD_HHMMSS;
  319. -- -- TRUNCATE TABLE sys_menu;
  320. -- -- INSERT INTO sys_menu SELECT * FROM sys_menu_bak_YYYYMMDD_HHMMSS;