Files
TaskPool/internal/services/init_service.go
T
2025-12-20 13:30:08 +08:00

79 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package services
import (
"crypto/rand"
"encoding/hex"
"baihu/internal/constant"
"baihu/internal/logger"
)
type InitService struct {
settingsService *SettingsService
}
func NewInitService(settingsService *SettingsService) *InitService {
return &InitService{
settingsService: settingsService,
}
}
// Initialize 执行系统初始化,返回 UserService
func (s *InitService) Initialize() *UserService {
logger.Info("开始初始化系统...")
// 初始化默认设置
if err := s.settingsService.InitSettings(); err != nil {
logger.Warnf("初始化设置失败: %v", err)
}
// 初始化 JWT Secret(也用作密码 salt,必须在创建 UserService 之前)
s.initJWTSecret()
// 创建 UserService(依赖 settingsService 获取 salt
userService := NewUserService(s.settingsService)
// 创建管理员账号
s.initializeAdmin(userService)
return userService
}
// initializeAdmin 创建管理员账号
func (s *InitService) initializeAdmin(userService *UserService) {
existingUser := userService.GetUserByUsername("admin")
if existingUser != nil {
logger.Info("管理员账号已存在,跳过创建")
return
}
userService.CreateUser("admin", "123456", "admin@local", "admin")
logger.Info("管理员账号创建成功: admin / 123456")
}
// IsInitialized 检查是否已初始化
func (s *InitService) IsInitialized() bool {
return s.settingsService.Get(constant.SectionSystem, constant.KeyInitialized) == "true"
}
// initJWTSecret 初始化 JWT Secret,如果不存在则生成随机值
func (s *InitService) initJWTSecret() {
existing := s.settingsService.Get(constant.SectionSystem, constant.KeyJWTSecret)
if existing != "" {
return
}
// 生成 32 字节随机密钥
bytes := make([]byte, 32)
if _, err := rand.Read(bytes); err != nil {
logger.Warnf("生成 JWT Secret 失败: %v", err)
return
}
secret := hex.EncodeToString(bytes)
if err := s.settingsService.Set(constant.SectionSystem, constant.KeyJWTSecret, secret); err != nil {
logger.Warnf("保存 JWT Secret 失败: %v", err)
return
}
logger.Info("JWT Secret 已生成")
}