“mitao”
2026-03-26 6b7bda93ea1fe2f956c251ec1a6a8b09824a2218
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
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
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(1305L, 1300L, "系统设置", "system_basic_settings", "C",
                "/system/settings/basic", "System/BasicSettings", null, 5, "system:basic-settings:view", "系统设置菜单"));
        menuIds.add(saveMenu(1306L, 1305L, "编辑系统设置", "system_basic_settings_edit", "B",
                null, null, null, 1, "system:basic-settings:edit", "系统设置编辑按钮"));
        menuIds.add(saveMenu(1307L, 1300L, "APP版本设置", "system_app_version_settings", "C",
                "/system/settings/app-version", "System/AppVersionSettings", null, 15, "system:app-version:view", "APP版本设置菜单"));
        menuIds.add(saveMenu(1308L, 1307L, "新增APP版本", "system_app_version_settings_add", "B",
                null, null, null, 1, "system:app-version:add", "新增APP版本按钮"));
        menuIds.add(saveMenu(1309L, 1307L, "查看APP版本", "system_app_version_settings_detail", "B",
                null, null, null, 2, "system:app-version:detail", "查看APP版本按钮"));
        menuIds.add(saveMenu(1312L, 1300L, "消息推送配置", "system_message_push_settings", "C",
                "/system/settings/message-push", "System/MessagePushSettings", null, 20, "system:message-push:view", "消息推送配置菜单"));
        menuIds.add(saveMenu(1313L, 1312L, "编辑消息推送配置", "system_message_push_settings_edit", "B",
                null, null, null, 1, "system:message-push:edit", "消息推送配置编辑按钮"));
        menuIds.add(saveMenu(1314L, 1300L, "Banner配置", "system_banner_settings", "C",
                "/system/settings/banner", "System/BannerSettings", null, 12, "system:banner:view", "Banner配置菜单"));
        menuIds.add(saveMenu(1315L, 1314L, "新增Banner", "system_banner_settings_add", "B",
                null, null, null, 1, "system:banner:add", "Banner新增按钮"));
        menuIds.add(saveMenu(1316L, 1314L, "编辑Banner", "system_banner_settings_edit", "B",
                null, null, null, 2, "system:banner:edit", "Banner编辑按钮"));
        menuIds.add(saveMenu(1317L, 1314L, "查看Banner", "system_banner_settings_detail", "B",
                null, null, null, 3, "system:banner:detail", "Banner查看按钮"));
        menuIds.add(saveMenu(1318L, 1314L, "删除Banner", "system_banner_settings_delete", "B",
                null, null, null, 4, "system:banner:delete", "Banner删除按钮"));
        menuIds.add(saveMenu(1319L, 1314L, "批量删除Banner", "system_banner_settings_batch_delete", "B",
                null, null, null, 5, "system:banner:batch-delete", "Banner批量删除按钮"));
        menuIds.add(saveMenu(1320L, 1314L, "切换Banner上架状态", "system_banner_settings_publish_status", "B",
                null, null, null, 6, "system:banner:publish-status", "Banner上架状态按钮"));
        menuIds.add(saveMenu(1321L, 1300L, "活动通知", "system_activity_notice", "C",
                "/system/settings/activity-notice", "System/ActivityNotice", null, 13, "system:activity-notice:view", "活动通知菜单"));
        menuIds.add(saveMenu(1322L, 1321L, "新增活动通知", "system_activity_notice_add", "B",
                null, null, null, 1, "system:activity-notice:add", "活动通知新增按钮"));
        menuIds.add(saveMenu(1323L, 1321L, "删除活动通知", "system_activity_notice_delete", "B",
                null, null, null, 2, "system:activity-notice:delete", "活动通知删除按钮"));
        menuIds.add(saveMenu(1324L, 1300L, "平台资质", "system_platform_qualification", "C",
                "/system/settings/platform-qualification", "System/PlatformQualification", null, 14, "system:platform-qualification:view", "平台资质菜单"));
        menuIds.add(saveMenu(1325L, 1324L, "新增平台资质", "system_platform_qualification_add", "B",
                null, null, null, 1, "system:platform-qualification:add", "平台资质新增按钮"));
        menuIds.add(saveMenu(1326L, 1324L, "查看平台资质", "system_platform_qualification_detail", "B",
                null, null, null, 2, "system:platform-qualification:detail", "平台资质详情按钮"));
        menuIds.add(saveMenu(1327L, 1324L, "编辑平台资质", "system_platform_qualification_edit", "B",
                null, null, null, 3, "system:platform-qualification:edit", "平台资质编辑按钮"));
        menuIds.add(saveMenu(1328L, 1324L, "删除平台资质", "system_platform_qualification_delete", "B",
                null, null, null, 4, "system:platform-qualification:delete", "平台资质删除按钮"));
        menuIds.add(saveMenu(1329L, 1324L, "切换平台资质上架状态", "system_platform_qualification_publish_status", "B",
                null, null, null, 5, "system:platform-qualification:publish-status", "平台资质上架状态按钮"));
        menuIds.add(saveMenu(1330L, 1300L, "协议内容", "system_agreement_content", "C",
                "/system/settings/agreement-content", "System/AgreementContent", null, 16, "system:agreement-content:view", "协议内容菜单"));
        menuIds.add(saveMenu(1331L, 1330L, "编辑协议内容", "system_agreement_content_edit", "B",
                null, null, null, 1, "system:agreement-content:edit", "协议内容编辑按钮"));
        menuIds.add(saveMenu(1332L, 1300L, "常见问题", "system_common_question", "C",
                "/system/settings/common-question", "System/CommonQuestion", null, 17, "system:common-question:view", "常见问题菜单"));
        menuIds.add(saveMenu(1333L, 1332L, "新增常见问题", "system_common_question_add", "B",
                null, null, null, 1, "system:common-question:add", "常见问题新增按钮"));
        menuIds.add(saveMenu(1334L, 1332L, "编辑常见问题", "system_common_question_edit", "B",
                null, null, null, 2, "system:common-question:edit", "常见问题编辑按钮"));
        menuIds.add(saveMenu(1335L, 1332L, "删除常见问题", "system_common_question_delete", "B",
                null, null, null, 3, "system:common-question:delete", "常见问题删除按钮"));
        menuIds.add(saveMenu(1336L, 1300L, "用户意见反馈", "system_user_feedback", "C",
                "/system/settings/user-feedback", "System/UserFeedback", null, 18, "system:user-feedback:view", "用户意见反馈菜单"));
        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(5000L, 0L, "统计", "statistics_root", "M",
                "/statistics", null, "barChart", 150, null, "统计模块"));
        menuIds.add(saveMenu(5030L, 5000L, "营收数据", "statistics_revenue", "C",
                "/statistics/revenue", "Statistics/Revenue", null, 30, "statistics:revenue:view", "营收数据菜单"));
        menuIds.add(saveMenu(5031L, 5030L, "导出营收报表", "statistics_revenue_export", "B",
                null, null, null, 1, "statistics:revenue:export", "营收数据导出按钮"));
        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(3090L, 3050L, "分类管理", "live_category_manage", "C",
                "/live/course/category", "Live/CategoryList", null, 22, "live:category:view", "分类管理菜单"));
        menuIds.add(saveMenu(3091L, 3090L, "新增分类", "live_category_add", "B",
                null, null, null, 1, "live:category:add", "分类新增按钮"));
        menuIds.add(saveMenu(3092L, 3090L, "编辑分类", "live_category_edit", "B",
                null, null, null, 2, "live:category:edit", "分类编辑按钮"));
        menuIds.add(saveMenu(3093L, 3090L, "删除分类", "live_category_delete", "B",
                null, null, null, 3, "live:category:delete", "分类删除按钮"));
        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(3110L, 3050L, "养生课程", "live_health_course_manage", "C",
                "/live/course/health", "Live/HealthCourseList", null, 40, "live:health-course:view", "养生课程菜单"));
        menuIds.add(saveMenu(3111L, 3110L, "养生课程详情", "live_health_course_detail", "B",
                null, null, null, 1, "live:health-course:detail", "养生课程详情按钮"));
        menuIds.add(saveMenu(3112L, 3110L, "新增养生课程", "live_health_course_add", "B",
                null, null, null, 2, "live:health-course:add", "养生课程新增按钮"));
        menuIds.add(saveMenu(3113L, 3110L, "编辑养生课程", "live_health_course_edit", "B",
                null, null, null, 3, "live:health-course:edit", "养生课程编辑按钮"));
        menuIds.add(saveMenu(3114L, 3110L, "删除养生课程", "live_health_course_delete", "B",
                null, null, null, 4, "live:health-course:delete", "养生课程删除按钮"));
        menuIds.add(saveMenu(3115L, 3110L, "启用禁用养生课程", "live_health_course_status", "B",
                null, null, null, 5, "live:health-course:status", "养生课程状态按钮"));
        menuIds.add(saveMenu(3116L, 3110L, "导出养生课程", "live_health_course_export", "B",
                null, null, null, 6, "live:health-course:export", "养生课程导出按钮"));
        menuIds.add(saveMenu(3117L, 3110L, "新增视频课程", "live_health_course_video_add", "B",
                null, null, null, 7, "live:health-course:video:add", "养生课程视频新增按钮"));
        menuIds.add(saveMenu(3118L, 3110L, "编辑视频课程", "live_health_course_video_edit", "B",
                null, null, null, 8, "live:health-course:video:edit", "养生课程视频编辑按钮"));
        menuIds.add(saveMenu(3119L, 3110L, "删除视频课程", "live_health_course_video_delete", "B",
                null, null, null, 9, "live:health-course:video:delete", "养生课程视频删除按钮"));
        menuIds.add(saveMenu(3120L, 3050L, "健康科普", "live_health_popularization_manage", "C",
                "/live/course/health-popularization", "Live/HealthPopularizationList", null, 50, "live:health-popularization:view", "健康科普菜单"));
        menuIds.add(saveMenu(3121L, 3120L, "新增健康科普", "live_health_popularization_add", "B",
                null, null, null, 1, "live:health-popularization:add", "健康科普新增按钮"));
        menuIds.add(saveMenu(3122L, 3120L, "编辑健康科普", "live_health_popularization_edit", "B",
                null, null, null, 2, "live:health-popularization:edit", "健康科普编辑按钮"));
        menuIds.add(saveMenu(3123L, 3120L, "删除健康科普", "live_health_popularization_delete", "B",
                null, null, null, 3, "live:health-popularization: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(4130L, 4100L, "养生课程购买订单", "trade_health_course_purchase_order", "C",
                "/trade/order/course-purchase", "Trade/CoursePurchase", null, 8, "course:purchase-order:view", "养生课程购买订单菜单"));
        menuIds.add(saveMenu(4131L, 4130L, "导出养生课程购买订单", "trade_health_course_purchase_order_export", "B",
                null, null, null, 1, "course:purchase-order:export", "养生课程购买订单导出按钮"));
        menuIds.add(saveMenu(4132L, 4130L, "退款养生课程购买订单", "trade_health_course_purchase_order_refund", "B",
                null, null, null, 2, "course:purchase-order:refund", "养生课程购买订单退款按钮"));
        menuIds.add(saveMenu(4133L, 4130L, "删除养生课程购买订单", "trade_health_course_purchase_order_delete", "B",
                null, null, null, 3, "course:purchase-order:delete", "养生课程购买订单删除按钮"));
        menuIds.add(saveMenu(4120L, 4100L, "会员购买订单", "trade_member_purchase_order", "C",
                "/trade/order/member-purchase", "Trade/MemberPurchase", null, 9, "member:purchase-order:view", "会员购买订单菜单"));
        menuIds.add(saveMenu(4121L, 4120L, "导出会员购买订单", "trade_member_purchase_order_export", "B",
                null, null, null, 1, "member:purchase-order:export", "会员购买订单导出按钮"));
        menuIds.add(saveMenu(4122L, 4120L, "退款会员购买订单", "trade_member_purchase_order_refund", "B",
                null, null, null, 2, "member:purchase-order:refund", "会员购买订单退款按钮"));
        menuIds.add(saveMenu(4123L, 4120L, "删除会员购买订单", "trade_member_purchase_order_delete", "B",
                null, null, null, 3, "member:purchase-order:delete", "会员购买订单删除按钮"));
        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(4220L, 4200L, "支付流水", "trade_payment_flow", "C",
                "/trade/flow/payment-flow", "Trade/PaymentFlow", null, 10, "payment:flow:view", "支付流水菜单"));
        menuIds.add(saveMenu(4221L, 4220L, "导出支付流水", "trade_payment_flow_export", "B",
                null, null, null, 1, "payment:flow:export", "支付流水导出按钮"));
        menuIds.add(saveMenu(4230L, 4200L, "退费流水", "trade_refund_flow", "C",
                "/trade/flow/refund-flow", "Trade/RefundFlow", null, 20, "refund:flow:view", "退费流水菜单"));
        menuIds.add(saveMenu(4231L, 4230L, "导出退费流水", "trade_refund_flow_export", "B",
                null, null, null, 1, "refund:flow:export", "退费流水导出按钮"));
        menuIds.add(saveMenu(4210L, 4200L, "积分收支明细", "trade_points_ledger", "C",
                "/trade/flow/points-ledger", "Trade/PointsLedger", null, 30, "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);
    }
}