From 370024dc761935a74165e88d241b3a0796f3d6b9 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 10 Mar 2026 15:12:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=BF=81=E7=A7=BB=E8=BF=87=E5=8E=BB?= =?UTF-8?q?=E4=B8=80=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages.json | 28 + src/pages/merchant/brandDetail.vue | 111 ++ src/pages/merchant/cancel-qrcode.vue | 80 + src/pages/merchant/components/cancel-card.vue | 215 +++ src/pages/merchant/components/coupon-card.vue | 212 +++ src/pages/merchant/coupon-list.vue | 109 ++ src/pages/merchant/detail.vue | 420 ++++++ src/pages/merchant/merchant-activity.vue | 271 ++++ src/pages/merchant/my-act-list.vue | 173 +++ src/pages/root/login.vue | 4 +- src/pages/wallet/detail.vue | 77 + src/pages/wallet/list.vue | 223 +++ src/pages/wallet/recharge.vue | 162 ++ src/sheep/api/act-cancel copy.ts | 73 + src/sheep/api/act-cancel.ts | 9 + src/sheep/api/act-com.ts | 40 + src/sheep/api/act-coupon.ts | 22 + src/sheep/api/apply.ts | 52 + src/sheep/api/index.ts | 5 + src/sheep/api/mini-platform.ts | 3 +- src/sheep/api/shop.ts | 29 + src/sheep/constant/service-enum.ts | 24 + src/sheep/utils/uqrcode.ts | 1310 +++++++++++++++++ src/static/icon/act.png | Bin 0 -> 3811 bytes src/static/icon/clear-storage.png | Bin 0 -> 3369 bytes src/static/icon/default-avatar.png | Bin 0 -> 5308 bytes src/static/icon/scan.png | Bin 0 -> 1081 bytes src/static/icon/service_1.png | Bin 0 -> 9029 bytes src/static/icon/service_10.png | Bin 0 -> 5612 bytes src/static/icon/service_2.png | Bin 0 -> 4026 bytes src/static/icon/service_3.png | Bin 0 -> 4589 bytes src/static/icon/service_4.png | Bin 0 -> 2863 bytes src/static/icon/service_5.png | Bin 0 -> 1491 bytes src/static/icon/service_6.png | Bin 0 -> 3830 bytes src/static/icon/service_7.png | Bin 0 -> 4437 bytes src/static/icon/service_8.png | Bin 0 -> 5563 bytes src/static/icon/service_9.png | Bin 0 -> 4643 bytes 37 files changed, 3650 insertions(+), 2 deletions(-) create mode 100644 src/pages/merchant/brandDetail.vue create mode 100644 src/pages/merchant/cancel-qrcode.vue create mode 100644 src/pages/merchant/components/cancel-card.vue create mode 100644 src/pages/merchant/components/coupon-card.vue create mode 100644 src/pages/merchant/coupon-list.vue create mode 100644 src/pages/merchant/detail.vue create mode 100644 src/pages/merchant/merchant-activity.vue create mode 100644 src/pages/merchant/my-act-list.vue create mode 100644 src/pages/wallet/detail.vue create mode 100644 src/pages/wallet/list.vue create mode 100644 src/pages/wallet/recharge.vue create mode 100644 src/sheep/api/act-cancel copy.ts create mode 100644 src/sheep/api/act-com.ts create mode 100644 src/sheep/api/act-coupon.ts create mode 100644 src/sheep/api/apply.ts create mode 100644 src/sheep/api/shop.ts create mode 100644 src/sheep/utils/uqrcode.ts create mode 100644 src/static/icon/act.png create mode 100644 src/static/icon/clear-storage.png create mode 100644 src/static/icon/default-avatar.png create mode 100644 src/static/icon/scan.png create mode 100644 src/static/icon/service_1.png create mode 100644 src/static/icon/service_10.png create mode 100644 src/static/icon/service_2.png create mode 100644 src/static/icon/service_3.png create mode 100644 src/static/icon/service_4.png create mode 100644 src/static/icon/service_5.png create mode 100644 src/static/icon/service_6.png create mode 100644 src/static/icon/service_7.png create mode 100644 src/static/icon/service_8.png create mode 100644 src/static/icon/service_9.png diff --git a/src/pages.json b/src/pages.json index 4118a9a..a0ddbcd 100644 --- a/src/pages.json +++ b/src/pages.json @@ -38,6 +38,34 @@ } } ], + "subPackages": [ + { + "root": "pages/wallet", + "pages": [ + { + "path": "list", + "style": { + "navigationBarTitleText": "", + "disableScroll": true + } + }, + { + "path": "detail", + "style": { + "navigationBarTitleText": "", + "disableScroll": true + } + }, + { + "path": "recharge", + "style": { + "navigationBarTitleText": "", + "disableScroll": true + } + } + ] + } + ], "globalStyle": { "navigationBarTextStyle": "black", "navigationBarTitleText": "浦江县机关事务智慧后勤一体化平台app", diff --git a/src/pages/merchant/brandDetail.vue b/src/pages/merchant/brandDetail.vue new file mode 100644 index 0000000..54dc42d --- /dev/null +++ b/src/pages/merchant/brandDetail.vue @@ -0,0 +1,111 @@ + + + diff --git a/src/pages/merchant/cancel-qrcode.vue b/src/pages/merchant/cancel-qrcode.vue new file mode 100644 index 0000000..c991917 --- /dev/null +++ b/src/pages/merchant/cancel-qrcode.vue @@ -0,0 +1,80 @@ + + + + + \ No newline at end of file diff --git a/src/pages/merchant/components/cancel-card.vue b/src/pages/merchant/components/cancel-card.vue new file mode 100644 index 0000000..f197370 --- /dev/null +++ b/src/pages/merchant/components/cancel-card.vue @@ -0,0 +1,215 @@ + + + + + diff --git a/src/pages/merchant/components/coupon-card.vue b/src/pages/merchant/components/coupon-card.vue new file mode 100644 index 0000000..7361a6c --- /dev/null +++ b/src/pages/merchant/components/coupon-card.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/src/pages/merchant/coupon-list.vue b/src/pages/merchant/coupon-list.vue new file mode 100644 index 0000000..2ebf57c --- /dev/null +++ b/src/pages/merchant/coupon-list.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/pages/merchant/detail.vue b/src/pages/merchant/detail.vue new file mode 100644 index 0000000..97a0e42 --- /dev/null +++ b/src/pages/merchant/detail.vue @@ -0,0 +1,420 @@ + + + + + diff --git a/src/pages/merchant/merchant-activity.vue b/src/pages/merchant/merchant-activity.vue new file mode 100644 index 0000000..4a94024 --- /dev/null +++ b/src/pages/merchant/merchant-activity.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/src/pages/merchant/my-act-list.vue b/src/pages/merchant/my-act-list.vue new file mode 100644 index 0000000..060d009 --- /dev/null +++ b/src/pages/merchant/my-act-list.vue @@ -0,0 +1,173 @@ + + + diff --git a/src/pages/root/login.vue b/src/pages/root/login.vue index dec6c50..20571cd 100644 --- a/src/pages/root/login.vue +++ b/src/pages/root/login.vue @@ -34,10 +34,12 @@ const minAppGetphone = async (e) => { } try { uni.showLoading({ title: '登录中...', mask: true }) + const { code: loginCode }: any = await uni.login({ provider: 'weixin' }); // 获取用户手机号 const { data, code }: any = await miniPlatformApi.autoAdminLogin({ miniPlatformType: await getAppInfo(), - code: phoneDetail.code, + phoneCode: phoneDetail.code, + userCode: loginCode, }) if (data.errorCode) { state.loginErrorCode = data.errorCode diff --git a/src/pages/wallet/detail.vue b/src/pages/wallet/detail.vue new file mode 100644 index 0000000..21e90f7 --- /dev/null +++ b/src/pages/wallet/detail.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/pages/wallet/list.vue b/src/pages/wallet/list.vue new file mode 100644 index 0000000..69c1eaf --- /dev/null +++ b/src/pages/wallet/list.vue @@ -0,0 +1,223 @@ + + + diff --git a/src/pages/wallet/recharge.vue b/src/pages/wallet/recharge.vue new file mode 100644 index 0000000..a0ac185 --- /dev/null +++ b/src/pages/wallet/recharge.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/sheep/api/act-cancel copy.ts b/src/sheep/api/act-cancel copy.ts new file mode 100644 index 0000000..b290233 --- /dev/null +++ b/src/sheep/api/act-cancel copy.ts @@ -0,0 +1,73 @@ +import request from "@/sheep/utils/request" + +export default { + /** + * app领取优惠券 + */ + appGet: (data: any) => + request({ + url: "/wallet/act/cancel-item/app/get", + method: "POST", + data, + }), + /** + * app查询用户的唯一优惠券 + * @param params.actId 活动id + */ + appFindUnique: (params: any) => + request({ + url: "/wallet/act/cancel-item/app/find-unique", + method: "GET", + params, + }), + /** + * app查询本店优惠券列表 + * @param params.actStatus 核销类型 + */ + appMchPage: (params: any) => + request({ + url: "/wallet/act/cancel-item/app/mch/page", + method: "GET", + params, + }), + /** + * app创建活动订单 + * @param data.actId 活动id + * @param data.totalPrice 总金额 + */ + appCreateActOrder: (data: any) => + request({ + url: "/hard/hard-order/app/create-act-order", + method: "POST", + data, + }), + /** + * 根据公告id查询活动详情 + * @param data.id 公告id + */ + getDetailByNoticeId: (params: any) => + request({ + url: "/wallet/act/act-cancel/app/detail-by-notice-id", + method: "GET", + params, + }), + /** + * 根据活动id查询核销活动 + * @param data.id 活动id + */ + getDetailById: (params: any) => + request({ + url: "/wallet/act/act-cancel/app/detail-by-id", + method: "GET", + params, + }), + /** + * 用户领取核销券列表 + */ + userList: (params: any) => + request({ + url: "/wallet/act/cancel-item/app/user-list", + method: "GET", + params, + }), +} diff --git a/src/sheep/api/act-cancel.ts b/src/sheep/api/act-cancel.ts index 85dc586..b290233 100644 --- a/src/sheep/api/act-cancel.ts +++ b/src/sheep/api/act-cancel.ts @@ -61,4 +61,13 @@ export default { method: "GET", params, }), + /** + * 用户领取核销券列表 + */ + userList: (params: any) => + request({ + url: "/wallet/act/cancel-item/app/user-list", + method: "GET", + params, + }), } diff --git a/src/sheep/api/act-com.ts b/src/sheep/api/act-com.ts new file mode 100644 index 0000000..5d61111 --- /dev/null +++ b/src/sheep/api/act-com.ts @@ -0,0 +1,40 @@ +import request from "@/sheep/utils/request" + +export default { + /** + * 根据公告id查询对应的活动 + */ + getActByNotifyId: (params: any) => + request({ + url: "/wallet/act/com/app/get-act-by-notify-id", + method: "GET", + params, + }), + /** + * 获取活动详情 + */ + getActDetail: (params: any) => + request({ + url: "/wallet/act/com/app/get-act-detail", + method: "GET", + params, + }), + /** + * 判断用户是否可以参加活动 + */ + isEligibleForAct: (params: any) => + request({ + url: "/wallet/act/com/app/is-eligible-for-act", + method: "GET", + params, + }), + /** + * 用户参加活动的数量统计 + */ + userTotal: (params: any) => + request({ + url: "/wallet/act/com/app/user-total", + method: "GET", + params, + }), +} diff --git a/src/sheep/api/act-coupon.ts b/src/sheep/api/act-coupon.ts new file mode 100644 index 0000000..9241343 --- /dev/null +++ b/src/sheep/api/act-coupon.ts @@ -0,0 +1,22 @@ +import request from "@/sheep/utils/request" + +export default { + /** + * 领取优惠券 + */ + receive: (data: any) => + request({ + url: "/wallet/act-coupon-record/app/receive", + method: "POST", + data, + }), + /** + * 用户领取核销券列表 + */ + userList: (params: any) => + request({ + url: "/wallet/act-coupon-record/app/user-list", + method: "GET", + params, + }), +} diff --git a/src/sheep/api/apply.ts b/src/sheep/api/apply.ts new file mode 100644 index 0000000..6ecb554 --- /dev/null +++ b/src/sheep/api/apply.ts @@ -0,0 +1,52 @@ +import request from "@/sheep/utils/request" + +export default { + foreignList: (params: any) => + request({ + url: "wallet/wallet-foreign/app/page-join", + method: "GET", + params, + }), + foreignDetail: (params: any) => + request({ + url: "wallet/wallet-foreign/app/detail", + method: "GET", + params, + }), + codeList: (params: any) => + request({ + url: "wallet/wallet-code-use/app/code-list", + method: "GET", + params, + }), + getCodeById: (params: any) => + request({ + url: "wallet/wallet-code-use/app/user-code", + method: "GET", + params, + }), + foreignApply: (data: any) => + request({ + url: "wallet/wallet-foreign/app/apply", + method: "POST", + data, + }), + strideList: (params: any) => + request({ + url: "wallet/wallet-stride/app/page-join", + method: "GET", + params, + }), + strideDetail: (params: any) => + request({ + url: "wallet/wallet-stride/app/detail", + method: "GET", + params, + }), + strideApply: (data: any) => + request({ + url: "wallet/wallet-stride/app/apply", + method: "POST", + data, + }), +} diff --git a/src/sheep/api/index.ts b/src/sheep/api/index.ts index 67a52b1..7369dd8 100644 --- a/src/sheep/api/index.ts +++ b/src/sheep/api/index.ts @@ -1,5 +1,9 @@ export { default as accessStatsApi } from "./access-stats" +export { default as actCancel } from "./act-cancel" +export { default as actComApi } from "./act-com" +export { default as actCouponApi } from "./act-coupon" export { default as actCancelApi } from "./act-cancel" +export { default as applyApi } from "./apply" export { default as adApi } from "./ad" export { default as boxesApi } from "./boxes" export { default as faceApi } from "./face" @@ -10,6 +14,7 @@ export { default as orderApi } from "./order" export { default as payApi } from "./pay" export { default as productApi } from "./product" export { default as refundApi } from "./refund" +export { default as shopApi } from "./shop" export { default as totalApi } from "./total" export { default as userCarApi } from "./user-car" export { default as userApi } from "./user" diff --git a/src/sheep/api/mini-platform.ts b/src/sheep/api/mini-platform.ts index 920df7c..5a6b899 100644 --- a/src/sheep/api/mini-platform.ts +++ b/src/sheep/api/mini-platform.ts @@ -2,7 +2,8 @@ import request from "@/sheep/utils/request" type AutoAdminLoginDto = { miniPlatformType?: string - code?: string + phoneCode?: string + userCode?: string } export default { diff --git a/src/sheep/api/shop.ts b/src/sheep/api/shop.ts new file mode 100644 index 0000000..6740982 --- /dev/null +++ b/src/sheep/api/shop.ts @@ -0,0 +1,29 @@ +import request from "@/sheep/utils/request" + +export default { + getSupermarketSpuCategory: (params: any) => + request({ + url: `/supermarket/supermarketCategory/app/simpleAll`, + method: "GET", + params, + }), + getSupermarketSpuList: (data: any) => + request({ + url: `/supermarket/supermarketSpu/app/selectListAll`, + method: "POST", + data, + }), + getSupermarketSpuDetail: (params: any) => + request({ + url: `/supermarket/supermarketSpu/app/SpuDetails`, + method: "GET", + params, + }), + checkSpuStock: (params) => { + return request({ + url: "/supermarket/supermarketSpu/app/checkSpuStock", + method: "GET", + params, + }) + }, +} diff --git a/src/sheep/constant/service-enum.ts b/src/sheep/constant/service-enum.ts index 8f9cbfb..7ec32ca 100644 --- a/src/sheep/constant/service-enum.ts +++ b/src/sheep/constant/service-enum.ts @@ -61,6 +61,28 @@ const errorMsginiPlatformLoginErrorEnum = { "30": "登录错误", } +const actCouponTypeEnum = { + "1": "满减券", + "2": "折扣券", + "3": "立减券", + "4": "兑换券", +} + +// 用户活动状态 +const actUserReceiveEnum = { + "1": "活动不在进行中", + "2": "活动不存在", + "3": "活动未开启", + "4": "已领取,核销码在我的礼券中", + "5": "用户不能参加此活动", + "6": "其他错误", + "99": "用户可以参加活动", + // 特殊 + "-100": "仅限生日当月使用", + "-101": "请填写出生日期", + "-102": "生日已结束", +} + export default { hardwareOrderStatusEnum, hardwareOrderTypeEnum, @@ -71,4 +93,6 @@ export default { carTypeEnum, actCancelStatusEnum, errorMsginiPlatformLoginErrorEnum, + actCouponTypeEnum, + actUserReceiveEnum, } diff --git a/src/sheep/utils/uqrcode.ts b/src/sheep/utils/uqrcode.ts new file mode 100644 index 0000000..3349051 --- /dev/null +++ b/src/sheep/utils/uqrcode.ts @@ -0,0 +1,1310 @@ +// @ts-nocheck + +//--------------------------------------------------------------------- +// github https://github.com/Sansnn/uQRCode +//--------------------------------------------------------------------- + +let uQRCode: any = {} + +;(function () { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + + //--------------------------------------------------------------------- + // QR8bitByte + //--------------------------------------------------------------------- + + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE + this.data = data + } + + QR8bitByte.prototype = { + getLength: function (buffer) { + return this.data.length + }, + + write: function (buffer) { + for (var i = 0; i < this.data.length; i++) { + // not JIS ... + buffer.put(this.data.charCodeAt(i), 8) + } + }, + } + + //--------------------------------------------------------------------- + // QRCode + //--------------------------------------------------------------------- + + function QRCode(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber + this.errorCorrectLevel = errorCorrectLevel + this.modules = null + this.moduleCount = 0 + this.dataCache = null + this.dataList = new Array() + } + + QRCode.prototype = { + addData: function (data) { + var newData = new QR8bitByte(data) + this.dataList.push(newData) + this.dataCache = null + }, + + isDark: function (row, col) { + if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { + throw new Error(row + "," + col) + } + return this.modules[row][col] + }, + + getModuleCount: function () { + return this.moduleCount + }, + + make: function () { + // Calculate automatically typeNumber if provided is < 1 + if (this.typeNumber < 1) { + var typeNumber = 1 + for (typeNumber = 1; typeNumber < 40; typeNumber++) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel) + + var buffer = new QRBitBuffer() + var totalDataCount = 0 + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount + } + + for (var i = 0; i < this.dataList.length; i++) { + var data = this.dataList[i] + buffer.put(data.mode, 4) + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)) + data.write(buffer) + } + if (buffer.getLengthInBits() <= totalDataCount * 8) break + } + this.typeNumber = typeNumber + } + this.makeImpl(false, this.getBestMaskPattern()) + }, + + makeImpl: function (test, maskPattern) { + this.moduleCount = this.typeNumber * 4 + 17 + this.modules = new Array(this.moduleCount) + + for (var row = 0; row < this.moduleCount; row++) { + this.modules[row] = new Array(this.moduleCount) + + for (var col = 0; col < this.moduleCount; col++) { + this.modules[row][col] = null //(col + row) % 3; + } + } + + 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 = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList) + } + + this.mapData(this.dataCache, maskPattern) + }, + + setupPositionProbePattern: function (row, col) { + for (var r = -1; r <= 7; r++) { + if (row + r <= -1 || this.moduleCount <= row + r) continue + + for (var c = -1; c <= 7; c++) { + if (col + c <= -1 || this.moduleCount <= col + c) continue + + if ( + (0 <= r && r <= 6 && (c == 0 || c == 6)) || + (0 <= c && c <= 6 && (r == 0 || r == 6)) || + (2 <= r && r <= 4 && 2 <= c && c <= 4) + ) { + this.modules[row + r][col + c] = true + } else { + this.modules[row + r][col + c] = false + } + } + } + }, + + getBestMaskPattern: function () { + var minLostPoint = 0 + var pattern = 0 + + for (var i = 0; i < 8; i++) { + this.makeImpl(true, i) + + var lostPoint = QRUtil.getLostPoint(this) + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint + pattern = i + } + } + + return pattern + }, + + createMovieClip: function (target_mc, instance_name, depth) { + var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth) + var cs = 1 + + this.make() + + for (var row = 0; row < this.modules.length; row++) { + var y = row * cs + + for (var col = 0; col < this.modules[row].length; col++) { + var x = col * cs + var dark = this.modules[row][col] + + if (dark) { + qr_mc.beginFill(0, 100) + qr_mc.moveTo(x, y) + qr_mc.lineTo(x + cs, y) + qr_mc.lineTo(x + cs, y + cs) + qr_mc.lineTo(x, y + cs) + qr_mc.endFill() + } + } + } + + return qr_mc + }, + + setupTimingPattern: function () { + for (var r = 8; r < this.moduleCount - 8; r++) { + if (this.modules[r][6] != null) { + continue + } + this.modules[r][6] = r % 2 == 0 + } + + for (var c = 8; c < this.moduleCount - 8; c++) { + if (this.modules[6][c] != null) { + continue + } + this.modules[6][c] = c % 2 == 0 + } + }, + + setupPositionAdjustPattern: function () { + var pos = QRUtil.getPatternPosition(this.typeNumber) + + for (var i = 0; i < pos.length; i++) { + for (var j = 0; j < pos.length; j++) { + var row = pos[i] + var col = pos[j] + + if (this.modules[row][col] != null) { + continue + } + + for (var r = -2; r <= 2; r++) { + for (var c = -2; c <= 2; c++) { + if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) { + this.modules[row + r][col + c] = true + } else { + this.modules[row + r][col + c] = false + } + } + } + } + } + }, + + setupTypeNumber: function (test) { + var bits = QRUtil.getBCHTypeNumber(this.typeNumber) + + for (var i = 0; i < 18; i++) { + var mod = !test && ((bits >> i) & 1) == 1 + this.modules[Math.floor(i / 3)][(i % 3) + this.moduleCount - 8 - 3] = mod + } + + for (var i = 0; i < 18; i++) { + var mod = !test && ((bits >> i) & 1) == 1 + this.modules[(i % 3) + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod + } + }, + + setupTypeInfo: function (test, maskPattern) { + var data = (this.errorCorrectLevel << 3) | maskPattern + var bits = QRUtil.getBCHTypeInfo(data) + + // vertical + for (var i = 0; i < 15; i++) { + var 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 + } + } + + // horizontal + for (var i = 0; i < 15; i++) { + var 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 + } + } + + // fixed module + this.modules[this.moduleCount - 8][8] = !test + }, + + mapData: function (data, maskPattern) { + var inc = -1 + var row = this.moduleCount - 1 + var bitIndex = 7 + var byteIndex = 0 + + for (var col = this.moduleCount - 1; col > 0; col -= 2) { + if (col == 6) col-- + + while (true) { + for (var c = 0; c < 2; c++) { + if (this.modules[row][col - c] == null) { + var dark = false + + if (byteIndex < data.length) { + dark = ((data[byteIndex] >>> bitIndex) & 1) == 1 + } + + var 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 + } + } + } + }, + } + + QRCode.PAD0 = 0xec + QRCode.PAD1 = 0x11 + + QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel) + + var buffer = new QRBitBuffer() + + for (var i = 0; i < dataList.length; i++) { + var data = dataList[i] + buffer.put(data.mode, 4) + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)) + data.write(buffer) + } + + // calc num max data. + var totalDataCount = 0 + for (var 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 + ")") + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4) + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false) + } + + // padding + while (true) { + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break + } + buffer.put(QRCode.PAD0, 8) + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break + } + buffer.put(QRCode.PAD1, 8) + } + + return QRCode.createBytes(buffer, rsBlocks) + } + + QRCode.createBytes = function (buffer, rsBlocks) { + var offset = 0 + + var maxDcCount = 0 + var maxEcCount = 0 + + var dcdata = new Array(rsBlocks.length) + var ecdata = new Array(rsBlocks.length) + + for (var r = 0; r < rsBlocks.length; r++) { + var dcCount = rsBlocks[r].dataCount + var ecCount = rsBlocks[r].totalCount - dcCount + + maxDcCount = Math.max(maxDcCount, dcCount) + maxEcCount = Math.max(maxEcCount, ecCount) + + dcdata[r] = new Array(dcCount) + + for (var i = 0; i < dcdata[r].length; i++) { + dcdata[r][i] = 0xff & buffer.buffer[i + offset] + } + offset += dcCount + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount) + var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1) + + var modPoly = rawPoly.mod(rsPoly) + ecdata[r] = new Array(rsPoly.getLength() - 1) + for (var i = 0; i < ecdata[r].length; i++) { + var modIndex = i + modPoly.getLength() - ecdata[r].length + ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0 + } + } + + var totalCodeCount = 0 + for (var i = 0; i < rsBlocks.length; i++) { + totalCodeCount += rsBlocks[i].totalCount + } + + var data = new Array(totalCodeCount) + var index = 0 + + for (var i = 0; i < maxDcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < dcdata[r].length) { + data[index++] = dcdata[r][i] + } + } + } + + for (var i = 0; i < maxEcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < ecdata[r].length) { + data[index++] = ecdata[r][i] + } + } + } + + return data + } + + //--------------------------------------------------------------------- + // QRMode + //--------------------------------------------------------------------- + + var QRMode = { + MODE_NUMBER: 1 << 0, + MODE_ALPHA_NUM: 1 << 1, + MODE_8BIT_BYTE: 1 << 2, + MODE_KANJI: 1 << 3, + } + + //--------------------------------------------------------------------- + // QRErrorCorrectLevel + //--------------------------------------------------------------------- + + var QRErrorCorrectLevel = { + L: 1, + M: 0, + Q: 3, + H: 2, + } + + //--------------------------------------------------------------------- + // QRMaskPattern + //--------------------------------------------------------------------- + + var QRMaskPattern = { + PATTERN000: 0, + PATTERN001: 1, + PATTERN010: 2, + PATTERN011: 3, + PATTERN100: 4, + PATTERN101: 5, + PATTERN110: 6, + PATTERN111: 7, + } + + //--------------------------------------------------------------------- + // QRUtil + //--------------------------------------------------------------------- + + var 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) { + // 1 - 9 + + 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) { + // 10 - 26 + + 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) { + // 27 - 40 + + 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 + + // LEVEL1 + + 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 + } + } + } + + // LEVEL2 + + 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 + } + } + } + + // LEVEL3 + + 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 + } + } + } + + // LEVEL4 + + 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 + //--------------------------------------------------------------------- + + var 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 (var i = 0; i < 8; i++) { + QRMath.EXP_TABLE[i] = 1 << i + } + for (var 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 (var i = 0; i < 255; i++) { + QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i + } + + //--------------------------------------------------------------------- + // QRPolynomial + //--------------------------------------------------------------------- + + function QRPolynomial(num, shift) { + if (num.length == undefined) { + throw new Error(num.length + "/" + shift) + } + + var offset = 0 + + while (offset < num.length && num[offset] == 0) { + offset++ + } + + this.num = new Array(num.length - offset + shift) + for (var i = 0; i < num.length - offset; i++) { + this.num[i] = num[i + offset] + } + } + + QRPolynomial.prototype = { + get: function (index) { + return this.num[index] + }, + + getLength: function () { + return this.num.length + }, + + multiply: function (e) { + var num = new Array(this.getLength() + e.getLength() - 1) + + for (var i = 0; i < this.getLength(); i++) { + for (var 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: function (e) { + if (this.getLength() - e.getLength() < 0) { + return this + } + + var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)) + + var num = new Array(this.getLength()) + + for (var i = 0; i < this.getLength(); i++) { + num[i] = this.get(i) + } + + for (var i = 0; i < e.getLength(); i++) { + num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio) + } + + // recursive call + return new QRPolynomial(num, 0).mod(e) + }, + } + + //--------------------------------------------------------------------- + // QRRSBlock + //--------------------------------------------------------------------- + + function QRRSBlock(totalCount, dataCount) { + this.totalCount = totalCount + this.dataCount = dataCount + } + + QRRSBlock.RS_BLOCK_TABLE = [ + // L + // M + // Q + // H + + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [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) { + var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel) + + if (rsBlock == undefined) { + throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel) + } + + var length = rsBlock.length / 3 + + var list = new Array() + + for (var i = 0; i < length; i++) { + var count = rsBlock[i * 3 + 0] + var totalCount = rsBlock[i * 3 + 1] + var dataCount = rsBlock[i * 3 + 2] + + for (var 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 + 0] + 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 + } + } + + //--------------------------------------------------------------------- + // QRBitBuffer + //--------------------------------------------------------------------- + + function QRBitBuffer() { + this.buffer = new Array() + this.length = 0 + } + + QRBitBuffer.prototype = { + get: function (index) { + var bufIndex = Math.floor(index / 8) + return ((this.buffer[bufIndex] >>> (7 - (index % 8))) & 1) == 1 + }, + + put: function (num, length) { + for (var i = 0; i < length; i++) { + this.putBit(((num >>> (length - i - 1)) & 1) == 1) + } + }, + + getLengthInBits: function () { + return this.length + }, + + putBit: function (bit) { + var 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++ + }, + } + + //--------------------------------------------------------------------- + // Support Chinese + //--------------------------------------------------------------------- + function utf16To8(text) { + var result = "" + var c + for (var i = 0; i < text.length; i++) { + c = text.charCodeAt(i) + if (c >= 0x0001 && c <= 0x007f) { + result += text.charAt(i) + } else if (c > 0x07ff) { + result += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f)) + result += String.fromCharCode(0x80 | ((c >> 6) & 0x3f)) + result += String.fromCharCode(0x80 | ((c >> 0) & 0x3f)) + } else { + result += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f)) + result += String.fromCharCode(0x80 | ((c >> 0) & 0x3f)) + } + } + return result + } + + uQRCode = { + defaults: { + size: 258, + margin: 0, + backgroundColor: "#ffffff", + foregroundColor: "#000000", + fileType: "png", // 'jpg', 'png' + correctLevel: 3, + typeNumber: -1, + }, + + make: function (options) { + var defaultOptions = { + canvasId: options.canvasId, + componentInstance: options.componentInstance, + text: options.text, + size: this.defaults.size, + margin: this.defaults.margin, + backgroundColor: this.defaults.backgroundColor, + foregroundColor: this.defaults.foregroundColor, + fileType: this.defaults.fileType, + correctLevel: this.defaults.correctLevel, + typeNumber: this.defaults.typeNumber, + } + if (options) { + for (var i in options) { + defaultOptions[i] = options[i] + } + } + options = defaultOptions + if (!options.canvasId) { + console.error("uQRCode: Please set canvasId!") + return + } + + function createCanvas() { + var qrcode = new QRCode(options.typeNumber, options.correctLevel) + qrcode.addData(utf16To8(options.text)) + qrcode.make() + + var ctx = uni.createCanvasContext(options.canvasId, options.componentInstance) + ctx.setFillStyle(options.backgroundColor) + ctx.fillRect(0, 0, options.size, options.size) + + var tileW = (options.size - options.margin * 2) / qrcode.getModuleCount() + var tileH = tileW + + for (var row = 0; row < qrcode.getModuleCount(); row++) { + for (var col = 0; col < qrcode.getModuleCount(); col++) { + var style = qrcode.isDark(row, col) ? options.foregroundColor : options.backgroundColor + ctx.setFillStyle(style) + var x = Math.round(col * tileW) + options.margin + var y = Math.round(row * tileH) + options.margin + var w = Math.ceil((col + 1) * tileW) - Math.floor(col * tileW) + var h = Math.ceil((row + 1) * tileW) - Math.floor(row * tileW) + ctx.fillRect(x, y, w, h) + } + } + + setTimeout(function () { + ctx.draw(false, function () { + setTimeout(function () { + uni.canvasToTempFilePath( + { + canvasId: options.canvasId, + fileType: options.fileType, + width: options.size, + height: options.size, + destWidth: options.size, + destHeight: options.size, + success: function (res) { + options.success && options.success(res.tempFilePath) + }, + fail: function (error) { + options.fail && options.fail(error) + }, + complete: function (res) { + options.complete && options.complete(res) + }, + }, + options.componentInstance, + ) + }, options.text.length + 100) + }) + }, 150) + } + + createCanvas() + }, + } +})() + +export default uQRCode diff --git a/src/static/icon/act.png b/src/static/icon/act.png new file mode 100644 index 0000000000000000000000000000000000000000..7f49d458908fbfd1ee13b29d7edb627626f3241c GIT binary patch literal 3811 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 literal 0 HcmV?d00001 diff --git a/src/static/icon/clear-storage.png b/src/static/icon/clear-storage.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7d35e496615c943bcf2d04c5890ce2db9009e3 GIT binary patch literal 3369 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 I3-6QgF9D_F2><{9 literal 0 HcmV?d00001 diff --git a/src/static/icon/default-avatar.png b/src/static/icon/default-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..15ee591ca0954b69f4f67ce6ddf126f524881287 GIT binary patch literal 5308 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 literal 0 HcmV?d00001 diff --git a/src/static/icon/service_1.png b/src/static/icon/service_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e9490cdd5de719c712fcfa605cbab16062e88f GIT binary patch literal 9029 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 literal 0 HcmV?d00001 diff --git a/src/static/icon/service_10.png b/src/static/icon/service_10.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f1509ddaf883b266c21b2892880115c1426d13 GIT binary patch literal 5612 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 literal 0 HcmV?d00001 diff --git a/src/static/icon/service_7.png b/src/static/icon/service_7.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d2e395e92682bc07be6ec355cdf4bb892a9872 GIT binary patch literal 4437 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 XSp_zf`OtXMWd@|KtfN$;XcPKBo}<1& literal 0 HcmV?d00001