mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-18 01:06:39 +08:00
refactor reset password functions
This commit is contained in:
parent
2499bd9ad3
commit
08379c21ac
@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
## v4.1.3
|
## v4.1.3
|
||||||
* 功能优化:VIP 会员在进行任何操作都不扣减算力,以实现会员周卡月卡功能
|
* 功能优化:VIP 会员在进行任何操作都不扣减算力,以实现会员周卡月卡功能
|
||||||
* 功能优化:登录注册页面可以自定义是否启用行为验证码功能
|
* 功能优化:重构用户登录模块,给所有的登录组件增加行为验证码功能,支持用户绑定手机,邮箱和微信
|
||||||
|
* 功能优化:重构找回密码模块,支持通过手机或者邮箱找回密码
|
||||||
* 功能优化:管理后台给可以拖动排序的组件添加拖动图标
|
* 功能优化:管理后台给可以拖动排序的组件添加拖动图标
|
||||||
* 功能新增:支持 Luma 文生视频功能
|
* 功能新增:支持 Luma 文生视频功能
|
||||||
|
|
||||||
|
@ -562,7 +562,9 @@ func (h *UserHandler) UpdatePass(c *gin.Context) {
|
|||||||
// ResetPass 找回密码
|
// ResetPass 找回密码
|
||||||
func (h *UserHandler) ResetPass(c *gin.Context) {
|
func (h *UserHandler) ResetPass(c *gin.Context) {
|
||||||
var data struct {
|
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"` // 验证码
|
Code string `json:"code"` // 验证码
|
||||||
Password string `json:"password"` // 新密码
|
Password string `json:"password"` // 新密码
|
||||||
}
|
}
|
||||||
@ -571,26 +573,36 @@ func (h *UserHandler) ResetPass(c *gin.Context) {
|
|||||||
return
|
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
|
var user model.User
|
||||||
res := h.DB.Where("username", data.Username).First(&user)
|
err := session.First(&user).Error
|
||||||
if res.Error != nil {
|
if err != nil {
|
||||||
resp.ERROR(c, "用户不存在!")
|
resp.ERROR(c, "用户不存在!")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查验证码
|
// 检查验证码
|
||||||
key := CodeStorePrefix + data.Username
|
|
||||||
code, err := h.redis.Get(c, key).Result()
|
code, err := h.redis.Get(c, key).Result()
|
||||||
if err != nil || code != data.Code {
|
if err != nil || code != data.Code {
|
||||||
resp.ERROR(c, "短信验证码错误")
|
resp.ERROR(c, "验证码错误")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
password := utils.GenPassword(data.Password, user.Salt)
|
password := utils.GenPassword(data.Password, user.Salt)
|
||||||
user.Password = password
|
err = h.DB.Model(&user).UpdateColumn("password", password).Error
|
||||||
res = h.DB.Updates(&user)
|
if err != nil {
|
||||||
if res.Error != nil {
|
resp.ERROR(c, err.Error())
|
||||||
resp.ERROR(c)
|
|
||||||
} else {
|
} else {
|
||||||
h.redis.Del(c, key)
|
h.redis.Del(c, key)
|
||||||
resp.SUCCESS(c)
|
resp.SUCCESS(c)
|
||||||
|
@ -6,27 +6,44 @@
|
|||||||
width="540px"
|
width="540px"
|
||||||
:before-close="close"
|
:before-close="close"
|
||||||
:title="title"
|
:title="title"
|
||||||
|
class="reset-pass-dialog"
|
||||||
>
|
>
|
||||||
<div class="form">
|
<div class="form">
|
||||||
|
|
||||||
<el-form :model="form" label-width="80px" label-position="left">
|
<el-form :model="form" label-width="80px" label-position="left">
|
||||||
|
<el-tabs v-model="form.type" class="demo-tabs">
|
||||||
|
<el-tab-pane label="手机号验证" name="mobile">
|
||||||
<el-form-item label="手机号">
|
<el-form-item label="手机号">
|
||||||
<el-input v-model="form.username" placeholder="手机号"/>
|
<el-input v-model="form.mobile" placeholder="请输入手机号"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="验证码">
|
<el-form-item label="验证码">
|
||||||
<div class="code-box">
|
<el-row class="code-row">
|
||||||
|
<el-col :span="16">
|
||||||
<el-input v-model="form.code" maxlength="6"/>
|
<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-col>
|
</el-col>
|
||||||
<el-col :span="12" style="justify-content: right">
|
<el-col :span="8" class="send-button">
|
||||||
|
<send-msg size="" :receiver="form.mobile" type="mobile"/>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
</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-form-item label="新密码">
|
<el-form-item label="新密码">
|
||||||
<el-input v-model="form.password" type="password"/>
|
<el-input v-model="form.password" type="password"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -65,7 +82,9 @@ const showDialog = computed(() => {
|
|||||||
|
|
||||||
const title = ref('重置密码')
|
const title = ref('重置密码')
|
||||||
const form = ref({
|
const form = ref({
|
||||||
username: '',
|
mobile: '',
|
||||||
|
email: '',
|
||||||
|
type: 'mobile',
|
||||||
code: '',
|
code: '',
|
||||||
password: '',
|
password: '',
|
||||||
repass: ''
|
repass: ''
|
||||||
@ -74,12 +93,12 @@ const form = ref({
|
|||||||
const emits = defineEmits(['hide']);
|
const emits = defineEmits(['hide']);
|
||||||
|
|
||||||
const save = () => {
|
const save = () => {
|
||||||
if (!validateMobile(form.value.username) && !validateEmail(form.value.username)) {
|
|
||||||
return ElMessage.error("请输入正确的手机号码/邮箱地址");
|
|
||||||
}
|
|
||||||
if (form.value.code === '') {
|
if (form.value.code === '') {
|
||||||
return ElMessage.error("请输入验证码");
|
return ElMessage.error("请输入验证码");
|
||||||
}
|
}
|
||||||
|
if (form.value.password.length < 8) {
|
||||||
|
return ElMessage.error("密码长度必须大于8位");
|
||||||
|
}
|
||||||
if (form.value.repass !== form.value.password) {
|
if (form.value.repass !== form.value.password) {
|
||||||
return ElMessage.error("两次输入密码不一致");
|
return ElMessage.error("两次输入密码不一致");
|
||||||
}
|
}
|
||||||
@ -101,15 +120,24 @@ const close = function () {
|
|||||||
<style lang="stylus">
|
<style lang="stylus">
|
||||||
.reset-pass {
|
.reset-pass {
|
||||||
.form {
|
.form {
|
||||||
padding 10px 20px
|
padding 0 20px
|
||||||
}
|
}
|
||||||
.code-box {
|
|
||||||
display: flex;
|
.code-row {
|
||||||
justify-content: space-between;
|
width 100%
|
||||||
width: 100%
|
.send-button {
|
||||||
|
padding-left 10px
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.reset-pass-dialog {
|
||||||
.el-dialog__footer {
|
.el-dialog__footer {
|
||||||
text-align center
|
text-align center
|
||||||
|
padding-top 0
|
||||||
|
}
|
||||||
|
.el-dialog__body {
|
||||||
|
padding 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
<el-divider class="divider">其他登录方式</el-divider>
|
<el-divider class="divider">其他登录方式</el-divider>
|
||||||
|
|
||||||
<div class="clogin">
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -77,6 +77,7 @@ import ResetPass from "@/components/ResetPass.vue";
|
|||||||
import {showMessageError} from "@/utils/dialog";
|
import {showMessageError} from "@/utils/dialog";
|
||||||
import Captcha from "@/components/Captcha.vue";
|
import Captcha from "@/components/Captcha.vue";
|
||||||
import QRCode from "qrcode";
|
import QRCode from "qrcode";
|
||||||
|
import {setRoute} from "@/store/system";
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const title = ref('Geek-AI');
|
const title = ref('Geek-AI');
|
||||||
|
@ -160,7 +160,7 @@ import {httpGet, httpPost} from "@/utils/http";
|
|||||||
import Compressor from 'compressorjs';
|
import Compressor from 'compressorjs';
|
||||||
import {dateFormat, isWeChatBrowser, showLoginDialog} from "@/utils/libs";
|
import {dateFormat, isWeChatBrowser, showLoginDialog} from "@/utils/libs";
|
||||||
import {ElMessage} from "element-plus";
|
import {ElMessage} from "element-plus";
|
||||||
import {checkSession} from "@/store/cache";
|
import {checkSession, getSystemInfo} from "@/store/cache";
|
||||||
import {useRouter} from "vue-router";
|
import {useRouter} from "vue-router";
|
||||||
import {removeUserToken} from "@/store/session";
|
import {removeUserToken} from "@/store/session";
|
||||||
import bus from '@/store/eventbus'
|
import bus from '@/store/eventbus'
|
||||||
|
@ -165,7 +165,7 @@ import {onMounted, onUnmounted, ref} from "vue"
|
|||||||
import {Delete} from "@element-plus/icons-vue";
|
import {Delete} from "@element-plus/icons-vue";
|
||||||
import {httpGet, httpPost} from "@/utils/http";
|
import {httpGet, httpPost} from "@/utils/http";
|
||||||
import Clipboard from "clipboard";
|
import Clipboard from "clipboard";
|
||||||
import {checkSession} from "@/store/cache";
|
import {checkSession, getSystemInfo} from "@/store/cache";
|
||||||
import {useRouter} from "vue-router";
|
import {useRouter} from "vue-router";
|
||||||
import {getSessionId} from "@/store/session";
|
import {getSessionId} from "@/store/session";
|
||||||
import {
|
import {
|
||||||
@ -183,7 +183,6 @@ const listBoxHeight = ref(window.innerHeight - 40)
|
|||||||
const mjBoxHeight = ref(window.innerHeight - 150)
|
const mjBoxHeight = ref(window.innerHeight - 150)
|
||||||
const item = ref({})
|
const item = ref({})
|
||||||
const isLogin = ref(false)
|
const isLogin = ref(false)
|
||||||
const activeColspan = ref([""])
|
|
||||||
|
|
||||||
window.onresize = () => {
|
window.onresize = () => {
|
||||||
listBoxHeight.value = window.innerHeight - 40
|
listBoxHeight.value = window.innerHeight - 40
|
||||||
|
Loading…
Reference in New Issue
Block a user