ng-captcha
Version:
A pure front-end angular captcha module.
185 lines • 17.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ViewChild, Output, EventEmitter, Input } from '@angular/core';
var CaptchaComponent = /** @class */ (function () {
function CaptchaComponent() {
this.generateCode = new EventEmitter();
this.canvas = document.createElement('canvas');
this.letters = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "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"];
this.code = '';
}
/**
* @return {?}
*/
CaptchaComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.init();
this.refresh();
};
/**
* @return {?}
*/
CaptchaComponent.prototype.onClick = /**
* @return {?}
*/
function () {
this.refresh();
};
/**
* @return {?}
*/
CaptchaComponent.prototype.init = /**
* @return {?}
*/
function () {
this.canvas.width = this.width || 100;
this.canvas.height = this.height || 50;
this.canvas.style.cursor = 'pointer';
this.canvas.innerHTML = '您的浏览器版本不支持canvas';
this.container.nativeElement.appendChild(this.canvas);
};
// generate code
// generate code
/**
* @return {?}
*/
CaptchaComponent.prototype.refresh =
// generate code
/**
* @return {?}
*/
function () {
this.code = '';
/** @type {?} */
var ctx = this.canvas.getContext('2d');
ctx.textBaseline = 'middle';
ctx.fillStyle = this.randomColor(180, 240);
ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
for (var i = 0; i < 4; i++) {
/** @type {?} */
var letter = this.letters[this.randomNum(0, this.letters.length)];
this.code += letter;
ctx.font = this.randomNum(this.canvas.height / 2, this.canvas.height) + 'px SimHei';
ctx.fillStyle = this.randomColor(50, 160);
ctx.shadowOffsetX = this.randomNum(-3, 3);
ctx.shadowOffsetY = this.randomNum(-3, 3);
ctx.shadowBlur = this.randomNum(-3, 3);
ctx.shadowColor = 'rgb(0, 0, 0, 0.3)';
/** @type {?} */
var x = this.canvas.width / 5 * i;
/** @type {?} */
var y = this.canvas.height / 2;
/** @type {?} */
var deg = this.randomNum(-30, 30)
// setting rotate and origin point
;
// setting rotate and origin point
ctx.translate(x, y);
ctx.rotate(deg * Math.PI / 180);
ctx.fillText(letter, 0, 0);
// reset rotate and origin point
ctx.rotate(-deg * Math.PI / 180);
ctx.translate(-x, -y);
}
// draw interfering line
for (var i = 0; i < 4; i++) {
ctx.strokeStyle = this.randomColor(40, 180);
ctx.beginPath();
ctx.moveTo(this.randomNum(0, this.canvas.width), this.randomNum(0, this.canvas.height));
ctx.lineTo(this.randomNum(0, this.canvas.width), this.randomNum(0, this.canvas.height));
ctx.stroke();
}
// draw interfering point
for (var i = 0; i < this.canvas.width / 4; i++) {
ctx.fillStyle = this.randomColor();
ctx.beginPath();
ctx.arc(this.randomNum(0, this.canvas.width), this.randomNum(0, this.canvas.height), 1, 0, 2 * Math.PI);
ctx.fill();
}
this.generateCode.emit(this.code.toLowerCase());
};
/**
* return a random integer
* @param min 最小值
* @param max 最大值
*/
/**
* return a random integer
* @param {?} min 最小值
* @param {?} max 最大值
* @return {?}
*/
CaptchaComponent.prototype.randomNum = /**
* return a random integer
* @param {?} min 最小值
* @param {?} max 最大值
* @return {?}
*/
function (min, max) {
return Math.floor(Math.random() * (max - min) + min);
};
/**
* return a random color
*/
/**
* return a random color
* @param {?=} min
* @param {?=} max
* @return {?}
*/
CaptchaComponent.prototype.randomColor = /**
* return a random color
* @param {?=} min
* @param {?=} max
* @return {?}
*/
function (min, max) {
if (min === void 0) { min = 0; }
if (max === void 0) { max = 255; }
/** @type {?} */
var r = this.randomNum(min, max);
/** @type {?} */
var g = this.randomNum(min, max);
/** @type {?} */
var b = this.randomNum(min, max);
return "rgb(" + r + ", " + g + ", " + b + ")";
};
CaptchaComponent.decorators = [
{ type: Component, args: [{
selector: 'captcha',
template: "<div class=\"captcha-container\" #captchaContainer (click)=\"onClick()\"></div>",
styles: [".captcha-container{display:inline-block;line-height:0}"]
}] }
];
/** @nocollapse */
CaptchaComponent.ctorParameters = function () { return []; };
CaptchaComponent.propDecorators = {
width: [{ type: Input }],
height: [{ type: Input }],
generateCode: [{ type: Output }],
container: [{ type: ViewChild, args: ['captchaContainer',] }]
};
return CaptchaComponent;
}());
export { CaptchaComponent };
if (false) {
/** @type {?} */
CaptchaComponent.prototype.width;
/** @type {?} */
CaptchaComponent.prototype.height;
/** @type {?} */
CaptchaComponent.prototype.generateCode;
/** @type {?} */
CaptchaComponent.prototype.container;
/** @type {?} */
CaptchaComponent.prototype.canvas;
/** @type {?} */
CaptchaComponent.prototype.letters;
/** @type {?} */
CaptchaComponent.prototype.code;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdGNoYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1jYXB0Y2hhLyIsInNvdXJjZXMiOlsibGliL2NhcHRjaGEuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRjtJQWVFO1FBTlUsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBRTNDLFdBQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pDLFlBQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUs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QyxHQUFHLEVBQUUsR0FBRyxDQUFDOztZQUM1QixDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2xDLE9BQU8sU0FBTyxDQUFDLFVBQUssQ0FBQyxVQUFLLENBQUMsTUFBRyxDQUFBO0lBQ2hDLENBQUM7O2dCQXBHRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLDJGQUF1Qzs7aUJBRXhDOzs7Ozt3QkFHRSxLQUFLO3lCQUNMLEtBQUs7K0JBQ0wsTUFBTTs0QkFDTixTQUFTLFNBQUMsa0JBQWtCOztJQTRGL0IsdUJBQUM7Q0FBQSxBQXRHRCxJQXNHQztTQWpHWSxnQkFBZ0I7OztJQUUzQixpQ0FBYzs7SUFDZCxrQ0FBZTs7SUFDZix3Q0FBMkM7O0lBQzNDLHFDQUF3Qzs7SUFDeEMsa0NBQXlDOztJQUN6QyxtQ0FBZ1U7O0lBQ2hVLGdDQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NhcHRjaGEnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FwdGNoYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhcHRjaGEuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIENhcHRjaGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIHdpZHRoXG4gIEBJbnB1dCgpIGhlaWdodFxuICBAT3V0cHV0KCkgZ2VuZXJhdGVDb2RlID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIEBWaWV3Q2hpbGQoJ2NhcHRjaGFDb250YWluZXInKSBjb250YWluZXJcbiAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgbGV0dGVycyA9IFtcIjBcIiwgXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiNVwiLCBcIjZcIiwgXCI3XCIsIFwiOFwiLCBcIjlcIiwgXCJhXCIsIFwiYlwiLCBcImNcIiwgXCJkXCIsIFwiZVwiLCBcImZcIiwgXCJnXCIsIFwiaFwiLCBcImlcIiwgXCJqXCIsIFwia1wiLCBcImxcIiwgXCJtXCIsIFwiblwiLCBcIm9cIiwgXCJwXCIsIFwicVwiLCBcInJcIiwgXCJzXCIsIFwidFwiLCBcInVcIiwgXCJ2XCIsIFwid1wiLCBcInhcIiwgXCJ5XCIsIFwielwiLCBcIkFcIiwgXCJCXCIsIFwiQ1wiLCBcIkRcIiwgXCJFXCIsIFwiRlwiLCBcIkdcIiwgXCJIXCIsIFwiSVwiLCBcIkpcIiwgXCJLXCIsIFwiTFwiLCBcIk1cIiwgXCJOXCIsIFwiT1wiLCBcIlBcIiwgXCJRXCIsIFwiUlwiLCBcIlNcIiwgXCJUXCIsIFwiVVwiLCBcIlZcIiwgXCJXXCIsIFwiWFwiLCBcIllcIiwgXCJaXCJdXG4gIGNvZGUgPSAnJ1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0KClcbiAgICB0aGlzLnJlZnJlc2goKVxuICB9XG5cbiAgb25DbGljaygpIHtcbiAgICB0aGlzLnJlZnJlc2goKVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCkge1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy53aWR0aCB8fCAxMDBcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodCB8fCA1MFxuICAgIHRoaXMuY2FudmFzLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJ1xuICAgIHRoaXMuY2FudmFzLmlubmVySFRNTCA9ICfmgqjnmoTmtY/op4jlmajniYjmnKzkuI3mlK/mjIFjYW52YXMnXG4gICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcylcbiAgfVxuXG4gIC8vIGdlbmVyYXRlIGNvZGVcbiAgcHJpdmF0ZSByZWZyZXNoKCkge1xuICAgIHRoaXMuY29kZSA9ICcnXG4gICAgY29uc3QgY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJ1xuICAgIGN0eC5maWxsU3R5bGUgPSB0aGlzLnJhbmRvbUNvbG9yKDE4MCwgMjQwKVxuICAgIGN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgIGNvbnN0IGxldHRlciA9IHRoaXMubGV0dGVyc1t0aGlzLnJhbmRvbU51bSgwLCB0aGlzLmxldHRlcnMubGVuZ3RoKV1cbiAgICAgIHRoaXMuY29kZSArPSBsZXR0ZXJcbiAgICAgIGN0eC5mb250ID0gdGhpcy5yYW5kb21OdW0odGhpcy5jYW52YXMuaGVpZ2h0IC8gMiwgdGhpcy5jYW52YXMuaGVpZ2h0KSArICdweCBTaW1IZWknXG4gICAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5yYW5kb21Db2xvcig1MCwgMTYwKVxuICAgICAgY3R4LnNoYWRvd09mZnNldFggPSB0aGlzLnJhbmRvbU51bSgtMywgMylcbiAgICAgIGN0eC5zaGFkb3dPZmZzZXRZID0gdGhpcy5yYW5kb21OdW0oLTMsIDMpXG4gICAgICBjdHguc2hhZG93Qmx1ciA9IHRoaXMucmFuZG9tTnVtKC0zLCAzKVxuICAgICAgY3R4LnNoYWRvd0NvbG9yID0gJ3JnYigwLCAwLCAwLCAwLjMpJ1xuICAgICAgY29uc3QgeCA9IHRoaXMuY2FudmFzLndpZHRoIC8gNSAqIGlcbiAgICAgIGNvbnN0IHkgPSB0aGlzLmNhbnZhcy5oZWlnaHQgLyAyXG4gICAgICBjb25zdCBkZWcgPSB0aGlzLnJhbmRvbU51bSgtMzAsIDMwKVxuICAgICAgLy8gc2V0dGluZyByb3RhdGUgYW5kIG9yaWdpbiBwb2ludFxuICAgICAgY3R4LnRyYW5zbGF0ZSh4LCB5KVxuICAgICAgY3R4LnJvdGF0ZShkZWcgKiBNYXRoLlBJIC8gMTgwKVxuICAgICAgY3R4LmZpbGxUZXh0KGxldHRlciwgMCwgMClcbiAgICAgIC8vIHJlc2V0IHJvdGF0ZSBhbmQgb3JpZ2luIHBvaW50XG4gICAgICBjdHgucm90YXRlKC1kZWcgKiBNYXRoLlBJIC8gMTgwKVxuICAgICAgY3R4LnRyYW5zbGF0ZSgteCwgLXkpXG4gICAgfVxuXG4gICAgLy8gZHJhdyBpbnRlcmZlcmluZyBsaW5lXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMucmFuZG9tQ29sb3IoNDAsIDE4MClcbiAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgY3R4Lm1vdmVUbyh0aGlzLnJhbmRvbU51bSgwLCB0aGlzLmNhbnZhcy53aWR0aCksIHRoaXMucmFuZG9tTnVtKDAsIHRoaXMuY2FudmFzLmhlaWdodCkpXG4gICAgICBjdHgubGluZVRvKHRoaXMucmFuZG9tTnVtKDAsIHRoaXMuY2FudmFzLndpZHRoKSwgdGhpcy5yYW5kb21OdW0oMCwgdGhpcy5jYW52YXMuaGVpZ2h0KSlcbiAgICAgIGN0eC5zdHJva2UoKVxuICAgIH1cblxuICAgIC8vIGRyYXcgaW50ZXJmZXJpbmcgcG9pbnRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2FudmFzLndpZHRoIC8gNDsgaSsrKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5yYW5kb21Db2xvcigpXG4gICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgIGN0eC5hcmModGhpcy5yYW5kb21OdW0oMCwgdGhpcy5jYW52YXMud2lkdGgpLCB0aGlzLnJhbmRvbU51bSgwLCB0aGlzLmNhbnZhcy5oZWlnaHQpLCAxLCAwLCAyICogTWF0aC5QSSlcbiAgICAgIGN0eC5maWxsKClcbiAgICB9XG5cbiAgICB0aGlzLmdlbmVyYXRlQ29kZS5lbWl0KHRoaXMuY29kZS50b0xvd2VyQ2FzZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIHJhbmRvbSBpbnRlZ2VyXG4gICAqIEBwYXJhbSBtaW4g5pyA5bCP5YC8XG4gICAqIEBwYXJhbSBtYXgg5pyA5aSn5YC8XG4gICAqL1xuICBwcml2YXRlIHJhbmRvbU51bShtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSByYW5kb20gY29sb3JcbiAgICovXG4gIHByaXZhdGUgcmFuZG9tQ29sb3IobWluID0gMCwgbWF4ID0gMjU1KSB7XG4gICAgY29uc3QgciA9IHRoaXMucmFuZG9tTnVtKG1pbiwgbWF4KVxuICAgIGNvbnN0IGcgPSB0aGlzLnJhbmRvbU51bShtaW4sIG1heClcbiAgICBjb25zdCBiID0gdGhpcy5yYW5kb21OdW0obWluLCBtYXgpXG4gICAgcmV0dXJuIGByZ2IoJHtyfSwgJHtnfSwgJHtifSlgXG4gIH1cblxufVxuIl19