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() .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 menuIds = ensureDefaultMenus(); ensureRoleMenuRelations(role.getId(), menuIds); ensureUserRoleRelation(admin.getId(), role.getId()); } private SysRole ensureSuperAdminRole() { SysRole role = sysRoleMapper.selectOne(new LambdaQueryWrapper() .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 ensureDefaultMenus() { List menuIds = new ArrayList(); 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(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(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() .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 menuIds) { for (Long menuId : menuIds) { SysRoleMenu exists = sysRoleMenuMapper.selectOne(new LambdaQueryWrapper() .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() .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); } }