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

【HTML】纯前台字符验证码

效果图:

大致思路:

1.在<canvas>画布里写出几个字符;

2.给字符一个随机的角度和颜色;

3.给字符上画出一些干扰线和干扰点。


<canvas width="100" height="30" id="canvasRef" @click="handleDrawCode"></canvas>
      /** 生成并渲染出验证码图形 */handleDrawCode () {const CanvasRef = document.getElementById('canvasRef');this.showCode = '';const canvasWidth = CanvasRef.width;const canvasHeight = CanvasRef.height;const context = CanvasRef.getContext('2d'); // 获取到canvas画图的环境context.clearRect(0, 0, canvasWidth, canvasHeight);const sCode = 'A,B,C,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,m,n,p,q,r,s,t,u,v,w,x,y,z,1,2,3,4,5,6,7,8,9,0';const aCode = sCode.split(',');const aLength = aCode.length; // 获取到数组的长度// 这里获取4位验证码for (let i = 0; i < 4; i++) { const j = Math.floor(Math.random() * aLength); // 获取到随机的索引值const deg = Math.random() - 0.5; // 产生一个随机弧度const txt = aCode[j]; // 得到随机的一个内容this.showCode += txt.toLowerCase(); // 转小写const x = 10 + i * 20; // 文字在canvas上的x坐标const y = 20 + Math.random() * 8; // 文字在canvas上的y坐标context.font = '0.5rem 微软雅黑';context.translate(x, y);context.rotate(deg);context.fillStyle = this.getColor();context.fillText(txt, 0, 0);context.rotate(-deg);context.translate(-x, -y);}// 验证码上显示5根线条for (let i = 0; i <= 5; i++) { context.strokeStyle = this.getColor();context.beginPath();context.moveTo(Math.random() * canvasWidth, Math.random() * canvasHeight);context.lineTo(Math.random() * canvasWidth, Math.random() * canvasHeight);context.stroke();}// 验证码上添加20个小点for (let i = 0; i <= 20; i++) { context.strokeStyle = this.getColor(); // 随机生成context.beginPath();const x = Math.random() * canvasWidth;const y = Math.random() * canvasHeight;context.moveTo(x, y);context.lineTo(x + 1, y + 1);context.stroke();}},/** 得到随机的颜色值 */getColor () {const r = Math.floor(Math.random() * 256);const g = Math.floor(Math.random() * 256);const b = Math.floor(Math.random() * 256);return 'rgb(' + r + ',' + g + ',' + b + ')';},
canvas {margin-left: 2rem;vertical-align: middle;/*vertical-align属性设置一个元素的垂直对齐。*/box-sizing: border-box;border: 1px solid #ddd;cursor: pointer;background-color: #eee;}

本文参考 vue/js图形校验码验证 - 简书 来写,原文直接放来我的项目里有些问题,做了一些改动,作为学习笔记供有需要的人参考。

相关文章:

【HTML】纯前台字符验证码

效果图&#xff1a; 大致思路&#xff1a; 1.在<canvas>画布里写出几个字符&#xff1b; 2.给字符一个随机的角度和颜色&#xff1b; 3.给字符上画出一些干扰线和干扰点。 <canvas width"100" height"30" id"canvasRef" click"…...

如何在 Vue.js 项目中动态设置页面标题

目录 方法 1:使用 Vue Router 的元信息(meta) 步骤 1: 配置路由元信息 步骤 2: 使用路由守卫设置标题 方法 2:在组件内设置标题 在组件挂载时设置标题 使用响应式数据动态更新标题 在开发 Vue.js 应用时,设置动态页面标题是常见需求,尤其当应用包含多个页面时,为每…...

Eval绕过限制参数限制

PHP Eval函数参数限制在16个字符 PHP代码 <?php$param $_REQUEST[param]; if (strlen($param) < 17 && stripos($param, eval) false && stripos($param, assert) false){eval($param);}?># 部署环境属于ubuntu系统 通过GET传参绕过 由于是…...

计算机网络408考研 2021

2021 计算机网络408考研2021年真题解析_哔哩哔哩_bilibili 1 1 11 1 1 11...

element table表格树形数据展示

element table表格树形数据展示 1、效果 2、代码 <el-table ref"pointMultipleTable" border class"table-box" :data"[damActiveObj]"row-key"id" :tree-props"{ children: children }" :expand-row-keys"expand…...

Ubuntu 安装 Snipaste

一、下载 Snipaste 下载Snipastehttps://zh.snipaste.com/ 二、在/opt 创建 Snipaste 目录&#xff0c;创建 bin 和 icon 子目录&#xff0c;将 Snipaste.AppImage 移动到 bin 目录 三、创建快捷键图标 1. 创建桌面图标&#xff0c;右键→允许运行 yammiemy-pc >/home/y…...

NET8环境WebAPI实现文件的压缩及下载

目录 1、文件下载的原理2、具体实现2.1 提前准备2.2 服务器端的实现2.3 请求端的实现 3、代码下载4、更多特性4.1 单独压缩文件4.2 解析4.2.1 整体解析4.2.2 单个文件解析 4.3 其他4.3.1 设置压缩级别4.3.2 密码保护4.3.3 进度反馈 5、参考资料 1、文件下载的原理 在实际应用环…...

Ubuntu 18 使用NVIDIA上的HDMI输出声音

前言 在未做修改之前&#xff0c;Settings -> Sound -> Output 里面只有 Digital Output(S/PDIF) - Built-in Audio 不显示HDMI的输出设备检查当前存在的音频设备 sudo lspci -v | grep -A7 -i "audio"输出&#xff1a; 从输出可以看出来是有两个设备的 00:1…...

C#模拟量线性变换小程序

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏4次。本文详细介绍了如何使用C#构建一个项目,通过S7net库连接并连续读取S7-1200 PLC的数据,包括创建窗体应用、配置存储位置、安装S7net库…...

跟《经济学人》学英文:2024年08月10日这期 How AI models are getting smarter

How AI models are getting smarter Deep neural networks are learning diffusion and other tricks 原文&#xff1a; Type in a question to ChatGPT and an answer will materialise. Put a prompt into DALL-E 3 and an image will emerge. Click on TikTok’s “for y…...

Spring Web MVC入门(上)

1. Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为“spring MVC”&#xff1b; 什么是Servlet呢? Servlet…...

【c++】公差判断函数 isInTolerance

定义&#xff1a; isInTolerance 函数用来判断一个特定数值&#xff08;变量&#xff09;是否在以某个中心值为基准 &#xff0c;给定半径的范围内。这个函数包含了一个可选的参数 includeEndpoints&#xff08;默认为 true&#xff09;&#xff0c; 用于决定范围是否包含其端点…...

电脑新加的硬盘如何分区?新加硬盘分区选MBR还是GPT

最近有网友问我,电脑新加的硬盘如何分区?电脑新加的硬盘分区选MBR还是GPT要看引导模式采用uefi还是传统的legacy模式&#xff0c;如果采用的是uefi引导模式&#xff0c;分区类型对应的就是gpt分区(guid)&#xff0c;如果引导模式采用的是legacy&#xff0c;对应的分区类型为mb…...

白骑士的Matlab教学基础篇 1.3 控制流

系列目录 上一篇&#xff1a;白骑士的Matlab教学基础篇 1.2 MATLAB基础语法 控制流是编程中的核心概念&#xff0c;通过控制程序执行的顺序&#xff0c;从而实现复杂的逻辑操作。MATLAB 提供了多种控制流语句&#xff0c;包括条件语句、循环语句以及循环控制语句。掌握这些控制…...

设计模式 - 适配器模式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、适配器…...

docker部署minIO

docker部署minIO 旧版本新版本 旧版本 #-u 以root用户运行容器&#xff1b;--privilegedtrue 给予容器命令访问权限 docker pull minio/minio:RELEASE.2021-06-17T00-10-46Z docker run -p 9001:9000 --name minio -d \-u root --privilegedtrue \-e "MINIO_ROOT_USERmin…...

「Pytorch」BF16 Mixed Precision Training

在深度学习领域&#xff0c;神经网络的训练性能瓶颈常常出现在 GPU显存的使用上。主要表现为两方面&#xff1a; 单卡上可容纳的模型和数据量有限&#xff1b;显存与计算单元之间的带宽和延迟限制了运算速度&#xff1b; 为了解决显卡瓶颈的问题&#xff0c;涌现了不同的解决…...

论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024

还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图&#xff0c;而《E…...

LLMOps — 使用 BentoML 为 Llama-3 模型提供服务

使用 BentoML 和 Runpod 快速设置 LLM API 经常看到数据科学家对 LLM 的开发感兴趣&#xff0c;包括模型架构、训练技术或数据收集。然而&#xff0c;我注意到&#xff0c;很多时候&#xff0c;除了理论方面&#xff0c;许多人在以用户实际使用的方式提供这些模型时遇到了问题…...

微软蓝屏事件揭秘:有问题的数据引发内存读取越界

讲动人的故事&#xff0c;写懂人的代码 CrowdStrike前一阵在官网上发布了上周爆发的全球企业微软蓝屏事件的官方初步复盘结果。其中谈到了这次事件的根本原因&#xff1a; 2024年7月19日&#xff0c;我们部署了两个额外的IPC模板实例。由于内容验证器中的一个bug&#xff0c;使…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...