fix_朱茏_换班级新增权限.sql 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. -- ============================================================
  2. -- 临时权限修复:换班级「新增」权限(学生信息页提交换班级接口)
  3. -- 背景:
  4. -- 前端换班级按钮权限:studentMsg:class:change
  5. -- 后端提交接口校验:studentMsg:studentClassChange:add
  6. -- 有按钮但提交报 403 Forbidden(无访问权限)
  7. -- 适用:
  8. -- 朱茏老师(user_id=223,角色含 3003-学生信息管理)及同类角色
  9. -- 执行后:
  10. -- 相关用户需重新登录,使权限缓存生效
  11. -- ============================================================
  12. -- ------------------------------------------------------------
  13. -- A) 先查:朱茏是否已具备 add / 前端按钮权限(只读,可单独执行)
  14. -- ------------------------------------------------------------
  15. SELECT
  16. u.user_id,
  17. u.user_name,
  18. u.nick_name,
  19. r.role_id,
  20. r.role_name,
  21. m.menu_id,
  22. m.menu_name,
  23. m.perms
  24. FROM sys_user u
  25. JOIN sys_user_role ur ON ur.user_id = u.user_id
  26. JOIN sys_role r ON r.role_id = ur.role_id
  27. JOIN sys_role_menu rm ON rm.role_id = r.role_id
  28. JOIN sys_menu m ON m.menu_id = rm.menu_id
  29. WHERE u.user_id = 223
  30. AND m.perms IN (
  31. 'studentMsg:class:change',
  32. 'studentMsg:studentClassChange:add',
  33. 'studentMsg:studentClassChange:list',
  34. 'studentMsg:studentClassChange:query',
  35. 'studentMsg:studentClassChange:edit',
  36. 'studentMsg:studentClassChange:remove',
  37. 'studentMsg:studentClassChange:export'
  38. )
  39. ORDER BY m.perms, r.role_id;
  40. -- 汇总:是否具备关键权限(有行=有,无行=没有)
  41. SELECT
  42. 'studentMsg:class:change' AS perms,
  43. EXISTS (
  44. SELECT 1
  45. FROM sys_user_role ur
  46. JOIN sys_role_menu rm ON rm.role_id = ur.role_id
  47. JOIN sys_menu m ON m.menu_id = rm.menu_id
  48. WHERE ur.user_id = 223 AND m.perms = 'studentMsg:class:change'
  49. ) AS has_perm
  50. UNION ALL
  51. SELECT
  52. 'studentMsg:studentClassChange:add',
  53. EXISTS (
  54. SELECT 1
  55. FROM sys_user_role ur
  56. JOIN sys_role_menu rm ON rm.role_id = ur.role_id
  57. JOIN sys_menu m ON m.menu_id = rm.menu_id
  58. WHERE ur.user_id = 223 AND m.perms = 'studentMsg:studentClassChange:add'
  59. );
  60. -- 库中是否已存在 add 菜单权限码
  61. SELECT menu_id, menu_name, parent_id, perms, status, visible
  62. FROM sys_menu
  63. WHERE perms IN (
  64. 'studentMsg:class:change',
  65. 'studentMsg:studentClassChange:add',
  66. 'studentMsg:studentClassChange:list'
  67. )
  68. ORDER BY perms;
  69. -- ============================================================
  70. -- 以下为修复段:确认缺权限后再执行;先备份再改
  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) 解析父菜单:优先挂在「换班级」列表菜单下,否则挂在「换班级」按钮同级父菜单
  95. -- ------------------------------------------------------------
  96. SET @parent_id = (
  97. SELECT parent_id
  98. FROM sys_menu
  99. WHERE perms = 'studentMsg:studentClassChange:list'
  100. AND menu_type IN ('C', 'M')
  101. ORDER BY menu_id
  102. LIMIT 1
  103. );
  104. -- list 本身若是目录/菜单,直接用其 menu_id 作父级
  105. SET @parent_id = IFNULL(
  106. (
  107. SELECT menu_id
  108. FROM sys_menu
  109. WHERE perms = 'studentMsg:studentClassChange:list'
  110. AND menu_type IN ('C', 'M')
  111. ORDER BY menu_id
  112. LIMIT 1
  113. ),
  114. @parent_id
  115. );
  116. -- 仍找不到时,退化为 class:change 按钮的父菜单
  117. SET @parent_id = IFNULL(
  118. @parent_id,
  119. (
  120. SELECT parent_id
  121. FROM sys_menu
  122. WHERE perms = 'studentMsg:class:change'
  123. ORDER BY menu_id
  124. LIMIT 1
  125. )
  126. );
  127. -- 最终兜底:学籍异动信息菜单(与学籍异动修复脚本同父级,仅当上面都找不到时)
  128. SET @parent_id = IFNULL(@parent_id, 2004197349643042818);
  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. 2005461500000000002,
  140. '新增',
  141. @parent_id,
  142. 1,
  143. '',
  144. NULL,
  145. NULL,
  146. 1,
  147. 0,
  148. 'F',
  149. '0',
  150. '0',
  151. 'studentMsg:studentClassChange:add',
  152. '',
  153. 100,
  154. 1,
  155. NOW(),
  156. 1,
  157. NOW(),
  158. '补齐换班级提交接口权限,解决学生信息页换班级提交403'
  159. FROM DUAL
  160. WHERE NOT EXISTS (
  161. SELECT 1 FROM sys_menu WHERE perms = 'studentMsg:studentClassChange:add'
  162. );
  163. -- ------------------------------------------------------------
  164. -- 3) 给「学生信息管理(保留)」角色(3003)授权
  165. -- ------------------------------------------------------------
  166. INSERT INTO sys_role_menu (role_id, menu_id)
  167. SELECT 3003, m.menu_id
  168. FROM sys_menu m
  169. WHERE m.perms = 'studentMsg:studentClassChange:add'
  170. AND NOT EXISTS (
  171. SELECT 1 FROM sys_role_menu rm
  172. WHERE rm.role_id = 3003 AND rm.menu_id = m.menu_id
  173. );
  174. -- ------------------------------------------------------------
  175. -- 4) 兼容:所有已有「换班级」按钮权限的角色,一并补上 add
  176. -- ------------------------------------------------------------
  177. INSERT INTO sys_role_menu (role_id, menu_id)
  178. SELECT DISTINCT rm.role_id, add_menu.menu_id
  179. FROM sys_role_menu rm
  180. JOIN sys_menu btn ON btn.menu_id = rm.menu_id AND btn.perms = 'studentMsg:class:change'
  181. JOIN sys_menu add_menu ON add_menu.perms = 'studentMsg:studentClassChange:add'
  182. WHERE NOT EXISTS (
  183. SELECT 1 FROM sys_role_menu x
  184. WHERE x.role_id = rm.role_id AND x.menu_id = add_menu.menu_id
  185. );
  186. -- ------------------------------------------------------------
  187. -- 5) 校验:朱茏是否已具备 add 权限
  188. -- ------------------------------------------------------------
  189. SELECT
  190. u.user_id,
  191. u.user_name,
  192. u.nick_name,
  193. r.role_id,
  194. r.role_name,
  195. m.perms,
  196. m.menu_name,
  197. m.menu_id
  198. FROM sys_user u
  199. JOIN sys_user_role ur ON ur.user_id = u.user_id
  200. JOIN sys_role r ON r.role_id = ur.role_id
  201. JOIN sys_role_menu rm ON rm.role_id = r.role_id
  202. JOIN sys_menu m ON m.menu_id = rm.menu_id
  203. WHERE u.user_id = 223
  204. AND m.perms IN (
  205. 'studentMsg:class:change',
  206. 'studentMsg:studentClassChange:add',
  207. 'studentMsg:studentClassChange:list'
  208. )
  209. ORDER BY m.perms, r.role_id;
  210. SELECT
  211. 'studentMsg:studentClassChange:add' AS perms,
  212. EXISTS (
  213. SELECT 1
  214. FROM sys_user_role ur
  215. JOIN sys_role_menu rm ON rm.role_id = ur.role_id
  216. JOIN sys_menu m ON m.menu_id = rm.menu_id
  217. WHERE ur.user_id = 223 AND m.perms = 'studentMsg:studentClassChange:add'
  218. ) AS has_perm;
  219. -- ------------------------------------------------------------
  220. -- 回滚示例(按需执行,把后缀换成上面查出的备份表名)
  221. -- ------------------------------------------------------------
  222. -- TRUNCATE TABLE sys_role_menu;
  223. -- INSERT INTO sys_role_menu SELECT * FROM sys_role_menu_bak_YYYYMMDD_HHMMSS;
  224. -- DELETE FROM sys_menu WHERE perms = 'studentMsg:studentClassChange:add';
  225. -- -- 或整表回滚菜单:
  226. -- -- TRUNCATE TABLE sys_menu;
  227. -- -- INSERT INTO sys_menu SELECT * FROM sys_menu_bak_YYYYMMDD_HHMMSS;