首页 > 其他分享 >verifyCode.js

verifyCode.js

时间:2023-12-11 14:13:14浏览次数:39  
标签:canvas verifyCode js width var height options con

function GVerify(options) {
  // 创建一个图形验证码对象,接收options对象为参数
  this.options = {
    // 默认options参数值
    id: "", // 容器Id
    canvasId: "verifyCanvas", // canvas的ID
    width: "80", // 默认canvas宽度
    height: "30", // 默认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();
}

GVerify.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 = "160";
    this.options.height = "50";
    canvas.id = this.options.canvasId;
    canvas.width = this.options.width;
    canvas.height = this.options.height;
    canvas.style.cursor = "pointer";
    canvas.innerHTML = "您的浏览器版本不支持canvas";
    con.appendChild(canvas);
    var parent = this;
    canvas.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") {
      var txtArr = this.options.numArr;
    } else {
      var txtArr = this.options.letterArr;
    }

    for (var i = 1; i <= 4; i++) {
      var txt = txtArr[randomNum(0, txtArr.length)];
      this.options.code += txt;
      ctx.font =
        randomNum(this.options.height / 2, 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) * i;
      var y = this.options.height / 2;
      var deg = randomNum(-30, 30);
      /** 设置旋转角度和坐标原点**/
      ctx.translate(x, y);
      ctx.rotate((deg * Math.PI) / 180);
      ctx.fillText(txt, 0, 0);
      /** 恢复旋转角度和坐标原点**/
      ctx.rotate((-deg * Math.PI) / 180);
      ctx.translate(-x, -y);
    }
    /** 绘制干扰线**/
    for (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();
    }
    /** 绘制干扰点**/
    for (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) {
    var code = code.toLowerCase();
    var v_code = this.options.code.toLowerCase();
    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 { GVerify };

 

标签:canvas,verifyCode,js,width,var,height,options,con
From: https://www.cnblogs.com/dianzan/p/17894253.html

相关文章

  • 232-父级div,包含子div,子div有点击事件,父div有点击事件,js如何实现,2个点击事件不干扰
    HTML结构<divid="parent"><divid="child"></div></div>JavaScript/jQuery代码:$(document).ready(function(){//父级div的点击事件处理程序$('#parent').on('click',function(){console.log(&#......
  • js获取当前页面域名判断跳转网址输出不同内容
    js代码可以实现一些html语言无法实现的功能,比如通过js代码获取当前访问的域名。通过js代码判断当前访问域名可以进行跳转等功能。js获取当前页面域名判断跳转网址代码:<scripttype="text/javascript"> host=window.location.host;if(host=="www.adminwl.com") { window.loca......
  • CommonJS 模块
    在Node.js中,每个文件都被视为一个单独的模块。CommonJS模块系统在 module 核心模块中实现。启用Node.js有两个模块系统:CommonJS模块和 ECMAScript模块。默认情况下,Node.js会将以下内容视为CommonJS模块:扩展名为 .cjs 的文件;当最近的父 package.json 文件......
  • 前端纯js字符串拼接导出excel
    1<html>2<head>3<pstyle="font-size:20px;color:red;">使用a标签方式将json导出csv文件</p>4<buttononclick='tableToExcel()'>导出</button>5</head>6<body>7<script>8......
  • js(canvas) 图片压缩
    1functioncompress(url,width,height){2returnnewPromise((resolve,reject)=>{3letimg=document.createElement('img')4img.onload=()=>{5letw=width6leth=img.naturalH......
  • MyBatis-Plus 自定义 TypeHandler 映射JSON类型为List
    1在mysql5.7支持json类型,那么在表实体是怎么运用的在mybatis-plus中有相关的handler/***Jackson实现JSON字段类型处理器**@authorhubin*@since2019-08-25*/@Slf4j@MappedTypes({Object.class})@MappedJdbcTypes(JdbcType.VARCHAR)publicclassJackso......
  • NodeJS项目build成为本地镜像上传阿里云ACR
    先注册阿里云账号选择“容器镜像服务”->“个人实例”。由于是测试目的,个人版也可以接受。创建命名空间创建镜像仓库选择本地仓库-本示例会从本机推送镜像创建成功后,会有提示相关命令创建一个nodejs项目package.json{"name":"docker_web_app","versio......
  • 安装jsdom/tough-cookie 【Error: Cannot find module ‘jsdom‘】的解决方法
    本人使用nvm安装的node解决方法:cmd管理员模式下npminstallnpminstall-gjsdomtough-cookie与上同理再把目录放到环境变量中参考:https://blog.csdn.net/qyk594760/article/details/134353102https://blog.csdn.net/JJ_Smilewang/article/details/127823953......
  • Js(Javascript)中的apply方法的使用
    ​ JavaScript中的apply()方法用于调用函数,允许指定函数的this对象和参数。也就是通过function的apply方法来调用方法,可以改变方法的this的对象,并且还可以传入方法参数,apply对于面向对象编程还是很有用的。参考文档:Js(Javascript)中的apply方法的使用-CJavaPy1、基本语......
  • NestJS 筑基:TypeScript 类和装饰器
    前言先回顾下前文中介绍了哪些内容:使用@nestjs/cli创建和管理Nest应用Hello,World示例代码分析Nest基本概念:模块,控制器,服务常用的装饰器:@Module、@Controller、@Get、@InjectableNest目录结构分析@nest/cli脚手架的命令本文先不继续讲解Nest中的内容,而是打算介绍TypeSc......