1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
| -- ============================================================
| -- 企业微信模块菜单与权限
| -- 目标库: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`);
|
|