1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  | <template xlang="wxml" minapp="mpvue">  
 |      <view class="tki-qrcode">  
 |          <!-- #ifndef MP-ALIPAY -->  
 |          <canvas class="tki-qrcode-canvas" :canvas-id="cid" :style="{width:cpSize+'px',height:cpSize+'px'}" />  
 |          <!-- #endif -->  
 |          <!-- #ifdef MP-ALIPAY -->  
 |          <canvas :id="cid" :width="cpSize" :height="cpSize" class="tki-qrcode-canvas" />  
 |          <!-- #endif -->  
 |          <image v-show="show" :src="result" :style="{width:cpSize+'px',height:cpSize+'px'}" />  
 |      </view>  
 |  </template>  
 |    
 |  <script>  
 |  import QRCode from "./qrcode.js"  
 |  let qrcode  
 |  export default {  
 |      name: "tki-qrcode",  
 |      props: {  
 |          cid: {  
 |              type: String,  
 |              default: 'tki-qrcode-canvas'  
 |          },  
 |          size: {  
 |              type: Number,  
 |              default: 200  
 |          },  
 |          unit: {  
 |              type: String,  
 |              default: 'upx'  
 |          },  
 |          show: {  
 |              type: Boolean,  
 |              default: true  
 |          },  
 |          val: {  
 |              type: String,  
 |              default: ''  
 |          },  
 |          background: {  
 |              type: String,  
 |              default: '#ffffff'  
 |          },  
 |          foreground: {  
 |              type: String,  
 |              default: '#000000'  
 |          },  
 |          pdground: {  
 |              type: String,  
 |              default: '#000000'  
 |          },  
 |          icon: {  
 |              type: String,  
 |              default: ''  
 |          },  
 |          iconSize: {  
 |              type: Number,  
 |              default: 40  
 |          },  
 |          lv: {  
 |              type: Number,  
 |              default: 3  
 |          },  
 |          onval: {  
 |              type: Boolean,  
 |              default: false  
 |          },  
 |          loadMake: {  
 |              type: Boolean,  
 |              default: false  
 |          },  
 |          usingComponents: {  
 |              type: Boolean,  
 |              default: true  
 |          },  
 |          showLoading: {  
 |              type: Boolean,  
 |              default: true  
 |          },  
 |          loadingText: {  
 |              type: String,  
 |              default: '二维码生成中'  
 |          },  
 |      },  
 |      data() {  
 |          return {  
 |              result: '',  
 |          }  
 |      },  
 |      methods: {  
 |          _makeCode() {  
 |              let that = this  
 |              if (!this._empty(this.val)) {  
 |                  qrcode = new QRCode({  
 |                      context: that, // 上下文环境  
 |                      canvasId:that.cid, // canvas-id  
 |                      usingComponents: that.usingComponents, // 是否是自定义组件  
 |                      showLoading: that.showLoading, // 是否显示loading  
 |                      loadingText: that.loadingText, // loading文字  
 |                      text: that.val, // 生成内容  
 |                      size: that.cpSize, // 二维码大小  
 |                      background: that.background, // 背景色  
 |                      foreground: that.foreground, // 前景色  
 |                      pdground: that.pdground, // 定位角点颜色  
 |                      correctLevel: that.lv, // 容错级别  
 |                      image: that.icon, // 二维码图标  
 |                      imageSize: that.iconSize,// 二维码图标大小  
 |                      cbResult: function (res) { // 生成二维码的回调  
 |                          that._result(res)  
 |                      },  
 |                  });  
 |              } else {  
 |                  uni.showToast({  
 |                      title: '二维码内容不能为空',  
 |                      icon: 'none',  
 |                      duration: 2000  
 |                  });  
 |              }  
 |          },  
 |          _clearCode() {  
 |              this._result('')  
 |              qrcode.clear()  
 |          },  
 |          _saveCode() {  
 |              let that = this;  
 |              if (this.result != "") {  
 |                  uni.saveImageToPhotosAlbum({  
 |                      filePath: that.result,  
 |                      success: function () {  
 |                          uni.showToast({  
 |                              title: '二维码保存成功',  
 |                              icon: 'success',  
 |                              duration: 2000  
 |                          });  
 |                      }  
 |                  });  
 |              }  
 |          },  
 |          _result(res) {  
 |              this.result = res;  
 |              this.$emit('result', res)  
 |          },  
 |          _empty(v) {  
 |              let tp = typeof v,  
 |                  rt = false;  
 |              if (tp == "number" && String(v) == "") {  
 |                  rt = true  
 |              } else if (tp == "undefined") {  
 |                  rt = true  
 |              } else if (tp == "object") {  
 |                  if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true  
 |              } else if (tp == "string") {  
 |                  if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true  
 |              } else if (tp == "function") {  
 |                  rt = false  
 |              }  
 |              return rt  
 |          }  
 |      },  
 |      watch: {  
 |          size: function (n, o) {  
 |              if (n != o && !this._empty(n)) {  
 |                  this.cSize = n  
 |                  if (!this._empty(this.val)) {  
 |                      setTimeout(() => {  
 |                          this._makeCode()  
 |                      }, 100);  
 |                  }  
 |              }  
 |          },  
 |          val: function (n, o) {  
 |              if (this.onval) {  
 |                  if (n != o && !this._empty(n)) {  
 |                      setTimeout(() => {  
 |                          this._makeCode()  
 |                      }, 0);  
 |                  }  
 |              }  
 |          }  
 |      },  
 |      computed: {  
 |          cpSize() {  
 |              if(this.unit == "upx"){  
 |                  return uni.upx2px(this.size)  
 |              }else{  
 |                  return this.size  
 |              }  
 |          }  
 |      },  
 |      mounted: function () {  
 |          if (this.loadMake) {  
 |              if (!this._empty(this.val)) {  
 |                  setTimeout(() => {  
 |                      this._makeCode()  
 |                  }, 0);  
 |              }  
 |          }  
 |      },  
 |  }  
 |  </script>  
 |  <style>  
 |  .tki-qrcode {  
 |    position: relative;  
 |  }  
 |  .tki-qrcode-canvas {  
 |    position: fixed;  
 |    top: -99999upx;  
 |    left: -99999upx;  
 |    z-index: -99999;  
 |  }  
 |  </style>  
 |  
  |