vue3实现验证码校验的功能

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

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

image.gif

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

<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>

image.gif

📓按照下方的步骤来

1,基本的页面样式

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

2,生成随机数

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

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

image.gif

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

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

image.gif

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

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

image.gif

3.字体处理

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

image.gif

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

image.gif

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

image.gif

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

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%);

image.gif

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

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

       下载html2canvas

        npm install html2canvas --save

       使用

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

image.gif

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

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

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

image.gif

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

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

image.gif

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

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

相关文章
|
20天前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
17天前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
38 7
|
18天前
|
前端开发 数据库
芋道框架审批流如何实现(Cloud+Vue3)
芋道框架审批流如何实现(Cloud+Vue3)
39 3
|
17天前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
36 1
|
17天前
|
JavaScript 开发者
在 Vue 3 中使用 Proxy 实现数据的双向绑定
【10月更文挑战第23天】Vue 3利用 `Proxy` 实现了数据的双向绑定,无论是使用内置的指令如 `v-model`,还是通过自定义事件或自定义指令,都能够方便地实现数据与视图之间的双向交互,满足不同场景下的开发需求。
39 1
|
20天前
|
前端开发 JavaScript
简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef
简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef
|
20天前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
7天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
8天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
8天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。