123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- (function(){
- window.H5lock = function(obj){
- this.chooseType = Number(PublicLib.getCookieInfo('chooseType')) || obj.chooseType;
- this.linwidth = obj.linwidth
- this.successcolor = obj.successcolor
- this.successbgcolor = obj.successbgcolor
- this.wariningcolor = obj.wariningcolor
- this.wariningbgcolor = obj.wariningbgcolor
- this.initcolor = obj.initcolor
- this.inr = obj.inr
- this.outr = obj.outr
- this.initr = obj.initr
- this.isinput = obj.isinput
- this.range = obj.range
- };
- H5lock.prototype.drawCle = function(x, y,) { // 初始化解锁密码面板
- this.drawStatusPoint(this.successcolor)
- this.ctx.fillStyle = this.initcolor;
- this.ctx.beginPath();
- this.ctx.arc(x, y, this.initr * window.devicePixelRatio, 0, Math.PI * 2, true);
- this.ctx.closePath();
- this.ctx.fill();
- }
- H5lock.prototype.drawPoint = function(color,colorout) { // 初始化外环
- for (var i = 0 ; i < this.lastPoint.length ; i++) {
- this.ctx.fillStyle = colorout;
- this.ctx.beginPath();
- this.ctx.arc(this.lastPoint[i].x, this.lastPoint[i].y, this.outr * window.devicePixelRatio, 0, Math.PI * 2, false);
- this.ctx.closePath();
- this.ctx.fill();
- this.ctx.fillStyle = color;
- this.ctx.beginPath();
- this.ctx.arc(this.lastPoint[i].x, this.lastPoint[i].y, this.inr * window.devicePixelRatio, 0, Math.PI * 2, true);
- this.ctx.closePath();
- this.ctx.fill();
- }
- }
- H5lock.prototype.drawStatusPoint = function(type) { // 初始化状态线条
- for (var i = 0 ; i < this.lastPoint.length ; i++) {
- this.ctx.strokeStyle = type;
- this.ctx.beginPath();
- this.ctx.closePath();
- // 这是内环外边框
- // this.ctx.arc(this.lastPoint[i].x - 10, this.lastPoint[i].y, 0, Math.PI * 2, true);
- // this.ctx.stroke();
- }
- }
- H5lock.prototype.drawLine = function(po,color) {// 解锁轨迹
- this.ctx.beginPath();
- this.ctx.lineWidth = this.linwidth * window.devicePixelRatio;
- this.ctx.strokeStyle = color
- this.ctx.moveTo(this.lastPoint[0].x, this.lastPoint[0].y);
- for (var i = 1 ; i < this.lastPoint.length ; i++) {
- this.ctx.lineTo(this.lastPoint[i].x, this.lastPoint[i].y);
- }
- this.ctx.lineTo(po.x, po.y);
- this.ctx.stroke();
- this.ctx.closePath();
- }
-
- H5lock.prototype.createCircle = function() {// 创建解锁点的坐标,根据canvas的大小来平均分配半径
- var n = this.chooseType;
- var count = 0;
- this.r = this.ctx.canvas.width / (2 + 7.5 * n);// 公式计算
- var r = this.r;
- for (var i = 0 ; i < n ; i++) {
- for (var j = 0 ; j < n ; j++) {
- count++;
- var obj = {
- x: j * 8 * r + 4 * r,
- y: i * 8 * r + 4 * r,
- index: count
- };
- this.arr.push(obj);
- this.restPoint.push(obj);
- }
- }
- this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
- for (var i = 0 ; i < this.arr.length ; i++) {
- this.drawCle(this.arr[i].x, this.arr[i].y);
- }
- //return arr;
- }
- H5lock.prototype.getPosition = function(e) {// 获取touch点相对于canvas的坐标
- var rect = e.currentTarget.getBoundingClientRect();
- var po = {
- x: (e.touches[0].clientX - rect.left) * window.devicePixelRatio,
- y: (e.touches[0].clientY - rect.top) * window.devicePixelRatio
- };
- return po;
- }
- H5lock.prototype.update = function(po) {// 核心变换方法在touchmove时候调用
- this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
- for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来
- this.drawCle(this.arr[i].x, this.arr[i].y);
- }
- this.drawPoint(this.successcolor,this.successbgcolor);// 每帧画轨迹
- this.drawLine(po ,this.successcolor);// 每帧画圆心
- console.log(window.devicePixelRatio)
- for (var i = 0 ; i < this.restPoint.length ; i++) {
- if (Math.abs(po.x - this.restPoint[i].x) < this.range * window.devicePixelRatio && Math.abs(po.y - this.restPoint[i].y) < this.range * window.devicePixelRatio) {
- this.lastPoint.push(this.restPoint[i]);
- this.restPoint.splice(i, 1);
- break;
- }
- }
- }
- H5lock.prototype.checkPass = function(psw1, psw2) {// 检测密码
- var p1 = '',
- p2 = '';
- for (var i = 0 ; i < psw1.length ; i++) {
- p1 += psw1[i].index + psw1[i].index;
- }
- for (var i = 0 ; i < psw2.length ; i++) {
- p2 += psw2[i].index + psw2[i].index;
- }
- return p1 === p2;
- }
- H5lock.prototype.storePass = function(psw) {// touchend结束之后对密码和状态的处理
- const password = []
- psw.forEach(item=>{
- password.push(item.index)
- })
- console.log(password)
- if (this.pswObj.step == 1) {
- if (this.checkPass(this.pswObj.fpassword, psw)) {
- this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
- for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来
- this.drawCle(this.arr[i].x, this.arr[i].y);
- }
- this.drawPoint(this.successcolor,this.successbgcolor)
- this.drawLine( this.lastPoint,this.successcolor);// 每帧画圆心
- this.pswObj.step = 2;
- this.pswObj.spassword = psw;
- document.getElementById('title').innerHTML = '密码设置成功';
- // 跳转至主页面
- if(this.isinput) {
- setTimeout(() => {
- document.getElementById('inputpassword').click()
- }, 500);
- } else {
- // NEXTTODO
- setTimeout(() => {
- document.getElementById('comeback').click()
- }, 500);
- }
- PublicLib.putCookieInfo('passwordxx', JSON.stringify(this.pswObj.spassword));
- PublicLib.putCookieInfo('chooseType', this.chooseType);
- PublicLib.putCookieInfo('step', 2);
- } else {
- this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
- for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来
- this.drawCle(this.arr[i].x, this.arr[i].y);
- }
- document.getElementById('title').innerHTML = '两次不一致,重新输入';
- // this.drawStatusPoint('#FF574D');
- this.drawPoint(this.wariningcolor,this.wariningbgcolor)
- this.drawLine( this.lastPoint,this.wariningcolor);// 每帧画圆心
- delete this.pswObj.step;
- }
- } else if (this.pswObj.step == 2) {
- if (this.checkPass(this.pswObj.spassword, psw)) {
- this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
- for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来
- this.drawCle(this.arr[i].x, this.arr[i].y);
- }
- this.drawPoint(this.successcolor,this.successbgcolor)
- this.drawLine( this.lastPoint,this.successcolor);// 每帧画圆心
- document.getElementById('title').innerHTML = '解锁成功';
- setTimeout(() => {
- document.getElementById('goon').click()
- }, 500);
- } else {
- this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
- for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来
- this.drawCle(this.arr[i].x, this.arr[i].y);
- }
- this.drawPoint(this.wariningcolor,this.wariningbgcolor)
- this.drawLine( this.lastPoint,this.wariningcolor);// 每帧画圆心
- document.getElementById('title').innerHTML = '解锁失败,请重新尝试';
- }
- } else {
- this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
- for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来
- this.drawCle(this.arr[i].x, this.arr[i].y);
- }
- if(psw.length < 4) {
- this.drawPoint(this.wariningcolor,this.wariningbgcolor)
- this.drawLine( this.lastPoint,this.wariningcolor);// 每帧画圆心
- document.getElementById('title').innerHTML = '密码长度不够,请重新输入';
- return;
- }
- this.drawPoint(this.successcolor,this.successbgcolor)
- this.drawLine( this.lastPoint,this.successcolor);// 每帧画圆心
- this.pswObj.step = 1;
- this.pswObj.fpassword = psw;
- document.getElementById('title').innerHTML = '再次输入';
- }
- }
- H5lock.prototype.makeState = function() {
- }
- H5lock.prototype.setChooseType = function(type){
- chooseType = type;
- init();
- }
- H5lock.prototype.updatePassword = function(){
- PublicLib.putCookieInfo('passwordxx','');
- PublicLib.putCookieInfo('chooseType','');
- PublicLib.putCookieInfo('step','');
- this.pswObj = {};
- document.getElementById('title').innerHTML = '为了保护您的隐私,请设置登录手势密码吧!';
- this.reset();
- }
- H5lock.prototype.initDom = function(){
- var wrap = document.createElement('div');
- if(PublicLib.getCookieInfo('step') === '2') {
- var str = '<div id="title">请输入手势密码</div>'+
- '<canvas id="canvas" style="display: inline-block;"></canvas>'+
- '<div class="bottomtext">至少连接4个点</div>'+
- '<div id="updatePassword"></div>';
- wrap.setAttribute('style','position: absolute; left:0;right:0;');
- wrap.setAttribute('class','gesturepassword');
- wrap.innerHTML = str;
- document.body.appendChild(wrap);
- } else {
- var str = '<div id="title">为了保护您的隐私,请设置登录手势密码吧!</div>'+
- '<canvas id="canvas"style="display: inline-block;"></canvas>'+
- '<div class="bottomtext">至少连接4个点</div>'+
- '<div id="updatePassword"></div>';
- wrap.setAttribute('style','position: absolute; left:0;right:0;');
- wrap.setAttribute('class','gesturepassword');
- wrap.innerHTML = str;
- document.body.appendChild(wrap);
- }
- var canvas=document.getElementById('canvas');
- canvas.width=canvas.clientWidth*window.devicePixelRatio;
- canvas.height=canvas.clientHeight*window.devicePixelRatio;
- }
- H5lock.prototype.init = function() {
- this.initDom();
- this.pswObj = PublicLib.getCookieInfo('passwordxx') ? {
- step: 2,
- spassword: JSON.parse(PublicLib.getCookieInfo('passwordxx'))
- } : {};
- this.lastPoint = [];
- this.makeState();
- this.touchFlag = false;
- this.canvas = document.getElementById('canvas');
- this.ctx = this.canvas.getContext('2d');
- this.lastPoint = [];
- this.arr = [];
- this.restPoint = [];
- this.createCircle();
- this.bindEvent();
- }
- H5lock.prototype.reset = function() {
- this.makeState();
- this.lastPoint = [];
- this.arr = [];
- this.restPoint = [];
- this.createCircle();
- }
- H5lock.prototype.bindEvent = function() {
- var self = this;
- this.canvas.addEventListener("touchstart", function (e) {
- e.preventDefault();// 某些android 的 touchmove不宜触发 所以增加此行代码
- var po = self.getPosition(e);
- for (var i = 0 ; i < self.arr.length ; i++) {
- if (Math.abs(po.x - self.arr[i].x) < self.r && Math.abs(po.y - self.arr[i].y) < self.r) {
- self.touchFlag = true;
- self.drawPoint(self.arr[i].x,self.arr[i].y);
- self.lastPoint.push(self.arr[i]);
- self.restPoint.splice(i,1);
- break;
- }
- }
- }, { passive: false });
- this.canvas.addEventListener("touchmove", function (e) {
- if (self.touchFlag) {
- self.update(self.getPosition(e));
- }
- }, false );
- this.canvas.addEventListener("touchend", function (e) {
- if (self.touchFlag) {
- self.touchFlag = false;
- self.storePass(self.lastPoint);
- setTimeout(function(){
- self.reset();
- },
- 700);
- }
- }, false);
- document.addEventListener('touchmove', function(e){
- e.preventDefault();
- },{ passive: false });
- document.getElementById('updatePassword').addEventListener('click', function(){
- self.updatePassword();
- });
- }
- })();
|