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