package handler import ( "strings" "github.com/gin-gonic/gin" "laic-backend/common" "laic-backend/service" "laic-backend/vo" ) func Captcha(c *gin.Context) { id, image, err := service.NewCaptcha() if err != nil { common.FailWithBusiErrorByServer(c, common.ErrInternal) return } c.SetCookie(service.CaptchaCookieName(), id, int(service.CaptchaTTL().Seconds()), "/", "", false, true) c.Header("Cache-Control", "no-store") c.Data(200, "image/png", image) } // SmsCode 发送短信验证码 func SmsCode(c *gin.Context) { var req vo.SmsCodeReq if err := c.ShouldBindJSON(&req); err != nil { common.FailWithBindError(c, common.ErrParam, err) return } if _, busiErr := service.DefaultUserService.SendSmsCode(req.Phone, req.Scene); busiErr != nil { common.FailWithBusiError(c, busiErr) return } common.OK(c) } // Register 用户注册 func Register(c *gin.Context) { var req vo.RegisterReq if err := c.ShouldBindJSON(&req); err != nil { common.FailWithBindError(c, common.ErrParam, err) return } resp, busiErr := service.DefaultUserService.Register(req.Name, req.Phone, req.Email, req.Password, req.SmsCode, c.GetHeader("User-Agent"), c.ClientIP()) if busiErr != nil { common.FailWithBusiError(c, busiErr) return } common.OKWithData(c, resp) } // Login 用户登录 func Login(c *gin.Context) { var req vo.UserLoginReq if err := c.ShouldBindJSON(&req); err != nil { common.FailWithBindError(c, common.ErrParam, err) return } captchaID, _ := c.Cookie(service.CaptchaCookieName()) resp, busiErr := service.DefaultUserService.Login(req.Phone, req.Password, req.Captcha, captchaID, req.SmsCode, c.GetHeader("User-Agent"), c.ClientIP()) if busiErr != nil { common.FailWithBusiError(c, busiErr) return } common.OKWithData(c, resp) } // Refresh 刷新令牌 func Refresh(c *gin.Context) { var req vo.RefreshReq if err := c.ShouldBindJSON(&req); err != nil { common.FailWithBindError(c, common.ErrParam, err) return } resp, busiErr := service.DefaultUserService.Refresh(req.RefreshToken, c.GetHeader("User-Agent"), c.ClientIP()) if busiErr != nil { common.FailWithBusiError(c, busiErr) return } common.OKWithData(c, resp) } // Logout 登出 func Logout(c *gin.Context) { var req vo.LogoutReq _ = c.ShouldBindJSON(&req) // refreshToken 可选,忽略绑定错误 accessToken := strings.TrimPrefix(c.GetHeader("Authorization"), "Bearer ") userID := common.GetUserId(c) if busiErr := service.DefaultUserService.Logout(userID, c.GetInt64("session_id"), accessToken, req.RefreshToken); busiErr != nil { common.FailWithBusiError(c, busiErr) return } common.OK(c) } // ResetPassword 重置密码 func ResetPassword(c *gin.Context) { var req vo.ResetPasswordReq if err := c.ShouldBindJSON(&req); err != nil { common.FailWithBindError(c, common.ErrParam, err) return } if busiErr := service.DefaultUserService.ResetPassword(req.Phone, req.SmsCode, req.NewPassword); busiErr != nil { common.FailWithBusiError(c, busiErr) return } common.OK(c) }