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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ v.name }}
+
+
+
+
+
+ {{ v.phone }}
+
+
+
+ {{ v.deptName.length > 5 ? v.deptName.substring(0, 5) + "..." : v.deptName }}
+
+
+
+ 营业时间:
+ {{ v.jobTime?.split(",")[0] ? "早:" + v.jobTime?.split(",")[0] : "" }}
+ {{ v.jobTime?.split(",")[1] ? "中:" + v.jobTime?.split(",")[1] : "" }}
+ {{ v.jobTime?.split(",")[2] ? "晚:" + v.jobTime?.split(",")[2] : "" }}
+
+
+
+ 地址:
+ {{ v.addressDes }}
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ¥
+ {{ detail.faceValue }}
+
+ {{ detail.actTitlel }}
+
+
+ 活动商户:{{ detail.mchName }}
+
+
+ {{ actCouponTypeEnum[detail.couponType] }}
+ 有限期至 {{ detail.expireTime }}
+
+
+
+
+
+
+
+
+
+
+
+ 核销码
+ 已使用
+ 已过期
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ¥
+ {{ detail.faceValue }}
+
+ {{ detail.couponName }}
+
+
+ 满{{ detail.minPoint }}可用
+
+
+ {{ actCouponTypeEnum[detail.couponType] }}
+ 在{{ detail.startTime }}至{{ detail.endTime }}时间段使用
+
+
+
+
+
+
+
+
+
+
+
+ 核销码
+ 已使用
+ 已过期
+
+
+
+
+
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 @@
+
+
+
+
+
+
+ 搜 索
+
+
+
+
+
+
+
+
+
+ {{ getActStatus(item.actStatus)?.name }}
+
+ ID {{ item.id }}
+
+ 限时领取
+
+ {{ (item.actStartTime?.split(" ")[0] || "") + "~" + (item.actExpireTime?.split(" ")[0] || "") }}
+
+
+ {{ item.actTitlel }}
+ 限量领取 先领先得
+
+ 领取人 {{ item.receiverUsername }}
+ 领取时间 {{ item.receiverTime }}
+
+
+ 核销人 {{ item.cancelUsername }}
+ 核销时间 {{ item.cancelTime }}
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ state.detail.name }}
+
+
+
+
+
+ {{ item.trim() }}
+
+ 联系商家
+
+
+
+
+ {{ state.detail.deptName?.length > 5 ? state.detail.deptName.substring(0, 5) +
+ "..." : state.detail.deptName }}
+
+
+
+ {{ state.detail.jobTime == ",," ? "" : "营业时间:" }}
+
+ {{ state.detail.jobTime?.split(",")[0] ? "早:" +
+ state.detail.jobTime?.split(",")[0] : "" }}
+ {{ state.detail.jobTime?.split(",")[1] ? "中:" +
+ state.detail.jobTime?.split(",")[1] : "" }}
+ {{ state.detail.jobTime?.split(",")[2] ? "晚:" +
+ state.detail.jobTime?.split(",")[2] : "" }}
+
+
+
+ 地址:
+ {{ state.detail.addressDes }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+ 兑换券
+
+ 限时领取
+
+ {{ (state.actDetail.startTime?.split(" ")[0] || "") + "~" +
+ (state.actDetail.expireTime?.split(" ")[0] || "") }}
+
+
+ {{ state.actDetail.actTitle }}
+
+ ¥{{ hooks.useMoney(state.actDetail.activeCancelPrice) }}
+ ¥{{ hooks.useMoney(state.actDetail.activeOrgPrice)
+ }}
+
+ 限量领取 先领先得
+
+
+
+
+ {{ actCouponTypeEnum[state.actDetail.type] }}
+
+
+
+ {{ actCouponTypeEnum[state.actDetail.type] }}
+
+ {{ state.actDetail.name }}
+
+
+ {{ state.actDetail.validStartTime }}
+ ~
+ {{ state.actDetail.validEndTime }}
+
+
+
+
+
+ 领取后请在
+ {{ state.actDetail.validStartTime }}
+ ~
+ {{ state.actDetail.validEndTime }}
+ 时间段内使用
+
+
+ 领取后请在
+ {{ state.actDetail.validDays }}
+ 天内使用
+
+
+
+ {{ state.actDetail.description }}
+
+
+
+ 已 核 销
+
+
+ 立 即 领 取
+
+ {{ actUserReceiveEnum[state.actUserReceiveStatus] || "未知状态" }}
+
+
+
+
+
+ 我的礼券
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ v.title }}
+ {{ v.title }}
+ {{ v.title }}
+ {{ v.title }}
+ {{ v.title }}
+ {{ v.title }}
+ {{ v.title }}
+
+
+ {{ hooks.useMoney(v.price) }}元
+
+
+
+ {{ hooks.useTime(v.createTime, "") }}
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+ 卡号: {{ v.cardNumber }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ v.walletTypeName }}
+
+
+
+ 正常
+ 已冻结
+
+
+
+ ¥{{ hooks.useMoney(v.balance) }}
+
+
+
+ 转账
+
+ 申请冻结
+
+
+ 去充值
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 绑定
+
+
+
+
+
+
+
+
+
+ 冻结
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ state.detail.walletTypeName }}
+
+
+
+ ¥{{ hooks.useMoney(state.detail.balance) }}
+
+
+ 充值
+
+
+ ¥{{ hooks.useMoney(v.payPrice) }}
+
+
+ 支付
+
+
+
+
+
+
+ 确认充值
+
+
+
+
+
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
zcmds4X*iT$A0Cex##kB}DN6<;V^8+AF^r|GV;QpKFO-bz3Z)rIjM7A*>|$!rSc_zt
z{#hzZMU1To*+rx%>V4|^zhB?$dcV9M-Ve_?*K^K&e!u&)VRfS=RB&MDqqm3!OtsgLWI{N6@ndY-A&6+ED_pJL%jAzH<;%7}(
zB2GRrl$%f&K~vrN;KOtXU$-3v_%M&AszI^H{kud8ap!of*l7@{wls;_q(lhp5av=q
zPBb`ac;;S@c(duaQphtH(i2j+R29h~%1^|=^FtVG`1{&d{G||nX&L*==Mi;bDR34f
z^o3+skFi%3Kl>9=qSa)Kz7wIYHztZjc5P(^#XeAKfleIi68YH={gyS-P=K$tw57UL
zDU&w%V6JW@UzPp6GGAuKt9nmIDI%ZE%exrEeX9RDHvY^dY}C)}!1tCL3BeRVW3L-=
zAPb^$$ZB8RYZrH=!xDA2f@|?udTzh9QmhzsF+6D(Is0a)$63>
zEI0k!t7{|>SL2*1G1INsAoG2WOiHMHOScaZ2;S_a8d_1QIl@NlWNPq!_2tEcuj
z?fHWT!yEU{p`*uqUl#vK8i{;zQXJfP9yab^{NF)+zuDaVACn-2(*2s#o*P{SoLVh;
zJ}AE3Gp5SEV*9n29RZMaUxcCJ>I0=*$m(39HtXlx>W`c&Rn=Qt8_sUq2>-iNTu1xI
z3_7)?l;2}LOqAk}RN<}~VsOovTl*9!<(u>UIIy^u8Xr9*M#X41+l@95ptIjuw5^1d)QQ@iQ<*_~Zc--hV?U7@HTsdfPoe3~UoIfG
zdDz9TZNr;S!Iyf7?&38$Xkg!Hp>(=PKL7Au4lR@YROOa@QRBKAov^#HDoXMq;2<=B
z;-utIAQE`5`X+u1b3qO=*k*hvn!^i_0+>b%abA^xby=ebTW#F7>ZgMUd@Z)E5_kGL
z7FC`Uex5vHNJWxVLqJHZFl9XUUK=balY$Vk8T`0o!gX%#UJ$APhctAHV?l)p{!7I9m!;?W$>VW>UKMa;hqI$2%p0q{V0Ciyb10{zU!?NytMHTKK^!T_+@ojZzz#9*MNxrF`~7Y
z&ej5cZ~h;$cMPk8F*gnsDbZ{j;?OKiyfdcRm?ku9xAu!_e>ahO*f<$395Xe1sxy`HFR+-Xk
z_%`?ZNsT8lQ>>GVAqy)C5|hid@0**J?Nyxqk_OYS3ea(401AGc7bI)Mjq$OhfM@ZV
zyBVGW>`OPTwKW7#$x^xjf_z*EKP#Rdon=st=&@{V3`kXGpVnxd9F95^c4Cl@T$QC~
zNI&g(WhI?%_I5>QOPIWq58+7r0qxsoyyKH+(FM%=UoEKS+IBiqcObCIJJ>}6_?;=I
zbIBdrT!=Pp$HCO!N)6}@Ukw7Y1{GI`iGo^}h1KlifWE;ocUM;eg>s(q(`12cSt&K%
z&LE5X9WMercNgM3cl$Tr2iZAZ%jjtUi&Mjam$8nZ(#7HmIbpUGAk6mWMltxW{{IQI
zbTVn&M7#uT*QR&sMjoh5uG}&TwdCAxyu9bKqQp=MuOpA?HdqVjW9T%Pb9k8@}bCjOnO+OB!(!)lWVV^FLRc#0oiG`w$5
z)uZU$O~kgmCqHj~w{XB^M}`vQS!o<0*I-oMGHW~Vb2`h7E&&RqwN$^Me>{-&)6_X*xJ;jM69)alSu-?;1_~2U+UT{
z$h+(aQ`GNFe@X7CaejGVqeEw*w6DWEBX`)Buo_ycR-nmrVa@d@4UyA#AIt>8U>?wd
zGlL()GGeV=lp(~7-2K(|0nCbn%(I_t8z+X~X{HCqF(H{l*W8t&G7L^=d&$rgY{G#K
zBAVrMl9?R%Ae_+YQZ=d-GN_=px*VXSn=`0PifRR@(H0u{D0PDMy9aOze^N%%;>sY4^>~`#hfL@82b=YX`nUFUpNwA@!QuQ_X+w|APA0u_a
zUI@$)>X^QJmIwKjd8Ls$Ft2jQdE?vWibSDcw>ko2LQVD!u9X=*FLmf5z?`>rIN!i~5-k5bIdP#AX>A}UgSG^nToEayyBi}U1U8z9Jn49t08`d{$^SEr6a_Fu3
zj`M9!XkosR#DQU{nyya$+ur?8aEz8>mwqvx54E~jx*oKc%{k!o_*K1L)A4GC?m_r?
zml@R@jeN?gP%Ae}mb;I$`#GMRahA94vKbZSjo#(Y+}!ETbP^)bl?MeBnDatd)+6KT
zh!=Np2xYn%QmdwsoY%D-9Da#^x+J3_aiZLzqGq@*SO`Ycqe>FnxtB#g86L}e_9&v@
zsP}Q`TC3o7myIcit65knytm+}TuitkJppcBb#!#|Mb3Ca=PwPJU)`D>$2Bg9KEGPd
ziIut$vlqsQzrJ~DXvV9@@bKtltoqJ-%T~@|saLLim31&nZxe}(25-BDfHNK;K2YCL
z$hs9<0WA6oUV~~zpe?S-`Ei?oMcrh+Ci=r~-;|b-Shb!woJ8d}{hScV0`EQ$Yl59Q
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
zcmV-b5vuNqP)ng2#_?otJOjj5Fmv(N@k`}K!BvtU9A?PK$(CPBCgCVUjYG9z7N%dfC>nZ
zfa0p^@)Zyu<@-=Q2&jMn2`H|rE?)rwa^k~~FMs*%pZibc+snf*=gP@>A#GIM#|j9L
zV?DfIy#p`={m;Mucyi^X|M~ZqzHe`yK9#=t-k&Qc=TVm{Kc3#M@KCwAV8LsS=bK{jM@$g2ZVzF
z7#2>7zWW25BVdLs6Wx@;8x$ZL90(M1AQ-hB6dO*?;*d9BhAaax08Yumw9JhVAPWvU
zg~9-cg_h#)25^dCIj_9{nQ8O^#gB0@T@w_uZXRs{3gsOZO~a1#5g>yc6Bt}!a!};7
zo)`>_^aChp!1Rj}soAWX*)<@a!N}TI(Tp2G8Lq+s2_;&?88);_Km^9NNSr{KreE96
zs_Up-0a7m*;e!%b_6W)@01+5=009cqE;O~PHQ$=52Lxxb@N|psd>v7eWk7$cidEFg?fj8t1Ys^iiqfR9Rsq)0%3Ls=tDz+clU
zkT{Vk5@plLNxl3&An^LceAT5EI14Y*&)ab
zxf;!0fgEBZDIhM5?tM|-J~z!;X?FZbKh=r~$lTMwK^mR!+v9fI|NBSxczakXZQJ~@
zM_r~q6C=dR^g8x)58=+Z3iJ_gE=K``vkUT_;
zWyJ)>kSQWVvDU*W%hU=>=qwTp5VFT!rdN#6-7sP^dang*>i14zX{wlph0P+t0BLsd
za9M-EyQ;ehPr_!P2JVDrm^2+Siv$6LJDv4skM@}W%ROtXMPNNyK3oNAMdnB_xEv&;dhQFwxl?7_2D;X($1%JWj4yf+^6?d5^(rQ@`JQo#Nj
za!diinUkqCJp+eD_8`dl{$c*tV&C38Z5d2BW-P<;oJT?Dsa&cv=TYCK=aq6i8e7_G
z3W%j)Io0J02SEuKK+!b*qZ|P~6@a181|=umQrOZPe?H3;5S*4ml#p$bJ$&jXXq_(p
zV653e8x&vxM%q0+o_!p1y1%a1wmO>uVx8J*a9X;6?C$}=!Sd2$hoOJ6ca3FV%>b$O
z=Ah5?s_)xhbBLzCZ@%}#8iwZ_>37b2@CMfMqP2
z0a9l$w9hl$wONb;cIyxmK-_3qjCz|5ZQK6;n-A83St($(4lw~FD`he<#xl)k(xnJy
z*fr4`UG6mjq}E`lwO@8&Sbt3>fYiDE@N>SVXMXzmpKY@a@dm_duIDdEW;Kl8XO)>v
zJ2S^3HoXDandY0j>;BSESHU(5mg#~1fEeDC$xkD{zcFb0e|P=w(~|ph9-CJh;}6J{
z4e#MJvWV|zx%Qw_s6JX;Wbp>X!iZ1;S=8%$xsZ>l2oeiVq^ZLjkovD+`AxHMs~|yz
z6vh8amH{9sIv%%8-z5RSD3cO#o_%9<3m|cN
zl6foq5t5~e6DTa?E$dZXwh9Q4&3X=Nk#8>#n-AB4RVW}pE^uStH{X3z_65!9&ZUWP-(leQSeEzs7}q|9Wtjigjmxt9Dk$`2k{OMN#$i_txu?bKM6Nw`RFL
zjKH*w?$DnTZF=8x5Kj!q)Qi%d<3lo6$iZ^gwgP1?OOR~=aMA@>6eyko
zZa7_lY!GSfka6Lj`0AEGS@V$JdjiByzwvA!;X9~O|82fN8Qo#}OMn>4DNqc>%%rM%
z0ZAxuPN1~ICE}*h<>BVahXA=!xGks6K}j|J;u3N9c>8uAWsB81X0CuAAo{!Oxt5FD
zfI^wpDJfuKeWJ_4i!NGx!w-A0kTDp~e#HKeOPMA6cc6}@4_t`HeD5M`|X4=H05g=y0Qbkh0L;nAWOTRBw
zK!em=F}qka1H@|1H}7Wp?e@8Zzrype(f3aL=%dVjS;nFnAT{1FL}*fVm-RosX`it%
zvlvZlj^T9E43OGWJV7{t;xl4fM^5*6d+@1~kE-~bpX0ffv1kT}6RLf7&-MNW6iWA&
zRZ_u1yV&5Pbd7i4(ZxrT({oJ$+1uq_K%o$*&M~0}2PmDG|dX(D*rlxquQy}AN8P`;UIgsn6sBO2q2iLEP@K@
z3pWE