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": "注册成功,请使用新账号登录"}) }