web-utils-super
Version:
前端函数库
126 lines (120 loc) • 4.21 kB
JavaScript
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;