当前位置: 首页 > news >正文

vue3纯前端验证码示例

前言

  • 验证码的用途:通过要求用户输入一串难以被机器自动识别的字符或图像,有效阻止恶意用户或脚本通过暴力破解方式尝试登录账户。
  • 验证码的分类:常见的验证码有短信、文本、图形等,安全度越高,依赖的插件或服务也越多。
    今天我们来做一个简单的纯前端字符验证码码组件,不需要插件,仅做为示例。
    先看一下效果:在这里插入图片描述

分析

一个简单的字符验证码,只需求定义一个字符集,一个随机生成函数就可以了。如果要再进一步增加一些效果,如干扰线,干扰点,则需要借助Canvas来进行绘制,以增强可视化效果。

基础代码示例

以下代码就完成了简单验证码的核心工作,生成指定位数的随机验证码。

// 生成校验码
const makeCode = (len = 4) => {let code = "";const codeLength = len; //验证码的长度// 定义生成验证码的字符集,去除易混淆的字符集1il0oOconst identifyCodes = "123456789abcdefjhijkinpqrsduvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";for (let i = 0; i < codeLength; i++) {// 获取随机字符code += identifyCodes[randomNum(0, identifyCodes.length)];}return code; //把code值赋给验证码
};
//随机数生成:根据角标拿字符串的值
const randomNum = (min = 0, max: number) => Math.floor(Math.random() * (max - min)) + min;

组件化及可视化增强

下面我们来做一个完整的vue验证码组件,并借助Canvas添加干扰线和干扰点的效果。
既然是组件,就需要几个参数供调用者调整,常规的就是组件的宽、高、字号以及是否需要干扰线或干扰点,所以这里只定义了这几个参数。
多余的就不说了,直接上代码。

1、vue验证码组件代码:

<template><div class="s-canvas"><canvasid="s-canvas":width="contentWidth":height="contentHeight"@click="refreshCode"></canvas></div>
</template>
<script lang="ts" setup>
import { ref, onMounted, withDefaults, defineProps } from "vue";// 定义props类型
interface CodeProps {/** 默认验证码 */defaultCode?: string;/** 容器宽度 */contentWidth?: number;/** 容器高度 */contentHeight?: number;/** 最大干扰线,0时无干扰线 */maxLine?: number;/** 最大干扰点,0时无干扰点 */maxDot?: number;/** 字体最小值 */fontSizeMin?: number;/** 字体最大值 */fontSizeMax?: number;
}
// props默认值
const props = withDefaults(defineProps<CodeProps>(), {contentWidth: 90,contentHeight: 30,fontSizeMin: 25,fontSizeMax: 30,maxLine: 4,maxDot: 10,
});const emit = defineEmits(["update:verifyCode"]);
//验证码
const verifyCode = ref("");onMounted(() => {verifyCode.value = props.defaultCode || makeCode();emit("update:verifyCode", verifyCode.value);drawPic(verifyCode.value);
});
// 生成校验码
const makeCode = (len = 4) => {let code = "";const codeLength = len; //验证码的长度// 定义生成验证码的字符集,去除易混淆的字符集1il0oOconst identifyCodes = "123456789abcdefjhijkinpqrsduvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";for (let i = 0; i < codeLength; i++) {// 获取随机字符code += identifyCodes[randomNum(0, identifyCodes.length)];}return code; //把code值赋给验证码
};// 重置验证码
const refreshCode = () => {verifyCode.value = makeCode();emit("update:verifyCode", verifyCode.value);drawPic(verifyCode.value);
};
// 定义暴露接口
// defineExpose({ refreshCode });//随机数生成:根据角标拿字符串的值
const randomNum = (min = 0, max: number) => Math.floor(Math.random() * (max - min)) + min;// 生成一个随机的颜色
function randomColor(min: number, max: number) {let r = randomNum(min, max);let g = randomNum(min, max);let b = randomNum(min, max);return "rgb(" + r + "," + g + "," + b + ")";
}
/** 绘制文字 */
function drawPic(verifyCode: string) {let canvas = document.getElementById("s-canvas") as HTMLCanvasElement;if (!canvas) {console.error("找不到 canvas 元素");return;}//创建一个2D对象作为上下文。let ctx = canvas.getContext("2d") as CanvasRenderingContext2D;ctx.textBaseline = "bottom";// 绘制背景ctx.fillStyle = "#e6ecfd";ctx.fillRect(0, 0, props.contentWidth, props.contentHeight);// 绘制文字for (let i = 0; i < verifyCode.length; i++) {drawText(ctx, verifyCode, i);}drawLine(ctx, props.maxLine);drawDot(ctx, props.maxDot);
}/**在画布上显示数据* @param ctx CanvasRenderingContext2D* @param verifyCode 要显示的文字* @param index 字符索引*/
function drawText(ctx: CanvasRenderingContext2D, verifyCode: string, index: number) {ctx.fillStyle = randomColor(50, 160); // 随机生成字体颜色ctx.font = randomNum(props.fontSizeMin, props.fontSizeMax) + "px SimHei"; // 随机生成字体大小let x = (index + 1) * (props.contentWidth / (verifyCode.length + 1));let y = randomNum(props.fontSizeMax, props.contentHeight - 5);var deg = randomNum(-10, 15);// 修改坐标原点和旋转角度ctx.translate(x, y);ctx.rotate((deg * Math.PI) / 180);ctx.fillText(verifyCode[index], 0, 0);// 恢复坐标原点和旋转角度ctx.rotate((-deg * Math.PI) / 180);ctx.translate(-x, -y);
}
/** 绘制干扰线* @param ctx CanvasRenderingContext2D* @param max 最大干扰线个数*/
function drawLine(ctx: CanvasRenderingContext2D, maxLine = 4) {if (maxLine <= 0) {return;}for (let i = 0; i < maxLine; i++) {ctx.strokeStyle = randomColor(150, 200);ctx.beginPath();ctx.moveTo(randomNum(0, props.contentWidth), randomNum(0, props.contentHeight));ctx.lineTo(randomNum(0, props.contentWidth), randomNum(0, props.contentHeight));ctx.stroke();}
}
/** 绘制干扰点* @param ctx CanvasRenderingContext2D* @param max 最大干扰点个数*/
function drawDot(ctx: CanvasRenderingContext2D, maxDot = 10) {if (maxDot <= 0) {return;}for (let i = 0; i < maxDot; i++) {ctx.fillStyle = randomColor(0, 255);ctx.beginPath();ctx.arc(randomNum(0, props.contentWidth), randomNum(0, props.contentHeight), 1, 0, 2 * Math.PI);ctx.fill();}
}
</script>

2、使用验证码组件

代码可直接复制进行验证,ui使用了ant-design-vue,如果用的不是ant,则直接替换组件即可。


<template><div class="main"><div class="container"><div><a-input placeholder="请输入验证码" v-model:value="code"></a-input></div><div><!--验证码组件--><VerifyCode v-model:verifyCode="identifyCode"></VerifyCode></div></div><div><p>当前验证码: {{ identifyCode }},手动输入验证码: {{ code }}</p><a-button type="primary" @click="submit">提交</a-button></div></div>
</template><script lang="ts" setup>
import { ref, onMounted } from "vue";
import { message } from "ant-design-vue";
import VerifyCode from "./verifyCode.vue";
// 验证码输入框内容
let code = ref("");
// 验证码图片内容
let identifyCode = ref("");
function submit() {if (code.value == "") {message.error("请先输入验证码");return;}if (identifyCode.value == code.value) {message.success("验证码正确✓");} else {message.error("验证码错误,请重新输入!");}
}
</script>
<style lang="less" scoped>
.main {padding: 20px;
}
.container {display: flex;flex-direction: row;align-items: flex-start;justify-content: center;
}
</style>

注意事项:

  • 通过update:verifyCode:来实现验证码的自动回填,减少了业务使用方的数据交互处理。

最终效果

在这里插入图片描述

相关文章:

vue3纯前端验证码示例

前言 验证码的用途&#xff1a;通过要求用户输入一串难以被机器自动识别的字符或图像&#xff0c;有效阻止恶意用户或脚本通过暴力破解方式尝试登录账户。验证码的分类&#xff1a;常见的验证码有短信、文本、图形等&#xff0c;安全度越高&#xff0c;依赖的插件或服务也越多…...

招聘程序员

全栈总监❤️golang❤️UI设计师 ☀️前端☀️Nodejs工☀️平面设计☀️PHP工 ☀️安卓❤️Flutter❤️运维☀️爬虫 公司福利&#xff1a; ☃️ 带薪年假、年终奖、13k-18k薪 &#x1f3e9; 内宿 2人/间或外宿可补助 &#x1f4b5; 转正绩效 ✨节日礼金&#xff1a;生日礼金…...

Android 判断手机放置的方向

#1024程序员节&#xff5c;征文# 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 需求 老板&#xff1a;我有个手持终端&#xff0c;不能让他倒了&#xff0c;当他倒或者倾斜的时候要发出报警&#xff1b; 程序猿&#xff1a;我这..... 老板…...

Telegram机器人的手机部署

目的 一直有读 epub 电子书的习惯&#xff0c;摘录段落复制下来段落很难看&#xff0c;把自己写的排版器的逻辑复制下来&#xff0c;写成了一个排版机器人所有发给机器人的文字&#xff0c;都会经过排版&#xff0c;后转发到读书频道 前提 本来最好方法是直接把机器人架在服…...

ffmpeg视频滤镜: 色温- colortemperature

滤镜简述 colortemperature 官网链接 》 FFmpeg Filters Documentation 这个滤镜可以调节图片的色温&#xff0c;色温值越大显得越冷&#xff0c;可以参考一下下图&#xff1a; 咱们装修的时候可能会用到&#xff0c;比如选择灯还有地板的颜色的时候&#xff0c;选暖色调还是…...

Django+Vue全栈开发项目入门(二)

Vue是一款用于构建用户界面的JavaScript渐进式框架&#xff0c;它基于标准HTML、CSS和JavaScript构建&#xff0c;并提供了一套声明式的、响应式的、组件化的编程模型&#xff0c;有助于高效地开发用户界面。 环境准备 安装Node.js&#xff1a;Vue项目的构建和运行依赖于Node…...

【ubuntu改源】

ubuntu改源 备份原始源查看ubuntu发行版本arm64 noble版本的源vim修改源更新系统软件源 备份原始源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.disabled查看ubuntu发行版本 lsb_release -aarm64 noble版本的源 清华源 vim修改源 esc :1,$d # 删除所有# 默认注…...

SQLI LABS | Less-9 GET-Blind-Time based-Single Quotes

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-9/ 靶场提示 …...

【小白学机器学习24】 用例子来比较:无偏估计和有偏估计

目录 1 关于无偏估计 1.1 无偏估计的定义 2 原始数据 2.1 假设我们是上帝&#xff0c;我们能创造一个总体/母体 population 2.2 按尽量随机取样的原则去取1个随机样本 sample1 3 一个关于无偏估计的理解 3.1 接着上面的总体和样本 sample1 3.2 左边的计算&#xff0c;期…...

C++在实际项目中的应用第二节:C++与网络编程

第五章&#xff1a;C在实际项目中的应用 第二节&#xff1a;C与网络编程 1. TCP/IP协议详解与C实现 TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是现代互联网通信的基础协议。理解 TCP/IP 协议对于开发网络应用至关重要。本节将详细介绍 TCP/IP 协议的工作原理以…...

依赖关系是危险的

依赖, 我们需要它们&#xff0c;但如何有效安全地使用它们&#xff1f;在本周的节目中&#xff0c;Kris 与 Ian 和 Johnny 一起讨论了 polyfill.io 供应链攻击、Go 中依赖管理和使用的历史&#xff0c;以及 Go 谚语“一点复制胜过一点依赖”。当然&#xff0c;我们用一些不受欢…...

ipguard与Ping32如何加密数据防止泄露?让企业信息更安全

在信息化时代&#xff0c;数据安全已成为企业运营的重中之重。数据泄露不仅会导致经济损失&#xff0c;还可能损害企业声誉。因此&#xff0c;选择合适的数据加密工具是保护企业敏感信息的关键。本文将对IPGuard与Ping32这两款加密软件进行探讨&#xff0c;了解它们如何有效加密…...

gitlab 的备份与回复

一、gitlab备份 1.确定备份目录 gitlab 默认的备份目录为/var/opt/gitlab/backups&#xff0c;可通过配置gitlab.rb配置文件进行修改&#xff0c;如&#xff1a; [rootlocalhost ~]# vim /etc/gitlab/gitlab.rb #若要修改备份文件的存储目录话&#xff0c;打开下面选项的注释…...

创建型模式-----建造者模式

目录 背景&#xff1a; 构建模式UML 代码示例 房子成品&#xff1a; 构建器抽象&#xff1a; 具体构建器&#xff1a; 建筑师&#xff1a; 测试部…...

威胁 Windows 和 Linux 系统的新型跨平台勒索软件:Cicada3301

近年来&#xff0c;网络犯罪世界出现了新的、日益复杂的威胁&#xff0c;能够影响广泛的目标。 这一领域最令人担忧的新功能之一是Cicada3301勒索软件&#xff0c;最近由几位网络安全专家进行了分析。他们有机会采访了这一危险威胁背后的勒索软件团伙的成员。 Cicada3301的崛…...

Go 语言基础教程:7.Switch 语句

在这篇教程中&#xff0c;我们将学习 Go 语言中的 switch 语句&#xff0c;它是条件分支的重要结构。我们将通过一个示例程序逐步解析 switch 的不同用法。 package mainimport ("fmt""time" )func main() {i : 2fmt.Print("Write ", i, " …...

mysql原理、部署mysql主从+读写分离、监控mysql主从脚本

mysql&#xff1a;工作原理 从库生成两个线程&#xff0c;一个I/O线程&#xff0c;一个SQL线程&#xff1b; i/o线程去请求主库 的binlog&#xff0c;并将得到的binlog日志写到relay log&#xff08;中继日志&#xff09; 文件中&#xff1b; 主库会生成一个 log dump 线程&…...

模型选择拟合

1.通过多项式拟合交互探索概念 import math import numpy as np import torch from torch import nn from d2l import torch as d2l 2.使用三阶多项式来生成训练和测试数据的标签 max_degree 20 # 多项式的最大阶数 n_train, n_test 100, 100 # 训练和测试数据集大小 true…...

文案语音图片视频管理分析系统-视频矩阵

文案语音图片视频管理分析系统-视频矩阵 1.产品介绍 产品介绍方案 产品名称&#xff1a; 智驭视频矩阵深度分析系统&#xff08;SmartVMatrix&#xff09; 主要功能&#xff1a; 深度学习驱动的视频内容分析多源视频整合与智能分类高效视频检索与编辑实时视频监控与异常预警…...

ArcGIS计算落入面图层中的线的长度或面的面积

本文介绍在ArcMap软件中&#xff0c;计算落入某个指定矢量面图层中的另一个线图层的长度、面图层的面积等指标的方法。 如下图所示&#xff0c;现在有2个矢量要素集&#xff0c;其中一个为面要素&#xff0c;表示某些区域&#xff1b;另一个为线要素&#xff0c;表示道路路网。…...

bert-base-chinese场景解析:从语义相似度计算到特征提取实战

BERT-base-chinese场景解析&#xff1a;从语义相似度计算到特征提取实战 1. 模型概述与核心价值 BERT-base-chinese是Google推出的中文预训练语言模型&#xff0c;基于Transformer架构构建&#xff0c;专门针对中文文本处理进行了优化。作为NLP领域的里程碑式模型&#xff0c…...

OpenClaw 的 Skill免费开源的

OpenClaw 的 Skill 生态非常丰富&#xff0c;其中绝大部分都是免费开源的。以下为您推荐几类实用的免费插件&#xff0c;您可以根据需求选择安装。&#x1f6e1;️ 一、安全与权限控制 (强烈建议优先安装)skill-vetter / clawsec功能&#xff1a;安装插件前自动扫描代码&#x…...

nli-distilroberta-base实际项目:高校招生简章关键条款与考生疑问逻辑关系库构建

nli-distilroberta-base实际项目&#xff1a;高校招生简章关键条款与考生疑问逻辑关系库构建 1. 项目背景与需求 高校招生简章通常包含大量专业条款和政策说明&#xff0c;每年都会收到大量考生关于条款理解的咨询。传统的人工解答方式存在几个痛点&#xff1a; 效率低下&am…...

从CUDA核心到Tensor Core:GPU计算单元的演进与实战解析

1. CUDA核心&#xff1a;通用计算的基石 我第一次接触CUDA核心是在2012年做图像处理项目时。当时用GTX 680显卡做图像渲染&#xff0c;发现它比CPU快了近20倍&#xff0c;这个性能差距让我震惊。后来才知道&#xff0c;这要归功于显卡里密密麻麻的CUDA核心。 CUDA核心本质上就是…...

终极Ghidra安装指南:5分钟在Ubuntu系统快速部署逆向工程神器

终极Ghidra安装指南&#xff1a;5分钟在Ubuntu系统快速部署逆向工程神器 【免费下载链接】ghidra_installer Helper scripts to set up OpenJDK 11 and scale Ghidra for 4K on Ubuntu 18.04 / 18.10 项目地址: https://gitcode.com/gh_mirrors/gh/ghidra_installer 想要…...

Phi-4-Reasoning-Vision部署案例:中小企业AI视觉分析私有化部署

Phi-4-Reasoning-Vision部署案例&#xff1a;中小企业AI视觉分析私有化部署 1. 项目背景与价值 在中小企业数字化转型过程中&#xff0c;AI视觉分析技术正成为提升运营效率的关键工具。传统方案往往面临两大痛点&#xff1a;一是商业API调用成本高且数据隐私难保障&#xff1…...

Crawl4AI浏览器配置文件创建与键盘交互处理终极指南:打造个性化爬虫身份

Crawl4AI浏览器配置文件创建与键盘交互处理终极指南&#xff1a;打造个性化爬虫身份 【免费下载链接】crawl4ai &#x1f525;&#x1f577;️ Crawl4AI: Open-source LLM Friendly Web Crawler & Scrapper 项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai…...

5分钟搞定黑苹果音频驱动:AppleALC新手配置指南

5分钟搞定黑苹果音频驱动&#xff1a;AppleALC新手配置指南 【免费下载链接】AppleALC Native macOS HD audio for not officially supported codecs 项目地址: https://gitcode.com/gh_mirrors/ap/AppleALC AppleALC是一款强大的开源内核扩展工具&#xff0c;能让非官方…...

【PyCon 2024核心议题首发】:CPython 3.13 asyncio重构内幕——原生任务取消语义、零拷贝Socket API与异步GC优化前瞻

第一章&#xff1a;PyCon 2024与CPython 3.13异步演进全景图PyCon 2024于五月在匹兹堡圆满落幕&#xff0c;其核心议题之一正是CPython 3.13的异步能力跃迁。作为首个将async/await语义深度融入解释器底层的Python版本&#xff0c;3.13引入了原生协程调度优化、零拷贝内存视图支…...

CAN总线技术:数字信号与汽车电子应用解析

CAN总线技术解析&#xff1a;从数字信号本质到汽车电子应用1. CAN总线概述1.1 基本定义与技术背景CAN&#xff08;Controller Area Network&#xff09;总线是一种专为工业控制和汽车电子设计的串行通信协议&#xff0c;由德国Bosch公司于1983年开发&#xff0c;后成为国际标准…...