diff --git a/.gitignore b/.gitignore
index 07fb17e..723898b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
/unpackage
/.hbuilderx
/.idea
+/node_modules/
diff --git a/common/js/uni-copy.js b/common/js/uni-copy.js
new file mode 100644
index 0000000..6ceb604
--- /dev/null
+++ b/common/js/uni-copy.js
@@ -0,0 +1,42 @@
+export default function uniCopy({content,success,error}) {
+ if(!content) return error('复制的内容不能为空 !')
+ content = typeof content === 'string' ? content : content.toString() // 复制内容,必须字符串,数字需要转换为字符串
+ /**
+ * 小程序端 和 app端的复制逻辑
+ */
+ //#ifndef H5
+ uni.setClipboardData({
+ data: content,
+ success: function() {
+ success("复制成功~")
+ console.log('success');
+ },
+ fail:function(){
+ success("复制失败~")
+ }
+ });
+ //#endif
+
+ /**
+ * H5端的复制逻辑
+ */
+ // #ifdef H5
+ if (!document.queryCommandSupported('copy')) { //为了兼容有些浏览器 queryCommandSupported 的判断
+ // 不支持
+ error('浏览器不支持')
+ }
+ let textarea = document.createElement("textarea")
+ textarea.value = content
+ textarea.readOnly = "readOnly"
+ document.body.appendChild(textarea)
+ textarea.select() // 选择对象
+ textarea.setSelectionRange(0, content.length) //核心
+ let result = document.execCommand("copy") // 执行浏览器复制命令
+ if(result){
+ success("复制成功~")
+ }else{
+ error("复制失败,请检查h5中调用该方法的方式,是不是用户点击的方式调用的,如果不是请改为用户点击的方式触发该方法,因为h5中安全性,不能js直接调用!")
+ }
+ textarea.remove()
+ // #endif
+}
diff --git a/common/js/uqrcode.js b/common/js/uqrcode.js
new file mode 100644
index 0000000..521c7a4
--- /dev/null
+++ b/common/js/uqrcode.js
@@ -0,0 +1,1439 @@
+// uqrcode.js
+//---------------------------------------------------------------------
+// github https://github.com/Sansnn/uQRCode
+//---------------------------------------------------------------------
+
+let uQRCode = {};
+
+(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 = {
+
+ errorCorrectLevel: QRErrorCorrectLevel,
+
+ defaults: {
+ size: 354,
+ margin: 0,
+ backgroundColor: '#ffffff',
+ foregroundColor: '#000000',
+ fileType: 'png', // 'jpg', 'png'
+ errorCorrectLevel: QRErrorCorrectLevel.H,
+ typeNumber: -1
+ },
+
+ make: function(options) {
+ return new Promise((reslove, reject) => {
+ 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,
+ errorCorrectLevel: this.defaults.errorCorrectLevel,
+ 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.errorCorrectLevel);
+ 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) {
+ let resData; // 将统一为base64格式
+ let tempFilePath = res.tempFilePath; // H5为base64,其他为相对路径
+
+ // #ifdef H5
+ resData = tempFilePath;
+ options.success && options.success(resData);
+ reslove(resData);
+ // #endif
+
+ // #ifdef APP-PLUS
+ const path = plus.io.convertLocalFileSystemURL(tempFilePath) // 绝对路径
+ let fileReader = new plus.io.FileReader();
+ fileReader.readAsDataURL(path);
+ fileReader.onloadend = res => {
+ resData = res.target.result;
+ options.success && options.success(resData);
+ reslove(resData);
+ };
+ // #endif
+
+ // #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO
+ uni.getFileSystemManager().readFile({
+ filePath: tempFilePath,
+ encoding: 'base64',
+ success: res => {
+ resData = 'data:image/png;base64,' + res.data;
+ options.success && options.success(resData);
+ reslove(resData);
+ }
+ })
+ // #endif
+
+ // #ifndef H5 || APP-PLUS || MP-WEIXIN || MP-QQ || MP-TOUTIAO
+ if (plus) {
+ const path = plus.io.convertLocalFileSystemURL(tempFilePath) // 绝对路径
+ let fileReader = new plus.io.FileReader();
+ fileReader.readAsDataURL(path);
+ fileReader.onloadend = res => {
+ resData = res.target.result;
+ options.success && options.success(resData);
+ reslove(resData);
+ };
+ } else {
+ uni.request({
+ url: tempFilePath,
+ method: 'GET',
+ responseType: 'arraybuffer',
+ success: res => {
+ resData = `data:image/png;base64,${uni.arrayBufferToBase64(res.data)}`; // 把arraybuffer转成base64
+ options.success && options.success(resData);
+ reslove(resData);
+ }
+ })
+ }
+ // #endif
+ },
+ fail: function(error) {
+ options.fail && options.fail(error);
+ reject(error);
+ },
+ complete: function(res) {
+ options.complete && options.complete(res);
+ }
+ }, options.componentInstance);
+ }, options.text.length + 100);
+ })());
+ }, 150);
+ }
+
+ createCanvas();
+ });
+ }
+ }
+
+})()
+
+export default uQRCode
\ No newline at end of file
diff --git a/components/bind-mobile/bind-mobile.vue b/components/bind-mobile/bind-mobile.vue
new file mode 100644
index 0000000..c09bb1d
--- /dev/null
+++ b/components/bind-mobile/bind-mobile.vue
@@ -0,0 +1,413 @@
+
+
+
+
+
+
+ 检测到您还未绑定手机请立即绑定您的手机号
+
+ 手机号码
+
+
+ 验证码
+
+
+
+
+
+ 动态码
+
+
+ {{ dynacodeData.codeText }}
+
+
+
+
+
+
+
+ 为了方便您接收订单等信息,需要绑定您的手机号码
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/farm-goods-detail-view/detail.js b/components/farm-goods-detail-view/detail.js
new file mode 100644
index 0000000..5049870
--- /dev/null
+++ b/components/farm-goods-detail-view/detail.js
@@ -0,0 +1,451 @@
+// 商品详情业务
+import {
+ Weixin
+} from '@/common/js/wx-jssdk.js';
+export default {
+ data() {
+ return {
+ skuId: 0,
+ goodsId:0,
+ isIphoneX: false, //判断手机是否是iphoneX以上
+ whetherCollection: 0,
+
+ //是否开启预览,0:不开启,1:开启
+ preview: 0,
+ token: "",
+ videoContext: '',
+
+ // 媒体,图片,视频
+
+ // 解决每个商品SKU图片数量不同时,无法切换到第一个,导致轮播图显示不出来
+ swiperInterval: 1,
+ swiperAutoplay: false,
+ swiperCurrent: 1,
+ switchMedia: 'img',
+
+ //评价
+ goodsEvaluate: [{
+ member_headimg: '',
+ member_name: '',
+ content: '',
+ images: [],
+ create_time: 0,
+ sku_name: ''
+ }],
+ evaluateConfig: {
+ evaluate_audit: 1,
+ evaluate_show: 0,
+ evaluate_status: 1
+ },
+
+ // 是否可分享到好物圈
+ goodsCircle: false,
+ memberId: 0,
+ service: null,
+ shareUrl: '', // 分享链接
+ source_member: 0, //分享人的id
+ isCommunity: false, //社群弹窗
+
+ poster: "-1", //海报
+ posterMsg: "", //海报错误信息
+ posterHeight: 0,
+ posterParams: {}, //海报所需参数
+ detailTab: 0,
+ goodsRoute:'',
+ posterApi:'',
+ }
+ },
+ created() {
+ this.isIphoneX = this.$util.uniappIsIPhoneX();
+ this.token = uni.getStorageSync('token');
+ },
+
+ methods: {
+ init(params) {
+ this.skuId = params.sku_id;
+ this.goodsId = params.goods_id;
+ this.preview = params.preview;
+ this.source_member = params.source_member;
+ this.whetherCollection = params.whetherCollection;
+ this.posterParams = params.posterParams;
+
+ this.shareUrl = params.shareUrl;
+ this.memberId = params.memberId;
+ this.goodsRoute = params.goodsRoute;
+ this.posterApi = params.posterApi;
+ this.getService();
+
+ // 评价设置
+ this.getEvaluateConfig();
+ this.videoContext = uni.createVideoContext('goodsVideo');
+
+ // #ifdef MP-WEIXIN
+ this.goodsSyncToGoodsCircle();
+ // #endif
+
+ this.getWhetherCollection();
+ },
+ swiperChange(e) {
+ this.swiperCurrent = e.detail.current + 1;
+ },
+
+ //-------------------------------------服务-------------------------------------
+
+ openMerchantsServicePopup() {
+ this.$refs.merchantsServicePopup.open();
+ },
+ closeMerchantsServicePopup() {
+ this.$refs.merchantsServicePopup.close();
+ },
+
+ //-------------------------------------属性-------------------------------------
+
+ openAttributePopup() {
+ this.$refs.attributePopup.open();
+ },
+ closeAttributePopup() {
+ this.$refs.attributePopup.close();
+ },
+ //获取用户是否关注
+ async getWhetherCollection() {
+ this.$api.sendRequest({
+ url: "/api/goodscollect/iscollect",
+ data: {
+ goods_id: this.goodsId
+ },
+ success: res => {
+ this.whetherCollection = res.data;
+ }
+ });
+ },
+ //-------------------------------------评价-------------------------------------
+ //商品评论列表
+ getGoodsEvaluate() {
+
+ this.$api.sendRequest({
+ url: "/api/goodsevaluate/firstinfo",
+ data: {
+ goods_id: this.goodsSkuDetail.goods_id
+ },
+ success: res => {
+ let data = res.data;
+ if (data) {
+ this.goodsEvaluate = data;
+ this.goodsEvaluate.forEach((item, index) => {
+ if (this.goodsEvaluate[index].images) this.goodsEvaluate[index].images =
+ this.goodsEvaluate[index].images.split(",");
+ if (this.goodsEvaluate[index].is_anonymous == 1) this.goodsEvaluate[
+ index].member_name = this.goodsEvaluate[index].member_name
+ .replace(
+ this.goodsEvaluate[index].member_name.substring(1, this
+ .goodsEvaluate[index].member_name.length - 1), '***')
+ })
+ // if (this.goodsEvaluate.images) this.goodsEvaluate.images = this.goodsEvaluate.images.split(",");
+ // if (this.goodsEvaluate.is_anonymous == 1) this.goodsEvaluate.member_name = this.goodsEvaluate.member_name.replace(
+ // this.goodsEvaluate.member_name.substring(1, this.goodsEvaluate.member_name.length - 1), '***')
+ }
+ }
+ });
+ },
+
+ // 预览评价图片
+ previewEvaluate(index, img_index, field) {
+ var paths = [];
+ for (let i = 0; i < this.goodsEvaluate[index][field].length; i++) {
+ paths.push(this.$util.img(this.goodsEvaluate[index][field][i]));
+ }
+ uni.previewImage({
+ current: img_index,
+ urls: paths
+ });
+ },
+ //-------------------------------------关注-------------------------------------
+ editCollection() {
+ if (this.preview) return; // 开启预览,禁止任何操作和跳转
+
+ if (this.token) {
+
+ //未关注添加关注
+ if (this.whetherCollection == 0) {
+ this.$api.sendRequest({
+ url: "/api/goodscollect/add",
+ data: {
+ sku_id: this.skuId,
+ goods_id: this.goodsSkuDetail.goods_id,
+ sku_name: this.goodsSkuDetail.sku_name,
+ sku_price: this.goodsSkuDetail.show_price,
+ sku_image: this.goodsSkuDetail.sku_image
+ },
+ success: res => {
+ var data = res.data;
+ if (data > 0) {
+ this.whetherCollection = 1;
+ }
+ }
+ });
+ } else {
+ //已关注取消关注
+ this.$api.sendRequest({
+ url: "/api/goodscollect/delete",
+ data: {
+ goods_id: this.goodsSkuDetail.goods_id
+ },
+ success: res => {
+ var data = res.data;
+ if (data > 0) {
+ this.whetherCollection = 0;
+ }
+ }
+ });
+ }
+ } else {
+ if (this.source_member) {
+ this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member);
+ } else {
+ this.$refs.login.open(this.shareUrl);
+ }
+ }
+ },
+
+ collection() {
+ if (this.preview) return; // 开启预览,禁止任何操作和跳转
+ this.editCollection();
+ if (this.token) {
+ return this.whetherCollection ? 0 : 1;
+ }
+ },
+ //-------------------------------------分享-------------------------------------
+ // 打开分享弹出层
+ openSharePopup() {
+ this.$refs.sharePopup.open();
+ },
+ // 关闭分享弹出层
+ closeSharePopup() {
+ this.$refs.sharePopup.close();
+ },
+ copyUrl() {
+ let text = this.$config.h5Domain + this.shareUrl;
+ if (this.memberId) text += '&source_member=' + this.memberId;
+ this.$util.copy(text, () => {
+ this.closeSharePopup();
+ });
+ },
+
+ //-------------------------------------海报-------------------------------------
+ // 打开海报弹出层
+ openPosterPopup() {
+ this.getGoodsPoster();
+ this.$refs.sharePopup.close();
+ this.$refs.posterPopup.open();
+ if (this.poster != '-1') {
+ setTimeout(() => {
+ let view = uni.createSelectorQuery().in(this).select(".poster-layer .image-wrap");
+ view.fields({
+ size: true,
+ }, data => {
+ let posterWhith = data.width;
+ let ratio = parseFloat((740 / posterWhith).toFixed(2));
+ if (this.token != '') {
+ this.posterHeight = parseInt(1240 / ratio);
+ } else {
+ this.posterHeight = parseInt(1100 / ratio);
+ }
+ }).exec();
+ }, 100);
+ }
+ },
+ // 关闭海报弹出层
+ closePosterPopup() {
+ this.$refs.posterPopup.close();
+ },
+ //生成海报
+ getGoodsPoster() {
+ uni.showLoading({
+ 'title' : '海报生成中...'
+ })
+ //活动海报信息
+ if (this.memberId) this.posterParams.source_member = this.memberId;
+
+ this.$api.sendRequest({
+ url: this.posterApi,
+ data: {
+ page: this.goodsRoute,
+ qrcode_param: JSON.stringify(this.posterParams)
+ },
+ success: res => {
+ if (res.code == 0) {
+ this.poster = res.data.path + "?time=" + new Date().getTime();
+ } else {
+ this.posterMsg = res.message;
+ }
+ uni.hideLoading();
+ },
+ fail: err => {
+ uni.hideLoading();
+ }
+ });
+ },
+ // 预览图片
+ previewMedia(index) {
+ var paths = [];
+ for (let i = 0; i < this.goodsSkuDetail.sku_images.length; i++) {
+ paths.push(this.$util.img(this.goodsSkuDetail.sku_images[i], {
+ size: 'big'
+ }));
+ }
+ uni.previewImage({
+ current: index,
+ urls: paths,
+ // longPressActions: {
+ // itemList: ['发送给朋友', '保存图片', '关注'],
+ // success: function(data) {
+ // console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
+ // },
+ // fail: function(err) {
+ // console.log(err.errMsg);
+ // }
+ // }
+ });
+ },
+ swiperImageError(index) {
+ this.goodsSkuDetail.sku_images[index] = this.$util.getDefaultImage().goods;
+ this.$forceUpdate();
+ },
+ // #ifdef MP || APP-PLUS
+ //小程序中保存海报
+ saveGoodsPoster() {
+ let url = this.$util.img(this.poster);
+ uni.downloadFile({
+ url: url,
+ success: (res) => {
+ if (res.statusCode === 200) {
+ uni.saveImageToPhotosAlbum({
+ filePath: res.tempFilePath,
+ success: () => {
+ this.$util.showToast({
+ title: "保存成功"
+ });
+ },
+ fail: () => {
+ this.$util.showToast({
+ title: "保存失败,请稍后重试"
+ });
+ }
+ });
+ }
+ }
+ });
+ },
+ // #endif
+ //售后保障查询
+ getService() {
+ this.$api.sendRequest({
+ url: '/api/goods/aftersale',
+ success: res => {
+ if (res.code == 0 && res.data) {
+ this.service = res.data;
+ }
+ }
+ });
+ },
+
+ // #ifdef MP-WEIXIN
+ /**
+ * 将商品同步到微信圈子
+ */
+ goodsSyncToGoodsCircle() {
+ this.$api.sendRequest({
+ url: '/goodscircle/api/goods/sync',
+ data: {
+ goods_id: this.goodsSkuDetail.goods_id
+ },
+ success: res => {
+ if (res.code == 0) {
+ this.goodsCircle = true;
+ }
+ }
+ })
+ },
+ /**
+ * 将商品推荐到微信圈子
+ */
+ openBusinessView() {
+ if (wx.openBusinessView) {
+ wx.openBusinessView({
+ businessType: 'friendGoodsRecommend',
+ extraData: {
+ product: {
+ item_code: this.goodsSkuDetail.goods_id,
+ title: this.goodsSkuDetail.sku_name,
+ image_list: this.goodsSkuDetail.sku_images.map((ele) => {
+ return this.$util.img(ele);
+ })
+ }
+ },
+ success: function(res) {
+ console.log('success', res);
+ },
+ fail: function(res) {
+ console.log('fail', res);
+ }
+ })
+ }
+ },
+ // #endif
+ getEvaluateConfig() {
+ this.$api.sendRequest({
+ url: '/api/goodsevaluate/config',
+ success: res => {
+ if (res.code == 0) {
+ var data = res.data;
+ this.evaluateConfig = data;
+ if (this.evaluateConfig.evaluate_show == 1) {
+ //商品评论
+ this.getGoodsEvaluate();
+ }
+ }
+ }
+ });
+ },
+ toEvaluateDetail(id) {
+ this.$util.redirectTo('/pages_tool/goods/evaluate', {
+ goods_id: id
+ });
+ },
+ showImg(e) {
+ //拿到图片的路径里面的内容放在我们数组中
+ let contentimg = e.target.dataset.nodes;
+ let arrImg = [];
+ for (var i = 0; i < contentimg.length; i++) {
+ var img = contentimg[i].children;
+ if (Array.isArray(img)) {
+ for (var j = 0; j < img.length; j++) {
+ if (img[j].attrs && img[j].name == "img") {
+ if (img[j].attrs.src) {
+ arrImg.push(img[j].attrs.src)
+ }
+ }
+ }
+ }
+ }
+ //最后一步就是把我们的所有图片放在预览的api中就可以了
+ uni.previewImage({
+ current: arrImg,
+ urls: arrImg,
+ })
+ },
+
+ //-------------------------------------社群-------------------------------------
+
+ //添加福利群
+ onCommunity() {
+ this.isCommunity = true
+ },
+ onCloseCommunity() {
+ this.isCommunity = false
+ }
+
+
+ }
+
+}
diff --git a/components/farm-goods-detail-view/goods-detail-view.vue b/components/farm-goods-detail-view/goods-detail-view.vue
new file mode 100644
index 0000000..6b13a6d
--- /dev/null
+++ b/components/farm-goods-detail-view/goods-detail-view.vue
@@ -0,0 +1,350 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ swiperCurrent }}
+ /{{ goodsSkuDetail.sku_images.length }}
+
+
+
+
+
+
+
+
+
+
+ {{ $lang('video') }}
+ {{ $lang('image') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 属性
+
+ {{ item.attr_name }}: {{ item.attr_value_name }}
+
+
+
+
+
+ 服务
+
+
+
+
+
+
+
+
+ {{ item.service_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 商品详情
+
+
+
+
+
+
+
+
+
+ 该商家暂无上传相关详情哦!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存图片
+
+
+ 长按保存图片
+
+
+
+
+ {{ posterMsg }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/share-panel/share-panel.vue b/components/share-panel/share-panel.vue
new file mode 100644
index 0000000..120db4e
--- /dev/null
+++ b/components/share-panel/share-panel.vue
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 长按图片保存
+
+
+ 关闭
+
+
+
+
+
+
+
+
diff --git a/main.js b/main.js
index 11a6c68..633d15a 100644
--- a/main.js
+++ b/main.js
@@ -10,6 +10,10 @@ import Lang from './common/js/lang.js'
import Config from './common/js/config.js'
import globalConfig from './common/js/golbalConfig.js';
+// import Vant from 'vant';
+// import 'vant/lib/index.less';
+// Vue.use(Vant);
+
Vue.prototype.$store = store //挂在vue
Vue.config.productionTip = false
diff --git a/node_modules/jweixin-module/README.md b/node_modules/jweixin-module/README.md
index f4e08bd..7c91d7b 100644
--- a/node_modules/jweixin-module/README.md
+++ b/node_modules/jweixin-module/README.md
@@ -19,8 +19,8 @@ https://unpkg.com/jweixin-module/out/index.js
## 使用
```js
-var wx = require('jweixin-module')
-wx.ready(function(){
+var jweixin = require('jweixin-module')
+jweixin.ready(function(){
// TODO
});
```
diff --git a/node_modules/jweixin-module/out/index.js b/node_modules/jweixin-module/out/index.js
deleted file mode 100644
index 807ab6a..0000000
--- a/node_modules/jweixin-module/out/index.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(e):"function"==typeof define&&(define.amd||define.cmd)?define(function(){return n(e)}):n(e,!0)}(window,function(o,e){function c(n,e,i){o.WeixinJSBridge?WeixinJSBridge.invoke(n,r(e),function(e){a(n,e,i)}):d(n,i)}function i(n,i,t){o.WeixinJSBridge?WeixinJSBridge.on(n,function(e){t&&t.trigger&&t.trigger(e),a(n,e,i)}):d(n,t||i)}function r(e){return(e=e||{}).appId=M.appId,e.verifyAppId=M.appId,e.verifySignType="sha1",e.verifyTimestamp=M.timestamp+"",e.verifyNonceStr=M.nonceStr,e.verifySignature=M.signature,e}function n(e){return{timeStamp:e.timestamp+"",nonceStr:e.nonceStr,package:e.package,paySign:e.paySign,signType:e.signType||"SHA1"}}function a(e,n,i){"openEnterpriseChat"==e&&(n.errCode=n.err_code),delete n.err_code,delete n.err_desc,delete n.err_detail;var t=n.errMsg;t||(t=n.err_msg,delete n.err_msg,t=function(e,n){var i=e,t=f[i];t&&(i=t);var o="ok";if(n){var r=n.indexOf(":");"confirm"==(o=n.substring(r+1))&&(o="ok"),"failed"==o&&(o="fail"),-1!=o.indexOf("failed_")&&(o=o.substring(7)),-1!=o.indexOf("fail_")&&(o=o.substring(5)),"access denied"!=(o=(o=o.replace(/_/g," ")).toLowerCase())&&"no permission to execute"!=o||(o="permission denied"),"config"==i&&"function not exist"==o&&(o="ok"),""==o&&(o="fail")}return n=i+":"+o}(e,t),n.errMsg=t),(i=i||{})._complete&&(i._complete(n),delete i._complete),t=n.errMsg||"",M.debug&&!i.isInnerInvoke&&alert(JSON.stringify(n));var o=t.indexOf(":");switch(t.substring(o+1)){case"ok":i.success&&i.success(n);break;case"cancel":i.cancel&&i.cancel(n);break;default:i.fail&&i.fail(n)}i.complete&&i.complete(n)}function s(e){if(e){for(var n=0,i=e.length;n
+
+
+
+
+ {{ detail.article_title }}
+
+ 发表时间: {{ detail.create_time }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ set_info.browse_text || '浏览量' }}{{ detail.read_num }}次数
+
+
+
+
+ 赞 {{ detail.dianzan_num }}
+
+ 分享
+
+
+
+
+
+
+ 推荐阅读
+
+ 查看更多
+
+
+
+
+
+
+
+
+ {{ item.article_title }}
+ {{ item.article_abstract }}
+
+
+
+ {{ item.read_num }}
+
+
+
+ {{ item.dianzan_num }}
+
+ {{ item.create_time.split(" ")[0] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages_promotion/article/list.vue b/pages_promotion/article/list.vue
new file mode 100644
index 0000000..5ec4835
--- /dev/null
+++ b/pages_promotion/article/list.vue
@@ -0,0 +1,728 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 热门文章
+
+
+
+
+
+
+
+
+
+ {{ item.article_title }}
+ {{ item.article_abstract }}
+
+
+
+
+
+
+
+
+
+ 精选推荐
+
+ 查看更多
+
+
+
+
+
+
+
+
+ {{ item.article_title }}
+ {{ item.article_abstract }}
+
+
+
+ {{ item.read_num }}
+
+
+
+ {{ item.dianzan_num }}
+
+ {{ item.create_time.split(" ")[0] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.article_title }}
+ {{ item.article_abstract }}
+
+
+
+ {{ item.read_num }}
+
+
+
+ {{ item.dianzan_num }}
+
+ {{ item.create_time.split(" ")[0] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages_promotion/article/public/img/dianzan.png b/pages_promotion/article/public/img/dianzan.png
new file mode 100644
index 0000000..4280aac
Binary files /dev/null and b/pages_promotion/article/public/img/dianzan.png differ
diff --git a/pages_promotion/article/public/img/fenxiang.png b/pages_promotion/article/public/img/fenxiang.png
new file mode 100644
index 0000000..c5cad51
Binary files /dev/null and b/pages_promotion/article/public/img/fenxiang.png differ
diff --git a/pages_promotion/article/public/img/liulan.png b/pages_promotion/article/public/img/liulan.png
new file mode 100644
index 0000000..6ae1ac4
Binary files /dev/null and b/pages_promotion/article/public/img/liulan.png differ
diff --git a/pages_promotion/article/record.vue b/pages_promotion/article/record.vue
new file mode 100644
index 0000000..79c3894
--- /dev/null
+++ b/pages_promotion/article/record.vue
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.article_title }}
+
+ {{ item.time }}
+
+
+ 删除
+
+
+ 取消点赞
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages_promotion/fenxiao/apply_upgrade.vue b/pages_promotion/fenxiao/apply_upgrade.vue
new file mode 100644
index 0000000..d128527
--- /dev/null
+++ b/pages_promotion/fenxiao/apply_upgrade.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages_promotion/fenxiao/index.vue b/pages_promotion/fenxiao/index.vue
index c34c853..1482693 100644
--- a/pages_promotion/fenxiao/index.vue
+++ b/pages_promotion/fenxiao/index.vue
@@ -19,63 +19,67 @@
-
+
+
+
+
+ {{ info.level_name }}
+ 提交申请可以提升等级!
+
+ 申请升级
+
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ 总{{ fenxiaoWords.account }}
+ {{ info.total_commission | moneyFormat }}
+
+
+ 已提现{{ fenxiaoWords.account }}
+ {{ info.account_withdraw | moneyFormat }}
+
+
+ 提现中{{ fenxiaoWords.account }}
+ {{ info.account_withdraw_apply | moneyFormat }}
+
+
+ 申请提现
+ -->
-
-
-
-
-
+
diff --git a/pages_promotion/futures/list.vue b/pages_promotion/futures/list.vue
new file mode 100644
index 0000000..65e3821
--- /dev/null
+++ b/pages_promotion/futures/list.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vue.config.js b/vue.config.js
new file mode 100644
index 0000000..a0be9b8
--- /dev/null
+++ b/vue.config.js
@@ -0,0 +1,10 @@
+module.exports = {
+ chainWebpack: (config) => {
+ config.module
+ .rule("mjs$")
+ .test(/\.mjs$/)
+ .include.add(/node_modules/)
+ .end()
+ .type("javascript/auto");
+ },
+};
\ No newline at end of file