diff --git a/README.md b/README.md
index 3e2b822..b930040 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
-# XJTLU-automatic_attendence
\ No newline at end of file
+# XJTLU-automatic_attendence
+This is based on WeChat Program.
\ No newline at end of file
diff --git a/app.js b/app.js
new file mode 100644
index 0000000..70af9fb
--- /dev/null
+++ b/app.js
@@ -0,0 +1,30 @@
+//app.js
+App({
+ onLaunch: function () {
+ //调用API从本地缓存中获取数据
+ var logs = wx.getStorageSync('logs') || []
+ logs.unshift(Date.now())
+ wx.setStorageSync('logs', logs.slice(0,40))
+ },
+ getUserInfo:function(cb){
+ var that = this
+ if(this.globalData.userInfo){
+ typeof cb == "function" && cb(this.globalData.userInfo)
+ }else{
+ //调用登录接口
+ wx.login({
+ success: function () {
+ wx.getUserInfo({
+ success: function (res) {
+ that.globalData.userInfo = res.userInfo
+ typeof cb == "function" && cb(that.globalData.userInfo)
+ }
+ })
+ }
+ })
+ }
+ },
+ globalData:{
+ userInfo:null
+ }
+})
\ No newline at end of file
diff --git a/app.json b/app.json
new file mode 100644
index 0000000..30be346
--- /dev/null
+++ b/app.json
@@ -0,0 +1,12 @@
+{
+ "pages": [
+ "pages/index/index",
+ "pages/IDcard/IDcard",
+ "pages/logs/logs",
+ "pages/qr/index.xml",
+ "pages/qr/index"
+ ],
+ "window": {
+ "navigationStyle": "custom"
+ }
+}
\ No newline at end of file
diff --git a/app.wxss b/app.wxss
new file mode 100644
index 0000000..0bd8b29
--- /dev/null
+++ b/app.wxss
@@ -0,0 +1,234 @@
+/**app.wxss**/
+page {
+ background-color: #fbf9fe;
+ height: 100%;
+}
+.container {
+ display: flex;
+ flex-direction: column;
+ min-height: 100%;
+ justify-content: space-between;
+ align-items: center;
+ padding: 200rpx 0;
+ box-sizing: border-box;
+}
+.page-header {
+ display: flex;
+ font-size: 32rpx;
+ color: #aaa;
+ margin-top: 50rpx;
+ flex-direction: column;
+ align-items: center;
+}
+.page-header-text {
+ padding: 20rpx 40rpx;
+}
+.page-header-line {
+ width: 150rpx;
+ height: 1px;
+ border-bottom: 1px solid #ccc;
+}
+
+.page-body {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ flex-grow: 1;
+ overflow-x: hidden;
+}
+.page-body-wrapper {
+ margin-top: 100rpx;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+}
+.page-body-wrapper form {
+ width: 100%;
+}
+.page-body-wording {
+ text-align: center;
+ padding: 200rpx 100rpx;
+}
+.page-body-info {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ background-color: #fff;
+ margin-bottom: 50rpx;
+ width: 100%;
+ padding: 50rpx 0 150rpx 0;
+}
+.page-body-title {
+ margin-bottom: 100rpx;
+ font-size: 32rpx;
+}
+.page-body-text {
+ font-size: 30rpx;
+ line-height: 26px;
+ color: #ccc;
+}
+.page-body-text-small {
+ font-size: 24rpx;
+ color: #000;
+ margin-bottom: 100rpx;
+}
+.page-body-form {
+ width: 100%;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ border: 1px solid #eee;
+}
+.page-body-form-item {
+ display: flex;
+ align-items: center;
+ margin-left: 30rpx;
+ border-bottom: 1px solid #eee;
+ height: 88rpx;
+ font-size: 34rpx;
+}
+.page-body-form-key {
+ width: 180rpx;
+ color: #000;
+}
+.page-body-form-value {
+ flex-grow: 1;
+}
+.page-body-form-value .input-placeholder {
+ color: #b2b2b2;
+}
+
+.page-body-form-picker {
+ display: flex;
+ justify-content: space-between;
+ height: 100rpx;
+ align-items: center;
+ font-size: 36rpx;
+ margin-left: 20rpx;
+ padding-right: 20rpx;
+ border-bottom: 1px solid #eee;
+}
+.page-body-form-picker-value {
+ color: #ccc;
+}
+
+.page-body-buttons {
+ width: 100%;
+}
+.page-body-button {
+ margin: 25rpx;
+}
+.page-body-button image {
+ width: 150rpx;
+ height: 150rpx;
+}
+.page-footer {
+ text-align: center;
+ color: #1aad19;
+ font-size: 24rpx;
+ margin: 20rpx 0;
+}
+
+.green{
+ color: #09BB07;
+}
+.red{
+ color: #F76260;
+}
+.blue{
+ color: #10AEFF;
+}
+.yellow{
+ color: #FFBE00;
+}
+.gray{
+ color: #C9C9C9;
+}
+
+.strong{
+ font-weight: bold;
+}
+
+.bc_green{
+ background-color: #09BB07;
+}
+.bc_red{
+ background-color: #F76260;
+}
+.bc_blue{
+ background-color: #10AEFF;
+}
+.bc_yellow{
+ background-color: #FFBE00;
+}
+.bc_gray{
+ background-color: #C9C9C9;
+}
+
+.tc{
+ text-align: center;
+}
+
+.page input{
+ padding: 20rpx 30rpx;
+ background-color: #fff;
+}
+checkbox, radio{
+ margin-right: 10rpx;
+}
+
+.btn-area{
+ padding: 0 30rpx;
+}
+.btn-area button{
+ margin-top: 20rpx;
+ margin-bottom: 20rpx;
+}
+
+.page {
+ min-height: 100%;
+ flex: 1;
+ background-color: #FBF9FE;
+ font-size: 32rpx;
+ font-family: -apple-system-font,Helvetica Neue,Helvetica,sans-serif;
+ overflow: hidden;
+}
+.page__hd{
+ padding: 50rpx 50rpx 100rpx 50rpx;
+ text-align: center;
+}
+.page__title{
+ display: inline-block;
+ padding: 20rpx 40rpx;
+ font-size: 32rpx;
+ color: #AAAAAA;
+ border-bottom: 1px solid #CCCCCC;
+}
+.page__desc{
+ display: none;
+ margin-top: 20rpx;
+ font-size: 26rpx;
+ color: #BBBBBB;
+}
+
+.section{
+ margin-bottom: 80rpx;
+}
+.section_gap{
+ padding: 0 30rpx;
+}
+.section__title{
+ margin-bottom: 16rpx;
+ padding-left: 30rpx;
+ padding-right: 30rpx;
+}
+.section_gap .section__title{
+ padding-left: 0;
+ padding-right: 0;
+}
+.section__ctn{
+
+}
diff --git a/cloudfunctions/login/index.js b/cloudfunctions/login/index.js
new file mode 100644
index 0000000..35ea7c7
--- /dev/null
+++ b/cloudfunctions/login/index.js
@@ -0,0 +1,31 @@
+// 云函数模板
+// 部署:在 cloud-functions/login 文件夹右击选择 “上传并部署”
+
+const cloud = require('wx-server-sdk')
+
+// 初始化 cloud
+cloud.init()
+
+/**
+ * 这个示例将经自动鉴权过的小程序用户 openid 返回给小程序端
+ *
+ * event 参数包含小程序端调用传入的 data
+ *
+ */
+exports.main = (event, context) => {
+ console.log(event)
+ console.log(context)
+
+ // 可执行其他自定义逻辑
+ // console.log 的内容可以在云开发云函数调用日志查看
+
+ // 获取 WX Context (微信调用上下文),包括 OPENID、APPID、及 UNIONID(需满足 UNIONID 获取条件)
+ const wxContext = cloud.getWXContext()
+
+ return {
+ event,
+ openid: wxContext.OPENID,
+ appid: wxContext.APPID,
+ unionid: wxContext.UNIONID,
+ }
+}
diff --git a/cloudfunctions/login/package.json b/cloudfunctions/login/package.json
new file mode 100644
index 0000000..540894e
--- /dev/null
+++ b/cloudfunctions/login/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "login",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "wx-server-sdk": "latest"
+ }
+}
diff --git a/img/eid/Background.jpg b/img/eid/Background.jpg
new file mode 100644
index 0000000..3f7f65b
Binary files /dev/null and b/img/eid/Background.jpg differ
diff --git a/img/eid/Picture2.png b/img/eid/Picture2.png
new file mode 100644
index 0000000..8b8e50e
Binary files /dev/null and b/img/eid/Picture2.png differ
diff --git a/img/eid/Picture3.png b/img/eid/Picture3.png
new file mode 100644
index 0000000..f804366
Binary files /dev/null and b/img/eid/Picture3.png differ
diff --git a/img/eid/eid_Photo.png b/img/eid/eid_Photo.png
new file mode 100644
index 0000000..eb19c92
Binary files /dev/null and b/img/eid/eid_Photo.png differ
diff --git a/img/eid/eid_carBackgroud.png b/img/eid/eid_carBackgroud.png
new file mode 100644
index 0000000..a388691
Binary files /dev/null and b/img/eid/eid_carBackgroud.png differ
diff --git a/img/eid/eid_cardBackground.png b/img/eid/eid_cardBackground.png
new file mode 100644
index 0000000..df96850
Binary files /dev/null and b/img/eid/eid_cardBackground.png differ
diff --git a/img/eid/eid_logo.png b/img/eid/eid_logo.png
new file mode 100644
index 0000000..c194fcd
Binary files /dev/null and b/img/eid/eid_logo.png differ
diff --git a/img/eid/eid_tran.png b/img/eid/eid_tran.png
new file mode 100644
index 0000000..9c81c62
Binary files /dev/null and b/img/eid/eid_tran.png differ
diff --git a/img/eid/page 1.png b/img/eid/page 1.png
new file mode 100644
index 0000000..3158655
Binary files /dev/null and b/img/eid/page 1.png differ
diff --git a/img/eid/page 2.png b/img/eid/page 2.png
new file mode 100644
index 0000000..40da0bd
Binary files /dev/null and b/img/eid/page 2.png differ
diff --git a/img/eid/qr.png b/img/eid/qr.png
new file mode 100644
index 0000000..9bd3c4f
Binary files /dev/null and b/img/eid/qr.png differ
diff --git a/miniprogram/app.js b/miniprogram/app.js
new file mode 100644
index 0000000..b080b9d
--- /dev/null
+++ b/miniprogram/app.js
@@ -0,0 +1,15 @@
+//app.js
+App({
+ onLaunch: function () {
+
+ if (!wx.cloud) {
+ console.error('请使用 2.2.3 或以上的基础库以使用云能力')
+ } else {
+ wx.cloud.init({
+ traceUser: true,
+ })
+ }
+
+ this.globalData = {}
+ }
+})
diff --git a/miniprogram/app.json b/miniprogram/app.json
new file mode 100644
index 0000000..c4b45df
--- /dev/null
+++ b/miniprogram/app.json
@@ -0,0 +1,18 @@
+{
+ "pages": [
+ "pages/index/index",
+ "pages/userConsole/userConsole",
+ "pages/storageConsole/storageConsole",
+ "pages/databaseGuide/databaseGuide",
+ "pages/addFunction/addFunction",
+ "pages/deployFunctions/deployFunctions",
+ "pages/chooseLib/chooseLib"
+ ],
+ "window": {
+ "backgroundColor": "#F6F6F6",
+ "backgroundTextStyle": "light",
+ "navigationBarBackgroundColor": "#F6F6F6",
+ "navigationBarTitleText": "云开发 QuickStart",
+ "navigationBarTextStyle": "black"
+ }
+}
diff --git a/miniprogram/app.wxss b/miniprogram/app.wxss
new file mode 100644
index 0000000..045e586
--- /dev/null
+++ b/miniprogram/app.wxss
@@ -0,0 +1,7 @@
+/**app.wxss**/
+.container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ box-sizing: border-box;
+}
diff --git a/miniprogram/images/code-db-inc-dec.png b/miniprogram/images/code-db-inc-dec.png
new file mode 100644
index 0000000..d8770b1
Binary files /dev/null and b/miniprogram/images/code-db-inc-dec.png differ
diff --git a/miniprogram/images/code-db-onAdd.png b/miniprogram/images/code-db-onAdd.png
new file mode 100644
index 0000000..22c7afb
Binary files /dev/null and b/miniprogram/images/code-db-onAdd.png differ
diff --git a/miniprogram/images/code-db-onQuery.png b/miniprogram/images/code-db-onQuery.png
new file mode 100644
index 0000000..218550d
Binary files /dev/null and b/miniprogram/images/code-db-onQuery.png differ
diff --git a/miniprogram/images/code-db-onRemove.png b/miniprogram/images/code-db-onRemove.png
new file mode 100644
index 0000000..b4eff71
Binary files /dev/null and b/miniprogram/images/code-db-onRemove.png differ
diff --git a/miniprogram/images/code-func-sum.png b/miniprogram/images/code-func-sum.png
new file mode 100644
index 0000000..0414529
Binary files /dev/null and b/miniprogram/images/code-func-sum.png differ
diff --git a/miniprogram/images/console-entrance.png b/miniprogram/images/console-entrance.png
new file mode 100644
index 0000000..bbbb973
Binary files /dev/null and b/miniprogram/images/console-entrance.png differ
diff --git a/miniprogram/images/create-collection.png b/miniprogram/images/create-collection.png
new file mode 100644
index 0000000..e0fdb34
Binary files /dev/null and b/miniprogram/images/create-collection.png differ
diff --git a/miniprogram/pages/addFunction/addFunction.js b/miniprogram/pages/addFunction/addFunction.js
new file mode 100644
index 0000000..4966be3
--- /dev/null
+++ b/miniprogram/pages/addFunction/addFunction.js
@@ -0,0 +1,60 @@
+// pages/addFunction/addFunction.js
+
+const code = `// 云函数入口函数
+exports.main = (event, context) => {
+ console.log(event)
+ console.log(context)
+ return {
+ sum: event.a + event.b
+ }
+}`
+
+Page({
+
+ data: {
+ result: '',
+ canIUseClipboard: wx.canIUse('setClipboardData'),
+ },
+
+ onLoad: function (options) {
+
+ },
+
+ copyCode: function() {
+ wx.setClipboardData({
+ data: code,
+ success: function () {
+ wx.showToast({
+ title: '复制成功',
+ })
+ }
+ })
+ },
+
+ testFunction() {
+ wx.cloud.callFunction({
+ name: 'sum',
+ data: {
+ a: 1,
+ b: 2
+ },
+ success: res => {
+ wx.showToast({
+ title: '调用成功',
+ })
+ this.setData({
+ result: JSON.stringify(res.result)
+ })
+ },
+ fail: err => {
+ wx.showToast({
+ icon: 'none',
+ title: '调用失败',
+ })
+ console.error('[云函数] [sum] 调用失败:', err)
+ }
+ })
+ },
+
+})
+
diff --git a/miniprogram/pages/addFunction/addFunction.json b/miniprogram/pages/addFunction/addFunction.json
new file mode 100644
index 0000000..1f00cc3
--- /dev/null
+++ b/miniprogram/pages/addFunction/addFunction.json
@@ -0,0 +1,3 @@
+{
+ "navigationBarTitleText": "云函数指引"
+}
\ No newline at end of file
diff --git a/miniprogram/pages/addFunction/addFunction.wxml b/miniprogram/pages/addFunction/addFunction.wxml
new file mode 100644
index 0000000..3a10626
--- /dev/null
+++ b/miniprogram/pages/addFunction/addFunction.wxml
@@ -0,0 +1,29 @@
+
+
+
+
+
+ 测试云函数
+
+
+ 期望输出:{"sum":3}
+
+
+ 调用结果:{{result}}
+
+
+
+
+ 新增云函数
+ 1. 在云函数根目录 cloudfunctions 上右键选择新建云函数,命名为 sum
+ 2. 在创建的 cloudfunctions/sum/index.js 文件中添加如下代码
+
+
+ 3. 在 cloudfunctions/sum 目录上右键上传并部署
+ 4. 点击测试云函数测试
+ 5. 打开云开发云函数管理页,选择 sum 云函数
+ 6. 查看 sum 的调用日志
+ 进阶:可在云函数中使用 wx-server-sdk 操作数据库,文件存储和调用其他云函数,详见文档
+
+
+
diff --git a/miniprogram/pages/addFunction/addFunction.wxss b/miniprogram/pages/addFunction/addFunction.wxss
new file mode 100644
index 0000000..7ac8619
--- /dev/null
+++ b/miniprogram/pages/addFunction/addFunction.wxss
@@ -0,0 +1,3 @@
+/* pages/addFunction/addFunction.wxss */
+
+@import "../../style/guide.wxss";
\ No newline at end of file
diff --git a/miniprogram/pages/chooseLib/chooseLib.js b/miniprogram/pages/chooseLib/chooseLib.js
new file mode 100644
index 0000000..e93478e
--- /dev/null
+++ b/miniprogram/pages/chooseLib/chooseLib.js
@@ -0,0 +1,66 @@
+// pages/chooseLib/chooseLib.js
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ }
+})
\ No newline at end of file
diff --git a/miniprogram/pages/chooseLib/chooseLib.json b/miniprogram/pages/chooseLib/chooseLib.json
new file mode 100644
index 0000000..e4e1fce
--- /dev/null
+++ b/miniprogram/pages/chooseLib/chooseLib.json
@@ -0,0 +1,3 @@
+{
+ "navigationBarTitleText": "选择基础库"
+}
\ No newline at end of file
diff --git a/miniprogram/pages/chooseLib/chooseLib.wxml b/miniprogram/pages/chooseLib/chooseLib.wxml
new file mode 100644
index 0000000..3e9fb5e
--- /dev/null
+++ b/miniprogram/pages/chooseLib/chooseLib.wxml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ 初始化失败
+
+
+ 请使用 2.2.3 或以上的基础库以使用云能力
+
+
+
+
+
diff --git a/miniprogram/pages/chooseLib/chooseLib.wxss b/miniprogram/pages/chooseLib/chooseLib.wxss
new file mode 100644
index 0000000..acce666
--- /dev/null
+++ b/miniprogram/pages/chooseLib/chooseLib.wxss
@@ -0,0 +1,7 @@
+/* pages/chooseLib/chooseLib.wxss */
+
+@import "../../style/guide.wxss";
+
+.black {
+ color: black;
+}
\ No newline at end of file
diff --git a/miniprogram/pages/databaseGuide/databaseGuide.js b/miniprogram/pages/databaseGuide/databaseGuide.js
new file mode 100644
index 0000000..5ea1f7c
--- /dev/null
+++ b/miniprogram/pages/databaseGuide/databaseGuide.js
@@ -0,0 +1,193 @@
+// pages/databaseGuide/databaseGuide.js
+
+const app = getApp()
+
+Page({
+
+ data: {
+ step: 1,
+ counterId: '',
+ openid: '',
+ count: null,
+ queryResult: '',
+ },
+
+ onLoad: function (options) {
+ if (app.globalData.openid) {
+ this.setData({
+ openid: app.globalData.openid
+ })
+ }
+ },
+
+ onAdd: function () {
+ // const db = wx.cloud.database()
+ // db.collection('counters').add({
+ // data: {
+ // count: 1
+ // },
+ // success: res => {
+ // // 在返回结果中会包含新创建的记录的 _id
+ // this.setData({
+ // counterId: res._id,
+ // count: 1
+ // })
+ // wx.showToast({
+ // title: '新增记录成功',
+ // })
+ // console.log('[数据库] [新增记录] 成功,记录 _id: ', res._id)
+ // },
+ // fail: err => {
+ // wx.showToast({
+ // icon: 'none',
+ // title: '新增记录失败'
+ // })
+ // console.error('[数据库] [新增记录] 失败:', err)
+ // }
+ // })
+ },
+
+ onQuery: function() {
+ // const db = wx.cloud.database()
+ // // 查询当前用户所有的 counters
+ // db.collection('counters').where({
+ // _openid: this.data.openid
+ // }).get({
+ // success: res => {
+ // this.setData({
+ // queryResult: JSON.stringify(res.data, null, 2)
+ // })
+ // console.log('[数据库] [查询记录] 成功: ', res)
+ // },
+ // fail: err => {
+ // wx.showToast({
+ // icon: 'none',
+ // title: '查询记录失败'
+ // })
+ // console.error('[数据库] [查询记录] 失败:', err)
+ // }
+ // })
+ },
+
+ onCounterInc: function() {
+ // const db = wx.cloud.database()
+ // const newCount = this.data.count + 1
+ // db.collection('counters').doc(this.data.counterId).update({
+ // data: {
+ // count: newCount
+ // },
+ // success: res => {
+ // this.setData({
+ // count: newCount
+ // })
+ // },
+ // fail: err => {
+ // icon: 'none',
+ // console.error('[数据库] [更新记录] 失败:', err)
+ // }
+ // })
+ },
+
+ onCounterDec: function() {
+ // const db = wx.cloud.database()
+ // const newCount = this.data.count - 1
+ // db.collection('counters').doc(this.data.counterId).update({
+ // data: {
+ // count: newCount
+ // },
+ // success: res => {
+ // this.setData({
+ // count: newCount
+ // })
+ // },
+ // fail: err => {
+ // icon: 'none',
+ // console.error('[数据库] [更新记录] 失败:', err)
+ // }
+ // })
+ },
+
+ onRemove: function() {
+ // if (this.data.counterId) {
+ // const db = wx.cloud.database()
+ // db.collection('counters').doc(this.data.counterId).remove({
+ // success: res => {
+ // wx.showToast({
+ // title: '删除成功',
+ // })
+ // this.setData({
+ // counterId: '',
+ // count: null,
+ // })
+ // },
+ // fail: err => {
+ // wx.showToast({
+ // icon: 'none',
+ // title: '删除失败',
+ // })
+ // console.error('[数据库] [删除记录] 失败:', err)
+ // }
+ // })
+ // } else {
+ // wx.showToast({
+ // title: '无记录可删,请见创建一个记录',
+ // })
+ // }
+ },
+
+ nextStep: function () {
+ // 在第一步,需检查是否有 openid,如无需获取
+ if (this.data.step === 1 && !this.data.openid) {
+ wx.cloud.callFunction({
+ name: 'login',
+ data: {},
+ success: res => {
+ app.globalData.openid = res.result.openid
+ this.setData({
+ step: 2,
+ openid: res.result.openid
+ })
+ },
+ fail: err => {
+ wx.showToast({
+ icon: 'none',
+ title: '获取 openid 失败,请检查是否有部署 login 云函数',
+ })
+ console.log('[云函数] [login] 获取 openid 失败,请检查是否有部署云函数,错误信息:', err)
+ }
+ })
+ } else {
+ const callback = this.data.step !== 6 ? function() {} : function() {
+ console.group('数据库文档')
+ console.log('https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database.html')
+ console.groupEnd()
+ }
+
+ this.setData({
+ step: this.data.step + 1
+ }, callback)
+ }
+ },
+
+ prevStep: function () {
+ this.setData({
+ step: this.data.step - 1
+ })
+ },
+
+ goHome: function() {
+ const pages = getCurrentPages()
+ if (pages.length === 2) {
+ wx.navigateBack()
+ } else if (pages.length === 1) {
+ wx.redirectTo({
+ url: '../index/index',
+ })
+ } else {
+ wx.reLaunch({
+ url: '../index/index',
+ })
+ }
+ }
+
+})
\ No newline at end of file
diff --git a/miniprogram/pages/databaseGuide/databaseGuide.json b/miniprogram/pages/databaseGuide/databaseGuide.json
new file mode 100644
index 0000000..ad6a286
--- /dev/null
+++ b/miniprogram/pages/databaseGuide/databaseGuide.json
@@ -0,0 +1,3 @@
+{
+ "navigationBarTitleText": "数据库指引"
+}
\ No newline at end of file
diff --git a/miniprogram/pages/databaseGuide/databaseGuide.wxml b/miniprogram/pages/databaseGuide/databaseGuide.wxml
new file mode 100644
index 0000000..13aa348
--- /dev/null
+++ b/miniprogram/pages/databaseGuide/databaseGuide.wxml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+ 数据库指引
+
+
+ {{index + 1}}
+
+
+ openid:{{openid}}
+
+
+ 当前记录 ID:{{counterId}}
+
+
+
+
+
+
+
+ 示例介绍
+ 1. 以计数器为例,在此演示如何操作数据库
+ 2. 数据库操作大多需要用户 openid,需先配置好 login 云函数,如已配置好,点击下一步,获取用户 openid 并开始我们的指引
+
+
+
+
+
+
+
+ 新建集合
+ 1. 打开云开发控制台,进入到数据库管理页
+
+ 2. 选择添加集合,集合名为 counters
+
+ 3. 可以看到 counters 集合出现在左侧集合列表中
+ 注:集合必须在云开发控制台中创建
+
+
+
+
+
+
+
+
+
+ 新增记录
+ 1. 打开 pages/databaseGuide/databaseGuide.js 文件,定位到 onAdd 方法
+ 2. 把注释掉的代码解除注释
+
+ 3. onAdd 方法会往 counters 集合新增一个记录,新增如下格式的一个 JSON 记录
+
+ {
+ "_id": "数据库自动生成记录 ID 字段",
+ "_openid": "数据库自动插入记录创建者的 openid",
+ "count": 1
+ }
+
+ 4. 点击按钮
+
+ 新增的记录 _id 为:{{counterId}}
+ 5. 在云开发 -> 数据库 -> counters 集合中可以看到新增的记录
+
+
+
+
+
+
+
+
+
+ 查询记录
+ 1. 打开 pages/databaseGuide/databaseGuide.js 文件,定位到 onQuery 方法
+ 2. 把注释掉的代码解除注释,onQuery 方法会在下方按钮被点击时触发
+
+ 3. 点击按钮
+
+ {{queryResult}}
+
+
+
+
+
+
+
+
+
+ 更新记录
+ 1. 打开 pages/databaseGuide/databaseGuide.js 文件,定位到 onCounterInc 和 onCounterDec 方法
+ 2. 把注释掉的代码解除注释
+
+ 3. 点击下方按钮更新计数器
+
+
+ {{count}}
+
+
+
+
+
+
+
+
+
+
+
+ 删除记录
+ 1. 打开 pages/databaseGuide/databaseGuide.js 文件,定位到 onRemove 方法
+ 2. 把注释掉的代码解除注释
+
+ 3. 点击下方按钮删除计数器
+
+
+
+
+
+
+
+
+
+
+ 完成指引 !
+ 恭喜你,至此已完成数据库操作入门基础,可以点击调试器中的链接,查看详尽的数据库文档
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/miniprogram/pages/databaseGuide/databaseGuide.wxss b/miniprogram/pages/databaseGuide/databaseGuide.wxss
new file mode 100644
index 0000000..1476821
--- /dev/null
+++ b/miniprogram/pages/databaseGuide/databaseGuide.wxss
@@ -0,0 +1,10 @@
+/* pages/databaseGuide/databaseGuide.wxss */
+
+@import "../../style/guide.wxss";
+
+.guide .counter {
+ margin-top: 50rpx;
+ display: flex;
+ flex-direction: row;
+ align-content: space-between;
+}
\ No newline at end of file
diff --git a/miniprogram/pages/deployFunctions/deployFunctions.js b/miniprogram/pages/deployFunctions/deployFunctions.js
new file mode 100644
index 0000000..a76b144
--- /dev/null
+++ b/miniprogram/pages/deployFunctions/deployFunctions.js
@@ -0,0 +1,66 @@
+// pages/deployFunctions/deployFunctions.js
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ }
+})
\ No newline at end of file
diff --git a/miniprogram/pages/deployFunctions/deployFunctions.json b/miniprogram/pages/deployFunctions/deployFunctions.json
new file mode 100644
index 0000000..d2813ff
--- /dev/null
+++ b/miniprogram/pages/deployFunctions/deployFunctions.json
@@ -0,0 +1,3 @@
+{
+ "navigationBarTitleText": "部署云函数"
+}
\ No newline at end of file
diff --git a/miniprogram/pages/deployFunctions/deployFunctions.wxml b/miniprogram/pages/deployFunctions/deployFunctions.wxml
new file mode 100644
index 0000000..462b6b6
--- /dev/null
+++ b/miniprogram/pages/deployFunctions/deployFunctions.wxml
@@ -0,0 +1,21 @@
+
+
+
+
+
+ 调用失败
+
+
+ 请检查 login 云函数是否已部署
+
+
+
+
+ 部署 login 云函数
+ 1. 确保已通过工具栏云开发入口开通云开发
+ 2. 在 cloudfunctions/login 目录上右键上传并部署
+ 3. 回到首页,重新点击获取 openid
+
+
+
+
diff --git a/miniprogram/pages/deployFunctions/deployFunctions.wxss b/miniprogram/pages/deployFunctions/deployFunctions.wxss
new file mode 100644
index 0000000..c8803e6
--- /dev/null
+++ b/miniprogram/pages/deployFunctions/deployFunctions.wxss
@@ -0,0 +1,7 @@
+/* pages/deployFunctions/deployFunctions.wxss */
+
+@import "../../style/guide.wxss";
+
+.black {
+ color: black;
+}
\ No newline at end of file
diff --git a/miniprogram/pages/index/index.js b/miniprogram/pages/index/index.js
new file mode 100644
index 0000000..df849ae
--- /dev/null
+++ b/miniprogram/pages/index/index.js
@@ -0,0 +1,120 @@
+//index.js
+const app = getApp()
+
+Page({
+ data: {
+ avatarUrl: './user-unlogin.png',
+ userInfo: {},
+ logged: false,
+ takeSession: false,
+ requestResult: ''
+ },
+
+ onLoad: function() {
+ if (!wx.cloud) {
+ wx.redirectTo({
+ url: '../chooseLib/chooseLib',
+ })
+ return
+ }
+
+ // 获取用户信息
+ wx.getSetting({
+ success: res => {
+ if (res.authSetting['scope.userInfo']) {
+ // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
+ wx.getUserInfo({
+ success: res => {
+ this.setData({
+ avatarUrl: res.userInfo.avatarUrl,
+ userInfo: res.userInfo
+ })
+ }
+ })
+ }
+ }
+ })
+ },
+
+ onGetUserInfo: function(e) {
+ if (!this.logged && e.detail.userInfo) {
+ this.setData({
+ logged: true,
+ avatarUrl: e.detail.userInfo.avatarUrl,
+ userInfo: e.detail.userInfo
+ })
+ }
+ },
+
+ onGetOpenid: function() {
+ // 调用云函数
+ wx.cloud.callFunction({
+ name: 'login',
+ data: {},
+ success: res => {
+ console.log('[云函数] [login] user openid: ', res.result.openid)
+ app.globalData.openid = res.result.openid
+ wx.navigateTo({
+ url: '../userConsole/userConsole',
+ })
+ },
+ fail: err => {
+ console.error('[云函数] [login] 调用失败', err)
+ wx.navigateTo({
+ url: '../deployFunctions/deployFunctions',
+ })
+ }
+ })
+ },
+
+ // 上传图片
+ doUpload: function () {
+ // 选择图片
+ wx.chooseImage({
+ count: 1,
+ sizeType: ['compressed'],
+ sourceType: ['album', 'camera'],
+ success: function (res) {
+
+ wx.showLoading({
+ title: '上传中',
+ })
+
+ const filePath = res.tempFilePaths[0]
+
+ // 上传图片
+ const cloudPath = 'my-image' + filePath.match(/\.[^.]+?$/)[0]
+ wx.cloud.uploadFile({
+ cloudPath,
+ filePath,
+ success: res => {
+ console.log('[上传文件] 成功:', res)
+
+ app.globalData.fileID = res.fileID
+ app.globalData.cloudPath = cloudPath
+ app.globalData.imagePath = filePath
+
+ wx.navigateTo({
+ url: '../storageConsole/storageConsole'
+ })
+ },
+ fail: e => {
+ console.error('[上传文件] 失败:', e)
+ wx.showToast({
+ icon: 'none',
+ title: '上传失败',
+ })
+ },
+ complete: () => {
+ wx.hideLoading()
+ }
+ })
+
+ },
+ fail: e => {
+ console.error(e)
+ }
+ })
+ },
+
+})
diff --git a/miniprogram/pages/index/index.wxml b/miniprogram/pages/index/index.wxml
new file mode 100644
index 0000000..d609b87
--- /dev/null
+++ b/miniprogram/pages/index/index.wxml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/miniprogram/pages/index/index.wxss b/miniprogram/pages/index/index.wxss
new file mode 100644
index 0000000..6c4ad51
--- /dev/null
+++ b/miniprogram/pages/index/index.wxss
@@ -0,0 +1,137 @@
+/**index.wxss**/
+
+page {
+ background: #f6f6f6;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+}
+
+.userinfo, .uploader, .tunnel {
+ margin-top: 40rpx;
+ height: 140rpx;
+ width: 100%;
+ background: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ border-left: none;
+ border-right: none;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ transition: all 300ms ease;
+}
+
+.userinfo-avatar {
+ width: 100rpx;
+ height: 100rpx;
+ margin: 20rpx;
+ border-radius: 50%;
+ background-size: cover;
+ background-color: white;
+}
+
+.userinfo-avatar:after {
+ border: none;
+}
+
+.userinfo-nickname {
+ font-size: 32rpx;
+ color: #007aff;
+ background-color: white;
+ background-size: cover;
+}
+
+.userinfo-nickname::after {
+ border: none;
+}
+
+.uploader, .tunnel {
+ height: auto;
+ padding: 0 0 0 40rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ box-sizing: border-box;
+}
+
+.uploader-text, .tunnel-text {
+ width: 100%;
+ line-height: 52px;
+ font-size: 34rpx;
+ color: #007aff;
+}
+
+.uploader-container {
+ width: 100%;
+ height: 400rpx;
+ padding: 20rpx 20rpx 20rpx 0;
+ display: flex;
+ align-content: center;
+ justify-content: center;
+ box-sizing: border-box;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+.uploader-image {
+ width: 100%;
+ height: 360rpx;
+}
+
+.tunnel {
+ padding: 0 0 0 40rpx;
+}
+
+.tunnel-text {
+ position: relative;
+ color: #222;
+ display: flex;
+ flex-direction: row;
+ align-content: center;
+ justify-content: space-between;
+ box-sizing: border-box;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+.tunnel-text:first-child {
+ border-top: none;
+}
+
+.tunnel-switch {
+ position: absolute;
+ right: 20rpx;
+ top: -2rpx;
+}
+
+.disable {
+ color: #888;
+}
+
+.service {
+ position: fixed;
+ right: 40rpx;
+ bottom: 40rpx;
+ width: 140rpx;
+ height: 140rpx;
+ border-radius: 50%;
+ background: linear-gradient(#007aff, #0063ce);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
+ display: flex;
+ align-content: center;
+ justify-content: center;
+ transition: all 300ms ease;
+}
+
+.service-button {
+ position: absolute;
+ top: 40rpx;
+}
+
+.service:active {
+ box-shadow: none;
+}
+
+.request-text {
+ padding: 20rpx 0;
+ font-size: 24rpx;
+ line-height: 36rpx;
+ word-break: break-all;
+}
diff --git a/miniprogram/pages/index/user-unlogin.png b/miniprogram/pages/index/user-unlogin.png
new file mode 100644
index 0000000..95b27e4
Binary files /dev/null and b/miniprogram/pages/index/user-unlogin.png differ
diff --git a/miniprogram/pages/storageConsole/storageConsole.js b/miniprogram/pages/storageConsole/storageConsole.js
new file mode 100644
index 0000000..a6aef19
--- /dev/null
+++ b/miniprogram/pages/storageConsole/storageConsole.js
@@ -0,0 +1,32 @@
+// pages/storageConsole/storageConsole.js
+
+const app = getApp()
+
+Page({
+
+ data: {
+ fileID: '',
+ cloudPath: '',
+ imagePath: '',
+ },
+
+ onLoad: function (options) {
+
+ const {
+ fileID,
+ cloudPath,
+ imagePath,
+ } = app.globalData
+
+ this.setData({
+ fileID,
+ cloudPath,
+ imagePath,
+ })
+
+ console.group('文件存储文档')
+ console.log('https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/storage.html')
+ console.groupEnd()
+ },
+
+})
\ No newline at end of file
diff --git a/miniprogram/pages/storageConsole/storageConsole.json b/miniprogram/pages/storageConsole/storageConsole.json
new file mode 100644
index 0000000..5aaac90
--- /dev/null
+++ b/miniprogram/pages/storageConsole/storageConsole.json
@@ -0,0 +1,3 @@
+{
+ "navigationBarTitleText": "文件存储指引"
+}
\ No newline at end of file
diff --git a/miniprogram/pages/storageConsole/storageConsole.wxml b/miniprogram/pages/storageConsole/storageConsole.wxml
new file mode 100644
index 0000000..bd25211
--- /dev/null
+++ b/miniprogram/pages/storageConsole/storageConsole.wxml
@@ -0,0 +1,29 @@
+
+
+
+
+
+ 上传成功
+
+
+ 文件 ID:{{fileID}}
+
+
+ 云文件路径:{{cloudPath}}
+
+
+
+
+
+
+
+
+ 云开发控制台中管理文件
+ 1. 打开云开发控制台
+
+ 2. 切换到文件管理标签页
+ 3. 可查看文件列表、管理权限
+ 4. 详细的教程和 API 文件,可点击调试器中打印的链接查看
+
+
+
\ No newline at end of file
diff --git a/miniprogram/pages/storageConsole/storageConsole.wxss b/miniprogram/pages/storageConsole/storageConsole.wxss
new file mode 100644
index 0000000..891166d
--- /dev/null
+++ b/miniprogram/pages/storageConsole/storageConsole.wxss
@@ -0,0 +1,7 @@
+/* pages/storageConsole/storageConsole.wxss */
+
+@import "../../style/guide.wxss";
+
+.black {
+ color: black;
+}
diff --git a/miniprogram/pages/userConsole/userConsole.js b/miniprogram/pages/userConsole/userConsole.js
new file mode 100644
index 0000000..44b8810
--- /dev/null
+++ b/miniprogram/pages/userConsole/userConsole.js
@@ -0,0 +1,13 @@
+// pages/userConsole/userConsole.js
+Page({
+
+ data: {
+ openid: ''
+ },
+
+ onLoad: function (options) {
+ this.setData({
+ openid: getApp().globalData.openid
+ })
+ }
+})
\ No newline at end of file
diff --git a/miniprogram/pages/userConsole/userConsole.json b/miniprogram/pages/userConsole/userConsole.json
new file mode 100644
index 0000000..1c33af9
--- /dev/null
+++ b/miniprogram/pages/userConsole/userConsole.json
@@ -0,0 +1,3 @@
+{
+ "navigationBarTitleText": "用户管理指引"
+}
\ No newline at end of file
diff --git a/miniprogram/pages/userConsole/userConsole.wxml b/miniprogram/pages/userConsole/userConsole.wxml
new file mode 100644
index 0000000..6afaaf7
--- /dev/null
+++ b/miniprogram/pages/userConsole/userConsole.wxml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ 用户 openid 获取成功
+
+
+ {{openid}}
+
+
+
+
+
+ 云开发管理用户
+ 1. 打开云开发控制台
+
+ 2. 切换到 "用户管理" 标签页
+ 3. 查看访问小程序的用户列表
+
+
+
\ No newline at end of file
diff --git a/miniprogram/pages/userConsole/userConsole.wxss b/miniprogram/pages/userConsole/userConsole.wxss
new file mode 100644
index 0000000..334db60
--- /dev/null
+++ b/miniprogram/pages/userConsole/userConsole.wxss
@@ -0,0 +1,3 @@
+/* pages/userConsole/userConsole.wxss */
+
+@import "../../style/guide.wxss";
diff --git a/miniprogram/style/guide.wxss b/miniprogram/style/guide.wxss
new file mode 100644
index 0000000..b16fc8b
--- /dev/null
+++ b/miniprogram/style/guide.wxss
@@ -0,0 +1,144 @@
+page {
+ background: #f6f6f6;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+}
+
+.list {
+ margin-top: 40rpx;
+ height: auto;
+ width: 100%;
+ background: #fff;
+ padding: 0 40rpx;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ border-left: none;
+ border-right: none;
+ transition: all 300ms ease;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ box-sizing: border-box;
+}
+
+.list-item {
+ width: 100%;
+ padding: 0;
+ line-height: 104rpx;
+ font-size: 34rpx;
+ color: #007aff;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+ display: flex;
+ flex-direction: row;
+ align-content: center;
+ justify-content: space-between;
+ box-sizing: border-box;
+}
+
+.list-item:first-child {
+ border-top: none;
+}
+
+.list-item image {
+ max-width: 100%;
+ max-height: 20vh;
+ margin: 20rpx 0;
+}
+
+.request-text {
+ color: #222;
+ padding: 20rpx 0;
+ font-size: 24rpx;
+ line-height: 36rpx;
+ word-break: break-all;
+}
+
+.guide {
+ width: 100%;
+ padding: 40rpx;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+}
+
+.guide .headline {
+ font-size: 34rpx;
+ font-weight: bold;
+ color: #555;
+ line-height: 40rpx;
+}
+
+.guide .p {
+ margin-top: 20rpx;
+ font-size: 28rpx;
+ line-height: 36rpx;
+ color: #666;
+}
+
+.guide .code {
+ margin-top: 20rpx;
+ font-size: 28rpx;
+ line-height: 36rpx;
+ color: #666;
+ background: white;
+ white-space: pre;
+}
+
+.guide .code-dark {
+ margin-top: 20rpx;
+ background: rgba(0, 0, 0, 0.8);
+ padding: 20rpx;
+ font-size: 28rpx;
+ line-height: 36rpx;
+ border-radius: 6rpx;
+ color: #fff;
+ white-space: pre
+}
+
+.guide image {
+ max-width: 100%;
+}
+
+.guide .image1 {
+ margin-top: 20rpx;
+ max-width: 100%;
+ width: 356px;
+ height: 47px;
+}
+
+.guide .image2 {
+ margin-top: 20rpx;
+ width: 264px;
+ height: 100px;
+}
+
+.guide .flat-image {
+ height: 100px;
+}
+
+.guide .code-image {
+ max-width: 100%;
+}
+
+.guide .copyBtn {
+ width: 180rpx;
+ font-size: 20rpx;
+ margin-top: 16rpx;
+ margin-left: 0;
+}
+
+.guide .nav {
+ margin-top: 50rpx;
+ display: flex;
+ flex-direction: row;
+ align-content: space-between;
+}
+
+.guide .nav .prev {
+ margin-left: unset;
+}
+
+.guide .nav .next {
+ margin-right: unset;
+}
+
diff --git a/pages/IDcard/IDcard.js b/pages/IDcard/IDcard.js
new file mode 100644
index 0000000..73283ad
--- /dev/null
+++ b/pages/IDcard/IDcard.js
@@ -0,0 +1,244 @@
+
+
+
+
+//index.js
+
+const app = getApp()
+
+import QRCode from '../index/qrCode.js'
+var CusBase64 = require('../index/base64.js');
+
+var shu;
+//返回码大全::由番茄树精心调配
+// state 状态
+// 666 success
+// 14 数据插入数据库失败
+// 21 密码错误
+// 17 找不到用户
+// 10 用户名或密码为空
+// 40 无法连接到服务器
+
+var rck = 'rememberCheck';
+var rui = 'rememberUserInfo';
+var rbFlag = false;
+
+
+
+Page({
+
+ //定义了两个数据变量,一个是login,请在login中记录用户名和密码,,另一个是tomatotrees,用于记录返回数据
+ //具体使用请参阅示例wxml文件
+ data:
+ {
+ edata: {},
+ qr: {}, //二维码
+ fp: {},
+ fingerprint: '',
+ test: '',
+ usr:'',
+ password: ''
+ },
+
+ onLoad: function (options) {
+
+ wx.scanCode({
+ success(res) {
+ console.log(res)
+ }
+ })
+ var that = this;
+ this.fp();
+ wx.getStorage({
+ key: 'ridp',
+ success: function (res) {
+ console.log(res.data);
+ var edata = res.data;
+ that.setData
+ ({
+ edata : res.data
+ })
+ console.log('edata',edata);
+
+
+ },
+ })
+ this.encode('abcdefghigk');
+ console.log(options);
+
+ this.potatotrees_qr();
+
+
+ setTimeout(function () {
+ that.potatotrees_qr();
+ //要延时执行的代码
+ }, 500) //延迟时间 这里是1秒
+ setTimeout(function () {
+ that.potatotrees_qr();
+ //要延时执行的代码
+ }, 50000) //延迟时间 这里是1秒
+ setTimeout(function () {
+ that.potatotrees_qr();
+ //要延时执行的代码
+ }, 50000) //延迟时间 这里是1秒
+ setTimeout(function () {
+ that.potatotrees_qr();
+ //要延时执行的代码
+ }, 50000) //延迟时间 这里是1秒
+ setTimeout(function () {
+ that.potatotrees_qr();
+ //要延时执行的代码
+ }, 50000) //延迟时间 这里是1秒
+
+ },
+
+ finger: function () {
+
+ var that = this;
+ wx.getStorage({
+ key: 'ridp',
+ success: function (res) {
+ console.log(res.data);
+ var edata = res.data;
+ var usr = '';
+
+ that.setData
+ ({
+ edata: res.data
+ })
+ console.log('edata', edata);
+ usr = that.data.edata.usr;
+ console.log('usr', usr);
+ shu = res.data.usr;
+ console.log('usr??????', shu);
+
+
+ var fingerprint = that.data.fp.model + '_' + that.data.fp.pixelRatio + '_' + that.data.fp.system + '_' +shu;
+ console.log(fingerprint);
+ var md5 = require('../index/md5.js');
+ var fingerprint = md5.md5(fingerprint);
+ console.log(fingerprint);
+ that.setData
+ ({
+ fingerprint: fingerprint
+ })
+ return fingerprint;
+ },
+ })
+
+ },
+
+
+ //使用this.tomatotrees.state获取返回状态码,使用this.tomatotrees.tip获取返回状态提示信息
+ //使用this.tomatotrees.name获取姓名,使用this.tomatotrees.id获取id, 使用this.tomatotrees.image获取头像地址
+
+
+
+ ///qr code get 获得二维码的函数,使用this.qr.state获取返回状态码,使用this.qr.key获取识别码
+ //二维码暂定默认失效期60秒
+ potatotrees_qr: function () {
+ var that = this;
+ this.finger();
+ var fingerprint = this.data.fingerprint;
+ console.log(fingerprint);
+ fingerprint = this.encode(fingerprint);
+ wx.request
+ ({
+ header: { "Content-Type": "application/x-www-form-urlencoded" },
+ url: 'https://yimian.xyz/student_id/iddev/key_produce.php',
+ method: 'POST',
+ data:
+ {
+ fingerprint: fingerprint
+ },
+ success: function (res2) {
+
+ that.setData
+ ({
+ qr: res2.data
+ })
+
+ var qrcode = new QRCode('canvas', {
+ text: res2.data.key,
+ width: 180,
+ height: 180,
+ colorDark: '#000000',
+ colorLight: '#ffffff',
+ correctLevel: QRCode.correctLevel.H
+ })
+ },
+ fail: function () {
+ this.data.tomatotrees.state = 40;
+ this.data.tomatotrees.tip = 'Cannot connect to the server!';
+ }
+
+ })
+
+ },
+
+
+
+
+
+ //获取设备信息
+ fp: function (e)
+ {
+ var that = this;
+
+ wx.getSystemInfo({
+ success: function (res3) {
+ that.setData
+ ({
+ fp: res3
+ })
+ }
+ })
+ },
+
+ //加密函数
+ encode: function (str) {
+ var that = this;
+
+ var time2 = Date.now() + '';
+ var time8 = time2.substr(7, 1);
+ var time9 = time2.substr(8, 1);
+
+ var str1 = str.substr(0, 6);
+ var str2 = str.substr(6, 3);
+ var str3 = str.substr(9);
+
+ var str_ = str1 + time8 + str2 + time9 + str3;
+
+ var rand = parseInt(time2.substr(9, 1));
+
+ str_ = CusBase64.CusBASE64.encoder(str_);
+
+ str_ = str_.substr(0, 2) + '5BfPh4' + str_.substr(2);
+
+ for (var i = 0; i < 4; i++) {
+ str_ = CusBase64.CusBASE64.encoder(str_);
+ }
+
+
+ that.setData({
+ test: str_
+ })
+
+ return str_;
+ },
+
+//返回登录页清楚缓存
+ moveTo1: function () {
+
+ wx.navigateBack({
+ delta: 1,
+ })
+ wx.clearStorageSync()
+ wx.clearStorage()
+ var edata = ''
+
+ },
+
+})
+
+
diff --git a/pages/IDcard/IDcard.json b/pages/IDcard/IDcard.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/pages/IDcard/IDcard.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/pages/IDcard/IDcard.wxml b/pages/IDcard/IDcard.wxml
new file mode 100644
index 0000000..5870326
--- /dev/null
+++ b/pages/IDcard/IDcard.wxml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{edata.ename}}
+
+
+
+
+ {{edata.name}}
+
+
+
+
+
+ {{edata.id}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/IDcard/IDcard.wxss b/pages/IDcard/IDcard.wxss
new file mode 100644
index 0000000..aaff8d9
--- /dev/null
+++ b/pages/IDcard/IDcard.wxss
@@ -0,0 +1,78 @@
+/* pages/eid/eid.wxss */
+.eid_cardBackground{
+
+ margin-top: 100rpx;
+
+
+ display: flex;
+ justify-content: center;
+
+ }
+
+.eid_Photo{
+ margin-top: -360rpx;
+ margin-left: 445rpx;
+ padding-top:2%;
+ }
+page{
+ background-image: url("data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAlgCWAAD/4SiMRXhpZgAATU0AKgAAAAgABgALAAIAAAAmAAAIYgESAAMAAAABAAEAAAExAAIAAAAmAAAIiAEyAAIAAAAUAAAIrodpAAQAAAABAAAIwuocAAcAAAgMAAAAVgAAEUYc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdpbmRvd3MgUGhvdG8gRWRpdG9yIDEwLjAuMTAwMTEuMTYzODQAV2luZG93cyBQaG90byBFZGl0b3IgMTAuMC4xMDAxMS4xNjM4NAAyMDE4OjA3OjE5IDIyOjM2OjU0AAAGkAMAAgAAABQAABEckAQAAgAAABQAABEwkpEAAgAAAAM0MAAAkpIAAgAAAAM0MAAAoAEAAwAAAAEAAQAA6hwABwAACAwAAAkQAAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAxODowNzoxOSAxMDo0MjoxNwAyMDE4OjA3OjE5IDEwOjQyOjE3AAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAAEZQBGwAFAAAAAQAAEZwBKAADAAAAAQAC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OVQxMDo0MjoxNy4zOTg8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9J3cnPz7/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAP5AkUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8/wA/lSbaWivvbHwgUZooosAZozS7TSUrAFFL1pKLAFFFLgntTASil20bTTFcSil20baYxKKXbRtoASil207bQAzNLg+tO20u2kAzkUmafRtp6CG80mak2+9JtpC5hmaXmnbaXB9aQuYjzRmn7aNgqtBjM0uD607YKdjikO5FmjNP20baQrjcH1owfWnU6qHcizRmn7aNtILjM0vNO206kK5HzSin0UBcj5o2mpKKYcxHto5qSkwfWgOYZg+tGD60/bSUhcw3mkzUmD60m2gdxuD60nSpNtNZaY7jc0ZpdtG2q0GJmil2mjbUh8xKKXbRtqtAEopdtG2jQQlFLto20guJRS7aNtIYlFFFABTdtOooAKKKXbQAlN2+9PxikpAMpdtOopjG7aKdRQO4u00bT6VJRRdkXI9p9KVVqTPtSUXYXCmsuelOopC5hgB9KMe1SZoz7UBzEePanLTs+1Jj0oHcKKMe5ooEFFFLtoJuJRS7aSgLhRRRQLmCiiigOYKKXaaNpqrAJRRRUiuFFFFAXCil2mjbVWGJRRRUiuFFFFAXCil2mjaaAuJRS7TRtNACUUUu2gLiUZ9qXbTqAuMopxWk2mrGJRRRUAFFFFABRRRVgFFFFQAUUUVVx3CiiipEFFFFVcdwoooouUFFFGaQDaXbRxRyaodxm2jaaftpM0BcbtNG01JmjNK4XI9pp1OzRxRcLjGpNpp7UmaYxu00bTUmaKBXIqKlopBcKKKXbUmYlFLto20CuJRTttG2qC42iiimMKKdto20CuNopadQMbtNOoopWFcKKKKYXCiiigkKKKXaaAEoopdtACUUu2jbQAlFLto20AJRS7aNtACUUu2jbQAlFLtpaAG0Uu2koAKKXaaNpoASil20baAEopcYpKACil20YxQAzb70badRUlXCm7adRVBcKKKKAuFNp1FKwXG7aNtOpcZphcZto20/aaSgLjcGjaadRQK4yinhQaTaKCuYaRmk20/aKNooDmGbaMGn7RRtFAcwzB9aWnbRRtFAcwzbRtp+0UbRQHMM20baftFG2gOYbj1opdpo2mgdxu2loooHcKKKKVgH0UUUWIuFFFFOxIUUU78KAG0U4ik20FXEop22l2igkTbSbadSc0FXE20badS7aCLjNtG2pNo9abtNAxu2nbaXaadtNArjNtGadRimFxu2jn0p1Ln2pBdDOfSin59qSrFzDefSjn0p9JU2DmG8+lFPz7UlFg5htFO2+1LtosO4yin7aSiwXG8+lG2nUu2kFxmaM0/bSbcVYXG0Uu2loC42kp9JtoC4lIeadto20DGbaNtP20baVhXGbaNtP20baYXGbaNtP20lAXG7TRtNOzRmgYylU07aKNopAJupM+1O2ijaKAG59qOPSnbRRtFADd3tRn2p20U3bQAvFJtpRxRz7UrAJto6UvPtSGkAbaNtG6jdTsAbaNtG6jdRYA20u2k3UbqLALSbaN1G6iwBto20bqN1Fhjdhop+aKQXE20bafto20CGbaWnbaNtO4rjaWl20baoYlLtpVUUu33oFcZS7akpu2psFxu2neWKXbS0WFzDdtOooosTcKTJ9KWimFxMn0paKKYBj2pQpzjGaNvQVo2MMaDfJ096xq1VRjzSOmjRlXlyozSPbFFbMlrb3g/dEA+lZ1xZvC2CCB61hRxNOsrpmtfB1MO7TRXopcEHFG2u3pc4bCUUu2jbQISinUm2kAlFLtpKsAooooGFFFFSO4UHmiigQUUUUDCiiikIKKKKAuFFFFA7jKKfRTC4yl20u2lpBcZSbadt96NtBVxu2jbTtvvRt96AuJRS7fejb70BcSil2+9DLQFxKKVRSUBcTYKWil61WgXG7aNtO6UlIZHg+tGD61JRTsBH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");
+ background-repeat:no-repeat; background-size:100% 100%;-moz-background-size:70% 70%
+ }
+
+
+.eid_EngName{
+ margin-top: -130rpx;
+ margin-left: 120rpx;
+ font-size: 80%;
+ color: #FFFFFF;
+}
+
+.eid_Name{
+ margin-top: 7rpx;
+ margin-left: 120rpx;
+ font-size: 100%;
+ color: #FFFFFF;
+}
+
+
+.eid_ID{
+ margin-top: 7rpx;
+ margin-left: 120rpx;
+ font-size: 80%;
+ color: #FFFFFF;
+}
+.eid_Name{
+ margin-top: 7rpx;
+ margin-left: 120rpx;
+ font-size: 80%;
+ color: #FFFFFF;
+}
+.page1 {
+ position: absolute;
+
+ left: 80px;
+
+ bottom: 40px;
+
+ width: 60px;
+
+ height: 60px;
+
+
+}
+
+
+.page2 {
+
+ position: absolute;
+
+ right: 80px;
+
+ bottom: 40px;
+
+ width: 60px;
+
+ height: 60px;
+
+
+}
\ No newline at end of file
diff --git a/pages/images/ID.png b/pages/images/ID.png
new file mode 100644
index 0000000..1501e71
Binary files /dev/null and b/pages/images/ID.png differ
diff --git a/pages/images/back.jpg b/pages/images/back.jpg
new file mode 100644
index 0000000..b8550f0
Binary files /dev/null and b/pages/images/back.jpg differ
diff --git a/pages/images/eid/Background.jpg b/pages/images/eid/Background.jpg
new file mode 100644
index 0000000..3f7f65b
Binary files /dev/null and b/pages/images/eid/Background.jpg differ
diff --git a/pages/images/eid/Picture2.png b/pages/images/eid/Picture2.png
new file mode 100644
index 0000000..8b8e50e
Binary files /dev/null and b/pages/images/eid/Picture2.png differ
diff --git a/pages/images/eid/Picture3.png b/pages/images/eid/Picture3.png
new file mode 100644
index 0000000..f804366
Binary files /dev/null and b/pages/images/eid/Picture3.png differ
diff --git a/pages/images/eid/eid_Photo.png b/pages/images/eid/eid_Photo.png
new file mode 100644
index 0000000..eb19c92
Binary files /dev/null and b/pages/images/eid/eid_Photo.png differ
diff --git a/pages/images/eid/eid_carBackgroud.png b/pages/images/eid/eid_carBackgroud.png
new file mode 100644
index 0000000..a388691
Binary files /dev/null and b/pages/images/eid/eid_carBackgroud.png differ
diff --git a/pages/images/eid/eid_cardBackground.png b/pages/images/eid/eid_cardBackground.png
new file mode 100644
index 0000000..df96850
Binary files /dev/null and b/pages/images/eid/eid_cardBackground.png differ
diff --git a/pages/images/eid/eid_logo.png b/pages/images/eid/eid_logo.png
new file mode 100644
index 0000000..c194fcd
Binary files /dev/null and b/pages/images/eid/eid_logo.png differ
diff --git a/pages/images/eid/eid_tran.png b/pages/images/eid/eid_tran.png
new file mode 100644
index 0000000..9c81c62
Binary files /dev/null and b/pages/images/eid/eid_tran.png differ
diff --git a/pages/images/eid/page 1.png b/pages/images/eid/page 1.png
new file mode 100644
index 0000000..3158655
Binary files /dev/null and b/pages/images/eid/page 1.png differ
diff --git a/pages/images/eid/page 2.png b/pages/images/eid/page 2.png
new file mode 100644
index 0000000..40da0bd
Binary files /dev/null and b/pages/images/eid/page 2.png differ
diff --git a/pages/images/eid/qr.png b/pages/images/eid/qr.png
new file mode 100644
index 0000000..9bd3c4f
Binary files /dev/null and b/pages/images/eid/qr.png differ
diff --git a/pages/images/key.png b/pages/images/key.png
new file mode 100644
index 0000000..f804366
Binary files /dev/null and b/pages/images/key.png differ
diff --git a/pages/images/name.png b/pages/images/name.png
new file mode 100644
index 0000000..8b8e50e
Binary files /dev/null and b/pages/images/name.png differ
diff --git a/pages/images/no.png b/pages/images/no.png
new file mode 100644
index 0000000..a6571e5
Binary files /dev/null and b/pages/images/no.png differ
diff --git a/pages/images/ok.png b/pages/images/ok.png
new file mode 100644
index 0000000..2859647
Binary files /dev/null and b/pages/images/ok.png differ
diff --git a/pages/images/page1.png b/pages/images/page1.png
new file mode 100644
index 0000000..3158655
Binary files /dev/null and b/pages/images/page1.png differ
diff --git a/pages/images/page2.png b/pages/images/page2.png
new file mode 100644
index 0000000..40da0bd
Binary files /dev/null and b/pages/images/page2.png differ
diff --git a/pages/img/eid/Background.jpg b/pages/img/eid/Background.jpg
new file mode 100644
index 0000000..3f7f65b
Binary files /dev/null and b/pages/img/eid/Background.jpg differ
diff --git a/pages/img/eid/Picture2.png b/pages/img/eid/Picture2.png
new file mode 100644
index 0000000..8b8e50e
Binary files /dev/null and b/pages/img/eid/Picture2.png differ
diff --git a/pages/img/eid/Picture3.png b/pages/img/eid/Picture3.png
new file mode 100644
index 0000000..f804366
Binary files /dev/null and b/pages/img/eid/Picture3.png differ
diff --git a/pages/img/eid/eid_Photo.png b/pages/img/eid/eid_Photo.png
new file mode 100644
index 0000000..eb19c92
Binary files /dev/null and b/pages/img/eid/eid_Photo.png differ
diff --git a/pages/img/eid/eid_carBackgroud.png b/pages/img/eid/eid_carBackgroud.png
new file mode 100644
index 0000000..a388691
Binary files /dev/null and b/pages/img/eid/eid_carBackgroud.png differ
diff --git a/pages/img/eid/eid_cardBackground.png b/pages/img/eid/eid_cardBackground.png
new file mode 100644
index 0000000..df96850
Binary files /dev/null and b/pages/img/eid/eid_cardBackground.png differ
diff --git a/pages/img/eid/eid_logo.png b/pages/img/eid/eid_logo.png
new file mode 100644
index 0000000..c194fcd
Binary files /dev/null and b/pages/img/eid/eid_logo.png differ
diff --git a/pages/img/eid/eid_tran.png b/pages/img/eid/eid_tran.png
new file mode 100644
index 0000000..9c81c62
Binary files /dev/null and b/pages/img/eid/eid_tran.png differ
diff --git a/pages/img/eid/page 1.png b/pages/img/eid/page 1.png
new file mode 100644
index 0000000..3158655
Binary files /dev/null and b/pages/img/eid/page 1.png differ
diff --git a/pages/img/eid/page 2.png b/pages/img/eid/page 2.png
new file mode 100644
index 0000000..40da0bd
Binary files /dev/null and b/pages/img/eid/page 2.png differ
diff --git a/pages/img/eid/qr.png b/pages/img/eid/qr.png
new file mode 100644
index 0000000..9bd3c4f
Binary files /dev/null and b/pages/img/eid/qr.png differ
diff --git a/pages/index/base64.js b/pages/index/base64.js
new file mode 100644
index 0000000..2e5da19
--- /dev/null
+++ b/pages/index/base64.js
@@ -0,0 +1,219 @@
+
+(function () {
+ var BASE64_MAPPING = [
+ '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', '0', '1', '2', '3',
+ '4', '5', '6', '7', '8', '9', '+', '/'
+ ];
+
+ /**
+ *ascii convert to binary
+ */
+ var _toBinary = function (ascii) {
+ var binary = new Array();
+ while (ascii > 0) {
+ var b = ascii % 2;
+ ascii = Math.floor(ascii / 2);
+ binary.push(b);
+ }
+ /*
+ var len = binary.length;
+ if(6-len > 0){
+ for(var i = 6-len ; i > 0 ; --i){
+ binary.push(0);
+ }
+ }*/
+ binary.reverse();
+ return binary;
+ };
+
+ /**
+ *binary convert to decimal
+ */
+ var _toDecimal = function (binary) {
+ var dec = 0;
+ var p = 0;
+ for (var i = binary.length - 1; i >= 0; --i) {
+ var b = binary[i];
+ if (b == 1) {
+ dec += Math.pow(2, p);
+ }
+ ++p;
+ }
+ return dec;
+ };
+
+ /**
+ *unicode convert to utf-8
+ */
+ var _toUTF8Binary = function (c, binaryArray) {
+ var mustLen = (8 - (c + 1)) + ((c - 1) * 6);
+ var fatLen = binaryArray.length;
+ var diff = mustLen - fatLen;
+ while (--diff >= 0) {
+ binaryArray.unshift(0);
+ }
+ var binary = [];
+ var _c = c;
+ while (--_c >= 0) {
+ binary.push(1);
+ }
+ binary.push(0);
+ var i = 0, len = 8 - (c + 1);
+ for (; i < len; ++i) {
+ binary.push(binaryArray[i]);
+ }
+
+ for (var j = 0; j < c - 1; ++j) {
+ binary.push(1);
+ binary.push(0);
+ var sum = 6;
+ while (--sum >= 0) {
+ binary.push(binaryArray[i++]);
+ }
+ }
+ return binary;
+ };
+
+ var __BASE64 = {
+ /**
+ *BASE64 Encode
+ */
+ encoder: function (str) {
+ var base64_Index = [];
+ var binaryArray = [];
+ for (var i = 0, len = str.length; i < len; ++i) {
+ var unicode = str.charCodeAt(i);
+ var _tmpBinary = _toBinary(unicode);
+ if (unicode < 0x80) {
+ var _tmpdiff = 8 - _tmpBinary.length;
+ while (--_tmpdiff >= 0) {
+ _tmpBinary.unshift(0);
+ }
+ binaryArray = binaryArray.concat(_tmpBinary);
+ } else if (unicode >= 0x80 && unicode <= 0x7FF) {
+ binaryArray = binaryArray.concat(_toUTF8Binary(2, _tmpBinary));
+ } else if (unicode >= 0x800 && unicode <= 0xFFFF) {//UTF-8 3byte
+ binaryArray = binaryArray.concat(_toUTF8Binary(3, _tmpBinary));
+ } else if (unicode >= 0x10000 && unicode <= 0x1FFFFF) {//UTF-8 4byte
+ binaryArray = binaryArray.concat(_toUTF8Binary(4, _tmpBinary));
+ } else if (unicode >= 0x200000 && unicode <= 0x3FFFFFF) {//UTF-8 5byte
+ binaryArray = binaryArray.concat(_toUTF8Binary(5, _tmpBinary));
+ } else if (unicode >= 4000000 && unicode <= 0x7FFFFFFF) {//UTF-8 6byte
+ binaryArray = binaryArray.concat(_toUTF8Binary(6, _tmpBinary));
+ }
+ }
+
+ var extra_Zero_Count = 0;
+ for (var i = 0, len = binaryArray.length; i < len; i += 6) {
+ var diff = (i + 6) - len;
+ if (diff == 2) {
+ extra_Zero_Count = 2;
+ } else if (diff == 4) {
+ extra_Zero_Count = 4;
+ }
+ //if(extra_Zero_Count > 0){
+ // len += extra_Zero_Count+1;
+ //}
+ var _tmpExtra_Zero_Count = extra_Zero_Count;
+ while (--_tmpExtra_Zero_Count >= 0) {
+ binaryArray.push(0);
+ }
+ base64_Index.push(_toDecimal(binaryArray.slice(i, i + 6)));
+ }
+
+ var base64 = '';
+ for (var i = 0, len = base64_Index.length; i < len; ++i) {
+ base64 += BASE64_MAPPING[base64_Index[i]];
+ }
+
+ for (var i = 0, len = extra_Zero_Count / 2; i < len; ++i) {
+ base64 += '=';
+ }
+ return base64;
+ },
+ /**
+ *BASE64 Decode for UTF-8
+ */
+ decoder: function (_base64Str) {
+ var _len = _base64Str.length;
+ var extra_Zero_Count = 0;
+ /**
+ *计算在进行BASE64编码的时候,补了几个0
+ */
+ if (_base64Str.charAt(_len - 1) == '=') {
+ //alert(_base64Str.charAt(_len-1));
+ //alert(_base64Str.charAt(_len-2));
+ if (_base64Str.charAt(_len - 2) == '=') {//两个等号说明补了4个0
+ extra_Zero_Count = 4;
+ _base64Str = _base64Str.substring(0, _len - 2);
+ } else {//一个等号说明补了2个0
+ extra_Zero_Count = 2;
+ _base64Str = _base64Str.substring(0, _len - 1);
+ }
+ }
+
+ var binaryArray = [];
+ for (var i = 0, len = _base64Str.length; i < len; ++i) {
+ var c = _base64Str.charAt(i);
+ for (var j = 0, size = BASE64_MAPPING.length; j < size; ++j) {
+ if (c == BASE64_MAPPING[j]) {
+ var _tmp = _toBinary(j);
+ /*不足6位的补0*/
+ var _tmpLen = _tmp.length;
+ if (6 - _tmpLen > 0) {
+ for (var k = 6 - _tmpLen; k > 0; --k) {
+ _tmp.unshift(0);
+ }
+ }
+ binaryArray = binaryArray.concat(_tmp);
+ break;
+ }
+ }
+ }
+
+ if (extra_Zero_Count > 0) {
+ binaryArray = binaryArray.slice(0, binaryArray.length - extra_Zero_Count);
+ }
+
+ var unicode = [];
+ var unicodeBinary = [];
+ for (var i = 0, len = binaryArray.length; i < len;) {
+ if (binaryArray[i] == 0) {
+ unicode = unicode.concat(_toDecimal(binaryArray.slice(i, i + 8)));
+ i += 8;
+ } else {
+ var sum = 0;
+ while (i < len) {
+ if (binaryArray[i] == 1) {
+ ++sum;
+ } else {
+ break;
+ }
+ ++i;
+ }
+ unicodeBinary = unicodeBinary.concat(binaryArray.slice(i + 1, i + 8 - sum));
+ i += 8 - sum;
+ while (sum > 1) {
+ unicodeBinary = unicodeBinary.concat(binaryArray.slice(i + 2, i + 8));
+ i += 8;
+ --sum;
+ }
+ unicode = unicode.concat(_toDecimal(unicodeBinary));
+ unicodeBinary = [];
+ }
+ }
+ return unicode;
+ }
+ };
+
+ //window.BASE64 = __BASE64;
+ module.exports = {
+ CusBASE64: __BASE64
+ }
+})();
\ No newline at end of file
diff --git a/pages/index/index.js b/pages/index/index.js
new file mode 100644
index 0000000..448966c
--- /dev/null
+++ b/pages/index/index.js
@@ -0,0 +1,155 @@
+Page({
+ /**
+ * 初始化数据
+ */
+ data: {
+ phone: '',
+ password: '',
+ url: ''
+ },
+ onLoad: function (options) {
+ var that = this;
+
+
+ wx.scanCode({
+ success(res) {
+
+ console.log(res)
+ that.data.url = res.result;
+
+ if (that.data.phone != '' && that.data.password != '' && that.data.url != '') {
+ console.log('yayayayayayyaayyayaayay')
+
+ wx.request({
+ url: 'https://yimian.xyz/qr_scan_ice', //仅为示例,并非真实的接口地址
+ data: {
+ usr: that.data.phone,
+ pswd: that.data.password,
+ url: that.data.url
+ },
+ header: {
+ 'content-type': 'application/json' // 默认值
+ },
+ success(res) {
+ console.log(res.data.msg)
+ that.showok(res.data);
+ }
+ })
+
+
+
+ }
+ }
+ })
+
+ wx.getStorage({
+ key: 'usr',
+ success(res) {
+ console.log('stor usr:'+res.data)
+ that.data.phone = res.data;
+ console.log('stor usr:' + that.data.phone)
+ }
+ })
+
+ wx.getStorage({
+ key: 'psswd',
+ success(res) {
+ console.log('stor psd:' +res.data)
+ that.data.password = res.data;
+ console.log('stor psd:' + that.data.password)
+ }
+ })
+
+
+ },
+ /**
+ * 监听手机号输入,并把输入的值保存在data变量中
+ */
+ listenerPhoneInput: function (e) {
+ console.log('Phone=' + e.detail.value)
+ this.data.phone = e.detail.value;
+
+ },
+ /**
+ * 监听密码输入,并把输入的值保存在data变量中
+ */
+ listenerPasswordInput: function (e) {
+ console.log('Password=' + e.detail.value)
+ this.data.password = e.detail.value;
+ },
+ /**
+ * 监听登录按钮,获取保存在data变量中的值
+ */
+ listenerLogin: function () {
+ var that=this;
+ //打印收入账号和密码
+ console.log('手机号为: ', this.data.phone);
+ console.log('密码为: ', this.data.password);
+ console.log('url为: ', this.data.url);
+ wx.setStorage({
+ key: "usr",
+ data: that.data.phone
+ })
+ wx.setStorage({
+ key: "psswd",
+ data: that.data.password
+ })
+
+ wx.request({
+ url: 'https://yimian.xyz/qr_scan_ice', //仅为示例,并非真实的接口地址
+ data: {
+ usr: that.data.phone,
+ pswd: that.data.password,
+ url: that.data.url
+ },
+ header: {
+ 'content-type': 'application/json' // 默认值
+ },
+ success(res) {
+ console.log(res.data.msg)
+ }
+ })
+
+ },
+
+ showok: function (res) {
+ if(res.msg==666)
+ {
+ wx.showToast({
+ title: '成功',
+ icon: 'success',
+ duration: 3000
+ })
+ }
+
+ if (res.msg == 'IP') {
+ wx.showToast({
+ title: '请确认已连接学校Wifi',
+ icon: 'none',
+ duration: 3000
+ })
+ }
+
+
+ if (res.msg == 'ERROR') {
+ wx.showToast({
+ title: '请不要扫描非签到二维码',
+ icon: 'none',
+ duration: 3000
+ })
+ }
+
+
+ if (res.msg == 'LOGIN') {
+ wx.showToast({
+ title: '用户名或密码错误',
+ icon: 'none',
+ duration: 3000
+ })
+ }
+
+
+
+ }
+
+})
\ No newline at end of file
diff --git a/pages/index/index.json b/pages/index/index.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/pages/index/index.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/pages/index/index.wxml b/pages/index/index.wxml
new file mode 100644
index 0000000..ac46476
--- /dev/null
+++ b/pages/index/index.wxml
@@ -0,0 +1,18 @@
+
+
+\n\n\n\n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/index/index.wxss b/pages/index/index.wxss
new file mode 100644
index 0000000..d647d92
--- /dev/null
+++ b/pages/index/index.wxss
@@ -0,0 +1,13 @@
+.input{
+ padding-left: 10px;
+ height: 44px;
+}
+.inputView{
+ /*边界:大小1px, 为固体,为绿色*/
+ border: 1px solid green;
+ /*边界角的弧度*/
+ border-radius: 30px;
+ margin-left: 15px;
+ margin-right: 15px;
+ margin-top: 15px;
+}
\ No newline at end of file
diff --git a/pages/index/md5.js b/pages/index/md5.js
new file mode 100644
index 0000000..9bfcae8
--- /dev/null
+++ b/pages/index/md5.js
@@ -0,0 +1,193 @@
+
+function md5(string) {
+ var x = Array();
+ var k, AA, BB, CC, DD, a, b, c, d;
+ var S11 = 7, S12 = 12, S13 = 17, S14 = 22;
+ var S21 = 5, S22 = 9, S23 = 14, S24 = 20;
+ var S31 = 4, S32 = 11, S33 = 16, S34 = 23;
+ var S41 = 6, S42 = 10, S43 = 15, S44 = 21;
+ string = Utf8Encode(string);
+ x = ConvertToWordArray(string);
+ a = 0x67452301;
+ b = 0xEFCDAB89;
+ c = 0x98BADCFE;
+ d = 0x10325476;
+ for (k = 0; k < x.length; k += 16) {
+ AA = a;
+ BB = b;
+ CC = c;
+ DD = d;
+ a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
+ d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
+ c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
+ b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
+ a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
+ d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
+ c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
+ b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
+ a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
+ d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
+ c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
+ b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
+ a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
+ d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
+ c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
+ b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
+ a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
+ d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
+ c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
+ b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
+ a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
+ d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
+ c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
+ b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
+ a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
+ d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
+ c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
+ b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
+ a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
+ d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
+ c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
+ b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
+ a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
+ d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
+ c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
+ b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
+ a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
+ d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
+ c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
+ b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
+ a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
+ d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
+ c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
+ b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
+ a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
+ d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
+ c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
+ b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
+ a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
+ d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
+ c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
+ b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
+ a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
+ d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
+ c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
+ b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
+ a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
+ d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
+ c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
+ b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
+ a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
+ d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
+ c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
+ b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
+ a = AddUnsigned(a, AA);
+ b = AddUnsigned(b, BB);
+ c = AddUnsigned(c, CC);
+ d = AddUnsigned(d, DD);
+ }
+ var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
+ return temp.toLowerCase();
+}
+function RotateLeft(lValue, iShiftBits) {
+ return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
+}
+function AddUnsigned(lX, lY) {
+ var lX4, lY4, lX8, lY8, lResult;
+ lX8 = (lX & 0x80000000);
+ lY8 = (lY & 0x80000000);
+ lX4 = (lX & 0x40000000);
+ lY4 = (lY & 0x40000000);
+ lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
+ if (lX4 & lY4) {
+ return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
+ }
+ if (lX4 | lY4) {
+ if (lResult & 0x40000000) {
+ return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
+ } else {
+ return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
+ }
+ } else {
+ return (lResult ^ lX8 ^ lY8);
+ }
+}
+function F(x, y, z) {
+ return (x & y) | ((~x) & z);
+}
+function G(x, y, z) {
+ return (x & z) | (y & (~z));
+}
+function H(x, y, z) {
+ return (x ^ y ^ z);
+}
+function I(x, y, z) {
+ return (y ^ (x | (~z)));
+}
+function FF(a, b, c, d, x, s, ac) {
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
+ return AddUnsigned(RotateLeft(a, s), b);
+}
+function GG(a, b, c, d, x, s, ac) {
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
+ return AddUnsigned(RotateLeft(a, s), b);
+}
+function HH(a, b, c, d, x, s, ac) {
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
+ return AddUnsigned(RotateLeft(a, s), b);
+}
+function II(a, b, c, d, x, s, ac) {
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
+ return AddUnsigned(RotateLeft(a, s), b);
+}
+function ConvertToWordArray(string) {
+ var lWordCount;
+ var lMessageLength = string.length;
+ var lNumberOfWords_temp1 = lMessageLength + 8;
+ var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
+ var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
+ var lWordArray = Array(lNumberOfWords - 1);
+ var lBytePosition = 0;
+ var lByteCount = 0;
+ while (lByteCount < lMessageLength) {
+ lWordCount = (lByteCount - (lByteCount % 4)) / 4;
+ lBytePosition = (lByteCount % 4) * 8;
+ lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
+ lByteCount++;
+ }
+ lWordCount = (lByteCount - (lByteCount % 4)) / 4;
+ lBytePosition = (lByteCount % 4) * 8;
+ lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
+ lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
+ lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
+ return lWordArray;
+}
+function WordToHex(lValue) {
+ var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount;
+ for (lCount = 0; lCount <= 3; lCount++) {
+ lByte = (lValue >>> (lCount * 8)) & 255;
+ WordToHexValue_temp = "0" + lByte.toString(16);
+ WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
+ }
+ return WordToHexValue;
+}
+function Utf8Encode(string) {
+ var utftext = "";
+ for (var n = 0; n < string.length; n++) {
+ var c = string.charCodeAt(n);
+ if (c < 128) {
+ utftext += String.fromCharCode(c);
+ } else if ((c > 127) && (c < 2048)) {
+ utftext += String.fromCharCode((c >> 6) | 192);
+ utftext += String.fromCharCode((c & 63) | 128);
+ } else {
+ utftext += String.fromCharCode((c >> 12) | 224);
+ utftext += String.fromCharCode(((c >> 6) & 63) | 128);
+ utftext += String.fromCharCode((c & 63) | 128);
+ }
+ }
+ return utftext;
+}
+module.exports = {
+ md5: md5
+}
\ No newline at end of file
diff --git a/pages/index/qrCode.js b/pages/index/qrCode.js
new file mode 100644
index 0000000..6aa1242
--- /dev/null
+++ b/pages/index/qrCode.js
@@ -0,0 +1,879 @@
+/**
+ * Created by Zheng_Alex on 2017/12/28.
+ */
+let QRMode = {MODE_NUMBER: 1 << 0, MODE_ALPHA_NUM: 1 << 1, MODE_8BIT_BYTE: 1 << 2, MODE_KANJI: 1 << 3},
+ QRErrorCorrectLevel = {L: 1, M: 0, Q: 3, H: 2},
+ QRMaskPattern = {
+ PATTERN000: 0,
+ PATTERN001: 1,
+ PATTERN010: 2,
+ PATTERN011: 3,
+ PATTERN100: 4,
+ PATTERN101: 5,
+ PATTERN110: 6,
+ PATTERN111: 7
+ },
+ QRUtil = {
+ PATTERN_POSITION_TABLE: [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78], [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98], [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114], [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130], [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146], [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158], [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170]],
+ G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
+ G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
+ G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
+ getBCHTypeInfo: function (data) {
+ var d = data << 10;
+ while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
+ d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));
+ }
+ return ((data << 10) | d) ^ QRUtil.G15_MASK;
+ },
+ getBCHTypeNumber: function (data) {
+ var d = data << 12;
+ while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
+ d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));
+ }
+ return (data << 12) | d;
+ },
+ getBCHDigit: function (data) {
+ var digit = 0;
+ while (data != 0) {
+ digit++;
+ data >>>= 1;
+ }
+ return digit;
+ },
+ getPatternPosition: function (typeNumber) {
+ return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
+ },
+ getMask: function (maskPattern, i, j) {
+ switch (maskPattern) {
+ case QRMaskPattern.PATTERN000:
+ return (i + j) % 2 == 0;
+ case QRMaskPattern.PATTERN001:
+ return i % 2 == 0;
+ case QRMaskPattern.PATTERN010:
+ return j % 3 == 0;
+ case QRMaskPattern.PATTERN011:
+ return (i + j) % 3 == 0;
+ case QRMaskPattern.PATTERN100:
+ return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
+ case QRMaskPattern.PATTERN101:
+ return (i * j) % 2 + (i * j) % 3 == 0;
+ case QRMaskPattern.PATTERN110:
+ return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
+ case QRMaskPattern.PATTERN111:
+ return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
+ default:
+ throw new Error("bad maskPattern:" + maskPattern);
+ }
+ },
+ getErrorCorrectPolynomial: function (errorCorrectLength) {
+ var a = new QRPolynomial([1], 0);
+ for (var i = 0; i < errorCorrectLength; i++) {
+ a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
+ }
+ return a;
+ },
+ getLengthInBits: function (mode, type) {
+ if (1 <= type && type < 10) {
+ switch (mode) {
+ case QRMode.MODE_NUMBER:
+ return 10;
+ case QRMode.MODE_ALPHA_NUM:
+ return 9;
+ case QRMode.MODE_8BIT_BYTE:
+ return 8;
+ case QRMode.MODE_KANJI:
+ return 8;
+ default:
+ throw new Error("mode:" + mode);
+ }
+ } else if (type < 27) {
+ switch (mode) {
+ case QRMode.MODE_NUMBER:
+ return 12;
+ case QRMode.MODE_ALPHA_NUM:
+ return 11;
+ case QRMode.MODE_8BIT_BYTE:
+ return 16;
+ case QRMode.MODE_KANJI:
+ return 10;
+ default:
+ throw new Error("mode:" + mode);
+ }
+ } else if (type < 41) {
+ switch (mode) {
+ case QRMode.MODE_NUMBER:
+ return 14;
+ case QRMode.MODE_ALPHA_NUM:
+ return 13;
+ case QRMode.MODE_8BIT_BYTE:
+ return 16;
+ case QRMode.MODE_KANJI:
+ return 12;
+ default:
+ throw new Error("mode:" + mode);
+ }
+ } else {
+ throw new Error("type:" + type);
+ }
+ },
+ getLostPoint: function (qrCode) {
+ var moduleCount = qrCode.getModuleCount();
+ var lostPoint = 0;
+ for (var row = 0; row < moduleCount; row++) {
+ for (var col = 0; col < moduleCount; col++) {
+ var sameCount = 0;
+ var dark = qrCode.isDark(row, col);
+ for (var r = -1; r <= 1; r++) {
+ if (row + r < 0 || moduleCount <= row + r) {
+ continue;
+ }
+ for (var c = -1; c <= 1; c++) {
+ if (col + c < 0 || moduleCount <= col + c) {
+ continue;
+ }
+ if (r == 0 && c == 0) {
+ continue;
+ }
+ if (dark == qrCode.isDark(row + r, col + c)) {
+ sameCount++;
+ }
+ }
+ }
+ if (sameCount > 5) {
+ lostPoint += (3 + sameCount - 5);
+ }
+ }
+ }
+ for (var row = 0; row < moduleCount - 1; row++) {
+ for (var col = 0; col < moduleCount - 1; col++) {
+ var count = 0;
+ if (qrCode.isDark(row, col)) count++;
+ if (qrCode.isDark(row + 1, col)) count++;
+ if (qrCode.isDark(row, col + 1)) count++;
+ if (qrCode.isDark(row + 1, col + 1)) count++;
+ if (count == 0 || count == 4) {
+ lostPoint += 3;
+ }
+ }
+ }
+ for (var row = 0; row < moduleCount; row++) {
+ for (var col = 0; col < moduleCount - 6; col++) {
+ if (qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6)) {
+ lostPoint += 40;
+ }
+ }
+ }
+ for (var col = 0; col < moduleCount; col++) {
+ for (var row = 0; row < moduleCount - 6; row++) {
+ if (qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2, col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col)) {
+ lostPoint += 40;
+ }
+ }
+ }
+ var darkCount = 0;
+ for (var col = 0; col < moduleCount; col++) {
+ for (var row = 0; row < moduleCount; row++) {
+ if (qrCode.isDark(row, col)) {
+ darkCount++;
+ }
+ }
+ }
+ var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
+ lostPoint += ratio * 10;
+ return lostPoint;
+ }
+ },
+ QRMath = {
+ glog: function (n) {
+ if (n < 1) {
+ throw new Error("glog(" + n + ")");
+ }
+ return QRMath.LOG_TABLE[n];
+ },
+ gexp: function (n) {
+ while (n < 0) {
+ n += 255;
+ }
+ while (n >= 256) {
+ n -= 255;
+ }
+ return QRMath.EXP_TABLE[n];
+ },
+ EXP_TABLE: new Array(256), LOG_TABLE: new Array(256)
+ };
+
+for (let i = 0; i < 8; i++) {
+ QRMath.EXP_TABLE[i] = 1 << i;
+}
+for (let i = 8; i < 256; i++) {
+ QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
+}
+for (let i = 0; i < 255; i++) {
+ QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
+}
+
+/*
+ * class QR8bitByte
+ * */
+class QR8bitByte {
+ constructor(data) {
+ this.mode = QRMode.MODE_8BIT_BYTE;
+ this.data = data;
+ this.parsedData = [];
+
+ // Added to support UTF-8 Characters
+ for (let i = 0, l = this.data.length; i < l; i++) {
+ let byteArray = [],
+ code = this.data.charCodeAt(i);
+
+ if (code > 0x10000) {
+ byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
+ byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
+ byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
+ byteArray[3] = 0x80 | (code & 0x3F);
+ } else if (code > 0x800) {
+ byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
+ byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
+ byteArray[2] = 0x80 | (code & 0x3F);
+ } else if (code > 0x80) {
+ byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
+ byteArray[1] = 0x80 | (code & 0x3F);
+ } else {
+ byteArray[0] = code;
+ }
+
+ this.parsedData.push(byteArray);
+ }
+
+ this.parsedData = Array.prototype.concat.apply([], this.parsedData);
+
+ if (this.parsedData.length !== this.data.length) {
+ this.parsedData.unshift(191);
+ this.parsedData.unshift(187);
+ this.parsedData.unshift(239);
+ }
+ }
+
+ getLength(buffer) {
+ return this.parsedData.length;
+ }
+
+ write(buffer) {
+ for (let i = 0, l = this.parsedData.length; i < l; i++) {
+ buffer.put(this.parsedData[i], 8);
+ }
+ }
+}
+
+/*
+ * class QRCodeModel
+ * */
+class QRCodeModel {
+ constructor(typeNumber, errorCorrectLevel) {
+ this.typeNumber = typeNumber;
+ this.errorCorrectLevel = errorCorrectLevel;
+ this.modules = null;
+ this.moduleCount = 0;
+ this.dataCache = null;
+ this.dataList = [];
+ }
+
+ addData(data) {
+ let newData = new QR8bitByte(data);
+ this.dataList.push(newData);
+ this.dataCache = null;
+ }
+
+ isDark(row, col) {
+ if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {
+ throw new Error(row + ',' + col);
+ }
+ return this.modules[row][col];
+ }
+
+ getModuleCount() {
+ return this.moduleCount;
+ }
+
+ make() {
+ this.makeImpl(false, this.getBestMaskPattern());
+ }
+
+ makeImpl(test, maskPattern) {
+ this.moduleCount = this.typeNumber * 4 + 17;
+ this.modules = new Array(this.moduleCount);
+
+ for (let row = 0; row < this.moduleCount; row++) {
+ this.modules[row] = new Array(this.moduleCount);
+ for (let col = 0; col < this.moduleCount; col++) {
+ this.modules[row][col] = null;
+ }
+ }
+
+ this.setupPositionProbePattern(0, 0);
+ this.setupPositionProbePattern(this.moduleCount - 7, 0);
+ this.setupPositionProbePattern(0, this.moduleCount - 7);
+ this.setupPositionAdjustPattern();
+ this.setupTimingPattern();
+ this.setupTypeInfo(test, maskPattern);
+
+ if (this.typeNumber >= 7) {
+ this.setupTypeNumber(test);
+ }
+
+ if (this.dataCache == null) {
+ this.dataCache = QRCodeModel.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);
+ }
+ this.mapData(this.dataCache, maskPattern);
+ }
+
+ setupPositionProbePattern(row, col) {
+ for (let r = -1; r <= 7; r++) {
+ if (row + r <= -1 || this.moduleCount <= row + r) {
+ continue;
+ }
+ for (let c = -1; c <= 7; c++) {
+ if (col + c <= -1 || this.moduleCount <= col + c) {
+ continue;
+ }
+ this.modules[row + r][col + c] = (0 <= r && r <= 6 && (c == 0 || c == 6))
+ || (0 <= c && c <= 6 && (r == 0 || r == 6)) || (2 <= r && r <= 4 && 2 <= c && c <= 4)
+ }
+ }
+ }
+
+ getBestMaskPattern() {
+ let minLostPoint = 0,
+ pattern = 0;
+
+ for (let i = 0; i < 8; i++) {
+ this.makeImpl(true, i);
+ let lostPoint = QRUtil.getLostPoint(this);
+ if (i == 0 || minLostPoint > lostPoint) {
+ minLostPoint = lostPoint;
+ pattern = i;
+ }
+ }
+
+ return pattern;
+ }
+
+ setupTimingPattern() {
+ for (let r = 8; r < this.moduleCount - 8; r++) {
+ if (this.modules[r][6] != null) {
+ continue;
+ }
+ this.modules[r][6] = (r % 2 == 0);
+ }
+ for (let c = 8; c < this.moduleCount - 8; c++) {
+ if (this.modules[6][c] != null) {
+ continue;
+ }
+ this.modules[6][c] = (c % 2 == 0);
+ }
+ }
+
+ setupPositionAdjustPattern() {
+ let pos = QRUtil.getPatternPosition(this.typeNumber);
+ for (let i = 0; i < pos.length; i++) {
+ for (let j = 0; j < pos.length; j++) {
+ let row = pos[i],
+ col = pos[j];
+
+ if (this.modules[row][col] != null) {
+ continue;
+ }
+ for (let r = -2; r <= 2; r++) {
+ for (let c = -2; c <= 2; c++) {
+ this.modules[row + r][col + c] = r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0);
+ }
+ }
+ }
+ }
+ }
+
+ setupTypeNumber(test) {
+ let bits = QRUtil.getBCHTypeNumber(this.typeNumber);
+
+ for (let i = 0; i < 18; i++) {
+ this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = (!test && ((bits >> i) & 1) == 1);
+ }
+
+ for (let i = 0; i < 18; i++) {
+ this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = (!test && ((bits >> i) & 1) == 1);
+ }
+ }
+
+ setupTypeInfo(test, maskPattern) {
+ let data = (this.errorCorrectLevel << 3) | maskPattern,
+ bits = QRUtil.getBCHTypeInfo(data);
+
+ for (let i = 0; i < 15; i++) {
+ let mod = (!test && ((bits >> i) & 1) == 1);
+
+ if (i < 6) {
+ this.modules[i][8] = mod;
+ } else if (i < 8) {
+ this.modules[i + 1][8] = mod;
+ } else {
+ this.modules[this.moduleCount - 15 + i][8] = mod;
+ }
+ }
+
+ for (let i = 0; i < 15; i++) {
+ let mod = (!test && ((bits >> i) & 1) == 1);
+
+ if (i < 8) {
+ this.modules[8][this.moduleCount - i - 1] = mod;
+ } else if (i < 9) {
+ this.modules[8][15 - i - 1 + 1] = mod;
+ } else {
+ this.modules[8][15 - i - 1] = mod;
+ }
+ }
+
+ this.modules[this.moduleCount - 8][8] = (!test);
+ }
+
+ mapData(data, maskPattern) {
+ let inc = -1,
+ row = this.moduleCount - 1,
+ bitIndex = 7,
+ byteIndex = 0;
+
+ for (let col = this.moduleCount - 1; col > 0; col -= 2) {
+ if (col == 6) col--;
+ while (true) {
+ for (let c = 0; c < 2; c++) {
+ if (this.modules[row][col - c] == null) {
+ let dark = false;
+ if (byteIndex < data.length) {
+ dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
+ }
+
+ let mask = QRUtil.getMask(maskPattern, row, col - c);
+ if (mask) {
+ dark = !dark;
+ }
+
+ this.modules[row][col - c] = dark;
+ bitIndex--;
+ if (bitIndex == -1) {
+ byteIndex++;
+ bitIndex = 7;
+ }
+ }
+ }
+ row += inc;
+ if (row < 0 || this.moduleCount <= row) {
+ row -= inc;
+ inc = -inc;
+ break;
+ }
+ }
+ }
+ }
+}
+QRCodeModel.PAD0 = 0xEC;
+QRCodeModel.PAD1 = 0x11;
+QRCodeModel.createData = (typeNumber, errorCorrectLevel, dataList) => {
+ let rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel),
+ buffer = new QRBitBuffer();
+
+ for (let i = 0; i < dataList.length; i++) {
+ let data = dataList[i];
+ buffer.put(data.mode, 4);
+ buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));
+ data.write(buffer);
+ }
+
+ let totalDataCount = 0;
+ for (let i = 0; i < rsBlocks.length; i++) {
+ totalDataCount += rsBlocks[i].dataCount;
+ }
+
+ if (buffer.getLengthInBits() > totalDataCount * 8) {
+ throw new Error("code length overflow. ("
+ + buffer.getLengthInBits()
+ + ">"
+ + totalDataCount * 8
+ + ")");
+ }
+
+ if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
+ buffer.put(0, 4);
+ }
+
+ while (buffer.getLengthInBits() % 8 != 0) {
+ buffer.putBit(false);
+ }
+
+ while (true) {
+ if (buffer.getLengthInBits() >= totalDataCount * 8) {
+ break;
+ }
+ buffer.put(QRCodeModel.PAD0, 8);
+ if (buffer.getLengthInBits() >= totalDataCount * 8) {
+ break;
+ }
+ buffer.put(QRCodeModel.PAD1, 8);
+ }
+ return QRCodeModel.createBytes(buffer, rsBlocks);
+};
+QRCodeModel.createBytes = (buffer, rsBlocks) => {
+ let offset = 0,
+ maxDcCount = 0,
+ maxEcCount = 0,
+ dcData = new Array(rsBlocks.length),
+ ecData = new Array(rsBlocks.length);
+
+ for (let r = 0; r < rsBlocks.length; r++) {
+ let dcCount = rsBlocks[r].dataCount,
+ ecCount = rsBlocks[r].totalCount - dcCount;
+
+ maxDcCount = Math.max(maxDcCount, dcCount);
+ maxEcCount = Math.max(maxEcCount, ecCount);
+ dcData[r] = new Array(dcCount);
+
+ for (let i = 0; i < dcData[r].length; i++) {
+ dcData[r][i] = 0xff & buffer.buffer[i + offset];
+ }
+
+ offset += dcCount;
+ let rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount),
+ rawPoly = new QRPolynomial(dcData[r], rsPoly.getLength() - 1),
+ modPoly = rawPoly.mod(rsPoly);
+
+ ecData[r] = new Array(rsPoly.getLength() - 1);
+
+ for (let i = 0; i < ecData[r].length; i++) {
+ let modIndex = i + modPoly.getLength() - ecData[r].length;
+ ecData[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
+ }
+ }
+
+ let totalCodeCount = 0;
+ for (let i = 0; i < rsBlocks.length; i++) {
+ totalCodeCount += rsBlocks[i].totalCount;
+ }
+
+ let data = new Array(totalCodeCount),
+ index = 0;
+
+ for (let i = 0; i < maxDcCount; i++) {
+ for (let r = 0; r < rsBlocks.length; r++) {
+ if (i < dcData[r].length) {
+ data[index++] = dcData[r][i];
+ }
+ }
+ }
+
+ for (let i = 0; i < maxEcCount; i++) {
+ for (let r = 0; r < rsBlocks.length; r++) {
+ if (i < ecData[r].length) {
+ data[index++] = ecData[r][i];
+ }
+ }
+ }
+ return data;
+};
+
+/*
+* class QRPolynomial
+* */
+class QRPolynomial {
+ constructor(num, shift) {
+ if (num.length == undefined) {
+ throw new Error(num.length + '/' + shift);
+ }
+
+ let offset = 0;
+ while (offset < num.length && num[offset] == 0) {
+ offset++;
+ }
+
+ this.num = new Array(num.length - offset + shift);
+
+ for (let i = 0; i < num.length - offset; i++) {
+ this.num[i] = num[i + offset];
+ }
+ }
+ get(index) {
+ return this.num[index];
+ }
+ getLength() {
+ return this.num.length;
+ }
+ multiply(e) {
+ let num = new Array(this.getLength() + e.getLength() - 1);
+
+ for (let i = 0; i < this.getLength(); i++) {
+ for (let j = 0; j < e.getLength(); j++) {
+ num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
+ }
+ }
+ return new QRPolynomial(num, 0);
+ }
+ mod(e) {
+ if (this.getLength() - e.getLength() < 0) {
+ return this;
+ }
+
+ let ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)),
+ num = new Array(this.getLength());
+
+ for (let i = 0; i < this.getLength(); i++) {
+ num[i] = this.get(i);
+ }
+
+ for (let i = 0; i < e.getLength(); i++) {
+ num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
+ }
+
+ return new QRPolynomial(num, 0).mod(e);
+ }
+}
+
+/*
+* class QRRSBlock
+* */
+class QRRSBlock {
+ constructor(totalCount, dataCount) {
+ this.totalCount = totalCount;
+ this.dataCount = dataCount;
+ }
+}
+QRRSBlock.RS_BLOCK_TABLE = [[1, 26, 19], [1, 26, 16], [1, 26, 13], [1, 26, 9], [1, 44, 34], [1, 44, 28], [1, 44, 22], [1, 44, 16], [1, 70, 55], [1, 70, 44], [2, 35, 17], [2, 35, 13], [1, 100, 80], [2, 50, 32], [2, 50, 24], [4, 25, 9], [1, 134, 108], [2, 67, 43], [2, 33, 15, 2, 34, 16], [2, 33, 11, 2, 34, 12], [2, 86, 68], [4, 43, 27], [4, 43, 19], [4, 43, 15], [2, 98, 78], [4, 49, 31], [2, 32, 14, 4, 33, 15], [4, 39, 13, 1, 40, 14], [2, 121, 97], [2, 60, 38, 2, 61, 39], [4, 40, 18, 2, 41, 19], [4, 40, 14, 2, 41, 15], [2, 146, 116], [3, 58, 36, 2, 59, 37], [4, 36, 16, 4, 37, 17], [4, 36, 12, 4, 37, 13], [2, 86, 68, 2, 87, 69], [4, 69, 43, 1, 70, 44], [6, 43, 19, 2, 44, 20], [6, 43, 15, 2, 44, 16], [4, 101, 81], [1, 80, 50, 4, 81, 51], [4, 50, 22, 4, 51, 23], [3, 36, 12, 8, 37, 13], [2, 116, 92, 2, 117, 93], [6, 58, 36, 2, 59, 37], [4, 46, 20, 6, 47, 21], [7, 42, 14, 4, 43, 15], [4, 133, 107], [8, 59, 37, 1, 60, 38], [8, 44, 20, 4, 45, 21], [12, 33, 11, 4, 34, 12], [3, 145, 115, 1, 146, 116], [4, 64, 40, 5, 65, 41], [11, 36, 16, 5, 37, 17], [11, 36, 12, 5, 37, 13], [5, 109, 87, 1, 110, 88], [5, 65, 41, 5, 66, 42], [5, 54, 24, 7, 55, 25], [11, 36, 12], [5, 122, 98, 1, 123, 99], [7, 73, 45, 3, 74, 46], [15, 43, 19, 2, 44, 20], [3, 45, 15, 13, 46, 16], [1, 135, 107, 5, 136, 108], [10, 74, 46, 1, 75, 47], [1, 50, 22, 15, 51, 23], [2, 42, 14, 17, 43, 15], [5, 150, 120, 1, 151, 121], [9, 69, 43, 4, 70, 44], [17, 50, 22, 1, 51, 23], [2, 42, 14, 19, 43, 15], [3, 141, 113, 4, 142, 114], [3, 70, 44, 11, 71, 45], [17, 47, 21, 4, 48, 22], [9, 39, 13, 16, 40, 14], [3, 135, 107, 5, 136, 108], [3, 67, 41, 13, 68, 42], [15, 54, 24, 5, 55, 25], [15, 43, 15, 10, 44, 16], [4, 144, 116, 4, 145, 117], [17, 68, 42], [17, 50, 22, 6, 51, 23], [19, 46, 16, 6, 47, 17], [2, 139, 111, 7, 140, 112], [17, 74, 46], [7, 54, 24, 16, 55, 25], [34, 37, 13], [4, 151, 121, 5, 152, 122], [4, 75, 47, 14, 76, 48], [11, 54, 24, 14, 55, 25], [16, 45, 15, 14, 46, 16], [6, 147, 117, 4, 148, 118], [6, 73, 45, 14, 74, 46], [11, 54, 24, 16, 55, 25], [30, 46, 16, 2, 47, 17], [8, 132, 106, 4, 133, 107], [8, 75, 47, 13, 76, 48], [7, 54, 24, 22, 55, 25], [22, 45, 15, 13, 46, 16], [10, 142, 114, 2, 143, 115], [19, 74, 46, 4, 75, 47], [28, 50, 22, 6, 51, 23], [33, 46, 16, 4, 47, 17], [8, 152, 122, 4, 153, 123], [22, 73, 45, 3, 74, 46], [8, 53, 23, 26, 54, 24], [12, 45, 15, 28, 46, 16], [3, 147, 117, 10, 148, 118], [3, 73, 45, 23, 74, 46], [4, 54, 24, 31, 55, 25], [11, 45, 15, 31, 46, 16], [7, 146, 116, 7, 147, 117], [21, 73, 45, 7, 74, 46], [1, 53, 23, 37, 54, 24], [19, 45, 15, 26, 46, 16], [5, 145, 115, 10, 146, 116], [19, 75, 47, 10, 76, 48], [15, 54, 24, 25, 55, 25], [23, 45, 15, 25, 46, 16], [13, 145, 115, 3, 146, 116], [2, 74, 46, 29, 75, 47], [42, 54, 24, 1, 55, 25], [23, 45, 15, 28, 46, 16], [17, 145, 115], [10, 74, 46, 23, 75, 47], [10, 54, 24, 35, 55, 25], [19, 45, 15, 35, 46, 16], [17, 145, 115, 1, 146, 116], [14, 74, 46, 21, 75, 47], [29, 54, 24, 19, 55, 25], [11, 45, 15, 46, 46, 16], [13, 145, 115, 6, 146, 116], [14, 74, 46, 23, 75, 47], [44, 54, 24, 7, 55, 25], [59, 46, 16, 1, 47, 17], [12, 151, 121, 7, 152, 122], [12, 75, 47, 26, 76, 48], [39, 54, 24, 14, 55, 25], [22, 45, 15, 41, 46, 16], [6, 151, 121, 14, 152, 122], [6, 75, 47, 34, 76, 48], [46, 54, 24, 10, 55, 25], [2, 45, 15, 64, 46, 16], [17, 152, 122, 4, 153, 123], [29, 74, 46, 14, 75, 47], [49, 54, 24, 10, 55, 25], [24, 45, 15, 46, 46, 16], [4, 152, 122, 18, 153, 123], [13, 74, 46, 32, 75, 47], [48, 54, 24, 14, 55, 25], [42, 45, 15, 32, 46, 16], [20, 147, 117, 4, 148, 118], [40, 75, 47, 7, 76, 48], [43, 54, 24, 22, 55, 25], [10, 45, 15, 67, 46, 16], [19, 148, 118, 6, 149, 119], [18, 75, 47, 31, 76, 48], [34, 54, 24, 34, 55, 25], [20, 45, 15, 61, 46, 16]];
+QRRSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) {
+ let rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
+
+ if (!rsBlock) {
+ throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
+ }
+
+ let length = rsBlock.length / 3,
+ list = [];
+
+ for (let i = 0; i < length; i++) {
+ let count = rsBlock[i * 3],
+ totalCount = rsBlock[i * 3 + 1],
+ dataCount = rsBlock[i * 3 + 2];
+
+ for (let j = 0; j < count; j++) {
+ list.push(new QRRSBlock(totalCount, dataCount));
+ }
+ }
+ return list;
+};
+QRRSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) {
+ switch (errorCorrectLevel) {
+ case QRErrorCorrectLevel.L:
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4];
+ case QRErrorCorrectLevel.M:
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
+ case QRErrorCorrectLevel.Q:
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
+ case QRErrorCorrectLevel.H:
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
+ default:
+ return undefined;
+ }
+};
+
+/*
+* class QRBitBuffer
+* */
+class QRBitBuffer {
+ constructor() {
+ this.buffer = [];
+ this.length = 0;
+ }
+ get(index) {
+ let bufIndex = Math.floor(index / 8);
+ return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1;
+ }
+ put(num, length) {
+ for (let i = 0; i < length; i++) {
+ this.putBit(((num >>> (length - i - 1)) & 1) == 1);
+ }
+ }
+ getLengthInBits() {
+ return this.length;
+ }
+ putBit(bit) {
+ let bufIndex = Math.floor(this.length / 8);
+
+ if (this.buffer.length <= bufIndex) {
+ this.buffer.push(0);
+ }
+
+ if (bit) {
+ this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
+ }
+ this.length++;
+ }
+}
+
+/*
+ * Class Drawing
+ * */
+class Drawing {
+ constructor(el, opts) {
+ this._opts = opts;
+ this._el = el;
+ this._ctx = wx.createCanvasContext(el);
+ }
+
+ draw(QRCode) {
+ let ctx = this._ctx,
+ opts = this._opts;
+
+ let count = QRCode.getModuleCount(),
+ width = opts.width / count,
+ height = opts.height / count,
+ roundedWidth = Math.round(width),
+ roundedHeight = Math.round(height);
+
+ this.clear();
+
+ for (let row = 0; row < count; row++) {
+ for (let col = 0; col < count; col++) {
+ let isDark = QRCode.isDark(row, col),
+ left = col * width,
+ top = row * height;
+
+ ctx.setStrokeStyle(isDark ? opts.colorDark : opts.colorLight);
+ ctx.setLineWidth(1);
+ ctx.setFillStyle(isDark ? opts.colorDark : opts.colorLight);
+ ctx.fillRect(left, top, width, height);
+
+ ctx.strokeRect(
+ Math.floor(left) + 0.5,
+ Math.floor(top) + 0.5,
+ roundedWidth,
+ roundedHeight
+ );
+
+ ctx.strokeRect(
+ Math.ceil(left) - 0.5,
+ Math.ceil(top) - 0.5,
+ roundedWidth,
+ roundedHeight
+ );
+ }
+ }
+ ctx.draw();
+ this._bIsPainted = true;
+ }
+
+ clear() {
+ this._ctx.clearRect(0, 0, this._opts.width, this._opts.height);
+ }
+}
+
+/*
+ * Class QRCode
+ * */
+let QRCode = (() => {
+ /**
+ * Get the type by string length
+ *
+ * @private
+ * @param {String} text
+ * @param {Number} correctLevel
+ * @return {Number} type
+ */
+ function getTypeNumber(text, correctLevel) {
+ let type = 1,
+ length = getUTF8Length(text),
+ QRCodeLimitLength = [[17, 14, 11, 7], [32, 26, 20, 14], [53, 42, 32, 24], [78, 62, 46, 34], [106, 84, 60, 44], [134, 106, 74, 58], [154, 122, 86, 64], [192, 152, 108, 84], [230, 180, 130, 98], [271, 213, 151, 119], [321, 251, 177, 137], [367, 287, 203, 155], [425, 331, 241, 177], [458, 362, 258, 194], [520, 412, 292, 220], [586, 450, 322, 250], [644, 504, 364, 280], [718, 560, 394, 310], [792, 624, 442, 338], [858, 666, 482, 382], [929, 711, 509, 403], [1003, 779, 565, 439], [1091, 857, 611, 461], [1171, 911, 661, 511], [1273, 997, 715, 535], [1367, 1059, 751, 593], [1465, 1125, 805, 625], [1528, 1190, 868, 658], [1628, 1264, 908, 698], [1732, 1370, 982, 742], [1840, 1452, 1030, 790], [1952, 1538, 1112, 842], [2068, 1628, 1168, 898], [2188, 1722, 1228, 958], [2303, 1809, 1283, 983], [2431, 1911, 1351, 1051], [2563, 1989, 1423, 1093], [2699, 2099, 1499, 1139], [2809, 2213, 1579, 1219], [2953, 2331, 1663, 1273]];
+
+ for (let i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
+ let limit = 0;
+
+ switch (correctLevel) {
+ case QRErrorCorrectLevel.L :
+ limit = QRCodeLimitLength[i][0];
+ break;
+ case QRErrorCorrectLevel.M :
+ limit = QRCodeLimitLength[i][1];
+ break;
+ case QRErrorCorrectLevel.Q :
+ limit = QRCodeLimitLength[i][2];
+ break;
+ case QRErrorCorrectLevel.H :
+ limit = QRCodeLimitLength[i][3];
+ break;
+ }
+
+ if (length <= limit) {
+ break;
+ } else {
+ type++;
+ }
+ }
+
+ if (type > QRCodeLimitLength.length) {
+ throw new Error('Too long data');
+ }
+ return type;
+ }
+
+ function getUTF8Length(text) {
+ let replacedText = encodeURI(text).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
+ return replacedText.length + (replacedText.length != text ? 3 : 0);
+ }
+
+ class Fn {
+ constructor(el, opts) {
+ this._opts = {
+ width: 300,
+ height: 225,
+ typeNumber: 4,
+ colorDark: '#000000',
+ colorLight: '#ffffff',
+ correctLevel: Fn.correctLevel.H
+ };
+
+ if (typeof opts === 'string') {
+ opts = {
+ text: opts
+ };
+ }
+
+ // Overwrites options 简单拷贝
+ if (opts) {
+ for (let i in opts) {
+ if (opts.hasOwnProperty(i)) {
+ this._opts[i] = opts[i];
+ }
+
+ }
+ }
+
+ this._el = el;
+ this._QRCode = null;
+ this._drawing = new Drawing(this._el, this._opts);
+
+ if (this._opts.text) {
+ this.makeCode(this._opts.text);
+ }
+ }
+
+ makeCode(text) {
+ this._QRCode = new QRCodeModel(getTypeNumber(text, this._opts.correctLevel), this._opts.correctLevel);
+ this._QRCode.addData(text);
+ this._QRCode.make();
+ this._drawing.draw(this._QRCode);
+ }
+
+ clear() {
+ this._drawing.clear();
+ }
+ }
+ Fn.correctLevel = QRErrorCorrectLevel;
+
+ return Fn;
+})();
+
+export default QRCode;
diff --git a/pages/logs/logs.js b/pages/logs/logs.js
new file mode 100644
index 0000000..b2b967d
--- /dev/null
+++ b/pages/logs/logs.js
@@ -0,0 +1,15 @@
+//logs.js
+const util = require('../../utils/util.js')
+
+Page({
+ data: {
+ logs: []
+ },
+ onLoad: function () {
+ this.setData({
+ logs: (wx.getStorageSync('logs') || []).map(log => {
+ return util.formatTime(new Date(log))
+ })
+ })
+ }
+})
diff --git a/pages/logs/logs.json b/pages/logs/logs.json
new file mode 100644
index 0000000..28379bc
--- /dev/null
+++ b/pages/logs/logs.json
@@ -0,0 +1,3 @@
+{
+ "navigationBarTitleText": "查看启动日志"
+}
\ No newline at end of file
diff --git a/pages/logs/logs.wxml b/pages/logs/logs.wxml
new file mode 100644
index 0000000..b5a85ac
--- /dev/null
+++ b/pages/logs/logs.wxml
@@ -0,0 +1,6 @@
+
+
+
+ {{index + 1}}. {{log}}
+
+
diff --git a/pages/logs/logs.wxss b/pages/logs/logs.wxss
new file mode 100644
index 0000000..94d4b88
--- /dev/null
+++ b/pages/logs/logs.wxss
@@ -0,0 +1,8 @@
+.log-list {
+ display: flex;
+ flex-direction: column;
+ padding: 40rpx;
+}
+.log-item {
+ margin: 10rpx;
+}
diff --git a/pages/qr/index.js b/pages/qr/index.js
new file mode 100644
index 0000000..f821a52
--- /dev/null
+++ b/pages/qr/index.js
@@ -0,0 +1,70 @@
+// pages/qr/index.js
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+ wx.scanCode({
+ success(res) {
+ console.log(res)
+ }
+ })
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ }
+})
\ No newline at end of file
diff --git a/pages/qr/index.json b/pages/qr/index.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/pages/qr/index.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/pages/qr/index.wxml b/pages/qr/index.wxml
new file mode 100644
index 0000000..9efc31c
--- /dev/null
+++ b/pages/qr/index.wxml
@@ -0,0 +1,2 @@
+
+pages/qr/index.wxml
diff --git a/pages/qr/index.wxss b/pages/qr/index.wxss
new file mode 100644
index 0000000..f561f84
--- /dev/null
+++ b/pages/qr/index.wxss
@@ -0,0 +1 @@
+/* pages/qr/index.wxss */
\ No newline at end of file
diff --git a/pages/qr/index.xml.js b/pages/qr/index.xml.js
new file mode 100644
index 0000000..6900379
--- /dev/null
+++ b/pages/qr/index.xml.js
@@ -0,0 +1,66 @@
+// pages/qr/index.xml.js
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ }
+})
\ No newline at end of file
diff --git a/pages/qr/index.xml.json b/pages/qr/index.xml.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/pages/qr/index.xml.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/pages/qr/index.xml.wxml b/pages/qr/index.xml.wxml
new file mode 100644
index 0000000..db34db7
--- /dev/null
+++ b/pages/qr/index.xml.wxml
@@ -0,0 +1,2 @@
+
+pages/qr/index.xml.wxml
diff --git a/pages/qr/index.xml.wxss b/pages/qr/index.xml.wxss
new file mode 100644
index 0000000..036fcaf
--- /dev/null
+++ b/pages/qr/index.xml.wxss
@@ -0,0 +1 @@
+/* pages/qr/index.xml.wxss */
\ No newline at end of file