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/checkUpdater.js b/common/js/checkUpdater.js new file mode 100644 index 0000000..2ecab14 --- /dev/null +++ b/common/js/checkUpdater.js @@ -0,0 +1,124 @@ +import Config from './config.js'; +export function checkUpdater(currentId, updaterPage) { + uni.request({ + url: Config.baseUrl+'/api/version/id', + method: 'GET', + data: { + search: 'latestId' + }, + success: res => { + if (res.statusCode === 200) { + const response = res.data + const latestId = response.latest.id + const method = response.latest.method + if (!latestId) { + console.log('当前没有发行版本') + } else if (currentId != latestId && method === 'force') { + console.log('确认强制更新,正在取得地址') + // 如果需要背地(静默)热更新,获取下载地址 + uni.request({ + url: Config.baseUrl+'/api/version/info', + method: 'GET', + data: { + search: 'latestInfo' + }, + success: (res) => { + if (res.statusCode === 200) { + console.log('地址请求成功') + const response = res.data + const iosLink = response.latest.info.iosLink + const androidLink = response.latest.info.androidLink + let downloadLink = '' + let ready = false + // 判断系统类型 + if (plus.os.name.toLowerCase() === 'android') { + console.log('安卓系统') + if (androidLink && androidLink !== '#') { // 我这里默认#也是没有地址,请根据业务自行修改 + console.log('发现下载地址') + // 安卓:创建下载任务 + if (androidLink.match(RegExp(/.wgt/))) { + console.log('确认wgt热更新包') + downloadLink = androidLink + ready = true + } else { + console.log('安卓推荐.wgt强制更新,.apk的强制更新请您自行修改程序') + } + } else { + console.log('下载地址是空的,无法继续') + } + } else { + console.log('苹果系统') + if (iosLink && iosLink !== '#') { // 我这里默认#也是没有地址,请根据业务自行修改 + console.log('发现下载地址') + // 苹果(A):进行热更新(如果iosLink是wgt更新包的下载地址)判断文件名中是否含有.wgt + if (iosLink.match(RegExp(/.wgt/))) { + console.log('确认wgt热更新包') + downloadLink = iosLink + ready = true + } else { + console.log('苹果只支持.wgt强制更新') + } + } else { + console.log('下载地址是空的,无法继续') + } + } + if (ready) { + console.log('任务开始') + let downloadTask = uni.downloadFile({ + url: downloadLink, + success: (res) => { + if (res.statusCode === 200) { + // 保存下载的安装包 + console.log('保存安装包') + uni.saveFile({ + tempFilePath: res.tempFilePath, + success: (res) => { + const packgePath = res.savedFilePath + // 保存更新记录到stroage,下次启动app时安装更新 + uni.setStorage({ + key: 'updated', + data: { + completed: false, + packgePath: packgePath + }, + success: () => { + console.log('成功保存记录') + } + }) + // 任务完成,关闭下载任务 + console.log('任务完成,关闭下载任务,下一次启动应用时将安装更新') + downloadTask.abort() + downloadTask = null + } + }) + } + } + }) + } else { + console.log('下载地址未准备,无法开启下载任务') + } + } + } + }) + } else if (currentId != latestId) { + console.log('检测到更新') + uni.showModal({ + title: '发现新版本', + content: '有新版本可用 (版本id:' + latestId + '),请问您是否更新?', + success: (res) => { + if (res.confirm) { + uni.navigateTo({ + url: updaterPage + }) + } else if (res.cancel) { + console.log('取消') + } + } + }) + } else { + console.log('现在是最新版本') + } + } + } + }) +} \ No newline at end of file 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 @@ + + + + + + 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 @@ + + + + + + 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..ab2c6fb 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 }} + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + 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 @@ + + + + + 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..f481a18 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 @@ + + + + +