79 lines
2.1 KiB
Go
79 lines
2.1 KiB
Go
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 已生成")
|
||
}
|