This repository has been archived on 2026-04-05. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Exam_registration/internal/service/user_service.go
2026-03-20 21:41:00 +08:00

92 lines
2.5 KiB
Go

package service
import (
"exam_registration/internal/dao"
"exam_registration/internal/model"
"errors"
"github.com/golang-jwt/jwt/v5"
"github.com/spf13/viper"
"golang.org/x/crypto/bcrypt"
"time"
)
type UserService struct{}
type LoginRequest struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
type RegisterRequest struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
Email string `json:"email"`
Phone string `json:"phone"`
RealName string `json:"real_name"`
IDCard string `json:"id_card"`
}
func (s *UserService) Login(req *LoginRequest) (string, error) {
var user model.User
if err := dao.DB.Where("username = ?", req.Username).First(&user).Error; err != nil {
return "", errors.New("用户名或密码错误")
}
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)); err != nil {
return "", errors.New("用户名或密码错误")
}
if user.Status != 1 {
return "", errors.New("账号已被禁用")
}
// 生成 JWT token
claims := jwt.MapClaims{
"user_id": user.ID,
"username": user.Username,
"role": user.Role,
"exp": time.Now().Add(time.Duration(viper.GetInt("jwt.expire")) * time.Second).Unix(),
"issued_at": time.Now().Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString([]byte(viper.GetString("jwt.secret")))
}
func (s *UserService) Register(req *RegisterRequest) error {
var existingUser model.User
if err := dao.DB.Where("username = ?", req.Username).First(&existingUser).Error; err == nil {
return errors.New("用户名已存在")
}
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
if err != nil {
return errors.New("密码加密失败")
}
user := model.User{
Username: req.Username,
Password: string(hashedPassword),
Email: req.Email,
Phone: req.Phone,
RealName: req.RealName,
IDCard: req.IDCard,
Role: "user",
Status: 1,
}
return dao.DB.Create(&user).Error
}
func (s *UserService) GetUserByID(userID uint64) (*model.User, error) {
var user model.User
if err := dao.DB.First(&user, userID).Error; err != nil {
return nil, errors.New("用户不存在")
}
return &user, nil
}
func (s *UserService) UpdateUser(userID uint64, updates map[string]interface{}) error {
return dao.DB.Model(&model.User{}).Where("id = ?", userID).Updates(updates).Error
}