纯前端实现加减运算验证码

纯前端实现加减运算验证码

实现效果
在这里插入图片描述
//页面展示

	<template><view class="form-input-item" style="padding:8rpx 22rpx;"><input class="form-input" placeholder="请输入验证码" type="text" maxlength="6" confirm-type="next" placeholder-class="placeholder" name="code" v-model="code"></input>	<view ><div id="v_container" style="width:220rpx;height:82rpx;"></div></view></view></template>
<script>import { gvertify } from '@/common/gvertify'   //引入mounted() {this.verifyCode = new gvertify('v_container')  }//提交表单验证
if (this.code) {const verifyFlag = this.verifyCode.validate(this.code);console.log(verifyFlag);if (!verifyFlag) {this.$u.toast('请输入正确的验证码');return false} }
</script>

封装的插件

function gvertify(options) { // 创建一个图形验证码对象,接收options对象为参数this.options = { // 默认options参数值id: 'canvas', // 容器IdcanvasId: 'verifyCanvas', // canvas的IDwidth: '100%', // 默认canvas宽度height: '100%', // 默认canvas高度type: 'number', // 图形验证码默认类型blend:数字字母混合类型、number:纯数字、letter:纯字母code: ''}if (Object.prototype.toString.call(options) === '[object Object]') { // 判断传入参数类型for (var i in options) { // 根据传入的参数,修改默认参数值this.options[i] = options[i]}} else {this.options.id = options}this.options.numArr = '0,1,2,3,4,5,6,7,8,9'.split(',')this.options.letterArr = getAllLetter()this._init()this.refresh()
}gvertify.prototype = {/** 版本号**/version: '1.0.0',/** 初始化方法**/_init: function() {var con = document.getElementById(this.options.id)var canvas = document.createElement('canvas')// this.options.width = con.offsetWidth > 0 ? con.offsetWidth : '30'// this.options.height = con.offsetHeight > 0 ? con.offsetHeight : '30'this.options.width = con.offsetWidththis.options.height = '40'canvas.id = this.options.canvasIdcanvas.width = this.options.widthcanvas.height = this.options.heightcanvas.style.cursor = 'pointer'canvas.innerHTML = '您的浏览器版本不支持canvas'con.appendChild(canvas)var parent = thiscanvas.onclick = function() {parent.refresh()}},/** 生成验证码**/refresh: function() {var canvas = document.getElementById(this.options.canvasId)if (canvas.getContext) {var ctx = canvas.getContext('2d')}ctx.textBaseline = 'middle'ctx.fillStyle = randomColor(180, 240)ctx.fillRect(0, 0, this.options.width, this.options.height)if (this.options.type === 'blend') { // 判断验证码类型var txtArr = this.options.numArr.concat(this.options.letterArr)} else if (this.options.type === 'number') {// eslint-disable-next-line no-redeclarevar txtArr = this.options.numArr} else {// eslint-disable-next-line no-redeclarevar txtArr = this.options.letterArr}this.options.code = []for (var i = 1; i <= 3; i++) {var txt = txtArr[randomNum(0, txtArr.length)]ctx.font = randomNum(this.options.height, this.options.height) + 'px SimHei' // 随机生成字体大小ctx.fillStyle = randomColor(50, 160) // 随机生成字体颜色ctx.shadowOffsetX = randomNum(-3, 3)ctx.shadowOffsetY = randomNum(-3, 3)ctx.shadowBlur = randomNum(-3, 3)ctx.shadowColor = 'rgba(0, 0, 0, 0.3)'var x = this.options.width / 5 * ivar y = this.options.height / 2var deg = randomNum(-30, 30)/** 设置旋转角度和坐标原点**/ctx.translate(x, y)ctx.rotate(deg * Math.PI / 180)// 中间符号if (i === 2) {const index = randomNum(0, 3)const fuhao = ['+', '-', '*'][index]console.log(fuhao)ctx.fillText(fuhao, 0, 0)this.options.code.push(fuhao)} else {ctx.fillText(txt, 0, 0)this.options.code.push(Number(txt))}/** 恢复旋转角度和坐标原点**/ctx.rotate(-deg * Math.PI / 180)ctx.translate(-x, -y)}/** 绘制干扰线**/// eslint-disable-next-line no-redeclarefor (var i = 0; i < 4; i++) {ctx.strokeStyle = randomColor(40, 180)ctx.beginPath()ctx.moveTo(randomNum(0, this.options.width), randomNum(0, this.options.height))ctx.lineTo(randomNum(0, this.options.width), randomNum(0, this.options.height))ctx.stroke()}/** 绘制干扰点**/// eslint-disable-next-line no-redeclarefor (var i = 0; i < this.options.width / 4; i++) {ctx.fillStyle = randomColor(0, 255)ctx.beginPath()ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI)ctx.fill()}},/** 验证验证码**/validate: function(code) {// eslint-disable-next-line no-redeclarevar code = Number(code)var v_codeif (this.options.code[1] === '-') {v_code = this.options.code[0] - this.options.code[2]} else if (this.options.code[1] === '+') {v_code = this.options.code[0] + this.options.code[2]} else if (this.options.code[1] === '*') {v_code = this.options.code[0] * this.options.code[2]}console.log(this.options.code, v_code, code)if (code === v_code) {return true} else {return false}}
}
/** 生成字母数组**/
function getAllLetter() {var letterStr = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z'return letterStr.split(',')
}
/** 生成一个随机数**/
function randomNum(min, max) {return Math.floor(Math.random() * (max - min) + min)
}
/** 生成一个随机色**/
function randomColor(min, max) {var r = randomNum(min, max)var g = randomNum(min, max)var b = randomNum(min, max)return 'rgb(' + r + ',' + g + ',' + b + ')'
}export {gvertify
}

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

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

相关文章

使用Python读写Redis——Lists

之前详细介绍了 Redis命令 - Lists命令组常用命令&#xff0c;同样的命令&#xff0c;本文将用python调用redis库封装好的方法。 要操作的Lists命令如下 1、LSET key index value 2、LINSERT key BEFORE|AFTER pivot value 3、LPUSH key value [value …] 4、RPUSH key value …

【加速排坑】docker设置国内image镜像源

第零步&#xff0c;查看阿里最新的镜像源&#xff1a;https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 第一步&#xff1a;在/etc/docker/daemon.json中添加镜像源 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-m…

C++随机数生成:std标准库和Qt自带方法

std标准库 std::rand()是C中的一个随机数函数&#xff0c;它生成一个范围在0到RAND_MAX之间的伪随机整数。 在使用std::rand()之前&#xff0c;需要包含<cstdlib>头文件。 #include <cstdlib> 设置种子 在每次程序运行时&#xff0c;通常需要使用不同的种子值…

基于pyqt5+scapy 根据ip 具体端口 进行扫描 的程序

先给出代码 import sysfrom PyQt5 import uic from PyQt5.QtWidgets import *from scapy.all import * import argparse import logging from scapy.layers.inet import IP, TCP from scapy.sendrecv import sr1class MyWindow(QWidget):def __init__(self):super().__init__(…

【QML COOK】- 010-动态创建组件

上节介绍了Component的概念&#xff0c;本节介绍一下如何使用javascript动态创建对象。 1. 创建工程&#xff0c;新建一个MyComponent.qml的qml import QtQuickRectangle {color: "red" }它很简单就是一个红色框 2. 编辑main.qml import QtQuickWindow {id: root…

Vscode 上安装 Compilot

GitHub Copilot 是由 OpenAI 和 GitHub 开发的 AI 工具。其目的是通过自动完成代码来帮助开发人员使用集成开发环境 &#xff08;IDE&#xff09;&#xff0c;如 Visual Studio Code。它目前仅作为技术预览版提供&#xff0c;因此只有已在候补名单上被接受的用户才能访问它。对…

MySQL 管理端口

错误 客户出现 MySQL连接数 超过 最大连接数的现象 ERROR 1040 (HY000): Too many connections 出现该现象&#xff0c;一般的解决方法&#xff1a; 1.修改配置文件中的最大连接数&#xff0c;之后重启数据库 2.如果配置文件中没有设置 连接超时时间的参数。8小时后&#…

xbox如何提升下载速度

Xbox下载速度慢的问题通常是由于网络环境或微软服务器的问题。以下是一些提升Xbox下载速度的方法&#xff1a; 使用加速器&#xff1a;如果您的网络环境不稳定或存在其他问题&#xff0c;可以使用加速器来优化网络环境&#xff0c;从而提高下载速度。检查网络连接&#xff1a;…

gin-vue-admin二开使用雪花算法生成唯一标识 id

场景介绍 需求场景&#xff1a; 总部采集分支的数据&#xff0c;由于分支的 id 是子增的主键 id&#xff0c;所以会出现重复的 id&#xff0c;但是这个 id 需要作为标识&#xff0c;没有实际作用&#xff0c;这里选择的是分布式 id 雪花算法生成 id 存储用来标识&#xff0c;这…

GAMES104-现代游戏引擎:从入门到实践 - 物理引擎课程笔记汇总

文章目录 0 入门资料1 物理引擎基本概念Actor & shapesRigid body dynamicsCollision DetectionCollision Resolution 应用与实践Character controllerRagdoll 0 入门资料 GAMES104-现代游戏引擎&#xff1a;从入门到实践_课程视频_bilibiliGAMES104官方账号 - 知乎课程主页…

微服务实战项目_天机学堂01_初识项目

文章目录 一.项目简述二.Jenkins三.模拟真实业务:紧急bug修复和代码阅读 一.项目简述 Q:天机学堂是什么? A:天机学堂是一个基于微服务架构的生产级在线教育项目 主要有两个端(项目已上线,可以点击查看): 管理后台: https://tjxt-admin.itheima.net 其核心业务主体包括老师、…

QT上位机开发(dock窗口在软件布局中的应用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在软件开发中&#xff0c;一般有主窗口和子窗口之分。主窗口也就是main window&#xff0c;是最重要的操作界面。子窗口就是各种属性配置、参数配置…

NOIP2018提高组day2 - T1:旅行

题目链接 [NOIP2018 提高组] 旅行 题目描述 小 Y 是一个爱好旅行的 OIer。她来到 X 国&#xff0c;打算将各个城市都玩一遍。 小 Y 了解到&#xff0c;X 国的 n n n 个城市之间有 m m m 条双向道路。每条双向道路连接两个城市。 不存在两条连接同一对城市的道路&#xff…

uniapp使用安装sass

1.首先你要安装node-sass npm install node-sass --save-dev2.安装sass-loader npm install sass-loader --save-dev3.修改style标签&#xff0c;声明使用sass <style lang"scss" scoped>

做完十年数据分析后的思考与总结

种一棵树最好的时间是十年前&#xff0c;其次是现在。十年了&#xff0c;本次分享大多来自工作中的日常所思所想&#xff0c;欢迎自取。 01 数据分析的本质 数据是基础&#xff0c;分析才是重点。 行业内有专门的统计岗&#xff0c;就是只负责做好数据统计就可以了&#xff0…

【Python】PyCharm设置控制台输出的行数限制

在使用PyCharm的时候&#xff0c;如果在控制台输出的信息过多室&#xff0c;控制台仅会保留一部分的输出信息。想要改变这个限制&#xff0c;设置方法如下&#xff1a; 进入到PyCharm的安装目录下&#xff0c;我的是C:\Develop\PyCharm202303\PyCharm 2023.3进入bin找到文件id…

sqlite | c++ | demo

sqlite 过得的废话 就不细说了 接下来&#xff0c;主要讲 安装sqlite 然后写一个demo &#xff0c;然后再shell 命令操作sqlite #安装 sqlite 程序 以及开发包 我的linux 环境是centos sudo yum install sqlite-3.7.17-8.el7_7.1.x86_64 sqlite-devel#输入 sqlite3 测试是否安装…

django后台登录:Forbidden (403) CSRF verification failed. Request aborted.

如果您在尝试登录Django后台时遇到了CSRF验证失败的错误&#xff0c;这通常意味着您的浏览器未能提交正确的CSRF令牌&#xff0c;或者Django后端未能验证该令牌。遵循以下步骤来解决这个问题&#xff1a; 清除浏览器Cookies和缓存&#xff1a; 有时候&#xff0c;浏览器的Cooki…

Linux systemd的概述与发展历程

systemd是一个系统和服务管理器&#xff0c;广泛用于现代Linux系统。它的设计目标是取代传统的SysVinit作为Linux系统的初始化系统&#xff0c;提供更快的启动速度、更好的并行性和更多的功能。本文将对systemd进行概述&#xff0c;并探讨其发展历程。 初始化系统 systemd负责…

C++:运算符重载

运算符重载的基本概念 与函数重载相似&#xff0c;运算符也存在重载问题。C为了解决一些实际问题&#xff0c;允许重载现有的大多数运算符&#xff0c;即允许给已有的运算符赋予新的含义&#xff0c;从而提高C的可扩展性&#xff0c;针对同样的操作&#xff0c;使用重载运算符…