From 6d078811412ba2a773336aa80e2c77f801a40fc6 Mon Sep 17 00:00:00 2001 From: RockYang Date: Wed, 22 Nov 2023 18:00:45 +0800 Subject: [PATCH] feat: reset password function is ready --- api/core/app_server.go | 1 + api/handler/user_handler.go | 44 ++++++++++++- api/main.go | 3 +- web/src/components/ResetPass.vue | 108 +++++++++++++++++++++++++++++++ web/src/store/session.js | 2 +- web/src/views/Login.vue | 10 ++- 6 files changed, 161 insertions(+), 7 deletions(-) create mode 100644 web/src/components/ResetPass.vue diff --git a/api/core/app_server.go b/api/core/app_server.go index 96f70713..eed70cbe 100644 --- a/api/core/app_server.go +++ b/api/core/app_server.go @@ -139,6 +139,7 @@ func corsMiddleware() gin.HandlerFunc { func authorizeMiddleware(s *AppServer, client *redis.Client) gin.HandlerFunc { return func(c *gin.Context) { if c.Request.URL.Path == "/api/user/login" || + c.Request.URL.Path == "/api/user/resetPass" || c.Request.URL.Path == "/api/admin/login" || c.Request.URL.Path == "/api/user/register" || c.Request.URL.Path == "/api/chat/history" || diff --git a/api/handler/user_handler.go b/api/handler/user_handler.go index 0fd9b7a7..229327bc 100644 --- a/api/handler/user_handler.go +++ b/api/handler/user_handler.go @@ -275,8 +275,8 @@ func (h *UserHandler) ProfileUpdate(c *gin.Context) { resp.SUCCESS(c) } -// Password 更新密码 -func (h *UserHandler) Password(c *gin.Context) { +// UpdatePass 更新密码 +func (h *UserHandler) UpdatePass(c *gin.Context) { var data struct { OldPass string `json:"old_pass"` Password string `json:"password"` @@ -315,6 +315,46 @@ func (h *UserHandler) Password(c *gin.Context) { resp.SUCCESS(c) } +// ResetPass 重置密码 +func (h *UserHandler) ResetPass(c *gin.Context) { + var data struct { + Mobile string + Code string // 验证码 + Password string // 新密码 + } + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + + var user model.User + res := h.db.Where("mobile", data.Mobile).First(&user) + if res.Error != nil { + resp.ERROR(c, "用户不存在!") + return + } + + // 检查验证码 + key := CodeStorePrefix + data.Mobile + if h.App.SysConfig.EnabledMsg { + code, err := h.redis.Get(c, key).Result() + if err != nil || code != data.Code { + resp.ERROR(c, "短信验证码错误") + return + } + } + + password := utils.GenPassword(data.Password, user.Salt) + user.Password = password + res = h.db.Updates(&user) + if res.Error != nil { + resp.ERROR(c) + } else { + h.redis.Del(c, key) + resp.SUCCESS(c) + } +} + // BindMobile 绑定手机号 func (h *UserHandler) BindMobile(c *gin.Context) { var data struct { diff --git a/api/main.go b/api/main.go index fb7a3a26..0c9923f5 100644 --- a/api/main.go +++ b/api/main.go @@ -216,8 +216,9 @@ func main() { group.GET("session", h.Session) group.GET("profile", h.Profile) group.POST("profile/update", h.ProfileUpdate) - group.POST("password", h.Password) + group.POST("password", h.UpdatePass) group.POST("bind/mobile", h.BindMobile) + group.POST("resetPass", h.ResetPass) }), fx.Invoke(func(s *core.AppServer, h *chatimpl.ChatHandler) { group := s.Engine.Group("/api/chat/") diff --git a/web/src/components/ResetPass.vue b/web/src/components/ResetPass.vue new file mode 100644 index 00000000..7c589a7a --- /dev/null +++ b/web/src/components/ResetPass.vue @@ -0,0 +1,108 @@ + + + + + \ No newline at end of file diff --git a/web/src/store/session.js b/web/src/store/session.js index fa571082..3f2f9a0d 100644 --- a/web/src/store/session.js +++ b/web/src/store/session.js @@ -27,7 +27,7 @@ export function setSessionId(sessionId) { } export function getUserToken() { - return Storage.get(UserTokenKey) + return Storage.get(UserTokenKey) ?? "" } export function setUserToken(token) { diff --git a/web/src/views/Login.vue b/web/src/views/Login.vue index 8728cb20..3ac9a46f 100644 --- a/web/src/views/Login.vue +++ b/web/src/views/Login.vue @@ -32,13 +32,15 @@ 登录 - - 还没有账号? - 注册新账号 + + 注册新账号 + 重置密码 + + @@ -59,11 +61,13 @@ import {checkSession} from "@/action/session"; import {setUserToken} from "@/store/session"; import {validateMobile} from "@/utils/validate"; import {prevRoute} from "@/router"; +import ResetPass from "@/components/ResetPass.vue"; const router = useRouter(); const title = ref('ChatGPT-PLUS 用户登录'); const username = ref(process.env.VUE_APP_USER); const password = ref(process.env.VUE_APP_PASS); +const showResetPass = ref(false) checkSession().then(() => { if (isMobile()) {