-- ============================================================ -- 企业微信模块菜单与权限 -- 目标库:mom-jssm(36.213.150.237:10000) -- -- 作用: -- 1. 让 /wxcp/activity、/wxcp/notice 两个页面能在左侧菜单中出现 -- (前端路由是菜单驱动的,没有菜单记录页面就访问不到) -- 2. 注册 @PreAuthorize 用到的权限标识,否则接口一律 403 -- -- 菜单类型:1 目录、2 菜单、3 按钮 -- 编号段:6100000 起,与现有菜单不冲突 -- -- 幂等:先按编号删除再插入,可重复执行 -- ============================================================ DELETE FROM `system_menu` WHERE `id` BETWEEN 6100000 AND 6100999; -- ---------------------------- -- 一级目录:企业微信 -- ---------------------------- INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (6100000, '企业微信', '', 1, 80, 0, '/wxcp', 'ep:chat-dot-round', NULL, NULL, 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'); -- ---------------------------- -- 活动管理 -- ---------------------------- INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (6100001, '活动管理', '', 2, 1, 6100000, 'activity', 'ep:calendar', '/wxcp/activity/index', 'WxCpActivityList', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100010, '活动查询', 'wxcp:activity:query', 3, 1, 6100001, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100011, '活动新增', 'wxcp:activity:create', 3, 2, 6100001, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100012, '活动修改', 'wxcp:activity:update', 3, 3, 6100001, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100013, '活动删除', 'wxcp:activity:delete', 3, 4, 6100001, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100014, '活动推送', 'wxcp:activity:push', 3, 5, 6100001, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), -- 报名记录挂在活动菜单下,因为它只能从活动详情进入 (6100015, '报名查询', 'wxcp:signup:query', 3, 6, 6100001, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100016, '报名管理', 'wxcp:signup:update', 3, 7, 6100001, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), -- 通讯录在推送弹窗里用,不单独建页面,但权限要注册 (6100017, '通讯录查询', 'wxcp:member:query', 3, 8, 6100001, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'); -- ---------------------------- -- 通知管理 -- ---------------------------- INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (6100002, '通知管理', '', 2, 2, 6100000, 'notice', 'ep:bell', '/wxcp/notice/index', 'WxCpNoticeList', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100020, '通知查询', 'wxcp:notice:query', 3, 1, 6100002, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100021, '通知新增', 'wxcp:notice:create', 3, 2, 6100002, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100022, '通知修改', 'wxcp:notice:update', 3, 3, 6100002, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100023, '通知删除', 'wxcp:notice:delete', 3, 4, 6100002, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'), (6100024, '通知推送', 'wxcp:notice:push', 3, 5, 6100002, '', '', '', '', 0, b'1', b'0', b'1', 'admin', NOW(), 'admin', NOW(), b'0'); -- ============================================================ -- 角色授权 -- -- 分配惯例沿用现有模块(如售后管理): -- super_admin(1) 与 001(160) 拿「整个模块的全部菜单」 -- 其他角色不自动授予,需要时在「系统管理 → 角色管理」里手动勾选 -- -- 注:super_admin 登录时代码会直接返回全部菜单,这里的映射是为了 -- 让 system_role_menu 数据完整,与其它模块保持一致。 -- ============================================================ DELETE `rm` FROM `system_role_menu` `rm` WHERE `rm`.`role_id` IN (1, 160) AND `rm`.`menu_id` BETWEEN 6100000 AND 6100999; INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) SELECT `r`.`id`, `m`.`id`, 'admin', NOW(), 'admin', NOW(), b'0', 0 FROM `system_role` `r` JOIN `system_menu` `m` ON `m`.`id` BETWEEN 6100000 AND 6100999 AND `m`.`deleted` = b'0' WHERE `r`.`id` IN (1, 160) AND `r`.`deleted` = b'0'; -- ============================================================ -- 如需给其它角色开通,把上一条 INSERT 的 r.id IN (1, 160) -- 换成目标角色编号即可,例如: -- WHERE `r`.`id` IN (1, 160, 2) -- 追加给「普通角色」 -- ============================================================ -- ============================================================ -- 企业微信扫码自动注册账号的默认角色:wxcp_user -- -- 背景:企业微信首次扫码走「自动注册」建号,建完按「角色编码」查本段建出来的 -- 这个角色并绑定。代码常量见 AdminAuthServiceImpl.WXCP_DEFAULT_ROLE_CODE, -- 改编码要两边一起改。 -- 角色不存在时代码只打 warn 日志、不阻断登录 —— 账号能进,但一个菜单都没有, -- 是「能登录却什么都看不到」的静默故障,所以新库初始化必须带上这一段。 -- -- 为什么用编码不用角色编号:角色编号在本地/测试/生产各库不一致,写死换库就失效。 -- -- 授予范围:仅「会员管理」整棵子树(根菜单编号 1075490,定义见 ums_module.sql)。 -- 首页是前端静态路由、不依赖菜单表,任何账号都看得到,无需授权。 -- -- 幂等:角色先查后插;角色菜单关联先删后插,可重复执行。 -- ============================================================ -- 1) 建角色 INSERT INTO `system_role` (`name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `updater`) SELECT '企业微信扫码用户', 'wxcp_user', 100, 1, '', 0, 2, '企业微信首次扫码自动注册的账号默认角色,仅授予「会员管理」模块', 'admin', 'admin' FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM (SELECT `id` FROM `system_role` WHERE `code` = 'wxcp_user' AND `deleted` = b'0') `t`); -- 2) 取角色编号(新建的与已存在的都取得到;取不到时为 NULL,下面两句自然不生效) SET @wxcp_role_id = (SELECT `id` FROM `system_role` WHERE `code` = 'wxcp_user' AND `deleted` = b'0' LIMIT 1); -- 3) 授权:会员管理根菜单(1075490) + 子菜单 + 孙菜单,三级覆盖整棵子树 DELETE FROM `system_role_menu` WHERE `role_id` = @wxcp_role_id; INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `updater`) SELECT @wxcp_role_id, `m`.`id`, 'admin', 'admin' FROM `system_menu` `m` LEFT JOIN `system_menu` `p1` ON `p1`.`id` = `m`.`parent_id` LEFT JOIN `system_menu` `p2` ON `p2`.`id` = `p1`.`parent_id` WHERE `m`.`deleted` = b'0' AND (`m`.`id` = 1075490 OR `p1`.`id` = 1075490 OR `p2`.`id` = 1075490) AND @wxcp_role_id IS NOT NULL; -- 4) 回填:给本段执行前就已存在的自动注册账号补上默认角色 -- -- 为什么必须有这一步:账号一旦写进 system_social_user_bind,再次扫码走的是 -- 「已绑定」分支,不会再进自动注册逻辑 —— 不补的话这批老账号永远没有菜单。 -- -- 只认自动注册的用户名前缀(wx_ + 8 位十六进制,与 AdminAuthServiceImpl 生成规则一致); -- 用 ESCAPE 显式声明转义符,避免 `_` 被 LIKE 当成单字符通配。 -- system_user_role 没有 (user_id, role_id) 唯一约束,所以用 NOT EXISTS 兜幂等。 INSERT INTO `system_user_role` (`user_id`, `role_id`, `creator`, `updater`) SELECT `u`.`id`, @wxcp_role_id, 'admin', 'admin' FROM `system_users` `u` WHERE `u`.`deleted` = b'0' AND `u`.`username` LIKE 'wx!_%' ESCAPE '!' AND @wxcp_role_id IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM (SELECT `user_id` FROM `system_user_role` WHERE `role_id` = @wxcp_role_id AND `deleted` = b'0') `t` WHERE `t`.`user_id` = `u`.`id`);