“mitao”
2026-03-24 e7f9345c528ab4d6f18d8e450d8178845989d5e1
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
package com.tcm.training.admin.bootstrap;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tcm.training.admin.user.entity.SysMenu;
import com.tcm.training.admin.user.entity.SysRole;
import com.tcm.training.admin.user.entity.SysUser;
import com.tcm.training.admin.user.entity.SysUserRole;
import com.tcm.training.admin.user.entity.SysRoleMenu;
import com.tcm.training.admin.user.mapper.SysMenuMapper;
import com.tcm.training.admin.user.mapper.SysRoleMapper;
import com.tcm.training.admin.user.mapper.SysRoleMenuMapper;
import com.tcm.training.admin.user.mapper.SysUserRoleMapper;
import com.tcm.training.admin.user.service.SysUserService;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;
 
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
 
@Component
public class DataInitializer implements ApplicationRunner {
 
    private final SysUserService sysUserService;
    private final BCryptPasswordEncoder passwordEncoder;
    private final SysRoleMapper sysRoleMapper;
    private final SysMenuMapper sysMenuMapper;
    private final SysUserRoleMapper sysUserRoleMapper;
    private final SysRoleMenuMapper sysRoleMenuMapper;
 
    public DataInitializer(
            SysUserService sysUserService,
            BCryptPasswordEncoder passwordEncoder,
            SysRoleMapper sysRoleMapper,
            SysMenuMapper sysMenuMapper,
            SysUserRoleMapper sysUserRoleMapper,
            SysRoleMenuMapper sysRoleMenuMapper
    ) {
        this.sysUserService = sysUserService;
        this.passwordEncoder = passwordEncoder;
        this.sysRoleMapper = sysRoleMapper;
        this.sysMenuMapper = sysMenuMapper;
        this.sysUserRoleMapper = sysUserRoleMapper;
        this.sysRoleMenuMapper = sysRoleMenuMapper;
    }
 
    @Override
    public void run(ApplicationArguments args) {
        SysUser admin = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
                .eq(SysUser::getUsername, "admin")
                .last("limit 1"));
        if (admin == null) {
            SysUser user = new SysUser();
            user.setUsername("admin");
            user.setNickname("管理员");
            user.setRealName("系统管理员");
            user.setStatus(1);
            user.setDeleted(0);
            user.setPassword(passwordEncoder.encode("Admin@123456"));
            user.setCreatedAt(LocalDateTime.now());
            user.setUpdatedAt(LocalDateTime.now());
            sysUserService.save(user);
            admin = user;
        }
 
        SysRole role = ensureSuperAdminRole();
        List<Long> menuIds = ensureDefaultMenus();
        ensureRoleMenuRelations(role.getId(), menuIds);
        ensureUserRoleRelation(admin.getId(), role.getId());
    }
 
    private SysRole ensureSuperAdminRole() {
        SysRole role = sysRoleMapper.selectOne(new LambdaQueryWrapper<SysRole>()
                .eq(SysRole::getRoleCode, "SUPER_ADMIN")
                .last("limit 1"));
        if (role != null) {
            return role;
        }
 
        role = new SysRole();
        role.setRoleName("超级管理员");
        role.setRoleCode("SUPER_ADMIN");
        role.setStatus(1);
        role.setDeleted(0);
        role.setRemark("默认拥有全部后台权限");
        role.setCreatedAt(LocalDateTime.now());
        role.setUpdatedAt(LocalDateTime.now());
        sysRoleMapper.insert(role);
        return role;
    }
 
    private List<Long> ensureDefaultMenus() {
        List<Long> menuIds = new ArrayList<Long>();
        menuIds.add(saveMenu(1000L, 0L, "系统与安全", "system_security", "M",
                "/system", null, "setting", 100, null, "系统与安全模块"));
        menuIds.add(saveMenu(1100L, 1000L, "帐号管理", "system_account", "C",
                "/system/account", "Account/UserList", null, 10, "system:account:view", "帐号管理菜单"));
        menuIds.add(saveMenu(1101L, 1100L, "新增帐号", "system_account_add", "B",
                null, null, null, 1, "system:account:add", "帐号新增按钮"));
        menuIds.add(saveMenu(1102L, 1100L, "编辑帐号", "system_account_edit", "B",
                null, null, null, 2, "system:account:edit", "帐号编辑按钮"));
        menuIds.add(saveMenu(1103L, 1100L, "启用禁用", "system_account_status", "B",
                null, null, null, 3, "system:account:status", "帐号状态按钮"));
        menuIds.add(saveMenu(1104L, 1100L, "重置密码", "system_account_reset_password", "B",
                null, null, null, 4, "system:account:reset-password", "重置密码按钮"));
        menuIds.add(saveMenu(1105L, 1100L, "删除帐号", "system_account_delete", "B",
                null, null, null, 5, "system:account:delete", "删除帐号按钮"));
        menuIds.add(saveMenu(1200L, 1000L, "角色管理", "system_role", "C",
                "/system/role", "Account/RoleList", null, 20, "system:role:view", "角色管理菜单"));
        menuIds.add(saveMenu(1201L, 1200L, "角色详情", "system_role_detail", "B",
                null, null, null, 1, "system:role:detail", "角色详情按钮"));
        menuIds.add(saveMenu(1202L, 1200L, "新增角色", "system_role_add", "B",
                null, null, null, 2, "system:role:add", "角色新增按钮"));
        menuIds.add(saveMenu(1203L, 1200L, "编辑角色", "system_role_edit", "B",
                null, null, null, 3, "system:role:edit", "角色编辑按钮"));
        menuIds.add(saveMenu(1204L, 1200L, "删除角色", "system_role_delete", "B",
                null, null, null, 4, "system:role:delete", "角色删除按钮"));
        menuIds.add(saveMenu(1300L, 1000L, "系统设置", "system_setting_group", "M",
                "/system/settings", null, null, 30, null, "系统设置目录"));
        menuIds.add(saveMenu(1310L, 1300L, "积分设置", "system_points_settings", "C",
                "/system/settings/points", "System/PointsSettings", null, 10, "system:points-settings:view", "积分设置菜单"));
        menuIds.add(saveMenu(1311L, 1310L, "编辑积分设置", "system_points_settings_edit", "B",
                null, null, null, 1, "system:points-settings:edit", "积分设置编辑按钮"));
        menuIds.add(saveMenu(2000L, 0L, "用户与会员", "member_root", "M",
                "/member", null, "team", 200, null, "用户与会员模块"));
        menuIds.add(saveMenu(2100L, 2000L, "用户", "member_user_group", "M",
                "/member/user", null, null, 10, null, "用户分组菜单"));
        menuIds.add(saveMenu(2110L, 2100L, "用户管理", "member_user_manage", "C",
                "/member/user/manage", "Member/UserList", null, 10, "member:user:view", "用户管理菜单"));
        menuIds.add(saveMenu(2118L, 2100L, "诊所管理", "member_clinic_manage", "C",
                "/member/user/clinic", "Member/ClinicList", null, 11, "member:clinic:view", "诊所管理菜单"));
        menuIds.add(saveMenu(2119L, 2100L, "会员用户", "member_only_user_manage", "C",
                "/member/user/member-users", "Member/MemberUserList", null, 12, "member:user:member:view", "会员用户菜单"));
        menuIds.add(saveMenu(2200L, 2000L, "会员", "member_vip_group", "M",
                "/member/vip", null, null, 20, null, "会员分组菜单"));
        menuIds.add(saveMenu(2210L, 2200L, "会员价格设置", "member_vip_price_settings", "C",
                "/member/vip/price", "Member/VipPriceSettings", null, 10, "member:vip-price:view", "会员价格设置菜单"));
        menuIds.add(saveMenu(2211L, 2210L, "编辑会员价格设置", "member_vip_price_settings_edit", "B",
                null, null, null, 1, "member:vip-price:edit", "会员价格设置编辑按钮"));
        menuIds.add(saveMenu(2220L, 2200L, "会员介绍设置", "member_vip_intro_settings", "C",
                "/member/vip/intro", "Member/VipIntroSettings", null, 20, "member:vip-intro:view", "会员介绍设置菜单"));
        menuIds.add(saveMenu(2221L, 2220L, "编辑会员介绍设置", "member_vip_intro_settings_edit", "B",
                null, null, null, 1, "member:vip-intro:edit", "会员介绍设置编辑按钮"));
        menuIds.add(saveMenu(2111L, 2110L, "用户详情", "member_user_detail", "B",
                null, null, null, 1, "member:user:detail", "用户详情按钮"));
        menuIds.add(saveMenu(2112L, 2110L, "编辑用户", "member_user_edit", "B",
                null, null, null, 2, "member:user:edit", "编辑用户按钮"));
        menuIds.add(saveMenu(2113L, 2110L, "启用禁用用户", "member_user_status", "B",
                null, null, null, 3, "member:user:status", "启用禁用用户按钮"));
        menuIds.add(saveMenu(2114L, 2110L, "重置用户密码", "member_user_reset_password", "B",
                null, null, null, 4, "member:user:reset-password", "重置用户密码按钮"));
        menuIds.add(saveMenu(2115L, 2110L, "删除用户", "member_user_delete", "B",
                null, null, null, 5, "member:user:delete", "删除用户按钮"));
        menuIds.add(saveMenu(2116L, 2110L, "导出用户", "member_user_export", "B",
                null, null, null, 6, "member:user:export", "导出用户按钮"));
        menuIds.add(saveMenu(2117L, 2110L, "解绑微信", "member_user_unbind_wechat", "B",
                null, null, null, 7, "member:user:unbind-wechat", "解绑微信按钮"));
        menuIds.add(saveMenu(3000L, 0L, "课程与学习", "live_root", "M",
                "/live", null, "read", 300, null, "课程与学习模块"));
        menuIds.add(saveMenu(3050L, 3000L, "课程管理", "live_course_manage_root", "M",
                "/live/course", null, null, 10, null, "课程管理目录"));
        menuIds.add(saveMenu(3060L, 3050L, "养身直播", "live_course_broadcast_manage", "C",
                "/live/course/broadcast", "Live/BroadcastList", null, 10, "live:course:view", "养身直播菜单"));
        menuIds.add(saveMenu(3061L, 3060L, "直播详情", "live_course_detail", "B",
                null, null, null, 1, "live:course:detail", "养身直播详情按钮"));
        menuIds.add(saveMenu(3062L, 3060L, "编辑直播", "live_course_edit", "B",
                null, null, null, 2, "live:course:edit", "养身直播编辑按钮"));
        menuIds.add(saveMenu(3063L, 3060L, "启用禁用直播", "live_course_status", "B",
                null, null, null, 3, "live:course:status", "养身直播状态按钮"));
        menuIds.add(saveMenu(3070L, 3060L, "场次管理", "live_session_manage", "B",
                null, null, null, 10, "live:session:detail", "直播场次管理权限"));
        menuIds.add(saveMenu(3071L, 3060L, "新增场次", "live_session_add", "B",
                null, null, null, 11, "live:session:add", "直播场次新增按钮"));
        menuIds.add(saveMenu(3072L, 3060L, "编辑场次", "live_session_edit", "B",
                null, null, null, 12, "live:session:edit", "直播场次编辑按钮"));
        menuIds.add(saveMenu(3073L, 3060L, "开播场次", "live_session_start", "B",
                null, null, null, 13, "live:session:start", "直播场次开播按钮"));
        menuIds.add(saveMenu(3074L, 3060L, "结束场次", "live_session_end", "B",
                null, null, null, 14, "live:session:end", "直播场次结束按钮"));
        menuIds.add(saveMenu(3075L, 3060L, "复制场次", "live_session_copy", "B",
                null, null, null, 15, "live:session:copy", "直播场次复制按钮"));
        menuIds.add(saveMenu(3076L, 3060L, "删除场次", "live_session_delete", "B",
                null, null, null, 16, "live:session:delete", "直播场次删除按钮"));
        menuIds.add(saveMenu(3077L, 3060L, "推送开播提醒", "live_session_push_notification", "B",
                null, null, null, 17, "live:session:push-notification", "直播场次推送提醒按钮"));
        menuIds.add(saveMenu(3080L, 3050L, "直播预约记录", "live_reserve_view", "C",
                "/live/course/reserve-records", "Live/ReserveRecords", null, 20, "live:reserve:view", "直播预约记录菜单"));
        menuIds.add(saveMenu(3081L, 3050L, "直播观看记录", "live_watch_view", "C",
                "/live/course/watch-records", "Live/WatchRecords", null, 21, "live:watch:view", "直播观看记录菜单"));
        menuIds.add(saveMenu(3082L, 3060L, "答题记录", "live_quiz_view", "B",
                null, null, null, 22, "live:quiz:view", "直播答题记录查看权限"));
        menuIds.add(saveMenu(3100L, 3050L, "授课专家管理", "live_expert_manage", "C",
                "/live/course/expert", "Live/ExpertList", null, 30, "live:expert:view", "授课专家管理菜单"));
        menuIds.add(saveMenu(3101L, 3100L, "新增授课专家", "live_expert_add", "B",
                null, null, null, 1, "live:expert:add", "授课专家新增按钮"));
        menuIds.add(saveMenu(3102L, 3100L, "编辑授课专家", "live_expert_edit", "B",
                null, null, null, 2, "live:expert:edit", "授课专家编辑按钮"));
        menuIds.add(saveMenu(3103L, 3100L, "启用禁用授课专家", "live_expert_status", "B",
                null, null, null, 3, "live:expert:status", "授课专家状态按钮"));
        menuIds.add(saveMenu(3104L, 3100L, "删除授课专家", "live_expert_delete", "B",
                null, null, null, 4, "live:expert:delete", "授课专家删除按钮"));
        menuIds.add(saveMenu(4000L, 0L, "交易与财务", "trade_root", "M",
                "/trade", null, "moneyCollect", 400, null, "交易与财务模块"));
        menuIds.add(saveMenu(4100L, 4000L, "订单", "trade_order_group", "M",
                "/trade/order", null, null, 10, null, "订单目录"));
        menuIds.add(saveMenu(4110L, 4100L, "积分兑换", "trade_points_exchange", "C",
                "/trade/order/points-exchange", "Trade/PointsExchange", null, 10, "points:exchange:view", "积分兑换菜单"));
        menuIds.add(saveMenu(4111L, 4110L, "兑换详情", "trade_points_exchange_detail", "B",
                null, null, null, 1, "points:exchange:detail", "积分兑换详情按钮"));
        menuIds.add(saveMenu(4112L, 4110L, "积分兑换发货", "trade_points_exchange_ship", "B",
                null, null, null, 2, "points:exchange:ship", "积分兑换发货按钮"));
        menuIds.add(saveMenu(4113L, 4110L, "积分兑换删除", "trade_points_exchange_delete", "B",
                null, null, null, 3, "points:exchange:delete", "积分兑换删除按钮"));
        menuIds.add(saveMenu(4114L, 4110L, "积分兑换导出", "trade_points_exchange_export", "B",
                null, null, null, 4, "points:exchange:export", "积分兑换导出按钮"));
        menuIds.add(saveMenu(4200L, 4000L, "财务流水", "trade_finance_flow_group", "M",
                "/trade/flow", null, null, 20, null, "财务流水目录"));
        menuIds.add(saveMenu(4210L, 4200L, "积分收支明细", "trade_points_ledger", "C",
                "/trade/flow/points-ledger", "Trade/PointsLedger", null, 10, "points:ledger:view", "积分收支明细菜单"));
        menuIds.add(saveMenu(4211L, 4210L, "导出积分收支明细", "trade_points_ledger_export", "B",
                null, null, null, 1, "points:ledger:export", "积分收支明细导出按钮"));
        return menuIds;
    }
 
    private Long saveMenu(
            Long id,
            Long parentId,
            String name,
            String menuCode,
            String type,
            String path,
            String component,
            String icon,
            Integer sort,
            String permissionKey,
            String remark
    ) {
        SysMenu menu = sysMenuMapper.selectById(id);
        if (menu == null) {
            menu = sysMenuMapper.selectOne(new LambdaQueryWrapper<SysMenu>()
                    .eq(SysMenu::getMenuCode, menuCode)
                    .last("limit 1"));
        }
 
        boolean isNew = menu == null;
        if (isNew) {
            menu = new SysMenu();
            menu.setId(id);
            menu.setCreatedAt(LocalDateTime.now());
        }
 
        menu.setParentId(parentId);
        menu.setName(name);
        menu.setMenuCode(menuCode);
        menu.setType(type);
        menu.setPath(path);
        menu.setComponent(component);
        menu.setIcon(icon);
        menu.setSort(sort);
        menu.setStatus(1);
        menu.setVisible(1);
        menu.setPermissionKey(permissionKey);
        menu.setRemark(remark);
        menu.setDeleted(0);
        menu.setUpdatedAt(LocalDateTime.now());
        if (isNew) {
            sysMenuMapper.insert(menu);
        } else {
            sysMenuMapper.updateById(menu);
        }
        return menu.getId();
    }
 
    private void ensureRoleMenuRelations(Long roleId, List<Long> menuIds) {
        for (Long menuId : menuIds) {
            SysRoleMenu exists = sysRoleMenuMapper.selectOne(new LambdaQueryWrapper<SysRoleMenu>()
                    .eq(SysRoleMenu::getRoleId, roleId)
                    .eq(SysRoleMenu::getMenuId, menuId)
                    .last("limit 1"));
            if (exists != null) {
                continue;
            }
            SysRoleMenu roleMenu = new SysRoleMenu();
            roleMenu.setRoleId(roleId);
            roleMenu.setMenuId(menuId);
            roleMenu.setCreatedAt(LocalDateTime.now());
            sysRoleMenuMapper.insert(roleMenu);
        }
    }
 
    private void ensureUserRoleRelation(Long userId, Long roleId) {
        SysUserRole exists = sysUserRoleMapper.selectOne(new LambdaQueryWrapper<SysUserRole>()
                .eq(SysUserRole::getUserId, userId)
                .eq(SysUserRole::getRoleId, roleId)
                .last("limit 1"));
        if (exists != null) {
            return;
        }
        SysUserRole userRole = new SysUserRole();
        userRole.setUserId(userId);
        userRole.setRoleId(roleId);
        userRole.setCreatedAt(LocalDateTime.now());
        sysUserRoleMapper.insert(userRole);
    }
}