// internal/service/init_service.go package service import ( "context" "errors" "gofaster/internal/auth/model" "gofaster/internal/auth/repository" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" ) type InitService struct { db *gorm.DB userRepo repository.UserRepository roleRepo repository.RoleRepository permissionRepo repository.PermissionRepository } func NewInitService(db *gorm.DB, userRepo repository.UserRepository, roleRepo repository.RoleRepository, permissionRepo repository.PermissionRepository) *InitService { return &InitService{ db: db, userRepo: userRepo, roleRepo: roleRepo, permissionRepo: permissionRepo, } } // InitSystem 初始化系统 func (s *InitService) InitSystem() error { // 在事务中执行所有初始化操作 return s.db.Transaction(func(tx *gorm.DB) error { // 1. 检查并创建超级管理员角色 adminRole, err := s.initAdminRole() if err != nil { return err } // 2. 检查并创建系统管理员用户 if err := s.initSysAdminUser(adminRole); err != nil { return err } return nil }) } // initAdminRole 初始化超级管理员角色 func (s *InitService) initAdminRole() (*model.Role, error) { ctx := context.Background() // 检查角色是否已存在 role, err := s.roleRepo.GetByCode(ctx, "sysadmin") if err == nil { return role, nil } if !errors.Is(err, gorm.ErrRecordNotFound) { return nil, err } // 创建超级管理员角色 adminRole := &model.Role{ Name: "sysadmin", Description: "系统超级管理员,拥有所有权限", } if err := s.roleRepo.Create(ctx, adminRole); err != nil { return nil, err } // 获取所有权限 permissions, _, err := s.permissionRepo.List(ctx, 0, 1000) if err != nil { return nil, err } // 为角色分配所有权限 var permissionIDs []uint for _, perm := range permissions { permissionIDs = append(permissionIDs, perm.ID) } if err := s.roleRepo.AssignPermissions(ctx, adminRole.ID, permissionIDs); err != nil { return nil, err } return adminRole, nil } // initSysAdminUser 初始化系统管理员用户 func (s *InitService) initSysAdminUser(adminRole *model.Role) error { // 检查用户是否已存在 _, err := s.userRepo.GetByUsername(context.Background(), "sysadmin") if err == nil { return nil // 用户已存在 } if !errors.Is(err, gorm.ErrRecordNotFound) { return err } // 加密密码 hashedPassword, err := bcrypt.GenerateFromPassword([]byte("sysadmin@123"), bcrypt.DefaultCost) if err != nil { return err } // 创建用户 adminUser := &model.User{ Username: "sysadmin", Password: string(hashedPassword), Email: "sysadmin@example.com", Status: 1, Roles: []model.Role{*adminRole}, } return s.userRepo.Create(context.Background(), adminUser) }