Ver código fonte

忘记密码

natasha 1 ano atrás
pai
commit
b6c3e82666
3 arquivos alterados com 382 adições e 6 exclusões
  1. BIN
      src/assets/mail-check-line.png
  2. 363 0
      src/views/forgotPwd.vue
  3. 19 6
      src/views/login.vue

BIN
src/assets/mail-check-line.png


+ 363 - 0
src/views/forgotPwd.vue

@@ -0,0 +1,363 @@
+<template>
+  <div class="forgot-container">
+    <h2 class="title-big">找回密码</h2>
+        <el-form label-position="top" label-width="80px" ref="loginCodeForm" :model="loginCodeForm" class="form" :hide-required-asterisk="true" :rules="rulesCode" v-if="stepIndex===0">
+            <el-form-item label="手机号" prop="phone">
+                <el-input v-model="loginCodeForm.phone" autocomplete="off" placeholder="请输入完整手机号" @blur="handleTrim('loginCodeForm','phone')" >
+                    <template slot="prepend">+86</template>
+                </el-input>
+            </el-form-item>
+            <el-form-item label="验证码" prop="code" class="code-box">
+                <el-input v-model="loginCodeForm.code" autocomplete="off" placeholder="请输入验证码" class="code-input" @blur="handleTrim('loginCodeForm','code')" @input="handeleInput">
+                </el-input>
+                <el-button type="primary" @click="sendCode('time','phone','verificationCodeShow')" size="small" class="sendCode" @input="handeleInput">
+                    {{ verificationCodeShow ? time+'s' : '发送验证码' }}
+                </el-button>
+            </el-form-item>
+            <el-form-item class="btn-box">
+                <el-button type="primary" @click="onSubmitPassword('loginCodeForm')" size="small" :disabled="submitDis" :loading="loading">下一步</el-button>
+                <el-button @click="onCancel('loginCodeForm')" size="small">取消</el-button>
+            </el-form-item>
+        </el-form>
+        <div v-else class="result-box">
+            <img src="../assets/mail-check-line.png" />
+            <p>密码已通过短信发送至您的手机中,请注意查收。</p>
+            <div class="btn-box">
+                <el-button type="primary" @click="onCancel('loginCodeForm')" size="small">确定</el-button>
+            </div>
+        </div>
+  </div>
+</template>
+
+<script>
+import { getLogin } from "@/api/ajax";
+import { setToken } from "@/utils/auth";
+export default {
+  name: "forgotPwd",
+  props: [],
+  data() {
+    const validatePhone = (rule, value, callback) => {
+        if (value === '') {
+            callback(new Error('请输入手机号'));
+        } else {
+            let reg = /^1[3-9]\d{9}$/;
+            let result = reg.test(value);
+            if (result) {
+                callback();
+            } else {
+                callback(new Error('请输入正确的手机号'));
+            }
+        }
+    };
+    return {
+        loginCodeForm:{
+            phone:'',
+            code:''
+        },
+        rulesCode:{
+            phone:[
+                { required: true, validator: validatePhone, trigger: 'blur' }
+            ],
+            code:[
+                { required: true, message: '请输入验证码', trigger: 'blur' }
+            ]
+        },
+        time: 60, //获取验证码的时间
+        verificationCodeShow: false, //是否已经获取了验证码
+        loading: false,
+        timer: null,
+        submitDis: true,
+        stepIndex: 0
+    };
+  },
+  watch: {
+    
+  },
+  methods: {
+    // 密码登录提交表单
+    onSubmitPassword(formName){
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            let MethodName = "/OrgServer/LoginControl/Login";
+            let data = null
+            if(this.tabsIndex===0){
+                data = {
+                    user_type:this.loginPwdForm.type,
+                    user_name:this.loginPwdForm.userName,
+                    password:this.loginPwdForm.password
+                }
+            }else{
+                data = {
+                    user_type:this.loginCodeForm.type,
+                    user_name:this.loginCodeForm.phone,
+                    password:this.loginCodeForm.code,
+                    is_dynamic_verification_code_login:"true",
+                    dynamic_verification_send_type:"SMS"
+                }
+            }
+            getLogin(MethodName, data)
+            .then((res) => {
+                this.loading = false
+                this.stepIndex++
+            })
+            .catch(() => {
+                this.loading = false
+                this.verificationCodeShow = false;
+                clearInterval(this.timer);
+                this.time = 60;
+            });
+          } else {
+            return false;
+          }
+        });
+    },
+    // 取消 恢复到修改前状态
+    onCancel(formName){
+        this.$emit('cancelFot')
+    },
+    // 发送验证码
+    sendCode(time,phone,flag,obj){
+        let this_ = this;
+        if(this_[time] != 60){
+            return
+        }
+        this_.timer = null;
+        if (this_.loginCodeForm[phone]) {
+            let reg = /^1[3-9]\d{9}$/;
+            let result = reg.test(this_.loginCodeForm[phone]);
+            if (!result) {
+                this_.$message.warning('请输入正确的手机号');
+                return
+            }
+            this_[flag] = true;
+            this_.timer = setInterval(() => {
+                this_[time]--;
+                if (this_[time] == 0) {
+                    this_[flag] = false;
+                    clearInterval(this_.timer);
+                    this_.timer = null;
+                    this_[time] = 60;
+                }
+            }, 1000);
+            let MethodName = "/OrgServer/LoginControl/SendVerificationCode";
+            let data = {
+                send_type: 'SMS',
+                phone_or_email: this_.loginCodeForm.phone,
+            };
+            getLogin(MethodName, data).then((res) => {
+            }).catch(()=>{
+                this_[flag] = false;
+                clearInterval(this_.timer);
+                this_.timer = null;
+                this_[time] = 60;
+            });
+        } else {
+            this_.$message.warning('请先输入手机号');
+        }
+    },
+    // 去掉前后空格
+    handleTrim(form,fild){
+        this[form][fild] = this[form][fild].trim()
+    },
+    handeleInput(){
+        if(this.loginCodeForm.phone&&this.loginCodeForm.code){
+            this.submitDis = false
+        }else{
+            this.submitDis = true
+        }
+    }
+  },
+  mounted() {
+    
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.forgot-container{
+    background: #FFFFFF;
+    padding: 64px 72px;
+    .title-big{
+        font-weight: 400;
+        font-size: 32px;
+        line-height: 40px;
+        margin: 0;
+        color: #1D2129;
+    }
+    .title-name{
+        font-size: 14px;
+        line-height: 22px;
+        color: #86909C;
+        margin: 0 0 40px 0;
+    }
+    .tabs-box{
+        display: flex;
+        a{
+            font-size: 14px;
+            line-height: 22px;
+            color: #4E5969;
+            border-radius: 100px;
+            padding: 5px 16px;
+            margin-right: 16px;
+            &:hover{
+                background: #F2F3F5;
+            }
+            &.active{
+                background: #F2F3F5;
+                font-weight: 500;
+                color: #165DFF;
+            }
+        }
+    }
+    .form{
+        margin-top: 40px;
+        .show-icon{
+            cursor: pointer;
+            color: #4E5969;
+        }
+        .forgotPwd{
+            font-size: 14px;
+            line-height: 22px;
+            color: #165DFF;
+        }
+    }
+}
+.result-box{
+    text-align: center;
+    padding-top: 46px;
+    img{
+        width: 64px;
+    }
+    p{
+        width: 260px;
+        color: #000;
+        font-size: 16px;
+        font-weight: 400;
+        line-height: 24px; 
+        margin: 16px auto 62px auto;
+    }
+    .el-button{
+        width: 100%;
+    }
+}
+</style>
+<style lang="scss">
+.forgot-container{
+    .form{
+        .el-form-item__label{
+            font-weight: 400;
+            font-size: 14px;
+            line-height: 22px;
+            color: #4E5969;
+            padding-bottom: 8px;
+        }
+        .userAgree-box{
+            .el-form-item__content{
+                display: flex;
+                justify-content: space-between;
+                line-height: 22px;
+            }
+            .el-checkbox-group{
+                flex: 1;
+                .el-checkbox{
+                    color: rgba(0, 0, 0, 0.88);
+                    font-weight: 400;
+                }
+            }
+        }
+        .btn-box{
+            .el-button{
+                width: 100%;
+            }
+            .el-button+.el-button{
+                margin-left: 0;
+                margin-top: 8px;
+            }
+        }
+        .el-button--primary{
+            background: #165DFF;
+            border-color: #165DFF;
+            border-radius: 2px;
+            &:hover{
+                background: #4080FF;
+                border-color: #4080FF;
+            }
+            &:focus{
+                background: #0E42D2;
+                border-color: #0E42D2;
+            }
+        }
+        .el-button--default{
+            background: #F2F3F5;
+            border-radius: 2px;
+            border: none;
+            color: #4E5969;
+            &:hover{
+                background: #E5E6EB;
+            }
+            &:focus{
+                background: #C9CDD4;
+            }
+        }
+        .code-box{
+            .el-form-item__content{
+                display: flex;
+            }
+        }
+        .code-input{
+            height: 32px;
+            .el-input__inner{
+                border-radius: 4px 0 0 4px;
+            }
+        }
+        .sendCode{
+            border-radius: 0 4px 4px 0;
+            margin-top: 1px;
+            width: 92px;
+            flex-shrink: 0;
+        }
+        .el-form-item__content,.el-input__icon{
+            line-height: 32px;
+            color: #4E5969 !important;
+        }
+        .el-input__inner{
+            height: 32px;
+            color: #1D2129;
+            background: #F2F3F5;
+            border: none;
+        }
+        .el-textarea__inner,.el-input-group__prepend{
+            color: #1D2129;
+        }
+        .el-checkbox__input.is-checked+.el-checkbox__label{
+            color: #165DFF;
+        }
+        .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner{
+            background: #165DFF;
+            border-color: #165DFF;
+        }
+        .el-input-group__prepend{
+            width: 54px;
+            height: 32px;
+            border: none;
+            background: #F2F3F5;
+            border-radius: 2px 0px 0px 2px;
+            line-height: 32px;
+            text-align: center;
+            padding: 0;
+        }
+        .el-input-group--prepend{
+            display: flex;
+            .el-input__inner{
+                margin-left: 8px;
+                flex: 1;
+            }
+        }
+    }
+    .el-button--primary.is-disabled, .el-button--primary.is-disabled:active, .el-button--primary.is-disabled:focus, .el-button--primary.is-disabled:hover{
+        background-color: #a0cfff;
+        border-color: #a0cfff;
+    }
+}
+</style>

+ 19 - 6
src/views/login.vue

@@ -1,5 +1,6 @@
 <template>
-  <div class="login-container">
+  <div>
+  <div class="login-container"  v-if="!forgotPwdFlag">
     <h2 class="title-big">登录</h2>
     <p class="title-name">欢迎来到二十一世纪英语智慧阅读平台</p>
     <div class="tabs-box">
@@ -24,7 +25,7 @@
                 <el-checkbox-group v-model="loginPwdForm.userAgreeCheck">
                     <el-checkbox label="1" name="userAgreeCheck"><a @click.prevent="lookUserAgreement">阅读并同意《用户协议》</a></el-checkbox>
                 </el-checkbox-group>
-                <a class="forgotPwd">忘记密码?</a>
+                <a class="forgotPwd" @click="forgotPwd">忘记密码?</a>
             </el-form-item>
             <el-form-item class="btn-box">
                 <el-button type="primary" @click="onSubmitPassword('loginPwdForm')" size="small" :loading="loading">登录</el-button>
@@ -50,7 +51,7 @@
                 <el-checkbox-group v-model="loginCodeForm.userAgreeCheck">
                     <el-checkbox label="1" name="userAgreeCheck"><a @click.prevent="lookUserAgreement">阅读并同意《用户协议》</a></el-checkbox>
                 </el-checkbox-group>
-                <a class="forgotPwd">忘记密码?</a>
+                <a class="forgotPwd" @click="forgotPwd">忘记密码?</a>
             </el-form-item>
             <el-form-item class="btn-box">
                 <el-button type="primary" @click="onSubmitPassword('loginCodeForm')" size="small" :loading="loading">登录</el-button>
@@ -59,14 +60,18 @@
         </el-form>
     <!-- </template> -->
   </div>
+  <forgot-pwd @cancelFot="cancelFot" v-if="forgotPwdFlag"></forgot-pwd>
+  </div>
 </template>
 
 <script>
 import { getLogin } from "@/api/ajax";
 import { setToken } from "@/utils/auth";
+import ForgotPwd from "./forgotPwd.vue"
 export default {
-  name: "Login",
+  name: "login",
   props: ["toUrl"],
+  components: { ForgotPwd },
   data() {
     const validatePhone = (rule, value, callback) => {
         if(this.tabsIndex===1){
@@ -123,7 +128,8 @@ export default {
         time: 60, //获取验证码的时间
         verificationCodeShow: false, //是否已经获取了验证码
         loading: false,
-        timer: null
+        timer: null,
+        forgotPwdFlag: false
     };
   },
   watch: {
@@ -139,7 +145,7 @@ export default {
     },
     // 查看用户协议
     lookUserAgreement(){
-        debugger
+        
     },
     // 密码登录提交表单
     onSubmitPassword(formName){
@@ -234,6 +240,13 @@ export default {
     // 去掉前后空格
     handleTrim(form,fild){
         this[form][fild] = this[form][fild].trim()
+    },
+    // 忘记密码
+    forgotPwd(){
+        this.forgotPwdFlag = true
+    },
+    cancelFot(){
+        this.forgotPwdFlag = false
     }
   },
   mounted() {