package service import ( "errors" "affiliate_dash/internal/model" "affiliate_dash/internal/pkg/jwt" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" ) type AuthService struct { db *gorm.DB jwt *jwt.Manager tenant *TenantService } func NewAuthService(db *gorm.DB, jm *jwt.Manager, tenant *TenantService) *AuthService { return &AuthService{db: db, jwt: jm, tenant: tenant} } type LoginResult struct { Token string `json:"token"` User *model.User `json:"user"` } func (s *AuthService) Login(username, password string) (*LoginResult, error) { var user model.User if err := s.db.Where("username = ?", username).First(&user).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, errors.New("用户名或密码错误") } return nil, err } if user.Status != 1 { return nil, errors.New("账号已禁用") } if err := bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password)); err != nil { return nil, errors.New("用户名或密码错误") } token, err := s.jwt.Generate(user.ID, user.Username, user.Role) if err != nil { return nil, err } return &LoginResult{Token: token, User: &user}, nil } func (s *AuthService) GetProfile(userID uint) (*model.User, error) { var user model.User if err := s.db.First(&user, userID).Error; err != nil { return nil, err } return &user, nil } func (s *AuthService) EnsureAdmin() error { var count int64 s.db.Model(&model.User{}).Where("role = ?", model.RoleAdmin).Count(&count) if count > 0 { if s.tenant != nil { var admins []model.User if err := s.db.Where("role = ?", model.RoleAdmin).Find(&admins).Error; err != nil { return err } for _, admin := range admins { if err := s.tenant.EnsureSelfMember(admin.ID, model.MemberRoleOwner, admin.Status); err != nil { return err } } } return nil } hash, err := bcrypt.GenerateFromPassword([]byte("admin123"), bcrypt.DefaultCost) if err != nil { return err } admin := &model.User{ Username: "admin", PasswordHash: string(hash), Nickname: "管理员", Role: model.RoleAdmin, Status: 1, } if err := s.db.Create(admin).Error; err != nil { return err } if s.tenant != nil { return s.tenant.EnsureSelfMember(admin.ID, model.MemberRoleOwner, admin.Status) } return nil }