vue3实现验证码校验的功能

📓最近想实现使用vue3实现一个简易的前端验证码校验的功能,就花了点时间实现了,这只是一个简易版的,但是用在项目中是没有啥问题的,废话不多说,先来看下最终实现的效果。

📓现在让我们来一步一步的实现就行,先把代码贴出来

<template><div><div class="box"><div><span>输入验证码:</span><el-input class="input" v-model="numberinput"></el-input></div><div class="rendombox"><div class="rendom" ref="rendom">{{ numberrandom }}</div><div class="rendomimg rendom"><img :src="imageData"></div></div><el-button style="height: 40px;" @click="refresh">刷新</el-button><el-button style="height: 40px;" @click="login">登录</el-button></div></div>
</template>
<script lang="ts">
import { nextTick, onMounted, ref, watch } from 'vue'
import html2canvas from 'html2canvas'
export default ({setup() {let numberrandom = ref()let numberinput = ref()let imageData = ref()const rendom: any = ref()const canvas = (data: any) => {nextTick(() => {html2canvas(data).then(canvas => {imageData.value = canvas.toDataURL('image/png');});})}const random = () => {numberrandom.value = Math.floor(Math.random() * 10000) % 10000}random()const refresh = async () => {random()canvas(rendom.value)console.log(rendom.value, 1)}const login = () => {if (numberinput.value == numberrandom.value) {alert("验证通过,在这里写登录成功的代码")} else {alert("登录失败,在这里写登录失败后的代码")}}onMounted(() => {canvas(rendom.value)})return {numberrandom, random, numberinput, login, rendom, imageData, refresh}},})</script>
<style>
@font-face {font-family: "christmas";src: url("../ttf/Christmas_Wonderful.ttf");
}.box {display: flex;flex-direction: row
}.input {width: 120px;height: 40px;margin-right: 20px;
}.rendom {font-family: "christmas", sans-serif;border: 0.5px solid #ccc;line-height: 50px;width: 100px;text-align: center;height: 38px;font-size: 50px;margin-right: 20px;background-color: #F1F1F5;/*背景色*/background-image: linear-gradient(90deg, rgba(200, 0, 0, 0.15) 10%, rgba(0, 0, 0, 0) 10%), linear-gradient(0deg, rgba(200, 0, 0, 0.15) 10%, rgba(0, 0, 0, 0) 10%);/*rgba(0, 0, 0, 0),transparent全透明黑*/background-size: 40px 10px;/*调节格子宽 高*/
}.rendombox {position:relative;
}
.rendomimg {position:absolute;top: 0;left: 0;}
.rendomimg>img{width:100px;height:38px;
}
</style>

📓按照下方的步骤来

1,基本的页面样式

        📓基本的样式我这里就不多说了,就正常的样式即可,主要的还是验证码方面。

2,生成随机数

        2.1 验证码都是随机数,我们这里需要前端生成随机数,然后将随机数放在页面上,这里我使用了一个div来放置随机数。代码如下

        let numberrandom = ref()const random = () => {numberrandom.value = Math.floor(Math.random() * 10000) % 10000}

        2.2  同时还需要将生成随机数函数放在钩子函数onmounted里执行,保证每次进入到这个页面时都能生成这个函数

     onMounted(() => {random()})

        2.3 将随机数渲染到页面上去

   <div class="rendom"><span>{{ numberrandom }}</span></div>

3.字体处理

        📓我们看到的验证码都是一些艺术字,所以这里我们也需要对验证码多艺术字处理,我们首先找到字体文件,这个一般在一些字体下载网上能找到,ttf格式的文件,我们在src下新建一个文件夹,文件夹里放置我们的ttf的文件,如下图:

📓然后我们在我们放验证码内容的外层加上一层div,给这个div设置一个class名

📓然后我们在style标签里写css样式,并引入我们的字体文件,如下图

📓当我们设置完成后,我们的验证码的文字就变成艺术字啦

4.背景处理

          📓除了字体需要做的不容易识别的话,其实我们还需要对验证码的背景进行处理,让他变得更花。

📓这里我直接用了给验证码加了一套格子背景

 background-image: linear-gradient(90deg, rgba(200, 0, 0, 0.15) 10%, rgba(0, 0, 0, 0) 10%), linear-gradient(0deg, rgba(200, 0, 0, 0.15) 10%, rgba(0, 0, 0, 0) 10%);

5.将我们的验证码变成图片

        📓这时候我们的验证码已经基本上做好了 这时候我们就需要在做一件事情,将验证码的div块变成图片,这里我使用html2canvas来进行转换

        下载html2canvas

         npm install html2canvas --save

        使用

import html2canvas from 'html2canvas'html2canvas(data).then(canvas => {imageData.value = canvas.toDataURL('image/png');});

        📓其中 我们给html2canvas传入的参数dta就是我们需要转换为图片的元素的元素对象,一般通过vue的ref来获取这个元素对象,然后将对象传入即可,回调函数里返回一个图片地址,将这个图片地址通过img标签渲染到页面上即可。

        📓注意,因为我们将div变成图片是要在获取到元素对象后才执行,所以,转换代码要卸载nextick的的钩子函数里:

            nextTick(() => {html2canvas(data).then(canvas => {imageData.value = canvas.toDataURL('image/png');});})

        📓到了这一步后,我们就能发现页面上显示出了2个验证码的显示框,这时候,我们就需要,将我们的图片的验证码贴到文字验证码上方,这里我使用定位的方式来实现

.rendombox {  //外层的divposition:relative;
}
.rendomimg { //图片position:absolute;top: 0;left: 0;}

        📓到现在这一步之后,就基本上实现的验证码的功能,有一点需要注意,我们获取ref的代码要写在nomounted的钩子函数里。

📓随手写的,作一个知识扩展吧 别当真哈

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

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

相关文章

NX二次开发UF_CSYS_ask_wcs 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_ask_wcs Defined in: uf_csys.h int UF_CSYS_ask_wcs(tag_t * wcs_id ) overview 概述 Gets the object identifier of the coordinate system to which the work coordin…

从设计上理解JDK动态代理

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 照理说&#xff0c;动态…

小程序可拖拽按钮

你有没有遇到过在页面中有一个固定在某个位置的按钮&#xff0c;永远的挡住了你想要看的区域&#xff1f; 在小程序的列表页面中&#xff0c;常常会有一个提报的入口固定在右下角&#xff0c;如果这个按钮不可拖动的话&#xff0c;可能会挡住下面的事件&#xff0c;让用户操作起…

GPU - cuda 安装

GPU - cuda 安装 环境搭建安装 0.确认你的电脑上有英伟达显卡 通过winR输入:control /name Microsoft.DeviceManager打开显示适配器&#xff0c;能看到显卡即可。我的版本是 3060 驱动版本 31.0.15.4617 1.查看主机显卡驱动版本. 主机GPU驱动版本决定你的主机最高能支持到什…

[架构之路-249]:目标系统 - 设计方法 - 软件工程 - 需求工程- 需求开发:如何用图形表达需求,结构化方法的需求分析

目录 一、概述 二、数据模型&#xff1a;E-R图/实体关系图&#xff08;数据单元之间的结构关系&#xff09; 三、功能模型&#xff1a;数据流图DFD&#xff08;逻辑运算&#xff0c;包括输入和输出&#xff0c;实体之间的关系&#xff09;&#xff1a;输入》处理 》 输出 四…

快速入门go语言学习笔记

文章目录 1、初识go1.1、go语言1.2 第一个Go程序 2、基础类型2.1、命名2.2、变量2.2.1 变量声明2.2.2 变量初始化2.2.3 变量赋值2.2.4 匿名变量 2.3、常量2.3.1 字面常量(常量值)2.3.2 常量定义2.3.3 iota枚举 2.4、基础数据类型2.4.1 分类2.4.2 布尔类型2.4.3 整型2.4.4 浮点型…

【漏洞复现】金蝶云星空管理中心 ScpSupRegHandler接口存在任意文件上传漏洞 附POC

漏洞描述 金蝶云星空是一款云端企业资源管理(ERP)软件,为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织,多利润中心的大中型企业,以 “开放、标准、社交”三大特性为数字经济时代的企业提供开放的 ERP 云平台。服务涵盖:财务、供…

2022 第十四届蓝桥杯模拟赛第一期(题解与标程)

第十四届蓝桥杯模拟赛第一期 1. 二进制位数问题描述答案提交参考答案 2. 晨跑问题描述答案提交参考答案 3. 调和级数问题描述答案提交参考答案程序验证 4. 山谷问题描述答案提交参考答案 5. 最小矩阵问题描述答案提交参考答案 6. 核酸日期问题描述输入格式输出格式样例输入样例…

wagtail-安装配置

系列文章目录 文章目录 系列文章目录安装虚拟环境安装wagtail查看安装后的包 创建wagtail项目安装依赖迁移创建超级用户运行项目 安装虚拟环境 https://blog.csdn.net/gsl371/article/details/117917857 安装wagtail (wagenv) C:\djproject\wagprj>pip list Package V…

【MySQL】mysql中不推荐使用uuid或者雪花id作为主键的原因以及差异化对比

文章目录 前言什么是UUID?什么是雪花ID?什么是MySql自增ID?优缺点对比UUID:优点1.全球唯一性2.无需数据库支持 缺点1.存储空间大2.索引效率低3.查询效率低 雪花ID&#xff1a;优点1.分布式环境下唯一性 缺点1.依赖于机器时钟2.存储空间较大3.查询效率低 MYSQL自增:优点1.简单…

第五天 用Python批量处理Excel文件,实现自动化办公

用Python批量处理Excel文件&#xff0c;实现自动化办公 一、具体需求 有以下N个表&#xff0c;每个表的结构一样&#xff0c;如下&#xff1a; 需要把所有表数据汇总&#xff0c;把每个人的得分、积分分别加起来&#xff0c;然后按总积分排名&#xff0c;总积分一致时&#xff…

运放如何进行全波整流

对于一个双极性的交流信号&#xff0c;如果想要把负半轴的信号镜像到正半轴&#xff0c;我们可以接一个整流桥&#xff0c;这种叫做全波整流。 如果双极性的交流信号经过一个二极管&#xff0c;则交流信号的负半轴不能通过二极管&#xff0c;输出只有正半轴的信号&#xff0c;这…