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
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/app/app.vue b/src/components/app/app.vue
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/avatar-upload/avatar-upload.vue b/src/components/avatar-upload/avatar-upload.vue
new file mode 100644
index 0000000..497f19d
--- /dev/null
+++ b/src/components/avatar-upload/avatar-upload.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
diff --git a/src/components/cheap-popup/cheap-popup.vue b/src/components/cheap-popup/cheap-popup.vue
new file mode 100644
index 0000000..cc48d98
--- /dev/null
+++ b/src/components/cheap-popup/cheap-popup.vue
@@ -0,0 +1,123 @@
+
+
+
+ 优惠
+
+ 暂无可用优惠券
+
+ 已领取优惠券(共{{ userCoupon?.length }}张)
+
+
+
+
+
+
+
+
+ 待领取优惠券(共{{ waituselists?.length }}张)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/coupon-card/coupon-card copy 2.vue b/src/components/coupon-card/coupon-card copy 2.vue
new file mode 100644
index 0000000..ffeeec7
--- /dev/null
+++ b/src/components/coupon-card/coupon-card copy 2.vue
@@ -0,0 +1,280 @@
+
+
+
+
+ {{ item.name }}
+ {{ couponDesc(item) }}
+ 使用有效期:2023.08.25-2023.09.25
+
+ 详细信息
+
+
+
+
+
+
+
+ ¥20.00
+ 立减券
+ 立即使用
+
+
+
+
+ 限品类:仅可购买生鲜部分商品
+ 券编号:35394387276
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/coupon-card/coupon-card copy.vue b/src/components/coupon-card/coupon-card copy.vue
new file mode 100644
index 0000000..5466880
--- /dev/null
+++ b/src/components/coupon-card/coupon-card copy.vue
@@ -0,0 +1,197 @@
+
+
+
+
+ ¥{{ item.money }}
+
+ {{
+ item.coupon_describe
+ }}
+
+
+
+
+ {{
+ item.name
+ }}
+
+
+
+ 即将过期,仅剩余
+
+
+
+ {{ item.use_time_desc }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ item.use_goods_type === 3 ? '不可用商品:' : '可用商品:'
+ }}
+ {{
+ iten.name
+ }}
+
+
+
+
+
+
diff --git a/src/components/coupon-card/coupon-card.vue b/src/components/coupon-card/coupon-card.vue
new file mode 100644
index 0000000..1b2d3c4
--- /dev/null
+++ b/src/components/coupon-card/coupon-card.vue
@@ -0,0 +1,328 @@
+
+
+
+
+
+
+ {{ item!.name }}
+ {{ couponDesc(item!) }}
+ {{ timeText }}{{ parseTime(item) }}
+
+
+
+ 详细信息
+
+
+
+
+
+
+
+
+ ¥
+ {{ item!.money }}
+
+ {{ couponCondition(item!) }}
+
+
+
+
+
+
+
+
+
+
+
+ 领取说明:{{ '每人限领' + item!.getNum }}张
+ 有效期截至时间:{{ item!.useTimeEnd }}
+ 使用限制:{{ parseDetailLabel(item!) }}
+
+
+
+
+
+
+
diff --git a/src/components/goods-card/index.vue b/src/components/goods-card/index.vue
new file mode 100644
index 0000000..8248d39
--- /dev/null
+++ b/src/components/goods-card/index.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+ {{ goodsItem.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ goodsItem.name }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/goods-desc/index.vue b/src/components/goods-desc/index.vue
new file mode 100644
index 0000000..2f8d12e
--- /dev/null
+++ b/src/components/goods-desc/index.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+ 活动
+
+
+ {{ item1.name }}
+
+
+
+ {{ item1.remarks || ' ' }}
+
+
+
+
+
+
+
+
+
+
+
+ ¥
+ {{ numFilter(item1.price) }}
+ 元
+
+ 原价:¥{{ numFilter(item1.scribingPrice) }}
+
+
+
+ {{ item1.orderNum }}
+ 人预约过
+
+
+
+ 立即抢购
+
+
+
+
+
+ ¥
+ {{ numFilter(item1.price) }}
+ 元
+
+
+ {{ item1.orderNum }}
+ 人预约过
+
+
+
+ 立即抢购
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/la-swiper/la-swiper.vue b/src/components/la-swiper/la-swiper.vue
new file mode 100644
index 0000000..236a71a
--- /dev/null
+++ b/src/components/la-swiper/la-swiper.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/mplogin-popup/mplogin-popup.vue b/src/components/mplogin-popup/mplogin-popup.vue
new file mode 100644
index 0000000..5ff8b10
--- /dev/null
+++ b/src/components/mplogin-popup/mplogin-popup.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+ {{ title }}
+
+
+ 建议使用您的微信头像和昵称,以便获得更好的体验
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/news-card/news-card.vue b/src/components/news-card/news-card.vue
new file mode 100644
index 0000000..0e33206
--- /dev/null
+++ b/src/components/news-card/news-card.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+ {{ item.title }}
+ {{
+ item.intro
+ }}
+
+
+ {{ item.createTime }}
+
+
+ {{ item.visit }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/order-footer/index.vue b/src/components/order-footer/index.vue
new file mode 100644
index 0000000..5f01371
--- /dev/null
+++ b/src/components/order-footer/index.vue
@@ -0,0 +1,598 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ goodsName }}
+ 完成服务请点击确认
+
+
+
+
+
+
+ 是否确认取消订单?
+
+
+ {{ reason.length }}/255
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/page-status/page-status.vue b/src/components/page-status/page-status.vue
new file mode 100644
index 0000000..946fcc3
--- /dev/null
+++ b/src/components/page-status/page-status.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/payment/component/pay-way-list.vue b/src/components/payment/component/pay-way-list.vue
new file mode 100644
index 0000000..45e1121
--- /dev/null
+++ b/src/components/payment/component/pay-way-list.vue
@@ -0,0 +1,49 @@
+
+
+
+
+ {{ item.pay_way_name }}
+ 可用余额:{{ user_money }}
+
+
+
+
+
+
+
diff --git a/src/components/payment/payment.vue b/src/components/payment/payment.vue
new file mode 100644
index 0000000..5e6f1ff
--- /dev/null
+++ b/src/components/payment/payment.vue
@@ -0,0 +1,525 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.payName }}
+
+
+ 可用余额:{{ payData.money }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 立即支付
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/price/index.vue b/src/components/price/index.vue
new file mode 100644
index 0000000..33a734f
--- /dev/null
+++ b/src/components/price/index.vue
@@ -0,0 +1,38 @@
+
+
+ {{ price }}
+ {{ desc }}
+
+ {{ scribingPrice }}{{ desc }}
+
+
+
+
+
+
+
diff --git a/src/components/price/price-v2.vue b/src/components/price/price-v2.vue
new file mode 100644
index 0000000..10967ad
--- /dev/null
+++ b/src/components/price/price-v2.vue
@@ -0,0 +1,155 @@
+
+
+
+
+
+ {{ prefix }}
+
+
+
+
+
+ {{ integer }}
+
+ {{ decimals }}
+
+
+
+
+ {{ suffix }}
+
+
+
+
+
+
+
+
diff --git a/src/components/qrcode/index.vue b/src/components/qrcode/index.vue
new file mode 100644
index 0000000..af3f321
--- /dev/null
+++ b/src/components/qrcode/index.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/qrcode/qrcode.js b/src/components/qrcode/qrcode.js
new file mode 100644
index 0000000..6ea6553
--- /dev/null
+++ b/src/components/qrcode/qrcode.js
@@ -0,0 +1,1201 @@
+let QRCode = {};
+(function () {
+ /**
+ * 获取单个字符的utf8编码
+ * unicode BMP平面约65535个字符
+ * @param {num} code
+ * return {array}
+ */
+ function unicodeFormat8(code) {
+ // 1 byte
+ var c0, c1, c2;
+ if (code < 128) {
+ return [code];
+ // 2 bytes
+ } else if (code < 2048) {
+ c0 = 192 + (code >> 6);
+ c1 = 128 + (code & 63);
+ return [c0, c1];
+ // 3 bytes
+ } else {
+ c0 = 224 + (code >> 12);
+ c1 = 128 + (code >> 6 & 63);
+ c2 = 128 + (code & 63);
+ return [c0, c1, c2];
+ }
+ }
+ /**
+ * 获取字符串的utf8编码字节串
+ * @param {string} string
+ * @return {array}
+ */
+ function getUTF8Bytes(string) {
+ var utf8codes = [];
+ for (var i = 0; i < string.length; i++) {
+ var code = string.charCodeAt(i);
+ var utf8 = unicodeFormat8(code);
+ for (var j = 0; j < utf8.length; j++) {
+ utf8codes.push(utf8[j]);
+ }
+ }
+ return utf8codes;
+ }
+ /**
+ * 二维码算法实现
+ * @param {string} data 要编码的信息字符串
+ * @param {num} errorCorrectLevel 纠错等级
+ */
+ function QRCodeAlg(data, errorCorrectLevel) {
+ this.typeNumber = -1; //版本
+ this.errorCorrectLevel = errorCorrectLevel;
+ this.modules = null; //二维矩阵,存放最终结果
+ this.moduleCount = 0; //矩阵大小
+ this.dataCache = null; //数据缓存
+ this.rsBlocks = null; //版本数据信息
+ this.totalDataCount = -1; //可使用的数据量
+ this.data = data;
+ this.utf8bytes = getUTF8Bytes(data);
+ this.make();
+ }
+ QRCodeAlg.prototype = {
+ constructor: QRCodeAlg,
+ /**
+ * 获取二维码矩阵大小
+ * @return {num} 矩阵大小
+ */
+ getModuleCount: function () {
+ return this.moduleCount;
+ },
+ /**
+ * 编码
+ */
+ make: function () {
+ this.getRightType();
+ this.dataCache = this.createData();
+ this.createQrcode();
+ },
+ /**
+ * 设置二位矩阵功能图形
+ * @param {bool} test 表示是否在寻找最好掩膜阶段
+ * @param {num} maskPattern 掩膜的版本
+ */
+ makeImpl: function (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);
+ }
+ this.setupPositionProbePattern(0, 0);
+ this.setupPositionProbePattern(this.moduleCount - 7, 0);
+ this.setupPositionProbePattern(0, this.moduleCount - 7);
+ this.setupPositionAdjustPattern();
+ this.setupTimingPattern();
+ this.setupTypeInfo(true, maskPattern);
+ if (this.typeNumber >= 7) {
+ this.setupTypeNumber(true);
+ }
+ this.mapData(this.dataCache, maskPattern);
+ },
+ /**
+ * 设置二维码的位置探测图形
+ * @param {num} row 探测图形的中心横坐标
+ * @param {num} col 探测图形的中心纵坐标
+ */
+ 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;
+ }
+ }
+ }
+ },
+ /**
+ * 创建二维码
+ * @return {[type]} [description]
+ */
+ createQrcode: function () {
+ var minLostPoint = 0;
+ var pattern = 0;
+ var bestModules = null;
+ for (var i = 0; i < 8; i++) {
+ this.makeImpl(i);
+ var lostPoint = QRUtil.getLostPoint(this);
+ if (i == 0 || minLostPoint > lostPoint) {
+ minLostPoint = lostPoint;
+ pattern = i;
+ bestModules = this.modules;
+ }
+ }
+ this.modules = bestModules;
+ this.setupTypeInfo(false, pattern);
+ if (this.typeNumber >= 7) {
+ this.setupTypeNumber(false);
+ }
+ },
+ /**
+ * 设置定位图形
+ * @return {[type]} [description]
+ */
+ 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);
+ if (this.modules[6][r] != null) {
+ continue;
+ }
+ this.modules[6][r] = (r % 2 == 0);
+ }
+ },
+ /**
+ * 设置矫正图形
+ * @return {[type]} [description]
+ */
+ 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;
+ }
+ }
+ }
+ }
+ }
+ },
+ /**
+ * 设置版本信息(7以上版本才有)
+ * @param {bool} test 是否处于判断最佳掩膜阶段
+ * @return {[type]} [description]
+ */
+ 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;
+ this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
+ }
+ },
+ /**
+ * 设置格式信息(纠错等级和掩膜版本)
+ * @param {bool} test
+ * @param {num} maskPattern 掩膜版本
+ * @return {}
+ */
+ setupTypeInfo: function (test, maskPattern) {
+ var data = (QRErrorCorrectLevel[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
+ 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);
+ },
+ /**
+ * 数据编码
+ * @return {[type]} [description]
+ */
+ createData: function () {
+ var buffer = new QRBitBuffer();
+ var lengthBits = this.typeNumber > 9 ? 16 : 8;
+ buffer.put(4, 4); //添加模式
+ buffer.put(this.utf8bytes.length, lengthBits);
+ for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
+ buffer.put(this.utf8bytes[i], 8);
+ }
+ if (buffer.length + 4 <= this.totalDataCount * 8) {
+ buffer.put(0, 4);
+ }
+ // padding
+ while (buffer.length % 8 != 0) {
+ buffer.putBit(false);
+ }
+ // padding
+ while (true) {
+ if (buffer.length >= this.totalDataCount * 8) {
+ break;
+ }
+ buffer.put(QRCodeAlg.PAD0, 8);
+ if (buffer.length >= this.totalDataCount * 8) {
+ break;
+ }
+ buffer.put(QRCodeAlg.PAD1, 8);
+ }
+ return this.createBytes(buffer);
+ },
+ /**
+ * 纠错码编码
+ * @param {buffer} buffer 数据编码
+ * @return {[type]}
+ */
+ createBytes: function (buffer) {
+ var offset = 0;
+ var maxDcCount = 0;
+ var maxEcCount = 0;
+ var length = this.rsBlock.length / 3;
+ var rsBlocks = new Array();
+ for (var i = 0; i < length; i++) {
+ var count = this.rsBlock[i * 3 + 0];
+ var totalCount = this.rsBlock[i * 3 + 1];
+ var dataCount = this.rsBlock[i * 3 + 2];
+ for (var j = 0; j < count; j++) {
+ rsBlocks.push([dataCount, totalCount]);
+ }
+ }
+ var dcdata = new Array(rsBlocks.length);
+ var ecdata = new Array(rsBlocks.length);
+ for (var r = 0; r < rsBlocks.length; r++) {
+ var dcCount = rsBlocks[r][0];
+ var ecCount = rsBlocks[r][1] - 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 data = new Array(this.totalDataCount);
+ 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;
+
+ },
+ /**
+ * 布置模块,构建最终信息
+ * @param {} data
+ * @param {} maskPattern
+ * @return {}
+ */
+ 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;
+ }
+ }
+ }
+ }
+ };
+ /**
+ * 填充字段
+ */
+ QRCodeAlg.PAD0 = 0xEC;
+ QRCodeAlg.PAD1 = 0x11;
+ //---------------------------------------------------------------------
+ // 纠错等级对应的编码
+ //---------------------------------------------------------------------
+ var QRErrorCorrectLevel = [1, 0, 3, 2];
+ //---------------------------------------------------------------------
+ // 掩膜版本
+ //---------------------------------------------------------------------
+ var QRMaskPattern = {
+ PATTERN000: 0,
+ PATTERN001: 1,
+ PATTERN010: 2,
+ PATTERN011: 3,
+ PATTERN100: 4,
+ PATTERN101: 5,
+ PATTERN110: 6,
+ PATTERN111: 7
+ };
+ //---------------------------------------------------------------------
+ // 工具类
+ //---------------------------------------------------------------------
+ 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),
+ /*
+ BCH编码格式信息
+ */
+ 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;
+ },
+ /*
+ BCH编码版本信息
+ */
+ 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;
+ },
+ /*
+ 获取BCH位信息
+ */
+ 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);
+ }
+ },
+ /*
+ 获取RS的纠错多项式
+ */
+ 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;
+ },
+ /*
+ 获取评价
+ */
+ getLostPoint: function (qrCode) {
+ var moduleCount = qrCode.getModuleCount(),
+ lostPoint = 0,
+ darkCount = 0;
+ for (var row = 0; row < moduleCount; row++) {
+ var sameCount = 0;
+ var head = qrCode.modules[row][0];
+ for (var col = 0; col < moduleCount; col++) {
+ var current = qrCode.modules[row][col];
+ //level 3 评价
+ if (col < moduleCount - 6) {
+ if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
+ if (col < moduleCount - 10) {
+ if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
+ lostPoint += 40;
+ }
+ } else if (col > 3) {
+ if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
+ lostPoint += 40;
+ }
+ }
+ }
+ }
+ //level 2 评价
+ if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
+ var count = 0;
+ if (current) count++;
+ if (qrCode.modules[row + 1][col]) count++;
+ if (qrCode.modules[row][col + 1]) count++;
+ if (qrCode.modules[row + 1][col + 1]) count++;
+ if (count == 0 || count == 4) {
+ lostPoint += 3;
+ }
+ }
+ //level 1 评价
+ if (head ^ current) {
+ sameCount++;
+ } else {
+ head = current;
+ if (sameCount >= 5) {
+ lostPoint += (3 + sameCount - 5);
+ }
+ sameCount = 1;
+ }
+ //level 4 评价
+ if (current) {
+ darkCount++;
+ }
+ }
+ }
+ for (var col = 0; col < moduleCount; col++) {
+ var sameCount = 0;
+ var head = qrCode.modules[0][col];
+ for (var row = 0; row < moduleCount; row++) {
+ var current = qrCode.modules[row][col];
+ //level 3 评价
+ if (row < moduleCount - 6) {
+ if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
+ if (row < moduleCount - 10) {
+ if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
+ lostPoint += 40;
+ }
+ } else if (row > 3) {
+ if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
+ lostPoint += 40;
+ }
+ }
+ }
+ }
+ //level 1 评价
+ if (head ^ current) {
+ sameCount++;
+ } else {
+ head = current;
+ if (sameCount >= 5) {
+ lostPoint += (3 + sameCount - 5);
+ }
+ sameCount = 1;
+ }
+ }
+ }
+ // LEVEL4
+ var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
+ lostPoint += ratio * 10;
+ return lostPoint;
+ }
+
+ };
+ //---------------------------------------------------------------------
+ // QRMath使用的数学工具
+ //---------------------------------------------------------------------
+ var QRMath = {
+ /*
+ 将n转化为a^m
+ */
+ glog: function (n) {
+ if (n < 1) {
+ throw new Error("glog(" + n + ")");
+ }
+ return QRMath.LOG_TABLE[n];
+ },
+ /*
+ 将a^m转化为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 多项式
+ //---------------------------------------------------------------------
+ /**
+ * 多项式类
+ * @param {Array} num 系数
+ * @param {num} shift a^shift
+ */
+ 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;
+ },
+ /**
+ * 多项式乘法
+ * @param {QRPolynomial} e 被乘多项式
+ * @return {[type]} [description]
+ */
+ 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);
+ },
+ /**
+ * 多项式模运算
+ * @param {QRPolynomial} e 模多项式
+ * @return {}
+ */
+ mod: function (e) {
+ var tl = this.getLength(),
+ el = e.getLength();
+ if (tl - el < 0) {
+ return this;
+ }
+ var num = new Array(tl);
+ for (var i = 0; i < tl; i++) {
+ num[i] = this.get(i);
+ }
+ while (num.length >= el) {
+ var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
+
+ for (var i = 0; i < e.getLength(); i++) {
+ num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
+ }
+ while (num[0] == 0) {
+ num.shift();
+ }
+ }
+ return new QRPolynomial(num, 0);
+ }
+ };
+
+ //---------------------------------------------------------------------
+ // RS_BLOCK_TABLE
+ //---------------------------------------------------------------------
+ /*
+ 二维码各个版本信息[块数, 每块中的数据块数, 每块中的信息块数]
+ */
+ var 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]
+ ];
+
+ /**
+ * 根据数据获取对应版本
+ * @return {[type]} [description]
+ */
+ QRCodeAlg.prototype.getRightType = function () {
+ for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
+ var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
+ if (rsBlock == undefined) {
+ throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
+ }
+ var length = rsBlock.length / 3;
+ var totalDataCount = 0;
+ for (var i = 0; i < length; i++) {
+ var count = rsBlock[i * 3 + 0];
+ var dataCount = rsBlock[i * 3 + 2];
+ totalDataCount += dataCount * count;
+ }
+ var lengthBytes = typeNumber > 9 ? 2 : 1;
+ if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
+ this.typeNumber = typeNumber;
+ this.rsBlock = rsBlock;
+ this.totalDataCount = totalDataCount;
+ break;
+ }
+ }
+ };
+
+ //---------------------------------------------------------------------
+ // 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);
+ },
+ put: function (num, length) {
+ for (var i = 0; i < length; i++) {
+ this.putBit(((num >>> (length - i - 1)) & 1));
+ }
+ },
+ 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++;
+ }
+ };
+
+
+
+ // xzedit
+ let qrcodeAlgObjCache = [];
+ /**
+ * 二维码构造函数,主要用于绘制
+ * @param {参数列表} opt 传递参数
+ * @return {}
+ */
+ QRCode = function (opt) {
+ //设置默认参数
+ this.options = {
+ text: '',
+ size: 256,
+ correctLevel: 3,
+ background: '#ffffff',
+ foreground: '#000000',
+ pdground: '#000000',
+ image: '',
+ imageSize: 30,
+ canvasId: opt.canvasId,
+ context: opt.context,
+ usingComponents: opt.usingComponents,
+ showLoading: opt.showLoading,
+ loadingText: opt.loadingText,
+ };
+ if (typeof opt === 'string') { // 只编码ASCII字符串
+ opt = {
+ text: opt
+ };
+ }
+ if (opt) {
+ for (var i in opt) {
+ this.options[i] = opt[i];
+ }
+ }
+ //使用QRCodeAlg创建二维码结构
+ var qrCodeAlg = null;
+ for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
+ if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
+ qrCodeAlg = qrcodeAlgObjCache[i].obj;
+ break;
+ }
+ }
+ if (i == l) {
+ qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
+ qrcodeAlgObjCache.push({
+ text: this.options.text,
+ correctLevel: this.options.correctLevel,
+ obj: qrCodeAlg
+ });
+ }
+ /**
+ * 计算矩阵点的前景色
+ * @param {Obj} config
+ * @param {Number} config.row 点x坐标
+ * @param {Number} config.col 点y坐标
+ * @param {Number} config.count 矩阵大小
+ * @param {Number} config.options 组件的options
+ * @return {String}
+ */
+ let getForeGround = function (config) {
+ var options = config.options;
+ if (options.pdground && (
+ (config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
+ (config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
+ (config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
+ )) {
+ return options.pdground;
+ }
+ return options.foreground;
+ }
+ // 创建canvas
+ let createCanvas = function (options) {
+ if (options.showLoading) {
+ uni.showLoading({
+ title: options.loadingText,
+ mask: true
+ });
+ }
+ var ctx = uni.createCanvasContext(options.canvasId, options.context);
+ var count = qrCodeAlg.getModuleCount();
+ var ratioSize = options.size;
+ var ratioImgSize = options.imageSize;
+ //计算每个点的长宽
+ var tileW = (ratioSize / count).toPrecision(4);
+ var tileH = (ratioSize / count).toPrecision(4);
+ //绘制
+ for (var row = 0; row < count; row++) {
+ for (var col = 0; col < count; col++) {
+ var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
+ var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
+ var foreground = getForeGround({
+ row: row,
+ col: col,
+ count: count,
+ options: options
+ });
+ ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
+ ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
+ }
+ }
+ if (options.image) {
+ var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+ var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+ drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
+ ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
+ // 画圆角矩形
+ function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
+ ctxi.setLineWidth(lineWidth);
+ ctxi.setFillStyle(options.background);
+ ctxi.setStrokeStyle(options.background);
+ ctxi.beginPath(); // draw top and top right corner
+ ctxi.moveTo(x + r, y);
+ ctxi.arcTo(x + width, y, x + width, y + r, r); // draw right side and bottom right corner
+ ctxi.arcTo(x + width, y + height, x + width - r, y + height, r); // draw bottom and bottom left corner
+ ctxi.arcTo(x, y + height, x, y + height - r, r); // draw left and top left corner
+ ctxi.arcTo(x, y, x + r, y, r);
+ ctxi.closePath();
+ if (fill) {
+ ctxi.fill();
+ }
+ if (stroke) {
+ ctxi.stroke();
+ }
+ }
+ }
+ setTimeout(() => {
+ ctx.draw(true, () => {
+ // 保存到临时区域
+ setTimeout(() => {
+ uni.canvasToTempFilePath({
+ width: options.width,
+ height: options.height,
+ destWidth: options.width,
+ destHeight: options.height,
+ canvasId: options.canvasId,
+ quality: Number(1),
+ success: function (res) {
+ if (options.cbResult) {
+ options.cbResult(res.tempFilePath)
+ }
+ },
+ fail: function (res) {
+ if (options.cbResult) {
+ options.cbResult(res)
+ }
+ },
+ complete: function () {
+ if (options.showLoading){
+ uni.hideLoading();
+ }
+ },
+ }, options.context);
+ }, options.text.length + 100);
+ });
+ }, options.usingComponents ? 0 : 150);
+ }
+ createCanvas(this.options);
+ // 空判定
+ let empty = function (v) {
+ let tp = typeof v,
+ rt = false;
+ if (tp == "number" && String(v) == "") {
+ rt = true
+ } else if (tp == "undefined") {
+ rt = true
+ } else if (tp == "object") {
+ if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
+ } else if (tp == "string") {
+ if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
+ } else if (tp == "function") {
+ rt = false
+ }
+ return rt
+ }
+ };
+ QRCode.prototype.clear = function (fn) {
+ var ctx = uni.createCanvasContext(this.options.canvasId, this.options.context)
+ ctx.clearRect(0, 0, this.options.size, this.options.size)
+ ctx.draw(false, () => {
+ if (fn) {
+ fn()
+ }
+ })
+ };
+})()
+
+export default QRCode
\ No newline at end of file
diff --git a/src/components/tab/tab.vue b/src/components/tab/tab.vue
new file mode 100644
index 0000000..78f1965
--- /dev/null
+++ b/src/components/tab/tab.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
diff --git a/src/components/tabbar/tabbar.vue b/src/components/tabbar/tabbar.vue
new file mode 100644
index 0000000..4aded19
--- /dev/null
+++ b/src/components/tabbar/tabbar.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
diff --git a/src/components/tabs/tabs.vue b/src/components/tabs/tabs.vue
new file mode 100644
index 0000000..5a1fae5
--- /dev/null
+++ b/src/components/tabs/tabs.vue
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+
+ {{ item[name] || item['name'] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/uploader/index.vue b/src/components/uploader/index.vue
new file mode 100644
index 0000000..46e687a
--- /dev/null
+++ b/src/components/uploader/index.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/banner/banner.vue b/src/components/widgets/banner/banner.vue
new file mode 100644
index 0000000..e678153
--- /dev/null
+++ b/src/components/widgets/banner/banner.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/category/category.vue b/src/components/widgets/category/category.vue
new file mode 100644
index 0000000..76b49f4
--- /dev/null
+++ b/src/components/widgets/category/category.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/customer-service/customer-service.vue b/src/components/widgets/customer-service/customer-service.vue
new file mode 100644
index 0000000..8cb2fa4
--- /dev/null
+++ b/src/components/widgets/customer-service/customer-service.vue
@@ -0,0 +1,56 @@
+
+
+
+ {{ content.title }}
+ 服务时间:{{ content.time }}
+
+ 客服电话:{{ content.mobile }}
+
+
+ 拨打
+
+
+
+ 拨打
+
+
+
+
+ 保存二维码图片
+
+
+
+
+
+
+
diff --git a/src/components/widgets/my-service/components/customer-service.vue b/src/components/widgets/my-service/components/customer-service.vue
new file mode 100644
index 0000000..13d9828
--- /dev/null
+++ b/src/components/widgets/my-service/components/customer-service.vue
@@ -0,0 +1,131 @@
+
+
+
+
+ 请选择咨询方式
+
+ -
+
{{ item.name }}
+
+ {{ item.desc }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/my-service/my-service.vue b/src/components/widgets/my-service/my-service.vue
new file mode 100644
index 0000000..cc9192c
--- /dev/null
+++ b/src/components/widgets/my-service/my-service.vue
@@ -0,0 +1,92 @@
+
+
+
+
+ {{ content.title }}
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/my-subscribe/my-subscribe.vue b/src/components/widgets/my-subscribe/my-subscribe.vue
new file mode 100644
index 0000000..1cdac33
--- /dev/null
+++ b/src/components/widgets/my-subscribe/my-subscribe.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+ {{ content.title }}
+
+ 全部订单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/my-task/my-task.vue b/src/components/widgets/my-task/my-task.vue
new file mode 100644
index 0000000..f093f5c
--- /dev/null
+++ b/src/components/widgets/my-task/my-task.vue
@@ -0,0 +1,97 @@
+
+
+
+
+ {{ content.title }}
+
+ 查看
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/nav/nav.vue b/src/components/widgets/nav/nav.vue
new file mode 100644
index 0000000..da37c4c
--- /dev/null
+++ b/src/components/widgets/nav/nav.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/search/search.backup.vue b/src/components/widgets/search/search.backup.vue
new file mode 100644
index 0000000..5eaba91
--- /dev/null
+++ b/src/components/widgets/search/search.backup.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+ {{ cityInfo.name }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/search/search.vue b/src/components/widgets/search/search.vue
new file mode 100644
index 0000000..9a351e5
--- /dev/null
+++ b/src/components/widgets/search/search.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+ {{ cityInfo.name }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/user-banner/user-banner.vue b/src/components/widgets/user-banner/user-banner.vue
new file mode 100644
index 0000000..a2bf649
--- /dev/null
+++ b/src/components/widgets/user-banner/user-banner.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/widgets/user-info/user-info.vue b/src/components/widgets/user-info/user-info.vue
new file mode 100644
index 0000000..f376c59
--- /dev/null
+++ b/src/components/widgets/user-info/user-info.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+ {{ user.nickname }}
+
+ 账号名:{{ user.username }}
+
+
+
+
+
+ 未登录
+
+
+
+
+
+
+
+
+
diff --git a/src/config/app.ts b/src/config/app.ts
new file mode 100644
index 0000000..7d7fc23
--- /dev/null
+++ b/src/config/app.ts
@@ -0,0 +1,4 @@
+// terminal
+export const terminal = 1
+// 版本
+export const version = '1.0.0'
diff --git a/src/config/index.ts b/src/config/index.ts
new file mode 100644
index 0000000..311bbe9
--- /dev/null
+++ b/src/config/index.ts
@@ -0,0 +1,20 @@
+export const headerOptions = {
+ urlPrefix: 'api'
+}
+
+export const optionMap = {
+ couponStatus: [
+ {
+ name: '未使用',
+ status: 1
+ },
+ {
+ name: '已使用',
+ status: 2
+ },
+ {
+ name: '已过期',
+ status: 3
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/config/interface.ts b/src/config/interface.ts
new file mode 100644
index 0000000..17384d7
--- /dev/null
+++ b/src/config/interface.ts
@@ -0,0 +1,8 @@
+import { EnumMap } from "enumtor"
+
+export interface CouponTableProps {
+ initParams?: any //参数
+ requestApi?: (params: any) => Promise //请求api
+}
+
+export type Recordable = Record
\ No newline at end of file
diff --git a/src/config/symbol.ts b/src/config/symbol.ts
new file mode 100644
index 0000000..e032a4b
--- /dev/null
+++ b/src/config/symbol.ts
@@ -0,0 +1,6 @@
+import { InjectionKey, Ref } from "vue";
+
+interface CouponContext {
+ tabStatus: Ref
+}
+export const COUPON_INJECTION_KEY: InjectionKey = Symbol()
\ No newline at end of file
diff --git a/src/enums/agreementEnums.ts b/src/enums/agreementEnums.ts
new file mode 100644
index 0000000..7a717f4
--- /dev/null
+++ b/src/enums/agreementEnums.ts
@@ -0,0 +1,5 @@
+//菜单主题类型
+export enum AgreementEnum {
+ PRIVACY = 'privacy',
+ SERVICE = 'service'
+}
diff --git a/src/enums/appEnums.ts b/src/enums/appEnums.ts
new file mode 100644
index 0000000..b544125
--- /dev/null
+++ b/src/enums/appEnums.ts
@@ -0,0 +1,148 @@
+import { Recordable } from '@/config/interface'
+
+//菜单主题类型
+export enum ThemeEnum {
+ LIGHT = 'light',
+ DARK = 'dark'
+}
+
+// 客户端
+export enum ClientEnum {
+ MP_WEIXIN = 1, // 微信-小程序
+ OA_WEIXIN = 2, // 微信-公众号
+ H5 = 3, // H5
+ IOS = 5, //苹果
+ ANDROID = 6, //安卓
+ MP_DOUYIN = 7 //抖音
+}
+
+export enum SMSEnum {
+ LOGIN = 101,
+ BIND_MOBILE = 102,
+ CHANGE_MOBILE = 103,
+ FIND_PASSWORD = 104
+}
+
+export enum SearchTypeEnum {
+ HISTORY = 'history'
+}
+
+// 用户资料
+export enum FieldType {
+ NONE = '',
+ AVATAR = 'avatar',
+ USERNAME = 'username',
+ NICKNAME = 'nickname',
+ SEX = 'sex',
+ defalutNickname = '粤好生活会员'
+}
+
+// 支付页面
+export const PayEnum = {
+ '1': 'orderBuy', // 确认下单支付
+ '2': 'orderList', // 订单列表支付
+ '3': 'orderDetail' // 订单详情支付
+}
+
+// 支付结果
+export enum PayStatusEnum {
+ SUCCESS = 'success',
+ FAIL = 'fail',
+ PENDING = 'pending'
+}
+
+// 页面状态
+export enum PageStatusEnum {
+ LOADING = 'loading', // 加载中
+ NORMAL = 'normal', // 正常
+ ERROR = 'error', // 异常
+ EMPTY = 'empty' // 为空
+}
+
+// 支付来源类型
+export enum PayFromType {
+ ORDER = 'order',
+ USERRECHARGE = 'user_recharge'
+}
+
+// 支付方式类型
+export enum PayWayType {
+ WALLET = 1,
+ WECHAT = 2,
+ ALIPAY = 3
+}
+export enum WithDrawEnum {
+ PEDDING = 0,
+ SUCCESS = 1
+}
+export const withDrawMap: Recordable = {
+ [WithDrawEnum.PEDDING]: '申请中',
+ [WithDrawEnum.SUCCESS]: '提现成功'
+}
+
+export enum CouponEnum {
+ NO_GET = 0, //未领取
+ NO_APPLY = 1, //未使用
+ ALIPAY = 2, //已使用
+ OVERDUE = 3 //已过期
+}
+export enum UseGoodsTypeEnum {
+ ALL = 1, //通用券
+ CATEGORY = 2, //品类券
+ CATEGOYR_PART = 3 //商品券
+}
+export enum CouponStatusEnum {
+ AVALIABLE = 1,
+ UN_AVALIABLE = 2
+}
+export enum UseConditionEnum {
+ NO_CONDITION = 1, //无使用门槛
+ CONDITION = 2 //有使用门槛
+}
+export enum OrderStatusEnum {
+ NO_PAYMENT = 0, //未支付
+ PAYMENNT = 1 //已支付
+}
+export const CouponStatusMap: Recordable = {
+ [CouponEnum.ALIPAY]: '已使用',
+ [CouponEnum.OVERDUE]: '已过期'
+}
+
+export const NavigateMap: Recordable = {
+ [UseGoodsTypeEnum.ALL]: '/pages/index/index',
+ [UseGoodsTypeEnum.CATEGORY]: '/bundle/pages/category_goods_coupon/goods_category',
+ [UseGoodsTypeEnum.CATEGOYR_PART]: '/bundle/pages/category_goods_coupon/goods'
+}
+
+export const CouponCountMap: Recordable = {
+ availableCount: '可用优惠券',
+ notAvailableCount: '不可用优惠券'
+}
+export const useGoodsTypeMap: Recordable = {
+ [UseGoodsTypeEnum.ALL]: '所有',
+ [UseGoodsTypeEnum.CATEGORY]: '相应品类',
+ [UseGoodsTypeEnum.CATEGOYR_PART]: '相应商品'
+}
+export const conditions = [
+ { useGoodsType: UseGoodsTypeEnum.ALL, conditionType: UseConditionEnum.NO_CONDITION },
+ { useGoodsType: UseGoodsTypeEnum.ALL, conditionType: UseConditionEnum.CONDITION },
+ { useGoodsType: UseGoodsTypeEnum.CATEGORY, conditionType: UseConditionEnum.NO_CONDITION },
+ { useGoodsType: UseGoodsTypeEnum.CATEGORY, conditionType: UseConditionEnum.CONDITION },
+ { useGoodsType: UseGoodsTypeEnum.CATEGOYR_PART, conditionType: UseConditionEnum.NO_CONDITION },
+ { useGoodsType: UseGoodsTypeEnum.CATEGOYR_PART, conditionType: UseConditionEnum.CONDITION }
+]
+
+// 多少天即将过期时,在优惠券右上方显示“快失效”字样,默认3天
+export const showExpiringSoonDays = 3
+
+// 提现状态
+export enum WithdrawStatusEnum {
+ WITHDRAWING = 0,
+ SUCCESS = 1,
+ FAIL = 2
+}
+export const WithdrawStatusMap: Recordable = {
+ [WithdrawStatusEnum.WITHDRAWING]: '提现中',
+ [WithdrawStatusEnum.SUCCESS]: '提现成功',
+ [WithdrawStatusEnum.FAIL]: '提现失败'
+}
diff --git a/src/enums/cacheEnums.ts b/src/enums/cacheEnums.ts
new file mode 100644
index 0000000..59e1645
--- /dev/null
+++ b/src/enums/cacheEnums.ts
@@ -0,0 +1,13 @@
+// 本地缓冲key
+
+//token
+export const TOKEN_KEY = 'token'
+
+// 搜索历史记录
+export const HISTORY = 'history'
+
+export const BACK_URL = 'back_url'
+
+export const USER_INFO = 'user_info'
+
+export const DIST_ID = 'dist_id'
\ No newline at end of file
diff --git a/src/enums/requestEnums.ts b/src/enums/requestEnums.ts
new file mode 100644
index 0000000..67d30b2
--- /dev/null
+++ b/src/enums/requestEnums.ts
@@ -0,0 +1,28 @@
+export enum ContentTypeEnum {
+ // json
+ JSON = 'application/json;charset=UTF-8',
+ // form-data 上传资源(图片,视频)
+ FORM_DATA = 'multipart/form-data;charset=UTF-8'
+}
+
+export enum RequestMethodsEnum {
+ GET = 'GET',
+ POST = 'POST'
+}
+
+export enum RequestCodeEnum {
+ SUCCESS = 200, //成功
+ FAILED = 300, // 失败
+ PARAMS_VALID_ERROR = 310, //参数校验错误
+ PARAMS_TYPE_ERROR = 311, //参数类型错误
+ REQUEST_METHOD_ERROR = 312, //请求方法错误
+ ASSERT_ARGUMENT_ERROR = 313, //断言参数错误
+ ASSERT_MYBATIS_ERROR = 314, //断言mybatis错误
+ LOGIN_ACCOUNT_ERROR = 330, //登陆账号或密码错误
+ LOGIN_DISABLE_ERROR = 331, //登陆账号已被禁用
+ TOKEN_EMPTY = 332, // TOKEN参数为空
+ TOKEN_INVALID = 333, // TOKEN参数无效
+ NO_PERMISSTION = 403, //无相关权限
+ REQUEST_404_ERROR = 404, //请求接口不存在
+ SYSTEM_ERROR = 500 //系统错误
+}
diff --git a/src/hooks/payment.ts b/src/hooks/payment.ts
new file mode 100644
index 0000000..42b8834
--- /dev/null
+++ b/src/hooks/payment.ts
@@ -0,0 +1,115 @@
+import { apiPayPrepay, apiQueryOrder, apiH5PayPrepay } from '@/api/app'
+import { wxOaPay } from '@/hooks/wechat'
+import { wxpay, ttpay, alipay } from '@/utils/pay'
+import { getClient } from '@/utils/client'
+import { PayEnum } from '../enums/appEnums'
+import { ref } from 'vue'
+
+/**
+ * @description 支付函数钩子
+ * @param { typeValue } 支付的枚举
+ * @param { emit } 是否刷新页面
+ * @return { Function } 暴露钩子
+ */
+export function usePay(typeValue: any, emit: any = () => {}) {
+ // 支付枚举来源
+ const form = ref(PayEnum[typeValue])
+ // 订单ID
+ const order_id = ref(0)
+
+ /**
+ * @description 1. 初始化获取支付方式
+ * @param { params } 支付订单数据
+ */
+ const initPayWay = async (orderId, orderSn): Promise => {
+ try {
+ console.log('orderId:', orderId, orderSn)
+ order_id.value = orderId
+ handlePayPrepay(orderId)
+ } catch (err) {
+ console.log('获取支付方式', err)
+ uni.$u.toast('支付方式' + err)
+ }
+ }
+
+ /**
+ * @description 2. 预支付
+ * @param { params } 支付订单数据
+ */
+ const handlePayPrepay = async (orderId): Promise => {
+ const scene = getClient()
+ let payChannel = ''
+ switch (scene) {
+ case 1:
+ payChannel = 'mp_channel'
+ break
+ case 2:
+ payChannel = 'oa_channel'
+ break
+ case 3:
+ payChannel = 'h5_channel'
+ break
+ }
+ try {
+ if (payChannel === 'mp_channel' || payChannel === 'oa_channel') {
+ const res = await apiPayPrepay({
+ orderId,
+ payChannel
+ })
+ console.log('预支付', res)
+ // 支付
+ handlePay(res)
+ } else if (payChannel === 'h5_channel') {
+ const res = await apiH5PayPrepay({
+ orderId,
+ payChannel
+ })
+ console.log('h5预支付', res)
+ // 支付
+ handlePay(res)
+ }
+ } catch (err) {
+ console.log('获取预支付', err)
+ uni.$u.toast('预支付' + err)
+ }
+ }
+
+ /**
+ * @description 3. 吊起支付并处理支付结构
+ * @param { params } 支付订单数据
+ */
+ const handlePay = async (params): Promise => {
+ try {
+ // #ifndef H5
+ await wxpay(params)
+ // #endif
+
+ // #ifdef H5
+ console.log('支付前')
+ await wxOaPay(params)
+ console.log('支付返回')
+ // #endif
+
+ // 只在结算订单界面跳转
+ // 查询订单状态
+ await apiQueryOrder({ id: order_id.value })
+ if (form.value === 'orderBuy') uni.reLaunch({ url: `/pages/order/index` })
+ else emit('refresh') // 订单列表与详情的情况下刷新
+ } catch (err) {
+ if (form.value === 'orderBuy') {
+ uni.reLaunch({ url: `/pages/order/index` })
+ }
+ if (Number(mount) == 0) {
+ return uni.$u.toast('下单成功')
+ }
+ uni.$u.toast('支付取消')
+ console.log(err, '支付取消')
+ }
+ }
+
+ return {
+ initPayWay,
+ handlePayPrepay,
+ handlePay
+ }
+}
diff --git a/src/hooks/useCopy.ts b/src/hooks/useCopy.ts
new file mode 100644
index 0000000..b3571eb
--- /dev/null
+++ b/src/hooks/useCopy.ts
@@ -0,0 +1,10 @@
+export function useCopy() {
+ const copy = (text: string) => {
+ uni.setClipboardData({
+ data: String(text)
+ })
+ }
+ return {
+ copy
+ }
+}
diff --git a/src/hooks/useCoupon.ts b/src/hooks/useCoupon.ts
new file mode 100644
index 0000000..551c93f
--- /dev/null
+++ b/src/hooks/useCoupon.ts
@@ -0,0 +1,75 @@
+import { computed, reactive, ref, unref } from 'vue'
+
+export function useCoupon() {
+ const couponId = ref()
+ const setCouponId = (id: number) => {
+ couponId.value = id
+ }
+ return {
+ couponId,
+ setCouponId
+ }
+}
+
+export function useZPaging(payload: any, requestApi: (params: any) => Promise) {
+ const paging = ref()
+ const state = reactive({
+ totalParam: {}
+ })
+
+ /**获取列表数据 */
+ const queryList = async (page_no: number, page_size: number, config = {}) => {
+ if (typeof requestApi !== 'function') return
+ try {
+ uni.showLoading({
+ title: '加载中...'
+ })
+ const params = {
+ ...payload,
+ ...state.totalParam,
+ ...config,
+ pageNo: page_no,
+ pageSize: page_size
+ }
+ const res = await requestApi?.(params)
+ paging.value.complete(res?.lists || res || [])
+ } catch (e) {
+ paging?.value?.complete(false)
+ }
+ uni.hideLoading()
+ }
+ /**更新参数 */
+ const updateTotalParam = (params: any) => {
+ let nowParam: Record = {}
+ for (const key in params) {
+ nowParam[key] = params[key]
+ }
+ Object.assign(state.totalParam, nowParam)
+ }
+ /**刷新列表 */
+ const refresh = (params: any) => {
+ updateTotalParam(params)
+ paging.value.reload()
+ }
+
+ return {
+ paging,
+ queryList,
+ refresh
+ }
+}
+
+export function useTabs() {
+ const tabStatus = ref(1) //tab状态
+ const setTabIndex = computed(() => unref(tabStatus) - 1) //当前点击的tab索引
+
+ /**切换tab */
+ const handleChangeTab = (index: number) => {
+ tabStatus.value = index + 1
+ }
+ return {
+ tabStatus,
+ setTabIndex,
+ handleChangeTab
+ }
+}
diff --git a/src/hooks/useLockFn.ts b/src/hooks/useLockFn.ts
new file mode 100644
index 0000000..47909e9
--- /dev/null
+++ b/src/hooks/useLockFn.ts
@@ -0,0 +1,40 @@
+import { computed, ref } from 'vue'
+import { useAppStore } from '@/stores/app'
+
+export function useLockFn(fn: (...args: any[]) => Promise) {
+ const isLock = ref(false)
+ const lockFn = async (...args: any[]) => {
+ if (isLock.value) return
+ isLock.value = true
+ try {
+ const res = await fn(...args)
+ isLock.value = false
+ return res
+ } catch (e) {
+ isLock.value = false
+ throw e
+ }
+ }
+ return {
+ isLock,
+ lockFn
+ }
+}
+export function useToggle() {
+ const show = ref(false)
+ const handleToggle = () => {
+ show.value = !show.value
+ }
+ return {
+ show,
+ handleToggle
+ }
+}
+
+export function useTabs() {
+ const appStore = useAppStore()
+ const tabsColor = computed(() => appStore.tabsColor)
+ return {
+ tabsColor
+ }
+}
diff --git a/src/hooks/useTouch.ts b/src/hooks/useTouch.ts
new file mode 100644
index 0000000..acd5bca
--- /dev/null
+++ b/src/hooks/useTouch.ts
@@ -0,0 +1,72 @@
+import { reactive } from 'vue'
+
+/**
+ * @description 触碰屏幕钩子函数
+ * @return { Function } 暴露钩子
+ */
+export function useTouch() {
+ // 最小移动距离
+ const MIN_DISTANCE = 10
+
+ const touch = reactive({
+ direction: '',
+ deltaX: 0,
+ deltaY: 0,
+ offsetX: 0,
+ offsetY: 0
+ })
+
+ /**
+ * @description 计算距离
+ * @return { string } 空字符串
+ */
+ const getDirection = (x: number, y: number) => {
+ if (x > y && x > MIN_DISTANCE) {
+ return 'horizontal'
+ }
+ if (y > x && y > MIN_DISTANCE) {
+ return 'vertical'
+ }
+ return ''
+ }
+
+ /**
+ * @description 重置参数
+ */
+ const resetTouchStatus = () => {
+ touch.direction = ''
+ touch.deltaX = 0
+ touch.deltaY = 0
+ touch.offsetX = 0
+ touch.offsetY = 0
+ }
+
+ /**
+ * @description 触发
+ */
+ const touchStart = (event: any) => {
+ resetTouchStatus()
+ const events = event.touches[0]
+ touch.startX = events.clientX
+ touch.startY = events.clientY
+ }
+
+ /**
+ * @description 移动
+ */
+ const touchMove = (event: any) => {
+ const events = event.touches[0]
+ touch.deltaX = events.clientX - touch.startX
+ touch.deltaY = events.clientY - touch.startY
+ touch.offsetX = Math.abs(touch.deltaX)
+ touch.offsetY = Math.abs(touch.deltaY)
+ touch.direction = touch.direction || getDirection(touch.offsetX, touch.offsetY)
+ }
+
+ return {
+ touch,
+ resetTouchStatus,
+ touchStart,
+ touchMove
+ }
+}
diff --git a/src/hooks/wechat.ts b/src/hooks/wechat.ts
new file mode 100644
index 0000000..68cb6ae
--- /dev/null
+++ b/src/hooks/wechat.ts
@@ -0,0 +1,153 @@
+// #ifdef H5
+import weixin from 'weixin-js-sdk'
+import { useUserStore } from '@/stores/user'
+import { apiJsConfig, apiCodeUrlGet, apiOALogin } from '@/api/app'
+
+//判断是否为安卓环境
+function _isAndroid() {
+ const u = navigator.userAgent
+ return u.indexOf('Android') > -1 || u.indexOf('Adr') > -1
+}
+
+export function getSignLink() {
+ if (typeof window.signLink === 'undefined' || window.signLink === '') {
+ window.signLink = location.href.split('#')[0]
+ }
+ return _isAndroid() ? location.href.split('#')[0] : window.signLink
+}
+
+export function wxOaConfig() {
+ return new Promise((resolve, reject) => {
+ apiJsConfig('').then((res) => {
+ console.log('res:', res) //微信配置
+ weixin.config({
+ debug: false, // 开启调试模式
+ appId: res.appid, // 必填,公众号的唯一标识
+ timestamp: res.timestamp, // 必填,生成签名的时间戳
+ nonceStr: res.nonceStr, // 必填,生成签名的随机串
+ signature: res.signature, // 必填,签名
+ jsApiList: res.jsApiList, // 必填,需要使用的JS接口列表
+ success: () => {
+ resolve('success')
+ },
+ fail: (res: any) => {
+ reject('weixin config is fail')
+ }
+ })
+ })
+ })
+}
+
+//获取微信登录url
+export function getWxUrl() {
+ apiCodeUrlGet().then((res) => {
+ location.href = res.url
+ })
+}
+
+//微信授权
+export function authLogin(code) {
+ return new Promise((resolve, reject) => {
+ apiOALogin({
+ code
+ }).then((res) => {
+ const { userStore } = useUserStore()
+ userStore.setToken(res.token)
+ resolve(res)
+ })
+ })
+}
+
+export function wxOaReady() {
+ return new Promise((resolve, reject) => {
+ weixin.ready(() => {
+ resolve('success')
+ console.log('111')
+ })
+ })
+}
+
+export function wxOaShare(options: Record) {
+ wxOaReady().then(() => {
+ const { shareTitle, shareLink, shareImage, shareDesc } = options
+ weixin.updateTimelineShareData({
+ title: shareTitle, // 分享标题
+ link: shareLink, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
+ imgUrl: shareImage // 分享图标
+ })
+ // 发送给好友
+ weixin.updateAppMessageShareData({
+ title: shareTitle, // 分享标题
+ link: shareLink, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
+ imgUrl: shareImage, // 分享图标
+ desc: shareDesc
+ })
+ // 发送到tx微博
+ weixin.onMenuShareWeibo({
+ title: shareTitle, // 分享标题
+ link: shareLink, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
+ imgUrl: shareImage, // 分享图标
+ desc: shareDesc
+ })
+ })
+}
+
+export function wxOaPay(options: Record) {
+ console.log('options:', options)
+
+ return new Promise((reslove, reject) => {
+ wxOaReady().then(() => {
+ console.log('微信支付', options)
+ weixin.chooseWXPay({
+ appId: options.appId,
+ timestamp: options.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写
+ nonceStr: options.nonceStr, // 支付签名随机串,不长于 32 位
+ package: options.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
+ signType: options.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
+ paySign: options.paySign, // 支付签名
+ success: (res: any) => {
+ reslove(res)
+ },
+ cancel: (res: any) => {
+ reject(res)
+ },
+ fail: (res: any) => {
+ reject(res)
+ }
+ })
+ })
+ })
+}
+
+export function wxOaAddress() {
+ return new Promise((reslove, reject) => {
+ wxOaReady().then(() => {
+ weixin.openAddress({
+ success: (res: any) => {
+ reslove(res)
+ },
+ fail: (res: any) => {
+ reject(res)
+ }
+ })
+ })
+ })
+}
+
+export function getLocation() {
+ return new Promise((reslove, reject) => {
+ wxOaReady().then(() => {
+ weixin.getLocation({
+ type: 'gcj02',
+ success: (res: any) => {
+ reslove(res)
+ },
+ fail: (res: any) => {
+ reject(res)
+ }
+ })
+ })
+ })
+}
+
+// #endif
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..fcc51ca
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,17 @@
+import { createSSRApp, ref } from 'vue'
+import App from './App.vue'
+import plugins from './plugins'
+import { setupRouter } from './router'
+import './styles/index.scss'
+
+export function createApp() {
+ const app = createSSRApp(App)
+
+ Promise.resolve().then(() => {
+ setupRouter()
+ })
+ app.use(plugins)
+ return {
+ app
+ }
+}
diff --git a/src/manifest.json b/src/manifest.json
new file mode 100644
index 0000000..7daa5e6
--- /dev/null
+++ b/src/manifest.json
@@ -0,0 +1,106 @@
+{
+ "name" : "粤好生活",
+ "appid" : "__UNI__F081C07666",
+ "description" : "",
+ "versionName" : "1.0.0",
+ "versionCode" : "100",
+ "transformPx" : false,
+ /* 5+App特有相关 */
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueStyleCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ /* 模块配置 */
+ "modules" : {},
+ /* 应用发布信息 */
+ "distribute" : {
+ /* android打包配置 */
+ "android" : {
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ /* ios打包配置 */
+ "ios" : {},
+ /* SDK配置 */
+ "sdkConfigs" : {}
+ }
+ },
+ /* 快应用特有相关 */
+ "quickapp" : {},
+ /* 小程序特有相关 */
+ "mp-weixin" : {
+ "appid" : "wxf712ba4cbc2df1e9",
+ "setting" : {
+ "urlCheck" : true,
+ "es6" : false,
+ "postcss" : true,
+ "minified" : false
+ },
+ "usingComponents" : true,
+ "permission" : {
+ "scope.userLocation" : {
+ "desc" : "你的位置信息将用于小程序位置接口的效果展示"
+ }
+ },
+ "requiredPrivateInfos" : [ "getLocation", "chooseAddress", "chooseLocation" ],
+ "unipush" : {
+ "enable" : false
+ }
+ },
+ "mp-alipay" : {
+ "usingComponents" : true
+ },
+ "mp-baidu" : {
+ "usingComponents" : true
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true,
+ "appid" : "ttf331858c6c0d199a01",
+ "setting" : {
+ "es6" : false,
+ "postcss" : false
+ }
+ },
+ "uniStatistics" : {
+ "enable" : false
+ },
+ "vueVersion" : "3",
+ "h5" : {
+ "sdkConfigs" : {
+ "maps" : {
+ "qqmap" : {
+ "key" : "ATEBZ-LCOWQ-BAP5J-4W6WL-QKZXS-4SFSD"
+ }
+ }
+ },
+ "router" : {
+ "base" : "/mobile/",
+ "mode" : "history"
+ },
+ "title" : "上门预约",
+ "devServer" : {
+ "https" : false /* 调试因调用本地的后端服务,故先改为false */
+ }
+ }
+}
diff --git a/src/pages.json b/src/pages.json
new file mode 100644
index 0000000..c979c0c
--- /dev/null
+++ b/src/pages.json
@@ -0,0 +1,421 @@
+{
+ "pages": [
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationBarTitleText": "福源建筑生活",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/category/index",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "分类"
+ }
+ },
+ {
+ "path": "pages/order/index",
+ "style": {
+ "navigationBarTitleText": "我的订单"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/order_buy/index",
+ "style": {
+ "navigationBarTitleText": "提交订单"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/payment_result/payment_result",
+ "style": {
+ "navigationBarTitleText": "支付结果"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/order_detail/index",
+ "style": {
+ "navigationBarTitleText": "订单详情",
+ "navigationBarBackgroundColor": "#1869FF",
+ "navigationBarTextStyle": "white"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/user/user",
+ "style": {
+ "navigationBarTitleText": "个人中心",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/activate/index",
+ "style": {
+ "navigationBarTitleText": "活动专区"
+ }
+ },
+ {
+ "path": "pages/login/login",
+ "style": {
+ "navigationBarTitleText": "登录"
+ }
+ },
+ {
+ "path": "pages/register/register",
+ "style": {
+ "navigationBarTitleText": "注册"
+ }
+ },
+ {
+ "path": "pages/goods/index",
+ "style": {
+ "navigationBarTitleText": "商品详情"
+ }
+ },
+ {
+ "path": "pages/forget_pwd/forget_pwd",
+ "style": {
+ "navigationBarTitleText": "忘记密码"
+ }
+ },
+ {
+ "path": "pages/customer_service/customer_service",
+ "style": {
+ "navigationBarTitleText": "联系客服"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/user_set/user_set",
+ "style": {
+ "navigationBarTitleText": "个人设置"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/as_us/as_us",
+ "style": {
+ "navigationBarTitleText": "关于我们"
+ }
+ },
+ {
+ "path": "pages/agreement/agreement",
+ "style": {
+ "navigationBarTitleText": "协议"
+ }
+ },
+ {
+ "path": "pages/change_password/change_password",
+ "style": {
+ "navigationBarTitleText": "修改密码"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/user_data/user_data",
+ "style": {
+ "navigationBarTitleText": "个人资料"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/search/search",
+ "style": {
+ "navigationBarTitleText": "搜索"
+ }
+ },
+ {
+ "path": "pages/webview/webview"
+ },
+ {
+ "path": "pages/bind_mobile/bind_mobile",
+ "style": {
+ "navigationBarTitleText": "绑定手机号"
+ }
+ },
+ {
+ "path": "pages/empty/empty",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "uni_modules/vk-uview-ui/components/u-avatar-cropper/u-avatar-cropper",
+ "style": {
+ "navigationBarTitleText": "头像裁剪",
+ "navigationBarBackgroundColor": "#000000"
+ }
+ }
+ ],
+ "subPackages": [
+ {
+ "root": "bundle",
+ "pages": [
+ {
+ "path": "pages/search/index",
+ "style": {
+ "navigationBarTitleText": "搜索"
+ }
+ },
+ {
+ "path": "pages/user_address/index",
+ "style": {
+ "navigationBarTitleText": "地址管理"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/user_address_edit/index",
+ "style": {
+ "navigationBarTitleText": "地址详情"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/contact_service/index",
+ "style": {
+ "navigationBarTitleText": "联系客服"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/city/index",
+ "style": {
+ "navigationBarTitleText": "选择城市"
+ }
+ },
+ {
+ "path": "pages/master_worker_list/index",
+ "style": {
+ "navigationBarTitleText": "师傅"
+ }
+ },
+ {
+ "path": "pages/master_worker_detail/index",
+ "style": {
+ "navigationBarTitleText": "师傅主页"
+ }
+ },
+ {
+ "path": "pages/service_order/index",
+ "style": {
+ "navigationBarTitleText": "我的接单"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/service_order_detail/index",
+ "style": {
+ "navigationBarTitleText": "服务详情"
+ }
+ },
+ {
+ "path": "pages/category_goods_list/index",
+ "style": {
+ "navigationBarTitleText": "分类商品列表"
+ }
+ },
+ {
+ "path": "pages/collection_list/index",
+ "style": {
+ "navigationBarTitleText": "我的收藏"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/appoint_time/index",
+ "style": {
+ "navigationBarTitleText": "上门时间"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/evaluate_goods/index",
+ "style": {
+ "navigationBarTitleText": "全部评价"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/evaluate_list/index",
+ "style": {
+ "navigationBarTitleText": "我的评价"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/evaluate_submit/index",
+ "style": {
+ "navigationBarTitleText": "提交评价"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/withdraw_record/withdraw_record",
+ "style": {
+ "navigationBarTitleText": "提现记录"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/withdrawal_details/withdrawal_details",
+ "style": {
+ "navigationBarTitleText": "提现详情"
+ }
+ },
+ {
+ "path": "pages/user_wallet/user_wallet",
+ "style": {
+ "navigationBarTitleText": "我的钱包"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/user_recharge/user_recharge",
+ "style": {
+ "navigationBarTitleText": "充值"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/recharge_record/recharge_record",
+ "style": {
+ "navigationBarTitleText": "充值记录"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/account_detail/account_detail",
+ "style": {
+ "navigationBarTitleText": "余额明细"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/user_withdraw/user_withdraw",
+ "style": {
+ "navigationBarTitleText": "提现"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/my_coupon/my_coupon",
+ "style": {
+ "navigationBarTitleText": "我的优惠券"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/my_distributor/my_distributor",
+ "style": {
+ "navigationBarTitleText": "我的店铺"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/withdraw_money/index",
+ "style": {
+ "navigationBarTitleText": "提现",
+ "navigationBarBackgroundColor": "#2077FE",
+ "navigationBarTextStyle": "white"
+ }
+ },
+ {
+ "path": "pages/withdraw_distributor_record/index",
+ "style": {
+ "navigationBarTitleText": "提现记录",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/share_qrcode/index",
+ "style": {
+ "navigationBarTitleText": "分享二维码"
+ }
+ },
+ {
+ "path": "pages/distributor_order/index",
+ "style": {
+ "navigationBarTitleText": "店铺订单",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/distributor_binding_user/index",
+ "style": {
+ "navigationBarTitleText": "店铺客户",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/receive_coupon/receive_coupon",
+ "style": {
+ "navigationBarTitleText": "",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/dist_order/index",
+ "style": {
+ "navigationBarTitleText": "订单详情"
+ }
+ },
+ {
+ "path": "pages/service_explain/index",
+ "style": {
+ "navigationBarTitleText": "帮助中心"
+ }
+ },
+ {
+ "path": "pages/coupon/index",
+ "style": {
+ "navigationBarTitleText": "领券中心"
+ },
+ "auth": true
+ },
+ {
+ "path": "pages/category_goods_coupon/goods_category",
+ "style": {
+ "navigationBarTitleText": "可抵扣商品"
+ }
+ },
+ {
+ "path": "pages/category_goods_coupon/goods",
+ "style": {
+ "navigationBarTitleText": "可抵扣商品"
+ }
+ },
+ {
+ "path": "pages/coupon/coupon_detail",
+ "style": {
+ "navigationBarTitleText": "优惠券详情"
+ }
+ },
+ {
+ "path": "pages/coupon_order/coupon_order",
+ "style": {
+ "navigationBarTitleText": "选择优惠券"
+ }
+ }
+ ]
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "商城",
+ "navigationBarBackgroundColor": "#FFFFFF",
+ "backgroundColor": "#F8F8F8",
+ "h5": {
+ "navigationStyle": "custom"
+ }
+ },
+ "easycom": {
+ "custom": {
+ "^(?!z-paging-refresh|z-paging-load-more)z-paging(.*)": "z-paging/components/z-paging$1/z-paging$1.vue",
+ "^w-(.*)": "@/components/widgets/$1/$1.vue"
+ }
+ }
+}
diff --git a/src/pages/activate/comp/activate-list.vue b/src/pages/activate/comp/activate-list.vue
new file mode 100644
index 0000000..0b07291
--- /dev/null
+++ b/src/pages/activate/comp/activate-list.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+ {{ item1.name }}
+ {{ item1.remarks || ' ' }}
+
+
+
+
+
+
+
+
+ 活动价 ¥ {{ numFilter(item1.price) }}元
+
+ 立即抢购
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/activate/index.vue b/src/pages/activate/index.vue
new file mode 100644
index 0000000..45fab18
--- /dev/null
+++ b/src/pages/activate/index.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/agreement/agreement.vue b/src/pages/agreement/agreement.vue
new file mode 100644
index 0000000..13028f8
--- /dev/null
+++ b/src/pages/agreement/agreement.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/as_us/as_us.vue b/src/pages/as_us/as_us.vue
new file mode 100644
index 0000000..22ee329
--- /dev/null
+++ b/src/pages/as_us/as_us.vue
@@ -0,0 +1,22 @@
+
+
+
+ 当前版本{{ appStore.config.version }}
+
+
+
+
+
+
diff --git a/src/pages/bind_mobile/bind_mobile.vue b/src/pages/bind_mobile/bind_mobile.vue
new file mode 100644
index 0000000..07f0df9
--- /dev/null
+++ b/src/pages/bind_mobile/bind_mobile.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ codeTips }}
+
+
+
+
+ 确定
+
+
+
+
+
+
+
+
diff --git a/src/pages/category/components/cate-card.vue b/src/pages/category/components/cate-card.vue
new file mode 100644
index 0000000..924ac29
--- /dev/null
+++ b/src/pages/category/components/cate-card.vue
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item4.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/category/index.vue b/src/pages/category/index.vue
new file mode 100644
index 0000000..7dbef69
--- /dev/null
+++ b/src/pages/category/index.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/change_password/change_password.vue b/src/pages/change_password/change_password.vue
new file mode 100644
index 0000000..71092cc
--- /dev/null
+++ b/src/pages/change_password/change_password.vue
@@ -0,0 +1,85 @@
+
+
+
+
+ {{ type == 'set' ? '设置登录密码' : '修改登录密码' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/customer_service/customer_service.vue b/src/pages/customer_service/customer_service.vue
new file mode 100644
index 0000000..2daf7df
--- /dev/null
+++ b/src/pages/customer_service/customer_service.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/empty/empty.vue b/src/pages/empty/empty.vue
new file mode 100644
index 0000000..76bd748
--- /dev/null
+++ b/src/pages/empty/empty.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/pages/forget_pwd/forget_pwd.vue b/src/pages/forget_pwd/forget_pwd.vue
new file mode 100644
index 0000000..59b8c47
--- /dev/null
+++ b/src/pages/forget_pwd/forget_pwd.vue
@@ -0,0 +1,115 @@
+
+
+
+ 忘记登录密码
+
+
+
+
+
+
+
+
+
+ {{ codeTips }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/goods/components/card.vue b/src/pages/goods/components/card.vue
new file mode 100644
index 0000000..96f0ed1
--- /dev/null
+++ b/src/pages/goods/components/card.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/goods/components/goods-spec.vue b/src/pages/goods/components/goods-spec.vue
new file mode 100644
index 0000000..ca9345c
--- /dev/null
+++ b/src/pages/goods/components/goods-spec.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+ 请选择数量
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/goods/components/recommend-goods.vue b/src/pages/goods/components/recommend-goods.vue
new file mode 100644
index 0000000..86be2c9
--- /dev/null
+++ b/src/pages/goods/components/recommend-goods.vue
@@ -0,0 +1,134 @@
+
+
+
+ 商品推荐
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ ¥
+ {{ numFilter(item.price) }}
+
+
+ {{ item.orderNum }}
+ 人预约过
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/goods/components/sticky-spec.vue b/src/pages/goods/components/sticky-spec.vue
new file mode 100644
index 0000000..be86416
--- /dev/null
+++ b/src/pages/goods/components/sticky-spec.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+ 暂无服务详情
+
+
+
+
+
+
+ {{ `${index + 1})` }}
+
+ 距离上门服务时间
+ {{ rule.intervalTime }}
+ 分钟以内,取消服务需扣除
+ {{ rule.value }}
+ %的退单费;
+
+
+
+ 暂无服务须知
+
+
+
+
+
+
+
diff --git a/src/pages/goods/index.vue b/src/pages/goods/index.vue
new file mode 100644
index 0000000..101af3f
--- /dev/null
+++ b/src/pages/goods/index.vue
@@ -0,0 +1,595 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ goodsData.collect ? '取消收藏' : '收藏' }}
+
+
+
+
+
+
+ {{ goodsData.orderNum }}人预约过
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 暂无商品详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/comp/activate-indoor.vue b/src/pages/index/comp/activate-indoor.vue
new file mode 100644
index 0000000..32da4e3
--- /dev/null
+++ b/src/pages/index/comp/activate-indoor.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/comp/card.vue b/src/pages/index/comp/card.vue
new file mode 100644
index 0000000..2740ec0
--- /dev/null
+++ b/src/pages/index/comp/card.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/comp/category-card.vue b/src/pages/index/comp/category-card.vue
new file mode 100644
index 0000000..f369bf2
--- /dev/null
+++ b/src/pages/index/comp/category-card.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/comp/category-datalist.vue b/src/pages/index/comp/category-datalist.vue
new file mode 100644
index 0000000..95fb361
--- /dev/null
+++ b/src/pages/index/comp/category-datalist.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item1.name }}
+
+
+ {{ item1.remarks }}
+
+
+
+
+
+ ¥
+
+ {{ numFilter(item1.price)[0] }}
+
+ .{{ numFilter(item1.price)[1] }}
+ {{ item1.unit }}
+
+
+ {{ item1.orderNum }}
+ 人预约过
+
+
+
+ 立即抢购
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/comp/category.vue b/src/pages/index/comp/category.vue
new file mode 100644
index 0000000..956310c
--- /dev/null
+++ b/src/pages/index/comp/category.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+ 更多
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/comp/hot-list.vue b/src/pages/index/comp/hot-list.vue
new file mode 100644
index 0000000..0445917
--- /dev/null
+++ b/src/pages/index/comp/hot-list.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item1.name }}
+ {{ item1.remarks || ' ' }}
+
+
+ {{ item1.orderNum }} 人预约过
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/comp/master-list.vue b/src/pages/index/comp/master-list.vue
new file mode 100644
index 0000000..316d2e0
--- /dev/null
+++ b/src/pages/index/comp/master-list.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+ 更多
+
+
+
+
+
+
+
+
+
+
+ {{ item3.name }}
+ 服务项目:{{ item3.service }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/comp/new-goods.vue b/src/pages/index/comp/new-goods.vue
new file mode 100644
index 0000000..4f24cc0
--- /dev/null
+++ b/src/pages/index/comp/new-goods.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+ {{ item1.name }}
+
+
+
+ ¥
+ {{ numFilter(item1.price) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/comp/sticky-category.vue b/src/pages/index/comp/sticky-category.vue
new file mode 100644
index 0000000..cfc29b4
--- /dev/null
+++ b/src/pages/index/comp/sticky-category.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item1.name }}
+
+
+
+
+ ¥
+ {{ numFilter(item1.price) }}
+
+
+ {{ item1.orderNum }}
+ 人预约过
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue
new file mode 100644
index 0000000..043489f
--- /dev/null
+++ b/src/pages/index/index.vue
@@ -0,0 +1,480 @@
+
+
+
+
+
+
+ {{ titleImageObj[0]?.content?.title ?? '福源建筑生活' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/login/login.vue b/src/pages/login/login.vue
new file mode 100644
index 0000000..a911b15
--- /dev/null
+++ b/src/pages/login/login.vue
@@ -0,0 +1,560 @@
+
+
+
+
+
+ {{ appStore.config.website.name }}
+
+
+
+
+
+
+
+
+
+
+ 手机号快捷登录
+
+
+ 手机号快捷登录
+
+
+
+
+
+
+
+
+
+
+
+
+ 抖音登录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ codeTips }}
+
+
+
+
+
+
+
+ 登 录
+
+
+
+
+
+
+ 抖音登录
+
+
+
+
+ 快捷登录
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 同意
+
+
+ 《服务协议》
+
+
+
+ 和
+
+
+ 《隐私协议》
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/order/components/order-card.vue b/src/pages/order/components/order-card.vue
new file mode 100644
index 0000000..df82386
--- /dev/null
+++ b/src/pages/order/components/order-card.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+ {{ orderInfo.orderGoodsDetailVo.goodsName }}
+
+
+ 预约时间: {{ orderInfo.appointTime }} {{ orderInfo.weekDay }}
+
+
+ 待付金额:
+
+ ¥{{ orderInfo.orderAmount }}
+
+
+
+ 实付金额:
+
+ ¥{{ orderInfo.orderAmount }}
+
+
+
+ 实付金额:
+
+ ¥{{ orderInfo.orderAmount }}
+
+
+
+ 实付金额:
+
+ ¥{{ orderInfo.orderAmount }}
+
+
+
+ 应付金额:
+
+ ¥{{ orderInfo.orderAmount }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/order/components/order-list.vue b/src/pages/order/components/order-list.vue
new file mode 100644
index 0000000..1924cb8
--- /dev/null
+++ b/src/pages/order/components/order-list.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/order/index.vue b/src/pages/order/index.vue
new file mode 100644
index 0000000..8e2c8db
--- /dev/null
+++ b/src/pages/order/index.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/order_buy/index.vue b/src/pages/order_buy/index.vue
new file mode 100644
index 0000000..31b28ca
--- /dev/null
+++ b/src/pages/order_buy/index.vue
@@ -0,0 +1,489 @@
+
+
+
+
+
+
+
+
+
+ {{ addressSelect.contact }}
+ {{ addressSelect.mobile }}
+
+
+
+
+
+ 上门时间
+
+
+ {{ appoint }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ orderData.goodsName }}
+ x{{ goodsForm.goods_num }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+
+ 服务金额
+ {{ `¥${orderData.totalPrice}` }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/order_detail/index.vue b/src/pages/order_detail/index.vue
new file mode 100644
index 0000000..0936749
--- /dev/null
+++ b/src/pages/order_detail/index.vue
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+
+ {{ getStatueName(orderData) }}
+
+
+
+
+
+
+
+ {{ orderData.contact }}
+ {{ orderData.mobile }}
+
+
+
+
+ 上门时间
+
+ {{ orderData.appointTime }} {{ orderData.weekDay }}
+ {{ orderData.appointTimeStartStr }}-{{ orderData.appointTimeEndStr }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ orderData.orderGoods?.goodsName }}
+
+ x{{ orderData.orderGoods?.goodsNum }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 服务金额
+ ¥{{ orderData.totalAmount }}
+
+
+ 待付金额
+ ¥{{ orderData.orderAmount }}
+
+
+ 抵扣金额
+ ¥{{ orderData.deductionMoney }}
+
+
+ 实付金额
+ ¥{{ orderData.orderAmount }}
+
+
+ 实付金额
+ ¥{{ orderData.orderAmount }}
+
+
+ 实付金额
+ ¥{{ orderData.orderAmount }}
+
+
+ 应付金额
+ ¥{{ orderData.orderAmount }}
+
+
+
+
+
+ 备注
+ {{ orderData.userRemark }}
+
+
+
+
+
+ 订单编号
+ {{ orderData.sn }}
+
+
+ 支付方式
+ {{ orderData.payWayName }}
+
+
+ 下单时间
+ {{ orderData.createTime }}
+
+
+ 完成时间
+ {{ orderData.finishTime }}
+
+
+ 关闭时间
+ {{ orderData.finishTime }}
+
+
+
+
+ 扣款金额
+ ¥ {{ orderData.orderRefundDetailVo?.deductionRatioMoney }}
+
+
+ 退款金额
+
+ ¥ {{ orderData.orderRefundDetailVo?.refundAmount ?? 0 }}
+
+
+
+ 退款原因
+
+ {{ orderData.orderRefundDetailVo?.refundReason }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/payment_result/payment_result.vue b/src/pages/payment_result/payment_result.vue
new file mode 100644
index 0000000..7382c8f
--- /dev/null
+++ b/src/pages/payment_result/payment_result.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+ {{ resultStatus[payResult.success].text }}
+
+
+
+
+
+ 订单编号
+ {{ payResult.message.sn }}
+
+
+ 付款时间
+ {{ payResult.message.pay_time || '-' }}
+
+
+ 支付方式
+ {{ payResult.message.pay_way || '-' }}
+
+
+ 支付金额
+ {{ payResult.message.money }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/register/register.vue b/src/pages/register/register.vue
new file mode 100644
index 0000000..ca12ffc
--- /dev/null
+++ b/src/pages/register/register.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 已阅读并同意
+
+
+ 《服务协议》
+
+
+
+ 和
+
+
+ 《隐私协议》
+
+
+
+
+
+
+ 注册
+
+
+
+
+
+
+
+
diff --git a/src/pages/search/component/suggest.vue b/src/pages/search/component/suggest.vue
new file mode 100644
index 0000000..341f70c
--- /dev/null
+++ b/src/pages/search/component/suggest.vue
@@ -0,0 +1,77 @@
+
+
+
+
+ 热门搜索
+
+
+
+
+ {{ hotItem }}
+
+
+
+
+
+
+
+
+
+
+ 历史搜索
+ emit('clear')">清空
+
+
+
+
+ {{
+ hisItem
+ }}
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/search/search.vue b/src/pages/search/search.vue
new file mode 100644
index 0000000..b50878d
--- /dev/null
+++ b/src/pages/search/search.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/user/user.vue b/src/pages/user/user.vue
new file mode 100644
index 0000000..24ea2c0
--- /dev/null
+++ b/src/pages/user/user.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/user_data/user_data.vue b/src/pages/user_data/user_data.vue
new file mode 100644
index 0000000..7e0d935
--- /dev/null
+++ b/src/pages/user_data/user_data.vue
@@ -0,0 +1,394 @@
+
+
+
+
+
+
+
+
+ 账号
+ {{ userInfo?.username }}
+
+
+
+
+
+ 昵称
+ {{ userInfo?.nickname }}
+
+
+
+
+
+ 性别
+ {{ userInfo?.sex }}
+
+
+
+
+
+ 手机号
+
+ {{ userInfo?.mobile == '' ? '未绑定手机号' : userInfo?.mobile }}
+
+
+
+
+ {{ userInfo?.mobile == '' ? '绑定手机号' : '更换手机号' }}
+
+
+
+
+ {{ userInfo?.mobile == '' ? '绑定手机号' : '更换手机号' }}
+
+
+
+
+
+
+ 注册时间
+ {{ userInfo?.createTime }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改账号
+
+
+
+
+
+ 确定
+
+
+
+
+
+
+
+
+
+
+
+ 修改手机号码
+
+
+
+
+
+
+
+ {{ codeTips }}
+
+
+
+ 确定
+
+
+
+
+
+
+
+
diff --git a/src/pages/user_set/user_set.vue b/src/pages/user_set/user_set.vue
new file mode 100644
index 0000000..a9beb1e
--- /dev/null
+++ b/src/pages/user_set/user_set.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+ {{ userInfo.nickname }}
+ 账号:{{ userInfo.username }}
+
+
+
+
+
+
+
+
+ 绑定微信
+
+
+ {{ userInfo.isBindMnp ? '已绑定' : '未绑定' }}
+
+
+
+
+
+
+
+ 隐私协议
+
+
+
+
+
+ 服务协议
+
+
+
+
+
+ 关于我们
+
+
+ {{ appStore.config.version }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/webview/webview.vue b/src/pages/webview/webview.vue
new file mode 100644
index 0000000..e52cc43
--- /dev/null
+++ b/src/pages/webview/webview.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/src/plugins/index.ts b/src/plugins/index.ts
new file mode 100644
index 0000000..62bb0ac
--- /dev/null
+++ b/src/plugins/index.ts
@@ -0,0 +1,12 @@
+import { isFunction } from '@vue/shared'
+import { App } from 'vue'
+const modules = import.meta.globEager('./modules/**/*.ts')
+
+export default {
+ install: (app: App) => {
+ for (const module of Object.values(modules)) {
+ const fun = module.default
+ isFunction(fun) && fun(app)
+ }
+ }
+}
diff --git a/src/plugins/modules/pinia.ts b/src/plugins/modules/pinia.ts
new file mode 100644
index 0000000..c5b769f
--- /dev/null
+++ b/src/plugins/modules/pinia.ts
@@ -0,0 +1,6 @@
+import { App } from 'vue'
+import { createPinia } from 'pinia'
+const pinia = createPinia()
+export default (app: App) => {
+ app.use(pinia)
+}
diff --git a/src/plugins/modules/uview.ts b/src/plugins/modules/uview.ts
new file mode 100644
index 0000000..52abc1e
--- /dev/null
+++ b/src/plugins/modules/uview.ts
@@ -0,0 +1,7 @@
+import { App } from 'vue'
+import uView from '@/uni_modules/vk-uview-ui'
+
+export default (app: App) => {
+ // 使用 uView UI
+ app.use(uView)
+}
diff --git a/src/plugins/modules/vconsole.ts b/src/plugins/modules/vconsole.ts
new file mode 100644
index 0000000..74cd89f
--- /dev/null
+++ b/src/plugins/modules/vconsole.ts
@@ -0,0 +1,14 @@
+// #ifdef H5
+// 提交前需要注释 本地调试使用
+// import Vconsole from 'vconsole'
+// import { isDevMode } from '@/utils/env'
+// #endif
+
+export default () => {
+ // #ifdef H5
+ // if (isDevMode()) {
+ // const vConsole = new Vconsole()
+ // return vConsole
+ // }
+ // #endif
+}
diff --git a/src/router/index.ts b/src/router/index.ts
new file mode 100644
index 0000000..56e42b1
--- /dev/null
+++ b/src/router/index.ts
@@ -0,0 +1,68 @@
+/*
+ * @Author: micky 1254597151@qq.com
+ * @Date: 2023-08-14 15:38:40
+ * @LastEditors: micky 1254597151@qq.com
+ * @LastEditTime: 2023-09-07 16:01:06
+ * @FilePath: \housekeeping-uniapp\src\router\index.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { BACK_URL } from '@/enums/cacheEnums'
+import { useUserStore } from '@/stores/user'
+import { getToken } from '@/utils/auth'
+import cache from '@/utils/cache'
+import { routes } from './routes'
+import { isWeixinClient } from '@/utils/client'
+import { wxOaConfig } from '@/hooks/wechat'
+
+const whiteList = ['register', 'login', 'forget_pwd']
+const list = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab']
+list.forEach(item => {
+ uni.addInterceptor(item, {
+ invoke(e) {
+ // 获取要跳转的页面路径(url去掉"?"和"?"后的参数)
+ const url = e.url?.split('?')[0]
+ const currentRoute = routes.find(item => {
+ return url === item.path
+ })
+ // 需要登录并且没有token
+ if (currentRoute?.auth && !getToken()) {
+ if (currentRoute.path === '/pages/order/index') {
+ cache.set(BACK_URL, currentRoute.path)
+ }
+ uni.navigateTo({
+ url: '/pages/login/login'
+ })
+ return false
+ }
+ // #ifdef H5
+ // 添加定时器防止拿到的域名是上一个域名
+ setTimeout(async () => {
+ if (isWeixinClient()) {
+ // jssdk配置
+ await wxOaConfig()
+ }
+ })
+ // #endif
+ return e
+ },
+ fail(err) {
+ // 失败回调拦截
+ console.log(err)
+ }
+ })
+})
+
+export function setupRouter() {
+ // #ifdef H5
+ const app = getApp()
+ app.$router.afterEach((to: any, from: any) => {
+ const index = whiteList.findIndex(item => from.path.includes(item) || from.path === '/')
+ const userStore = useUserStore()
+ if (index == -1 && !userStore.isLogin) {
+ //保存登录前的路径
+ cache.set(BACK_URL, from.fullPath)
+ }
+ })
+
+ // #endif
+}
diff --git a/src/router/routes.ts b/src/router/routes.ts
new file mode 100644
index 0000000..fa33c22
--- /dev/null
+++ b/src/router/routes.ts
@@ -0,0 +1,47 @@
+import PagesJSON from '../pages.json'
+const CONFIG = {
+ includes: ['path', 'aliasPath', 'name', 'auth']
+}
+
+function getPagesRoutes(pages: any[], rootPath = null) {
+ const routes: any[] = []
+ for (let i = 0; i < pages.length; i++) {
+ const item = pages[i]
+ const route: any = {}
+ for (let j = 0; j < CONFIG.includes.length; j++) {
+ const key = CONFIG.includes[j]
+ let value = item[key]
+ if (key === 'path') {
+ value = rootPath ? `/${rootPath}/${value}` : `/${value}`
+ }
+ if (key === 'aliasPath' && i == 0 && rootPath == null) {
+ route[key] = route[key] || '/'
+ } else if (value !== undefined) {
+ route[key] = value
+ }
+ }
+ routes.push(route)
+ }
+ return routes
+}
+
+function getSubPackagesRoutes(pagesJson: any) {
+ const { subPackages } = pagesJson
+ let routes: any[] = []
+ if (subPackages == null || subPackages.length == 0) {
+ return []
+ }
+ for (let i = 0; i < subPackages.length; i++) {
+ const subPages = subPackages[i].pages
+ const root = subPackages[i].root
+ const subRoutes = getPagesRoutes(subPages, root)
+ routes = routes.concat(subRoutes)
+ }
+ return routes
+}
+
+export function generateRoutes() {
+ return getPagesRoutes(PagesJSON.pages).concat(getSubPackagesRoutes(PagesJSON))
+}
+
+export const routes = generateRoutes()
diff --git a/src/static/images/download.png b/src/static/images/download.png
new file mode 100644
index 0000000000000000000000000000000000000000..82e03c723968a54acd164fbcd5eee4d948bddc55
GIT binary patch
literal 3816
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
PE5>=d2kn;Q0p`B}AToJA
literal 0
HcmV?d00001
diff --git a/src/static/images/empty/address.png b/src/static/images/empty/address.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b60c4ae1da0da4bbe698c275cd50fd4ebb56c60
GIT binary patch
literal 12541
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
U!%0}C;y)Q>#Sd?)8Z>_Fc&))Ua
zR(IFxwYob}Sy2iVi3kY-0s>V=T0#{90t)zFM}Yp+M7CI6KtMo_Da)%%eu`H&ch}eV
z7gslzSGPC+;fM3f>#Mu_%j=tq&wlft{u7*@U)|q7T;JSXT-{#ZK3v`0o?l$u-QC^X
z+@76ZU0vONw)=-q!u_Xsa(;1fd2@boeR6hjc7Azzb$@`9KEc`5_3_F1
z+11tQ+12Ic&E@4M`SR%W;^_4J?CkR5`ugPb;`HodV{_}|{PL6eIeU3^eROSWTE4lxYi;XpZSUFM+1uRO+1uOy6qi@l
z*4H;b!QK7C?%qDQz30>FC*hO!i9e6^&CR>}$4_gY&Q?~}J~hkBD=pye|DF9@wYs``
zcyzL|y84O#cj2e^Pa~h%eeype-#a)yI665wIbB*>`qUpCpX}{@2C%)oy}Pr!cX)KP
z^qJSe!P(jQ&F$@HaX(A(S?y2zgF~ZpbAKnNX68lI8b42Gu$!u)8ia(1jwTC_J%@~`
zpsIBk0=*%cyfYqFtRg8PwNHtMe{L|vm+C}Dwo^
znz^^6skf)6tEG#}{X3ld^ZmD*XUF3WX|ny>J$j9YwHLv)DUP$c^zXgK$ICu<3b92k
z_0MB5!`(r^<=K*8bNlo*bN46+2+nO82~l;gm9w6p&(I(ObKlGG%b@;)|7WwFD@c9aV%oV2MdL!ads(ISl})w;YL;x2QOIhG|b)dVF`e%*{^c
zR^UszrFL6f-xhH_80Vk3jgZ37S*@5Xs+WrM)5-ek{W|!2NYK|erwyoGDodlk_H{+j
zdGF$$*byw)hp!~H-G*pZy!(t2i~Um;X7<#hx=}f_;lB9w=$63@8%d7ea>R>l$`Yp+
zO>~$@y7D&M)1CAj