20260821_add_wechat_official_account.sql 5.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. -- ============================================================
  2. -- 小程序系统设置 → 微信公众号配置
  3. -- 日期: 2026-08-21
  4. -- 说明: 新增公众号单例配置表、切换真实组件并补齐接口权限
  5. -- ============================================================
  6. CREATE TABLE IF NOT EXISTS `sa_wechat_official_account` (
  7. `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '编号,固定为 1',
  8. `logo` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '公众号 Logo',
  9. `account_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '公众号名称',
  10. `description` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '公众号说明',
  11. `follow_message` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '关注引导语',
  12. `follow_url` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '关注链接',
  13. `follow_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否开启关注',
  14. `appid` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '公众号 APPID',
  15. `original_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '公众号原始 ID',
  16. `appsecret` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '公众号 AppSecret',
  17. `server_url` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '微信服务器地址',
  18. `token` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '消息校验令牌',
  19. `encoding_aes_key` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '消息加解密密钥',
  20. `encryption_mode` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '加密模式:1明文 2兼容 3安全',
  21. `free_recharge_times` INT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '免费充值次数',
  22. `follow_free_recharge` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '关注后免费充值',
  23. `all_merchant_follow` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '所有商户关注此公众号',
  24. `created_by` INT(11) NULL COMMENT '创建者',
  25. `updated_by` INT(11) NULL COMMENT '更新者',
  26. `create_time` DATETIME(0) NULL COMMENT '创建时间',
  27. `update_time` DATETIME(0) NULL COMMENT '更新时间',
  28. `delete_time` DATETIME(0) NULL COMMENT '删除时间',
  29. PRIMARY KEY (`id`)
  30. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信公众号配置';
  31. UPDATE `sa_system_menu`
  32. SET `component` = '/mini-program/wechat-official-account',
  33. `remark` = '微信公众号基础信息与接口配置',
  34. `update_time` = NOW()
  35. WHERE `code` = 'WechatOfficialAccount' AND `delete_time` IS NULL;
  36. SET @official_account_menu_id = (
  37. SELECT `id` FROM `sa_system_menu`
  38. WHERE `code` = 'WechatOfficialAccount' AND `delete_time` IS NULL
  39. ORDER BY `id` DESC LIMIT 1
  40. );
  41. INSERT INTO `sa_system_menu` (
  42. `parent_id`, `name`, `code`, `slug`, `type`, `path`, `component`, `method`, `icon`, `sort`,
  43. `link_url`, `is_iframe`, `is_keep_alive`, `is_hidden`, `is_fixed_tab`, `is_full_page`,
  44. `generate_id`, `generate_key`, `status`, `remark`, `created_by`, `updated_by`, `create_time`, `update_time`, `delete_time`
  45. )
  46. SELECT @official_account_menu_id, '读取微信公众号配置', 'WechatOfficialAccountRead', 'core:miniProgram:officialAccount:read', 3, NULL, NULL, 'GET', NULL, 100,
  47. NULL, 2, 2, 2, 2, 2, 0, NULL, 1, NULL, 1, 1, NOW(), NOW(), NULL
  48. WHERE @official_account_menu_id IS NOT NULL
  49. AND NOT EXISTS (SELECT 1 FROM `sa_system_menu` WHERE `slug` = 'core:miniProgram:officialAccount:read' AND `delete_time` IS NULL);
  50. INSERT INTO `sa_system_menu` (
  51. `parent_id`, `name`, `code`, `slug`, `type`, `path`, `component`, `method`, `icon`, `sort`,
  52. `link_url`, `is_iframe`, `is_keep_alive`, `is_hidden`, `is_fixed_tab`, `is_full_page`,
  53. `generate_id`, `generate_key`, `status`, `remark`, `created_by`, `updated_by`, `create_time`, `update_time`, `delete_time`
  54. )
  55. SELECT @official_account_menu_id, '保存微信公众号配置', 'WechatOfficialAccountUpdate', 'core:miniProgram:officialAccount:update', 3, NULL, NULL, 'PUT', NULL, 90,
  56. NULL, 2, 2, 2, 2, 2, 0, NULL, 1, NULL, 1, 1, NOW(), NOW(), NULL
  57. WHERE @official_account_menu_id IS NOT NULL
  58. AND NOT EXISTS (SELECT 1 FROM `sa_system_menu` WHERE `slug` = 'core:miniProgram:officialAccount:update' AND `delete_time` IS NULL);
  59. -- 已分配公众号页面的角色同步获得其读写接口权限。
  60. INSERT INTO `sa_system_role_menu` (`role_id`, `menu_id`)
  61. SELECT DISTINCT parent_role.`role_id`, permission_menu.`id`
  62. FROM `sa_system_role_menu` parent_role
  63. INNER JOIN `sa_system_menu` parent_menu
  64. ON parent_menu.`id` = parent_role.`menu_id`
  65. AND parent_menu.`code` = 'WechatOfficialAccount'
  66. AND parent_menu.`delete_time` IS NULL
  67. INNER JOIN `sa_system_menu` permission_menu
  68. ON permission_menu.`parent_id` = parent_menu.`id`
  69. AND permission_menu.`slug` LIKE 'core:miniProgram:officialAccount:%'
  70. AND permission_menu.`delete_time` IS NULL
  71. LEFT JOIN `sa_system_role_menu` existing_role
  72. ON existing_role.`role_id` = parent_role.`role_id`
  73. AND existing_role.`menu_id` = permission_menu.`id`
  74. WHERE existing_role.`id` IS NULL;