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