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