📓最近想实现使用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 { //外层的div
position:relative;
}
.rendomimg { //图片
position:absolute;
top: 0;
left: 0;
}
📓到现在这一步之后,就基本上实现的验证码的功能,有一点需要注意,我们获取ref的代码要写在nomounted的钩子函数里。
📓随手写的,作一个知识扩展吧 别当真哈