20261021-coupon-exchange-permissions.sql 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. -- Set this to the actual user-management menu ID before running balance grants.
  8. SET @balance_parent_override = NULL;
  9. SET @coupon_parent = COALESCE(@coupon_parent_override, (
  10. SELECT CASE WHEN COUNT(*) = 1 THEN MIN(id) ELSE NULL END
  11. FROM cms_menu WHERE type <> 'button' AND (title = '优惠券' OR menu_name = '优惠券')
  12. ));
  13. SET @exchange_parent = COALESCE(@exchange_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. DROP TEMPORARY TABLE IF EXISTS tmp_coupon_exchange_permissions;
  18. CREATE TEMPORARY TABLE tmp_coupon_exchange_permissions (
  19. title VARCHAR(64) NOT NULL,
  20. perms VARCHAR(64) NOT NULL PRIMARY KEY,
  21. parent_id BIGINT NULL,
  22. sort_num INT NOT NULL
  23. );
  24. INSERT INTO tmp_coupon_exchange_permissions VALUES
  25. ('优惠券查询', 'coupon:view', @coupon_parent, 1),
  26. ('优惠券新增', 'coupon:add', @coupon_parent, 2),
  27. ('优惠券编辑及配置', 'coupon:edit', @coupon_parent, 3),
  28. ('优惠券删除', 'coupon:delete', @coupon_parent, 4),
  29. ('优惠券发放', 'coupon:send', @coupon_parent, 5),
  30. ('兑换码查询', 'exchangeCode:view', @exchange_parent, 1),
  31. ('兑换码生成', 'exchangeCode:add', @exchange_parent, 2),
  32. ('兑换码导出', 'exchangeCode:export', @exchange_parent, 3),
  33. ('兑换码退款重发', 'exchangeCode:refund', @exchange_parent, 4),
  34. ('增加用户余额', 'userBalance:add', @balance_parent_override, 1),
  35. ('扣除用户余额', 'userBalance:deduct', @balance_parent_override, 2),
  36. ('余额操作记录', 'userBalance:view', @balance_parent_override, 3);
  37. START TRANSACTION;
  38. INSERT INTO cms_menu
  39. (title, menu_name, perms, type, path, order_by, parent_id, created_time, update_time)
  40. SELECT p.title, p.perms, p.perms, 'button', '', p.sort_num, p.parent_id, NOW(), NOW()
  41. FROM tmp_coupon_exchange_permissions p
  42. INNER JOIN cms_menu parent ON parent.id = p.parent_id AND parent.type <> 'button'
  43. WHERE NOT EXISTS (SELECT 1 FROM cms_menu existing WHERE existing.perms = CONVERT(p.perms USING utf8mb4) COLLATE utf8mb4_unicode_ci);
  44. -- 只授权名称精确为 root 的角色;其他角色在后台角色管理中显式授权。
  45. INSERT INTO cms_role_menu (role_id, menu_id, created_time, update_time)
  46. SELECT r.id, m.id, NOW(), NOW()
  47. FROM cms_role r
  48. INNER JOIN cms_menu m ON 1 = 1
  49. INNER JOIN tmp_coupon_exchange_permissions p ON CONVERT(p.perms USING utf8mb4) COLLATE utf8mb4_unicode_ci = m.perms
  50. WHERE r.role_name = 'root'
  51. AND NOT EXISTS (
  52. SELECT 1 FROM cms_role_menu existing
  53. WHERE existing.role_id = r.id AND existing.menu_id = m.id
  54. );
  55. COMMIT;
  56. -- 检查结果:12 个权限均应有 menu_id;缺失时指定上面的父菜单 id 再执行。
  57. SELECT p.perms, m.id AS menu_id, m.parent_id,
  58. CASE WHEN m.id IS NULL THEN 'MISSING: set parent override and rerun' ELSE 'OK' END AS result
  59. FROM tmp_coupon_exchange_permissions p
  60. LEFT JOIN cms_menu m ON m.perms = CONVERT(p.perms USING utf8mb4) COLLATE utf8mb4_unicode_ci
  61. ORDER BY p.perms;
  62. SELECT r.id AS role_id, r.role_name, m.perms
  63. FROM cms_role_menu rm
  64. INNER JOIN cms_role r ON r.id = rm.role_id
  65. INNER JOIN cms_menu m ON m.id = rm.menu_id
  66. INNER JOIN tmp_coupon_exchange_permissions p ON CONVERT(p.perms USING utf8mb4) COLLATE utf8mb4_unicode_ci = m.perms
  67. WHERE r.role_name = 'root'
  68. ORDER BY m.perms;
  69. DROP TEMPORARY TABLE tmp_coupon_exchange_permissions;
  70. -- 执行后通过后台重新保存受影响角色权限以触发缓存刷新,再重新登录验证。
  71. -- 本文件不自动连接生产库,也不删除异常优惠券或历史数据。