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, }, }) }