Files
SeeyonFileSystem/server/service/auth_service.go

122 lines
2.7 KiB
Go
Raw Normal View History

2026-07-03 15:58:29 +08:00
// Package service 提供业务逻辑层
package service
import (
"errors"
"seeyon-filesystem/config"
"seeyon-filesystem/dto"
"seeyon-filesystem/model"
"seeyon-filesystem/repository"
"seeyon-filesystem/utils"
"gorm.io/gorm"
)
// AuthService 认证服务
type AuthService struct {
userRepo *repository.UserRepository
}
// NewAuthService 创建认证服务实例
func NewAuthService() *AuthService {
return &AuthService{
userRepo: repository.NewUserRepository(),
}
}
// Login 用户登录
// 验证用户名密码, 生成JWT Token
func (s *AuthService) Login(req *dto.LoginRequest) (*dto.LoginResponse, error) {
// 查找用户
user, err := s.userRepo.FindByUsername(req.Username)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("用户名或密码错误")
}
return nil, err
}
// 检查用户状态
if user.Status != 1 {
return nil, errors.New("账号已被禁用")
}
// 验证密码
if !utils.CheckPassword(req.Password, user.Password) {
return nil, errors.New("用户名或密码错误")
}
// 生成JWT Token
token, err := utils.GenerateToken(
user.ID,
user.Username,
user.Role,
config.AppConfig.JWT.Secret,
config.AppConfig.JWT.Expiration,
)
if err != nil {
return nil, errors.New("生成Token失败")
}
return &dto.LoginResponse{
Token: token,
Username: user.Username,
Nickname: user.Nickname,
Role: user.Role,
MustChangePwd: user.MustChangePwd == 1,
}, nil
}
// Register 用户注册
func (s *AuthService) Register(req *dto.RegisterRequest) error {
existing, _ := s.userRepo.FindByUsername(req.Username)
if existing != nil {
return errors.New("用户名已存在")
}
hashedPassword, err := utils.HashPassword(req.Password)
if err != nil {
return errors.New("密码加密失败")
}
user := &model.User{
Username: req.Username,
Password: hashedPassword,
Email: req.Email,
Nickname: req.Nickname,
Role: "user",
Status: 1,
}
return s.userRepo.Create(user)
}
// ChangePassword 修改密码
func (s *AuthService) ChangePassword(userID uint64, req *dto.ChangePasswordRequest) error {
user, err := s.userRepo.FindByID(userID)
if err != nil {
return errors.New("用户不存在")
}
// 验证旧密码
if !utils.CheckPassword(req.OldPassword, user.Password) {
return errors.New("当前密码错误")
}
// 新密码不能和旧密码相同
if req.OldPassword == req.NewPassword {
return errors.New("新密码不能与当前密码相同")
}
// 加密新密码
hashedPassword, err := utils.HashPassword(req.NewPassword)
if err != nil {
return errors.New("密码加密失败")
}
user.Password = hashedPassword
user.MustChangePwd = 0 // 清除强制改密码标记
return s.userRepo.Update(user)
}