diff --git a/CHANGELOG.md b/CHANGELOG.md index 77011921..0abf61b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ ## v4.1.3 * 功能优化:VIP 会员在进行任何操作都不扣减算力,以实现会员周卡月卡功能 -* 功能优化:登录注册页面可以自定义是否启用行为验证码功能 +* 功能优化:重构用户登录模块,给所有的登录组件增加行为验证码功能,支持用户绑定手机,邮箱和微信 +* 功能优化:重构找回密码模块,支持通过手机或者邮箱找回密码 * 功能优化:管理后台给可以拖动排序的组件添加拖动图标 * 功能新增:支持 Luma 文生视频功能 diff --git a/api/handler/user_handler.go b/api/handler/user_handler.go index de96c80e..42ebd8c3 100644 --- a/api/handler/user_handler.go +++ b/api/handler/user_handler.go @@ -562,7 +562,9 @@ func (h *UserHandler) UpdatePass(c *gin.Context) { // ResetPass 找回密码 func (h *UserHandler) ResetPass(c *gin.Context) { var data struct { - Username string `json:"username"` + Type string `json:"type"` // 验证类别:mobile, email + Mobile string `json:"mobile"` // 手机号 + Email string `json:"email"` // 邮箱地址 Code string `json:"code"` // 验证码 Password string `json:"password"` // 新密码 } @@ -571,26 +573,36 @@ func (h *UserHandler) ResetPass(c *gin.Context) { return } + session := h.DB.Session(&gorm.Session{}) + var key string + if data.Type == "email" { + session = session.Where("email", data.Email) + key = CodeStorePrefix + data.Email + } else if data.Type == "mobile" { + session = session.Where("mobile", data.Email) + key = CodeStorePrefix + data.Mobile + } else { + resp.ERROR(c, "验证类别错误") + return + } var user model.User - res := h.DB.Where("username", data.Username).First(&user) - if res.Error != nil { + err := session.First(&user).Error + if err != nil { resp.ERROR(c, "用户不存在!") return } // 检查验证码 - key := CodeStorePrefix + data.Username code, err := h.redis.Get(c, key).Result() if err != nil || code != data.Code { - resp.ERROR(c, "短信验证码错误") + 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) + err = h.DB.Model(&user).UpdateColumn("password", password).Error + if err != nil { + resp.ERROR(c, err.Error()) } else { h.redis.Del(c, key) resp.SUCCESS(c) diff --git a/web/src/components/ResetPass.vue b/web/src/components/ResetPass.vue index 0f6f9c4f..2dfe70e8 100644 --- a/web/src/components/ResetPass.vue +++ b/web/src/components/ResetPass.vue @@ -6,27 +6,44 @@ width="540px" :before-close="close" :title="title" + class="reset-pass-dialog" >
- - - - - -
- - -
- - + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + - - -
@@ -65,7 +82,9 @@ const showDialog = computed(() => { const title = ref('重置密码') const form = ref({ - username: '', + mobile: '', + email: '', + type: 'mobile', code: '', password: '', repass: '' @@ -74,12 +93,12 @@ const form = ref({ const emits = defineEmits(['hide']); const save = () => { - if (!validateMobile(form.value.username) && !validateEmail(form.value.username)) { - return ElMessage.error("请输入正确的手机号码/邮箱地址"); - } if (form.value.code === '') { return ElMessage.error("请输入验证码"); } + if (form.value.password.length < 8) { + return ElMessage.error("密码长度必须大于8位"); + } if (form.value.repass !== form.value.password) { return ElMessage.error("两次输入密码不一致"); } @@ -101,15 +120,24 @@ const close = function () {