From 802290838fd05c7236dae780900b4bacb20c82df Mon Sep 17 00:00:00 2001 From: xuxueyang <xuxy@fengyuntec.com> Date: 星期五, 02 八月 2024 16:27:26 +0800 Subject: [PATCH] add 二维码格式 --- pages/login/supplier-login.vue | 102 + pages/home/home.vue | 8 components/qr_code/qrcode.vue | 27 sub_pages/partner/partner-info/partner-code.vue | 2 pages/login/supplier-reg.vue | 29 sub_pages/partner/partner-info/partner-code-v2.vue | 754 +-------------- components/qr_code/qrcode.js | 1362 ++++++++++++++++++++++++++++++ App.vue | 16 components/hj-placard/shareImages.vue | 292 ++++++ sub_pages/customer/customer-info/customer-info.vue | 6 pages/user/supplier-user.vue | 80 + store/index.js | 13 12 files changed, 1,955 insertions(+), 736 deletions(-) diff --git a/App.vue b/App.vue index d8ad526..f423ad2 100644 --- a/App.vue +++ b/App.vue @@ -51,10 +51,18 @@ // #endif } // #endif - // #ifdef PUB_CUSTOMER - uni.reLaunch({ - url: '/pages/home/home' - }) + // #ifdef PUB_CUSTOMER + // 需要处理一下,判断是跳转登录还是原封不动 + if(options.partnerUserId){ + //需要去注册页面 + console.log('options',options) + + }else{ + uni.reLaunch({ + url: '/pages/home/home' + }) + } + // #endif }, diff --git a/components/hj-placard/shareImages.vue b/components/hj-placard/shareImages.vue new file mode 100644 index 0000000..6f84159 --- /dev/null +++ b/components/hj-placard/shareImages.vue @@ -0,0 +1,292 @@ +<template> + <view style="position: fixed;z-index: -9999;"> + <canvas id="myQrcode" :canvas-id="canvasID" :style="{width:canvasWidth+'px',height:canvasHeight+'px'}"></canvas> + <view v-if="qrCode == ''"> + <QRCode ref="qrcode" /> + </view> + </view> +</template> + +<script> + import QRCode from "../qr_code/qrcode.vue" + var _this; + export default { + name: 'canvas-images', + props: { + // canvasID 等同于 canvas-id + canvasID: { + Type: String, + default: 'myQrcode' + }, + canvasWidth: { // 画布宽度 + Type: 'int', + default: 375 + }, + canvasHeight: { // 画布高度 + Type: 'int', + default: 650 + }, + shareTitle: { // 分享标题 + Type: 'String', + default: '我是这张图片的标题' + }, + goodsTitle: { // 商品宣传标题 + Type: 'String', + default: '' + }, + goodsTitle2: { // 商品宣传标题 + Type: 'String', + default: '' + }, + + shareImage: { // 分享图片 + Type: 'String', + default: '' + }, + qrSize: { // 二维码大小 + Type: 'int', + default: 100 + }, + qrUrl: { // 生成二维码的链接 + Type: 'String', + default: 'https://ext.dcloud.net.cn/plugin?id=5747' + } + }, + components: { + QRCode + }, + data() { + return { + qrCode: '', // 二维码 + localImgPath: '', + canvas: undefined + } + }, + mounted() { + _this = this; + }, + methods: { + // downloadImg() { + // let that = this + // const query = uni.createSelectorQuery() + // console.log('canvasID',this.canvasID) + // query.select('#myQrcode') + // .fields({ + // node: true, + // size: true + // }) + // .exec((res) => { + // console.log('query',res) + // var canvas = res[0].node + // uni.canvasToTempFilePath({ + // canvasId: this.canvasID, + // canvas: canvas, + // x: 0, + // y: 0, + // width: this.canvasWidth, + // height: this.canvasHeight, + // destWidth: this.canvasWidth, + // destHeight: this.canvasHeight, + // success(res) { + // console.log('二维码临时路径:', res.tempFilePath) + // uni.saveImageToPhotosAlbum({ + // filePath: res.tempFilePath, + // success: function() { + // console.log('save success'); + // uni.showToast({ + // title: '保存成功' + // }) + // }, + // fail(res) { + // console.error(res) + // uni.showToast({ + // title: '保存失败。', + // icon: 'error' + // }) + // } + // }) + // }, + // fail(res) { + // console.error('fail', res) + + // uni.showToast({ + // title: '保存失败', + // icon: 'error' + // }) + // } + // }) + + // }) + + // }, + + // 创建二维码 + canvasCreate() { + this.localImgPath = this.shareImage + console.log('this.shareImage', this.shareImage) + if (this.shareImage && this.shareImage.startsWith('https://')) { + uni.getImageInfo({ + src: _this.shareImage, + success(res) { + console.log('getImageInfo res', res) + _this.localImgPath = res.path + _this.$refs.qrcode.make({ + size: _this.qrSize, + text: _this.qrUrl + }) + .then(res => { + // 返回的res与uni.canvasToTempFilePath返回一致 + // console.log(res) + _this.qrCode = res.tempFilePath; + _this.onCanvas(); + }); + }, + fail(error) { + this.$message.showToast('加载图片错误') + } + }) + } else { + _this.$refs.qrcode.make({ + size: _this.qrSize, + text: _this.qrUrl + }) + .then(res => { + // 返回的res与uni.canvasToTempFilePath返回一致 + // console.log(res) + _this.qrCode = res.tempFilePath; + _this.onCanvas(); + }); + } + + + }, + // 画图 + async onCanvas() { + uni.showLoading({ + title: "分享图片生成中..." + }); + const ctx = uni.createCanvasContext(_this.canvasID, _this); + // 设置 canvas 背景色 + ctx.setFillStyle('#FFFFFF'); + ctx.fillRect(0, 0, _this.canvasWidth, _this.canvasHeight); + ctx.setFillStyle('#000000'); + // 背景图片 + //需要下载图片 + + if (_this.localImgPath) { + console.log('localImgPath', _this.localImgPath) + ctx.drawImage(_this.localImgPath, 20, 20, 335, 500); + } + // ctx.setFontSize(18); + // ctx.setTextAlign('center'); + // ctx.fillText(_this.shareTitle, _this.canvasWidth / 2, 30); + // 左边标题 + ctx.setTextAlign('left') + ctx.setFontSize(22) + _this.writeTextOnCanvas(ctx, 20, 21, _this.goodsTitle, 20, 560); + ctx.setTextAlign('left') + ctx.setFontSize(16) + _this.writeTextOnCanvas(ctx, 20, 21, _this.goodsTitle2, 20, 585); + // 设置虚线 + // ctx.setStrokeStyle('#333333'); + // ctx.setLineDash([5, 10], 2); + // ctx.beginPath(); + // ctx.moveTo(220, 340); + // ctx.lineTo(220, 420); + // ctx.stroke(); + // 二维码 + ctx.drawImage(_this.qrCode, 250, 520, 100, 100); + // ctx.draw(); + + // 延迟后渲染至canvas上 + let pic = await _this.setTime(ctx) + _this.$emit('success', pic); + }, + /** + * @param {Object} ctx_2d getContext("2d") 对象 + * @param {int} lineheight 段落文本行高 + * @param {int} bytelength 设置单字节文字一行内的数量 + * @param {string} text 写入画面的段落文本 + * @param {int} startleft 开始绘制文本的 x 坐标位置(相对于画布) + * @param {int} starttop 开始绘制文本的 y 坐标位置(相对于画布) + */ + writeTextOnCanvas(ctx_2d, lineheight, bytelength, text, startleft, starttop) { + // 获取字符串的真实长度(字节长度) + function getTrueLength(str) { + var len = str.length, + truelen = 0; + for (var x = 0; x < len; x++) { + if (str.charCodeAt(x) > 128) { + truelen += 2; + } else { + truelen += 1; + } + } + return truelen; + } + // 按字节长度截取字符串,返回substr截取位置 + function cutString(str, leng) { + var len = str.length, + tlen = len, + nlen = 0; + for (var x = 0; x < len; x++) { + if (str.charCodeAt(x) > 128) { + if (nlen + 2 < leng) { + nlen += 2; + } else { + tlen = x; + break; + } + } else { + if (nlen + 1 < leng) { + nlen += 1; + } else { + tlen = x; + break; + } + } + } + return tlen; + } + for (var i = 1; getTrueLength(text) > 0; i++) { + var tl = cutString(text, bytelength); + ctx_2d.fillText(text.substr(0, tl).replace(/^\s+|\s+$/, ""), startleft, (i - 1) * lineheight + + starttop); + text = text.substr(tl); + } + }, + // 彻底改成同步 防止拿到的图片地址为空 + setTime(ctx) { + return new Promise((resole, err) => { + setTimeout(() => { + ctx.draw(false, async () => { + let pic = await _this.getNewPic(); + resole(pic) + }); + }, 600) + }) + }, + // 获取新的图片地址 + getNewPic() { + return new Promise((resolve, errs) => { + setTimeout(() => { + uni.canvasToTempFilePath({ + canvasId: _this.canvasID, + quality: 1, + complete: (res) => { + // 在H5平台下,tempFilePath 为 base64 + // 关闭showLoading + uni.hideLoading(); + // 储存海报地址 也是分享的地址 + resolve(res.tempFilePath) + } + }, _this); + }, 200) + }) + }, + }, + mounted() { + _this = this; + } + } +</script> \ No newline at end of file diff --git a/components/qr_code/qrcode.js b/components/qr_code/qrcode.js new file mode 100644 index 0000000..44e5715 --- /dev/null +++ b/components/qr_code/qrcode.js @@ -0,0 +1,1362 @@ +//--------------------------------------------------------------------- +// github https://github.com/Sansnn/uQRCode +// version 2.0.2 +//--------------------------------------------------------------------- + +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, + enableDelay: false // 启用延迟绘制 + }, + + getModules: function(options) { + options = Object.assign(this.defaults, options); + var qrcode = new QRCode(options.typeNumber, options.errorCorrectLevel); + qrcode.addData(utf16To8(options.text)); + qrcode.make(); + return qrcode.modules; + }, + + make: function(options, componentInstance) { + return new Promise((reslove, reject) => { + options = Object.assign(this.defaults, options); + if (!options.canvasId) { + throw new Error('uQRCode: Please set canvasId!'); + } + var modules = this.getModules(options); + var tileW = (options.size - options.margin * 2) / modules.length; + var tileH = tileW; + var delay = 0; + var ctx = uni.createCanvasContext(options.canvasId, componentInstance); + ctx.setFillStyle(options.backgroundColor); + ctx.fillRect(0, 0, options.size, options.size); + for (var row = 0; row < modules.length; row++) { + for (var col = 0; col < modules.length; col++) { + delay = options.enableDelay ? row * modules.length + col + 1 : 0; + setTimeout(function(row, col) { + // 计算每一个小块的位置 + 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); + var style = modules[row][col] ? options.foregroundColor : + options.backgroundColor; + ctx.setFillStyle(style); + ctx.fillRect(x, y, w, h); + }, delay, row, col); + } + } + + // 耗时 + var time = options.enableDelay ? delay + options.size * 2 + options.margin * 2 + options.text.length : 0; + setTimeout(function() { + ctx.draw(false, function() { + uni.canvasToTempFilePath({ + canvasId: options.canvasId, + fileType: options.fileType, + width: options.size, + height: options.size, + destWidth: options.size, + destHeight: options.size, + success: function(res) { + reslove(Object.assign(res, { + time + })); + }, + fail: function(err) { + reject(err); + } + }, componentInstance); + }); + }, time); + }); + } + } +})(); + +export default uQRCode; diff --git a/components/qr_code/qrcode.vue b/components/qr_code/qrcode.vue new file mode 100644 index 0000000..621582c --- /dev/null +++ b/components/qr_code/qrcode.vue @@ -0,0 +1,27 @@ +<template> + <view class="qrcode"> + <canvas id="qrcode" canvas-id="qrcode" :style="{'width': `${options.size}px`, 'height': `${options.size}px`}" /> + </view> +</template> + +<script> + import qrcode from './qrcode' + export default { + name: 'qrcode', + data() { + return { + options: { + canvasId: 'qrcode', + size: 354, + margin: 10, + text: '' + } + } + }, + methods: { + make(options) { + return qrcode.make(Object.assign(this.options, options), this) + } + } + } +</script> \ No newline at end of file diff --git a/pages/home/home.vue b/pages/home/home.vue index c8e1246..7e40797 100644 --- a/pages/home/home.vue +++ b/pages/home/home.vue @@ -184,7 +184,13 @@ // }; // }, - onLoad() { + onLoad(options) { + // if(options.partnerUserId){ + // //需要前往注册了 + // uni.navigateTo({ + // url: '/pages/login/supplier-login' + // }) + // } // console.log('home created') //这里进行一次初始化即可 // this.$http.request('get', '/api/school/area/list', { diff --git a/pages/login/supplier-login.vue b/pages/login/supplier-login.vue index b49218b..6e36103 100644 --- a/pages/login/supplier-login.vue +++ b/pages/login/supplier-login.vue @@ -50,8 +50,10 @@ <button @tap="login()" class="bottom-button">登 录</button> <view class="flex"> - <view class="topic-font" v-if="loginType=='pwd'&&apitype!=='loginAdmin'" @click="loginType='code'">手机验证码登录</view> - <view class="topic-font" v-if="loginType=='code'&&apitype!=='loginAdmin'" @click="loginType='pwd'">账号密码登录</view> + <view class="topic-font" v-if="loginType=='pwd'&&apitype!=='loginAdmin'" + @click="loginType='code'">手机验证码登录</view> + <view class="topic-font" v-if="loginType=='code'&&apitype!=='loginAdmin'" + @click="loginType='pwd'">账号密码登录</view> <view class="topic-font m-l-a m-r-0" v-if="apitype!=='loginAdmin'" @click="toReg">前往注册</view> @@ -61,7 +63,7 @@ <!-- #ifdef PUB_PARTNER --> <view class="topic-font m-l-a m-r-0" @click="()=>{ if(apitype==='loginPartner'){ - apitype = 'loginAdmin' + apitype = 'loginAdmin' loginType = 'pwd' }else{ apitype = 'loginPartner' @@ -78,28 +80,78 @@ </view> </template> <script> - // import util from '@/utils/util.js' - // import gzmzApi from '@/api/gzmzApi.js' - // import myCache from '@/utils/myCache.js' export default { - // props: { - // // apitype: 'loginSupplier', - // apitype: { - // type: String, - // default () { - // // #ifdef PUB_SUPPLIER - // return 'loginSupplier' - // // #endif - // // #ifdef PUB_PARTNER - // return 'loginPartner' - // // #endif - // // #ifdef PUB_CUSTOMER - // return 'loginCustomer' - // // #endif - // // return 'loginPartner' - // } - // }, - // }, + onLoad(options) { + // #ifdef PUB_CUSTOMER + if (options.partnerUserId) { + if (this.$storage.getItem('token')) { + this.$message.showLoading() + //稍微等一会,避免currentInfo还在同步 + let tmp = this + setTimeout(() => { + tmp.$message.hideLoading() + if (tmp.currentInfo.id || tmp.$storage.getItem('token')) { + //这种已经登录的 + //确定是注册绑定还是重新绑定 + var t = { + title: '提示,您已登录,是否退出并注册绑定合伙人', + content: '', + showCancel: true, + cancelText: '使用当前账号绑定合伙人', + cancelColor: '#000000', + confirmText: '退出当前账号并注册、绑定', + confirmColor: '#20613D' + } + uni.showModal({ + ...t, + success: (res) => { + if (res.confirm) { + //清空登录信息, + this.$store.commit('updateLogin', false) + setTimeout(() => { + uni.navigateTo({ + url: `/sub_pages/customer/customer-info/customer-info?source=step&partnerUserId=${options.partnerUserId}&partnerUserName=${options.partnerUserName}` + }) + }, 200) + } + if (res.cancel) { + if (!tmp.currentInfo.customer) { + tmp.$message.showToast('您尚未完善信息无法绑定') + return + } else { + if (tmp.currentInfo.customer.partnerId) { + tmp.$message.showToast('您已绑定,请联系客服解除绑定') + return + } else { + //前往绑定页面 + uni.reLaunch({ + url: `/pages/user/supplier-user?partnerUserId=${options.partnerUserId}&partnerUserName=${options.partnerUserName}` + }) + } + } + } + } + }) + + } else { + //退出登录了,或者失效了 + uni.navigateTo({ + url: `/sub_pages/customer/customer-info/customer-info?source=step&partnerUserId=${options.partnerUserId}&partnerUserName=${options.partnerUserName}` + }) + } + }, 2000) + + } else { + uni.navigateTo({ + url: `/sub_pages/customer/customer-info/customer-info?source=step&partnerUserId=${options.partnerUserId}&partnerUserName=${options.partnerUserName}` + }) + } + + + } + // #endif + + }, data() { return { openId: '-1', @@ -243,7 +295,7 @@ icon: 'none' }); return; - } + } that.phoneNumber = '' } if (this.loginType == 'code') { diff --git a/pages/login/supplier-reg.vue b/pages/login/supplier-reg.vue index 85e6a25..4ea03aa 100644 --- a/pages/login/supplier-reg.vue +++ b/pages/login/supplier-reg.vue @@ -142,6 +142,17 @@ }, onLoad(options) { this.source = options.source || '' + // #ifdef PUB_CUSTOMER + var tjson = this.$storage.getItem('cache_customer_info') + if (tjson) { + var dto = JSON.parse(tjson) + if (dto.partnerUserId) { + this.partnerId = dto.partnerUserId || '' + this.partnerName = dto.partnerUserName || '佚名' + } + } + // #endif + }, methods: { async scanPartnerCode() { @@ -153,7 +164,23 @@ console.log('条码内容:' + res.result); var dto = undefined try { - dto = JSON.parse(res.result) + if (res.result && res.result.startsWith('http://') && res.result.indexOf( + 'partnerUserId') >= 0) { + var arr = res.result.split("?")[1].split("&") + dto = {} + for (var item of arr) { + var tarr = item.split("=") + if (tarr[1]) { + dto[tarr[0]] = dto[tarr[1]] + } + } + dto['name'] = dto['partnerUserName'] || dto['partnerUserId'] || '佚名' + dto['userId'] = dto['partnerUserId'] || '' + + } else { + dto = JSON.parse(res.result) + + } if (!!dto['userId']) { that.partnerName = dto['name'] || '' that.partnerId = dto['userId'] || '' diff --git a/pages/user/supplier-user.vue b/pages/user/supplier-user.vue index 1f9cdfa..c9da5b7 100644 --- a/pages/user/supplier-user.vue +++ b/pages/user/supplier-user.vue @@ -179,13 +179,13 @@ <view class="right-icon"> <uni-icons type="right"></uni-icons> </view> - </view> - <!-- <view class="user-util m-t-12 flex" v-if="selftype==='partner'" - @click="goto('/sub_pages/partner/partner-info/partner-code-v2',true)"> - <view class="title">测试二维码</view> - <view class="right-icon"> - <uni-icons type="right"></uni-icons> - </view> + </view> + <!-- <view class="user-util m-t-12 flex" v-if="selftype==='partner'" + @click="goto('/sub_pages/partner/partner-info/partner-code-v2',true)"> + <view class="title">测试二维码</view> + <view class="right-icon"> + <uni-icons type="right"></uni-icons> + </view> </view> --> <!-- #endif --> <!-- #ifdef PUB_CUSTOMER --> @@ -343,7 +343,11 @@ onLoad(options) { // const url = options.q ? decodeURIComponent(options.q) : ''; // const urlcode = options.url && decodeURIComponent(options.url) || '' - + // #ifdef PUB_CUSTOMER + if (options.partnerUserId) { + this.bindPartnerUser(options.partnerUserId, options.partnerUserName) + } + // #endif }, @@ -355,8 +359,25 @@ uni.stopPullDownRefresh() }, methods: { + async bindPartnerUser(userId, name) { + await this.$message.confirm(`确定要绑定${name}合伙人吗?`) + //调用接口绑定 + this.$message.showLoading() + const { + code, + data + } = await this.$http.request('post', '/api/customer/bind/partner', { + data: { + partnerUserId: userId + } + }) + this.$message.hideLoading() + if (code == 0) { + this.$message.showToast(`绑定合伙人${name}成功`) + await this.$store.dispatch('getCurrentInfo') + } + }, async scanPartnerCode() { - await this.$message.confirm('确定要绑定合伙人吗?') //扫二维码确认 let that = this uni.scanCode({ @@ -364,31 +385,28 @@ console.log('条码内容:' + res.result); var dto = undefined try { - dto = JSON.parse(res.result) + if (res.result && res.result.startsWith('http://') && res.result.indexOf( + 'partnerUserId') >= 0) { + var arr = res.result.split("?")[1].split("&") + dto = {} + for (var item of arr) { + var tarr = item.split("=") + if (tarr[1]) { + dto[tarr[0]] = dto[tarr[1]] + } + } + dto['name'] = dto['partnerUserName'] || dto['partnerUserId'] || '佚名' + dto['userId'] = dto['partnerUserId'] || '' + + } else { + dto = JSON.parse(res.result) + + } if (!!dto['userId']) { var partnerName = dto['name'] || '' var partnerId = dto['userId'] || '' - //调用接口绑定 - that.$message.showLoading() - const { - code, - data - } = await that.$http.request('post', '/api/customer/bind/partner', { - data: { - partnerUserId: partnerId - } - }) - that.$message.hideLoading() - if (code == 0) { - that.$message.showToast(`绑定合伙人${partnerName}成功`) - await that.$store.dispatch('getCurrentInfo') + that.bindPartnerUser(partnerId, partnerName) - // setTimeout(async () => { - // that.$message.showLoading() - // that.$message.hideLoading() - // }, 1000) - - } } else { that.$message.showToast('二维码格式不正确扫码失败') } @@ -402,6 +420,8 @@ } }); }, + + toInfo() { var url = '' if (this.currentInfo.id) { diff --git a/store/index.js b/store/index.js index 528e0f9..69d8cd8 100644 --- a/store/index.js +++ b/store/index.js @@ -40,6 +40,7 @@ console.log('updateLogin', provider) state.hasLogin = provider && true || false; if (!state.hasLogin) { + state.currentInfo = {} storage.removeItem('token') } }, @@ -53,15 +54,9 @@ state.currentInfo = {} storage.removeItem('token') message.showToast('退出登录成功') - // #ifdef APP - var KeepAliveModule = uni.requireNativePlugin("yh-nl") //保活组件 - - let ret = KeepAliveModule.stopLocation(); - console.log('ret', ret) - // #endif - uni.redirectTo({ - url: '/views/login/login' - }) + // uni.redirectTo({ + // url: '/views/login/login' + // }) }, setOpenid(state, openid) { state.openid = openid diff --git a/sub_pages/customer/customer-info/customer-info.vue b/sub_pages/customer/customer-info/customer-info.vue index 8d30ff2..5e4c1e3 100644 --- a/sub_pages/customer/customer-info/customer-info.vue +++ b/sub_pages/customer/customer-info/customer-info.vue @@ -138,6 +138,12 @@ ...JSON.parse(tjson) } } + if(options.partnerUserId){ + this.dto.partnerUserId = options.partnerUserId || '' + } + if(options.partnerUserName){ + this.dto.partnerUserName = options.partnerUserName || '' + } } else { this.getCurrentInfo() } diff --git a/sub_pages/partner/partner-info/partner-code-v2.vue b/sub_pages/partner/partner-info/partner-code-v2.vue index 9746ae6..c6d015e 100644 --- a/sub_pages/partner/partner-info/partner-code-v2.vue +++ b/sub_pages/partner/partner-info/partner-code-v2.vue @@ -1,688 +1,112 @@ <template> - <view class="product-detail-page"> - <scroll-view enable-back-to-top scroll-y="true" class="product-detail-page__scroll"> - <view class="product-detail-page__scroll__swiper" v-if="info.ImageUrlList&&info.ImageUrlList.length>0"> - <swiper @change="onSwiperChange" :current="currentIndex" class="product-detail-page__scroll__swiper__target"> - <swiper-item class="product-detail-page__scroll__swiper__target__item" v-for="(item,index) in info.ImageUrlList" - :key="index"> - <image mode="aspectFit" :src="item" class="product-detail-page__scroll__swiper__target__item__img" lazy-load></image> - </swiper-item> - </swiper> - <view class="product-detail-page__scroll__swiper__page">{{currentIndex+1}}/{{info.ImageUrlList.length}}</view> - <button v-if="info.Id" @click="shareDetail" class="evan-share"> - <image src="/static/images/common/share_icon.png" class="evan-share__icon"></image> - <view class="evan-share__text">分享</view> - </button> - </view> - <image v-else mode="aspectFill" class="product-detail-page__scroll__default-image" src="/static/images/common/default_image_horizontal.png"></image> - <view class="product-detail-page__scroll__info"> - <view class="product-detail-page__scroll__info__title">{{info.Name||''}}</view> - <view class="product-detail-page__scroll__info__desc">{{info.Introduction||''}}</view> - <!-- <view class="product-detail-page__scroll__info__bulter">管家提成比例:</view> --> - <view class="product-detail-page__scroll__info__tags"> - <view class="product-detail-page__scroll__info__tags__item" v-for="(item,index) in tags" :key="index"> - <image class="product-detail-page__scroll__info__tags__item__icon" :src="item.icon"></image> - <view class="product-detail-page__scroll__info__tags__item__text">{{item.text}}</view> - </view> - <view v-if="!isGroup" class="product-detail-page__scroll__info__tags__count">已售{{info.SaleCount||0}}</view> - </view> - </view> - <view class="product-detail-page__scroll__team" v-if="isGroup"> - <view class="product-detail-page__scroll__team__title">批购进度及商品价格区间</view> - <view class="product-detail-page__scroll__team__main"> - <view v-if="!info.GroupRules||info.GroupRules.length===0" class="product-detail-page__scroll__team__main__progress"></view> - <view v-else class="product-detail-page__scroll__team__main__progress"> - <view class="product-detail-page__scroll__team__main__progress__active" :style="{width:getPercent()+'rpx'}"></view> - </view> - <!-- <template v-if="info.GroupRules&&info.GroupRules.length>0"> - <view v-for="(item,index) in info.GroupRules" :key="index" class="product-detail-page__scroll__team__main__price" - :style="{top:'80rpx',left:`${630 * 0.8 / lastInfo.GroupCountStart * item.GroupCountStart}rpx`}"> - <view class="product-detail-page__scroll__team__main__price__line"></view> - <view class="product-detail-page__scroll__team__main__price__target">{{item.GroupCountStart}}件</view> - <view class="product-detail-page__scroll__team__main__price__target">{{item.Amount}}元</view> - </view> - </template> --> - <view v-if="!$utils.isTrueEmpty(info.GroupCount)" class="product-detail-page__scroll__team__main__price" :style="{bottom:'80rpx',left:getLeftValue()+'rpx'}"> - <view class="product-detail-page__scroll__team__main__price__current">已批{{info.GroupCount}}件</view> - <view class="product-detail-page__scroll__team__main__price__line current"></view> - </view> - </view> - </view> - <view class="product-detail-page__scroll__team-intro" v-if="isGroup"> - <view class="product-detail-page__scroll__team-intro__target">批购说明:参与购买的人数越多,商品价格越实惠</view> - <view class="product-detail-page__scroll__team-intro__target">根据批购最终参与购买的人数,来确定你需要支付的最终价格</view> - </view> - <view class="product-detail-page__scroll__desc"> - <view class="product-detail-page__scroll__desc__title">商品详情</view> - <u-parse :content="info.ProductDesc" /> - </view> - </scroll-view> - <view class="evan-buy-bottom"> - <view class="evan-buy-bottom__item evan-buy-bottom__item--left"> - <view class="evan-buy-bottom__item__price"> - <view v-if="isGroup||info.PayType===1" class="evan-buy-bottom__item__price__unit">¥</view> - <!-- <view class="evan-buy-bottom__item__price__current">{{showPrice}}</view> --> - <view v-if="!isGroup&&info.PayType===1&&info.MarketPrice" class="evan-buy-bottom__item__price__old">¥{{info.MarketPrice}}</view> - </view> - <view v-if="info.GiveAwayHuidouCount" class="evan-buy-bottom__item__tip">赠送{{info.GiveAwayHuidouCount}}汇豆</view> - </view> - <view @tap="buy" class="evan-buy-bottom__item evan-buy-bottom__item--right">立即购买</view> + <view> + <view class="button p-t-12 bg-white"> + <button :disabled="canvasImages == '' ? true : false" type="primary" @click="downloadImg">下载二维码</button> + <button :disabled="canvasImages != '' ? false : true" @click="previewHandle">预览二维码</button> + <!-- #ifdef MP-WEIXIN --> + <!-- <button type="warn" :disabled="canvasImages != '' ? false : true" open-type="share">分享给朋友</button> --> + <!-- #endif --> </view> - <hjg-spec @confirm="onSpecConfirm" :changeCount="!isNewUserProduct" :specs="info.SpecInfos" ref="spec"></hjg-spec> - <view @tap="hideBarcode" class="evan-poster__mask" :class="{hide:!showBarcode}" :style="{paddingTop:posterPadding}"> - <canvas class="evan-poster__mask__canvas" :style="{width:canvasWidth+'px',height:canvasHeight+'px'}" canvas-id="barcode"></canvas> - <view @tap.stop.prevent="stopPop" class="evan-poster__mask__bottom"> - <button open-type="share" class="evan-poster__mask__bottom__item"> - <view class="evan-poster__mask__bottom__item__text">分享好友</view> - </button> - <button @tap="saveToAlbum" class="evan-poster__mask__bottom__item"> - <view class="evan-poster__mask__bottom__item__text">保存海报</view> - </button> - </view> - </view> + <shareImages ref="canvas" :canvasWidth="canvasWidth" :canvasHeight="canvasHeight" :shareTitle="shareTitle" + :goodsTitle="goodsTitle" :shareImage="shareImage" :goodsTitle2="goodsTitle2" :qrSize="qrSize" :qrUrl="qrUrl" + @success="shareSuccess" :canvasID="canvasID"> + </shareImages> </view> </template> <script> - - import { - mapGetters, - mapState - } from 'vuex' - let ENV = 'prod' + import shareImages from '@/components/hj-placard/shareImages.vue' export default { components: { - - }, - computed: { - - + shareImages }, data() { return { - memberId: '', - headUrl: '', - nickName: '', - id: null, - info: {}, - currentIndex: 0, - tags: [{ - icon: '/static/images/home/qqzx.png', - text: '全球精品' - }, - { - icon: '/static/images/home/jyps.png', - text: '正品保证' - }, - { - icon: '/static/images/home/shwy.png', - text: '商品包邮' - } - ], - isGroup: false, - groupId: null, - canvasWidth: 242, - canvasHeight: 430, - showBarcode: false, - ratio: 430 / 1920, - posterPadding: 0, - filePath: '', - isNewUserProduct: false, - canBuy: false + name: '', + canvasID: "myQrcode", + canvasImages: '', + canvasWidth: 375, // 宽度 + canvasHeight: 650, // 高度 + shareTitle: '我是这张图片的标题', // 分享标题 + goodsTitle: '\n', // 商品宣传标题 + goodsTitle2: '', + shareImage: 'https://hmy-flower.oss-cn-shanghai.aliyuncs.com/d4/d43cdefc7b8f4c3e91fb451a236a4435WechatIMG2882.jpg', // 背景图片 + qrSize: 100, // 二维码大小 + qrUrl: 'http://www.hmyxianhua.com/wx/jump?partnerUserId=1&partnerUserName=', // 生成二维码的链接 } + }, + onLoad() { + if (!this.currentInfo.partnerDTO) { + this.$message.showToast('请先完善合伙人信息') + return + } + this.name = this.currentInfo.partnerDTO.name || '佚名' + this.qrUrl = + `http://www.hmyxianhua.com/wx/jump?partnerUserId=${this.currentInfo.id||'-'}&partnerUserName=${this.name||'-'}` + this.goodsTitle = `${this.name||'-'}的推广二维码` + this.goodsTitle2 = `扫码注册绑定合伙人` + this.$message.showLoading() + setTimeout(() => { + this.createsShareImage() + }, 500) + setTimeout(() => { + this.$message.hideLoading() + }, 2000) }, methods: { - async getDetail() { - // const { - // code, - // data - // } = await productService.getDetail(this.id) - // if (code === 0) { - // this.info = data - // this.isNewUserProduct = data.IsNewUserTopic === 1 + // 生成分享图片 + createsShareImage() { + // console.log(this.$refs.canvas) + this.$refs.canvas.canvasCreate(); + }, + // 预览图片 + previewHandle() { + uni.previewImage({ + urls: [this.canvasImages], + }); + }, + // 回调图片地址 + shareSuccess(e) { + // console.log('地址',e) + this.canvasImages = e + }, + downloadImg() { + // this.$refs.canvas.downloadImg(); + uni.saveImageToPhotosAlbum({ + filePath: this.canvasImages, + success: function() { + console.log('save success'); + uni.showToast({ + title: '保存成功' + }) + }, + fail(res) { + console.error(res) + uni.showToast({ + title: '保存失败。', + icon: 'error' + }) + } + }) + + + }, + // 分享 + onShareAppMessage(res) { + // if (res.from === 'button') { + // console.log(res.target) // } - }, - async getGroupDetail() { - const { - code, - data - } = await assembleService.getAssembleDetail(this.id, this.groupId) - if (code === 0) { - this.info = data + return { + title: `${this.name||'-'}的推广二维码`, + path: this.canvasImages } - }, - onSwiperChange(e) { - this.currentIndex = e.detail.current - }, - async buy() { - - }, - onSpecConfirm(e) { - let specList = [] - if (Array.isArray(e.specs)) { - specList = e.specs.map((item) => { - return { - SpecName: item.SpecName, - SpecValue: item.SpecValue - } - }) - } - let orderInfo = { - ProductId: this.info.Id, - ProductSpecList: specList, - ProductCount: e.count, - ProductSaleType: this.isGroup ? 2 : 1, - ProductPayType: this.isGroup ? 1 : this.info.PayType - } - if (this.isGroup) { - orderInfo.GroupId = this.groupId - orderInfo.BookAmount = this.info.BookAmount - } else { - if (orderInfo.ProductPayType === 1) { - orderInfo.SaleAmount = this.info.SalePrice - } else { - orderInfo.SaleAmount = this.info.HuidouCount - } - } - uni.navigateTo({ - url: `./order?orderInfo=${JSON.stringify(orderInfo)}` - }) - }, - getPercent() { - if (!this.info.GroupRules || this.info.GroupRules.length === 0) { - return 0 - } - if (this.info.GroupCount > this.info.GroupRules[this.info.GroupRules.length - 1].GroupCountStart) { - return 0.85 * 630 - } else { - return this.info.GroupCount / this.info.GroupRules[this.info.GroupRules.length - 1].GroupCountStart * - 0.8 * 630 - } - }, - getLeftValue() { - if (!this.info.GroupRules || this.info.GroupRules.length === 0) { - if (this.info.GroupCount === 0) { - return 0 - } else { - return 630 * 0.8 - } - } else { - if (this.info.GroupCount > this.info.GroupRules[this.info.GroupRules.length - 1].GroupCountStart) { - return 630 * 0.85 - } else { - return 630 * 0.8 / Math.max(this.info.GroupRules[this.info.GroupRules.length - 1].GroupCountStart / - this.info.GroupCount, 1) - } - } - }, - formatCanvasSize(size) { - return Math.floor(this.ratio * size) - }, - async shareDetail() { - if (this.memberId) { - // #ifdef MP-WEIXIN - let params = `id=${this.info.Id}` - if (this.isGroup) { - params += `&groupId=${this.groupId}` - } - if (this.memberId) { - params += `&inviteId=${this.memberId}` - } - const { - code: sceneCode, - data: sceneData - } = await commonService.saveScene(encodeURIComponent(params)) - if (sceneCode === 0) { - const { - code, - data - } = await commonService.getUnlimitedBarcode('pages/home/product/detail', `posterId=${sceneData}`) - if (code === 0) { - const fsm = wx.getFileSystemManager() - this.filePath = `${wx.env.USER_DATA_PATH}/barcode_tmp_${(new Date).getTime()}.png` - fsm.writeFile({ - filePath: this.filePath, - data: data, - encoding: 'binary', - success: async () => { - const context = uni.createCanvasContext('barcode') - const headSize = this.formatCanvasSize(105) - const productSize = this.formatCanvasSize(540) - const canvasWidth = this.canvasWidth - const canvasHeight = this.canvasHeight - const headPath = await this.getImageInfo(this.headUrl) - const productPath = await this.getImageInfo(this.info.ImageUrlList[0]) - // 背景 - context.drawImage('/pages/home/static/images/sharebg.jpg', 0, 0, canvasWidth, - canvasHeight) - // 头像 - context.drawImage(headPath, this.formatCanvasSize(80), this.formatCanvasSize(70), headSize, headSize) - // 昵称 - context.font = `bold ${this.formatCanvasSize(40)}px system-ui` - context.setFillStyle('#000') - this.fillTextByLength(context, this.nickName, 20, this.formatCanvasSize(198), - this.formatCanvasSize(110)) - // 产品图 - context.drawImage(productPath, this.formatCanvasSize(260), this.formatCanvasSize(440), productSize, - productSize) - // 价格 - const priceWidth = this.formatCanvasSize(150) - const priceTop = this.formatCanvasSize(1240) - const priceLeft = this.formatCanvasSize(141) - // 当前价格 - if (this.showPrice) { - const price = (this.isGroup || this.info.PayType === 1) ? `¥${this.showPrice}` : this.showPrice - context.font = `bold ${this.formatCanvasSize(84)}px system-ui` - context.setFillStyle('#d92c21') - context.fillText(price, priceLeft, priceTop, priceWidth) - } - // 市场价格 - if (!this.isGroup && this.info.PayType === 1 && this.info.MarketPrice) { - context.font = `normal ${this.formatCanvasSize(54)}px system-ui` - context.setFillStyle('#61605e') - context.fillText(`¥${this.info.MarketPrice}`, priceLeft + priceWidth + 5, priceTop, priceWidth) - context.moveTo(priceLeft + priceWidth + 5, priceTop - this.formatCanvasSize(20)) - context.lineTo(priceLeft + priceWidth + 5 + context.measureText(`¥${this.info.MarketPrice}`).width + 2, - priceTop - this.formatCanvasSize(20)) - context.setStrokeStyle('#61605e') - context.stroke() - } - // 赠送汇豆 - if (this.info.GiveAwayHuidouCount) { - context.font = `normal ${this.formatCanvasSize(36)}px system-ui` - context.setFillStyle('#61605e') - context.fillText(`赠送${this.info.GiveAwayHuidouCount}汇豆`, priceLeft, priceTop + this.formatCanvasSize(36) + - 5, - priceWidth * 2) - } - // 商品名称 - let nameLeft = priceLeft + 2 * priceWidth + 10 - let nameTop = this.formatCanvasSize(1230) - context.font = `bold ${this.formatCanvasSize(50)}px system-ui` - context.setFillStyle('#000') - let nameWidth = 0 - // 换行次数 - let breakLineCount = 0 - for (let i = 0; i < this.info.Name.length; i++) { - const str = this.info.Name[i] - nameWidth += context.measureText(str).width - if (nameWidth > 80 && breakLineCount > 0) { - context.fillText('...', nameLeft, nameTop) - break - } - if (nameWidth > 90) { - nameTop += this.formatCanvasSize(74) - nameLeft = priceLeft + 2 * priceWidth + 10 - nameWidth = context.measureText(str).width - breakLineCount++ - } - context.fillText(str, nameLeft, nameTop) - nameLeft += context.measureText(str).width + 2 - } - // 二维码 - const barcodeSize = this.formatCanvasSize(250) - const barcodeLeft = this.formatCanvasSize(740) - const barcodeTop = this.formatCanvasSize(1500) - context.drawImage(this.filePath, barcodeLeft, barcodeTop, - barcodeSize, - barcodeSize) - this.showBarcode = true - this.$nextTick(() => { - context.draw(false, () => {}) - }) - }, - fail: (err) => { - this.$message.showToast('写入文件失败') - } - }) - } - } - // #endif - } else { - this.$message.confirm('登录后才能分享,是否立即登录?').then(() => { - uni.navigateTo({ - url: '/pages/account/login' - }) - }).catch(() => {}) - } - }, - fillTextSingleLine(context, text, maxLength, startLeft, startTop) { - let nameWidth = 0 - for (let i = 0; i < text.length; i++) { - const str = text[i] - nameWidth += context.measureText(str).width - if (nameWidth > maxLength - 10) { - context.fillText('...', startLeft, startTop) - break - } else { - context.fillText(str, startLeft, startTop) - startLeft += context.measureText(str).width + 2 - } - } - }, - fillTextByLength(context, text, len, startLeft, startTop) { - if (text.length > len - 3) { - text = text.substr(0, len - 3) + '...' - } - context.fillText(text, startLeft, startTop) - }, - getImageInfo(url) { - if (ENV === 'prod') { - url = url.replace(/http:\/\//g, 'https://') - } - return new Promise((resolve, reject) => { - uni.getImageInfo({ - src: url, - success: (res) => { - resolve(res.path) - }, - fail: (e) => { - reject(e) - } - }) - }) - }, - saveToAlbum() { - uni.canvasToTempFilePath({ - x: 0, - y: 0, - width: this.canvasWidth, - height: this.canvasHeight, - canvasId: 'barcode', - success: (res) => { - uni.saveImageToPhotosAlbum({ - filePath: res.tempFilePath, - success: () => { - this.$message.showToast('已为您保存至相册') - } - }) - } - }) - }, - hideBarcode() { - this.showBarcode = false - if (this.filePath) { - const fsm = wx.getFileSystemManager() - fsm.unlink({ - filePath: this.filePath, - success: () => { - this.filePath = '' - } - }) - } - }, - stopPop() { - // do nothing - }, - async getScene(id) { - const { - code, - data - } = await commonService.getScene(id) - if (code === 0) { - const productId = this.$utils.getBarcodeQueryString(data, 'id') - const inviteId = this.$utils.getBarcodeQueryString(data, 'inviteId') - const groupId = this.$utils.getBarcodeQueryString(data, 'groupId') - if (productId) { - this.id = productId - if (inviteId) { - this.$store.commit('account/SET_INVITEID', inviteId) - } - if (groupId) { - this.isGroup = true - this.groupId = groupId - this.getGroupDetail() - } else { - this.getDetail() - } - } - } - }, - setPosterPadding() { - const windowHeight = uni.getSystemInfoSync().windowHeight - this.posterPadding = (windowHeight - 126 - this.canvasHeight) / 2 + 'px' - } - }, - async onLoad(options) { - this.setPosterPadding() - this.id = options.id || '' - }, - onUnload() { - }, - onShareAppMessage() { - let params = `id=${this.info.Id}` - if (this.isGroup) { - params += `&groupId=${this.groupId}` - } - if (this.memberId) { - params += `&inviteId=${this.memberId}` - } - let path = `/pages/home/product/detail?${params}` - return { - title: this.info.Name, - path: path } } } </script> -<style lang="scss"> - .product-detail-page { - height: 100%; +<style scoped> + .button { display: flex; - flex-direction: column; - - &__scroll { - flex: 1; - overflow: auto; - - &__swiper { - position: relative; - width: 100%; - height: 446rpx; - background-color: #fff; - - &__target { - height: 100%; - - &__item { - display: flex; - align-items: center; - justify-content: center; - - &__img { - width: 400rpx; - height: 400rpx; - } - } - } - - &__page { - position: absolute; - bottom: 14rpx; - right: 40rpx; - height: 40rpx; - border-radius: 20rpx; - background-color: rgba(0, 0, 0, 0.6); - padding: 0 14rpx; - font-size: 28rpx; - color: #fff; - } - } - - &__default-image { - width: 100%; - height: 446rpx; - } - - &__info { - background-color: #fff; - padding: 18rpx 30rpx 28rpx 30rpx; - - &__title { - font-size: 32rpx; - color: #000; - font-weight: 500; - line-height: 44rpx; - margin-bottom: 14rpx; - } - - &__desc { - font-size: 28rpx; - color: #666; - line-height: 40rpx; - margin-bottom: 10rpx; - } - - &__bulter { - font-size: 28rpx; - color: #000; - line-height: 40rpx; - } - - &__tags { - display: flex; - align-items: center; - margin-top: 10rpx; - - &__item { - display: flex; - align-items: center; - margin-right: 44rpx; - - &__icon { - width: 28rpx; - height: 28rpx; - margin-right: 4rpx; - } - - &__text { - font-size: 24rpx; - color: #000; - } - } - - &__count { - flex: 1; - text-align: right; - font-size: 24rpx; - color: #666; - } - } - } - - &__desc { - padding: 30rpx; - background-color: #fff; - margin-top: 24rpx; - - &__title { - font-size: 36rpx; - color: #000; - font-weight: 500; - line-height: 50rpx; - margin-bottom: 26rpx; - } - } - - &__team { - background-color: #fff; - padding-bottom: 48rpx; - - &__title { - font-size: 28rpx; - color: #000; - padding: 0 30rpx; - font-weight: bold; - } - - &__main { - width: 750rpx; - padding: 60rpx 0; - position: relative; - display: flex; - justify-content: center; - - &__progress { - width: 630rpx; - height: 20rpx; - background-color: #d8d8d8; - border-radius: 16rpx; - - &__active { - height: 100%; - background-color: #d51d1d; - border-radius: 16rpx; - } - } - - &__price { - display: flex; - flex-direction: column; - align-items: center; - position: absolute; - min-width: 120rpx; - - &__line { - width: 2rpx; - height: 24rpx; - background-color: #979797; - - &.current { - background-color: #d51d1d; - } - } - - &__target { - font-size: 24rpx; - color: #000; - font-weight: bold; - } - - &__current { - font-size: 20rpx; - color: #d51d1d; - } - } - } - } - - &__team-intro { - padding: 8rpx 30rpx; - background-color: #EDE0CC; - margin-top: 24rpx; - - &__target { - font-size: 24rpx; - color: #9C753B; - font-weight: bold; - - &:not(:first-child) { - margin-top: 8rpx; - } - } - } - - &__team-info { - padding: 16rpx 30rpx 0 16rpx; - - &__line { - display: flex; - align-items: flex-start; - margin-bottom: 8rpx; - - &__label { - font-size: 28rpx; - color: #000; - } - - &__value { - font-size: 28rpx; - color: #000; - flex: 1; - } - } - } - } } -</style> +</style> \ No newline at end of file diff --git a/sub_pages/partner/partner-info/partner-code.vue b/sub_pages/partner/partner-info/partner-code.vue index 4041000..97cea11 100644 --- a/sub_pages/partner/partner-info/partner-code.vue +++ b/sub_pages/partner/partner-info/partner-code.vue @@ -3,7 +3,7 @@ <!-- --> <view class="contact-container"> <view class="container" @click="saveCode"> - + <canvas type="2d" id="myQrcode" class="code"></canvas> <view class="info"> <view class="desc"> -- Gitblit v1.9.3