vue3.0实现炫酷的随机验证码功能
先上图

接下来楼一眼实现代码
这里说明一下,我用到了vue3.0,vant3.0以及阿里图标,vant 很人性化针对vue3.0新出了个vant3.0版本,阿里则是适配vue3.0的。我们将verify验证码进行了封装,内部用进行了hook以及工具的封装。
登录页代码 login.vue
<template>
<div class="login">
<span class="iconfont icongouwuche"></span>
<van-form @submit="onSubmit">
<van-field
v-model="username"
name="username"
label="用户名"
placeholder="用户名"
:rules="[{ required: true, message: '请填写用户名' }]"
/>
<van-field
v-model="password"
type="password"
name="password"
label="密码"
placeholder="密码"
:rules="[{ required: true, message: '请填写密码' }]"
/>
<van-field
center
clearable
label="验证码"
placeholder="输入验证码"
v-model="verify"
>
</van-field>
<ImgVerify ref="verifyRef" />
<div style="margin: 16px">
<van-button round block color="#1baeae" native-type="submit">
登录</van-button
>
</div>
</van-form>
</div>
</template> <script>
import { reactive, ref, toRefs } from "vue";
import ImgVerify from "@/components/ImgVerify";
export default {
components: { ImgVerify },
setup(props, con) {
const verifyRef = ref(null); const state = reactive({
username: "",
password: "",
verify: "",
});
const onSubmit = (values) => {
if (state.verify.toLowerCase() == verifyRef.value.imgCode.toLowerCase()) {
// 提交时判断是否是正确验证码
alert("输入正确");
TODO;
//
}
}; return {
...toRefs(state),
onSubmit,
verifyRef,
};
},
};
</script> <style lang='scss' scoped>
.login {
/* background: #eee; */
}
div {
font-size: 14px;
.icongouwuche {
padding-top: 40px;
font-size: 120px;
}
}
</style>
验证码组件 ImgVerify.vue
这里只是简单地获取以及排版,正正的逻辑放到了hook中
<template>
<div>
<canvas
ref="verify"
:width="width"
:height="height"
@click="handleDraw"
></canvas>
</div>
</template> <script>
import {ref } from "vue";
import {setVerify} from '../hooks/Verify'
export default {
setup(props, con) {
const verify = ref(null);
return{
...setVerify(verify)
}
},
};
</script> <style lang='scss' scoped>
</style>
我们先看一下封装好的tool工具函数。
Tool.js
//随机数
export function randomNum(min, max) {
return parseInt(Math.random() * (max - min + 1) + min);
};
//随机颜色
export function randomColor(min, max) {
const r = randomNum(min, max);
const g = randomNum(min, max);
const b = randomNum(min, max);
return `rgb(${r},${g},${b})`;
};
接下来重头戏实现验证码
verify.js
import { onMounted, toRefs, reactive } from "vue";
import { randomColor, randomNum } from '../utils/Tools'
export function setVerify(verify) {
const state = reactive({
pool: "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", // 随机字符串
width: 120, //展示区域宽度
height: 40, //展示区域高度
imgCode: "", //保存页面的内容(用来判断输入验证是否满足改code)
});
// 1、初始展示
onMounted(() => {
draw();
state.imgCode = draw();
});
// 2、点击图片重新绘制
const handleDraw = () => {
draw();
state.imgCode = draw();
};
// 3、绘制随机内容
const draw = () => {
/*
* 一、填充颜色
* 1、生成画布
* 2、填充颜色与位置
* 3、填充位置
*/
const ctx = verify.value.getContext("2d");
ctx.fillStyle = randomColor(180, 230);
ctx.fillRect(0, 0, state.width, state.height);
/*
* 二、生成4个随机数
* 1、七扭八歪
* 2、随机大小
* 3、画吧柳梢,各种色儿
*/
let imgCode = "";
for (let i = 0; i < 4; i++) {
const text = state.pool[randomNum(0, state.pool.length - 1)];
const fontSize = randomNum(18, 40);
const deg = randomNum(-30, 30);
/*
* 绘制文字并让四个文字在不同的位置显示的思路 :
* 1、定义字体
* 2、定义对齐方式
* 3、填充不同的颜色
* 4、保存当前的状态(以防止以上的状态受影响)
* 5、平移translate()
* 6、旋转 rotate()
* 7、填充文字
* 8、restore出栈
* */
ctx.font = fontSize + "px Simhei";
ctx.textBaseline = "top";
ctx.fillStyle = randomColor(80, 150);
ctx.save();
ctx.translate(30 * i + 15, 15);
ctx.rotate((deg * Math.PI) / 180);
ctx.fillText(text, -15 + 5, -15);
ctx.restore();
imgCode += text;
}
/*
* 三、随机产生5条干扰线,干扰线的颜色要浅一点
*/
for (let i = 0; i < 5; i++) {
ctx.beginPath();
ctx.moveTo(randomNum(0, state.width), randomNum(0, state.height));
ctx.lineTo(randomNum(0, state.width), randomNum(0, state.height));
ctx.strokeStyle = randomColor(180, 230);
ctx.closePath();
ctx.stroke();
}
/*
* 四、随机产生40个干扰的小点
*/
for (let i = 0; i < 40; i++) {
ctx.beginPath();
ctx.arc(
randomNum(0, state.width),
randomNum(0, state.height),
1,
0,
2 * Math.PI
);
ctx.closePath();
ctx.fillStyle = randomColor(150, 200);
ctx.fill();
}
return imgCode;
};
return {
...toRefs(state),
handleDraw,
verify,
};
}
一个vscode快熟生成vue3代码片段的方法
1、选择 文件---》首选项---》代码片段---》
2、新建json

3、配置json
"Print to console": {
"prefix": "vue3",
"body": [
"<template>",
"<div>",
"",
"</div>",
"</template>",
"",
"<script>",
"export default {",
" components: {},",
" setup(props,con){}",
"}",
"</script>",
"",
"<style lang='scss' scoped>",
"",
"</style>",
"$2"
],
"description": "Vue3模板"
}

vue3.0实现炫酷的随机验证码功能的更多相关文章
- Java案例之随机验证码功能实现
实现的功能比较简单,就是随机产生了四个字符然后输出.效果图如下,下面我会详细说一下实现这个功能用到了那些知识点,并且会把 这些知识点详细的介绍出来.哈哈 ,大神勿喷,对于初学Java的人帮助应该蛮大的 ...
- vue实现随机验证码功能
效果图: 1.html代码 <div class="form-group" style="display: flex;"> <div> ...
- JS 实现随机验证码功能
1.验证码 验证是网页常出现的一个验证点,所谓验证码类型有很多,下面代码只是实现一个简单的验证功能. <div> <input type = "text" id ...
- Android实现随机验证码——自定义View
一.问题描述 熟悉web开发中童鞋们都知道为了防止恶意破解.恶意提交.刷票等我们在提交表单数据时,都会使用随机验证码功能.在Android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个 ...
- canvas炫酷时钟
canvas炫酷时钟 实现的功能 主要用到canvas的一些基础api 直接看效果 html: <canvas id="myCanvas" width="500&q ...
- vue3.0安装
一 .vue3.0安装 vue3.0安装 个人推荐以下2种 (1). 开发工具的对应代码中 插入CDN <script src="https://unpkg.com/vue@next& ...
- 一款非常炫酷的jQuery动态随机背景滚动特效
一款非常炫酷的jQuery动态随机背景滚动特效 图片背景会不停息的滚动,带有那种漂浮的视觉效果,小圈圈飘动. 更好的是还兼容IE6浏览器,大伙可以好好研究研究. 适用浏览器:IE6.IE7.IE8.3 ...
- JParticles 2.0 发布,打造炫酷的粒子特效
JParticles 2.0 发布,打造炫酷的粒子特效.不好意思哈,在这么繁花似锦的世界里,标题不得不取得吸引眼球一点哈,不然...还是不啰嗦了,我们进入正题吧 简单介绍一下 JParticles 2 ...
- 如何将炫酷的报表直接截图发送邮件——在Superset 0.37使用Schedule Email功能
Superset的图表是非常炫酷的,但是原来的版本只能在web端查看,而最新的0.37版本,可以将图表截图直接发送成邮件,非常的方便. 本文将详细介绍Superset 0.37 定时邮件功能.安装过程 ...
- iOS动画开发之五——炫酷的粒子效果
在上几篇博客中,我们对UIView层的动画以及iOS的核心动画做了介绍,基本已经可以满足iOS应用项目中所有的动画需求,如果你觉得那些都还不够炫酷,亦或是你灵光一现,想用UIKit框架写出一款炫酷的休 ...
随机推荐
- 【原创】dell戴尔笔记本充电头4530改装typeC口过程记录笔记本电源改装c口三路接线定义指南(图解)
在淘宝淘一个备用笔记本电脑,要求便携能用,最重要便宜(如果不便宜买了就想高价卖了) 选择了xps13 L322x,键盘屏幕有瑕疵,打折下来价格170左右,换了个键盘20.整体重量1.3kg左右,大小A ...
- NSScrollView 内容显示不正常问题
NSScrollView 内容显示不正常,顶部没有对齐已经后边有空隙,说明Layout的方式错误,采用了Automatic导致的.需要采用如下布局方式才可以.
- Python基础:Python的变量和对象
一.基本原理 Python中一切都是对象,变量中存放的是对象的引用.这是一个普遍的法则.我们举个例子来说,Python是如何来处理的. x = 'blue' y = 'green' z = x 当p ...
- PHPstorm配置webserver
phpstorm自带了一个web server,我们可以直接在IDE中直接运行调试代码,非常方便. 配置interpreter 工程第一次运行还要配置一下php的解释器,我电脑的配置如下: 可以看到代 ...
- AtCoder Beginner Contest 152
Flatten 给定\(n\)个正整数\(a_i\),,现在让你求出\(n\)个整数\(b_i\),使得任取\(1\le i < j \le n\),\(a_ib_i=a_jb_j\)始终成立, ...
- Mybatis【12】-- Mybatis多条件怎么查询?
很多时候,我们需要传入多个参数给sql语句接收,但是如果这些参数整体不是一个对象,那么我们应该怎么做呢?这里有两种解决方案,仅供参考. 1.将多个参数封装成为Map 测试接口,我们传入一个Map,里面 ...
- 微服务应用整合SEATA实现分布式事务
概要 seata 是alibaba 出的一款分布式事务管理器,他有侵入性小,实现简单等特点.我们能够使用seata 实现分布式事务管理, 是微服务必备的组件.他可以实现在微服务之间的事务管理,也可以实 ...
- Net中手写 事件总线 发布订阅消息
Net 手写 事件总线 发布订阅消息 前言 今晚打老虎 事件总线是对发布-订阅模式的一种实现.它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的.(项目的 ...
- 攻防世界:Web习题之 get_post
攻防世界:Web习题之 get_post 题目内容 https://adworld.xctf.org.cn/challenges/list 题目首先需要我们用GET方式提交一个名为a,值为1的变量: ...
- One API 替代品 Chat Nio 安装与使用教程
有这样一位初中生,他在初一下学期发起了一个项目,专门用来给他的朋友们免费体验 GPT 模型. 到了八年级的暑假,他决定把这个项目开源出来,并且正式命名为 Chat Nio,同时项目的定位为一站式 LL ...