UNPKG

web-utils-super

Version:

前端函数库

126 lines (120 loc) 4.21 kB
const getLetter = require('../string/getAllLetter') const randomNum = require('../random/randomNum') const randomColorRGB = require('../random/randomColorRGB') class GVerify { constructor(options, code) { //创建一个图形验证码对象,接收options对象为参数 this.size = code.length; //设置验证码长度 this.options = { //默认options参数值 id: "", //容器Id canvasId: "verifyCanvas", //canvas的ID width: "100", //默认canvas宽度 height: "30", //默认canvas高度 type: "blend", //图形验证码默认类型blend:数字字母混合类型、number:纯数字、letter:纯字母 code: code, }; if (Object.prototype.toString.call(options) == "[object Object]") { //判断传入参数类型 for (let i in options) { //根据传入的参数,修改默认参数值 this.options[i] = options[i]; } } else { this.options.id = options; } this.options.canvasId = this.options.canvasId + '_' + this.options.id this.options.numArr = "0,1,2,3,4,5,6,7,8,9".split(","); this.options.letterArr = getLetter(); this._init(); this.refresh(); } /**初始化方法**/ _init() { let con = document.getElementById(this.options.id); let canvas = document.createElement("canvas"); this.options.width = con.offsetWidth > 0 ? con.offsetWidth : "100"; this.options.height = con.offsetHeight > 0 ? con.offsetHeight : "30"; 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); } /**生成验证码**/ refresh(code = "") { this.options.code = code ? code : this.options.code; this.size = this.options.code.length; let canvas = document.getElementById(this.options.canvasId); let ctx = null; if (canvas.getContext) { ctx = canvas.getContext("2d"); } else { return; } ctx.textBaseline = "middle"; ctx.fillStyle = randomColorRGB(180, 240); ctx.fillRect(0, 0, this.options.width, this.options.height); for (let i = 0; i < this.size; i++) { let txt = this.options.code[i]; // this.options.code += txt; ctx.font = randomNum(this.options.height / 2, this.options.height) + "px SimHei"; //随机生成字体大小 ctx.fillStyle = randomColorRGB(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)"; let x = (this.options.width / (this.size + 1)) * i; let y = this.options.height / 2; let 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 (let i = 0; i < this.size - 1; i++) { ctx.strokeStyle = randomColorRGB(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 (let i = 0; i < this.options.width / this.size; i++) { ctx.fillStyle = randomColorRGB(0, 255); ctx.beginPath(); ctx.arc( randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI ); ctx.fill(); } } /**验证验证码**/ validate(code) { code = code.toLowerCase(); let v_code = this.options.code.toLowerCase(); if (code == v_code) { return true; } else { this.refresh(); return false; } } } module.exports = GVerify;