diff --git a/internal/service/admin.go b/internal/service/admin.go new file mode 100644 index 0000000..4e23e8c --- /dev/null +++ b/internal/service/admin.go @@ -0,0 +1,53 @@ +package service + +import ( + "errors" + + "gotest/internal/model" + "gotest/internal/repository" + + "golang.org/x/crypto/bcrypt" +) + +// AdminService 管理员服务,负责管理员检查与初始化 +type AdminService struct { + userRepo *repository.UserRepository +} + +// NewAdminService 创建管理员服务实例 +func NewAdminService(userRepo *repository.UserRepository) *AdminService { + return &AdminService{userRepo: userRepo} +} + +// CheckAdmin 检查管理员是否已存在 +func (s *AdminService) CheckAdmin() (bool, error) { + count, err := s.userRepo.Count() + if err != nil { + return false, err + } + return count > 0, nil +} + +// InitAdmin 初始化管理员账号(仅在无任何用户时允许) +func (s *AdminService) InitAdmin(username, password string) error { + // 已存在用户时禁止初始化 + count, err := s.userRepo.Count() + if err != nil { + return err + } + if count > 0 { + return errors.New("系统已初始化,禁止重复操作") + } + + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + return err + } + + return s.userRepo.Create(&model.User{ + Username: username, + Password: string(hashedPassword), + Role: "admin", + Status: 1, + }) +}