一、基本流程

【登录界面】 --> 【点击忘记密码】 --> 【输入个人邮箱和验证码】 --> 【系统发送邮箱验证】 --> 【用户在限定时间内登录邮箱,查收验证码】 -->【完成身份验证,进入重置密码界面】-->【重置密码,系统更新密码】--> 【重置密码完毕,点击进入登录界面】。

由于我们默认采用BUAA的邮箱进行身份验证,故在身份验证界面输入学号,系统会向该学号相应的北航邮箱发送验证码信息。

二、主要界面

1、登陆界面

  • 【忘记密码】【还没有账号?点击注册】如何分别在一行的两端显示?

    可以使用浮动float。

    <div class="tips"  style="float:left;">
    <el-link type="white" @click="retrievePWD">忘记密码</el-link>
    </div>
    <div class="tips" style="float:right;">
    <el-link type="white" @click="regis">还没有账号?点击注册</el-link> </div>
  • 点击【忘记密码】页面跳转

    retrievePWD(){
    this.$router.push({ path: '/retrievePassword' })
    }

2、找回密码界面

找回密码界面我使用了vuetify的步骤条组件,分为三个步骤,框架如下:

	<v-stepper v-model="e1">
<v-stepper-header>
<v-stepper-step :complete="e1 > 1" step="1">身份验证</v-stepper-step>
<v-divider></v-divider>
<v-stepper-step :complete="e1 > 2" step="2">密码重置</v-stepper-step>
<v-divider></v-divider>
<v-stepper-step step="3">重置完成</v-stepper-step>
</v-stepper-header> <v-stepper-items>
<v-stepper-content step="1">
<!-- 步骤一的内容-->
</v-stepper-content> <v-stepper-content step="2">
<!-- 步骤二的内容-->
</v-stepper-content> <v-stepper-content step="3">
<!-- 步骤三的内容-->
</v-stepper-content>
</v-stepper-items>
</v-stepper>

2.1 身份验证界面

基本逻辑为:

【输入学号】-->【点击获取邮箱验证码】(校验学号格式是否正确;若正确,则后端判断该学号是否已注册。只有已注册的学号,系统才会发送邮箱验证码,否则显示错误信息)-->【前往邮箱,查收验证码并输入】-->【点击下一步】(向后端提交学号和验证码,后端判断是否匹配,若匹配则身份验证成功,进入重置密码页面,否则显示错误信息)

  • element_ui表单验证如何只让它验证其中一项?

    // form为表单名字并ref="form"; prop 换成你想监听的prop字段
    this.$refs.form.validateField(prop, (errMsg) => {
    if (errMsg) {
    console.log('校验失败')
    }else{
    //...
    }
    })
  • 【获取邮箱验证码】按钮的实现

    该按钮具有倒计时功能,具体实现如下:

    //msg绑定了按钮显示的内容 利用了vue的双向绑定原理
    <el-button plain :disabled="flag" @click="getAuthCode">{{ msg }}</el-button>
    getAuthCode(){
    //对输入的学号格式进行校验
    this.$refs.form1.validateField('uid', (errMsg) => {
    if (errMsg) {
    console.log('学号校验未通过')
    }else {
    var postData={
    uid:this.form1.uid
    }
    //后端先判断该学号是否存在,再给北航邮箱发送验证码
    sendAuthCode(postData).then(res => {
    //获取验证码按钮倒计时功能的实现
    const _this =this;//!!坑!setInterval中的this指向问题
    this.flag = true; //!按钮不可重复点击
    var time = 150;//定义时间变量 150s
    var timer = null;//定义定时器
    timer = setInterval(function(){
    if(time==0){
    _this.msg="重新获取验证码";
    _this.flag=false;
    clearInterval(timer);//清除定时器
    }else{
    _this.msg=time+"秒后重新获取";
    time--;
    }
    },1000)
    }).catch(error => {
    console.log(error)
    })
    }
    })
    },

    这里有几个特别需要注意的地方(踩过的坑,大家小心!):

    • 为了避免迅速点击按钮多次发送验证码的情况,需在点击按钮后,将按钮设置为disabled属性。

    • js代码会从上到下执行,但是当遇到异步的情况,如axios请求时,并不会等拿到请求结果再做之后的操作,如果这时需要用到请求结果,则会出现错误,一般采用回调函数的方式解决。将需要请求数据的方法放在axios请求的回调函数中,待请求执行完成再做操作。

    • setInterval ()中的this指向的是window中的对象,而非vue对象,这导致我一开始无法正确渲染msg的内容。故此处的解决办法是,将当前对象的this存为另一个变量_this,在setInterval()中进行指代。

      详见博客 关于setInterval和setTImeout中的this指向问题

2.2 重置密码界面

在通过身份验证之后,后端会返回pub_keykey_id等信息用于密码的加密传输和身份匹配。这里不做介绍,详见该项目的其他技术博客。

基本逻辑:

【输入两次密码】-->【点击下一步】(校验密码是否一致,若一致则将密码加密传给后端,否则显示错误信息)-->【后端更新密码】

  • 校验规则

    var validatePass = (rule, value, callback) => {
    if (value === '') {
    callback(new Error('请输入密码'));
    } else {
    if (this.form2.checkPass !== '') {
    this.$refs.form2.validateField('checkPass');
    }
    callback();
    }
    };
    var validatePass2 = (rule, value, callback) => {
    if (value === '') {
    callback(new Error('请再次输入密码'));
    } else if (value !== this.form2.password) {
    callback(new Error('两次输入密码不一致!'));
    } else {
    callback();
    }
    }; rules2:{
    password: [
    { require: true, validator: validatePass, trigger: 'blur' }
    ],
    checkPass: [
    { validator: validatePass2, trigger: 'blur' }
    ],
    },
  • 前后端交互

    nextStep2(formName){
    console.log(formName);
    this.$refs[formName].validate((valid) => {
    if (valid) {
    var submitForm = {
    uid:this.uid,
    password: this.encryptPWD(this.form2.password), //传回加密后的密码
    }
    console.log(submitForm)
    //与后端交互
    resetPWD(submitForm).then(res => {
    this.e1=3;//进入下一步骤【重置完成】
    }).catch(error => {
    console.log(error)
    })
    } else {
    return false;
    }
    }) }

2.3 重置完成

  • 【重新登陆】按钮
<div  class="text-center">
<v-btn color="primary" @click="login" >重新登录</v-btn>
</div> login() {
this.$router.push({ path: '/login' })
},

【技术博客】忘记密码界面的Vue前端实现的更多相关文章

  1. web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址

    web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址   Huang Jie Blog .Com-前端开发 http://www.huangjieblog.com/?feed=rs ...

  2. 转: BAT等研发团队的技术博客

    BAT 技术团队博客   1. 美团技术团队博客:  地址: http://tech.meituan.com/ 2. 腾讯社交用户体验设计(ISUX) 地址:http://isux.tencent.c ...

  3. [技术博客] 敏捷软工——JavaScript踩坑记

    [技术博客] 敏捷软工--JavaScript踩坑记 一.一个令人影响深刻的坑 1.脚本语言的面向对象 面向对象特性是现代编程语言的基本特性,JavaScript中当然集成了面向对象特性.但是Java ...

  4. [福大软工] Z班——个人技术博客评分

    个人技术博客 作业地址 https://edu.cnblogs.com/campus/fzu/SoftwareEngineering2015/homework/1070 作业要求 个人技术博客单次作业 ...

  5. 个人技术博客(α)------javaweb的学习路程

    该博文大致内容是学习的一个过程,心得,并不是以技术博客为主,在此说明. 关于javaweb的学习开始的时间大概是从大二下(2017年6.7月份)的暑假开始的,在学长的介绍下加入了实验室进行学习,由于是 ...

  6. [技术博客]使用CDN加快网站访问速度

    [技术博客]使用CDN加快网站访问速度 2s : most users are willing to wait 10s : the limit for keeping the user's atten ...

  7. [技术博客]采用Bootstrap框架进行排版布局

    [技术博客]采用Bootstrap框架进行排版布局 网页的前端框架有很多很多种,比如Bootstrap.Vue.Angular等等,在最开始其实并没有考虑到框架这回事,开始阅读往届代码时发现其部分采用 ...

  8. [技术博客]iview组件样式踩坑记录

    [技术博客]iview组件样式踩坑记录 iview官方文档. 在本次项目开发中,前端项目主要使用vue框架+iview组件构建,其中iview组件在使用过程中遇到了许多官方文档中没有明确说明或是很难注 ...

  9. 技术博客——微信小程序UI的设计与美化

    技术博客--微信小程序UI的设计与美化 在alpha阶段的开发过后,我们的小程序也上线了.看到自己努力之后的成果大家都很开心,但对比已有的表情包小程序,我们的界面还有很大的提升空间,许多的界面都是各个 ...

随机推荐

  1. Hznu_0j 1557

    题目链接:http://acm.hznu.edu.cn/OJ/problem.php?id=1557 题解:将两个数组分别升序和降序排序后,累加差的绝对值. Ac代码: #include<std ...

  2. 关于Handler同步屏障你可能不知道的问题

    前言 很高兴遇见你 ~ 关于handler的内容,基本每个android开发者都掌握了,网络中的优秀博客也非常多,我之前也写过一篇文章,读者感兴趣可以去看看:传送门. 这篇文章主要讲Handler中的 ...

  3. 下载微软pdb符号文件

    使用symchk.exe  逐层下载c:\windows\system32下的pdb文件 symchk /r c:\windows\system32 /s SRV*D:\mypdb\*http://m ...

  4. 11、Spring教程之声明式事务

    1.回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单元,这 ...

  5. sqli-labs系列——第三关

    less3 判断注入类型 这第三关有点意思,是一个带括号的数字型注入,这里需要闭合它的括号,之前遇到过很多这样的站,它的sql语句一般都是这样的: $sql = select * from user ...

  6. Java进阶专题(二十六) 将近2万字的Dubbo原理解析,彻底搞懂dubbo

    前言 ​ 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo.今天就从Dubbo的SPI机制.服务注册与发现源码及网络通信过程去深入剖析下Dubbo. Dubbo架构 ...

  7. GoldenEye靶机work_through暨CVE-2013-3630复现

    前言 备考OSCP,所以接下来会做一系列的OSCP向靶机来练手 靶机描述 I recently got done creating an OSCP type vulnerable machine th ...

  8. Centos7安装maven详情以及配置

    一.maven安装: 1.获取maven下载地址: 查询maven最新版本地址:https://maven.apache.org/download.cgi 当前最新版本为maven 3.6.3    ...

  9. 热更新语言--lua学习笔记

    一.lua安装和编程环境搭建 lua语言可以在官网:http://luadist.org/下载安装包安装,编程IDE之前学习使用的是SciTE(https://www.cnblogs.com/movi ...

  10. SpringCloud(六)分布式事务

    在分布式系统中,分布式事务基本上是绕不开的, 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上 .其实就可以简单理解成在分布式系统中实现事务 ...