20261021-coupon-exchange-permissions.sql 3.7 KB

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