mirror of
				https://github.com/yangjian102621/geekai.git
				synced 2025-11-04 08:13:43 +08:00 
			
		
		
		
	refactor reset password functions
This commit is contained in:
		@@ -2,7 +2,8 @@
 | 
			
		||||
 | 
			
		||||
## v4.1.3
 | 
			
		||||
* 功能优化:VIP 会员在进行任何操作都不扣减算力,以实现会员周卡月卡功能
 | 
			
		||||
* 功能优化:登录注册页面可以自定义是否启用行为验证码功能
 | 
			
		||||
* 功能优化:重构用户登录模块,给所有的登录组件增加行为验证码功能,支持用户绑定手机,邮箱和微信
 | 
			
		||||
* 功能优化:重构找回密码模块,支持通过手机或者邮箱找回密码
 | 
			
		||||
* 功能优化:管理后台给可以拖动排序的组件添加拖动图标
 | 
			
		||||
* 功能新增:支持 Luma 文生视频功能
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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');
 | 
			
		||||
 
 | 
			
		||||
@@ -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'
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user