gin_demo/modules/user/handler.go
2026-03-27 10:42:46 +08:00

87 lines
1.9 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package user
import (
"net/http"
"github.com/gin-gonic/gin"
)
type Handler struct {
svc *Service
}
func NewHandler(svc *Service) *Handler {
return &Handler{svc: svc}
}
type registerReq struct {
Username string `json:"username"`
Password string `json:"password"`
}
type loginReq struct {
Username string `json:"username"`
Password string `json:"password"`
}
func (h *Handler) Register(c *gin.Context) {
var req registerReq
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "invalid request"})
return
}
if err := h.svc.Register(c.Request.Context(), req.Username, req.Password); err != nil {
if err == ErrUserAlreadyExists {
c.JSON(http.StatusConflict, gin.H{"code": 409, "message": "user already exists"})
return
}
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"code": 0, "message": "register success"})
}
func (h *Handler) Login(c *gin.Context) {
var req loginReq
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "invalid request"})
return
}
token, err := h.svc.Login(c.Request.Context(), req.Username, req.Password)
if err != nil {
// login 统一返回 401避免泄露用户名是否存在
c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "invalid credentials"})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "login success",
"data": gin.H{
"token": token,
"token_type": "Bearer",
},
})
}
// Me 当前登录用户信息(需要 JWT middleware
func (h *Handler) Me(c *gin.Context) {
username, ok := c.Get("username")
if !ok || username == "" {
c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "unauthorized"})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "ok",
"data": gin.H{
"username": username,
},
})
}