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