Vue3问题:如何实现拼图验证+邮箱登录功能?前后端!

前端功能问题系列文章,点击上方合集↑

序言

大家好,我是大澈!

本文约3500+字,整篇阅读大约需要5分钟。

本文主要内容分三部分,第一部分是需求分析,第二部分是实现步骤,第三部分是问题详解。

如果您只需要解决问题,请阅读第一、二部分即可。

如果您有更多时间,进一步学习问题相关知识点,请阅读至第三部分。

1. 需求分析

在登录页面,输入邮箱,点击发送验证码,此时会弹出拼图验证。

用户向右滑动滑块,到达指定缺口位置,就会验证成功。若验证失败,则会刷新拼图,需要重新滑动。

当拼图验证成功后,发送验证码按钮就会显示数字倒计时效果,然后此时会在对应邮箱收到验证码。

在正确输入邮箱验证码之后,点击登录按钮,正确认证并登录成功。

挺常用、也挺有趣的一个功能需求。

图片

2. 实现步骤

2.1 实现前的一些说明

本次需求大致分为部分:点击发送验证码按钮时的拼图验证、常用的邮箱验证码发送。

实现的话,我们会从前端、后端两方面入手,然后给出具体代码实例。

拼图验证在前端实现,利用了vue3-slide-verify库。

邮箱验证码发送在后端实现,利用了Spring框架中的JavaMailSender类,然后邮件发送服务使用的是QQ邮箱。

关于QQ邮箱,在编写后端接口前,一定要记得提前做一些配置

  • 先在QQ邮箱首页-设置-账号-服务中,把服务全部开启。

  • 然后再扫码登录,获取授权码,一定要把这个授权码保存好,不然后面后端接口没法写了。

图片

话不多说,开搞朋友们!

2.2 编写前端代码

先安装功能依赖:

npm install --save vue3-slide-verify

再看模版代码,分为两部分:一个是表单部分,一个是拼图弹框部分。

在表单部分中,给发送验证码按钮一个点击事件,点击让拼图弹框显示。然后禁用此按钮,同时countdown变量开始倒计时递减变化。

在拼图弹框部分中,主要是定义了两个事件函数。fail是操作失败的回调,success是操作成功的回调。再就是slider-text中,定义的是滑块中显示的文字提示。

模版代码:

<template><div class="box"><!--表单部分--><el-form :model="dataForm" label-width="120px"><el-form-item label="邮箱:"><el-input v-model="dataForm.email" /></el-form-item><el-form-item label="验证码:"><el-input v-model="dataForm.code" /><el-button type="warning" @click="visible = true" :disabled="isSendingCode || countdown > 0">{{ countdown > 0 ? `重新发送(${countdown})` : '发送验证码' }}</el-button></el-form-item><el-form-item><el-button type="primary" @click="onSubmit" >登录</el-button></el-form-item></el-form><!--拼图部分--><el-card v-if="visible"><slide-verifyref="slide"slider-text="向右滑动->":imgs="images"@success="onSuccess"@fail="onFail"style="margin: auto;"></slide-verify></el-card></div>
</template>

再看逻辑代码,主要分为两部分:一个是拼图验证成功和失败的回调,一个是调用了发送邮箱验证码和认证登录这两个接口。

最先做的,是先引入拼图依赖的对象和样式。

拼图验证成功后,在里面去调用发送邮箱验证码的接口。

按钮倒计时效果,以及发送邮箱验证码、认证登录这两个接口的调用,此处不再赘述,可参考之前如何实现短信验证登录的那篇文章。

再就是,拼图的图片资源数组,可为空。如果数组为空,则会自动下载使用随机网络图片。

逻辑代码:

<script setup>
import {reactive, ref} from 'vue'
import Axios from '../api/axios';
import {ElMessage} from "element-plus";
// 引入依赖对象
import SlideVerify from "vue3-slide-verify";
// 引入依赖样式
import "vue3-slide-verify/dist/style.css";const dataForm = reactive({// 863074625@qq.comemail: '863074625@qq.com',code: '',
})// 拼图显示标识
const visible = ref(false);
// 拼图的图片资源 可为空,此时会自动下载使用随机网络图片
const images = reactive(['https://t7.baidu.com/it/u=2609096218,1652764947&fm=193&f=GIF','https://t7.baidu.com/it/u=2541348729,1193227634&fm=193&f=GIF','https://t7.baidu.com/it/u=2673836711,2234057813&fm=193&f=GIF',
])// 拼图验证成功回调
const onSuccess = () => {ElMessage.success("验证成功!");// 隐藏拼图visible.value = false;// 拼图验证成功,发送邮箱验证码sendVerificationCode();
}// 拼图验证失败回调
const onFail=()=>{ElMessage.error("验证不通过!")
}// 发送验证码按钮禁用标识
let isSendingCode = ref(false);
// 倒计时变量
let countdown = ref(0);// 发送验证码,调验证码接口
const sendVerificationCode = () => {// 检查邮箱是否有效// ...// 调发送邮箱接口Axios.get('/admin/sendEmail', {params: {email: dataForm.email,}}).then(res => {ElMessage.success(res.data)}).catch(error => {console.error(error);});isSendingCode.value = true;// 设置倒计时时间,这里假设为10秒countdown.value = 10;// 倒计时效果const countdownInterval = setInterval(() => {countdown.value--;if (countdown.value <= 0) {clearInterval(countdownInterval);isSendingCode.value = false;}}, 1000);
}// 登录,调检验验证码和密码的登录接口
const onSubmit = () => {// 调发送邮箱接口Axios.post('/admin/checkEmailLogin', {email: dataForm.email,code: dataForm.code,}).then(res => {ElMessage.success(res.data)}).catch(error => {console.error(error);});
}
</script>

关于vue3-slide-verify拼图库的属性和回调详细整理,如果朋友你有空余时间,可见文章第部分。

2.3 编写后端接口

对于后端实现,要先引入邮箱发送依赖,再做一些服务的配置,再编写两个接口,一个是发送邮箱验证码接口,一个是认证登录接口。

Pom.xml中引入依赖代码:

<!--redis-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 邮件发送pom支持 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

application.yml中写入QQ邮箱服务的配置,注意邮箱password,用的就是之前保存的授权码

spring:datasource:url: jdbc:mysql://localhost:3306/mall_tiny?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456redis:host: localhost # Redis服务器地址database: 0 # Redis数据库索引(默认为0)port: 6379 # Redis服务器连接端口password: # Redis服务器连接密码(默认为空)timeout: 3000ms # 连接超时时间(毫秒)# 发送邮箱mail:username: 317994054@qq.com# 授权码password: axpaqqxaejiecaaghost: smtp.qq.com

再编写接口Controller层代码:

/**
* 发送邮箱
*/
@ApiOperation(value = "发送邮箱")
@GetMapping("/sendEmail")
public CommonResult<String> toSendEmail(@RequestParam("email") String email){String message = adminService.toSendEmail(email);return CommonResult.success(message);
}/**
* 检验邮箱验证码,校验成功后登录
*/
@ApiOperation(value = "检验邮箱验证码,校验成功后登录")
@PostMapping("/checkEmailLogin")
public CommonResult<String> checkEmailLogin(@RequestBody ToCheckEmailLoginDTO toCheckEmailLoginDTO){String checkLogin = adminService.checkEmailLogin(toCheckEmailLoginDTO.getEmail(), toCheckEmailLoginDTO.getCode());// 省略用户密码加密校验// ...// 省略JWT认证// ...return CommonResult.success(checkLogin);
}

再编写接口Service层代码:

在发送邮箱验证码接口业务层中,先生成一个随字符串Code,再调用JavaMailSendersend方法发送验证码,并把验证码存入Redis中。

在认证登录接口业务层中,将前端传过来的验证码与Redis中存的验证码进行比较,校验成功执行下一步登录操作。

@Autowired
JavaMailSender javaMailSender;/**
* 发送邮箱
*/
@Override
public String toSendEmail(String email) {//1.判定验证码是否过期String code = redisTemplate.opsForValue().get(email);if (!StringUtils.isEmpty(code)){return email+":"+"验证码未过期";}//2.已过期/无验证码 生成验证码//随机生成字符串 做验证码int toCode = (int) (Math.random() * (50000 - 40000) + 40000);code=Integer.toString(toCode);// 发送邮箱SimpleMailMessage simpleMailMessage = new SimpleMailMessage();simpleMailMessage.setSubject("项目登录验证码");simpleMailMessage.setText("尊敬的:"+email+"您的注册校验验证码为:" + code + "有效期5分钟");simpleMailMessage.setTo(email);simpleMailMessage.setFrom("317994054@qq.com");javaMailSender.send(simpleMailMessage);String toSendMes = "OK";if (ComConstants.OK.equals(toSendMes)){//redis 中存放 5分钟过期redisTemplate.opsForValue().set(email,code,ComConstants.NUM_FIVE, TimeUnit.MINUTES);//3.发送短信return "邮箱发送成功";}return "邮箱发送异常";
}/**
* 检验邮箱验证码,校验成功后登录
*/
@Override
public String checkEmailLogin(String email, String code) {//1.redis 验证码校验String redisCode = redisTemplate.opsForValue().get(email);if (code.equals(redisCode)){return "登入成功";}return "登入失败";
}

3. 问题详解

3.1 拼图库的属性和回调详细整理

关于vue3-slide-verify拼图库的属性说明:

图片

关于vue3-slide-verify拼图库的回调说明:

图片

最后附上,vue3-slide-verify拼图库官方文档地址:https://www.npmjs.com/package/vue3-slide-verify

3.2 关于实现各种验证登录功能的心得

在项目中我们做登录功能时,会用到各种验证码登录、各种机器验证。这些验证的作用都是为了安全,这些验证的实现也都是大同小异。

对于验证码登录,包括但不限于短信验证码、邮箱验证码、图形验证码登录,无论是前端还是后端,实现起来完全就可以是把代码复制粘贴。

所以,这些我都有写文章做整理,方便朋友们大家使用,也方便自己使用。

对于登录表单各种机器验证,包括但不限于拼图验证、选择验证等,前端实现起来更是五花八门。本来这些验证的实现我都想整理的,最后感觉没有必要,因为这些东西,真的是充满着共同点,熟悉了其中一种,其它的类型做起来也只会是得心应手了。

最后的最后,感谢朋友们的支持,感谢朋友们花时间的耐心阅读,谢谢!

结语

建立这个平台的初衷:

  • 打造一个仅包含前端问题的问答平台,让大家高效搜索处理同样问题。

  • 通过不断积累问题,一起练习逻辑思维,并顺便学习相关的知识点。

  • 遇到难题,遇到有共鸣的问题,一起讨论,一起沉淀,一起成长。

感谢关注微信公众号:“程序员大澈”,然后加入问答群,让我们一起解决实现所有BUG!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/179254.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言判断闰年(ZZULIOJ1028: I love 闰年!)

题目描述 根据一个年份&#xff0c;判断是否是闰年。 输入&#xff1a;输入为一个整数&#xff0c;表示一个年份。 输出&#xff1a;如果是闰年&#xff0c;输出"Yes"&#xff0c;否则输出"No"。输出单独占一行。 样例输入 Copy 2012 样例输出 Copy Yes 分…

MySQL(18):MySQL8.0的其它新特性

MySQL从5.7版本直接跳跃发布了8.0版本。 MySQL8.0 新增特征 1.更简便的NoSQL支持。 NoSQL泛指非关系型数据库和数据存储。随着互联网平台的规模飞速发展&#xff0c;传统的关系型数据库已经越来越不能满足需求。从5.6版本开始&#xff0c;MySQL就开始支持简单的NoSQL存储功能…

python爬虫 之 JavaScript 简单基础

文章目录 在网页使用JavaScript 代码的方式常用的JavaScript 事件常用的JavaScript 对象 在网页使用JavaScript 代码的方式 在网页中使用 JavaScript 代码的方式主要有三种&#xff1a; 内联方式&#xff08;Inline&#xff09;&#xff1a; 在 HTML 文件中直接嵌入 JavaScrip…

使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡(AWB)

使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡&#xff08;AWB&#xff09; 在此项目中&#xff0c;我们将使用 MATLAB Simulink 和 HDL 编码器创建自定义 IP -- AWB。 MATLAB 设计 自动白平衡模块的设计是使用 HDL Coder 在 MATLAB 和 Simulink 中创建的。HDL Coder能够生…

ubuntu设置脚本开机自启动

rc-local.service flexmitd1:~$ cd /lib/systemd/system/ flexmitd1:/lib/systemd/system$ ls |grep rc-local.service rc-local.service rc-local.service.d flexmitd1:/lib/systemd/system$ pwd /lib/systemd/system flexmitd1:/lib/systemd/system$确保有rc-local.service文…

宝藏来袭,在线制作电子宣传册大公开

随着科技的进步&#xff0c;电子宣传册已经成为了企业宣传和推广的重要工具之一。它们不仅易于制作和更新&#xff0c;而且可以轻松地在网络上传播&#xff0c;让更多的人了解您的品牌和产品。 现在&#xff0c;给大家推荐一款FLBOOK在线制作电子杂志平台。无需任何专业的设计技…

kubectl 本地远程链接k8s多个集群,远程管控多集群,查看日志 部署服务(windows版)

文章目录 一、前言二、windows上安装kubectl和mobaxterm2.1 准备安装包2.2 安装kubectl2.3 链接k8s集群2.4 查看某一个pod的容器日志2.5 切换context 上下文配置&#xff0c;实现在多个k8s集群间动态切换 一、前言 现如今是一个万物皆上云 的时代&#xff0c;各种云层出不穷&am…

四川芸鹰蓬飞商务信息咨询有限公司是可靠的选择

随着电商行业的快速发展&#xff0c;越来越多的消费者选择通过线上平台购物。在这个大背景下&#xff0c;四川芸鹰蓬飞商务信息咨询有限公司以其独特的抖音电商服务&#xff0c;为广大消费者带来了更加便捷、安全的购物体验。 一、服务的优势 专业团队&#xff1a;公司拥有一支…

零基础学会酒店预订小程序制作

" 如果你想要开发一个酒店预订小程序&#xff0c;以下是一个简单的步骤指南&#xff0c;帮助你通过第三方制作平台/工具如乔拓云网来实现这一目标&#xff1a; 1. 找一个合适的第三方制作平台/工具&#xff1a; 在如今的市场上&#xff0c;有许多第三方制作平台/工具可供选…

JavaEE进阶学习:Spring核心和设计思想

Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃而庞大的社区&#xff0c;这就是它之所以能长久不衰的原因。Spring 支持广泛的应用场景&#xff0c;它可以让 Java 企业级…

面向对象和原型/原型链学习

##构造函数执行的机制 函数的其中一个作用,就是构造函数. ###new关键字 1.创建一个对象; 2.这个对象的原型,可以看到这个Function 3.该对象,实现了这个构造函数的方法. 4.根据一些特定情况,返回: (1)如果没有返回值,就返回一个对象; (2)如果返回一个基本类型,则还是返回…

12-使用vue2实现todolist待办事项

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…