360homework
360homework copied to clipboard
仿手机手势解锁,2017年360前端星计划作业(已通过)
360homework
无任何第三方库写成的“手势密码”应用。2017年360前端星作业(已通过)。
- 原生Js实现SPA
- 完全面向对象设计
- MVVM(MVC)结构
- Canvas绘图
- Nodejs自动构建
build 构建目录
dist 释出目录
src 源码目录
项目极力避免webpack依赖,因此哪怕无任何nodejs基础的初学者也依旧可以轻松阅读源码~~
项目中还使用了大量ES6语法,如果你正在学习它,或者阅读项目源码能带给你许些启示。
避免webpack意味着:你可以直接双击打开
src源码目录的index.html来运行项目!
dist/index.html兼容性良好,兼容各种移动/PC端浏览器,但src/index.html兼容性较差,只有最新的Chrome和Firefox浏览器才可以运行它
项目部署
实际上,如果你不打算修改项目并重新编译它,只是想简单的运行,那么直接双击打开dist或src目录的index.html即可,无需任何额外的操作!
当然,如果你想修改编译项目,那么你需要首先安装项目依赖包
npm install
然后进入src目录修改项目源码,改动完毕后运行
npm run build
Nodejs会自动将src项目文件打包,更新dist目录文件
dist目录中文件并不是全部都是使用nodejs编译生成的,所以请不要删除整个dist目录
编译完成后,直接双击打开dist目录中的index.html即可。
值得一提的是,由于项目极力避免webpack依赖,哪怕是src源码目录,你可以直接双击index.html运行!
功能介绍
录入手势密码
点击页面上方设置密码标签或进入URL/!#/set进入录入手势密码页面。
当绘制至少5个点后,进入ensure状态,需要再录入一遍相同的密码确保不会因为手误造成问题。
若第二次录入与第一次不一致,退回最初的录入状态;若与第一次一致则将密码存储在本地localStorage中
验证手势密码
点击页面上方验证密码标签或进入URL/!#/verify进入验证手势密码页面。
改变点数
点击页面上方管理标签或进入URL/!#/option进入管理页面,在点数文本框中可以设置手势密码使用的点数
项目默认使用3*3的点数进行手势密码的捕获。
该功能不会影响“验证手势密码”功能
查看/清除手势密码
点击页面上方管理标签或进入URL/!#/option进入管理页面,在“存储的密码”中可以查看当前存储的手势密码。
密码以-分割,数字代表点的序号,序号从0开始。
点击“清除”按钮可以清除保存的密码。
构建技术看点
模块化设计
项目采用完全面向对象的模块化,极力避免模块之间的耦合度。
LsPoint 一个点
LsPointManager 一个点管理器
LsView 一个展板,包括点和线
LsApp 一个手势密码捕获应用
耦合度极低的模块不仅意味着可十分良好的维护性,还意味着实现一些十分灵活的功能会非常简单,或者说是理所当然。
比如:你可以在管理页面中更改手势密码录入的总点数。
MVVM(MVC)的结构设计
项目整体实际上是一个SPA,构建风格受Vue.js影响较大。
URL/#!/set 密码录入
URL/#!/verify 验证密码
URL/#!/option 管理选项
由于实现MVVM自动数据绑定成本较大,因此项目的结构风格是类似于MVVM的MVC来避免使用数据绑定。可以看到路由(Controller)部分非常厚,所有的业务逻辑都放在那里。
受Vue.js风格影响,项目拥有健全的路由器和路由表,使用Hash进行SPA路由。
组件化设计
项目使用组件化设计,因此你可以看到项目HTML文件body元素中只有一个挂载点
<body>
<div id="app"></div>
</body>
然后通过js挂载元素
new App({
el:'#app'
});
项目使用的组件树如下
App 根组件
LsApp 捕获手势密码组件
Option 管理选项组件
自动构建
项目使用Nodejs进行构建,使用Nodejs可以很轻松的做到:
- Js文件打包
- Babel转码
- Js压缩
- SCSS编译
- CSS压缩
你可以使用npm run build或直接运行build/build-dist.js构建目录
一些吐槽
说实话,看到这个作业我的内心几乎是崩溃的。因为,我完全没接触过Canvas绘图......
考虑过用div来写,但是那样实在太......总之就是有种说不出来的别扭,所以最后决定现学一下Canvas绘图,结果意外的发现Canvas绘图其实不难。
从拿到手到写完,大概用了4天的时间。
本来一开始只是打算简单的使用面向过程的写法实现就可以了。可能是Vue写多了的原因,写着写着就把项目写成了MVVM风格的SPA,但是没有Vue强大的数据绑定和组件渲染,更没有路由,又不想用第三方库,一切都要自己实现......
由于一开始不打算使用任何第三方库,所以就没打算过上webpack。结果最后真机调试的时候发现移动端对ES6的支持十分令人捉急,所以临时把项目拆成src和dist,dist用babel转码以保证兼容性。
所以结果就是现在这样,一个简单的手势密码写成了一个应用,光Js代码就近600+行。
开源协议
MIT