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 }