From c5aa40893e03fe8ac0b803f6360047703498384f Mon Sep 17 00:00:00 2001 From: youmengting <2080639302@qq.com> Date: Wed, 21 Jun 2023 10:27:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=95=86=E5=93=81=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5=E7=9A=84=E5=88=86=E4=BA=AB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.vue | 2 + common/share.js | 3 +- components/cc-shareMenu/cc-shareMenu.vue | 274 ++++ pages.json | 7 + pages/goods/goods.vue | 2 +- .../classify/goodsDetail/goodsDetail.vue | 197 ++- physical-merchants/classify/poster/poster.vue | 693 ++++++++++ .../classify/poster/weapp-qrcode.js | 1123 +++++++++++++++++ physical-merchants/static/img/ic_weixin.png | Bin 0 -> 2301 bytes .../static/img/icon_download.png | Bin 0 -> 1173 bytes physical-merchants/static/img/link.png | Bin 0 -> 2637 bytes physical-merchants/static/img/placard.png | Bin 0 -> 3050 bytes physical-merchants/static/img/rightTop.png | Bin 0 -> 4747 bytes .../static/img/share_wechat.png | Bin 0 -> 11385 bytes static/iconfont/cart.scss | 24 + 15 files changed, 2300 insertions(+), 25 deletions(-) create mode 100644 components/cc-shareMenu/cc-shareMenu.vue create mode 100644 physical-merchants/classify/poster/poster.vue create mode 100644 physical-merchants/classify/poster/weapp-qrcode.js create mode 100644 physical-merchants/static/img/ic_weixin.png create mode 100644 physical-merchants/static/img/icon_download.png create mode 100644 physical-merchants/static/img/link.png create mode 100644 physical-merchants/static/img/placard.png create mode 100644 physical-merchants/static/img/rightTop.png create mode 100644 physical-merchants/static/img/share_wechat.png diff --git a/App.vue b/App.vue index 334e8af..5547276 100644 --- a/App.vue +++ b/App.vue @@ -87,6 +87,7 @@ this.globalData.imgUrl = 'https://hsgcs.dctpay.com/filesystem/'; this.globalData.imageWxImg = 'https://hsgcs.dctpay.com/filesystem/wxApplets/'; this.globalData.imageqrImg = 'https://hsgcs.dctpay.com/filesystem/temporary/'; + this.globalData.h5url = "https://hsgcs.dctpay.com/hsgH5"; } if (accountInfo.miniProgram.envVersion == 'release') { this.globalData.url = 'https://hsg.dctpay.com/crest'; @@ -98,6 +99,7 @@ this.globalData.imgUrl = 'https://hsg.dctpay.com/filesystem/'; this.globalData.imageWxImg = 'https://hsg.dctpay.com/filesystem/wxApplets/'; this.globalData.imageqrImg = 'https://hsg.dctpay.com/filesystem/temporary/'; + this.globalData.h5url = "https://hsg.dctpay.com/hsgH5" /* 分享需要用到*/ } // #endif // #ifdef H5 diff --git a/common/share.js b/common/share.js index 2f96b1b..2f13c04 100644 --- a/common/share.js +++ b/common/share.js @@ -36,7 +36,7 @@ export default { /* https://hsg.dctpay.com/hsgH5/index.html?code=081Zb4ml2gamsb4L3nnl2UArrO1Zb4mc&state=1#/physical-merchants/classify/goods-search/goods-search?goodsLabel=%E9%9B%B6%E5%85%83%E8%B4%AD */ let api = require('../Utils/Api'); that.resVerifyWx = await api.verifyWx(datas); - // console.log(that.resVerifyWx,"doshare"); + that.h5ShareMethod(); }, @@ -101,6 +101,7 @@ export default { "/physical-merchants/classify/order/pay",//收银台页 "/physical-merchants/classify/order/paymentResult",//支付结果 "/physical-merchants/address/addNewAddress/addNewAddress",//添加地址 + "/physical-merchants/classify/poster/poster",//生成海报 ]; // #ifdef H5 diff --git a/components/cc-shareMenu/cc-shareMenu.vue b/components/cc-shareMenu/cc-shareMenu.vue new file mode 100644 index 0000000..1c9adb0 --- /dev/null +++ b/components/cc-shareMenu/cc-shareMenu.vue @@ -0,0 +1,274 @@ + + + + + \ No newline at end of file diff --git a/pages.json b/pages.json index f2de61e..867e99e 100644 --- a/pages.json +++ b/pages.json @@ -1108,6 +1108,13 @@ } }, + { + "path": "classify/poster/poster", + "style": { + "navigationBarTitleText": "生成海报", + "enablePullDownRefresh": false + } + }, // { // "path": "classify/goods-comment/goods-comment", // "style": { diff --git a/pages/goods/goods.vue b/pages/goods/goods.vue index ccdd20b..be00f6e 100644 --- a/pages/goods/goods.vue +++ b/pages/goods/goods.vue @@ -81,7 +81,7 @@ - + 赠送卡券 diff --git a/physical-merchants/classify/goodsDetail/goodsDetail.vue b/physical-merchants/classify/goodsDetail/goodsDetail.vue index 2546f17..ce11344 100644 --- a/physical-merchants/classify/goodsDetail/goodsDetail.vue +++ b/physical-merchants/classify/goodsDetail/goodsDetail.vue @@ -4,7 +4,8 @@ - + {{currentSwiper+1}}/{{goodsDetail.bannerImg.length}} @@ -40,7 +41,7 @@ 保障 - 破损包退 · 假一赔四 + 破损包退 · 假一赔四 @@ -63,7 +64,7 @@ ———— 商品详情 ———— - + @@ -82,14 +83,17 @@ + + + - - + - + @@ -149,7 +153,7 @@ import cartChoose from '@/components/cart-choose/cart-choose.vue' import uniGoodsNav from '@/components/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue' - + import ccShareMenu from '@/components/cc-shareMenu/cc-shareMenu.vue' import { findGoodsDetailById, @@ -158,6 +162,8 @@ findGoodsSkuByGoodsId } from '@/Utils/physicalObject.js'; const app = getApp(); + + export default { data() { return { @@ -183,7 +189,28 @@ text: '购物车', info: 0, color: "#646566" - } + }, + { + icon: 'icon-y share', + text: '分享', + }, + ], + rightTopSrc:'', + shareList: [{ + type: 1, + icon: '/physical-merchants/static/img/link.png', + text: '复制链接' + }, + { + type: 2, + icon: '/physical-merchants/static/img/placard.png', + text: '生成海报' + }, + { + type: 3, + icon: '/physical-merchants/static/img/share_wechat.png', + text: '分享给好友' + }, ], buttonGroup: [{ text: '加入购物车', @@ -222,7 +249,7 @@ } return - } + } }, onLoad(options) { this.goodsId = options.goodsId; @@ -233,7 +260,8 @@ wybPopup, cartChoose, uniGoodsNav, - noMore + noMore, + ccShareMenu, }, onShow() { this.refreshCartNum(); @@ -282,17 +310,19 @@ }); findGoodsDetailById(params).then(res => { - - setTimeout(()=>{ - + + setTimeout(() => { + uni.hideLoading(); if (res.return_code == '000000') { this.goodsDetail = res.return_data; - this.goodsDetail.bannerImg = res.return_data.bannerImg.split(",").map(temp => this + this.goodsDetail.bannerImg = res.return_data.bannerImg.split(",").map(temp => + this .imageUrl + temp); - this.goodsDetail.detailImg = res.return_data.detailImg.split(",").map(temp => this + this.goodsDetail.detailImg = res.return_data.detailImg.split(",").map(temp => + this .imageUrl + temp); // console.log(this.goodsDetail, ) @@ -305,10 +335,10 @@ duration: 2000 }) } - - },100) - - + + }, 100) + + }) }, @@ -351,6 +381,72 @@ // }) }, + // 点击分享 + shareMenuClick(item) { + + let currentRoutes = getCurrentPages(); // 获取当前打开过的页面路由数组 + let route = currentRoutes[currentRoutes.length - 1]; + let str = app.globalData.h5url + '?accountId=0000016&key=&code=' + decodeURIComponent(route.$page + .fullPath); + + if (item.type == 1) { + /* 复制链接*/ + + this.copyText(str); + } else if (item.type == 2) { + /* 生成海报*/ + + let obj = { + priceShop: '¥' + this.goodsDetail.originalPrice, //原价 + headImgs: this.goodsDetail.bannerImg, + goodsName: this.goodsDetail.name, + goodsPrice: '¥' + this.goodsDetail.price, //现价 + goLink: str, + recommendCodeGoods: '', //小程序码 + } + // console.log(obj,"obj"); + uni.navigateTo({ + url: "/physical-merchants/classify/poster/poster?obj=" + encodeURIComponent(JSON.stringify( + obj)) + }) + } else if (item.type == 3) { + /* 分享给好友 */ + // #ifdef H5 + console.log("点击了分享好友") + this.rightTopSrc="../../static/img/rightTop.png" + + setTimeout(()=>{ + this.rightTopSrc = "" + },3000) + + // #endif + } + + }, + // 复制 + copyText(text) { + // #ifdef H5 + this.$copyText(text).then( + res => { + uni.showToast({ + title: '复制成功' + }) + } + ) + // #endif + // #ifndef H5 + uni.setClipboardData({ + data: text, + success: () => { + uni.showToast({ + title: '复制成功' + }) + } + }) + // #endif + + + }, // 客服,收藏,购物车图标点击事件 onClick(e) { @@ -365,6 +461,16 @@ return } + + if (e.index == 1) { + console.log("点击分享") + this.$refs.share.toggleMask(); + + return + + } + + // 收藏 // if(e.index == 1){ // this.isShowCang = !this.isShowCang; @@ -469,6 +575,51 @@ + \ No newline at end of file diff --git a/physical-merchants/classify/poster/poster.vue b/physical-merchants/classify/poster/poster.vue new file mode 100644 index 0000000..ab45be4 --- /dev/null +++ b/physical-merchants/classify/poster/poster.vue @@ -0,0 +1,693 @@ + + + + \ No newline at end of file diff --git a/physical-merchants/classify/poster/weapp-qrcode.js b/physical-merchants/classify/poster/weapp-qrcode.js new file mode 100644 index 0000000..2db45d9 --- /dev/null +++ b/physical-merchants/classify/poster/weapp-qrcode.js @@ -0,0 +1,1123 @@ +//Core code comes from https://github.com/davidshimjs/qrcodejs + +var QRCode; + +(function() { + /** + * Get the type by string length + * + * @private + * @param {String} sText + * @param {Number} nCorrectLevel + * @return {Number} type + */ + function _getTypeNumber(sText, nCorrectLevel) { + var nType = 1; + var length = _getUTF8Length(sText); + + for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) { + var nLimit = 0; + + switch (nCorrectLevel) { + case QRErrorCorrectLevel.L: + nLimit = QRCodeLimitLength[i][0]; + break; + case QRErrorCorrectLevel.M: + nLimit = QRCodeLimitLength[i][1]; + break; + case QRErrorCorrectLevel.Q: + nLimit = QRCodeLimitLength[i][2]; + break; + case QRErrorCorrectLevel.H: + nLimit = QRCodeLimitLength[i][3]; + break; + } + + if (length <= nLimit) { + break; + } else { + nType++; + } + } + + if (nType > QRCodeLimitLength.length) { + throw new Error("Too long data"); + } + + return nType; + } + + function _getUTF8Length(sText) { + var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a'); + return replacedText.length + (replacedText.length != sText ? 3 : 0); + } + + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + this.parsedData = []; + + // Added to support UTF-8 Characters + for (var i = 0, l = this.data.length; i < l; i++) { + var byteArray = []; + var code = this.data.charCodeAt(i); + + if (code > 0x10000) { + byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18); + byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12); + byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[3] = 0x80 | (code & 0x3F); + } else if (code > 0x800) { + byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12); + byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[2] = 0x80 | (code & 0x3F); + } else if (code > 0x80) { + byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6); + byteArray[1] = 0x80 | (code & 0x3F); + } else { + byteArray[0] = code; + } + + this.parsedData.push(byteArray); + } + + this.parsedData = Array.prototype.concat.apply([], this.parsedData); + + if (this.parsedData.length != this.data.length) { + this.parsedData.unshift(191); + this.parsedData.unshift(187); + this.parsedData.unshift(239); + } + } + + QR8bitByte.prototype = { + getLength: function(buffer) { + return this.parsedData.length; + }, + write: function(buffer) { + for (var i = 0, l = this.parsedData.length; i < l; i++) { + buffer.put(this.parsedData[i], 8); + } + } + }; + + + // QRCodeModel + function QRCodeModel(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = []; + } + QRCodeModel.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() { + 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; + } + } + 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 = QRCodeModel.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); + 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; + } + } + 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; + } + } + 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; + } + } + } + } + }; + QRCodeModel.PAD0 = 0xEC; + QRCodeModel.PAD1 = 0x11; + QRCodeModel.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); + } + 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 + + ")"); + } + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + while (true) { + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCodeModel.PAD0, 8); + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCodeModel.PAD1, 8); + } + return QRCodeModel.createBytes(buffer, rsBlocks); + }; + QRCodeModel.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; + }; + var QRMode = { + MODE_NUMBER: 1 << 0, + MODE_ALPHA_NUM: 1 << 1, + MODE_8BIT_BYTE: 1 << 2, + MODE_KANJI: 1 << 3 + }; + var QRErrorCorrectLevel = { + L: 1, + M: 0, + Q: 3, + H: 2 + }; + var QRMaskPattern = { + PATTERN000: 0, + PATTERN001: 1, + PATTERN010: 2, + PATTERN011: 3, + PATTERN100: 4, + PATTERN101: 5, + PATTERN110: 6, + PATTERN111: 7 + }; + var QRUtil = { + PATTERN_POSITION_TABLE: [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ], + G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0), + G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0), + G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1), + 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) { + 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) { + 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) { + 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; + 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); + } + } + } + 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; + } + } + } + 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; + } + } + } + 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; + } + }; + 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; + } + + 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); + } + return new QRPolynomial(num, 0).mod(e); + } + }; + + function QRRSBlock(totalCount, dataCount) { + this.totalCount = totalCount; + this.dataCount = dataCount; + } + QRRSBlock.RS_BLOCK_TABLE = [ + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + [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 = []; + 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; + } + }; + + function QRBitBuffer() { + this.buffer = []; + 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++; + } + }; + var QRCodeLimitLength = [ + [17, 14, 11, 7], + [32, 26, 20, 14], + [53, 42, 32, 24], + [78, 62, 46, 34], + [106, 84, 60, 44], + [134, 106, 74, 58], + [154, 122, 86, 64], + [192, 152, 108, 84], + [230, 180, 130, 98], + [271, 213, 151, 119], + [321, 251, 177, 137], + [367, 287, 203, 155], + [425, 331, 241, 177], + [458, 362, 258, 194], + [520, 412, 292, 220], + [586, 450, 322, 250], + [644, 504, 364, 280], + [718, 560, 394, 310], + [792, 624, 442, 338], + [858, 666, 482, 382], + [929, 711, 509, 403], + [1003, 779, 565, 439], + [1091, 857, 611, 461], + [1171, 911, 661, 511], + [1273, 997, 715, 535], + [1367, 1059, 751, 593], + [1465, 1125, 805, 625], + [1528, 1190, 868, 658], + [1628, 1264, 908, 698], + [1732, 1370, 982, 742], + [1840, 1452, 1030, 790], + [1952, 1538, 1112, 842], + [2068, 1628, 1168, 898], + [2188, 1722, 1228, 958], + [2303, 1809, 1283, 983], + [2431, 1911, 1351, 1051], + [2563, 1989, 1423, 1093], + [2699, 2099, 1499, 1139], + [2809, 2213, 1579, 1219], + [2953, 2331, 1663, 1273] + ]; + + // QRCode object + QRCode = function(canvasId, vOption) { + this._htOption = { + width: 256, + height: 256, + typeNumber: 4, + colorDark: "#000000", + colorLight: "#ffffff", + correctLevel: QRErrorCorrectLevel.H + }; + + if (typeof vOption === 'string') { + vOption = { + text: vOption + }; + } + + // Overwrites options + if (vOption) { + for (var i in vOption) { + this._htOption[i] = vOption[i]; + } + } + + this._oQRCode = null; + this.canvasId = canvasId + + if (this._htOption.text && this.canvasId) { + this.makeCode(this._htOption.text); + } + }; + + QRCode.prototype.makeCode = function(sText) { + this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption + .correctLevel); + this._oQRCode.addData(sText); + this._oQRCode.make(); + this.makeImage(); + }; + + QRCode.prototype.makeImage = function() { + var _oContext + if (this._htOption.usingIn) { + _oContext = wx.createCanvasContext(this.canvasId, this._htOption.usingIn) + } else { + _oContext = wx.createCanvasContext(this.canvasId) + } + var _htOption = this._htOption; + var oQRCode = this._oQRCode + + var nCount = oQRCode.getModuleCount(); + var nWidth = _htOption.width / nCount; + var nHeight = _htOption.height / nCount; + var nRoundedWidth = Math.round(nWidth); + var nRoundedHeight = Math.round(nHeight); + + if (_htOption.image && _htOption.image != '') { + _oContext.drawImage(_htOption.image, 0, 0, _htOption.width, _htOption.height) + } + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + var bIsDark = oQRCode.isDark(row, col); + var nLeft = col * nWidth; + var nTop = row * nHeight; + _oContext.setStrokeStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight) + // _oContext.setStrokeStyle('yellow') + _oContext.setLineWidth(1) + _oContext.setFillStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight) + // _oContext.setFillStyle('red') + // if (bIsDark) { + _oContext.fillRect(nLeft, nTop, nWidth, nHeight); + // } + + // 안티 앨리어싱 방지 처리 + // if (bIsDark) { + _oContext.strokeRect( + Math.floor(nLeft) + 0.5, + Math.floor(nTop) + 0.5, + nRoundedWidth, + nRoundedHeight + ); + + _oContext.strokeRect( + Math.ceil(nLeft) - 0.5, + Math.ceil(nTop) - 0.5, + nRoundedWidth, + nRoundedHeight + ); + // } + // _oContext.fillRect( + // Math.floor(nLeft) + 0.5, + // Math.floor(nTop) + 0.5, + // nRoundedWidth, + // nRoundedHeight + // ); + // _oContext.fillRect( + // Math.ceil(nLeft) - 0.5, + // Math.ceil(nTop) - 0.5, + // nRoundedWidth, + // nRoundedHeight + // ); + // _oContext.clearRect( + // Math.floor(nLeft) + 0.5, + // Math.floor(nTop) + 0.5, + // nRoundedWidth, + // nRoundedHeight + // ); + // _oContext.clearRect( + // Math.ceil(nLeft) - 0.5, + // Math.ceil(nTop) - 0.5, + // nRoundedWidth, + // nRoundedHeight + // ); + } + } + + _oContext.draw() + }; + + // 保存为图片,将临时路径传给回调 + QRCode.prototype.exportImage = function(callback) { + if (!callback) { + return + } + wx.canvasToTempFilePath({ + x: 0, + y: 0, + width: this._htOption.width, + height: this._htOption.height, + destWidth: this._htOption.width, + destHeight: this._htOption.height, + canvasId: this.canvasId, + success: function(res) { + console.log(res.tempFilePath) + callback(res.tempFilePath) + } + }) + } + + QRCode.CorrectLevel = QRErrorCorrectLevel; +})(); + +module.exports = QRCode diff --git a/physical-merchants/static/img/ic_weixin.png b/physical-merchants/static/img/ic_weixin.png new file mode 100644 index 0000000000000000000000000000000000000000..b9755726449ff8e84544b46c9d5571d3fb7071d6 GIT binary patch literal 2301 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 literal 0 HcmV?d00001 diff --git a/physical-merchants/static/img/link.png b/physical-merchants/static/img/link.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6e49d8781ee1ded7e312955341c3394cce8ad8 GIT binary patch literal 2637 zcmV-T3bOTyP)Px<2T4RhRCr$PoDGazRTY5GnK!#^XZ?eSKNO5bQjCT~sU$_4+KLj2h!i6wQHez; zLPP0J_ntdjG(HUM&bx2AmJPK06eZRm75}LgNtHH=wcx*KtcX8R+h7z8)vfK$yklMch0%zeskWt_n!NMFjuS*Kx>xf48a^si$O34a}K6O0v1hm zO=NnW_tILeHovE*=QIE~EeL}7xm@n}znS@E0C13*59M;X<9{RK!D_X7=;+a-2VK`a zW|2u^Q!@&4WMpKS<2Wk-;Qat_cH&k5JPrWg1b|10=;tZyq*CoD%#o3i*E^203;^B< z0G9y3D^qzNt$Y9xcLhPPx3{-<&%nUIzcZ*K(qu`^@|Y0N8Tm$dRqC>yBsTM-#?$39|M4s;#6{i%0AZL-+$@awQK)l>c25e*LCxSLSa7uoNH=) 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 literal 0 HcmV?d00001 diff --git a/physical-merchants/static/img/rightTop.png b/physical-merchants/static/img/rightTop.png new file mode 100644 index 0000000000000000000000000000000000000000..28a98fcbde2b43113196fbaa7e37a2fb9c4377ad GIT binary patch literal 4747 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