UNPKG

ng-captcha

Version:

A pure front-end angular captcha module.

185 lines 17.8 kB
/** * @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