| | |
| | | -- 换成目标角色编号即可,例如: |
| | | -- WHERE `r`.`id` IN (1, 160, 2) -- 追加给「普通角色」 |
| | | -- ============================================================ |
| | | |
| | | -- ============================================================ |
| | | -- 企业微信扫码自动注册账号的默认角色:wxcp_user |
| | | -- |
| | | -- 背景:企业微信首次扫码走「自动注册」建号,建完按「角色编码」查本段建出来的 |
| | | -- 这个角色并绑定。代码常量见 AdminAuthServiceImpl.WXCP_DEFAULT_ROLE_CODE, |
| | | -- 改编码要两边一起改。 |
| | | -- 角色不存在时代码只打 warn 日志、不阻断登录 —— 账号能进,但一个菜单都没有, |
| | | -- 是「能登录却什么都看不到」的静默故障,所以新库初始化必须带上这一段。 |
| | | -- |
| | | -- 为什么用编码不用角色编号:角色编号在本地/测试/生产各库不一致,写死换库就失效。 |
| | | -- |
| | | -- 授予范围:仅「会员管理」整棵子树(根菜单编号 1075490,定义见 ums_module.sql)。 |
| | | -- 共 14 条 = 根目录 1 + 菜单 3 + 按钮 10,三级全给。 |
| | | -- 首页不在这里,也不需要在这里:它是前端静态路由(src/router/routes/modules/ |
| | | -- dashboard.ts 里的 /analytics),backend 模式下由 generateRoutesByBackend 末尾的 |
| | | -- return [...options.routes, ...routes] 始终合并进来,任何登录用户都可见。 |
| | | -- 所以「角色管理」的菜单树里找不到「首页」是正常的,不是漏配。 |
| | | -- |
| | | -- 幂等:角色先查后插;角色菜单关联先删后插,可重复执行。 |
| | | -- ============================================================ |
| | | |
| | | -- 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`); |
| | | |
| | | -- 5) 首页数据权限 |
| | | -- |
| | | -- 首页(/analytics)本身是前端静态路由、人人可见,但它内部会调 4 个后端接口拉数据, |
| | | -- 这些接口都带 @PreAuthorize,角色缺权限时一进首页就报「没有权限」: |
| | | -- bpm/task/todo-page → bpm:task:query |
| | | -- finance/reimbursement/page → finance:reimbursement:query |
| | | -- research/application/page → research:application:query |
| | | -- research/guideline/page → research:guideline:query |
| | | -- |
| | | -- 按 permission 串查、不写死菜单编号:编号在各库不一致,写死换库就失效。 |
| | | -- 只授按钮(type=3)、不授其上级菜单,所以不会往侧边栏塞 BPM / 财务 / 科研的入口。 |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `updater`) |
| | | SELECT @wxcp_role_id, `m`.`id`, 'admin', 'admin' |
| | | FROM `system_menu` `m` |
| | | WHERE `m`.`deleted` = b'0' |
| | | AND `m`.`permission` IN ('bpm:task:query', 'finance:reimbursement:query', |
| | | 'research:application:query', 'research:guideline:query') |
| | | AND @wxcp_role_id IS NOT NULL |
| | | AND NOT EXISTS ( |
| | | SELECT 1 FROM (SELECT `menu_id` FROM `system_role_menu` |
| | | WHERE `role_id` = @wxcp_role_id |
| | | AND `deleted` = b'0') `t` |
| | | WHERE `t`.`menu_id` = `m`.`id`); |