Browse Source

对接基本完成

谢杰标 3 năm trước cách đây
mục cha
commit
8fd359e048
40 tập tin đã thay đổi với 4451 bổ sung136 xóa
  1. 82 91
      common/filters.js
  2. 1 1
      common/tool.js
  3. 1 0
      main.js
  4. 22 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/App.vue
  5. 114 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/README.md
  6. 1206 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/components/tki-qrcode/qrcode.js
  7. 205 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/components/tki-qrcode/tki-qrcode.vue
  8. 11 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/main.js
  9. 60 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/manifest.json
  10. 29 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/package.json
  11. 16 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/pages.json
  12. 132 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/pages/index/index.vue
  13. 2 0
      node_modules/_tki-qrcode@0.1.6@tki-qrcode/static/README.md
  14. 22 0
      node_modules/tki-qrcode/App.vue
  15. 114 0
      node_modules/tki-qrcode/README.md
  16. 1206 0
      node_modules/tki-qrcode/components/tki-qrcode/qrcode.js
  17. 205 0
      node_modules/tki-qrcode/components/tki-qrcode/tki-qrcode.vue
  18. 11 0
      node_modules/tki-qrcode/main.js
  19. 60 0
      node_modules/tki-qrcode/manifest.json
  20. 29 0
      node_modules/tki-qrcode/package.json
  21. 16 0
      node_modules/tki-qrcode/pages.json
  22. 132 0
      node_modules/tki-qrcode/pages/index/index.vue
  23. 2 0
      node_modules/tki-qrcode/static/README.md
  24. 5 1
      package.json
  25. 37 2
      pages.json
  26. 217 0
      pages/actdetail/index.vue
  27. 13 3
      pages/actlist/index.vue
  28. 51 0
      pages/bill/index.vue
  29. 200 0
      pages/cashout/index.vue
  30. 75 0
      pages/cashout/record.vue
  31. 85 0
      pages/commission/index.vue
  32. 21 21
      pages/index/index.vue
  33. 0 10
      pages/login/login.vue
  34. 41 6
      pages/vcard/index.vue
  35. BIN
      static/image/cash_bg.png
  36. BIN
      static/image/icon_com.png
  37. BIN
      static/image/icon_tick.png
  38. BIN
      static/image/icon_wallet.png
  39. 21 1
      uni.scss
  40. 7 0
      utils/act.js

+ 82 - 91
common/filters.js

@@ -2,97 +2,88 @@
  * 时间戳转换成时间
  * @param {*} time
  */
-const formDate = (time, formate = 'yyyy-mm-dd hh:mm:ss') => {
-    var padDate = function (va) {
-        va = va < 10 ? '0' + va : va
-        return va
+const formDate = (time, formate = "yyyy-mm-dd hh:mm:ss") => {
+  var padDate = function (va) {
+    va = va < 10 ? "0" + va : va;
+    return va;
+  };
+  if (time) {
+    var value = new Date(time * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+    // var value = new Date(parseFloat(time))
+    var year = value.getFullYear();
+    var month = padDate(value.getMonth() + 1);
+    var day = padDate(value.getDate());
+    var hour = padDate(value.getHours());
+    var minutes = padDate(value.getMinutes());
+    var seconds = padDate(value.getSeconds());
+    let res = "";
+    switch (formate) {
+      case "mm-dd": {
+        res = month + "-" + day;
+        break;
+      }
+      case "yyyy-mm-dd": {
+        res = year + "-" + month + "-" + day;
+        break;
+      }
+      case "yyyy-mm": {
+        res = year + "-" + month;
+        break;
+      }
+      case "mm月dd日": {
+        res = month + "月" + day + "日";
+        break;
+      }
+      case "yyyy年mm月dd日": {
+        res = year + "年" + month + "月" + day + "日";
+        break;
+      }
+      case "yyyy年mm月": {
+        res = year + "年" + month + "月";
+        break;
+      }
+      case "hh:mm": {
+        res = hour + ":" + minutes;
+        break;
+      }
+      case "yyyy-mm-dd hh:mm": {
+        res = year + "-" + month + "-" + day + " " + hour + ":" + minutes;
+        break;
+      }
+      case "yyyy.mm.dd":
+        res = year + "." + month + "." + day;
+        break;
+      case "yyyy-mm-dd hh:mm:ss":
+      default: {
+        res =
+          year +
+          "-" +
+          month +
+          "-" +
+          day +
+          " " +
+          hour +
+          ":" +
+          minutes +
+          ":" +
+          seconds;
+        break;
+      }
     }
-    if (time) {
-        var value = new Date(time * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
-        // var value = new Date(parseFloat(time))
-        var year = value.getFullYear()
-        var month = padDate(value.getMonth() + 1)
-        var day = padDate(value.getDate())
-        var hour = padDate(value.getHours())
-        var minutes = padDate(value.getMinutes())
-        var seconds = padDate(value.getSeconds())
-        let res = ''
-        switch (formate) {
-            case 'mm-dd': {
-                res =  month + '-' + day
-                break
-            }
-            case 'yyyy-mm-dd': {
-                res = year + '-' + month + '-' + day
-                break
-            }
-            case 'yyyy-mm': {
-                res = year + '-' + month
-                break
-            }
-            case 'mm月dd日': {
-                res = month + '月' + day + '日'
-                break
-            }
-            case 'yyyy年mm月dd日': {
-                res = year + '年' + month + '月' + day + '日'
-                break
-            }
-            case 'yyyy年mm月': {
-                res = year + '年' + month + '月'
-                break
-            }
-            case 'hh:mm': {
-                res = hour + ':' + minutes
-                break
-            }
-            case 'yyyy-mm-dd hh:mm': {
-                res = year + '-' + month + '-' + day + ' ' + hour + ':' + minutes
-                break
-            }
-            case 'yyyy.mm.dd':
-                res = year + '.' + month + '.' + day
-                break
-            case 'yyyy-mm-dd hh:mm:ss':
-            default: {
-                res = year + '-' + month + '-' + day + ' ' + hour + ':' + minutes + ':' + seconds
-                break
-            }
-        }
-        return res
-    }
-    return '--'
-}
+    return res;
+  }
+  return "--";
+};
 
-const formDateStr = (time) => {
-    var padDate = function (va) {
-        va = va < 10 ? '0' + va : va
-        return va
-    }
-    if (time) {
-        var value = new Date(parseFloat(time))
-        var year = value.getFullYear()
-        var month = padDate(value.getMonth() + 1)
-        var day = value.getDate()
-        var hour = padDate(value.getHours())
-        var minutes = padDate(value.getMinutes())
-        var seconds = padDate(value.getSeconds())
-        let res = ''
-        if(day == new Date().getDate()){
-             res = '今天' + hour + ':' + minutes
-             return res
-        }
-        if(year == new Date().getFullYear() ){
-            res =  month + '-' + padDate(day) + ' ' + hour + ':' + minutes
-            return res
-        }
-        res = year + '-' + month + '-' + padDate(day)
-        return res
-    }
-    return '--'
-}
+const toFixed = (number) => {
+  if (number > 0) {
+    return number.toFixed(2);
+  } else {
+    return "0.00";
+  }
+};
 
-export default { 
-	formDate,
-	formDateStr
-}
+export default {
+  formDate,
+  toFixed,
+};

+ 1 - 1
common/tool.js

@@ -5,7 +5,7 @@ export default {
   isGoLogin(isBack = true) {
     if (!uni.getStorageSync("user_account")) {
       uni.navigateTo({
-        url: "/pages4/login/login?isBack=" + isBack,
+        url: "/pages/login/login?isBack=" + isBack,
       });
       return true;
     } else {

+ 1 - 0
main.js

@@ -24,6 +24,7 @@ uni.$u.setConfig({
   },
 });
 Vue.filter('formate', filters['formDate'])
+Vue.filter('toFixed', filters['toFixed'])
 // #ifndef VUE3
 import Vue from "vue";
 Vue.config.productionTip = false;

+ 22 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/App.vue

@@ -0,0 +1,22 @@
+<script>
+	export default {
+		onLaunch: function () {
+			// console.log('App Launch')
+		},
+		onShow: function () {
+			// console.log('App Show')
+		},
+		onHide: function () {
+			// console.log('App Hide')
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+
+	page,
+	view {
+		display: flex;/* uni-app默认使用flex布局。因为flex布局有利于跨更多平台,尤其是采用原生渲染的平台。如不了解flex布局,请参考http://www.w3.org/TR/css3-flexbox/。若不需要flex布局可删除本行*/
+	}
+</style>

+ 114 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/README.md

@@ -0,0 +1,114 @@
+# uni-app 二维码生成器
+### 作者:诗小柒
+
+1. H5、微信小程序、支付宝小程序、APP,其它平台的小程序没有测试
+2. 使用canvas生成  
+3. 可设置二维码背景色,前景色,角标色  
+4. 可设置二维码logo  
+
+## 重要的事情说3遍 重要的事情说3遍 重要的事情说3遍
+
+1. IOS、Android真机都可以正常生成二维码
+2. 使用的时候出现无法生成二维码或空白的请先github直接打包下载,问题依旧,请github上直接提出问题并配图
+3. 有问题请说明问题原因,这样我才好定位,否则我也无法解决
+4. 如果此插件有帮助到你请打5分或赞赏我,你的支持是我更新的动力
+
++ 图片1 是微信小程序真机实测
++ 图片2 是微信小程序模拟实测
++ 图片3 是支付宝小程序模拟器实测
++ 图片4 是安卓真机实测
++ 图片5 H5
+
+## 开始使用
+NPM 
+```
+npm i tki-qrcode
+```
+GIT 
+```
+git clone https://github.com/q310550690/uni-app-qrcode
+```
+
+### 更新说明
+
+* 0.1.6 新增cid属性,支持同一个页面使用多个二维码组件
+* 0.1.5 新增showLoading、loadingText属性
+* 0.1.4 新增usingComponents属性,修复非自定义组件下 v-if 无法生成二维码的问题(非自定义组件下设置为false)
+* 0.1.3 新增unit属性
+* 0.1.2 适配新版uni-app编译器 感谢 "DCloud_UNI_Trust" (如果github上下载后使用新版HbuilderX1.7.1.20190320编译后无法启动请等待Dcloud更新即可)
+* 0.1.1 新增监听val值变化时自动生成二维码(onval)、新增组件初始化时自动生成二维码(loadMake) 属性,具体说明看文档说明
+* 0.1.0 常规更新
+* 0.0.9 修复小程序真机生成二维码错乱问题(其实这是小程序canvas的锅)
+* 0.0.8 修复官方 uni.canvasToTempFilePath 在有些平台返回字段不统一而导致的支付宝无法生成二维码的问题。
+* 0.0.7 常规修复
+* 0.0.6 新增角标色、二维码logo
+
+### 使用方法
+在 `script` 中引入组件
+``` javascript
+import tkiQrcode from "@/components/tki-qrcode/tki-qrcode.vue"
+export default {
+    components: {tkiQrcode}
+}
+```
+在 `template` 中使用
+``` javascript
+<view class="qrimg">
+    <tki-qrcode
+    ref="qrcode"
+    :cid="cid"
+    :val="val"
+    :size="size"
+    :unit="unit"
+    :background="background"
+    :foreground="foreground"
+    :pdground="pdground"
+    :icon="icon"
+    :iconSize="iconsize"
+    :lv="lv" 
+    :onval="onval"
+    :loadMake="loadMake"
+    :usingComponents="usingComponents"
+    :showLoading="showLoading"
+    :loadingText="loadingText"
+    @result="qrR" />
+</view>
+```
+### 属性
+
+|属性名|类型|默认值|可选值|说明|
+|:-|:-:|:--:|:--:|-:|
+|cid|String|tki-qrcode-canvas| |canvasId,页面存在多个二维码组件时需设置不同的ID|
+|size|Number|200| |生成的二维码大小|
+|unit|String|upx|px|大小单位尺寸|
+|show|Boolean|true| |默认使用组件中的image标签显示二维码|
+|val|String|二维码| |要生成的内容|
+|background|String|#000000| |二维码背景色|
+|foreground|String|#ffffff| |二维码前景色|
+|pdground|String|#ffffff| |二维码角标色|
+|icon|String| | |二维码图标URL(必须是本地图片,网络图需要先下载至本地)|
+|iconSize|Number|40<br/>注意此大小不会跟随二维码size 动态变化,设置时需注意大小,不要太大,以免无法识别| |二维码图标大小|
+|lv|Number|3(一般不用设置)| |容错级别|
+|onval|Boolean|false| |监听val值变化自动重新生成二维码|
+|loadMake|Boolean|false| |组件初始化完成后自动生成二维码,val需要有值|
+|usingComponents|Boolean|true| false |是否使用了自定义组件模式(主要是为了修复非自定义组件模式时 v-if 无法生成二维码的问题)|
+|showLoading|Boolean|true| false |是否显示loading|
+|loadingText|String|二维码生成中| |loading文字|
+
+### 方法
+|方法名|参数|默认值|说明|
+|:-|:-:|:--:|-:|
+|_makeCode()| | |生成二维码|
+|_clearCode()| | |清空二维码(清空二维码会触发result回调 返回值为空)|
+|_saveCode()| | |保存二维码到图库|
+
+### 事件
+|事件名|返回值|说明|
+|:-|:-:|-:|
+|result|生成的图片base64或图片临时地址|返回二维码路径 注:_clearCode()后返回空|
+
+
+### 感谢
+
+[uni-app](https://uniapp.dcloud.io/ "uni-app")
+[qrcode](https://github.com/aralejs/qrcode "qrcode")

+ 1206 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/components/tki-qrcode/qrcode.js

@@ -0,0 +1,1206 @@
+let QRCode = {};
+(function () {
+    /**
+     * 获取单个字符的utf8编码
+     * unicode BMP平面约65535个字符
+     * @param {num} code
+     * return {array}
+     */
+    function unicodeFormat8(code) {
+        // 1 byte
+        var c0, c1, c2;
+        if (code < 128) {
+            return [code];
+            // 2 bytes
+        } else if (code < 2048) {
+            c0 = 192 + (code >> 6);
+            c1 = 128 + (code & 63);
+            return [c0, c1];
+            // 3 bytes
+        } else {
+            c0 = 224 + (code >> 12);
+            c1 = 128 + (code >> 6 & 63);
+            c2 = 128 + (code & 63);
+            return [c0, c1, c2];
+        }
+    }
+    /**
+     * 获取字符串的utf8编码字节串
+     * @param {string} string
+     * @return {array}
+     */
+    function getUTF8Bytes(string) {
+        var utf8codes = [];
+        for (var i = 0; i < string.length; i++) {
+            var code = string.charCodeAt(i);
+            var utf8 = unicodeFormat8(code);
+            for (var j = 0; j < utf8.length; j++) {
+                utf8codes.push(utf8[j]);
+            }
+        }
+        return utf8codes;
+    }
+    /**
+     * 二维码算法实现
+     * @param {string} data              要编码的信息字符串
+     * @param {num} errorCorrectLevel 纠错等级
+     */
+    function QRCodeAlg(data, errorCorrectLevel) {
+        this.typeNumber = -1; //版本
+        this.errorCorrectLevel = errorCorrectLevel;
+        this.modules = null; //二维矩阵,存放最终结果
+        this.moduleCount = 0; //矩阵大小
+        this.dataCache = null; //数据缓存
+        this.rsBlocks = null; //版本数据信息
+        this.totalDataCount = -1; //可使用的数据量
+        this.data = data;
+        this.utf8bytes = getUTF8Bytes(data);
+        this.make();
+    }
+    QRCodeAlg.prototype = {
+        constructor: QRCodeAlg,
+        /**
+         * 获取二维码矩阵大小
+         * @return {num} 矩阵大小
+         */
+        getModuleCount: function () {
+            return this.moduleCount;
+        },
+        /**
+         * 编码
+         */
+        make: function () {
+            this.getRightType();
+            this.dataCache = this.createData();
+            this.createQrcode();
+        },
+        /**
+         * 设置二位矩阵功能图形
+         * @param  {bool} test 表示是否在寻找最好掩膜阶段
+         * @param  {num} maskPattern 掩膜的版本
+         */
+        makeImpl: function (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);
+            }
+            this.setupPositionProbePattern(0, 0);
+            this.setupPositionProbePattern(this.moduleCount - 7, 0);
+            this.setupPositionProbePattern(0, this.moduleCount - 7);
+            this.setupPositionAdjustPattern();
+            this.setupTimingPattern();
+            this.setupTypeInfo(true, maskPattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(true);
+            }
+            this.mapData(this.dataCache, maskPattern);
+        },
+        /**
+         * 设置二维码的位置探测图形
+         * @param  {num} row 探测图形的中心横坐标
+         * @param  {num} col 探测图形的中心纵坐标
+         */
+        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;
+                    }
+                }
+            }
+        },
+        /**
+         * 创建二维码
+         * @return {[type]} [description]
+         */
+        createQrcode: function () {
+            var minLostPoint = 0;
+            var pattern = 0;
+            var bestModules = null;
+            for (var i = 0; i < 8; i++) {
+                this.makeImpl(i);
+                var lostPoint = QRUtil.getLostPoint(this);
+                if (i == 0 || minLostPoint > lostPoint) {
+                    minLostPoint = lostPoint;
+                    pattern = i;
+                    bestModules = this.modules;
+                }
+            }
+            this.modules = bestModules;
+            this.setupTypeInfo(false, pattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(false);
+            }
+        },
+        /**
+         * 设置定位图形
+         * @return {[type]} [description]
+         */
+        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);
+                if (this.modules[6][r] != null) {
+                    continue;
+                }
+                this.modules[6][r] = (r % 2 == 0);
+            }
+        },
+        /**
+         * 设置矫正图形
+         * @return {[type]} [description]
+         */
+        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;
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        /**
+         * 设置版本信息(7以上版本才有)
+         * @param  {bool} test 是否处于判断最佳掩膜阶段
+         * @return {[type]}      [description]
+         */
+        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;
+                this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
+            }
+        },
+        /**
+         * 设置格式信息(纠错等级和掩膜版本)
+         * @param  {bool} test
+         * @param  {num} maskPattern 掩膜版本
+         * @return {}
+         */
+        setupTypeInfo: function (test, maskPattern) {
+            var data = (QRErrorCorrectLevel[this.errorCorrectLevel] << 3) | maskPattern;
+            var bits = QRUtil.getBCHTypeInfo(data);
+            // vertical
+            for (var i = 0; i < 15; i++) {
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                if (i < 6) {
+                    this.modules[i][8] = mod;
+                } else if (i < 8) {
+                    this.modules[i + 1][8] = mod;
+                } else {
+                    this.modules[this.moduleCount - 15 + i][8] = mod;
+                }
+                // horizontal
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                if (i < 8) {
+                    this.modules[8][this.moduleCount - i - 1] = mod;
+                } else if (i < 9) {
+                    this.modules[8][15 - i - 1 + 1] = mod;
+                } else {
+                    this.modules[8][15 - i - 1] = mod;
+                }
+            }
+            // fixed module
+            this.modules[this.moduleCount - 8][8] = (!test);
+        },
+        /**
+         * 数据编码
+         * @return {[type]} [description]
+         */
+        createData: function () {
+            var buffer = new QRBitBuffer();
+            var lengthBits = this.typeNumber > 9 ? 16 : 8;
+            buffer.put(4, 4); //添加模式
+            buffer.put(this.utf8bytes.length, lengthBits);
+            for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
+                buffer.put(this.utf8bytes[i], 8);
+            }
+            if (buffer.length + 4 <= this.totalDataCount * 8) {
+                buffer.put(0, 4);
+            }
+            // padding
+            while (buffer.length % 8 != 0) {
+                buffer.putBit(false);
+            }
+            // padding
+            while (true) {
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD0, 8);
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD1, 8);
+            }
+            return this.createBytes(buffer);
+        },
+        /**
+         * 纠错码编码
+         * @param  {buffer} buffer 数据编码
+         * @return {[type]}
+         */
+        createBytes: function (buffer) {
+            var offset = 0;
+            var maxDcCount = 0;
+            var maxEcCount = 0;
+            var length = this.rsBlock.length / 3;
+            var rsBlocks = new Array();
+            for (var i = 0; i < length; i++) {
+                var count = this.rsBlock[i * 3 + 0];
+                var totalCount = this.rsBlock[i * 3 + 1];
+                var dataCount = this.rsBlock[i * 3 + 2];
+                for (var j = 0; j < count; j++) {
+                    rsBlocks.push([dataCount, totalCount]);
+                }
+            }
+            var dcdata = new Array(rsBlocks.length);
+            var ecdata = new Array(rsBlocks.length);
+            for (var r = 0; r < rsBlocks.length; r++) {
+                var dcCount = rsBlocks[r][0];
+                var ecCount = rsBlocks[r][1] - 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 data = new Array(this.totalDataCount);
+            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;
+
+        },
+        /**
+         * 布置模块,构建最终信息
+         * @param  {} data
+         * @param  {} maskPattern
+         * @return {}
+         */
+        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;
+                    }
+                }
+            }
+        }
+    };
+    /**
+     * 填充字段
+     */
+    QRCodeAlg.PAD0 = 0xEC;
+    QRCodeAlg.PAD1 = 0x11;
+    //---------------------------------------------------------------------
+    // 纠错等级对应的编码
+    //---------------------------------------------------------------------
+    var QRErrorCorrectLevel = [1, 0, 3, 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),
+        /*
+        BCH编码格式信息
+         */
+        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;
+        },
+        /*
+        BCH编码版本信息
+         */
+        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;
+        },
+        /*
+        获取BCH位信息
+         */
+        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);
+            }
+        },
+        /*
+        获取RS的纠错多项式
+         */
+        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;
+        },
+        /*
+        获取评价
+         */
+        getLostPoint: function (qrCode) {
+            var moduleCount = qrCode.getModuleCount(),
+                lostPoint = 0,
+                darkCount = 0;
+            for (var row = 0; row < moduleCount; row++) {
+                var sameCount = 0;
+                var head = qrCode.modules[row][0];
+                for (var col = 0; col < moduleCount; col++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 评价
+                    if (col < moduleCount - 6) {
+                        if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
+                            if (col < moduleCount - 10) {
+                                if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (col > 3) {
+                                if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 2 评价
+                    if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
+                        var count = 0;
+                        if (current) count++;
+                        if (qrCode.modules[row + 1][col]) count++;
+                        if (qrCode.modules[row][col + 1]) count++;
+                        if (qrCode.modules[row + 1][col + 1]) count++;
+                        if (count == 0 || count == 4) {
+                            lostPoint += 3;
+                        }
+                    }
+                    //level 1 评价
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                    //level 4 评价
+                    if (current) {
+                        darkCount++;
+                    }
+                }
+            }
+            for (var col = 0; col < moduleCount; col++) {
+                var sameCount = 0;
+                var head = qrCode.modules[0][col];
+                for (var row = 0; row < moduleCount; row++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 评价
+                    if (row < moduleCount - 6) {
+                        if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
+                            if (row < moduleCount - 10) {
+                                if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (row > 3) {
+                                if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 1 评价
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                }
+            }
+            // LEVEL4
+            var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
+            lostPoint += ratio * 10;
+            return lostPoint;
+        }
+
+    };
+    //---------------------------------------------------------------------
+    // QRMath使用的数学工具
+    //---------------------------------------------------------------------
+    var QRMath = {
+        /*
+        将n转化为a^m
+         */
+        glog: function (n) {
+            if (n < 1) {
+                throw new Error("glog(" + n + ")");
+            }
+            return QRMath.LOG_TABLE[n];
+        },
+        /*
+        将a^m转化为n
+         */
+        gexp: function (n) {
+            while (n < 0) {
+                n += 255;
+            }
+            while (n >= 256) {
+                n -= 255;
+            }
+            return QRMath.EXP_TABLE[n];
+        },
+        EXP_TABLE: new Array(256),
+        LOG_TABLE: new Array(256)
+
+    };
+    for (var i = 0; i < 8; i++) {
+        QRMath.EXP_TABLE[i] = 1 << i;
+    }
+    for (var i = 8; i < 256; i++) {
+        QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
+    }
+    for (var i = 0; i < 255; i++) {
+        QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
+    }
+    //---------------------------------------------------------------------
+    // QRPolynomial 多项式
+    //---------------------------------------------------------------------
+    /**
+     * 多项式类
+     * @param {Array} num   系数
+     * @param {num} shift a^shift
+     */
+    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;
+        },
+        /**
+         * 多项式乘法
+         * @param  {QRPolynomial} e 被乘多项式
+         * @return {[type]}   [description]
+         */
+        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);
+        },
+        /**
+         * 多项式模运算
+         * @param  {QRPolynomial} e 模多项式
+         * @return {}
+         */
+        mod: function (e) {
+            var tl = this.getLength(),
+                el = e.getLength();
+            if (tl - el < 0) {
+                return this;
+            }
+            var num = new Array(tl);
+            for (var i = 0; i < tl; i++) {
+                num[i] = this.get(i);
+            }
+            while (num.length >= el) {
+                var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
+
+                for (var i = 0; i < e.getLength(); i++) {
+                    num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
+                }
+                while (num[0] == 0) {
+                    num.shift();
+                }
+            }
+            return new QRPolynomial(num, 0);
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // RS_BLOCK_TABLE
+    //---------------------------------------------------------------------
+    /*
+    二维码各个版本信息[块数, 每块中的数据块数, 每块中的信息块数]
+     */
+    var RS_BLOCK_TABLE = [
+        // L
+        // M
+        // Q
+        // H
+        // 1
+        [1, 26, 19],
+        [1, 26, 16],
+        [1, 26, 13],
+        [1, 26, 9],
+
+        // 2
+        [1, 44, 34],
+        [1, 44, 28],
+        [1, 44, 22],
+        [1, 44, 16],
+
+        // 3
+        [1, 70, 55],
+        [1, 70, 44],
+        [2, 35, 17],
+        [2, 35, 13],
+
+        // 4
+        [1, 100, 80],
+        [2, 50, 32],
+        [2, 50, 24],
+        [4, 25, 9],
+
+        // 5
+        [1, 134, 108],
+        [2, 67, 43],
+        [2, 33, 15, 2, 34, 16],
+        [2, 33, 11, 2, 34, 12],
+
+        // 6
+        [2, 86, 68],
+        [4, 43, 27],
+        [4, 43, 19],
+        [4, 43, 15],
+
+        // 7
+        [2, 98, 78],
+        [4, 49, 31],
+        [2, 32, 14, 4, 33, 15],
+        [4, 39, 13, 1, 40, 14],
+
+        // 8
+        [2, 121, 97],
+        [2, 60, 38, 2, 61, 39],
+        [4, 40, 18, 2, 41, 19],
+        [4, 40, 14, 2, 41, 15],
+
+        // 9
+        [2, 146, 116],
+        [3, 58, 36, 2, 59, 37],
+        [4, 36, 16, 4, 37, 17],
+        [4, 36, 12, 4, 37, 13],
+
+        // 10
+        [2, 86, 68, 2, 87, 69],
+        [4, 69, 43, 1, 70, 44],
+        [6, 43, 19, 2, 44, 20],
+        [6, 43, 15, 2, 44, 16],
+
+        // 11
+        [4, 101, 81],
+        [1, 80, 50, 4, 81, 51],
+        [4, 50, 22, 4, 51, 23],
+        [3, 36, 12, 8, 37, 13],
+
+        // 12
+        [2, 116, 92, 2, 117, 93],
+        [6, 58, 36, 2, 59, 37],
+        [4, 46, 20, 6, 47, 21],
+        [7, 42, 14, 4, 43, 15],
+
+        // 13
+        [4, 133, 107],
+        [8, 59, 37, 1, 60, 38],
+        [8, 44, 20, 4, 45, 21],
+        [12, 33, 11, 4, 34, 12],
+
+        // 14
+        [3, 145, 115, 1, 146, 116],
+        [4, 64, 40, 5, 65, 41],
+        [11, 36, 16, 5, 37, 17],
+        [11, 36, 12, 5, 37, 13],
+
+        // 15
+        [5, 109, 87, 1, 110, 88],
+        [5, 65, 41, 5, 66, 42],
+        [5, 54, 24, 7, 55, 25],
+        [11, 36, 12],
+
+        // 16
+        [5, 122, 98, 1, 123, 99],
+        [7, 73, 45, 3, 74, 46],
+        [15, 43, 19, 2, 44, 20],
+        [3, 45, 15, 13, 46, 16],
+
+        // 17
+        [1, 135, 107, 5, 136, 108],
+        [10, 74, 46, 1, 75, 47],
+        [1, 50, 22, 15, 51, 23],
+        [2, 42, 14, 17, 43, 15],
+
+        // 18
+        [5, 150, 120, 1, 151, 121],
+        [9, 69, 43, 4, 70, 44],
+        [17, 50, 22, 1, 51, 23],
+        [2, 42, 14, 19, 43, 15],
+
+        // 19
+        [3, 141, 113, 4, 142, 114],
+        [3, 70, 44, 11, 71, 45],
+        [17, 47, 21, 4, 48, 22],
+        [9, 39, 13, 16, 40, 14],
+
+        // 20
+        [3, 135, 107, 5, 136, 108],
+        [3, 67, 41, 13, 68, 42],
+        [15, 54, 24, 5, 55, 25],
+        [15, 43, 15, 10, 44, 16],
+
+        // 21
+        [4, 144, 116, 4, 145, 117],
+        [17, 68, 42],
+        [17, 50, 22, 6, 51, 23],
+        [19, 46, 16, 6, 47, 17],
+
+        // 22
+        [2, 139, 111, 7, 140, 112],
+        [17, 74, 46],
+        [7, 54, 24, 16, 55, 25],
+        [34, 37, 13],
+
+        // 23
+        [4, 151, 121, 5, 152, 122],
+        [4, 75, 47, 14, 76, 48],
+        [11, 54, 24, 14, 55, 25],
+        [16, 45, 15, 14, 46, 16],
+
+        // 24
+        [6, 147, 117, 4, 148, 118],
+        [6, 73, 45, 14, 74, 46],
+        [11, 54, 24, 16, 55, 25],
+        [30, 46, 16, 2, 47, 17],
+
+        // 25
+        [8, 132, 106, 4, 133, 107],
+        [8, 75, 47, 13, 76, 48],
+        [7, 54, 24, 22, 55, 25],
+        [22, 45, 15, 13, 46, 16],
+
+        // 26
+        [10, 142, 114, 2, 143, 115],
+        [19, 74, 46, 4, 75, 47],
+        [28, 50, 22, 6, 51, 23],
+        [33, 46, 16, 4, 47, 17],
+
+        // 27
+        [8, 152, 122, 4, 153, 123],
+        [22, 73, 45, 3, 74, 46],
+        [8, 53, 23, 26, 54, 24],
+        [12, 45, 15, 28, 46, 16],
+
+        // 28
+        [3, 147, 117, 10, 148, 118],
+        [3, 73, 45, 23, 74, 46],
+        [4, 54, 24, 31, 55, 25],
+        [11, 45, 15, 31, 46, 16],
+
+        // 29
+        [7, 146, 116, 7, 147, 117],
+        [21, 73, 45, 7, 74, 46],
+        [1, 53, 23, 37, 54, 24],
+        [19, 45, 15, 26, 46, 16],
+
+        // 30
+        [5, 145, 115, 10, 146, 116],
+        [19, 75, 47, 10, 76, 48],
+        [15, 54, 24, 25, 55, 25],
+        [23, 45, 15, 25, 46, 16],
+
+        // 31
+        [13, 145, 115, 3, 146, 116],
+        [2, 74, 46, 29, 75, 47],
+        [42, 54, 24, 1, 55, 25],
+        [23, 45, 15, 28, 46, 16],
+
+        // 32
+        [17, 145, 115],
+        [10, 74, 46, 23, 75, 47],
+        [10, 54, 24, 35, 55, 25],
+        [19, 45, 15, 35, 46, 16],
+
+        // 33
+        [17, 145, 115, 1, 146, 116],
+        [14, 74, 46, 21, 75, 47],
+        [29, 54, 24, 19, 55, 25],
+        [11, 45, 15, 46, 46, 16],
+
+        // 34
+        [13, 145, 115, 6, 146, 116],
+        [14, 74, 46, 23, 75, 47],
+        [44, 54, 24, 7, 55, 25],
+        [59, 46, 16, 1, 47, 17],
+
+        // 35
+        [12, 151, 121, 7, 152, 122],
+        [12, 75, 47, 26, 76, 48],
+        [39, 54, 24, 14, 55, 25],
+        [22, 45, 15, 41, 46, 16],
+
+        // 36
+        [6, 151, 121, 14, 152, 122],
+        [6, 75, 47, 34, 76, 48],
+        [46, 54, 24, 10, 55, 25],
+        [2, 45, 15, 64, 46, 16],
+
+        // 37
+        [17, 152, 122, 4, 153, 123],
+        [29, 74, 46, 14, 75, 47],
+        [49, 54, 24, 10, 55, 25],
+        [24, 45, 15, 46, 46, 16],
+
+        // 38
+        [4, 152, 122, 18, 153, 123],
+        [13, 74, 46, 32, 75, 47],
+        [48, 54, 24, 14, 55, 25],
+        [42, 45, 15, 32, 46, 16],
+
+        // 39
+        [20, 147, 117, 4, 148, 118],
+        [40, 75, 47, 7, 76, 48],
+        [43, 54, 24, 22, 55, 25],
+        [10, 45, 15, 67, 46, 16],
+
+        // 40
+        [19, 148, 118, 6, 149, 119],
+        [18, 75, 47, 31, 76, 48],
+        [34, 54, 24, 34, 55, 25],
+        [20, 45, 15, 61, 46, 16]
+    ];
+
+    /**
+     * 根据数据获取对应版本
+     * @return {[type]} [description]
+     */
+    QRCodeAlg.prototype.getRightType = function () {
+        for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
+            var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
+            if (rsBlock == undefined) {
+                throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
+            }
+            var length = rsBlock.length / 3;
+            var totalDataCount = 0;
+            for (var i = 0; i < length; i++) {
+                var count = rsBlock[i * 3 + 0];
+                var dataCount = rsBlock[i * 3 + 2];
+                totalDataCount += dataCount * count;
+            }
+            var lengthBytes = typeNumber > 9 ? 2 : 1;
+            if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
+                this.typeNumber = typeNumber;
+                this.rsBlock = rsBlock;
+                this.totalDataCount = totalDataCount;
+                break;
+            }
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // QRBitBuffer
+    //---------------------------------------------------------------------
+    function QRBitBuffer() {
+        this.buffer = new Array();
+        this.length = 0;
+    }
+    QRBitBuffer.prototype = {
+        get: function (index) {
+            var bufIndex = Math.floor(index / 8);
+            return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1);
+        },
+        put: function (num, length) {
+            for (var i = 0; i < length; i++) {
+                this.putBit(((num >>> (length - i - 1)) & 1));
+            }
+        },
+        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++;
+        }
+    };
+
+
+
+    // xzedit
+    let qrcodeAlgObjCache = [];
+    /**
+     * 二维码构造函数,主要用于绘制
+     * @param  {参数列表} opt 传递参数
+     * @return {}
+     */
+    QRCode = function (opt) {
+        //设置默认参数
+        this.options = {
+            text: '',
+            size: 256,
+            correctLevel: 3,
+            background: '#ffffff',
+            foreground: '#000000',
+            pdground: '#000000',
+            image: '',
+            imageSize: 30,
+            canvasId: opt.canvasId,
+            context: opt.context,
+            usingComponents: opt.usingComponents,
+            showLoading: opt.showLoading,
+            loadingText: opt.loadingText,
+        };
+        if (typeof opt === 'string') { // 只编码ASCII字符串
+            opt = {
+                text: opt
+            };
+        }
+        if (opt) {
+            for (var i in opt) {
+                this.options[i] = opt[i];
+            }
+        }
+        //使用QRCodeAlg创建二维码结构
+        var qrCodeAlg = null;
+        for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
+            if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
+                qrCodeAlg = qrcodeAlgObjCache[i].obj;
+                break;
+            }
+        }
+        if (i == l) {
+            qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
+            qrcodeAlgObjCache.push({
+                text: this.options.text,
+                correctLevel: this.options.correctLevel,
+                obj: qrCodeAlg
+            });
+        }
+        /**
+         * 计算矩阵点的前景色
+         * @param {Obj} config
+         * @param {Number} config.row 点x坐标
+         * @param {Number} config.col 点y坐标
+         * @param {Number} config.count 矩阵大小
+         * @param {Number} config.options 组件的options
+         * @return {String}
+         */
+        let getForeGround = function (config) {
+            var options = config.options;
+            if (options.pdground && (
+                (config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
+                (config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
+                (config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
+            )) {
+                return options.pdground;
+            }
+            return options.foreground;
+        }
+        // 创建canvas
+        let createCanvas = function (options) {
+            if(options.showLoading){
+                uni.showLoading({
+                    title: options.loadingText,
+                    mask: true
+                });
+            }
+            var ctx = uni.createCanvasContext(options.canvasId, options.context);
+            var count = qrCodeAlg.getModuleCount();
+            var ratioSize = options.size;
+            var ratioImgSize = options.imageSize;
+            //计算每个点的长宽
+            var tileW = (ratioSize / count).toPrecision(4);
+            var tileH = (ratioSize / count).toPrecision(4);
+            //绘制
+            for (var row = 0; row < count; row++) {
+                for (var col = 0; col < count; col++) {
+                    var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
+                    var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
+                    var foreground = getForeGround({
+                        row: row,
+                        col: col,
+                        count: count,
+                        options: options
+                    });
+                    ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
+                    ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
+                }
+            }
+            if (options.image) {
+                var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
+                ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
+                // 画圆角矩形
+                function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
+                    ctxi.setLineWidth(lineWidth);
+                    ctxi.setFillStyle(options.background);
+                    ctxi.setStrokeStyle(options.background);
+                    ctxi.beginPath(); // draw top and top right corner 
+                    ctxi.moveTo(x + r, y);
+                    ctxi.arcTo(x + width, y, x + width, y + r, r); // draw right side and bottom right corner 
+                    ctxi.arcTo(x + width, y + height, x + width - r, y + height, r); // draw bottom and bottom left corner 
+                    ctxi.arcTo(x, y + height, x, y + height - r, r); // draw left and top left corner 
+                    ctxi.arcTo(x, y, x + r, y, r);
+                    ctxi.closePath();
+                    if (fill) {
+                        ctxi.fill();
+                    }
+                    if (stroke) {
+                        ctxi.stroke();
+                    }
+                }
+            }
+            setTimeout(() => {
+                ctx.draw(true, () => {
+                    // 保存到临时区域
+                    setTimeout(() => {
+                        uni.canvasToTempFilePath({
+                            width: options.width,
+                            height: options.height,
+                            destWidth: options.width,
+                            destHeight: options.height,
+                            canvasId: options.canvasId,
+                            quality: Number(1),
+                            success: function (res) {
+                                if (options.cbResult) {
+                                    // 由于官方还没有统一此接口的输出字段,所以先判定下  支付宝为 res.apFilePath
+                                    if (!empty(res.tempFilePath)) {
+                                        options.cbResult(res.tempFilePath)
+                                    } else if (!empty(res.apFilePath)) {
+                                        options.cbResult(res.apFilePath)
+                                    } else {
+                                        options.cbResult(res.tempFilePath)
+                                    }
+                                }
+                            },
+                            fail: function (res) {
+                                if (options.cbResult) {
+                                    options.cbResult(res)
+                                }
+                            },
+                            complete: function () {
+                                uni.hideLoading();
+                            },
+                        }, options.context);
+                    }, options.text.length + 100);
+                });
+            }, options.usingComponents ? 0 : 150);
+        }
+        createCanvas(this.options);
+        // 空判定
+        let empty = function (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
+        }
+    };
+    QRCode.prototype.clear = function (fn) {
+        var ctx = uni.createCanvasContext(this.options.canvasId, this.options.context)
+        ctx.clearRect(0, 0, this.options.size, this.options.size)
+        ctx.draw(false, () => {
+            if (fn) {
+                fn()
+            }
+        })
+    };
+})()
+
+export default QRCode

+ 205 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/components/tki-qrcode/tki-qrcode.vue

@@ -0,0 +1,205 @@
+<template xlang="wxml" minapp="mpvue">
+	<view class="tki-qrcode">
+		<canvas class="tki-qrcode-canvas" :canvas-id="cid" :style="{width:cpSize+'px',height:cpSize+'px'}" />
+		<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>

+ 11 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/main.js

@@ -0,0 +1,11 @@
+import Vue from 'vue'
+import App from './App'
+
+Vue.config.productionTip = false
+
+App.mpType = 'app'
+
+const app = new Vue({
+    ...App
+})
+app.$mount()

+ 60 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/manifest.json

@@ -0,0 +1,60 @@
+{
+    "name" : "qrcode",
+    "appid" : "__UNI__2A8D346",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    "usingComponents": true,
+    "debug": true,
+    "app-plus" : {
+        /* 5+App特有相关 */
+        "modules" : {},
+        /* 模块配置 */
+        "distribute" : {
+            /* 应用发布信息 */
+            "android" : {
+                /* android打包配置 */
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            "ios" : {},
+            /* ios打包配置 */
+            "sdkConfigs" : {}
+        },
+		"usingComponents": true
+    },
+    /* SDK配置 */
+    "quickapp" : {},
+    /* 快应用特有相关 */
+    "mp-weixin" : {
+        /* 小程序特有相关 */
+        "appid" : "wx7d67739c63a7f3e0",
+        "setting" : {
+            "urlCheck" : true
+        },
+		"usingComponents": true
+    }
+}

+ 29 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/package.json

@@ -0,0 +1,29 @@
+{
+  "name": "tki-qrcode",
+  "version": "0.1.6",
+  "description": "qrcode",
+  "main": "components/tki-qrcode/tki-qrcode.vue",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/q310550690/uni-app-qrcode.git"
+  },
+  "keywords": [
+    "qrcode",
+    "mpvue",
+    "uni-app",
+    "tki-qrcode",
+    "TikiUi"
+  ],
+  "author": "sxq",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/q310550690/uni-app-qrcode/issues"
+  },
+  "homepage": "https://github.com/q310550690/uni-app-qrcode#readme",
+  "__npminstall_done": true,
+  "_from": "tki-qrcode@0.1.6",
+  "_resolved": "https://registry.npmmirror.com/tki-qrcode/-/tki-qrcode-0.1.6.tgz"
+}

+ 16 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/pages.json

@@ -0,0 +1,16 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "uni-app"
+			}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "uni-app",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8"
+	}
+}

+ 132 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/pages/index/index.vue

@@ -0,0 +1,132 @@
+<template xlang="wxml">
+	<view class="container">
+		<view class="qrimg">
+			<view class="qrimg-i">
+				<tki-qrcode v-if="ifShow" cid="qrcode1" ref="qrcode" :val="val" :size="size" :unit="unit" :background="background" :foreground="foreground" :pdground="pdground" :icon="icon" :iconSize="iconsize" :lv="lv" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
+			</view>
+			<view class="qrimg-i">
+				<tki-qrcode v-if="ifShow" cid="qrcode2" ref="qrcode2" val="第二个二维码" :size="size" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
+			</view>
+		</view>
+		<view class="uni-padding-wrap">
+			<view class="uni-title">请输入要生成的二维码内容</view>
+		</view>
+		<view class="uni-list">
+			<input class="uni-input" placeholder="请输入要生成的二维码内容" v-model="val" />
+		</view>
+		<view class="uni-padding-wrap uni-common-mt">
+			<view class="uni-title">设置二维码大小</view>
+		</view>
+		<view class="body-view">
+			<slider :value="size" @change="sliderchange" min="50" max="500" show-value />
+		</view>
+		<view class="uni-padding-wrap">
+			<view class="btns">
+				<button type="primary" @tap="selectIcon">选择二维码图标</button>
+				<button type="primary" @tap="creatQrcode">生成二维码</button>
+				<button type="primary" @tap="saveQrcode">保存到图库</button>
+				<button type="warn" @tap="clearQrcode">清除二维码</button>
+				<button type="warn" @tap="ifQrcode">显示隐藏二维码</button>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+import tkiQrcode from '@/components/tki-qrcode/tki-qrcode.vue'
+export default {
+	data() {
+		return {
+			ifShow: true,
+			val: '二维码', // 要生成的二维码值
+			size: 200, // 二维码大小
+			unit: 'upx', // 单位
+			background: '#b4e9e2', // 背景色
+			foreground: '#309286', // 前景色
+			pdground: '#32dbc6', // 角标色
+			icon: '', // 二维码图标
+			iconsize: 40, // 二维码图标大小
+			lv: 3, // 二维码容错级别 , 一般不用设置,默认就行
+			onval: false, // val值变化时自动重新生成二维码
+			loadMake: true, // 组件加载完成后自动生成二维码
+			src: '' // 二维码生成后的图片地址或base64
+		}
+	},
+	methods: {
+		sliderchange(e) {
+			this.size = e.detail.value
+		},
+		creatQrcode() {
+			this.$refs.qrcode._makeCode()
+		},
+		saveQrcode() {
+			this.$refs.qrcode._saveCode()
+		},
+		qrR(res) {
+			this.src = res
+		},
+		clearQrcode() {
+			this.$refs.qrcode._clearCode()
+			this.val = ''
+		},
+		ifQrcode() {
+			this.ifShow = !this.ifShow
+		},
+		selectIcon() {
+			let that = this
+			uni.chooseImage({
+				count: 1, //默认9
+				sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+				sourceType: ['album'], //从相册选择
+				success: function (res) {
+					that.icon = res.tempFilePaths[0]
+					setTimeout(() => {
+						that.creatQrcode()
+					}, 100);
+					// console.log(res.tempFilePaths);
+				}
+			});
+		}
+	},
+	components: {
+		tkiQrcode
+	},
+	onLoad: function () { },
+}
+</script>
+
+<style>
+/* @import "../../../common/icon.css"; */
+.container {
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+}
+
+.qrimg {
+	display: flex;
+	justify-content: center;
+}
+.qrimg-i{
+	margin-right: 10px;
+}
+
+slider {
+	width: 100%;
+}
+
+input {
+	width: 100%;
+	margin-bottom: 20upx;
+}
+
+.btns {
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+}
+
+button {
+	width: 100%;
+	margin-top: 10upx;
+}
+</style>

+ 2 - 0
node_modules/_tki-qrcode@0.1.6@tki-qrcode/static/README.md

@@ -0,0 +1,2 @@
+# 静态资源
+占位

+ 22 - 0
node_modules/tki-qrcode/App.vue

@@ -0,0 +1,22 @@
+<script>
+	export default {
+		onLaunch: function () {
+			// console.log('App Launch')
+		},
+		onShow: function () {
+			// console.log('App Show')
+		},
+		onHide: function () {
+			// console.log('App Hide')
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+
+	page,
+	view {
+		display: flex;/* uni-app默认使用flex布局。因为flex布局有利于跨更多平台,尤其是采用原生渲染的平台。如不了解flex布局,请参考http://www.w3.org/TR/css3-flexbox/。若不需要flex布局可删除本行*/
+	}
+</style>

+ 114 - 0
node_modules/tki-qrcode/README.md

@@ -0,0 +1,114 @@
+# uni-app 二维码生成器
+### 作者:诗小柒
+
+1. H5、微信小程序、支付宝小程序、APP,其它平台的小程序没有测试
+2. 使用canvas生成  
+3. 可设置二维码背景色,前景色,角标色  
+4. 可设置二维码logo  
+
+## 重要的事情说3遍 重要的事情说3遍 重要的事情说3遍
+
+1. IOS、Android真机都可以正常生成二维码
+2. 使用的时候出现无法生成二维码或空白的请先github直接打包下载,问题依旧,请github上直接提出问题并配图
+3. 有问题请说明问题原因,这样我才好定位,否则我也无法解决
+4. 如果此插件有帮助到你请打5分或赞赏我,你的支持是我更新的动力
+
++ 图片1 是微信小程序真机实测
++ 图片2 是微信小程序模拟实测
++ 图片3 是支付宝小程序模拟器实测
++ 图片4 是安卓真机实测
++ 图片5 H5
+
+## 开始使用
+NPM 
+```
+npm i tki-qrcode
+```
+GIT 
+```
+git clone https://github.com/q310550690/uni-app-qrcode
+```
+
+### 更新说明
+
+* 0.1.6 新增cid属性,支持同一个页面使用多个二维码组件
+* 0.1.5 新增showLoading、loadingText属性
+* 0.1.4 新增usingComponents属性,修复非自定义组件下 v-if 无法生成二维码的问题(非自定义组件下设置为false)
+* 0.1.3 新增unit属性
+* 0.1.2 适配新版uni-app编译器 感谢 "DCloud_UNI_Trust" (如果github上下载后使用新版HbuilderX1.7.1.20190320编译后无法启动请等待Dcloud更新即可)
+* 0.1.1 新增监听val值变化时自动生成二维码(onval)、新增组件初始化时自动生成二维码(loadMake) 属性,具体说明看文档说明
+* 0.1.0 常规更新
+* 0.0.9 修复小程序真机生成二维码错乱问题(其实这是小程序canvas的锅)
+* 0.0.8 修复官方 uni.canvasToTempFilePath 在有些平台返回字段不统一而导致的支付宝无法生成二维码的问题。
+* 0.0.7 常规修复
+* 0.0.6 新增角标色、二维码logo
+
+### 使用方法
+在 `script` 中引入组件
+``` javascript
+import tkiQrcode from "@/components/tki-qrcode/tki-qrcode.vue"
+export default {
+    components: {tkiQrcode}
+}
+```
+在 `template` 中使用
+``` javascript
+<view class="qrimg">
+    <tki-qrcode
+    ref="qrcode"
+    :cid="cid"
+    :val="val"
+    :size="size"
+    :unit="unit"
+    :background="background"
+    :foreground="foreground"
+    :pdground="pdground"
+    :icon="icon"
+    :iconSize="iconsize"
+    :lv="lv" 
+    :onval="onval"
+    :loadMake="loadMake"
+    :usingComponents="usingComponents"
+    :showLoading="showLoading"
+    :loadingText="loadingText"
+    @result="qrR" />
+</view>
+```
+### 属性
+
+|属性名|类型|默认值|可选值|说明|
+|:-|:-:|:--:|:--:|-:|
+|cid|String|tki-qrcode-canvas| |canvasId,页面存在多个二维码组件时需设置不同的ID|
+|size|Number|200| |生成的二维码大小|
+|unit|String|upx|px|大小单位尺寸|
+|show|Boolean|true| |默认使用组件中的image标签显示二维码|
+|val|String|二维码| |要生成的内容|
+|background|String|#000000| |二维码背景色|
+|foreground|String|#ffffff| |二维码前景色|
+|pdground|String|#ffffff| |二维码角标色|
+|icon|String| | |二维码图标URL(必须是本地图片,网络图需要先下载至本地)|
+|iconSize|Number|40<br/>注意此大小不会跟随二维码size 动态变化,设置时需注意大小,不要太大,以免无法识别| |二维码图标大小|
+|lv|Number|3(一般不用设置)| |容错级别|
+|onval|Boolean|false| |监听val值变化自动重新生成二维码|
+|loadMake|Boolean|false| |组件初始化完成后自动生成二维码,val需要有值|
+|usingComponents|Boolean|true| false |是否使用了自定义组件模式(主要是为了修复非自定义组件模式时 v-if 无法生成二维码的问题)|
+|showLoading|Boolean|true| false |是否显示loading|
+|loadingText|String|二维码生成中| |loading文字|
+
+### 方法
+|方法名|参数|默认值|说明|
+|:-|:-:|:--:|-:|
+|_makeCode()| | |生成二维码|
+|_clearCode()| | |清空二维码(清空二维码会触发result回调 返回值为空)|
+|_saveCode()| | |保存二维码到图库|
+
+### 事件
+|事件名|返回值|说明|
+|:-|:-:|-:|
+|result|生成的图片base64或图片临时地址|返回二维码路径 注:_clearCode()后返回空|
+
+
+### 感谢
+
+[uni-app](https://uniapp.dcloud.io/ "uni-app")
+[qrcode](https://github.com/aralejs/qrcode "qrcode")

+ 1206 - 0
node_modules/tki-qrcode/components/tki-qrcode/qrcode.js

@@ -0,0 +1,1206 @@
+let QRCode = {};
+(function () {
+    /**
+     * 获取单个字符的utf8编码
+     * unicode BMP平面约65535个字符
+     * @param {num} code
+     * return {array}
+     */
+    function unicodeFormat8(code) {
+        // 1 byte
+        var c0, c1, c2;
+        if (code < 128) {
+            return [code];
+            // 2 bytes
+        } else if (code < 2048) {
+            c0 = 192 + (code >> 6);
+            c1 = 128 + (code & 63);
+            return [c0, c1];
+            // 3 bytes
+        } else {
+            c0 = 224 + (code >> 12);
+            c1 = 128 + (code >> 6 & 63);
+            c2 = 128 + (code & 63);
+            return [c0, c1, c2];
+        }
+    }
+    /**
+     * 获取字符串的utf8编码字节串
+     * @param {string} string
+     * @return {array}
+     */
+    function getUTF8Bytes(string) {
+        var utf8codes = [];
+        for (var i = 0; i < string.length; i++) {
+            var code = string.charCodeAt(i);
+            var utf8 = unicodeFormat8(code);
+            for (var j = 0; j < utf8.length; j++) {
+                utf8codes.push(utf8[j]);
+            }
+        }
+        return utf8codes;
+    }
+    /**
+     * 二维码算法实现
+     * @param {string} data              要编码的信息字符串
+     * @param {num} errorCorrectLevel 纠错等级
+     */
+    function QRCodeAlg(data, errorCorrectLevel) {
+        this.typeNumber = -1; //版本
+        this.errorCorrectLevel = errorCorrectLevel;
+        this.modules = null; //二维矩阵,存放最终结果
+        this.moduleCount = 0; //矩阵大小
+        this.dataCache = null; //数据缓存
+        this.rsBlocks = null; //版本数据信息
+        this.totalDataCount = -1; //可使用的数据量
+        this.data = data;
+        this.utf8bytes = getUTF8Bytes(data);
+        this.make();
+    }
+    QRCodeAlg.prototype = {
+        constructor: QRCodeAlg,
+        /**
+         * 获取二维码矩阵大小
+         * @return {num} 矩阵大小
+         */
+        getModuleCount: function () {
+            return this.moduleCount;
+        },
+        /**
+         * 编码
+         */
+        make: function () {
+            this.getRightType();
+            this.dataCache = this.createData();
+            this.createQrcode();
+        },
+        /**
+         * 设置二位矩阵功能图形
+         * @param  {bool} test 表示是否在寻找最好掩膜阶段
+         * @param  {num} maskPattern 掩膜的版本
+         */
+        makeImpl: function (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);
+            }
+            this.setupPositionProbePattern(0, 0);
+            this.setupPositionProbePattern(this.moduleCount - 7, 0);
+            this.setupPositionProbePattern(0, this.moduleCount - 7);
+            this.setupPositionAdjustPattern();
+            this.setupTimingPattern();
+            this.setupTypeInfo(true, maskPattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(true);
+            }
+            this.mapData(this.dataCache, maskPattern);
+        },
+        /**
+         * 设置二维码的位置探测图形
+         * @param  {num} row 探测图形的中心横坐标
+         * @param  {num} col 探测图形的中心纵坐标
+         */
+        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;
+                    }
+                }
+            }
+        },
+        /**
+         * 创建二维码
+         * @return {[type]} [description]
+         */
+        createQrcode: function () {
+            var minLostPoint = 0;
+            var pattern = 0;
+            var bestModules = null;
+            for (var i = 0; i < 8; i++) {
+                this.makeImpl(i);
+                var lostPoint = QRUtil.getLostPoint(this);
+                if (i == 0 || minLostPoint > lostPoint) {
+                    minLostPoint = lostPoint;
+                    pattern = i;
+                    bestModules = this.modules;
+                }
+            }
+            this.modules = bestModules;
+            this.setupTypeInfo(false, pattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(false);
+            }
+        },
+        /**
+         * 设置定位图形
+         * @return {[type]} [description]
+         */
+        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);
+                if (this.modules[6][r] != null) {
+                    continue;
+                }
+                this.modules[6][r] = (r % 2 == 0);
+            }
+        },
+        /**
+         * 设置矫正图形
+         * @return {[type]} [description]
+         */
+        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;
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        /**
+         * 设置版本信息(7以上版本才有)
+         * @param  {bool} test 是否处于判断最佳掩膜阶段
+         * @return {[type]}      [description]
+         */
+        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;
+                this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
+            }
+        },
+        /**
+         * 设置格式信息(纠错等级和掩膜版本)
+         * @param  {bool} test
+         * @param  {num} maskPattern 掩膜版本
+         * @return {}
+         */
+        setupTypeInfo: function (test, maskPattern) {
+            var data = (QRErrorCorrectLevel[this.errorCorrectLevel] << 3) | maskPattern;
+            var bits = QRUtil.getBCHTypeInfo(data);
+            // vertical
+            for (var i = 0; i < 15; i++) {
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                if (i < 6) {
+                    this.modules[i][8] = mod;
+                } else if (i < 8) {
+                    this.modules[i + 1][8] = mod;
+                } else {
+                    this.modules[this.moduleCount - 15 + i][8] = mod;
+                }
+                // horizontal
+                var mod = (!test && ((bits >> i) & 1) == 1);
+                if (i < 8) {
+                    this.modules[8][this.moduleCount - i - 1] = mod;
+                } else if (i < 9) {
+                    this.modules[8][15 - i - 1 + 1] = mod;
+                } else {
+                    this.modules[8][15 - i - 1] = mod;
+                }
+            }
+            // fixed module
+            this.modules[this.moduleCount - 8][8] = (!test);
+        },
+        /**
+         * 数据编码
+         * @return {[type]} [description]
+         */
+        createData: function () {
+            var buffer = new QRBitBuffer();
+            var lengthBits = this.typeNumber > 9 ? 16 : 8;
+            buffer.put(4, 4); //添加模式
+            buffer.put(this.utf8bytes.length, lengthBits);
+            for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
+                buffer.put(this.utf8bytes[i], 8);
+            }
+            if (buffer.length + 4 <= this.totalDataCount * 8) {
+                buffer.put(0, 4);
+            }
+            // padding
+            while (buffer.length % 8 != 0) {
+                buffer.putBit(false);
+            }
+            // padding
+            while (true) {
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD0, 8);
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD1, 8);
+            }
+            return this.createBytes(buffer);
+        },
+        /**
+         * 纠错码编码
+         * @param  {buffer} buffer 数据编码
+         * @return {[type]}
+         */
+        createBytes: function (buffer) {
+            var offset = 0;
+            var maxDcCount = 0;
+            var maxEcCount = 0;
+            var length = this.rsBlock.length / 3;
+            var rsBlocks = new Array();
+            for (var i = 0; i < length; i++) {
+                var count = this.rsBlock[i * 3 + 0];
+                var totalCount = this.rsBlock[i * 3 + 1];
+                var dataCount = this.rsBlock[i * 3 + 2];
+                for (var j = 0; j < count; j++) {
+                    rsBlocks.push([dataCount, totalCount]);
+                }
+            }
+            var dcdata = new Array(rsBlocks.length);
+            var ecdata = new Array(rsBlocks.length);
+            for (var r = 0; r < rsBlocks.length; r++) {
+                var dcCount = rsBlocks[r][0];
+                var ecCount = rsBlocks[r][1] - 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 data = new Array(this.totalDataCount);
+            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;
+
+        },
+        /**
+         * 布置模块,构建最终信息
+         * @param  {} data
+         * @param  {} maskPattern
+         * @return {}
+         */
+        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;
+                    }
+                }
+            }
+        }
+    };
+    /**
+     * 填充字段
+     */
+    QRCodeAlg.PAD0 = 0xEC;
+    QRCodeAlg.PAD1 = 0x11;
+    //---------------------------------------------------------------------
+    // 纠错等级对应的编码
+    //---------------------------------------------------------------------
+    var QRErrorCorrectLevel = [1, 0, 3, 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),
+        /*
+        BCH编码格式信息
+         */
+        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;
+        },
+        /*
+        BCH编码版本信息
+         */
+        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;
+        },
+        /*
+        获取BCH位信息
+         */
+        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);
+            }
+        },
+        /*
+        获取RS的纠错多项式
+         */
+        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;
+        },
+        /*
+        获取评价
+         */
+        getLostPoint: function (qrCode) {
+            var moduleCount = qrCode.getModuleCount(),
+                lostPoint = 0,
+                darkCount = 0;
+            for (var row = 0; row < moduleCount; row++) {
+                var sameCount = 0;
+                var head = qrCode.modules[row][0];
+                for (var col = 0; col < moduleCount; col++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 评价
+                    if (col < moduleCount - 6) {
+                        if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
+                            if (col < moduleCount - 10) {
+                                if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (col > 3) {
+                                if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 2 评价
+                    if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
+                        var count = 0;
+                        if (current) count++;
+                        if (qrCode.modules[row + 1][col]) count++;
+                        if (qrCode.modules[row][col + 1]) count++;
+                        if (qrCode.modules[row + 1][col + 1]) count++;
+                        if (count == 0 || count == 4) {
+                            lostPoint += 3;
+                        }
+                    }
+                    //level 1 评价
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                    //level 4 评价
+                    if (current) {
+                        darkCount++;
+                    }
+                }
+            }
+            for (var col = 0; col < moduleCount; col++) {
+                var sameCount = 0;
+                var head = qrCode.modules[0][col];
+                for (var row = 0; row < moduleCount; row++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 评价
+                    if (row < moduleCount - 6) {
+                        if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
+                            if (row < moduleCount - 10) {
+                                if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (row > 3) {
+                                if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 1 评价
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                }
+            }
+            // LEVEL4
+            var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
+            lostPoint += ratio * 10;
+            return lostPoint;
+        }
+
+    };
+    //---------------------------------------------------------------------
+    // QRMath使用的数学工具
+    //---------------------------------------------------------------------
+    var QRMath = {
+        /*
+        将n转化为a^m
+         */
+        glog: function (n) {
+            if (n < 1) {
+                throw new Error("glog(" + n + ")");
+            }
+            return QRMath.LOG_TABLE[n];
+        },
+        /*
+        将a^m转化为n
+         */
+        gexp: function (n) {
+            while (n < 0) {
+                n += 255;
+            }
+            while (n >= 256) {
+                n -= 255;
+            }
+            return QRMath.EXP_TABLE[n];
+        },
+        EXP_TABLE: new Array(256),
+        LOG_TABLE: new Array(256)
+
+    };
+    for (var i = 0; i < 8; i++) {
+        QRMath.EXP_TABLE[i] = 1 << i;
+    }
+    for (var i = 8; i < 256; i++) {
+        QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
+    }
+    for (var i = 0; i < 255; i++) {
+        QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
+    }
+    //---------------------------------------------------------------------
+    // QRPolynomial 多项式
+    //---------------------------------------------------------------------
+    /**
+     * 多项式类
+     * @param {Array} num   系数
+     * @param {num} shift a^shift
+     */
+    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;
+        },
+        /**
+         * 多项式乘法
+         * @param  {QRPolynomial} e 被乘多项式
+         * @return {[type]}   [description]
+         */
+        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);
+        },
+        /**
+         * 多项式模运算
+         * @param  {QRPolynomial} e 模多项式
+         * @return {}
+         */
+        mod: function (e) {
+            var tl = this.getLength(),
+                el = e.getLength();
+            if (tl - el < 0) {
+                return this;
+            }
+            var num = new Array(tl);
+            for (var i = 0; i < tl; i++) {
+                num[i] = this.get(i);
+            }
+            while (num.length >= el) {
+                var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
+
+                for (var i = 0; i < e.getLength(); i++) {
+                    num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
+                }
+                while (num[0] == 0) {
+                    num.shift();
+                }
+            }
+            return new QRPolynomial(num, 0);
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // RS_BLOCK_TABLE
+    //---------------------------------------------------------------------
+    /*
+    二维码各个版本信息[块数, 每块中的数据块数, 每块中的信息块数]
+     */
+    var RS_BLOCK_TABLE = [
+        // L
+        // M
+        // Q
+        // H
+        // 1
+        [1, 26, 19],
+        [1, 26, 16],
+        [1, 26, 13],
+        [1, 26, 9],
+
+        // 2
+        [1, 44, 34],
+        [1, 44, 28],
+        [1, 44, 22],
+        [1, 44, 16],
+
+        // 3
+        [1, 70, 55],
+        [1, 70, 44],
+        [2, 35, 17],
+        [2, 35, 13],
+
+        // 4
+        [1, 100, 80],
+        [2, 50, 32],
+        [2, 50, 24],
+        [4, 25, 9],
+
+        // 5
+        [1, 134, 108],
+        [2, 67, 43],
+        [2, 33, 15, 2, 34, 16],
+        [2, 33, 11, 2, 34, 12],
+
+        // 6
+        [2, 86, 68],
+        [4, 43, 27],
+        [4, 43, 19],
+        [4, 43, 15],
+
+        // 7
+        [2, 98, 78],
+        [4, 49, 31],
+        [2, 32, 14, 4, 33, 15],
+        [4, 39, 13, 1, 40, 14],
+
+        // 8
+        [2, 121, 97],
+        [2, 60, 38, 2, 61, 39],
+        [4, 40, 18, 2, 41, 19],
+        [4, 40, 14, 2, 41, 15],
+
+        // 9
+        [2, 146, 116],
+        [3, 58, 36, 2, 59, 37],
+        [4, 36, 16, 4, 37, 17],
+        [4, 36, 12, 4, 37, 13],
+
+        // 10
+        [2, 86, 68, 2, 87, 69],
+        [4, 69, 43, 1, 70, 44],
+        [6, 43, 19, 2, 44, 20],
+        [6, 43, 15, 2, 44, 16],
+
+        // 11
+        [4, 101, 81],
+        [1, 80, 50, 4, 81, 51],
+        [4, 50, 22, 4, 51, 23],
+        [3, 36, 12, 8, 37, 13],
+
+        // 12
+        [2, 116, 92, 2, 117, 93],
+        [6, 58, 36, 2, 59, 37],
+        [4, 46, 20, 6, 47, 21],
+        [7, 42, 14, 4, 43, 15],
+
+        // 13
+        [4, 133, 107],
+        [8, 59, 37, 1, 60, 38],
+        [8, 44, 20, 4, 45, 21],
+        [12, 33, 11, 4, 34, 12],
+
+        // 14
+        [3, 145, 115, 1, 146, 116],
+        [4, 64, 40, 5, 65, 41],
+        [11, 36, 16, 5, 37, 17],
+        [11, 36, 12, 5, 37, 13],
+
+        // 15
+        [5, 109, 87, 1, 110, 88],
+        [5, 65, 41, 5, 66, 42],
+        [5, 54, 24, 7, 55, 25],
+        [11, 36, 12],
+
+        // 16
+        [5, 122, 98, 1, 123, 99],
+        [7, 73, 45, 3, 74, 46],
+        [15, 43, 19, 2, 44, 20],
+        [3, 45, 15, 13, 46, 16],
+
+        // 17
+        [1, 135, 107, 5, 136, 108],
+        [10, 74, 46, 1, 75, 47],
+        [1, 50, 22, 15, 51, 23],
+        [2, 42, 14, 17, 43, 15],
+
+        // 18
+        [5, 150, 120, 1, 151, 121],
+        [9, 69, 43, 4, 70, 44],
+        [17, 50, 22, 1, 51, 23],
+        [2, 42, 14, 19, 43, 15],
+
+        // 19
+        [3, 141, 113, 4, 142, 114],
+        [3, 70, 44, 11, 71, 45],
+        [17, 47, 21, 4, 48, 22],
+        [9, 39, 13, 16, 40, 14],
+
+        // 20
+        [3, 135, 107, 5, 136, 108],
+        [3, 67, 41, 13, 68, 42],
+        [15, 54, 24, 5, 55, 25],
+        [15, 43, 15, 10, 44, 16],
+
+        // 21
+        [4, 144, 116, 4, 145, 117],
+        [17, 68, 42],
+        [17, 50, 22, 6, 51, 23],
+        [19, 46, 16, 6, 47, 17],
+
+        // 22
+        [2, 139, 111, 7, 140, 112],
+        [17, 74, 46],
+        [7, 54, 24, 16, 55, 25],
+        [34, 37, 13],
+
+        // 23
+        [4, 151, 121, 5, 152, 122],
+        [4, 75, 47, 14, 76, 48],
+        [11, 54, 24, 14, 55, 25],
+        [16, 45, 15, 14, 46, 16],
+
+        // 24
+        [6, 147, 117, 4, 148, 118],
+        [6, 73, 45, 14, 74, 46],
+        [11, 54, 24, 16, 55, 25],
+        [30, 46, 16, 2, 47, 17],
+
+        // 25
+        [8, 132, 106, 4, 133, 107],
+        [8, 75, 47, 13, 76, 48],
+        [7, 54, 24, 22, 55, 25],
+        [22, 45, 15, 13, 46, 16],
+
+        // 26
+        [10, 142, 114, 2, 143, 115],
+        [19, 74, 46, 4, 75, 47],
+        [28, 50, 22, 6, 51, 23],
+        [33, 46, 16, 4, 47, 17],
+
+        // 27
+        [8, 152, 122, 4, 153, 123],
+        [22, 73, 45, 3, 74, 46],
+        [8, 53, 23, 26, 54, 24],
+        [12, 45, 15, 28, 46, 16],
+
+        // 28
+        [3, 147, 117, 10, 148, 118],
+        [3, 73, 45, 23, 74, 46],
+        [4, 54, 24, 31, 55, 25],
+        [11, 45, 15, 31, 46, 16],
+
+        // 29
+        [7, 146, 116, 7, 147, 117],
+        [21, 73, 45, 7, 74, 46],
+        [1, 53, 23, 37, 54, 24],
+        [19, 45, 15, 26, 46, 16],
+
+        // 30
+        [5, 145, 115, 10, 146, 116],
+        [19, 75, 47, 10, 76, 48],
+        [15, 54, 24, 25, 55, 25],
+        [23, 45, 15, 25, 46, 16],
+
+        // 31
+        [13, 145, 115, 3, 146, 116],
+        [2, 74, 46, 29, 75, 47],
+        [42, 54, 24, 1, 55, 25],
+        [23, 45, 15, 28, 46, 16],
+
+        // 32
+        [17, 145, 115],
+        [10, 74, 46, 23, 75, 47],
+        [10, 54, 24, 35, 55, 25],
+        [19, 45, 15, 35, 46, 16],
+
+        // 33
+        [17, 145, 115, 1, 146, 116],
+        [14, 74, 46, 21, 75, 47],
+        [29, 54, 24, 19, 55, 25],
+        [11, 45, 15, 46, 46, 16],
+
+        // 34
+        [13, 145, 115, 6, 146, 116],
+        [14, 74, 46, 23, 75, 47],
+        [44, 54, 24, 7, 55, 25],
+        [59, 46, 16, 1, 47, 17],
+
+        // 35
+        [12, 151, 121, 7, 152, 122],
+        [12, 75, 47, 26, 76, 48],
+        [39, 54, 24, 14, 55, 25],
+        [22, 45, 15, 41, 46, 16],
+
+        // 36
+        [6, 151, 121, 14, 152, 122],
+        [6, 75, 47, 34, 76, 48],
+        [46, 54, 24, 10, 55, 25],
+        [2, 45, 15, 64, 46, 16],
+
+        // 37
+        [17, 152, 122, 4, 153, 123],
+        [29, 74, 46, 14, 75, 47],
+        [49, 54, 24, 10, 55, 25],
+        [24, 45, 15, 46, 46, 16],
+
+        // 38
+        [4, 152, 122, 18, 153, 123],
+        [13, 74, 46, 32, 75, 47],
+        [48, 54, 24, 14, 55, 25],
+        [42, 45, 15, 32, 46, 16],
+
+        // 39
+        [20, 147, 117, 4, 148, 118],
+        [40, 75, 47, 7, 76, 48],
+        [43, 54, 24, 22, 55, 25],
+        [10, 45, 15, 67, 46, 16],
+
+        // 40
+        [19, 148, 118, 6, 149, 119],
+        [18, 75, 47, 31, 76, 48],
+        [34, 54, 24, 34, 55, 25],
+        [20, 45, 15, 61, 46, 16]
+    ];
+
+    /**
+     * 根据数据获取对应版本
+     * @return {[type]} [description]
+     */
+    QRCodeAlg.prototype.getRightType = function () {
+        for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
+            var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
+            if (rsBlock == undefined) {
+                throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
+            }
+            var length = rsBlock.length / 3;
+            var totalDataCount = 0;
+            for (var i = 0; i < length; i++) {
+                var count = rsBlock[i * 3 + 0];
+                var dataCount = rsBlock[i * 3 + 2];
+                totalDataCount += dataCount * count;
+            }
+            var lengthBytes = typeNumber > 9 ? 2 : 1;
+            if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
+                this.typeNumber = typeNumber;
+                this.rsBlock = rsBlock;
+                this.totalDataCount = totalDataCount;
+                break;
+            }
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // QRBitBuffer
+    //---------------------------------------------------------------------
+    function QRBitBuffer() {
+        this.buffer = new Array();
+        this.length = 0;
+    }
+    QRBitBuffer.prototype = {
+        get: function (index) {
+            var bufIndex = Math.floor(index / 8);
+            return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1);
+        },
+        put: function (num, length) {
+            for (var i = 0; i < length; i++) {
+                this.putBit(((num >>> (length - i - 1)) & 1));
+            }
+        },
+        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++;
+        }
+    };
+
+
+
+    // xzedit
+    let qrcodeAlgObjCache = [];
+    /**
+     * 二维码构造函数,主要用于绘制
+     * @param  {参数列表} opt 传递参数
+     * @return {}
+     */
+    QRCode = function (opt) {
+        //设置默认参数
+        this.options = {
+            text: '',
+            size: 256,
+            correctLevel: 3,
+            background: '#ffffff',
+            foreground: '#000000',
+            pdground: '#000000',
+            image: '',
+            imageSize: 30,
+            canvasId: opt.canvasId,
+            context: opt.context,
+            usingComponents: opt.usingComponents,
+            showLoading: opt.showLoading,
+            loadingText: opt.loadingText,
+        };
+        if (typeof opt === 'string') { // 只编码ASCII字符串
+            opt = {
+                text: opt
+            };
+        }
+        if (opt) {
+            for (var i in opt) {
+                this.options[i] = opt[i];
+            }
+        }
+        //使用QRCodeAlg创建二维码结构
+        var qrCodeAlg = null;
+        for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
+            if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
+                qrCodeAlg = qrcodeAlgObjCache[i].obj;
+                break;
+            }
+        }
+        if (i == l) {
+            qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
+            qrcodeAlgObjCache.push({
+                text: this.options.text,
+                correctLevel: this.options.correctLevel,
+                obj: qrCodeAlg
+            });
+        }
+        /**
+         * 计算矩阵点的前景色
+         * @param {Obj} config
+         * @param {Number} config.row 点x坐标
+         * @param {Number} config.col 点y坐标
+         * @param {Number} config.count 矩阵大小
+         * @param {Number} config.options 组件的options
+         * @return {String}
+         */
+        let getForeGround = function (config) {
+            var options = config.options;
+            if (options.pdground && (
+                (config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
+                (config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
+                (config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
+            )) {
+                return options.pdground;
+            }
+            return options.foreground;
+        }
+        // 创建canvas
+        let createCanvas = function (options) {
+            if(options.showLoading){
+                uni.showLoading({
+                    title: options.loadingText,
+                    mask: true
+                });
+            }
+            var ctx = uni.createCanvasContext(options.canvasId, options.context);
+            var count = qrCodeAlg.getModuleCount();
+            var ratioSize = options.size;
+            var ratioImgSize = options.imageSize;
+            //计算每个点的长宽
+            var tileW = (ratioSize / count).toPrecision(4);
+            var tileH = (ratioSize / count).toPrecision(4);
+            //绘制
+            for (var row = 0; row < count; row++) {
+                for (var col = 0; col < count; col++) {
+                    var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
+                    var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
+                    var foreground = getForeGround({
+                        row: row,
+                        col: col,
+                        count: count,
+                        options: options
+                    });
+                    ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
+                    ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
+                }
+            }
+            if (options.image) {
+                var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
+                ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
+                // 画圆角矩形
+                function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
+                    ctxi.setLineWidth(lineWidth);
+                    ctxi.setFillStyle(options.background);
+                    ctxi.setStrokeStyle(options.background);
+                    ctxi.beginPath(); // draw top and top right corner 
+                    ctxi.moveTo(x + r, y);
+                    ctxi.arcTo(x + width, y, x + width, y + r, r); // draw right side and bottom right corner 
+                    ctxi.arcTo(x + width, y + height, x + width - r, y + height, r); // draw bottom and bottom left corner 
+                    ctxi.arcTo(x, y + height, x, y + height - r, r); // draw left and top left corner 
+                    ctxi.arcTo(x, y, x + r, y, r);
+                    ctxi.closePath();
+                    if (fill) {
+                        ctxi.fill();
+                    }
+                    if (stroke) {
+                        ctxi.stroke();
+                    }
+                }
+            }
+            setTimeout(() => {
+                ctx.draw(true, () => {
+                    // 保存到临时区域
+                    setTimeout(() => {
+                        uni.canvasToTempFilePath({
+                            width: options.width,
+                            height: options.height,
+                            destWidth: options.width,
+                            destHeight: options.height,
+                            canvasId: options.canvasId,
+                            quality: Number(1),
+                            success: function (res) {
+                                if (options.cbResult) {
+                                    // 由于官方还没有统一此接口的输出字段,所以先判定下  支付宝为 res.apFilePath
+                                    if (!empty(res.tempFilePath)) {
+                                        options.cbResult(res.tempFilePath)
+                                    } else if (!empty(res.apFilePath)) {
+                                        options.cbResult(res.apFilePath)
+                                    } else {
+                                        options.cbResult(res.tempFilePath)
+                                    }
+                                }
+                            },
+                            fail: function (res) {
+                                if (options.cbResult) {
+                                    options.cbResult(res)
+                                }
+                            },
+                            complete: function () {
+                                uni.hideLoading();
+                            },
+                        }, options.context);
+                    }, options.text.length + 100);
+                });
+            }, options.usingComponents ? 0 : 150);
+        }
+        createCanvas(this.options);
+        // 空判定
+        let empty = function (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
+        }
+    };
+    QRCode.prototype.clear = function (fn) {
+        var ctx = uni.createCanvasContext(this.options.canvasId, this.options.context)
+        ctx.clearRect(0, 0, this.options.size, this.options.size)
+        ctx.draw(false, () => {
+            if (fn) {
+                fn()
+            }
+        })
+    };
+})()
+
+export default QRCode

+ 205 - 0
node_modules/tki-qrcode/components/tki-qrcode/tki-qrcode.vue

@@ -0,0 +1,205 @@
+<template xlang="wxml" minapp="mpvue">
+	<view class="tki-qrcode">
+		<canvas class="tki-qrcode-canvas" :canvas-id="cid" :style="{width:cpSize+'px',height:cpSize+'px'}" />
+		<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>

+ 11 - 0
node_modules/tki-qrcode/main.js

@@ -0,0 +1,11 @@
+import Vue from 'vue'
+import App from './App'
+
+Vue.config.productionTip = false
+
+App.mpType = 'app'
+
+const app = new Vue({
+    ...App
+})
+app.$mount()

+ 60 - 0
node_modules/tki-qrcode/manifest.json

@@ -0,0 +1,60 @@
+{
+    "name" : "qrcode",
+    "appid" : "__UNI__2A8D346",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    "usingComponents": true,
+    "debug": true,
+    "app-plus" : {
+        /* 5+App特有相关 */
+        "modules" : {},
+        /* 模块配置 */
+        "distribute" : {
+            /* 应用发布信息 */
+            "android" : {
+                /* android打包配置 */
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            "ios" : {},
+            /* ios打包配置 */
+            "sdkConfigs" : {}
+        },
+		"usingComponents": true
+    },
+    /* SDK配置 */
+    "quickapp" : {},
+    /* 快应用特有相关 */
+    "mp-weixin" : {
+        /* 小程序特有相关 */
+        "appid" : "wx7d67739c63a7f3e0",
+        "setting" : {
+            "urlCheck" : true
+        },
+		"usingComponents": true
+    }
+}

+ 29 - 0
node_modules/tki-qrcode/package.json

@@ -0,0 +1,29 @@
+{
+  "name": "tki-qrcode",
+  "version": "0.1.6",
+  "description": "qrcode",
+  "main": "components/tki-qrcode/tki-qrcode.vue",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/q310550690/uni-app-qrcode.git"
+  },
+  "keywords": [
+    "qrcode",
+    "mpvue",
+    "uni-app",
+    "tki-qrcode",
+    "TikiUi"
+  ],
+  "author": "sxq",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/q310550690/uni-app-qrcode/issues"
+  },
+  "homepage": "https://github.com/q310550690/uni-app-qrcode#readme",
+  "__npminstall_done": true,
+  "_from": "tki-qrcode@0.1.6",
+  "_resolved": "https://registry.npmmirror.com/tki-qrcode/-/tki-qrcode-0.1.6.tgz"
+}

+ 16 - 0
node_modules/tki-qrcode/pages.json

@@ -0,0 +1,16 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "uni-app"
+			}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "uni-app",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8"
+	}
+}

+ 132 - 0
node_modules/tki-qrcode/pages/index/index.vue

@@ -0,0 +1,132 @@
+<template xlang="wxml">
+	<view class="container">
+		<view class="qrimg">
+			<view class="qrimg-i">
+				<tki-qrcode v-if="ifShow" cid="qrcode1" ref="qrcode" :val="val" :size="size" :unit="unit" :background="background" :foreground="foreground" :pdground="pdground" :icon="icon" :iconSize="iconsize" :lv="lv" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
+			</view>
+			<view class="qrimg-i">
+				<tki-qrcode v-if="ifShow" cid="qrcode2" ref="qrcode2" val="第二个二维码" :size="size" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
+			</view>
+		</view>
+		<view class="uni-padding-wrap">
+			<view class="uni-title">请输入要生成的二维码内容</view>
+		</view>
+		<view class="uni-list">
+			<input class="uni-input" placeholder="请输入要生成的二维码内容" v-model="val" />
+		</view>
+		<view class="uni-padding-wrap uni-common-mt">
+			<view class="uni-title">设置二维码大小</view>
+		</view>
+		<view class="body-view">
+			<slider :value="size" @change="sliderchange" min="50" max="500" show-value />
+		</view>
+		<view class="uni-padding-wrap">
+			<view class="btns">
+				<button type="primary" @tap="selectIcon">选择二维码图标</button>
+				<button type="primary" @tap="creatQrcode">生成二维码</button>
+				<button type="primary" @tap="saveQrcode">保存到图库</button>
+				<button type="warn" @tap="clearQrcode">清除二维码</button>
+				<button type="warn" @tap="ifQrcode">显示隐藏二维码</button>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+import tkiQrcode from '@/components/tki-qrcode/tki-qrcode.vue'
+export default {
+	data() {
+		return {
+			ifShow: true,
+			val: '二维码', // 要生成的二维码值
+			size: 200, // 二维码大小
+			unit: 'upx', // 单位
+			background: '#b4e9e2', // 背景色
+			foreground: '#309286', // 前景色
+			pdground: '#32dbc6', // 角标色
+			icon: '', // 二维码图标
+			iconsize: 40, // 二维码图标大小
+			lv: 3, // 二维码容错级别 , 一般不用设置,默认就行
+			onval: false, // val值变化时自动重新生成二维码
+			loadMake: true, // 组件加载完成后自动生成二维码
+			src: '' // 二维码生成后的图片地址或base64
+		}
+	},
+	methods: {
+		sliderchange(e) {
+			this.size = e.detail.value
+		},
+		creatQrcode() {
+			this.$refs.qrcode._makeCode()
+		},
+		saveQrcode() {
+			this.$refs.qrcode._saveCode()
+		},
+		qrR(res) {
+			this.src = res
+		},
+		clearQrcode() {
+			this.$refs.qrcode._clearCode()
+			this.val = ''
+		},
+		ifQrcode() {
+			this.ifShow = !this.ifShow
+		},
+		selectIcon() {
+			let that = this
+			uni.chooseImage({
+				count: 1, //默认9
+				sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+				sourceType: ['album'], //从相册选择
+				success: function (res) {
+					that.icon = res.tempFilePaths[0]
+					setTimeout(() => {
+						that.creatQrcode()
+					}, 100);
+					// console.log(res.tempFilePaths);
+				}
+			});
+		}
+	},
+	components: {
+		tkiQrcode
+	},
+	onLoad: function () { },
+}
+</script>
+
+<style>
+/* @import "../../../common/icon.css"; */
+.container {
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+}
+
+.qrimg {
+	display: flex;
+	justify-content: center;
+}
+.qrimg-i{
+	margin-right: 10px;
+}
+
+slider {
+	width: 100%;
+}
+
+input {
+	width: 100%;
+	margin-bottom: 20upx;
+}
+
+.btns {
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+}
+
+button {
+	width: 100%;
+	margin-top: 10upx;
+}
+</style>

+ 2 - 0
node_modules/tki-qrcode/static/README.md

@@ -0,0 +1,2 @@
+# 静态资源
+占位

+ 5 - 1
package.json

@@ -1 +1,5 @@
-{}
+{
+  "dependencies": {
+    "tki-qrcode": "^0.1.6"
+  }
+}

+ 37 - 2
pages.json

@@ -38,8 +38,8 @@
       "path": "pages/vcard/index",
       "style": {
         "navigationBarTitleText": "电子名片",
-		"navigationBarBackgroundColor": "#353F5C",
-		"navigationBarTextStyle": "white"
+        "navigationBarBackgroundColor": "#353F5C",
+        "navigationBarTextStyle": "white"
       }
     },
     {
@@ -48,6 +48,41 @@
         "navigationBarTitleText": "活动列表",
         "enablePullDownRefresh": false
       }
+    },
+    {
+      "path": "pages/commission/index",
+      "style": {
+        "navigationBarTitleText": "佣金列表",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/cashout/index",
+      "style": {
+        "navigationBarTitleText": "申请提现",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/cashout/record",
+      "style": {
+        "navigationBarTitleText": "提现记录",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/actdetail/index",
+      "style": {
+        "navigationBarTitleText": "详情",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3F8DFD"
+      }
+    },
+    {
+      "path": "pages/bill/index",
+      "style": {
+        "navigationBarTitleText": "海报"
+      }
     }
   ],
   "globalStyle": {

+ 217 - 0
pages/actdetail/index.vue

@@ -0,0 +1,217 @@
+<template>
+  <view class="actdetail-ward">
+    <view class="actdetail-ward-tbg">
+      <view class="actdetail-ward-top">
+        <view class="info fl_b">
+          <view class="title">{{ detailInfo.name }}</view>
+          <view class="act-status" v-if="detailInfo.status == 1">进行中</view>
+          <view class="act-status grey" v-else>已结束</view>
+        </view>
+        <view class="time"
+          >{{ detailInfo.startTime | formate("yyyy-mm-dd hh:mm") }} 到
+          {{ detailInfo.endTime | formate("yyyy-mm-dd hh:mm") }}</view
+        >
+      </view>
+    </view>
+    <view class="actdetail-ward-main">
+      <view class="actdetail-ward-goods detail-box">
+        <view class="title">商品及佣金</view>
+        <view class="goods-list">
+          <view
+            class="goods-list-item"
+            v-for="item in detailInfo.goodsList"
+            :key="item.id"
+          >
+            <view class="fl lebel">
+              <view>商品名称:</view>
+              <view>{{ item.goodsName }}</view>
+            </view>
+            <view class="fl lebel">
+              <view>商品价格:</view>
+              <view>{{ item.goodsPrice }}元</view>
+            </view>
+            <view class="fl lebel">
+              <view>分佣方式:</view>
+              <view>{{ ["百分比", "固定金额"][item.profitType - 1] }}</view>
+            </view>
+            <view class="fl lebel">
+              <view>数值:</view>
+              <view>{{ item.profitMax }}{{ item.profitType == 1 ? "%" : "" }}</view>
+            </view>
+            <view class="fl lebel">
+              <view>一级佣金:</view>
+              <view>{{ item.profitOne }}</view>
+            </view>
+            <view class="fl lebel">
+              <view>二级佣金:</view>
+              <view>{{ item.profitTwo }}</view>
+            </view>
+            <view class="fl lebel">
+              <view>三级级佣金:</view>
+              <view>{{ item.profitThree }}</view>
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="actdetail-ward-bom detail-box">
+        <view class="title">活动详情</view>
+        <view class="fl_b time u-border-bottom">
+          <text>佣金冻结期</text>
+          <text>7天</text>
+        </view>
+        <view class="desc">
+          <view class="desc-title">描述</view>
+          <text>{{ detailInfo.remark }}</text>
+        </view>
+      </view>
+    </view>
+    <view class="actdetail-btn">
+      <u-button
+        :disabled="isUse"
+        class="c_btn"
+        text="生成专属海报"
+        @click="jumpLogin"
+      ></u-button>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getActDetail } from "@/utils/act";
+export default {
+  name: "SaasManagerIndex",
+
+  data() {
+    return {
+      detailInfo: {},
+    };
+  },
+  onLoad(options) {
+    this.getActDetail(options.id);
+  },
+  methods: {
+    getActDetail(id) {
+      getActDetail(id).then((res) => {
+        this.detailInfo = res;
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+page {
+  background-color: #f6f7fb;
+}
+.actdetail-ward {
+  .actdetail-ward-tbg {
+    width: 100%;
+    height: 429rpx;
+    top: 80rpx;
+    background: linear-gradient(180deg, #3f8dfd 49%, rgba(0, 105, 255, 0) 100%);
+    padding: 44rpx 24rpx 0;
+    box-sizing: border-box;
+
+    .actdetail-ward-top {
+      .info {
+        align-items: flex-start;
+        .title {
+          width: 80%;
+          font-weight: bold;
+          color: #ffffff;
+          font-size: 36rpx;
+          line-height: 50rpx;
+        }
+        .act-status {
+          background: #44ca7d;
+          padding: 6rpx 12rpx;
+          border-radius: 20rpx 20rpx 0 20rpx;
+          font-weight: bold;
+          color: #ffffff;
+          font-size: 24rpx;
+        }
+        .grey {
+          background: #c0cad9;
+        }
+      }
+      .time {
+        color: #ffffff;
+        font-size: 28rpx;
+        margin-top: 16rpx;
+        opacity: 0.8;
+      }
+    }
+  }
+  .actdetail-ward-main {
+    padding: 24rpx 24rpx 168rpx;
+    position: absolute;
+    top: 180rpx;
+    width: 100%;
+    box-sizing: border-box;
+    .actdetail-ward-goods {
+      margin-bottom: 24rpx;
+      .goods-list {
+        .goods-list-item {
+          background: #fafafa;
+          border-radius: 8rpx;
+          padding: 32rpx 32rpx 0;
+          color: #7e7d83;
+          font-size: 26rpx;
+          margin-bottom: 24rpx;
+          .lebel {
+            align-items: flex-start;
+            view {
+              margin-bottom: 20rpx;
+              &:nth-of-type(1) {
+                width: 170rpx;
+              }
+              &:nth-of-type(2) {
+                flex: 1;
+                line-height: 40rpx;
+              }
+            }
+          }
+        }
+      }
+    }
+    .actdetail-ward-bom {
+      .time {
+        color: #484848;
+        font-size: 32rpx;
+        padding-bottom: 32rpx;
+      }
+    }
+    .detail-box {
+      background: #ffffff;
+      border-radius: 16rpx;
+      padding: 32rpx 24rpx 1rpx;
+      .title {
+        font-weight: bold;
+        color: #24263d;
+        font-size: 32rpx;
+        margin-bottom: 32rpx;
+      }
+      .desc {
+        padding-bottom: 40rpx;
+        .desc-title {
+          padding: 32rpx 0 24rpx;
+        }
+        text {
+          color: #484848;
+          font-size: 28rpx;
+          opacity: 0.7;
+        }
+      }
+    }
+  }
+  .actdetail-btn {
+    width: 100%;
+    background: #ffffff;
+    height: 144rpx;
+    padding: 24rpx;
+    position: fixed;
+    bottom: 0;
+    box-sizing: border-box;
+  }
+}
+</style>

+ 13 - 3
pages/actlist/index.vue

@@ -1,6 +1,11 @@
 <template>
   <view class="act-ward">
-    <view v-for="item in actList" :key="item.posterId" class="act-ward-box">
+    <view
+      v-for="item in actList"
+      :key="item.distributionId"
+      class="act-ward-box"
+      @click="toDetail(item.distributionId)"
+    >
       <view class="act-ward-box-top fl_b">
         <view class="title">{{ item.name }}</view>
         <view class="act-status" v-if="item.status == 1">进行中</view>
@@ -19,7 +24,7 @@
       <view class="line"></view>
       <view class="act-ward-box-btn">
         <text></text>
-        <view @click="makePoster(item.distributionId)">下载海报</view>
+        <view @click.stop="makePoster(item.distributionId)">生成海报</view>
       </view>
     </view>
   </view>
@@ -55,6 +60,11 @@ export default {
         downloadFile(await base64ToPath(res), "海报");
       });
     },
+    toDetail(distributionId) {
+      uni.navigateTo({
+        url: "/pages/actdetail/index?id=" + distributionId,
+      });
+    },
   },
   onLoad(option) {},
   onShow() {
@@ -97,7 +107,7 @@ page {
       }
       .act-status {
         background: #44ca7d;
-        padding: 10rpx 15rpx;
+        padding: 6rpx 12rpx;
         border-radius: 20rpx 20rpx 0 20rpx;
         font-weight: bold;
         color: #ffffff;

+ 51 - 0
pages/bill/index.vue

@@ -0,0 +1,51 @@
+<template>
+  <view>
+    <tki-qrcode
+      ref="qrcode"
+      :val="val"
+      :size="size"
+      :unit="unit"
+      :background="background"
+      :foreground="foreground"
+      :pdground="pdground"
+      :lv="lv"
+      :onval="onval"
+      :loadMake="loadMake"
+      @result="qrR"
+    />
+  </view>
+</template>
+
+<script>
+import tkiQrcode from "tki-qrcode";
+export default {
+  name: "SaasManagerIndex",
+
+  data() {
+    return {
+      val: "生成二维码内容", //要生成二维码的值
+      size: 250, // 二维码的大小 单位为rpx
+      background: "#ffffff", //背景色
+      foreground: "#000000",
+      pdground: "#000000", //角标色
+      icon: "", //二维码图标
+      iconsize: 30, //二维码图标大小
+      lv: 3, //二维码容错级别
+      onval: true, //val值变化时自动重新生成二维码
+      unit: "upx",
+      loadMake: true, //组件加载完成后自动生成二维码
+      src: "",
+      showLoading: true, //loading
+      loadingText: "loading内容", //loading内容
+      title: "Hello",
+    };
+  },
+  components: {
+    tkiQrcode,
+  },
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 200 - 0
pages/cashout/index.vue

@@ -0,0 +1,200 @@
+<template>
+  <view class="cash-ward">
+    <view class="cash-ward-top">
+      <view class="title">提现</view>
+      <view class="money" v-if="userInfo">{{ userInfo.cash | toFixed }}</view>
+      <view>可提现金额</view>
+      <view class="btn btn_c" @click="open">申请提现</view>
+    </view>
+    <view class="cash-ward-tips">
+      <view>提现注意事项:</view>
+      <view>1.当佣金被结算时有一定的冻结期,被解冻的佣金方可提现 </view>
+      <view
+        >2.微信打款当日单笔金额最多500元,当日最多20000元2.通常在1-3个工作日内可到账</view
+      >
+    </view>
+    <view class="bg_f3"></view>
+    <view class="cash-ward-bom fl_b u-border-bottom" @click="toRecord">
+      <view>提现记录</view>
+      <image src="../../static/image/icon_more.png" mode="" />
+    </view>
+    <u-popup
+      :show="show"
+      :round="30"
+      mode="center"
+      @close="close"
+      :closeable="true"
+    >
+      <view class="popup-main">
+        <view class="popup-main-title u-border-bottom">确认提现</view>
+        <view class="popup-main-money u-border-bottom">
+          <text>提现金额</text>
+          <u--input
+            placeholder="请输入提现金额"
+            v-model="money"
+            type="number"
+            border="node"
+            placeholderStyle="fontSize:36rpx"
+            inputAlign="center"
+            color="#24263D"
+            fontSize="36px"
+          ></u--input>
+        </view>
+        <view class="popup-main-mode fl_b u-border-bottom">
+          <view class="fl"
+            ><image src="../../static/image/icon_wallet.png" mode="" /><text
+              >提现到微信钱包</text
+            ></view
+          >
+          <image src="../../static/image/icon_tick.png" mode="" />
+        </view>
+        <u-button
+        :disabled="isUse"
+        class="c_btn popup-main-btn"
+        text="确 认"
+        @click="jumpLogin"
+      ></u-button>
+      </view>
+    </u-popup>
+  </view>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  name: "SaasManagerIndex",
+
+  data() {
+    return {
+      show: false,
+      money: 0,
+    };
+  },
+  onShow() {
+    if (this.$method.isGoLogin()) {
+      return;
+    }
+    !this.userInfo && this.$store.dispatch("getUserInfo");
+  },
+  methods: {
+    close() {
+      this.show = false;
+    },
+    open() {
+      this.show = true;
+      this.money = this.userInfo.cash;
+    },
+    toRecord() {
+      uni.navigateTo({
+        url: "/pages/cashout/record",
+      });
+    },
+  },
+  computed: {
+    ...mapGetters(["userInfo"]),
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+page {
+  background: #ffffff;
+  padding: 60rpx 40rpx 0;
+}
+.cash-ward {
+  .cash-ward-top {
+    box-sizing: border-box;
+    color: #ffffff;
+    height: 516rpx;
+    background: url("../../static/image/cash_bg.png");
+    background-size: 100% 100%;
+    padding: 66rpx 40rpx 48rpx;
+    font-size: 32rpx;
+    .title {
+      font-weight: bold;
+      font-size: 40rpx;
+    }
+    .money {
+      font-weight: bold;
+      font-size: 72rpx;
+      margin: 40rpx 0 6rpx;
+    }
+    .btn {
+      background: #ffffff;
+      color: #3f8dfd;
+      border-radius: 100rpx;
+      margin-top: 72rpx;
+    }
+  }
+  .cash-ward-tips {
+    margin-top: 40rpx;
+    font-size: 26rpx;
+    padding-bottom: 64rpx;
+    view {
+      color: #7e7d83;
+      line-height: 44rpx;
+      &:nth-of-type(1) {
+        color: #222222;
+      }
+    }
+  }
+  .bg_f3 {
+    width: 100vw;
+    height: 16rpx;
+    margin-left: -40rpx;
+  }
+  .cash-ward-bom {
+    padding: 40rpx 0;
+    font-weight: bold;
+    color: #24263d;
+    font-size: 32rpx;
+    image {
+      width: 40rpx;
+      height: 40rpx;
+    }
+  }
+  .popup-main {
+    width: 560rpx;
+    height: 600rpx;
+    background: #ffffff;
+    border-radius: 24rpx;
+    padding: 0 40rpx 40rpx;
+    .popup-main-title {
+      font-weight: bold;
+      color: #24263d;
+      font-size: 36rpx;
+      text-align: center;
+      line-height: 98rpx;
+    }
+    .popup-main-money {
+      padding: 32rpx 0 44rpx;
+      text-align: center;
+      text {
+        color: #7e7d83;
+        font-size: 28rpx;
+        margin-bottom: 8rpx;
+      }
+    }
+    .popup-main-mode {
+      padding: 28rpx 0;
+      image {
+        width: 32rpx;
+        height: 32rpx;
+      }
+      view {
+        color: #484848;
+        font-size: 28rpx;
+        image {
+          width: 48rpx;
+          height: 48rpx;
+          margin-right: 28rpx;
+        }
+      }
+    }
+    .popup-main-btn {
+      border-radius: 136rpx;
+      margin-top: 70rpx;
+    }
+  }
+}
+</style>

+ 75 - 0
pages/cashout/record.vue

@@ -0,0 +1,75 @@
+<template>
+  <view class="com-ward">
+    <view class="com-ward-list">
+      <view
+        class="com-ward-list-item u-border-bottom"
+        v-for="item in list"
+        :key="item.id"
+      >
+        <view class="fl_b com-ward-list-item-top">
+          <view class="title"
+            >2023年3月1日 10:53</view
+          >
+          <view class="money">120</view>
+        </view>
+        <view class="com-ward-list-item-status">
+           已申请
+        </view>
+      </view>
+    </view>
+    <view class="nomore">已显示全部</view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "commission",
+
+  data() {
+    return {
+      list: [{ id: 1 }, { id: 2 }],
+    };
+  },
+
+  mounted() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped>
+page {
+  background: #ffffff;
+  padding: 20rpx 40rpx 0;
+}
+.com-ward {
+  .com-ward-list {
+    .com-ward-list-item {
+      margin-top: 40rpx;
+      .com-ward-list-item-top {
+        image {
+          width: 40rpx;
+          height: 40rpx;
+          margin-right: 12rpx;
+        }
+        .title {
+          font-weight: bold;
+          color: #24263d;
+          font-size: 32rpx;
+        }
+        .money {
+          color: #eb5757;
+          font-size: 36rpx;
+          font-weight: 500;
+          text-align: right;
+        }
+      }
+      .com-ward-list-item-status {
+        margin: 24rpx 0 40rpx;
+        color: #7e7d83;
+        font-size: 28rpx;
+      }
+    }
+  }
+}
+</style>

+ 85 - 0
pages/commission/index.vue

@@ -0,0 +1,85 @@
+<template>
+  <view class="com-ward">
+    <view class="com-ward-list">
+      <view
+        class="com-ward-list-item u-border-bottom"
+        v-for="item in list"
+        :key="item.id"
+      >
+        <view class="fl_b com-ward-list-item-top">
+          <image src="../../static/image/icon_com.png" mode="" />
+          <view class="title u-line-1"
+            >活动名称一行展示,超出省略活动名称一行展示,超出省略...</view
+          >
+          <view class="money">+120</view>
+        </view>
+        <view class="fl com-ward-list-item-status">
+          <view class="u-border-right">正常</view>
+          <view>2023年3月1日 10:53</view>
+        </view>
+      </view>
+    </view>
+    <view class="nomore">已显示全部</view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "commission",
+
+  data() {
+    return {
+      list: [{ id: 1 }, { id: 2 }],
+    };
+  },
+
+  mounted() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped>
+page {
+  background: #ffffff;
+  padding: 20rpx 40rpx 0;
+}
+.com-ward {
+  .com-ward-list {
+    .com-ward-list-item {
+      margin-top: 40rpx;
+      .com-ward-list-item-top {
+        image {
+          width: 40rpx;
+          height: 40rpx;
+          margin-right: 12rpx;
+        }
+        .title {
+          flex: 1;
+          font-weight: bold;
+          color: #24263d;
+          font-size: 32rpx;
+        }
+        .money {
+          width: 160rpx;
+          color: #eb5757;
+          font-size: 36rpx;
+          font-weight: 500;
+          text-align: right;
+        }
+      }
+      .com-ward-list-item-status {
+        margin: 24rpx 0 40rpx;
+        color: #7e7d83;
+        font-size: 28rpx;
+
+        view {
+          line-height: 28rpx;
+          padding-right: 24rpx;
+          margin-right: 24rpx;
+        }
+      }
+    }
+  }
+}
+</style>

+ 21 - 21
pages/index/index.vue

@@ -1,25 +1,29 @@
 <template>
   <view>
-    <view v-if="isLogin" class="imgs_bg">
+    <view v-if="isLogin && userInfo" class="imgs_bg">
       <view class="infos" @click="to('/pages/profile/index')">
         <image
           :src="
-            userInfo && userInfo.avatar
+            userInfo.avatar
               ? $method.splitImgHost(userInfo.avatar, true)
               : defaultHead
           "
         ></image>
-        <text>{{ userInfo && userInfo.realname }}</text>
+        <text>{{ userInfo.realname }}</text>
       </view>
       <view class="profit">
         <view class="profit-commis fl_b">
-          <view class="profit-commis-money">5200.88</view>
-          <view class="profit-commis-btn">提现</view>
+          <view class="profit-commis-money">{{
+            (userInfo.cash + userInfo.usedCash + userInfo.freezeCash) | toFixed
+          }}</view>
+          <view class="profit-commis-btn" @click="to('/pages/cashout/index')"
+            >提现</view
+          >
         </view>
         <text>总佣金</text>
         <view class="profit-embody fl_b">
-          <view>可提现:4388.78元</view>
-          <view>已提现:1200.09元</view>
+          <view>可提现:{{ userInfo.cash | toFixed }}元</view>
+          <view>已提现:{{ userInfo.usedCash | toFixed }}元</view>
         </view>
       </view>
       <view class="about">
@@ -41,7 +45,12 @@
     <view class="login_wrap" v-if="!isLogin">
       <view class="login_text">欢迎来到业务员平台</view>
       <view class="login_text">您还没有登录哦~</view>
-      <view class="loginBtn" @click="jumpLogin">立即登录/注册</view>
+      <u-button
+        :disabled="isUse"
+        class="c_btn loginBtn"
+        text="立即登录/注册"
+        @click="jumpLogin"
+      ></u-button>
     </view>
   </view>
 </template>
@@ -62,7 +71,7 @@ export default {
         {
           title: "佣金收益",
           icon: "../../static/image/icon_profit.png",
-          path: "/pages/profile/index",
+          path: "/pages/commission/index",
         },
       ],
     };
@@ -90,7 +99,9 @@ export default {
       });
     },
   },
-  computed: { ...mapGetters(["userInfo"]) },
+  computed: {
+    ...mapGetters(["userInfo"]),
+  },
 };
 </script>
 <style>
@@ -118,13 +129,6 @@ page {
 
   .loginBtn {
     width: 86%;
-    height: 100rpx;
-    background: #3f8dfd;
-    border-radius: 16rpx;
-    font-weight: bold;
-    font-size: 32rpx;
-    color: #ffffff;
-    line-height: 100rpx;
     margin: 0 auto;
   }
 }
@@ -134,11 +138,7 @@ page {
   width: 100%;
   height: 429rpx;
   padding-top: 60rpx;
-  position: fixed;
-  top: 80rpx;
-  z-index: 999;
   background: linear-gradient(180deg, #3f8dfd 49%, rgba(0, 105, 255, 0) 100%);
-  border-radius: 0px 0px 0px 0px;
   .infos {
     display: flex;
     align-items: center;

+ 0 - 10
pages/login/login.vue

@@ -1,15 +1,5 @@
 <template>
   <view class="loginpage">
-    <!-- <view style="width: 400rpx">
-      <u-subsection
-        @change="sectionChange"
-        :list="list"
-        :current="current"
-        active-color="#007AFF"
-        inactive-color="#ffffff"
-        bgColor="#3F8DFD"
-      ></u-subsection>
-    </view> -->
     <view class="tab-box">
       <view
         v-for="tab in list"

+ 41 - 6
pages/vcard/index.vue

@@ -20,7 +20,7 @@
           </view>
           <view class="info-item fll">
             <image src="../../static/image/icon-business.png" mode=""></image>
-            <view class=""> 广州市祥粤建设职业培训建设职业培训 </view>
+            <view class=""> {{ userInfo.tenantName }}</view>
           </view>
         </view>
       </view>
@@ -31,6 +31,10 @@
         文案文案规则说明文案文案规则说明,文案文案规则说明文案文案规则说明文案文案明,文案文案规则说明文案文案规则说明文案文案规则说明,文案文案规则说明文案文案规则说明文案文案规则说明,文案文案规则说明文案文案规则说明文案文案规则说明,文案文案规则说明
       </view>
     </view>
+    <view class="vcard-ward-btns fl_b">
+      <view @click="toLogin">登录</view>
+      <view style="background: #5a8cff" @click="toRegister">注册</view>
+    </view>
   </view>
 </template>
 
@@ -43,11 +47,26 @@ export default {
       userInfo: {},
     };
   },
-  methods: {},
+  methods: {
+    getInfoByShareCode(shareCode) {
+      shareCode &&
+        getInfoByShareCode({ shareCode }).then((res) => {
+          this.userInfo = res;
+        });
+    },
+    toLogin() {
+      uni.navigateTo({
+        url: "/pages/login/login",
+      });
+    },
+    toRegister() {
+      uni.navigateTo({
+        url: "/pages/login/register",
+      });
+    },
+  },
   onLoad(option) {
-    getInfoByShareCode({ shareCode: option.shareCode }).then((res) => {
-      this.userInfo = res;
-    });
+    this.getInfoByShareCode(option.shareCode);
   },
 };
 </script>
@@ -64,7 +83,6 @@ image {
 
 .vcard-ward {
   padding: 60rpx 40rpx;
-
   .vcard-ward-info {
     padding-top: 16rpx;
     background: #417bff;
@@ -147,5 +165,22 @@ image {
       line-height: 48rpx;
     }
   }
+
+  .vcard-ward-btns {
+    width: 90%;
+    height: 100rpx;
+    position: fixed;
+    bottom: 40rpx;
+    view {
+      width: 320rpx;
+      text-align: center;
+      line-height: 100rpx;
+      font-weight: bold;
+      color: #ffffff;
+      font-size: 32rpx;
+      background: #44ca7d;
+      border-radius: 16rpx;
+    }
+  }
 }
 </style>

BIN
static/image/cash_bg.png


BIN
static/image/icon_com.png


BIN
static/image/icon_tick.png


BIN
static/image/icon_wallet.png


+ 21 - 1
uni.scss

@@ -76,12 +76,13 @@ $uni-color-paragraph: #3f536e; // 文章段落颜色
 $uni-font-size-paragraph: 15px;
 
 .c_btn {
-  height: 90rpx;
+  height: 100rpx;
   border-radius: 16rpx;
   background: #3f8dfd;
   color: #ffffff;
   span {
     font-size: 32rpx;
+    font-weight: bold;
   }
 }
 
@@ -95,3 +96,22 @@ $uni-font-size-paragraph: 15px;
   align-items: center;
   justify-content: space-between;
 }
+
+.nomore {
+  color: #b7b8bc;
+  font-size: 26rpx;
+  text-align: center;
+  margin-top: 24rpx;
+}
+
+.bg_f3 {
+  background: #f3f3f3;
+}
+
+.btn_c {
+  line-height: 100rpx;
+  height: 100rpx;
+  text-align: center;
+  font-weight: bold;
+  font-size: 32rpx;
+}

+ 7 - 0
utils/act.js

@@ -15,3 +15,10 @@ export function makePoster(data) {
     data: data,
   });
 }
+// 活动详情
+export function getActDetail(id) {
+  return myRequest({
+    url: "/distribution/activity/" + id,
+    method: "get",
+  });
+}