封装绘制验证码 verify-code.vue

<template><div class="captcha"><canvas ref="canvasRef" :width="width" :height="height" @click="refreshCaptcha"></canvas></div>
</template><script lang="ts" setup>const props = defineProps({width: {type: Number,default: 120,},height: {type: Number,default: 40,},codeLength: {type: Number,default: 5,},})const captchaText = ref('')const canvasRef = ref()onMounted(() => {refreshCaptcha()})const emits = defineEmits(['getCode'])const generateRandomText = () => {const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'let result = ''for (let i = 0; i < props.codeLength; i++) {result += chars.charAt(Math.floor(Math.random() * chars.length))}return result}const refreshCaptcha = () => {captchaText.value = generateRandomText()drawCaptcha()emits('getCode', captchaText.value)}const drawCaptcha = () => {const canvas = canvasRef.valueconst ctx = canvas.getContext('2d')// 清除画布ctx.clearRect(0, 0, canvas.width, canvas.height)// 背景色ctx.fillStyle = '#f5f5f5'ctx.fillRect(0, 0, canvas.width, canvas.height)// 绘制文字ctx.font = '20px Arial'ctx.fillStyle = '#333'ctx.textAlign = 'center'ctx.textBaseline = 'middle'// 添加干扰线for (let i = 0; i < 5; i++) {ctx.strokeStyle = getRandomColor()ctx.beginPath()ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height)ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height)ctx.stroke()}// 添加噪点for (let i = 0; i < 30; i++) {ctx.fillStyle = getRandomColor()ctx.fillRect(Math.random() * canvas.width, Math.random() * canvas.height, 2, 2)}// 绘制文字(每个字符单独处理以增加变形)for (let i = 0; i < captchaText.value.length; i++) {ctx.save()ctx.translate(10 + i * 16, 16)ctx.rotate((Math.random() - 0.5) * 0.4)ctx.fillText(captchaText.value[i], 0, 0)ctx.restore()}}const getRandomColor = () => {const letters = '0123456789ABCDEF'let color = '#'for (let i = 0; i < 6; i++) {color += letters[Math.floor(Math.random() * 16)]}return color}defineExpose({code: captchaText,refresh: refreshCaptcha,})
</script><style>.captcha canvas {cursor: pointer;}
</style>

使用

<template><div><el-input v-model="input" placeholder="" style="width: 100px;"></el-input><VueVerifyCoderef="verifyCodeRef":width="74":height="34":code-length="4"style="margin-left: 8px;border: 1px solid var(--color-border-2);padding: 0 2px;"@get-code="getCode"/><el-button type="primary" @click="submit">登录</el-button></div>
</template><script lang="ts" setup>
import VueVerifyCode from "@/components/verify-code.vue";
const verifyCodeRef = ref();
const input = ref(""); //输入的验证码
const verifyCode = ref(""); //当前验证码
//获取当前验证码
const getCode = (code: string) => {verifyCode.value = code;
};
const submit = ()=>{//判断验证码是否相同 全部转换为小写if (input.value.toLocaleLowerCase() !== verifyCode.value.toLocaleLowerCase()) {alert('验证码错误!')verifyCodeRef.value.refresh()return}
}
</script><style lang="sass" scoped></style>

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

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

相关文章

[10月考试] F

[10月考试] F 题目描述 给定长度为 nnn 的序列 ana_nan​&#xff0c;保证 aia_iai​ 为非负整数。 mmm 次询问&#xff0c;每次给定区间 l,rl,rl,r&#xff0c;求出 al,al1,…,ara_l,a_{l1},\ldots,a_ral​,al1​,…,ar​ 的 mexmexmex。 对于一个序列&#xff0c;定义其 mexm…

收集了全球55个AI写作工具

我们即将推出一整套AI生产力工具矩阵&#xff0c;覆盖内容创作&#xff08;AI写作助手&#xff09;、视觉设计&#xff08;智能图像处理&#xff09;、音视频制作&#xff08;自动转录与编辑&#xff09;及智能编程等多个核心领域。这些解决方案通过先进的机器学习算法&#xf…

Elastic 劳动力的生成式 AI:ElasticGPT 的幕后解析

作者&#xff1a;来自 Elastic Jay Shah, Adhish Thite ElasticGPT — 由 Elastic 提供支持&#xff0c;专为 Elastic 打造 ElasticGPT 是我们基于检索增强生成&#xff08;RAG&#xff09;框架构建的内部生成式 AI &#xff08;GenAI&#xff09;助手。它是使用 Elastic 自有…

CS231n-2017 Assignment1

KNN&#xff1a;这里要求我们完成一个KNN分类器&#xff0c;实现对图片使用KNN算法进行分类标签k_nearest_neighbor.py这里要求我们完成4个接口# X:测试集 # 使用两个循环 def compute_distances_two_loops(self, X):num_test X.shape[0]num_train self.X_train.shape[0]dist…

[python][flask]Flask-Principal 使用详解

Flask-Principal 是一个专为 Flask 应用设计的身份管理和权限控制扩展。它能够帮助开发者轻松实现用户身份验证和权限管理&#xff0c;从而提升应用的安全性和用户体验。该项目最初由 Ali Afshar 开发&#xff0c;现已成为 Pallets 社区生态系统的一部分&#xff0c;由社区共同…

抖音与B站爬虫实战,获取核心数据

本文将深入讲解两大主流短视频平台&#xff08;抖音、B站&#xff09;的爬虫实战技术&#xff0c;提供可直接运行的代码解决方案&#xff0c;并分享突破反爬机制的核心技巧。一、平台特性与爬虫难点对比平台数据价值主要反爬措施推荐抓取方式抖音视频数据、用户画像、热榜签名验…

WSL切换网络模式

WSL切换网络模式问题WSL从NAT改成MIRRORED找到WSL Setting修改配置重启电脑&#xff08;注意不是重启WSL&#xff09;运行pio run验证IP问题 从鱼香ROS买了一个小鱼车&#xff0c;开始学习&#xff0c;然而装环境都要搞死我了。 垃圾VirtualBox我新买的电脑&#xff0c;装个Vi…

[Linux入门] Linux 远程访问及控制全解析:从入门到实战

目录 一、SSH 远程管理&#xff1a;为什么它是远程访问的首选&#xff1f; 1️⃣什么是 SSH&#xff1f; 2️⃣SSH 为什么比传统工具更安全&#xff1f; 3️⃣SSH 的 “三大组成部分” 4️⃣SSH 工作的 “五步流程” 5️⃣常用 SSH 工具 二、实战&#xff1a;构建 SSH 远…

n8n AI资讯聚合与分发自动化教程:从数据获取到微信与Notion集成

引言 n8n简介&#xff1a;自动化工作流利器 n8n是一款功能强大的开源自动化工具&#xff0c;采用独特的“公平代码”&#xff08;Fair-Code&#xff09;许可模式&#xff0c;旨在帮助用户连接各种应用程序和服务&#xff0c;从而实现工作流的自动化。它通过直观的可视化界面&am…

递归查询美国加速-技术演进与行业应用深度解析

在当今数据驱动的时代&#xff0c;递归查询已成为处理层级数据的核心技术&#xff0c;尤其在美国科技领域获得广泛应用。本文将深入解析递归查询在美国加速发展的关键因素&#xff0c;包括技术演进、行业应用场景以及性能优化策略&#xff0c;帮助读者全面理解这一重要技术趋势…

【AIGC专栏】WebUI实现图片的缩放

图片的缩放包含如下的各类不同的缩放模型。 Lanczos Lanczos重采样是一种数学上精确的方法,用于图像放大或缩小。它使用了一种称为 sinc 函数的数学公式,可以在保留图像细节的同时减少锯齿效应。 Nearest 最近邻插值是一种简单的图像放大方法,通过复制最近的像素值来填充新…

Libevent(4)之使用教程(3)配置

Libevent(4)之使用教程(3)配置事件 Author: Once Day Date: 2025年7月27日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 本文档翻译于&#xff1a;Fast portable non-bl…

若依前后端分离版学习笔记(三)——表结构介绍

前言&#xff1a; 这一节将ruoyi框架中数据库中的表结构过一遍&#xff0c;查看都有哪些表及其表结构及关联关系&#xff0c;为后续代码学习做准备。 一 代码生成表记录代码生成的业务表及相关字段1 代码生成业务表 CREATE TABLE gen_table (table_id bigint(20) NOT NULL AUTO…

NFS服务安装与使用

概述 内网需要使用NFS服务挂载到其他服务器&#xff0c;用做数据备份使用。 安装 # Centos yum install -y nfs-utils # Ubuntu apt install nfs-common配置 # 编辑 vim /etc/exports # 输入内容 /public/KOL-ESbackup 172.29.1.0/24 192.168.8.63 192.168.8.64 192.168.8.65(r…

使用adb 发送广播 动态改变app内的值

前言 在开发过程中有时候我们需要做一些调试工作。可以通过adb发送广播实现。 广播注册 注意最后一个参数&#xff0c;Context.RECEIVER_EXPORTED 这是Android 34以后强制要求的&#xff0c;方便外部发送这个广播。否则会报错val filter IntentFilter()filter.addAction("…

【Web安全】逻辑漏洞之URL跳转漏洞:原理、场景与防御

文章目录前言一、漏洞本质二、攻击原理正常跳转流程漏洞触发流程三、抓包的关键时机&#xff1a;跳转参数生成时四、风险场景1.登录/注册后跳转2.退出登录跳转3.分享/广告链接跳转4.密码重置链接跳转五、漏洞挖掘&#xff1a;怎么找到这种漏洞&#xff1f;1.找到跳转参数2.篡改…

新手开发 App,容易陷入哪些误区?

新手开发 App 时&#xff0c;常因对流程和用户需求理解不足陷入误区&#xff0c;不仅拖慢进度&#xff0c;还可能导致产品无人问津。​功能堆砌是最常见的陷阱。不少新手总想 “一步到位”&#xff0c;在初期版本就加入十几项功能&#xff0c;比如做社区团购 App 时&#xff0c…

Linux学习篇11——Linux软件包管理利器:RPM与YUM详解与实战指南,包含如何配置失效的YUM镜像地址

引言 本文主要梳理 Linux 系统中的软件包的概念&#xff0c;同时介绍RPM与YUM两大核心管理工具的常用指令、区别联系以及实战技巧等。本文作为作者学习Linux系统的第11篇文章&#xff0c;依旧旨在总结当前的学习内容&#xff0c;同时巩固知识以便日后的学习复习回顾。如有说的…

Vue3+ElementPlus实现可拖拽/吸附/搜索/收起展开的浮动菜单组件

在开发后台管理系统时&#xff0c;我们经常会用到浮动菜单来快速访问某些功能。本篇文章将分享一个基于 Vue3 ElementPlus 实现的浮动菜单组件&#xff0c;支持拖拽移动、边缘吸附、二级菜单展开、菜单搜索过滤、视频弹窗等交互效果&#xff0c;极大提升了用户操作的便捷性与美…

CSS 盒子模型学习版的理解

文章目录一、盒子模型构建流程&#xff08;一句话抓关键&#xff09;二、核心逻辑提炼三、代码验证四、一句话总结流程通过手绘图示&#xff0c;清晰拆解 Content&#xff08;内容&#xff09;→ Padding&#xff08;内边距&#xff09;→ Border&#xff08;边框&#xff09;→…