You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

118 lines
2.8 KiB

// 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)
}