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.
111 lines
2.6 KiB
111 lines
2.6 KiB
1 month ago
|
// internal/service/init_service.go
|
||
|
package service
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
1 month ago
|
"gofaster/internal/auth/model"
|
||
|
"gofaster/internal/auth/repository"
|
||
1 month ago
|
|
||
|
"golang.org/x/crypto/bcrypt"
|
||
|
"gorm.io/gorm"
|
||
|
)
|
||
|
|
||
|
type InitService struct {
|
||
|
db *gorm.DB
|
||
|
userRepo *repository.UserRepo
|
||
|
roleRepo *repository.RoleRepo
|
||
|
permissionRepo *repository.PermissionRepo
|
||
|
}
|
||
|
|
||
|
func NewInitService(db *gorm.DB, userRepo *repository.UserRepo, roleRepo *repository.RoleRepo, permissionRepo *repository.PermissionRepo) *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) {
|
||
|
// 检查角色是否已存在
|
||
|
role, err := s.roleRepo.FindByName("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(adminRole); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
// 获取所有权限
|
||
|
var permissions []model.Permission
|
||
|
if err := s.permissionRepo.FindAll(&permissions); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
// 为角色分配所有权限
|
||
|
if err := s.roleRepo.AssignPermissions(adminRole.ID, permissions); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return adminRole, nil
|
||
|
}
|
||
|
|
||
|
// initSysAdminUser 初始化系统管理员用户
|
||
|
func (s *InitService) initSysAdminUser(adminRole *model.Role) error {
|
||
|
// 检查用户是否已存在
|
||
|
_, err := s.userRepo.FindByUsername("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(adminUser)
|
||
|
}
|