test/backend/internal/handlers/auth_handler.go
2025-11-21 16:03:52 +08:00

82 lines
2.2 KiB
Go

package handlers
import (
"strings"
"github.com/gin-gonic/gin"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
"soda-api/backend/internal/models"
"soda-api/backend/internal/utils"
)
type AuthHandler struct {
db *gorm.DB
jwtManager *utils.JWTManager
}
func NewAuthHandler(db *gorm.DB, jwt *utils.JWTManager) *AuthHandler {
return &AuthHandler{db: db, jwtManager: jwt}
}
type LoginRequest struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
type RegisterRequest struct {
Username string `json:"username" binding:"required,min=3"`
Password string `json:"password" binding:"required,min=6"`
Email string `json:"email"`
}
func (h *AuthHandler) Login(c *gin.Context) {
var req LoginRequest
if err := c.ShouldBindJSON(&req); err != nil {
utils.JSONError(c, 400, "请输入用户名与密码")
return
}
var user models.User
if err := h.db.Where("LOWER(username)=?", strings.ToLower(req.Username)).First(&user).Error; err != nil {
utils.JSONError(c, 401, "账号或密码错误")
return
}
if err := bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(req.Password)); err != nil {
utils.JSONError(c, 401, "账号或密码错误")
return
}
token, err := h.jwtManager.Generate(user.ID, user.Username, user.Role)
if err != nil {
utils.JSONError(c, 500, "生成令牌失败")
return
}
utils.JSONSuccess(c, gin.H{
"token": token,
"user": gin.H{
"id": user.ID,
"username": user.Username,
"role": user.Role,
},
})
}
func (h *AuthHandler) Register(c *gin.Context) {
var req RegisterRequest
if err := c.ShouldBindJSON(&req); err != nil {
utils.JSONError(c, 400, "请填写完整注册信息")
return
}
passwordHash, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
if err != nil {
utils.JSONError(c, 500, "密码加密失败")
return
}
user := models.User{Username: req.Username, PasswordHash: string(passwordHash), Role: "merchant"}
if err := h.db.Create(&user).Error; err != nil {
utils.JSONError(c, 400, "用户名已存在")
return
}
utils.JSONSuccess(c, gin.H{"message": "注册成功,请使用新账号登录"})
}