手势密码解锁微信小程序项目源码

在这里插入图片描述

微信公众号:创享日记
发送:手势密码
获取完整源码(导入微信开发者工具即可用)

以下可以忽略不看!

手势密码就是在手机触屏上设置一笔连成的九宫格图案,登录时画一下设定的图形。

运行程序,发现各个数字的个数,其中

4位的有1624个,5位的有7152个,6位的有26016个,7位的有72912个,8位的有140704个,9位的有140704个,总共有389112种!

​值得一提的是,6位以下的个数甚至每到10000种,所以设置密码最好设置6位以上的,当然不怕忘记的话,可以设置9位的变态密码。

目前app内常用的安全验证,有密码、手势、指纹、面部识别。你会发现从便利性&安全性从高到低的划分是,面部识别、指纹识别、手势、密码。随着时代和技术的进步,安全验证更加趋向于个人生物化。n年前,如果密码被a知道了,a完全可以通过密码/手势来获得和你同样的权利进行相关操作。现在,则可通过生物认证。指纹和面部识别来确定是否是本人进行操作,大大提升了产品的安全性。

使用手势密码登录时,如果输入错误,会对用户进行错误提示,提示后用户可以继续输入,当同一个账号输错达5次时,系统会自动退出登录,用户需要输入密码验证身份成功后才能进入app。​

在手势登录页面,也可以使用忘记手势密码登录,如果点击忘记手势密码,退出登录,输入密码验证身份成功后,页面跳转至手势密码设置页面,设置新的手势密码。设置完成后,会自动登录app。

function(){var wxlocker = function(obj){this.chooseType =  3; // 3*3的圆点格子};wxlocker.prototype.drawCle = function(x, y) { // 初始化解锁密码面板this.ctx.setStrokeStyle('#10AEFF');this.ctx.setLineWidth(1);this.ctx.beginPath();this.ctx.arc(x, y, this.r, 0, Math.PI * 2, true);this.ctx.closePath();this.ctx.stroke();}wxlocker.prototype.drawLine = function(po, lastPoint) {// 解锁轨迹this.ctx.beginPath();this.ctx.setLineWidth(1);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();}wxlocker.prototype.createCircle = function() {// 创建解锁点的坐标,根据canvas的大小来平均分配半径var  cavW = this.setCanvasSize().w;var  cavH = this.setCanvasSize().h;var n = this.chooseType;var count = 0;this.r = cavW / (2 + 4 * n);// 公式计算this.lastPoint = [];this.arr = [];this.restPoint = [];var r = this.r;for (var i = 0 ; i < n ; i++) {for (var j = 0 ; j < n ; j++) {count++;var obj = {x: j * 4 * r + 3 * r,y: i * 4 * r + 3 * r,index: count};this.arr.push(obj);this.restPoint.push(obj);}}// this.ctx.clearRect(0, 0, cavW, cavH);for (var i = 0 ; i < this.arr.length ; i++) {this.drawCle(this.arr[i].x, this.arr[i].y);}wx.drawCanvas({canvasId: "locker",actions: this.ctx.getActions(),reserve:false});//return arr;}wxlocker.prototype.getPosition = function(e) {// 获取touch点相对于canvas的坐标// var rect = e.target;var po = {x: e.touches[0].x,y: e.touches[0].y};return po;}wxlocker.prototype.update = function(po) {// 核心变换方法在touchmove时候调用var  cavW = this.setCanvasSize().w;var  cavH = this.setCanvasSize().h;this.ctx.clearRect(0, 0, cavW, cavH);for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来this.drawCle(this.arr[i].x, this.arr[i].y);}this.drawPoint();//  每帧画圆心this.drawLine(po , this.lastPoint);// 每帧画轨迹for (var i = 0 ; i < this.restPoint.length ; i++) {if (Math.abs(po.x - this.restPoint[i].x) < this.r && Math.abs(po.y - this.restPoint[i].y) < this.r) {this.drawPoint();this.lastPoint.push(this.restPoint[i]);this.restPoint.splice(i, 1);break;}}}wxlocker.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;}wxlocker.prototype.storePass = function(psw,cb) {// touchend结束之后对密码和状态的处理if (this.pswObj.step == 1) {//step==1表示还没有设置密码状态if (this.checkPass(this.pswObj.fpassword, psw)) {this.pswObj.step = 2;this.pswObj.spassword = psw;this.resetHidden = false;this.title = "密码保存成功";this.titleColor = "succ";this.drawStatusPoint('#09bb07');wx.setStorageSync('passwordxx', JSON.stringify(this.pswObj.spassword));// wx.setStorageSync('chooseType', this.chooseType);} else {this.title = "两次绘制不一致,重新绘制";this.titleColor = "error";this.drawStatusPoint('#e64340');delete this.pswObj.step;}} else if (this.pswObj.step == 2) {if (this.checkPass(this.pswObj.spassword, psw)) {this.title = "解锁成功";this.titleColor = "succ";this.drawStatusPoint('#09bb07');cb();} else {this.title = "解锁失败";this.titleColor = "error";this.drawStatusPoint('#e64340');}} else {if(this.lastPoint.length<4){this.title="密码过于简单,请至少连接4个点";this.resetHidden = true;this.titleColor = "error";return false;}else{this.pswObj.step = 1;this.pswObj.fpassword = psw;this.titleColor = "";this.title = "再次输入";}}}wxlocker.prototype.makeState = function() {if (this.pswObj.step == 2) {this.resetHidden = false;this.title = "请解锁";this.titleColor = "";} else if (this.pswObj.step == 1) {this.title="请设置手势密码";this.resetHidden = true;this.titleColor = "";} else {this.title="请设置手势密码";this.resetHidden = true;this.titleColor = "";}}wxlocker.prototype.updatePassword = function(){//点击重置按钮,重置密码wx.removeStorageSync("passwordxx");// wx.removeStorageSync("chooseType");this.pswObj = {};this.title="请设置手势密码";this.resetHidden = true;this.titleColor = "";this.reset();}wxlocker.prototype.init = function() {//初始化锁盘this.pswObj = wx.getStorageSync('passwordxx') ? {step: 2,spassword: JSON.parse(wx.getStorageSync('passwordxx'))} : {};this.lastPoint = [];//记录手指经过的圆圈this.makeState();this.touchFlag = false;this.ctx = wx.createContext();//创建画布this.createCircle();//画圆圈}wxlocker.prototype.reset = function() {this.createCircle();}//适配不同屏幕大小的canvaswxlocker.prototype.setCanvasSize = function(){var size={};try {var res = wx.getSystemInfoSync();var scale = 750/686;//不同屏幕下canvas的适配比例;设计稿是750宽var width = res.windowWidth/scale;var height = width;//canvas画布为正方形size.w = width;size.h = height;} catch (e) {// Do something when catch errorconsole.log("获取设备信息失败"+e);} return size;}wxlocker.prototype.bindtouchstart = function(e){if(e.touches.length==1){var self = this;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.lastPoint.push(self.arr[i]);self.restPoint.splice(i,1);break;}}}wx.drawCanvas({canvasId: "locker",actions: this.ctx.getActions(),reserve:true});}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带你一步一步实战分析缓冲区溢出漏洞攻击

关注公众号有惊喜【部分付费文章免费阅读&#xff0c;持续更新中…】 点击公众号底部【逆向杂记】可见 文件1 (A)描述此二进制文件提供的服务&#xff0c;不需要运行二进制文件来找出这一点。 (B)有可能对此二进制文件进行缓冲区溢出攻击&#xff0c;它在哪里&#xff1f;哪些…

【JavaSE】Java进阶知识一(泛型详解,包括泛型方法,协变,逆变,擦除机制)

目录 泛型 1. 什么是泛型 2.泛型方法 3.通配符上界&#xff08;泛型的协变&#xff09; 4.通配符下界&#xff08;泛型的逆变&#xff09; 5.泛型的编译&#xff08;擦除机制&#xff09; 泛型 泛型&#xff1a;就是让一个类能适用于多个类型&#xff0c;就是在封装数据结…

Python实验三:Python程序设计之组合数据类型

微信公众号&#xff1a;创享日记 发送&#xff1a;python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习…

Python爬虫和数据分析,石油原油加工产品产量数据处理分析

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;原油分析 获取完整无水印报告P…

Python实验二:Python程序设计之结构与复用

微信公众号&#xff1a;创享日记 发送&#xff1a;python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习…

基于x86汇编的飞机大战

运行结果 代码 ;宏定义一个显示函数(显示一组字符串) PUTS MACRO STRINGPUSH AXPUSH DXLEA DX, STRING ;LEA将内存地址的

Python实验四:Python程序设计之文件

微信公众号&#xff1a;创享日记 发送&#xff1a;python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习…

【OFDM系列1】OFDM调制原理、参数、循环前缀、采样偏差、频偏及估计详解

关注公号【逆向通信猿】回复【OFDM】更精彩!!! OFDM调制解调原理 星座映射==>插入导频==>IFFT调制==>插入CP==>定时==>FFT解调==>导频均衡==>判决恢复 OFDM的正交条件[樊昌信,通信原理]: ①子载波 f k = k 2 T f_k=\frac{k}{2T}

Python统计英文单词出现情况次数实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 请统计附件hamlet.txt中出现的英文单词情况&#xff0c;统计并输出出现…

Java EE 8安全性API:概述

新的安全性API 可能&#xff0c;添加到Java EE 8中最重要的一项新功能就是新的安全性API。 此新API的主要动机是简化&#xff0c;标准化和现代化跨容器和实现处理安全性问题的方式。 他们做得很好。 由于三个新的注释使web.xml文件声明变得多余&#xff0c;Web身份验证的配置…

基于SSH的校园网上购物系统Javaweb、MySQL、JSP

微信公众号&#xff1a;创享日记 发送&#xff1a;校园购物 获取完整论文报告项目Java和SQL源码源文件答辩PPT等 主要内容&#xff1a; 1&#xff0e;对校园网上购物平台的建设需求进行分析&#xff0c;包括产品、服务方式等。 2&#xff0e;按需求对各个功能模块进行设计。 3&…

Python传感器采集数据文件分析处理实验源码

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 附件sensor-data.txt是一个传感器采集数据文件&#xff0c;其中&#…

Java Stream ORM现在带有JOIN

Speedment是一个Java Stream ORM工具包和运行时&#xff0c;它使您可以将数据库表作为标准Java Streams查看。 由于不必混合使用Java和SQL&#xff0c;因此该应用程序变得更加紧凑&#xff0c;从而使其开发速度更快&#xff0c;更不容易出错并且更易于维护。 流也严格地是类型安…

易购数码类电商商城网页设计与实现项目源码

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;易购网站 获取完整报告论文源…

Python定义一个单链表可判断是否为空,计算长度,插入节结点实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 使用python定义一个单链表&#xff0c;并实现以下功能&#xff1a; (…

复信号两种不同加噪方式的比较

方式一 分别对信号实部和虚部加噪&#xff0c;SNR30&#xff0c;然后将实部和虚部合起来变成复信号&#xff0c;计算合起来之后的信号与噪声功率之比 %% 测试加噪方式 clear;close all;clc; M4;len10000; xk randi([0,M-1],1,len); xk pskmod(xk,4); SNR 30; xkR real(xk…

Python统计各省份字典中双一流学校数量实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 字典d中存储了我国42所双一流高校及所在省份的对应关系&#xff0c;请…

servlet文件上传下载_Servlet上传文件和下载文件示例

servlet文件上传下载Java Web应用程序中的文件上载和下载以及常见任务。 由于最近我写了很多有关Java servlet的文章 &#xff0c;因此我想提供一个使用servlet上传和下载文件的示例示例。 用例 我们的用例是提供一个简单HTML页面&#xff0c;客户端可以在其中选择要上传到服务…

Ollydbg使用教程学习总结(一)

解密系列之OD使用教程1 使用例子程序为Hello.exe OD基本快捷键及功能 从系统DLL领空返回到程序领空&#xff0c;AltF9 通过OD将程序的标题“Hello world”改为“OD Class 01” 直接单步执行法 按F8单步执行&#xff0c;找到MessageBox传参的地方&#xff0c;直接在数据窗口修…

Python连锁药店营业额数据分析实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 附件drug. order_ detai 1.xlsx是某连锁药店销售数据&#xff0c;请使…