20261021-coupon-exchange-permissions.sql 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. -- Explicit comparison collation avoids MySQL 1267 across database/session defaults.
  2. -- 优惠券 + 商品兑换码权限。请在应用数据库执行;重复串行执行不会重复插入。
  3. -- 如自动识别失败/存在同名菜单,请将下面两个 NULL 改成实际父菜单 id。
  4. -- 不创建前端路由,不改已有权限,不给普通角色扩权。
  5. SET @coupon_parent_override = NULL;
  6. SET @exchange_parent_override = NULL;
  7. -- 自动识别用户列表;匹配不唯一时填写实际用户列表菜单 ID。
  8. SET @balance_parent_override = NULL;
  9. SET @balance_parent = COALESCE(@balance_parent_override, (
  10. SELECT CASE WHEN COUNT(*) = 1 THEN MIN(id) ELSE NULL END
  11. FROM cms_menu WHERE type = 'menu' AND (title = '用户列表' OR path = '/userManage/user')
  12. ));
  13. SET @coupon_parent = COALESCE(@coupon_parent_override, (
  14. SELECT CASE WHEN COUNT(*) = 1 THEN MIN(id) ELSE NULL END
  15. FROM cms_menu WHERE type <> 'button' AND (title = '优惠券' OR menu_name = '优惠券')
  16. ));
  17. SET @exchange_parent = COALESCE(@exchange_parent_override, (
  18. SELECT CASE WHEN COUNT(*) = 1 THEN MIN(id) ELSE NULL END
  19. FROM cms_menu WHERE type <> 'button' AND (title = '兑换码' OR menu_name = '兑换码')
  20. ));
  21. DROP TEMPORARY TABLE IF EXISTS tmp_coupon_exchange_permissions;
  22. CREATE TEMPORARY TABLE tmp_coupon_exchange_permissions (
  23. title VARCHAR(64) NOT NULL,
  24. perms VARCHAR(64) NOT NULL PRIMARY KEY,
  25. parent_id BIGINT NULL,
  26. sort_num INT NOT NULL
  27. );
  28. INSERT INTO tmp_coupon_exchange_permissions VALUES
  29. ('优惠券查询', 'coupon:view', @coupon_parent, 1),
  30. ('优惠券新增', 'coupon:add', @coupon_parent, 2),
  31. ('优惠券编辑及配置', 'coupon:edit', @coupon_parent, 3),
  32. ('优惠券删除', 'coupon:delete', @coupon_parent, 4),
  33. ('优惠券发放', 'coupon:send', @coupon_parent, 5),
  34. ('兑换码查询', 'exchangeCode:view', @exchange_parent, 1),
  35. ('兑换码生成', 'exchangeCode:add', @exchange_parent, 2),
  36. ('兑换码导出', 'exchangeCode:export', @exchange_parent, 3),
  37. ('兑换码退款重发', 'exchangeCode:refund', @exchange_parent, 4),
  38. ('增加用户余额', 'userBalance:add', @balance_parent, 1),
  39. ('扣除用户余额', 'userBalance:deduct', @balance_parent, 2),
  40. ('余额操作记录', 'userBalance:view', @balance_parent, 3);
  41. START TRANSACTION;
  42. INSERT INTO cms_menu
  43. (title, menu_name, perms, type, path, order_by, parent_id, created_time, update_time)
  44. SELECT p.title, p.perms, p.perms, 'button', '', p.sort_num, p.parent_id, NOW(), NOW()
  45. FROM tmp_coupon_exchange_permissions p
  46. INNER JOIN cms_menu parent ON parent.id = p.parent_id AND parent.type <> 'button'
  47. WHERE NOT EXISTS (SELECT 1 FROM cms_menu existing WHERE existing.perms = CONVERT(p.perms USING utf8mb4) COLLATE utf8mb4_unicode_ci);
  48. -- 只授权名称精确为 root 的角色;其他角色在后台角色管理中显式授权。
  49. INSERT INTO cms_role_menu (role_id, menu_id, created_time, update_time)
  50. SELECT r.id, m.id, NOW(), NOW()
  51. FROM cms_role r
  52. INNER JOIN cms_menu m ON 1 = 1
  53. INNER JOIN tmp_coupon_exchange_permissions p ON CONVERT(p.perms USING utf8mb4) COLLATE utf8mb4_unicode_ci = m.perms
  54. WHERE r.role_name = 'root'
  55. AND NOT EXISTS (
  56. SELECT 1 FROM cms_role_menu existing
  57. WHERE existing.role_id = r.id AND existing.menu_id = m.id
  58. );
  59. COMMIT;
  60. -- 检查结果:12 个权限均应有 menu_id;缺失时指定上面的父菜单 id 再执行。
  61. SELECT p.perms, m.id AS menu_id, m.parent_id,
  62. CASE WHEN m.id IS NULL THEN 'MISSING: set parent override and rerun' ELSE 'OK' END AS result
  63. FROM tmp_coupon_exchange_permissions p
  64. LEFT JOIN cms_menu m ON m.perms = CONVERT(p.perms USING utf8mb4) COLLATE utf8mb4_unicode_ci
  65. ORDER BY p.perms;
  66. SELECT r.id AS role_id, r.role_name, m.perms
  67. FROM cms_role_menu rm
  68. INNER JOIN cms_role r ON r.id = rm.role_id
  69. INNER JOIN cms_menu m ON m.id = rm.menu_id
  70. INNER JOIN tmp_coupon_exchange_permissions p ON CONVERT(p.perms USING utf8mb4) COLLATE utf8mb4_unicode_ci = m.perms
  71. WHERE r.role_name = 'root'
  72. ORDER BY m.perms;
  73. DROP TEMPORARY TABLE tmp_coupon_exchange_permissions;
  74. -- 执行后通过后台重新保存受影响角色权限以触发缓存刷新,再重新登录验证。
  75. -- 本文件不自动连接生产库,也不删除异常优惠券或历史数据。