refactor reset password functions

This commit is contained in:
RockYang 2024-08-19 12:05:00 +08:00
parent 2499bd9ad3
commit 08379c21ac
6 changed files with 82 additions and 41 deletions

View File

@ -2,7 +2,8 @@
## v4.1.3
* 功能优化VIP 会员在进行任何操作都不扣减算力,以实现会员周卡月卡功能
* 功能优化:登录注册页面可以自定义是否启用行为验证码功能
* 功能优化:重构用户登录模块,给所有的登录组件增加行为验证码功能,支持用户绑定手机,邮箱和微信
* 功能优化:重构找回密码模块,支持通过手机或者邮箱找回密码
* 功能优化:管理后台给可以拖动排序的组件添加拖动图标
* 功能新增:支持 Luma 文生视频功能

View File

@ -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)

View File

@ -6,27 +6,44 @@
width="540px"
:before-close="close"
:title="title"
class="reset-pass-dialog"
>
<div class="form">
<el-form :model="form" label-width="80px" label-position="left">
<el-form-item label="手机号">
<el-input v-model="form.username" placeholder="手机号"/>
</el-form-item>
<el-form-item label="验证码">
<div class="code-box">
<el-input v-model="form.code" maxlength="6"/>
<send-msg size="" :receiver="form.username" type="mobile"/>
</div>
<el-row :gutter="20">
<el-col :span="12">
<el-tabs v-model="form.type" class="demo-tabs">
<el-tab-pane label="手机号验证" name="mobile">
<el-form-item label="手机号">
<el-input v-model="form.mobile" placeholder="请输入手机号"/>
</el-form-item>
<el-form-item label="验证码">
<el-row class="code-row">
<el-col :span="16">
<el-input v-model="form.code" maxlength="6"/>
</el-col>
<el-col :span="8" class="send-button">
<send-msg size="" :receiver="form.mobile" type="mobile"/>
</el-col>
</el-row>
</el-form-item>
</el-col>
<el-col :span="12" style="justify-content: right">
</el-tab-pane>
<el-tab-pane label="邮箱验证" name="email">
<el-form-item label="邮箱地址">
<el-input v-model="form.email" placeholder="请输入邮箱地址"/>
</el-form-item>
<el-form-item label="验证码">
<el-row class="code-row">
<el-col :span="16">
<el-input v-model="form.code" maxlength="6"/>
</el-col>
<el-col :span="8" class="send-button">
<send-msg size="" :receiver="form.email" type="email"/>
</el-col>
</el-row>
</el-form-item>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="新密码">
<el-input v-model="form.password" type="password"/>
</el-form-item>
@ -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 () {
<style lang="stylus">
.reset-pass {
.form {
padding 10px 20px
padding 0 20px
}
.code-box {
display: flex;
justify-content: space-between;
width: 100%
.code-row {
width 100%
.send-button {
padding-left 10px
}
}
.el-dialog__footer {
text-align center
.reset-pass-dialog {
.el-dialog__footer {
text-align center
padding-top 0
}
.el-dialog__body {
padding 0
}
}
}

View File

@ -48,7 +48,7 @@
<el-divider class="divider">其他登录方式</el-divider>
<div class="clogin">
<a :href="wechatLoginURL"><i class="iconfont icon-wechat"></i></a>
<a :href="wechatLoginURL" @click="setRoute(router.currentRoute.value.path)"><i class="iconfont icon-wechat"></i></a>
</div>
</div>
</div>
@ -77,6 +77,7 @@ import ResetPass from "@/components/ResetPass.vue";
import {showMessageError} from "@/utils/dialog";
import Captcha from "@/components/Captcha.vue";
import QRCode from "qrcode";
import {setRoute} from "@/store/system";
const router = useRouter();
const title = ref('Geek-AI');

View File

@ -160,7 +160,7 @@ import {httpGet, httpPost} from "@/utils/http";
import Compressor from 'compressorjs';
import {dateFormat, isWeChatBrowser, showLoginDialog} from "@/utils/libs";
import {ElMessage} from "element-plus";
import {checkSession} from "@/store/cache";
import {checkSession, getSystemInfo} from "@/store/cache";
import {useRouter} from "vue-router";
import {removeUserToken} from "@/store/session";
import bus from '@/store/eventbus'

View File

@ -165,7 +165,7 @@ import {onMounted, onUnmounted, ref} from "vue"
import {Delete} from "@element-plus/icons-vue";
import {httpGet, httpPost} from "@/utils/http";
import Clipboard from "clipboard";
import {checkSession} from "@/store/cache";
import {checkSession, getSystemInfo} from "@/store/cache";
import {useRouter} from "vue-router";
import {getSessionId} from "@/store/session";
import {
@ -183,7 +183,6 @@ const listBoxHeight = ref(window.innerHeight - 40)
const mjBoxHeight = ref(window.innerHeight - 150)
const item = ref({})
const isLogin = ref(false)
const activeColspan = ref([""])
window.onresize = () => {
listBoxHeight.value = window.innerHeight - 40