package handler import ( "net/http" "os" "strings" "github.com/gin-gonic/gin" "myschools.me/heritage/heritage-api/model" "myschools.me/heritage/heritage-api/service" ) type loginRequest struct { UserName string `json:"userName"` Username string `json:"username"` Password string `json:"password"` } type loginResponse struct { Token string `json:"token"` User *model.User `json:"user"` } type changePasswordRequest struct { OldPassword string `json:"oldPassword"` NewPassword string `json:"newPassword"` } func Login(c *gin.Context) { var req loginRequest if err := c.ShouldBindJSON(&req); err != nil { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ "data": "参数错误", }) return } if req.UserName == "" { req.UserName = req.Username } req.UserName = strings.TrimSpace(req.UserName) if req.UserName == "" || req.Password == "" { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ "data": "用户名或密码不能为空", }) return } token, safeUser, err := service.Login(req.UserName, req.Password) if err != nil { if err == service.ErrInvalidCredentials { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "data": "用户名或密码错误", }) return } c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{ "data": "登录失败", }) return } c.JSON(http.StatusOK, loginResponse{ Token: token, User: safeUser, }) } func Logout(c *gin.Context) { token := c.GetHeader("Authorization") if token == "" { token = c.Query("Authorization") } _ = service.Logout(token) c.JSON(http.StatusOK, gin.H{ "data": "ok", }) } func Me(c *gin.Context) { usr := currentUser(c) if usr == nil { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "data": "无效TOKEN, 请重新登录!", }) return } c.JSON(http.StatusOK, gin.H{ "user": usr, }) } func ChangePassword(c *gin.Context) { usr := currentUser(c) if usr == nil { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "data": "无效TOKEN, 请重新登录!", }) return } var req changePasswordRequest if err := c.ShouldBindJSON(&req); err != nil { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ "data": "参数错误", }) return } req.OldPassword = strings.TrimSpace(req.OldPassword) req.NewPassword = strings.TrimSpace(req.NewPassword) err := service.ChangePassword(usr.ID, req.OldPassword, req.NewPassword) if err != nil { switch err { case service.ErrInvalidArgument: c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ "data": "密码不能为空", }) case service.ErrNewPasswordShort: c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ "data": "新密码至少6位", }) case service.ErrOldPasswordWrong: c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ "data": "旧密码错误", }) case service.ErrUserNotFound: c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "data": "无效用户, 请重新登录!", }) default: c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{ "data": changePasswordInternalError(err), }) } return } c.JSON(http.StatusOK, gin.H{ "data": "ok", }) } func changePasswordInternalError(err error) string { if os.Getenv("DEBUG") == "true" && err != nil { return "修改失败: " + err.Error() } return "修改失败" }