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