From fe97f78b9a343ee9fa45a3531d03d73dcd1df31b Mon Sep 17 00:00:00 2001 From: qx <1084500556@qq.com> Date: 星期三, 06 八月 2025 10:15:12 +0800 Subject: [PATCH] :测试提交“ --- uni_modules/Sansnn-uQRCode/components/uqrcode/uqrcode.vue | 1131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,131 insertions(+), 0 deletions(-) diff --git a/uni_modules/Sansnn-uQRCode/components/uqrcode/uqrcode.vue b/uni_modules/Sansnn-uQRCode/components/uqrcode/uqrcode.vue new file mode 100644 index 0000000..4fefaac --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/uqrcode/uqrcode.vue @@ -0,0 +1,1131 @@ +<template> + <view class="uqrcode" :class="{ 'uqrcode-hide': hide }" :style="{ width: `${templateOptions.width}px`, height: `${templateOptions.height}px` }"> + <view class="uqrcode-canvas-wrapper"> + <!-- 鐢诲竷 --> + <!-- #ifndef APP-NVUE --> + <canvas class="uqrcode-canvas" :id="canvasId" :canvas-id="canvasId" :type="canvasType" :style="{ + width: `${templateOptions.canvasWidth}px`, + height: `${templateOptions.canvasHeight}px`, + transform: templateOptions.canvasTransform + }" v-if="templateOptions.canvasDisplay" @click="onClick"></canvas> + <!-- #endif --> + + <!-- nvue鐢╣canvas --> + <!-- #ifdef APP-NVUE --> + <gcanvas class="uqrcode-canvas" ref="gcanvas" :style="{ + width: `${templateOptions.canvasWidth}px`, + height: `${templateOptions.canvasHeight}px` + }" v-if="templateOptions.canvasDisplay" @click="onClick"></gcanvas> + <!-- #endif --> + </view> + + <!-- 鍔犺浇鏁堟灉 --> + <view class="uqrcode-makeing" v-if="loading === undefined ? makeing : loading"> + <slot name="loading"> + <image class="uqrcode-makeing-image" :style="{ width: `${templateOptions.size / 4}px`, height: `${templateOptions.size / 4}px` }" + src="data:image/gif;base64,R0lGODlhAAEAAfIEAOHh4SSsWuDg4N3d3f///wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDYuMC1jMDAyIDc5LjE2NDQ4OCwgMjAyMC8wNy8xMC0yMjowNjo1MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjAyODhGMzM4RDEwMTExRUM4MDhCRkVBQkE2QUZDQzkwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjAyODhGMzM5RDEwMTExRUM4MDhCRkVBQkE2QUZDQzkwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDI4OEYzMzZEMTAxMTFFQzgwOEJGRUFCQTZBRkNDOTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDI4OEYzMzdEMTAxMTFFQzgwOEJGRUFCQTZBRkNDOTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQ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"> + </image> + </slot> + </view> + + <!-- 閿欒澶勭悊 --> + <view class="uqrcode-error" v-if="isError" @click="onClick"> + <slot name="error" :error="error"> + <text class="uqrcode-error-message">{{ error.errMsg }}</text> + </slot> + </view> + + <!-- H5淇濆瓨鎻愮ず --> + <!-- #ifdef H5 --> + <view class="uqrcode-h5-save" v-if="isH5Save"> + <slot name="h5save" :tempFilePath="tempFilePath"> + <image class="uqrcode-h5-save-image" :src="tempFilePath"></image> + <text class="uqrcode-h5-save-text">{{ h5SaveIsDownload ? '鑻ヤ繚瀛樺け璐ワ紝' : '' }}璇烽暱鎸変簩缁寸爜杩涜淇濆瓨</text> + </slot> + <view class="uqrcode-h5-save-close" @click.stop="isH5Save = false"> + <view class="uqrcode-h5-save-close-before"></view> + <view class="uqrcode-h5-save-close-after"></view> + </view> + </view> + <!-- #endif --> + </view> +</template> + +<script> + // #ifdef VUE3 + import { + toRaw + } from 'vue'; + // #endif + + /* 寮曞叆uQRCode鏍稿績js */ + import UQRCode from '../../js_sdk/uqrcode/uqrcode'; + + /* 寮曞叆nvue鎵�闇�妯″潡 */ + // #ifdef APP-NVUE + import { + enable, + WeexBridge + } from '../../js_sdk/gcanvas'; + const modal = weex.requireModule('modal'); + // #endif + + /* 寮曞叆闃熷垪 */ + import { + queueDraw, + queueLoadImage + } from '../../common/queue'; + /* 寮曞叆缂撳瓨鍥剧墖 */ + import { + cacheImageList + } from '../../common/cache'; + + let instance = null; + + export default { + name: 'uqrcode', + props: { + /** + * canvas缁勪欢id + */ + canvasId: { + type: String, + required: true // canvasId鍦ㄥ井淇″皬绋嬪簭鍒濆鍊间笉鑳戒负绌猴紝created涓祴鍊间篃涓嶈锛屽繀椤荤粰涓�涓�硷紝鍚﹀垯鎸傝浇缁勪欢鍚庢棤娉曠粯鍒躲�備笉鑰冭檻鐢ㄩ殢鏈篿d锛寀uid + }, + /** + * 浜岀淮鐮佸唴瀹� + */ + value: { + type: [String, Number] + }, + /** + * 閫夐」 + */ + options: { + type: Object, + default: () => { + return {}; + } + }, + /** + * 浜岀淮鐮佸ぇ灏� + */ + size: { + type: [String, Number], + default: 200 + }, + /** + * 浜岀淮鐮佸昂瀵稿崟浣� + */ + sizeUnit: { + type: String, + default: 'px' + }, + /** + * 瀵煎嚭鐨勬枃浠剁被鍨� + */ + fileType: { + type: String, + default: 'png' + }, + /** + * 鏄惁鍒濆鍖栫粍浠跺悗灏卞紑濮嬬敓鎴� + */ + start: { + type: Boolean, + default: true + }, + /** + * 鏄惁鏁版嵁鍙戠敓鏀瑰彉鑷姩閲嶇粯 + */ + auto: { + type: Boolean, + default: true + }, + /** + * 闅愯棌缁勪欢 + */ + hide: { + type: Boolean, + default: false + }, + /** + * canvas 绫诲瀷锛屽井淇″皬绋嬪簭榛樿浣跨敤2d锛岄潪2d寰俊瀹樻柟宸叉斁寮冪淮鎶わ紝闂姣旇緝澶� + * 娉ㄦ剰锛氬井淇″皬绋嬪簭type2d鎵嬫満涓婃甯革紝PC涓婂井淇″唴鎵撳紑灏忕▼搴弔oDataURL鎶ラ敊锛岀湅鍚庢湡寰俊瀹樻柟鍥㈤槦浼氫笉浼氬仛鍏煎锛屼笉鍏煎鐨勮瘽鍙兘鍦ㄨ嚜琛屽垽鏂湪PC浣跨敤闈�2d锛屾垨鑰呯洿鎺ユ彁绀虹敤鎴疯鍦ㄦ墜鏈轰笂鎿嶄綔锛屽井淇″洟闃熺殑娴锋姤涓績灏忕▼搴忓氨鏄繖涔堝仛鐨� + */ + type: { + type: String, + default: () => { + // #ifdef MP-WEIXIN + return '2d'; + // #endif + // #ifndef MP-WEIXIN + return 'normal'; + // #endif + } + }, + /** + * 闃熷垪缁樺埗锛屼富瑕侀拡瀵筃Vue绔� + */ + queue: { + type: Boolean, + default: false + }, + /** + * 鏄惁闃熷垪鍔犺浇鍥剧墖锛屽彲鍑忓皯canvas鍙戣捣鐨勭綉缁滆祫婧愯姹傦紝鑺傜渷鏈嶅姟鍣ㄨ祫婧� + */ + isQueueLoadImage: { + type: Boolean, + default: false + }, + /** + * loading鎬� + */ + loading: { + type: Boolean, + default: undefined + }, + /** + * H5淇濆瓨鍗宠嚜鍔ㄤ笅杞斤紙鍦ㄦ敮鎸佺殑鐜涓嬶級锛岄粯璁alse涓轰粎寮瑰眰鎻愮ず鐢ㄦ埛闇�瑕侀暱鎸夊浘鐗囦繚瀛橈紝涓嶄細鑷姩涓嬭浇 + */ + h5SaveIsDownload: { + type: Boolean, + default: false + }, + /** + * H5涓嬭浇鍚嶇О + */ + h5DownloadName: { + type: String, + default: 'uQRCode' + } + }, + data() { + return { + canvas: undefined, + canvasType: undefined, + canvasContext: undefined, + makeDelegate: undefined, + drawDelegate: undefined, + toTempFilePathDelegate: undefined, + makeExecuted: false, + makeing: false, + drawing: false, + isError: false, + error: undefined, + isH5Save: false, + tempFilePath: '', + templateOptions: { + size: 0, + width: 0, // 缁勪欢瀹藉害 + height: 0, + canvasWidth: 0, // canvas瀹藉害 + canvasHeight: 0, + canvasTransform: '', + canvasDisplay: false + }, + uqrcodeOptions: { + data: '' + }, + plugins: [], + makeingPattern: [ + [ + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true] + ], + [ + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, false, false, false], + [true, true, true, true, true, true, false, true, true, true], + [true, true, true, true, true, true, false, true, true, true], + [true, true, true, true, true, true, false, true, true, true] + ], + [ + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, true, true, true, true, false, false, false], + [true, true, true, true, true, true, true, false, false, false], + [true, true, true, true, true, true, true, false, false, false], + [true, true, true, false, false, false, false, true, true, true], + [true, true, true, false, false, false, false, true, true, true] + ], + [ + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, false, false, false, false, false, false, false], + [true, true, true, false, false, false, false, false, false, false], + [true, true, true, false, false, false, false, false, false, false], + [true, true, true, false, false, false, false, false, false, false], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true], + [true, true, true, true, true, true, true, true, true, true] + ] + ] + }; + }, + watch: { + type: { + handler(val) { + const types = ['2d']; + if (types.includes(val)) { + this.canvasType = val; + } else { + this.canvasType = undefined; + } + }, + immediate: true + }, + value: { + handler() { + if (this.auto) { + this.remake(); + } + } + }, + size: { + handler() { + if (this.auto) { + this.remake(); + } + } + }, + options: { + handler() { + if (this.auto) { + this.remake(); + } + }, + deep: true + }, + makeing: { + handler(val) { + if (!val) { + if (typeof this.toTempFilePathDelegate === 'function') { + this.toTempFilePathDelegate(); + } + } + } + } + }, + mounted() { + this.templateOptions.size = this.sizeUnit == 'rpx' ? uni.upx2px(this.size) : this.size; + this.templateOptions.width = this.templateOptions.size; + this.templateOptions.height = this.templateOptions.size; + this.templateOptions.canvasWidth = this.templateOptions.size; + this.templateOptions.canvasHeight = this.templateOptions.size; + if (this.canvasType == '2d') { + // #ifndef MP-WEIXIN + this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size / + this.templateOptions.canvasHeight})`; + // #endif + } else { + this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size / + this.templateOptions.canvasHeight})`; + } + if (this.start) { + this.make(); + } + }, + methods: { + /** + * 鑾峰彇妯℃澘閫夐」 + */ + getTemplateOptions() { + var size = this.sizeUnit == 'rpx' ? uni.upx2px(this.size) : this.size; + return deepReplace(this.templateOptions, { + size, + width: size, + height: size + }); + }, + /** + * 鑾峰彇鎻掍欢閫夐」 + */ + getUqrcodeOptions() { + return deepReplace(this.options, { + data: String(this.value), + size: Number(this.templateOptions.size) + }); + }, + /** + * 閲嶇疆鐢诲竷 + */ + resetCanvas(callback) { + this.templateOptions.canvasDisplay = false; + this.$nextTick(() => { + this.templateOptions.canvasDisplay = true; + this.$nextTick(() => { + callback && callback(); + }); + }); + }, + /** + * 缁樺埗浜岀淮鐮� + */ + async draw(callback = {}, isDrawDelegate = false) { + if (typeof callback.success != 'function') { + callback.success = () => {}; + } + if (typeof callback.fail != 'function') { + callback.fail = () => {}; + } + if (typeof callback.complete != 'function') { + callback.complete = () => {}; + } + + if (this.drawing) { + if (!isDrawDelegate) { + this.drawDelegate = () => { + this.draw(callback, true); + }; + return; + } + } else { + this.drawing = true; + } + + if (!this.canvasId) { + console.error('[uQRCode]: canvasId must be set!'); + this.isError = true; + this.drawing = false; + callback.fail({ + errMsg: '[uQRCode]: canvasId must be set!' + }); + callback.complete({ + errMsg: '[uQRCode]: canvasId must be set!' + }); + return; + } + if (!this.value) { + console.error('[uQRCode]: value must be set!'); + this.isError = true; + this.drawing = false; + callback.fail({ + errMsg: '[uQRCode]: value must be set!' + }); + callback.complete({ + errMsg: '[uQRCode]: value must be set!' + }); + return; + } + + /* 缁勪欢鏁版嵁 */ + this.templateOptions = this.getTemplateOptions(); + /* uQRCode閫夐」 */ + this.uqrcodeOptions = this.getUqrcodeOptions(); + /* 绾犻敊绛夌骇鍏煎瀛楁瘝鍐欐硶 */ + if (typeof this.uqrcodeOptions.errorCorrectLevel === 'string') { + this.uqrcodeOptions.errorCorrectLevel = UQRCode.errorCorrectLevel[this.uqrcodeOptions.errorCorrectLevel]; + } + /* nvue涓嶆敮鎸佸姩鎬佷慨鏀筭canvas灏哄锛岄櫎nvue澶栵紝榛樿浣跨敤useDynamicSize */ + // #ifndef APP-NVUE + if (typeof this.options.useDynamicSize === 'undefined') { + this.uqrcodeOptions.useDynamicSize = true; + } + // #endif + // #ifdef APP-NVUE + if (typeof this.options.useDynamicSize === 'undefined') { + this.uqrcodeOptions.useDynamicSize = false; + } + // if (typeof this.options.drawReserve === 'undefined') { + // this.uqrcodeOptions.drawReserve = true; + // } + // #endif + + /* 鑾峰彇uQRCode瀹炰緥 */ + const qr = instance = new UQRCode(); + /* 娉ㄥ唽鎵╁睍 */ + this.plugins.forEach(p => qr.register(p.plugin)); + /* 璁剧疆uQRCode閫夐」 */ + qr.setOptions(this.uqrcodeOptions); + /* 璋冪敤鍒朵綔浜岀淮鐮佹柟娉� */ + qr.make(); + + /* 鑾峰彇canvas涓婁笅鏂� */ + let canvasContext = null; + // #ifndef APP-NVUE + if (this.canvasType === '2d') { + // #ifdef MP-WEIXIN + /* 寰俊灏忕▼搴忚幏鍙朿anvas2d涓婁笅鏂囨柟寮� */ + const canvas = (this.canvas = await new Promise(resolve => { + uni + .createSelectorQuery() + .in(this) // 鍦ㄧ粍浠跺唴浣跨敤闇�瑕� + .select(`#${this.canvasId}`) + .fields({ + node: true, + size: true + }) + .exec(res => { + resolve(res[0].node); + }); + })); + canvasContext = this.canvasContext = canvas.getContext('2d'); + /* 2d鐨勭粍浠惰缃楂樹笌瀹為檯canvas缁樺埗瀹介珮涓嶆槸涓�涓紝鎵撲釜姣旀柟锛岀粍浠秙ize=200锛宑anvas.width璁剧疆涓�100锛岄偅涔堢粯鍒跺嚭鏉ュ氨鏄�100=200锛岀粍浠秙ize=400锛宑anvas.width璁剧疆涓�800锛岀粯鍒跺ぇ灏忚繕鏄�800=400锛屾墍浠ユ棤闇�鐞嗕細涓嬫柟杩斿洖鐨刣ynamicSize鏄灏戯紝鎸塪pr閲嶆柊璧嬪�肩粰canvas鍗冲彲 */ + this.templateOptions.canvasWidth = qr.size; + this.templateOptions.canvasHeight = qr.size; + this.templateOptions.canvasTransform = ''; + /* 浣跨敤dynamicSize+scale锛屽彲浠ヨВ鍐冲皬鍧楅棿鍑虹幇鐧界嚎闂锛宒pr鍙互瑙e喅妯$硦闂 */ + const dpr = uni.getSystemInfoSync().pixelRatio; + canvas.width = qr.dynamicSize * dpr; + canvas.height = qr.dynamicSize * dpr; + canvasContext.scale(dpr, dpr); + /* 寰俊灏忕▼搴忚幏鍙栧浘鍍忔柟寮� */ + qr.loadImage = this.getLoadImage(function(src) { + /* 灏忕▼搴忎笅鑾峰彇缃戠粶鍥剧墖淇℃伅闇�鍏堥厤缃甦ownload鍩熷悕鐧藉悕鍗曟墠鑳界敓鏁� */ + return new Promise((resolve, reject) => { + const img = canvas.createImage(); + img.src = src; + img.onload = () => { + resolve(img); + }; + img.onerror = err => { + reject(err); + }; + }); + }); + // #endif + // #ifndef MP-WEIXIN + /* 闈炲井淇″皬绋嬪簭涓嶆敮鎸�2d锛屽垏鎹㈠洖uniapp鑾峰彇canvas涓婁笅鏂囨柟寮� */ + canvasContext = this.canvasContext = uni.createCanvasContext(this.canvasId, this); + /* 浣跨敤dynamicSize锛屽彲浠ヨВ鍐冲皬鍧楅棿鍑虹幇鐧界嚎闂锛屽啀閫氳繃scale缂╂斁鑷硈ize锛屼娇鍏惰揪鍒版墍璁惧昂瀵� */ + this.templateOptions.canvasWidth = qr.dynamicSize; + this.templateOptions.canvasHeight = qr.dynamicSize; + this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size / + this.templateOptions.canvasHeight})`; + /* uniapp鑾峰彇鍥惧儚鏂瑰紡 */ + qr.loadImage = this.getLoadImage(function(src) { + return new Promise((resolve, reject) => { + if (src.startsWith('http')) { + uni.getImageInfo({ + src, + success: res => { + resolve(res.path); + }, + fail: err => { + reject(err); + } + }); + } else { + if (src.startsWith('.')) { + console.error('[uQRCode]: 鏈湴鍥剧墖璺緞浠呮敮鎸佺粷瀵硅矾寰勶紒'); + throw new Error('[uQRCode]: local image path only supports absolute path!'); + } else { + resolve(src); + } + } + }); + }); + // #endif + } else { + /* uniapp鑾峰彇canvas涓婁笅鏂囨柟寮� */ + canvasContext = this.canvasContext = uni.createCanvasContext(this.canvasId, this); + /* 浣跨敤dynamicSize锛屽彲浠ヨВ鍐冲皬鍧楅棿鍑虹幇鐧界嚎闂锛屽啀閫氳繃scale缂╂斁鑷硈ize锛屼娇鍏惰揪鍒版墍璁惧昂瀵� */ + this.templateOptions.canvasWidth = qr.dynamicSize; + this.templateOptions.canvasHeight = qr.dynamicSize; + this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size / + this.templateOptions.canvasHeight})`; + /* uniapp鑾峰彇鍥惧儚鏂瑰紡 */ + qr.loadImage = this.getLoadImage(function(src) { + return new Promise((resolve, reject) => { + /* getImageInfo鍦ㄥ井淇″皬绋嬪簭鐨刡ug锛氭湰鍦拌矾寰勮繑鍥炶矾寰勪細鎶婂紑澶寸殑/鎴�../绉婚櫎锛屽鑷磋矾寰勯敊璇紝瑙e喅鏂规硶锛氶檺鍒跺彧鑳戒娇鐢ㄧ粷瀵硅矾寰� */ + if (src.startsWith('http')) { + uni.getImageInfo({ + src, + success: res => { + resolve(res.path); + }, + fail: err => { + reject(err); + } + }); + } else { + if (src.startsWith('.')) { + console.error('[uQRCode]: 鏈湴鍥剧墖璺緞浠呮敮鎸佺粷瀵硅矾寰勶紒'); + throw new Error('[uQRCode]: local image path only supports absolute path!'); + } else { + resolve(src); + } + } + }); + }); + } + // #endif + // #ifdef APP-NVUE + /* NVue鑾峰彇canvas涓婁笅鏂囨柟寮� */ + const gcanvas = this.$refs['gcanvas']; + const canvas = enable(gcanvas, { + bridge: WeexBridge + }); + canvasContext = this.canvasContext = canvas.getContext('2d'); + /* NVue鑾峰彇鍥惧儚鏂瑰紡 */ + qr.loadImage = this.getLoadImage(function(src) { + return new Promise((resolve, reject) => { + /* getImageInfo鍦╪vue鐨刡ug锛氳幏鍙栧悓涓�涓矾寰勭殑鍥剧墖淇℃伅锛屽悓涓�鏃堕棿绗竴娆¤幏鍙栨垚鍔燂紝鍚庣画澶辫触锛岀寽娴嬫槸鍐欏叆鏈湴鏃朵骇鐢熸枃浠跺啓鍏ュ啿绐侊紝鎵�浠ユ病鏈夎繑鍥烇紝鐗瑰埆鏄浜庣綉缁滆祫婧� --- 宸插疄鐜伴槦鍒楃粯鍒讹紝宸茶В鍐虫闂 */ + if (src.startsWith('.')) { + console.error('[uQRCode]: 鏈湴鍥剧墖璺緞浠呮敮鎸佺粷瀵硅矾寰勶紒'); + throw new Error('[uQRCode]: local image path only supports absolute path!'); + } else { + uni.getImageInfo({ + src, + success: res => { + resolve(res.path); + }, + fail: err => { + reject(err); + } + }); + } + }); + }); + // #endif + + /* 璁剧疆uQRCode瀹炰緥鐨刢anvas涓婁笅鏂� */ + qr.canvasContext = canvasContext; + /* 寤舵椂绛夊緟椤甸潰閲嶆柊缁樺埗瀹屾瘯 */ + setTimeout(() => { + /* 浠庢彃浠惰幏鍙栧叿浣撹璋冪敤鍝竴涓墿灞曞嚱鏁� */ + var plugin = this.plugins.find(p => p.name == qr.style); + var drawCanvasName = plugin ? plugin.drawCanvas : 'drawCanvas'; + /* 铏界劧qr[drawCanvasName]鏄洿鎺ヨ繑鍥濸romise鐨勶紝浣嗙敱浜巎s鍐呴儴this鎸囧悜闂锛屾晠涓嶈兘鐩存帴exec(qr[drawCanvasName])姝ゆ柟寮忔墽琛岋紝闇�瑕佹敼鎴恊xec(() => qr[drawCanvasName]())鎵嶈兘姝g‘鑾峰彇this */ + var drawCanvas; + if (this.queue) { + drawCanvas = () => queueDraw.exec(() => qr[drawCanvasName]()); + // drawCanvas = () => queueDraw.exec(() => new Promise((resolve, reject) => { + // setTimeout(() => { + // qr[drawCanvasName]().then(resolve).catch(reject); + // }, 1000); + // })); + } else { + drawCanvas = () => qr[drawCanvasName](); + } + /* 璋冪敤缁樺埗鏂规硶灏嗕簩缁寸爜鍥炬缁樺埗鍒癱anvas涓� */ + drawCanvas() + .then(() => { + if (this.drawDelegate) { + /* 楂橀閲嶇粯绾犳 */ + let delegate = this.drawDelegate; + this.drawDelegate = undefined; + delegate(); + } else { + this.drawing = false; + callback.success(); + } + }) + .catch(err => { + console.log(err); + if (this.drawDelegate) { + /* 楂橀閲嶇粯绾犳 */ + let delegate = this.drawDelegate; + this.drawDelegate = undefined; + delegate(); + } else { + this.drawing = false; + this.isError = true; + callback.fail(err); + } + }) + .finally(() => { + callback.complete(); + }); + }, 300); + }, + /** + * 鐢熸垚浜岀淮鐮� + */ + make(callback = {}) { + this.makeExecuted = true; + this.makeing = true; + this.isError = false; + + if (typeof callback.success != 'function') { + callback.success = () => {}; + } + if (typeof callback.fail != 'function') { + callback.fail = () => {}; + } + if (typeof callback.complete != 'function') { + callback.complete = () => {}; + } + + this.resetCanvas(() => { + clearTimeout(this.makeDelegate); + this.makeDelegate = setTimeout(() => { + this.draw({ + success: () => { + setTimeout(() => { + callback.success(); + this.complete(true); + }, 300); + }, + fail: err => { + callback.fail(err); + this.error = err; + this.complete(false, err.errMsg); + }, + complete: () => { + callback.complete(); + this.makeing = false; + } + }); + }, 300); + }); + }, + /** + * 閲嶆柊鐢熸垚 + */ + remake(callback) { + this.$emit('change'); + this.make(callback); + }, + /** + * 鐢熸垚瀹屾垚 + */ + complete(success = true, errMsg = '') { + if (success) { + this.$emit('complete', { + success + }); + } else { + this.$emit('complete', { + success, + errMsg + }); + } + }, + /** + * 瀵煎嚭涓存椂璺緞 + */ + toTempFilePath(callback = {}) { + if (typeof callback.success != 'function') { + callback.success = () => {}; + } + if (typeof callback.fail != 'function') { + callback.fail = () => {}; + } + if (typeof callback.complete != 'function') { + callback.complete = () => {}; + } + + if (!this.makeExecuted) { + console.error('[uQRCode]: make() 鏂规硶浠庢湭璋冪敤锛佽鍏堟垚鍔熻皟鐢� make() 鍚庡啀杩涜鎿嶄綔銆�'); + var err = { + errMsg: '[uQRCode]: make() method has never been executed! please execute make() successfully before operating.' + }; + callback.fail(err); + callback.complete(err); + return; + } + + if (this.isError) { + callback.fail(this.error); + callback.complete(this.error); + return; + } + + if (this.makeing) { + /* 濡傛灉杩樺湪鐢熸垚鐘舵�侊紝閭e綋鍓嶆搷浣滃皢鎵樼鍒板鎵橈紝鐩戝惉鐢熸垚瀹屾垚鍚庡啀閫氳繃濮旀墭澶嶈皟褰撳墠鏂规硶 */ + this.toTempFilePathDelegate = () => { + this.toTempFilePath(callback); + }; + return; + } else { + this.toTempFilePathDelegate = null; + } + + // #ifndef APP-NVUE + if (this.canvasType === '2d') { + // #ifdef MP-WEIXIN + try { + let dataURL = null; + // #ifdef VUE3 + dataURL = toRaw(this.canvas) + .toDataURL(); + // #endif + // #ifndef VUE3 + dataURL = this.canvas.toDataURL(); + // #endif + callback.success({ + tempFilePath: dataURL + }); + callback.complete({ + tempFilePath: dataURL + }); + } catch (e) { + callback.fail(e); + callback.complete(e); + } + // #endif + } else { + uni.canvasToTempFilePath({ + canvasId: this.canvasId, + fileType: this.fileType, + width: Number(this.templateOptions.canvasWidth), + height: Number(this.templateOptions.canvasHeight), + destWidth: Number(this.templateOptions.size), + destHeight: Number(this.templateOptions.size), + success: res => { + callback.success(res); + }, + fail: err => { + callback.fail(err); + }, + complete: () => { + callback.complete(); + } + }, + this + ); + } + // #endif + // #ifdef APP-NVUE + const dpr = uni.getSystemInfoSync().pixelRatio; + this.canvasContext.toTempFilePath( + 0, + 0, + this.templateOptions.canvasWidth * dpr, + this.templateOptions.canvasHeight * dpr, + this.templateOptions.size * dpr, + this.templateOptions.size * dpr, + '', + 1, + res => { + callback.success(res); + callback.complete(res); + } + ); + // #endif + }, + /** + * 淇濆瓨 + */ + save(callback = {}) { + if (typeof callback.success != 'function') { + callback.success = () => {}; + } + if (typeof callback.fail != 'function') { + callback.fail = () => {}; + } + if (typeof callback.complete != 'function') { + callback.complete = () => {}; + } + + this.toTempFilePath({ + success: res => { + // #ifndef H5 + if (this.canvasType === '2d') { + // #ifdef MP-WEIXIN + /* 闇�瑕佸皢 data:image/png;base64, 杩欐鍘婚櫎 writeFile 鎵嶈兘姝e父鎵撳紑鏂囦欢锛屽惁鍒欐槸鎹熷潖鏂囦欢锛屾棤娉曟墦寮� */ + const reg = new RegExp('^data:image/png;base64,', 'g'); + const dataURL = res.tempFilePath.replace(reg, ''); + const fs = wx.getFileSystemManager(); + const tempFilePath = `${wx.env.USER_DATA_PATH}/${new Date().getTime()}${ + Math.random() + .toString() + .split('.')[1] + }.png`; + fs.writeFile({ + filePath: tempFilePath, // 瑕佸啓鍏ョ殑鏂囦欢璺緞 (鏈湴璺緞) + data: dataURL, // base64鍥剧墖 + encoding: 'base64', + success: res1 => { + uni.saveImageToPhotosAlbum({ + filePath: tempFilePath, + success: res2 => { + callback.success(res2); + }, + fail: err2 => { + callback.fail(err2); + }, + complete: () => { + callback.complete(); + } + }); + }, + fail: err => { + callback.fail(err); + }, + complete: () => { + callback.complete(); + } + }); + // #endif + } else { + uni.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: res1 => { + callback.success(res1); + }, + fail: err1 => { + callback.fail(err1); + }, + complete: () => { + callback.complete(); + } + }); + } + // #endif + + // #ifdef H5 + /* 鍙互鍦ㄧ數鑴戞祻瑙堝櫒涓嬭浇锛岀Щ鍔ㄧiOS涓嶈锛屽畨鍗撳井淇℃祻瑙堝櫒涓嶈锛屽畨鍗撳閮ㄦ祻瑙堝櫒鍙互 */ + this.isH5Save = true; + this.tempFilePath = res.tempFilePath; + if (this.h5SaveIsDownload) { + const aEle = document.createElement('a'); + aEle.download = this.h5DownloadName; // 璁剧疆涓嬭浇鐨勬枃浠跺悕锛岄粯璁ゆ槸'涓嬭浇' + aEle.href = res.tempFilePath; + document.body.appendChild(aEle); + aEle.click(); + aEle.remove(); // 涓嬭浇涔嬪悗鎶婂垱寤虹殑鍏冪礌鍒犻櫎 + } + callback.success({ + errMsg: 'ok' + }); + callback.complete({ + errMsg: 'ok' + }); + // #endif + }, + fail: err => { + callback.fail(err); + callback.complete(err); + } + }); + }, + /** + * 娉ㄥ唽click浜嬩欢 + */ + onClick(e) { + this.$emit('click', e); + }, + /** + * 鑾峰彇瀹炰緥 + */ + getInstance() { + return instance; + }, + /** + * 娉ㄥ唽鎵╁睍锛岀粍浠朵粎鏀寔娉ㄥ唽type涓簊tyle鐨刣rawCanvas鎵╁睍 + * @param {Object} plugin + */ + registerStyle(plugin) { + if (plugin.Type != 'style') { + console.warn('[uQRCode]: registerStyle 浠呮敮鎸佹敞鍐� style 绫诲瀷鐨勬墿灞曪紒'); + return { + errMsg: 'registerStyle 浠呮敮鎸佹敞鍐� style 绫诲瀷鐨勬墿灞曪紒' + }; + } + if (typeof plugin === 'function') { + this.plugins.push({ + plugin, + name: plugin.Name, + drawCanvas: plugin.DrawCanvas + }); + } + }, + getLoadImage(loadImage) { + var that = this; + if (typeof loadImage == 'function') { + return function(src) { + /* 鍒ゆ柇鏄惁鏄槦鍒楀姞杞藉浘鐗囩殑 */ + if (that.isQueueLoadImage) { + /* 瑙e喅iOS APP||NVUE鍚屾椂缁樺埗澶氫釜浜岀淮鐮佸鑷村浘鐗囦涪澶遍渶浣跨敤闃熷垪 */ + return queueLoadImage.exec(() => { + return new Promise((resolve, reject) => { + setTimeout(() => { + const cache = cacheImageList.find(x => x.src == src); + if (cache) { + resolve(cache.img); + } else { + loadImage(src) + .then(img => { + cacheImageList.push({ + src, + img + }); + resolve(img); + }) + .catch(err => { + reject(err); + }); + } + }, 10); + }); + }); + } else { + return loadImage(src); + } + }; + } else { + return function(src) { + return Promise.resolve(src); + }; + } + } + } + }; + + /** + * 瀵硅薄灞炴�ф繁搴︽浛鎹� + * @param {Object} o 鍘熷瀵硅薄/榛樿瀵硅薄/琚浛鎹㈢殑瀵硅薄 + * @param {Object} r 浠庤繖涓璞¢噷鍙栧�兼浛鎹㈠埌o瀵硅薄閲� + * @return {Object} 鏇挎崲鍚庣殑鏂板璞� + */ + function deepReplace(o = {}, r = {}, c = false) { + let obj; + if (c) { + // 浠庢簮鏇挎崲 + obj = o; + } else { + // 涓嶆浛鎹㈡簮锛宑opy涓�浠藉浠芥潵鏇挎崲 + obj = { + ...o + }; + } + for (let k in r) { + var vr = r[k]; + if (vr != undefined) { + if (vr.constructor == Object) { + obj[k] = this.deepReplace(obj[k], vr); + } else if (vr.constructor == String && !vr) { + obj[k] = obj[k]; + } else { + obj[k] = vr; + } + } + } + return obj; + } +</script> + +<style scoped> + .uqrcode { + position: relative; + } + + .uqrcode-hide { + position: fixed; + left: 7500rpx; + } + + .uqrcode-canvas { + transform-origin: top left; + } + + .uqrcode-makeing { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 10; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + justify-content: center; + align-items: center; + } + + .uqrcode-makeing-image { + /* #ifndef APP-NVUE */ + display: block; + max-width: 120px; + max-height: 120px; + /* #endif */ + } + + .uqrcode-error { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + justify-content: center; + align-items: center; + } + + .uqrcode-error-message { + font-size: 12px; + color: #939291; + } + + /* #ifdef H5 */ + .uqrcode-h5-save { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 100; + background-color: rgba(0, 0, 0, 0.68); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + + .uqrcode-h5-save-image { + width: 512rpx; + height: 512rpx; + padding: 32rpx; + } + + .uqrcode-h5-save-text { + margin-top: 20rpx; + font-size: 32rpx; + font-weight: 700; + color: #ffffff; + } + + .uqrcode-h5-save-close { + position: relative; + margin-top: 72rpx; + width: 60rpx; + height: 60rpx; + border: 2rpx solid #ffffff; + border-radius: 60rpx; + padding: 10rpx; + } + + .uqrcode-h5-save-close-before { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) rotate(45deg); + width: 40rpx; + height: 4rpx; + background: #ffffff; + } + + .uqrcode-h5-save-close-after { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) rotate(-45deg); + width: 40rpx; + height: 4rpx; + background: #ffffff; + } + + /* #endif */ +</style> -- Gitblit v1.8.0