122 lines
2.7 KiB
Go
122 lines
2.7 KiB
Go
|
|
// 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)
|
||
|
|
}
|