lex-xin 4 月之前
父节点
当前提交
af734f919d
共有 32 个文件被更改,包括 1508 次插入1877 次删除
  1. 9 1
      miniprogram/api/login.ts
  2. 7 0
      miniprogram/app.ts
  3. 8 5
      miniprogram/pages/index/index.ts
  4. 29 1
      miniprogram/pages/orders/order-result.less
  5. 126 135
      miniprogram/pages/orders/order-result.ts
  6. 17 22
      miniprogram/pages/orders/order-result.wxml
  7. 84 64
      miniprogram/pages/orders/orders.ts
  8. 21 20
      miniprogram/pages/orders/orders.wxml
  9. 1203 0
      miniprogram/utils/qrcode.js
  10. 4 0
      miniprogram/utils/weapp.qrcode.esm.js
  11. 0 5
      node_modules/.package-lock.json
  12. 0 20
      node_modules/wxbarcode/.editorconfig
  13. 0 21
      node_modules/wxbarcode/.eslintrc.yml
  14. 0 20
      node_modules/wxbarcode/.gitattributes
  15. 0 105
      node_modules/wxbarcode/.npmignore
  16. 0 3
      node_modules/wxbarcode/.travis.yml
  17. 0 21
      node_modules/wxbarcode/LICENSE
  18. 0 66
      node_modules/wxbarcode/README.md
  19. 二进制
      node_modules/wxbarcode/capture.png
  20. 0 2
      node_modules/wxbarcode/demo/app.js
  21. 0 11
      node_modules/wxbarcode/demo/app.json
  22. 0 1
      node_modules/wxbarcode/demo/app.wxss
  23. 0 14
      node_modules/wxbarcode/demo/pages/index/index.js
  24. 0 14
      node_modules/wxbarcode/demo/pages/index/index.wxml
  25. 0 70
      node_modules/wxbarcode/demo/pages/index/index.wxss
  26. 0 402
      node_modules/wxbarcode/demo/utils/barcode.js
  27. 0 23
      node_modules/wxbarcode/demo/utils/index.js
  28. 0 778
      node_modules/wxbarcode/demo/utils/qrcode.js
  29. 0 1
      node_modules/wxbarcode/index.js
  30. 0 36
      node_modules/wxbarcode/package.json
  31. 0 13
      package-lock.json
  32. 0 3
      package.json

+ 9 - 1
miniprogram/api/login.ts

@@ -57,7 +57,6 @@ export const api_queryByParamName = (params: any) => {
   } as any);
 };
 
-
 /** 订单列表 */
 export const api_studentOrderPage = (params: any) => {
   return request({
@@ -65,4 +64,13 @@ export const api_studentOrderPage = (params: any) => {
     method: "post",
     data: params,
   } as any);
+};
+
+
+/** 订单详情 */
+export const api_userPaymentOrderDetail = (orderNo: string) => {
+  return request({
+    url: `/edu-app/userPaymentOrder/detail/${orderNo}`,
+    method: "get"
+  } as any);
 };

+ 7 - 0
miniprogram/app.ts

@@ -15,6 +15,12 @@ App<IAppOption>({
     // const logs = wx.getStorageSync('logs') || []
     // logs.unshift(Date.now())
     // wx.setStorageSync('logs', logs)
+
+    wx.showLoading({
+      mask: true,
+      title: "加载中...",
+    });
+
     this.setAppId();
 
     // 登录
@@ -73,5 +79,6 @@ App<IAppOption>({
         this.globalData.isLogin = false;
       }
     } catch {}
+    wx.hideLoading()
   }
 })

+ 8 - 5
miniprogram/pages/index/index.ts

@@ -37,12 +37,11 @@ Page({
       list.forEach((item: any) => {
         item.originalPrice = this.formatPrice(item.originalPrice, 'ALL');
         item.typeName = this.formatPeriod(item.num, item.period);
+        const prices: any = this.formatPrice(item.salePrice)
+        item.integerPart = prices.integerPart
+        item.decimalPart = prices.decimalPart
         if(item.stockNum > 0 && !selected.id) {
-          const prices: any = this.formatPrice(item.salePrice)
-          selected = {
-            ...item,
-            ...prices
-          }
+          selected = item
         }
       });
       this.setData({
@@ -81,6 +80,10 @@ Page({
   onSelectGoods(e: any) {
     const { dataset } = e.currentTarget
     const item = this.data.list.find((item: any) => item.id === dataset.id)
+    // 判断是否有库存
+    if(item.stockNum <= 0) {
+      return
+    }
     this.setData({
       selected: item || {}
     })

+ 29 - 1
miniprogram/pages/orders/order-result.less

@@ -38,6 +38,7 @@ page {
   border-radius: 20rpx;
   padding: 28rpx 24rpx;
   display: flex;
+  flex-direction: column;
   background-color: #FFFFFF;
 }
 .item-content {
@@ -101,6 +102,33 @@ page {
 
 }
 
+.qrcode-section {
+  margin-top: 28rpx;
+  border-top: 2rpx solid #F0F0F0;
+  padding-top: 60rpx;
+  padding-bottom: 32rpx;
+  text-align: center;
+  .qrcode-wrap {
+    margin: 0 auto;
+    border: 3rpx solid #EDEDED;
+    padding: 10rpx;
+    display: inline-block;
+  }
+  .my_draw_canvas {
+    width: 262rpx;
+    height: 262rpx;
+  }
+  .qrcode-text {
+    padding-top: 32rpx;
+    font-size: 28rpx;
+    color: #131415;
+    line-height: 40rpx;
+    &.used {
+      color: #AAAAAA;
+    }
+  }
+}
+
 .order-time {
   margin: 24rpx 26rpx 0;
   border-radius: 20rpx;
@@ -166,7 +194,7 @@ page {
 
   button {
     margin: 0;
-    width: auto;
+    width: 100%;
     background: linear-gradient( 270deg, #FF204B 0%, #FE5B71 100%);
     border-radius: 78rpx;
     padding: 22rpx 84rpx;

+ 126 - 135
miniprogram/pages/orders/order-result.ts

@@ -1,188 +1,179 @@
 // pages/orders/order-detail.ts
-
-import { api_executeOrder, api_executePayment, api_queryByParamName } from "../../api/login";
+import drawQrcode from "../../utils/weapp.qrcode.esm";
+import { api_userPaymentOrderDetail } from "../../api/login";
 
 // 获取应用实例
-const app = getApp<IAppOption>()
 Page({
-
   /**
    * 页面的初始数据
    */
   data: {
-    status: 'ing',
+    status: 'WAIT_PAY',
     statusList: {
-      ing: {
+      WAIT_PAY: {
         logo: './images/ing.png',
         title: '等待付款',
         content: '请尽快完成支付,以便我们为您处理订单'
       },
-      success: {
+      SUCCESS: {
         logo: './images/success.png',
         title: '交易完成',
         content: '登录「音乐数字课堂」APP使用AI学练'
       },
-      error: {
+      CLOSED: {
         logo: './images/error.png',
         title: '交易取消',
         content: '您的交易订单已关闭'
       },
-      wait: {
+      WAIT_USE: {
         logo: './images/wait.png',
         title: '等待使用',
         content: '请尽快扫描下方二维码进行激活'
       }
     },
     goodsInfo: {} as any,
-    paymentType: null as any, // 支付类型
+    orderNo: "" as string,
+    canvasImg: "" as string
   },
 
   /**
    * 生命周期函数--监听页面加载
    */
   onLoad(options: any) {
-    this.queryPayType()
-    if (options.orderInfo) {
-      const goods = JSON.parse(decodeURIComponent(options.orderInfo));
+    if (options.orderNo) {
       this.setData({
-        goodsInfo: goods,
-        status: goods.status
+        orderNo: options.orderNo
+      }, () => {
+        this.getDetail()
       });
     }
   },
-  // 获取后台配置的支付方式
-  async queryPayType() {
+  async getDetail() {
     try {
-      const { data } = await api_queryByParamName({
-        paramName: 'payment_service_provider'
-      });
+      const { data } = await api_userPaymentOrderDetail(this.data.orderNo);
       if (data.code == 200) {
-        const paramValue = data.data.paramValue ? JSON.parse(data.data.paramValue) : {}
+        const result = data.data || {}
+        const goodsInfos = result.goodsInfos || []
+        const tempGoods: any = []
+        goodsInfos.forEach((item: any) => {
+          tempGoods.push({
+            ...item,
+            originalPrice: this.formatPrice(item.paymentCashAmount, 'ALL'),
+            typeName: this.formatPeriod(item.goodsNum, item.activationCodeInfo.type)
+          })
+        })
+        const goodsInfo = {
+          orderNo: result.orderNo,
+          createTime: result.createTime,
+          wechatStatus: result.wechatStatus,
+          goods: tempGoods
+        }
         this.setData({
-          paymentType: paramValue.vendor,
-        });
+          goodsInfo,
+          status: result.wechatStatus
+        })
+        if(result.wechatStatus != 'CLOSED') {
+          this.createQrCode(
+            'https://www.baidu.com/',
+            'canvasCode')
+        }
       }
     } catch (error) {
       console.log(error, "error");
     }
   },
-  // 购买
-  async onSubmit() {
-    wx.showLoading({
-      mask: true,
-      title: "订单提交中...",
-    });
-    try {
-      const { salePrice, shopId, name, id } = this.data.goodsInfo
-      const { data } = await api_executeOrder({
-        "orderType": "WECHAT_MINI",
-        "paymentType": this.data.paymentType,
-        "paymentCashAmount": salePrice,
-        "paymentCouponAmount": 0,
-        "shopId": shopId,
-        "opneId": app.globalData.userInfo?.liteOpenid,
-        "goodsInfos": [{
-          "goodsId": id,
-          "goodsNum": 1,
-          "goodsType": "ACTIVATION_CODE",
-          "paymentCashAmount": salePrice,
-          "paymentCouponAmount": 0
-        }],
-        "orderName": name,
-        "orderDesc": name
-      })
-      console.log(data, 'data')
-
-      if (data.code === 200) {
-        const { paymentConfig, paymentType } = data.data
-        const res = await api_executePayment({
-          merOrderNo: paymentConfig.merOrderNo,
-          paymentChannel: 'wxpay-app',
-          paymentType,
-          userId: app.globalData.userInfo?.id
-        })
-        wx.hideLoading()
-        this.onPay(paymentType, res.data.data.reqParams)
-      } else {
-        wx.hideLoading()
-        wx.showToast({
-          title: '支付失败',
-          icon: 'none'
-        })
-      }
-    } catch {
-      wx.hideLoading()
+  // 格式化价格
+  formatPrice(price: number, type?: string) {
+    const amountStr = price.toFixed(2)
+    const [integerPart, decimalPart] = amountStr.split('.');
+    if(type === 'ALL') {
+      return amountStr
+    }
+    return {
+      integerPart,
+      decimalPart
     }
   },
-  onPay(paymentType: string, paymentConfig: any) {
-    const isYeePay = paymentType.indexOf('yeepay') !== -1
-    const prePayInfo = isYeePay ? JSON.parse(paymentConfig.prePayTn)
-      : paymentConfig?.expend
-        ? JSON.parse(paymentConfig?.expend?.pay_info)
-        : paymentConfig
-    wx.requestPayment({
-      timeStamp: prePayInfo.timeStamp,
-      nonceStr: prePayInfo.nonceStr,
-      package: prePayInfo.package ? prePayInfo.package : prePayInfo.packageValue,
-      paySign: prePayInfo.paySign,
-      signType: prePayInfo.signType ? prePayInfo.signType : 'MD5',
-      success(resInfo) {
-        console.log('支付成功', resInfo)
-        wx.showToast({ title: '支付成功~', icon: 'success' });
-        // that.onClose('end')
-        
-      },
-      fail(ressonInfo) {
-        console.log('支付失败', ressonInfo)
-        wx.showToast({ title: '支付失败!', icon: 'none' });
-      }
-    })
-  },
-  /**
-   * 生命周期函数--监听页面初次渲染完成
-   */
-  onReady() {
-  },
-
-  /**
-   * 生命周期函数--监听页面显示
-   */
-  onShow() {
-
+  // 格式化类型
+  formatPeriod(num: number, type: string) {
+    const template: any = {
+      DAY: "天卡",
+      MONTH: "月卡",
+      YEAR: "年卡"
+    }
+    if(type === "YEAR" && num >= 99) {
+      return '终生卡'
+    }
+    return num + template[type]
   },
-
-  /**
-   * 生命周期函数--监听页面隐藏
-   */
-  onHide() {
-
+  onSubmit() {
+    wx.redirectTo({
+      url: '../index/index'
+    })
   },
-
-  /**
-   * 生命周期函数--监听页面卸载
-   */
-  onUnload() {
-
+  setCanvasSize: function () {
+    var size = {} as any;
+    try {
+      const res = wx.getWindowInfo()
+      var scale = 750 / 262; //不同屏幕下canvas的适配比例;设计稿是750宽
+      var width = res.windowWidth / scale;
+      var height = width; //canvas画布为正方形
+      size.w = width;
+      size.h = height;
+    } catch (e) {
+      // Do something when catch error
+      console.log("获取设备信息失败" + e);
+    }
+    return size;
   },
-
-  /**
-   * 页面相关事件处理函数--监听用户下拉动作
-   */
-  onPullDownRefresh() {
-
+  setLogoSize() {
+    var size = {} as any;
+    try {
+      var res = wx.getSystemInfoSync();
+      var scale = 750 / 48; //不同屏幕下canvas的适配比例;设计稿是750宽
+      var width = res.windowWidth / scale;
+      var height = width; //canvas画布为正方形
+      size.w = width;
+      size.h = height;
+    } catch (e) {
+      // Do something when catch error
+      console.log("获取设备信息失败" + e);
+    }
+    return size;
   },
-
-  /**
-   * 页面上拉触底事件的处理函数
-   */
-  onReachBottom() {
-
+  createQrCode(content: any, canvasId: any) {
+    const size = this.setCanvasSize();
+    // const logoSize = this.setLogoSize();
+    drawQrcode({
+      width: size.w,
+      height: size.h,
+      canvasId: canvasId,
+      // ctx: wx.createCanvasContext('myQrcode'),
+      text: content,
+      // v1.0.0+版本支持在二维码上绘制图片
+      // image: {
+      //   imageResource: "./images/codeLogo.png",
+      //   dx: (size.w - logoSize.w) / 2,
+      //   dy: (size.h - logoSize.h) / 2,
+      //   dWidth: logoSize.w,
+      //   dHeight: logoSize.h,
+      // },
+      callback: () => {
+        // 安卓机上不准确,生成的二维码无法扫描,加延时解决
+        setTimeout(() => {
+          wx.canvasToTempFilePath(
+            {
+              canvasId: canvasId,
+              success: (res) => {
+                this.setData({
+                  canvasImg: res.tempFilePath,
+                });
+              },
+            },
+            this
+          );
+        }, 500);
+      },
+    });
   },
-
-  /**
-   * 用户点击右上角分享
-   */
-  onShareAppMessage() {
-
-  }
 })

+ 17 - 22
miniprogram/pages/orders/order-result.wxml

@@ -12,46 +12,41 @@
     </view>
 
     <view class="order-content">
-      <view class="item-content">
-        <image class='goods-icon' src="{{ goodsInfo.pic }}" mode="" />
+      <view class="item-content" wx:for="{{ goodsInfo.goods }}" wx:key="{{ index }}">
+        <image class='goods-icon' src="{{ item.goodsUrl }}" mode="" />
         <view class="goods-desc">
           <view class="goodsInfo">
-            <view class="goods-name">{{ goodsInfo.name }}</view>
-            <view class="goods-price">¥ {{ goodsInfo.salePrice }}</view>
+            <view class="goods-name">{{ item.goodsName }}</view>
+            <view class="goods-price">¥ {{ item.originalPrice }}</view>
           </view>
           <view class="goods-type">
-            <view class="goods-card">{{ goodsInfo.typeName }}</view>
+            <view class="goods-card">{{ item.typeName }}</view>
             <view class="goods-num">x1</view>
           </view>
         </view>
       </view>
-      <!-- <view class="qrcode-section">
-        <canvas canvas-id="qrcode"></canvas>
-      </view> -->
+      <view class="qrcode-section" wx:if="{{ goodsInfo.wechatStatus == 'SUCCESS' && goodsInfo.wechatStatus == 'WAIT_USE' }}">
+        <view class="qrcode-wrap">
+          <canvas class='my_draw_canvas' data-type="image" canvas-id='canvasCode' id="canvasCode"></canvas>
+        </view>
+        <view class="qrcode-text used" wx:if="{{goodsInfo.wechatStatus == 'WAIT_USE'}}">二维码已使用</view>
+        <view class="qrcode-text" wx:else>请扫描二维码激活使用</view>
+      </view>
     </view>
 
-    <!-- <view class="order-time">
+    <view class="order-time">
       <view class="order-item">
         <view class="title">订单号</view>
-        <view class="value">2133442226668</view>
+        <view class="value">{{ goodsInfo.orderNo }}</view>
       </view>
       <view class="order-item">
         <view class="title">下单时间</view>
-        <view class="value">2023-07-12 18:12:45</view>
+        <view class="value">{{ goodsInfo.createTime }}</view>
       </view>
-    </view> -->
+    </view>
   </scroll-view>
 
   <view class="order-btn">
-    <view class="price">
-      <view class="desc">订单金额:</view>
-      <view class="currentPrice">
-        <text class="stuff">¥</text>
-        <text class="priceZ">{{ goodsInfo.integerPart }}</text>
-        <text class="priceF">.{{ goodsInfo.decimalPart }}</text>
-      </view>
-    </view>
-
-    <button type="primary" bind:tap="onSubmit">继续支付</button>
+    <button type="primary" bind:tap="onSubmit">再来一单</button>
   </view>
 </view>

+ 84 - 64
miniprogram/pages/orders/orders.ts

@@ -31,7 +31,7 @@ Page({
     ],
     tabIdx: 0, // 当前选中的tab索引
     page: 1,
-    rows: 20,
+    rows: 10,
     recordList: [],
     maxPage: 1, // 总分页数
   },
@@ -73,22 +73,24 @@ Page({
       const { data } = await api_studentOrderPage({
         page: currentPage,
         rows: this.data.rows,
-        wechatOrderStatus: tabIdx == 0 ? "" : tabIdx == 1 ? "WAIT_PAY" : tabIdx == 2 ? "WAIT_USE" : tabIdx == 3 ? "SUCCESS" : tabIdx == 4 ? "CLOSE" : "",
+        wechatOrderStatus: tabIdx == 0 ? "" : tabIdx == 1 ? "WAIT_PAY" : tabIdx == 2 ? "WAIT_USE" : tabIdx == 3 ? "SUCCESS" : tabIdx == 4 ? "CLOSED" : "",
       })
       if (data.code == 200) {
         const { rows, total } = data.data;
-        console.log(rows, 'rows')
         rows.forEach((item: any) => {
-          // item.purchaseStatusDesc = item.purchaseStatus == "WAIT_PAY" ? "待支付" : item.purchaseStatus == "PAID" ? "已付款" : item.purchaseStatus == "CLOSE" ? "已关闭" : "";
-          // // purchaseType;
-          // item.purchaseTypeStr = this.formatUnitTimer(item.purchaseType);
-          // item.showPrice = item.purchasePrice;
-          // if (item.purchasePrice !== null) {
-          //   item.showPrice = Number(item.purchasePrice).toFixed(2);
-          // }
+          item.amount = this.formatPrice(item.paymentCashAmount, 'ALL')
+          item.statusName = this.formatOrderStatus(item.wechatStatus)
+          const studentPaymentOrderDetails = item.studentPaymentOrderDetails || [];
+          console.log(studentPaymentOrderDetails, 'studentPaymentOrderDetails')
+          studentPaymentOrderDetails.forEach((student: any) => {
+            student.originalPrice = this.formatPrice(student.paymentCashAmount, 'ALL');
+            student.typeName = this.formatPeriod(student.goodsNum, student.activationCodeInfo?.type);
+          })
+          item.studentPaymentOrderDetails = studentPaymentOrderDetails
         });
-        console.log(rows);
+        
         const newList = this.data.recordList.concat(rows);
+        console.log(newList, "newList");
         this.setData(
           {
             recordList: newList,
@@ -99,67 +101,85 @@ Page({
       } else {
         wx.hideLoading();
       }
-    } catch {
+    } catch(e) {
+      console.log(e, 'e')
       wx.hideLoading()
     }
   },
-  /** 加载更多 */
-  loadMore() {
-    wx.showLoading({
-      mask: true,
-      title: "加载中...",
-    });
-    
-    setTimeout(() => {
-      wx.hideLoading()
-    }, 3000);
+  // 格式化中文
+  formatOrderStatus(status: string) {
+    // 订单状态 WAIT_PAY:待付款,  WAIT_USE:待使用, SUCCESS:已完成, CLOSE:已取消
+    const template: any = {
+      WAIT_PAY: '等待付款',
+      WAIT_USE: '等待使用',
+      SUCCESS: '交易完成',
+      CLOSED: '交易取消',
+    }
+    return template[status]
   },
-  /**
-   * 生命周期函数--监听页面初次渲染完成
-   */
-  onReady() {
-
+  // 格式化价格
+  formatPrice(price: number, type?: string) {
+    const amountStr = price.toFixed(2)
+    const [integerPart, decimalPart] = amountStr.split('.');
+    if(type === 'ALL') {
+      return amountStr
+    }
+    return {
+      integerPart,
+      decimalPart
+    }
   },
-
-  /**
-   * 生命周期函数--监听页面显示
-   */
-  onShow() {
-
+  // 格式化类型
+  formatPeriod(num: number, type: string) {
+    if(!num || !type) {
+      return ''
+    }
+    const template: any = {
+      DAY: "天卡",
+      MONTH: "月卡",
+      YEAR: "年卡"
+    }
+    if(type === "YEAR" && num >= 99) {
+      return '终生卡'
+    }
+    return num + template[type]
   },
-
-  /**
-   * 生命周期函数--监听页面隐藏
-   */
-  onHide() {
-
+  /** 加载更多 */
+  loadMore() {
+    const currentPage = this.data.page;
+    if (this.data.page >= this.data.maxPage) {
+      wx.showToast({
+        title: "没有更多数据了",
+        icon: "none",
+        duration: 1000,
+      });
+    } else {
+      this.setData(
+        {
+          page: currentPage + 1,
+        },
+        () => {
+          this.getList();
+        }
+      );
+    }
   },
-
-  /**
-   * 生命周期函数--监听页面卸载
-   */
-  onUnload() {
-
+  onPay(e: any) {
+    console.log(e)
+    const { currentTarget } = e
+    const item = this.data.recordList.find((item: any) => item.id === e.currentTarget)
   },
-
-  /**
-   * 页面相关事件处理函数--监听用户下拉动作
-   */
-  onPullDownRefresh() {
-
+  onOne(e: any) {
+    console.log(e)
+    wx.redirectTo({
+      url: '../index/index',
+    })
   },
-
-  /**
-   * 页面上拉触底事件的处理函数
-   */
-  onReachBottom() {
-
+  onDetail(e: any) {
+    const { dataset } = e.currentTarget
+    console.log(e)
+    wx.navigateTo({
+      url: '../orders/order-result?orderNo=' + dataset.orderno
+    })
   },
-
-  /**
-   * 用户点击右上角分享
-   */
-  onShareAppMessage() {
-
-  }
 })

+ 21 - 20
miniprogram/pages/orders/orders.wxml

@@ -9,32 +9,33 @@
       </view>
     </view>
     <scroll-view class="record-list" type="list" scroll-y bindscrolltolower="loadMore">
-      <block wx:if="{{ tabList.length }}">
+      <block wx:if="{{ recordList.length }}">
         <view class="list-item-group">
-          <view class="list-item" wx:for="{{tabList}}" wx:key="{{index}}">
+          <view class="list-item" wx:for="{{recordList}}" wx:key="{{index}}" data-orderno="{{item.orderNo}}" bind:tap="onDetail">
             <view class="item-top">
-              <view class="item-mid">订单号:1209289883774834</view>
-              <text class="red">等待付款</text>
+              <view class="item-mid">订单号:{{ item.orderNo }}</view>
+              <text class="{{ item.status == 'WAIT_PAY' && item.status == 'WAIT_USE' ? 'red' : '' }}">{{ item.statusName }}</text>
             </view>
-          <view class="item-content">
-            <image class='goods-icon' src="https://oss.dayaedu.com/ktyq/1731664204915.png" mode="" />
-            <view class="goods-desc">
-              <view class="goodsInfo">
-                <view class="goods-name">音乐数字课堂AI学练工堂AI学练工音乐数字课堂AI学练工堂AI学练工</view>
-                <view class="goods-price">¥ 600.00</view>
-              </view>
-              <view class="goods-type">
-                <view class="goods-card">一年卡</view>
-                <view class="goods-num">x1</view>
+            <view class="item-content" wx:for="{{item.studentPaymentOrderDetails}}" wx:key="{{studentIndex}}">
+              <image class='goods-icon' src="{{item.goodsUrl}}" mode="" />
+              <view class="goods-desc">
+                <view class="goodsInfo">
+                  <view class="goods-name">{{item.goodsName}}</view>
+                  <view class="goods-price">¥ {{(item.originalPrice)}}</view>
+                </view>
+                <view class="goods-type">
+                  <view class="goods-card" wx:if="{{ item.typeName }}">{{item.typeName}}</view>
+                  <view class="goods-num">x1</view>
+                </view>
               </view>
             </view>
-          </view>
-          <view class="item-footer">
-            <view class="order-price">
-              订单金额:<text class="price">¥ 600.00</text>
+            <view class="item-footer">
+              <view class="order-price">
+                订单金额:<text class="price">¥ {{item.amount}}</text>
+              </view>
+              <button class="sure" type="primary" wx:if="{{ item.status == 'WAIT_PAY' && item.status == 'WAIT_USE' }}"  catch:tap="onPay" data-id="{{item.id}}">继续支付</button>
+              <button type="primary" wx:else catch:tap="onOne" data-id="{{item.id}}">再来一单</button>
             </view>
-            <button class="sure" type="primary">继续支付</button>
-          </view>
           </view>
         </view>
       </block>

+ 1203 - 0
miniprogram/utils/qrcode.js

@@ -0,0 +1,1203 @@
+//qrcode.js,复制下面代码粘贴即可
+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 {}
+     */
+    var options;
+    QRCode = function (opt) {
+        //设置默认参数
+         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) {
+                options[i] = opt[i];
+            }
+        }
+        //使用QRCodeAlg创建二维码结构
+        var qrCodeAlg = null;
+        for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
+            if (qrcodeAlgObjCache[i].text == options.text && qrcodeAlgObjCache[i].text.correctLevel == options.correctLevel) {
+                qrCodeAlg = qrcodeAlgObjCache[i].obj;
+                break;
+            }
+        }
+        if (i == l) {
+            qrCodeAlg = new QRCodeAlg(options.text, options.correctLevel);
+            qrcodeAlgObjCache.push({
+                text: options.text,
+                correctLevel: 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) {
+                wx.showLoading({
+                    title: options.loadingText,
+                    mask: true
+                });
+            }
+            var ctx = wx.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(() => {
+                        wx.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) {
+                                    options.cbResult(res.tempFilePath)
+                                }
+                            },
+                            fail: function (res) {
+                                if (options.cbResult) {
+                                    options.cbResult(res)
+                                }
+                            },
+                            complete: function () {
+                                if (options.showLoading){
+                                    wx.hideLoading();
+                                }
+                            },
+                        }, options.context);
+                    }, options.text.length + 100);
+                });
+            }, options.usingComponents ? 0 : 150);
+        }
+        createCanvas(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 = wx.createCanvasContext(options.canvasId, options.context)
+        ctx.clearRect(0, 0, options.size, options.size)
+        ctx.draw(false, () => {
+            if (fn) {
+                fn()
+            }
+        })
+    };
+})()
+ 
+export default QRCode

文件差异内容过多而无法显示
+ 4 - 0
miniprogram/utils/weapp.qrcode.esm.js


+ 0 - 5
node_modules/.package-lock.json

@@ -9,11 +9,6 @@
       "resolved": "https://registry.npmmirror.com/miniprogram-api-typings/-/miniprogram-api-typings-2.12.0.tgz",
       "integrity": "sha512-ibvbqeslVFur0IAvTxLMvsbtvVcMo6gwvOnj0YZHV7aeDLu091VQRrETT2QuiG9P6aZWRcxeNGJChRKVPCp9VQ==",
       "dev": true
-    },
-    "node_modules/wxbarcode": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/wxbarcode/-/wxbarcode-1.0.2.tgz",
-      "integrity": "sha512-QFNva4OKNn6M3fYXLg+W+JI2FqdNeK69sSgLmxc36OPcrsDiR04If8SqGC4a6xMFHby0iiOFjIF8vsrtbXkRGA=="
     }
   }
 }

+ 0 - 20
node_modules/wxbarcode/.editorconfig

@@ -1,20 +0,0 @@
-# EditorConfig helps developers define and maintain consistent
-# coding styles between different editors and IDEs
-# http://editorconfig.org
-
-root = true
-
-[*]
-
-# Change these settings to your own preference
-indent_style = space
-indent_size = 4
-
-# We recommend you to keep these unchanged
-end_of_line = lf
-charset = utf-8
-trim_trailing_whitespace = true
-insert_final_newline = true
-
-[*.md]
-trim_trailing_whitespace = false

+ 0 - 21
node_modules/wxbarcode/.eslintrc.yml

@@ -1,21 +0,0 @@
-env:
-  es6: true
-  node: true
-extends: 'eslint:recommended'
-parserOptions:
-  sourceType: module
-rules:
-  indent:
-    - error
-    - 4
-  linebreak-style:
-    - error
-    - windows
-  quotes:
-    - error
-    - single
-  semi:
-    - error
-    - never
-  no-console: 0
-  no-unused-vars: 0

+ 0 - 20
node_modules/wxbarcode/.gitattributes

@@ -1,20 +0,0 @@
-# Automatically normalize line endings for all text-based files
-# http://git-scm.com/docs/gitattributes#_end_of_line_conversion
-* text=auto
-
-# For the following file types, normalize line endings to LF on
-# checkin and prevent conversion to CRLF when they are checked out
-# (this is required in order to prevent newline related issues like,
-# for example, after the build script is run)
-.*      text eol=lf
-*.css   text eol=lf
-*.html  text eol=lf
-*.jade  text eol=lf
-*.js    text eol=lf
-*.json  text eol=lf
-*.less  text eol=lf
-*.scss  text eol=lf
-*.md    text eol=lf
-*.sh    text eol=lf
-*.txt   text eol=lf
-*.xml   text eol=lf

+ 0 - 105
node_modules/wxbarcode/.npmignore

@@ -1,105 +0,0 @@
-# Include your project-specific ignores in this file
-# Read about how to use .gitignore: https://help.github.com/articles/ignoring-files
-
-build
-node_modules
-ncp-debug.log
-npm-debug.log
-
-# Generated by https://www.gitignore.io
-### SublimeText ###
-# cache files for sublime text
-*.tmlanguage.cache
-*.tmPreferences.cache
-*.stTheme.cache
-
-# workspace files are user-specific
-*.sublime-workspace
-
-# project files should be checked into the repository, unless a significant
-# proportion of contributors will probably not be using SublimeText
-*.sublime-project
-
-# sftp configuration file
-sftp-config.json
-
-
-### Windows ###
-# Windows image file caches
-Thumbs.db
-ehthumbs.db
-
-# Folder config file
-Desktop.ini
-
-# Recycle Bin used on file shares
-$RECYCLE.BIN/
-
-# Windows Installer files
-*.cab
-*.msi
-*.msm
-*.msp
-
-# Windows shortcuts
-*.lnk
-
-
-### OSX ###
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
-
-### Node ###
-# Logs
-*.log
-npm-debug.log*
-
-# Runtime data
-pids
-*.pid
-*.seed
-
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-
-# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
-
-# node-waf configuration
-.lock-wscript
-
-# Compiled binary addons (http://nodejs.org/api/addons.html)
-build/Release
-
-# Dependency directories
-node_modules
-jspm_packages
-
-# Optional npm cache directory
-.npm
-
-# Optional REPL history
-.node_repl_history

+ 0 - 3
node_modules/wxbarcode/.travis.yml

@@ -1,3 +0,0 @@
-language: node_js
-node_js:
-  - "6"

+ 0 - 21
node_modules/wxbarcode/LICENSE

@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2016 Alsey DAI (zamber@gmail.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.

+ 0 - 66
node_modules/wxbarcode/README.md

@@ -1,66 +0,0 @@
-# wxbarcode
-
-  微信小程序生成条码和二维码模块。
-
-  [![NPM Version][npm-image]][npm-url]
-  [![NPM Downloads][downloads-image]][downloads-url]
-
-[![NPM](https://nodei.co/npm/wxbarcode.png?compact=true)](https://nodei.co/npm/wxbarcode/)
-
-## 效果
-
-![截图](https://raw.githubusercontent.com/alsey/wxbarcode/master/capture.png)
-
-## 安装
-
-```bash
-$ npm install wxbarcode
-```
-
-## 使用方法
-
-```js
-import wxbarcode from 'wxbarcode'
-
-wxbarcode.barcode('barcode', '1234567890123456789', 680, 200);
-wxbarcode.qrcode('qrcode', '1234567890123456789', 420, 420);
-```
-
-### 条形码
-
-函数名:barcode
-
-函数原型:barcode(id, code, width, height)
-
-参数:
-
-- id: wxml文件中的 Canvas ID
-- code: 用于生成条形码的字符串
-- width: 生成的条形码宽度,单位 rpx
-- height: 生成的条形码高度,单位 rpx
-
-### 二维码
-
-函数名:qrcode
-
-函数原型:qrcode(id, code, width, height)
-
-参数:
-
-- id: wxml文件中的 Canvas ID
-- code: 用于生成二维码的字符串
-- width: 生成的二维码宽度,单位 rpx
-- height: 生成的二维码高度,单位 rpx
-
-## 例子
-
-请参考`demo`文件夹下代码。
-
-## License
-
-  [MIT](LICENSE)
-
-[npm-image]: https://badge.fury.io/js/wxbarcode.svg
-[npm-url]: https://npmjs.org/package/wxbarcode
-[downloads-image]: https://img.shields.io/npm/dm/wxbarcode.svg
-[downloads-url]: https://npmjs.org/package/wxbarcode

二进制
node_modules/wxbarcode/capture.png


+ 0 - 2
node_modules/wxbarcode/demo/app.js

@@ -1,2 +0,0 @@
-//app.js
-App({})

+ 0 - 11
node_modules/wxbarcode/demo/app.json

@@ -1,11 +0,0 @@
-{
-  "pages":[
-    "pages/index/index"
-  ],
-  "window":{
-    "backgroundTextStyle":"light",
-    "navigationBarBackgroundColor": "#439057",
-    "navigationBarTitleText": "条码、二维码演示程序",
-    "navigationBarTextStyle":"white"
-  }
-}

+ 0 - 1
node_modules/wxbarcode/demo/app.wxss

@@ -1 +0,0 @@
-/**app.wxss**/

+ 0 - 14
node_modules/wxbarcode/demo/pages/index/index.js

@@ -1,14 +0,0 @@
-//index.js
-var wxbarcode = require('../../utils/index.js');
-
-Page({
-
-    data: {
-        code: '1234567890123456789'
-    },
-
-    onLoad: function() {
-        wxbarcode.barcode('barcode', '1234567890123456789', 680, 200);
-        wxbarcode.qrcode('qrcode', '1234567890123456789', 420, 420);
-    }
-})

+ 0 - 14
node_modules/wxbarcode/demo/pages/index/index.wxml

@@ -1,14 +0,0 @@
-<!--index.wxml-->
-<view class="container page">
-  <view class="panel">
-    <view class="header">
-    </view>
-    <view class="barcode">
-      <view class="barnum">{{code}}</view>
-      <canvas canvas-id="barcode" />
-    </view>
-    <view class="qrcode">
-      <canvas canvas-id="qrcode" />
-    </view>
-  </view>
-</view>

+ 0 - 70
node_modules/wxbarcode/demo/pages/index/index.wxss

@@ -1,70 +0,0 @@
-/**index.wxss**/
-page {
-    background-color: #439057;
-}
-
-.page {
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-}
-
-.container {
-	padding-bottom: 10rpx;
-}
-
-.panel {
-    display: flex;
-    flex-direction: column;
-    justify-content: space-between;
-    align-items: stretch;
-    box-sizing: border-box;
-    width: 710rpx;
-    margin-top: 40rpx;
-    border-radius: 10rpx;
-    background-color: #fff;
-}
-
-.header {
-    height: 140rpx;
-    background-color: #f0f0f0;
-    border-radius: 10rpx 10rpx 0 0;
-}
-
-.barcode {
-    display: flex;
-    height: 320rpx;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-}
-
-.barnum {
-    width: 670rpx;
-    height: 100rpx;
-    line-height: 100rpx;
-    font-size: 38rpx;
-    font-weight: bold;
-    text-align: center;
-    letter-spacing: 10rpx;
-    white-space: nowrap;
-}
-
-.barcode > canvas {
-    width: 680rpx;
-    height: 200rpx;  
-}
-
-.qrcode {
-    height: 420rpx;
-    display: flex;
-    flex-direction: column;
-    justify-content: flex-end;
-    align-items: center;
-}
-
-.qrcode > canvas {
-    width: 420rpx;
-    height: 420rpx;
-}

+ 0 - 402
node_modules/wxbarcode/demo/utils/barcode.js

@@ -1,402 +0,0 @@
-var CHAR_TILDE = 126;
-var CODE_FNC1 = 102;
-
-var SET_STARTA = 103;
-var SET_STARTB = 104;
-var SET_STARTC = 105;
-var SET_SHIFT = 98;
-var SET_CODEA = 101;
-var SET_CODEB = 100;
-var SET_STOP = 106;
-
-
-var REPLACE_CODES = {
-    CHAR_TILDE: CODE_FNC1 //~ corresponds to FNC1 in GS1-128 standard
-}
-
-var CODESET = {
-    ANY: 1,
-    AB: 2,
-    A: 3,
-    B: 4,
-    C: 5
-};
-
-function getBytes(str) {
-    var bytes = [];
-    for (var i = 0; i < str.length; i++) {
-        bytes.push(str.charCodeAt(i));
-    }
-    return bytes;
-}
-
-exports.code128 = function (ctx, text, width, height) {
-
-    width = parseInt(width);
-
-    height = parseInt(height);
-
-    var codes = stringToCode128(text);
-
-    var g = new Graphics(ctx, width, height);
-
-    var barWeight = g.area.width / ((codes.length - 3) * 11 + 35);
-
-    var x = g.area.left;
-    var y = g.area.top;
-    for (var i = 0; i < codes.length; i++) {
-        var c = codes[i];
-        //two bars at a time: 1 black and 1 white
-        for (var bar = 0; bar < 8; bar += 2) {
-            var barW = PATTERNS[c][bar] * barWeight;
-            // var barH = height - y - this.border;
-            var barH = height - y;
-            var spcW = PATTERNS[c][bar + 1] * barWeight;
-
-            //no need to draw if 0 width
-            if (barW > 0) {
-                g.fillFgRect(x, y, barW, barH);
-            }
-
-            x += barW + spcW;
-        }
-    }
-
-    ctx.draw();
-}
-
-
-function stringToCode128(text) {
-
-    var barc = {
-        currcs: CODESET.C
-    };
-
-    var bytes = getBytes(text);
-    //decide starting codeset
-    var index = bytes[0] == CHAR_TILDE ? 1 : 0;
-
-    var csa1 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
-    var csa2 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
-    barc.currcs = getBestStartSet(csa1, csa2);
-    barc.currcs = perhapsCodeC(bytes, barc.currcs);
-
-    //if no codeset changes this will end up with bytes.length+3
-    //start, checksum and stop
-    var codes = new Array();
-
-    switch (barc.currcs) {
-        case CODESET.A:
-            codes.push(SET_STARTA);
-            break;
-        case CODESET.B:
-            codes.push(SET_STARTB);
-            break;
-        default:
-            codes.push(SET_STARTC);
-            break;
-    }
-
-
-    for (var i = 0; i < bytes.length; i++) {
-        var b1 = bytes[i]; //get the first of a pair
-        //should we translate/replace
-        if (b1 in REPLACE_CODES) {
-            codes.push(REPLACE_CODES[b1]);
-            i++ //jump to next
-            b1 = bytes[i];
-        }
-
-        //get the next in the pair if possible
-        var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1;
-
-        codes = codes.concat(codesForChar(b1, b2, barc.currcs));
-        //code C takes 2 chars each time
-        if (barc.currcs == CODESET.C) i++;
-    }
-
-    //calculate checksum according to Code 128 standards
-    var checksum = codes[0];
-    for (var weight = 1; weight < codes.length; weight++) {
-        checksum += (weight * codes[weight]);
-    }
-    codes.push(checksum % 103);
-
-    codes.push(SET_STOP);
-
-    //encoding should now be complete
-    return codes;
-
-    function getBestStartSet(csa1, csa2) {
-        //tries to figure out the best codeset
-        //to start with to get the most compact code
-        var vote = 0;
-        vote += csa1 == CODESET.A ? 1 : 0;
-        vote += csa1 == CODESET.B ? -1 : 0;
-        vote += csa2 == CODESET.A ? 1 : 0;
-        vote += csa2 == CODESET.B ? -1 : 0;
-        //tie goes to B due to my own predudices
-        return vote > 0 ? CODESET.A : CODESET.B;
-    }
-
-    function perhapsCodeC(bytes, codeset) {
-        for (var i = 0; i < bytes.length; i++) {
-            var b = bytes[i]
-            if ((b < 48 || b > 57) && b != CHAR_TILDE)
-                return codeset;
-        }
-        return CODESET.C;
-    }
-
-    //chr1 is current byte
-    //chr2 is the next byte to process. looks ahead.
-    function codesForChar(chr1, chr2, currcs) {
-        var result = [];
-        var shifter = -1;
-
-        if (charCompatible(chr1, currcs)) {
-            if (currcs == CODESET.C) {
-                if (chr2 == -1) {
-                    shifter = SET_CODEB;
-                    currcs = CODESET.B;
-                }
-                else if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
-                    //need to check ahead as well
-                    if (charCompatible(chr2, CODESET.A)) {
-                        shifter = SET_CODEA;
-                        currcs = CODESET.A;
-                    }
-                    else {
-                        shifter = SET_CODEB;
-                        currcs = CODESET.B;
-                    }
-                }
-            }
-        }
-        else {
-            //if there is a next char AND that next char is also not compatible
-            if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
-                //need to switch code sets
-                switch (currcs) {
-                    case CODESET.A:
-                        shifter = SET_CODEB;
-                        currcs = CODESET.B;
-                        break;
-                    case CODESET.B:
-                        shifter = SET_CODEA;
-                        currcs = CODESET.A;
-                        break;
-                }
-            }
-            else {
-                //no need to shift code sets, a temporary SHIFT will suffice
-                shifter = SET_SHIFT;
-            }
-        }
-
-        //ok some type of shift is nessecary
-        if (shifter != -1) {
-            result.push(shifter);
-            result.push(codeValue(chr2));
-        }
-        else {
-            if (currcs == CODESET.C) {
-                //include next as well
-                result.push(codeValue(chr1, chr2));
-            }
-            else {
-                result.push(codeValue(chr1));
-            }
-        }
-        barc.currcs = currcs;
-
-        return result;
-    }
-}
-
-//reduce the ascii code to fit into the Code128 char table
-function codeValue(chr1, chr2) {
-    if (typeof chr2 == "undefined") {
-        return chr1 >= 32 ? chr1 - 32 : chr1 + 64;
-    }
-    else {
-        return parseInt(String.fromCharCode(chr1) + String.fromCharCode(chr2));
-    }
-}
-
-function charCompatible(chr, codeset) {
-    var csa = codeSetAllowedFor(chr);
-    if (csa == CODESET.ANY) return true;
-    //if we need to change from current
-    if (csa == CODESET.AB) return true;
-    if (csa == CODESET.A && codeset == CODESET.A) return true;
-    if (csa == CODESET.B && codeset == CODESET.B) return true;
-    return false;
-}
-
-function codeSetAllowedFor(chr) {
-    if (chr >= 48 && chr <= 57) {
-        //0-9
-        return CODESET.ANY;
-    }
-    else if (chr >= 32 && chr <= 95) {
-        //0-9 A-Z
-        return CODESET.AB;
-    }
-    else {
-        //if non printable
-        return chr < 32 ? CODESET.A : CODESET.B;
-    }
-}
-
-var Graphics = function(ctx, width, height) {
-
-    this.width = width;
-    this.height = height;
-    this.quiet = Math.round(this.width / 40);
-    
-    this.border_size   = 0;
-    this.padding_width = 0;
-
-    this.area = {
-        width : width - this.padding_width * 2 - this.quiet * 2,
-        height: height - this.border_size * 2,
-        top   : this.border_size - 4,
-        left  : this.padding_width + this.quiet
-    };
-
-    this.ctx = ctx;
-    this.fg = "#000000";
-    this.bg = "#ffffff";
-
-    // fill background
-    this.fillBgRect(0,0, width, height);
-
-    // fill center to create border
-    this.fillBgRect(0, this.border_size, width, height - this.border_size * 2);
-}
-
-//use native color
-Graphics.prototype._fillRect = function(x, y, width, height, color) {
-    this.ctx.setFillStyle(color)
-    this.ctx.fillRect(x, y, width, height)
-}
-
-Graphics.prototype.fillFgRect = function(x,y, width, height) {
-    this._fillRect(x, y, width, height, this.fg);
-}
-
-Graphics.prototype.fillBgRect = function(x,y, width, height) {
-    this._fillRect(x, y, width, height, this.bg);
-}
-
-var PATTERNS = [
-    [2, 1, 2, 2, 2, 2, 0, 0],  // 0
-    [2, 2, 2, 1, 2, 2, 0, 0],  // 1
-    [2, 2, 2, 2, 2, 1, 0, 0],  // 2
-    [1, 2, 1, 2, 2, 3, 0, 0],  // 3
-    [1, 2, 1, 3, 2, 2, 0, 0],  // 4
-    [1, 3, 1, 2, 2, 2, 0, 0],  // 5
-    [1, 2, 2, 2, 1, 3, 0, 0],  // 6
-    [1, 2, 2, 3, 1, 2, 0, 0],  // 7
-    [1, 3, 2, 2, 1, 2, 0, 0],  // 8
-    [2, 2, 1, 2, 1, 3, 0, 0],  // 9
-    [2, 2, 1, 3, 1, 2, 0, 0],  // 10
-    [2, 3, 1, 2, 1, 2, 0, 0],  // 11
-    [1, 1, 2, 2, 3, 2, 0, 0],  // 12
-    [1, 2, 2, 1, 3, 2, 0, 0],  // 13
-    [1, 2, 2, 2, 3, 1, 0, 0],  // 14
-    [1, 1, 3, 2, 2, 2, 0, 0],  // 15
-    [1, 2, 3, 1, 2, 2, 0, 0],  // 16
-    [1, 2, 3, 2, 2, 1, 0, 0],  // 17
-    [2, 2, 3, 2, 1, 1, 0, 0],  // 18
-    [2, 2, 1, 1, 3, 2, 0, 0],  // 19
-    [2, 2, 1, 2, 3, 1, 0, 0],  // 20
-    [2, 1, 3, 2, 1, 2, 0, 0],  // 21
-    [2, 2, 3, 1, 1, 2, 0, 0],  // 22
-    [3, 1, 2, 1, 3, 1, 0, 0],  // 23
-    [3, 1, 1, 2, 2, 2, 0, 0],  // 24
-    [3, 2, 1, 1, 2, 2, 0, 0],  // 25
-    [3, 2, 1, 2, 2, 1, 0, 0],  // 26
-    [3, 1, 2, 2, 1, 2, 0, 0],  // 27
-    [3, 2, 2, 1, 1, 2, 0, 0],  // 28
-    [3, 2, 2, 2, 1, 1, 0, 0],  // 29
-    [2, 1, 2, 1, 2, 3, 0, 0],  // 30
-    [2, 1, 2, 3, 2, 1, 0, 0],  // 31
-    [2, 3, 2, 1, 2, 1, 0, 0],  // 32
-    [1, 1, 1, 3, 2, 3, 0, 0],  // 33
-    [1, 3, 1, 1, 2, 3, 0, 0],  // 34
-    [1, 3, 1, 3, 2, 1, 0, 0],  // 35
-    [1, 1, 2, 3, 1, 3, 0, 0],  // 36
-    [1, 3, 2, 1, 1, 3, 0, 0],  // 37
-    [1, 3, 2, 3, 1, 1, 0, 0],  // 38
-    [2, 1, 1, 3, 1, 3, 0, 0],  // 39
-    [2, 3, 1, 1, 1, 3, 0, 0],  // 40
-    [2, 3, 1, 3, 1, 1, 0, 0],  // 41
-    [1, 1, 2, 1, 3, 3, 0, 0],  // 42
-    [1, 1, 2, 3, 3, 1, 0, 0],  // 43
-    [1, 3, 2, 1, 3, 1, 0, 0],  // 44
-    [1, 1, 3, 1, 2, 3, 0, 0],  // 45
-    [1, 1, 3, 3, 2, 1, 0, 0],  // 46
-    [1, 3, 3, 1, 2, 1, 0, 0],  // 47
-    [3, 1, 3, 1, 2, 1, 0, 0],  // 48
-    [2, 1, 1, 3, 3, 1, 0, 0],  // 49
-    [2, 3, 1, 1, 3, 1, 0, 0],  // 50
-    [2, 1, 3, 1, 1, 3, 0, 0],  // 51
-    [2, 1, 3, 3, 1, 1, 0, 0],  // 52
-    [2, 1, 3, 1, 3, 1, 0, 0],  // 53
-    [3, 1, 1, 1, 2, 3, 0, 0],  // 54
-    [3, 1, 1, 3, 2, 1, 0, 0],  // 55
-    [3, 3, 1, 1, 2, 1, 0, 0],  // 56
-    [3, 1, 2, 1, 1, 3, 0, 0],  // 57
-    [3, 1, 2, 3, 1, 1, 0, 0],  // 58
-    [3, 3, 2, 1, 1, 1, 0, 0],  // 59
-    [3, 1, 4, 1, 1, 1, 0, 0],  // 60
-    [2, 2, 1, 4, 1, 1, 0, 0],  // 61
-    [4, 3, 1, 1, 1, 1, 0, 0],  // 62
-    [1, 1, 1, 2, 2, 4, 0, 0],  // 63
-    [1, 1, 1, 4, 2, 2, 0, 0],  // 64
-    [1, 2, 1, 1, 2, 4, 0, 0],  // 65
-    [1, 2, 1, 4, 2, 1, 0, 0],  // 66
-    [1, 4, 1, 1, 2, 2, 0, 0],  // 67
-    [1, 4, 1, 2, 2, 1, 0, 0],  // 68
-    [1, 1, 2, 2, 1, 4, 0, 0],  // 69
-    [1, 1, 2, 4, 1, 2, 0, 0],  // 70
-    [1, 2, 2, 1, 1, 4, 0, 0],  // 71
-    [1, 2, 2, 4, 1, 1, 0, 0],  // 72
-    [1, 4, 2, 1, 1, 2, 0, 0],  // 73
-    [1, 4, 2, 2, 1, 1, 0, 0],  // 74
-    [2, 4, 1, 2, 1, 1, 0, 0],  // 75
-    [2, 2, 1, 1, 1, 4, 0, 0],  // 76
-    [4, 1, 3, 1, 1, 1, 0, 0],  // 77
-    [2, 4, 1, 1, 1, 2, 0, 0],  // 78
-    [1, 3, 4, 1, 1, 1, 0, 0],  // 79
-    [1, 1, 1, 2, 4, 2, 0, 0],  // 80
-    [1, 2, 1, 1, 4, 2, 0, 0],  // 81
-    [1, 2, 1, 2, 4, 1, 0, 0],  // 82
-    [1, 1, 4, 2, 1, 2, 0, 0],  // 83
-    [1, 2, 4, 1, 1, 2, 0, 0],  // 84
-    [1, 2, 4, 2, 1, 1, 0, 0],  // 85
-    [4, 1, 1, 2, 1, 2, 0, 0],  // 86
-    [4, 2, 1, 1, 1, 2, 0, 0],  // 87
-    [4, 2, 1, 2, 1, 1, 0, 0],  // 88
-    [2, 1, 2, 1, 4, 1, 0, 0],  // 89
-    [2, 1, 4, 1, 2, 1, 0, 0],  // 90
-    [4, 1, 2, 1, 2, 1, 0, 0],  // 91
-    [1, 1, 1, 1, 4, 3, 0, 0],  // 92
-    [1, 1, 1, 3, 4, 1, 0, 0],  // 93
-    [1, 3, 1, 1, 4, 1, 0, 0],  // 94
-    [1, 1, 4, 1, 1, 3, 0, 0],  // 95
-    [1, 1, 4, 3, 1, 1, 0, 0],  // 96
-    [4, 1, 1, 1, 1, 3, 0, 0],  // 97
-    [4, 1, 1, 3, 1, 1, 0, 0],  // 98
-    [1, 1, 3, 1, 4, 1, 0, 0],  // 99
-    [1, 1, 4, 1, 3, 1, 0, 0],  // 100
-    [3, 1, 1, 1, 4, 1, 0, 0],  // 101
-    [4, 1, 1, 1, 3, 1, 0, 0],  // 102
-    [2, 1, 1, 4, 1, 2, 0, 0],  // 103
-    [2, 1, 1, 2, 1, 4, 0, 0],  // 104
-    [2, 1, 1, 2, 3, 2, 0, 0],  // 105
-    [2, 3, 3, 1, 1, 1, 2, 0]   // 106
-]
-

+ 0 - 23
node_modules/wxbarcode/demo/utils/index.js

@@ -1,23 +0,0 @@
-var barcode = require('./barcode');
-var qrcode = require('./qrcode');
-
-function convert_length(length) {
-	return Math.round(wx.getSystemInfoSync().windowWidth * length / 750);
-}
-
-function barc(id, code, width, height) {
-	barcode.code128(wx.createCanvasContext(id), code, convert_length(width), convert_length(height))
-}
-
-function qrc(id, code, width, height) {
-	qrcode.api.draw(code, {
-		ctx: wx.createCanvasContext(id),
-		width: convert_length(width),
-		height: convert_length(height)
-	})
-}
-
-module.exports = {
-	barcode: barc,
-	qrcode: qrc
-}

+ 0 - 778
node_modules/wxbarcode/demo/utils/qrcode.js

@@ -1,778 +0,0 @@
-var QR = (function () {
-
-    // alignment pattern
-    var adelta = [
-      0, 11, 15, 19, 23, 27, 31, // force 1 pat
-      16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,
-      26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28
-      ];
-
-    // version block
-    var vpat = [
-        0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d,
-        0x928, 0xb78, 0x45d, 0xa17, 0x532, 0x9a6, 0x683, 0x8c9,
-        0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75,
-        0x250, 0x9d5, 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64,
-        0x541, 0xc69
-    ];
-
-    // final format bits with mask: level << 3 | mask
-    var fmtword = [
-        0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,    //L
-        0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,    //M
-        0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,    //Q
-        0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b    //H
-    ];
-
-    // 4 per version: number of blocks 1,2; data width; ecc width
-    var eccblocks = [
-        1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,
-        1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,
-        1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,
-        1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,
-        1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,
-        2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,
-        2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,
-        2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,
-        2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,
-        2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,
-        4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,
-        2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,
-        4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,
-        3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,
-        5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,
-        5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,
-        1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,
-        5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,
-        3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,
-        3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,
-        4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,
-        2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,
-        4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,
-        6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,
-        8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,
-        10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,
-        8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,
-        3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,
-        7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,
-        5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,
-        13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,
-        17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,
-        17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,
-        13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,
-        12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,
-        6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,
-        17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,
-        4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,
-        20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,
-        19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30
-    ];
-
-    // Galois field log table
-    var glog = [
-        0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,
-        0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,
-        0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,
-        0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,
-        0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,
-        0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,
-        0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,
-        0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,
-        0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,
-        0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,
-        0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,
-        0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,
-        0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,
-        0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,
-        0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,
-        0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf
-    ];
-
-    // Galios field exponent table
-    var gexp = [
-        0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,
-        0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,
-        0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,
-        0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,
-        0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,
-        0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,
-        0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,
-        0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,
-        0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,
-        0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,
-        0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,
-        0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,
-        0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,
-        0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,
-        0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,
-        0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00
-    ];
-
-    // Working buffers:
-    // data input and ecc append, image working buffer, fixed part of image, run lengths for badness
-    var strinbuf=[], eccbuf=[], qrframe=[], framask=[], rlens=[]; 
-    // Control values - width is based on version, last 4 are from table.
-    var version, width, neccblk1, neccblk2, datablkw, eccblkwid;
-    var ecclevel = 2;
-    // set bit to indicate cell in qrframe is immutable.  symmetric around diagonal
-    function setmask(x, y)
-    {
-        var bt;
-        if (x > y) {
-            bt = x;
-            x = y;
-            y = bt;
-        }
-        // y*y = 1+3+5...
-        bt = y;
-        bt *= y;
-        bt += y;
-        bt >>= 1;
-        bt += x;
-        framask[bt] = 1;
-    }
-
-    // enter alignment pattern - black to qrframe, white to mask (later black frame merged to mask)
-    function putalign(x, y)
-    {
-        var j;
-
-        qrframe[x + width * y] = 1;
-        for (j = -2; j < 2; j++) {
-            qrframe[(x + j) + width * (y - 2)] = 1;
-            qrframe[(x - 2) + width * (y + j + 1)] = 1;
-            qrframe[(x + 2) + width * (y + j)] = 1;
-            qrframe[(x + j + 1) + width * (y + 2)] = 1;
-        }
-        for (j = 0; j < 2; j++) {
-            setmask(x - 1, y + j);
-            setmask(x + 1, y - j);
-            setmask(x - j, y - 1);
-            setmask(x + j, y + 1);
-        }
-    }
-
-    //========================================================================
-    // Reed Solomon error correction
-    // exponentiation mod N
-    function modnn(x)
-    {
-        while (x >= 255) {
-            x -= 255;
-            x = (x >> 8) + (x & 255);
-        }
-        return x;
-    }
-
-    var genpoly = [];
-
-    // Calculate and append ECC data to data block.  Block is in strinbuf, indexes to buffers given.
-    function appendrs(data, dlen, ecbuf, eclen)
-    {
-        var i, j, fb;
-
-        for (i = 0; i < eclen; i++)
-            strinbuf[ecbuf + i] = 0;
-        for (i = 0; i < dlen; i++) {
-            fb = glog[strinbuf[data + i] ^ strinbuf[ecbuf]];
-            if (fb != 255)     /* fb term is non-zero */
-                for (j = 1; j < eclen; j++)
-                    strinbuf[ecbuf + j - 1] = strinbuf[ecbuf + j] ^ gexp[modnn(fb + genpoly[eclen - j])];
-            else
-                for( j = ecbuf ; j < ecbuf + eclen; j++ )
-                    strinbuf[j] = strinbuf[j + 1];
-            strinbuf[ ecbuf + eclen - 1] = fb == 255 ? 0 : gexp[modnn(fb + genpoly[0])];
-        }
-    }
-
-    //========================================================================
-    // Frame data insert following the path rules
-
-    // check mask - since symmetrical use half.
-    function ismasked(x, y)
-    {
-        var bt;
-        if (x > y) {
-            bt = x;
-            x = y;
-            y = bt;
-        }
-        bt = y;
-        bt += y * y;
-        bt >>= 1;
-        bt += x;
-        return framask[bt];
-    }
-
-    //========================================================================
-    //  Apply the selected mask out of the 8.
-    function  applymask(m)
-    {
-        var x, y, r3x, r3y;
-
-        switch (m) {
-        case 0:
-            for (y = 0; y < width; y++)
-                for (x = 0; x < width; x++)
-                    if (!((x + y) & 1) && !ismasked(x, y))
-                        qrframe[x + y * width] ^= 1;
-            break;
-        case 1:
-            for (y = 0; y < width; y++)
-                for (x = 0; x < width; x++)
-                    if (!(y & 1) && !ismasked(x, y))
-                        qrframe[x + y * width] ^= 1;
-            break;
-        case 2:
-            for (y = 0; y < width; y++)
-                for (r3x = 0, x = 0; x < width; x++, r3x++) {
-                    if (r3x == 3)
-                        r3x = 0;
-                    if (!r3x && !ismasked(x, y))
-                        qrframe[x + y * width] ^= 1;
-                }
-            break;
-        case 3:
-            for (r3y = 0, y = 0; y < width; y++, r3y++) {
-                if (r3y == 3)
-                    r3y = 0;
-                for (r3x = r3y, x = 0; x < width; x++, r3x++) {
-                    if (r3x == 3)
-                        r3x = 0;
-                    if (!r3x && !ismasked(x, y))
-                        qrframe[x + y * width] ^= 1;
-                }
-            }
-            break;
-        case 4:
-            for (y = 0; y < width; y++)
-                for (r3x = 0, r3y = ((y >> 1) & 1), x = 0; x < width; x++, r3x++) {
-                    if (r3x == 3) {
-                        r3x = 0;
-                        r3y = !r3y;
-                    }
-                    if (!r3y && !ismasked(x, y))
-                        qrframe[x + y * width] ^= 1;
-                }
-            break;
-        case 5:
-            for (r3y = 0, y = 0; y < width; y++, r3y++) {
-                if (r3y == 3)
-                    r3y = 0;
-                for (r3x = 0, x = 0; x < width; x++, r3x++) {
-                    if (r3x == 3)
-                        r3x = 0;
-                    if (!((x & y & 1) + !(!r3x | !r3y)) && !ismasked(x, y))
-                        qrframe[x + y * width] ^= 1;
-                }
-            }
-            break;
-        case 6:
-            for (r3y = 0, y = 0; y < width; y++, r3y++) {
-                if (r3y == 3)
-                    r3y = 0;
-                for (r3x = 0, x = 0; x < width; x++, r3x++) {
-                    if (r3x == 3)
-                        r3x = 0;
-                    if (!(((x & y & 1) + (r3x && (r3x == r3y))) & 1) && !ismasked(x, y))
-                        qrframe[x + y * width] ^= 1;
-                }
-            }
-            break;
-        case 7:
-            for (r3y = 0, y = 0; y < width; y++, r3y++) {
-                if (r3y == 3)
-                    r3y = 0;
-                for (r3x = 0, x = 0; x < width; x++, r3x++) {
-                    if (r3x == 3)
-                        r3x = 0;
-                    if (!(((r3x && (r3x == r3y)) + ((x + y) & 1)) & 1) && !ismasked(x, y))
-                        qrframe[x + y * width] ^= 1;
-                }
-            }
-            break;
-        }
-        return;
-    }
-
-    // Badness coefficients.
-    var N1 = 3, N2 = 3, N3 = 40, N4 = 10;
-
-    // Using the table of the length of each run, calculate the amount of bad image 
-    // - long runs or those that look like finders; called twice, once each for X and Y
-    function badruns(length)
-    {
-        var i;
-        var runsbad = 0;
-        for (i = 0; i <= length; i++)
-            if (rlens[i] >= 5)
-                runsbad += N1 + rlens[i] - 5;
-        // BwBBBwB as in finder
-        for (i = 3; i < length - 1; i += 2)
-            if (rlens[i - 2] == rlens[i + 2]
-                && rlens[i + 2] == rlens[i - 1]
-                && rlens[i - 1] == rlens[i + 1]
-                && rlens[i - 1] * 3 == rlens[i]
-                // white around the black pattern? Not part of spec
-                && (rlens[i - 3] == 0 // beginning
-                    || i + 3 > length  // end
-                    || rlens[i - 3] * 3 >= rlens[i] * 4 || rlens[i + 3] * 3 >= rlens[i] * 4)
-               )
-                runsbad += N3;
-        return runsbad;
-    }
-
-    // Calculate how bad the masked image is - blocks, imbalance, runs, or finders.
-    function badcheck()
-    {
-        var x, y, h, b, b1;
-        var thisbad = 0;
-        var bw = 0;
-
-        // blocks of same color.
-        for (y = 0; y < width - 1; y++)
-            for (x = 0; x < width - 1; x++)
-                if ((qrframe[x + width * y] && qrframe[(x + 1) + width * y]
-                     && qrframe[x + width * (y + 1)] && qrframe[(x + 1) + width * (y + 1)]) // all black
-                    || !(qrframe[x + width * y] || qrframe[(x + 1) + width * y]
-                         || qrframe[x + width * (y + 1)] || qrframe[(x + 1) + width * (y + 1)])) // all white
-                    thisbad += N2;
-
-        // X runs
-        for (y = 0; y < width; y++) {
-            rlens[0] = 0;
-            for (h = b = x = 0; x < width; x++) {
-                if ((b1 = qrframe[x + width * y]) == b)
-                    rlens[h]++;
-                else
-                    rlens[++h] = 1;
-                b = b1;
-                bw += b ? 1 : -1;
-            }
-            thisbad += badruns(h);
-        }
-
-        // black/white imbalance
-        if (bw < 0)
-            bw = -bw;
-
-        var big = bw;
-        var count = 0;
-        big += big << 2;
-        big <<= 1;
-        while (big > width * width)
-            big -= width * width, count++;
-        thisbad += count * N4;
-
-        // Y runs
-        for (x = 0; x < width; x++) {
-            rlens[0] = 0;
-            for (h = b = y = 0; y < width; y++) {
-                if ((b1 = qrframe[x + width * y]) == b)
-                    rlens[h]++;
-                else
-                    rlens[++h] = 1;
-                b = b1;
-            }
-            thisbad += badruns(h);
-        }
-        return thisbad;
-    }
-
-    function genframe(instring)
-    {
-        var x, y, k, t, v, i, j, m;
-
-    // find the smallest version that fits the string
-        t = instring.length;
-        version = 0;
-        do {
-            version++;
-            k = (ecclevel - 1) * 4 + (version - 1) * 16;
-            neccblk1 = eccblocks[k++];
-            neccblk2 = eccblocks[k++];
-            datablkw = eccblocks[k++];
-            eccblkwid = eccblocks[k];
-            k = datablkw * (neccblk1 + neccblk2) + neccblk2 - 3 + (version <= 9);
-            if (t <= k)
-                break;
-        } while (version < 40);
-
-    // FIXME - insure that it fits insted of being truncated
-        width = 17 + 4 * version;
-
-    // allocate, clear and setup data structures
-        v = datablkw + (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
-        for( t = 0; t < v; t++ )
-            eccbuf[t] = 0;
-        strinbuf = instring.slice(0);
-
-        for( t = 0; t < width * width; t++ )
-            qrframe[t] = 0;
-
-        for( t = 0 ; t < (width * (width + 1) + 1) / 2; t++)
-            framask[t] = 0;
-
-    // insert finders - black to frame, white to mask
-        for (t = 0; t < 3; t++) {
-            k = 0;
-            y = 0;
-            if (t == 1)
-                k = (width - 7);
-            if (t == 2)
-                y = (width - 7);
-            qrframe[(y + 3) + width * (k + 3)] = 1;
-            for (x = 0; x < 6; x++) {
-                qrframe[(y + x) + width * k] = 1;
-                qrframe[y + width * (k + x + 1)] = 1;
-                qrframe[(y + 6) + width * (k + x)] = 1;
-                qrframe[(y + x + 1) + width * (k + 6)] = 1;
-            }
-            for (x = 1; x < 5; x++) {
-                setmask(y + x, k + 1);
-                setmask(y + 1, k + x + 1);
-                setmask(y + 5, k + x);
-                setmask(y + x + 1, k + 5);
-            }
-            for (x = 2; x < 4; x++) {
-                qrframe[(y + x) + width * (k + 2)] = 1;
-                qrframe[(y + 2) + width * (k + x + 1)] = 1;
-                qrframe[(y + 4) + width * (k + x)] = 1;
-                qrframe[(y + x + 1) + width * (k + 4)] = 1;
-            }
-        }
-
-    // alignment blocks
-        if (version > 1) {
-            t = adelta[version];
-            y = width - 7;
-            for (;;) {
-                x = width - 7;
-                while (x > t - 3) {
-                    putalign(x, y);
-                    if (x < t)
-                        break;
-                    x -= t;
-                }
-                if (y <= t + 9)
-                    break;
-                y -= t;
-                putalign(6, y);
-                putalign(y, 6);
-            }
-        }
-
-    // single black
-        qrframe[8 + width * (width - 8)] = 1;
-
-    // timing gap - mask only
-        for (y = 0; y < 7; y++) {
-            setmask(7, y);
-            setmask(width - 8, y);
-            setmask(7, y + width - 7);
-        }
-        for (x = 0; x < 8; x++) {
-            setmask(x, 7);
-            setmask(x + width - 8, 7);
-            setmask(x, width - 8);
-        }
-
-    // reserve mask-format area
-        for (x = 0; x < 9; x++)
-            setmask(x, 8);
-        for (x = 0; x < 8; x++) {
-            setmask(x + width - 8, 8);
-            setmask(8, x);
-        }
-        for (y = 0; y < 7; y++)
-            setmask(8, y + width - 7);
-
-    // timing row/col
-        for (x = 0; x < width - 14; x++)
-            if (x & 1) {
-                setmask(8 + x, 6);
-                setmask(6, 8 + x);
-            }
-            else {
-                qrframe[(8 + x) + width * 6] = 1;
-                qrframe[6 + width * (8 + x)] = 1;
-            }
-
-    // version block
-        if (version > 6) {
-            t = vpat[version - 7];
-            k = 17;
-            for (x = 0; x < 6; x++)
-                for (y = 0; y < 3; y++, k--)
-                    if (1 & (k > 11 ? version >> (k - 12) : t >> k)) {
-                        qrframe[(5 - x) + width * (2 - y + width - 11)] = 1;
-                        qrframe[(2 - y + width - 11) + width * (5 - x)] = 1;
-                    }
-            else {
-                setmask(5 - x, 2 - y + width - 11);
-                setmask(2 - y + width - 11, 5 - x);
-            }
-        }
-
-    // sync mask bits - only set above for white spaces, so add in black bits
-        for (y = 0; y < width; y++)
-            for (x = 0; x <= y; x++)
-                if (qrframe[x + width * y])
-                    setmask(x, y);
-
-    // convert string to bitstream
-    // 8 bit data to QR-coded 8 bit data (numeric or alphanum, or kanji not supported)
-        v = strinbuf.length;
-
-    // string to array
-        for( i = 0 ; i < v; i++ )
-            eccbuf[i] = strinbuf.charCodeAt(i);
-        strinbuf = eccbuf.slice(0);
-
-    // calculate max string length
-        x = datablkw * (neccblk1 + neccblk2) + neccblk2;
-        if (v >= x - 2) {
-            v = x - 2;
-            if (version > 9)
-                v--;
-        }
-
-    // shift and repack to insert length prefix
-        i = v;
-        if (version > 9) {
-            strinbuf[i + 2] = 0;
-            strinbuf[i + 3] = 0;
-            while (i--) {
-                t = strinbuf[i];
-                strinbuf[i + 3] |= 255 & (t << 4);
-                strinbuf[i + 2] = t >> 4;
-            }
-            strinbuf[2] |= 255 & (v << 4);
-            strinbuf[1] = v >> 4;
-            strinbuf[0] = 0x40 | (v >> 12);
-        }
-        else {
-            strinbuf[i + 1] = 0;
-            strinbuf[i + 2] = 0;
-            while (i--) {
-                t = strinbuf[i];
-                strinbuf[i + 2] |= 255 & (t << 4);
-                strinbuf[i + 1] = t >> 4;
-            }
-            strinbuf[1] |= 255 & (v << 4);
-            strinbuf[0] = 0x40 | (v >> 4);
-        }
-    // fill to end with pad pattern
-        i = v + 3 - (version < 10);
-        while (i < x) {
-            strinbuf[i++] = 0xec;
-            // buffer has room    if (i == x)      break;
-            strinbuf[i++] = 0x11;
-        }
-
-    // calculate and append ECC
-
-    // calculate generator polynomial
-        genpoly[0] = 1;
-        for (i = 0; i < eccblkwid; i++) {
-            genpoly[i + 1] = 1;
-            for (j = i; j > 0; j--)
-                genpoly[j] = genpoly[j]
-                ? genpoly[j - 1] ^ gexp[modnn(glog[genpoly[j]] + i)] : genpoly[j - 1];
-            genpoly[0] = gexp[modnn(glog[genpoly[0]] + i)];
-        }
-        for (i = 0; i <= eccblkwid; i++)
-            genpoly[i] = glog[genpoly[i]]; // use logs for genpoly[] to save calc step
-
-    // append ecc to data buffer
-        k = x;
-        y = 0;
-        for (i = 0; i < neccblk1; i++) {
-            appendrs(y, datablkw, k, eccblkwid);
-            y += datablkw;
-            k += eccblkwid;
-        }
-        for (i = 0; i < neccblk2; i++) {
-            appendrs(y, datablkw + 1, k, eccblkwid);
-            y += datablkw + 1;
-            k += eccblkwid;
-        }
-    // interleave blocks
-        y = 0;
-        for (i = 0; i < datablkw; i++) {
-            for (j = 0; j < neccblk1; j++)
-                eccbuf[y++] = strinbuf[i + j * datablkw];
-            for (j = 0; j < neccblk2; j++)
-                eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
-        }
-        for (j = 0; j < neccblk2; j++)
-            eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
-        for (i = 0; i < eccblkwid; i++)
-            for (j = 0; j < neccblk1 + neccblk2; j++)
-                eccbuf[y++] = strinbuf[x + i + j * eccblkwid];
-        strinbuf = eccbuf;
-
-    // pack bits into frame avoiding masked area.
-        x = y = width - 1;
-        k = v = 1;         // up, minus
-        /* inteleaved data and ecc codes */
-        m = (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
-        for (i = 0; i < m; i++) {
-            t = strinbuf[i];
-            for (j = 0; j < 8; j++, t <<= 1) {
-                if (0x80 & t)
-                    qrframe[x + width * y] = 1;
-                do {        // find next fill position
-                    if (v)
-                        x--;
-                    else {
-                        x++;
-                        if (k) {
-                            if (y != 0)
-                                y--;
-                            else {
-                                x -= 2;
-                                k = !k;
-                                if (x == 6) {
-                                    x--;
-                                    y = 9;
-                                }
-                            }
-                        }
-                        else {
-                            if (y != width - 1)
-                                y++;
-                            else {
-                                x -= 2;
-                                k = !k;
-                                if (x == 6) {
-                                    x--;
-                                    y -= 8;
-                                }
-                            }
-                        }
-                    }
-                    v = !v;
-                } while (ismasked(x, y));
-            }
-        }
-
-    // save pre-mask copy of frame
-        strinbuf = qrframe.slice(0);
-        t = 0;           // best
-        y = 30000;         // demerit
-    // for instead of while since in original arduino code
-    // if an early mask was "good enough" it wouldn't try for a better one
-    // since they get more complex and take longer.
-        for (k = 0; k < 8; k++) {
-            applymask(k);      // returns black-white imbalance
-            x = badcheck();
-            if (x < y) { // current mask better than previous best?
-                y = x;
-                t = k;
-            }
-            if (t == 7)
-                break;       // don't increment i to a void redoing mask
-            qrframe = strinbuf.slice(0); // reset for next pass
-        }
-        if (t != k)         // redo best mask - none good enough, last wasn't t
-            applymask(t);
-
-    // add in final mask/ecclevel bytes
-        y = fmtword[t + ((ecclevel - 1) << 3)];
-        // low byte
-        for (k = 0; k < 8; k++, y >>= 1)
-            if (y & 1) {
-                qrframe[(width - 1 - k) + width * 8] = 1;
-                if (k < 6)
-                    qrframe[8 + width * k] = 1;
-                else
-                    qrframe[8 + width * (k + 1)] = 1;
-            }
-        // high byte
-        for (k = 0; k < 7; k++, y >>= 1)
-            if (y & 1) {
-                qrframe[8 + width * (width - 7 + k)] = 1;
-                if (k)
-                    qrframe[(6 - k) + width * 8] = 1;
-                else
-                    qrframe[7 + width * 8] = 1;
-            }
-
-    // return image
-        return qrframe;
-    }
-
-    var _canvas = null,
-        _size = null;
-
-    var api = {
-
-        get ecclevel () {
-            return ecclevel;
-        },
-
-        set ecclevel (val) {
-            ecclevel = val;
-        },
-
-        get size () {
-            return _size;
-        },
-
-        set size (val) {
-            _size = val
-        },
-
-        get canvas () {
-            return _canvas;
-        },
-
-        set canvas (el) {
-            _canvas = el;
-        },
-
-        getFrame: function (string) {
-            return genframe(string);
-        },
-
-        draw: function (string, canvas, size, ecc) {
-            
-            ecclevel = ecc || ecclevel;
-            canvas = canvas || _canvas;
-
-            if (!canvas) {
-                console.warn('No canvas provided to draw QR code in!')
-                return;
-            }
-
-            size = size || _size || Math.min(canvas.width, canvas.height);
-
-            var frame = genframe(string),
-                ctx = canvas.ctx,
-                px = Math.round(size / (width + 8));
-
-            var roundedSize = px * (width + 8),
-                offset = Math.floor((size - roundedSize) / 2);
-
-            size = roundedSize;
-
-            ctx.clearRect(0, 0, canvas.width, canvas.height);
-            ctx.setFillStyle('#000000');
-
-            for (var i = 0; i < width; i++) {
-                for (var j = 0; j < width; j++) {
-                    if (frame[j * width + i]) {
-                        ctx.fillRect(px * (4 + i) + offset, px * (4 + j) + offset, px, px);
-                    }
-                }
-            }
-            ctx.draw();
-        }
-    }
-
-    module.exports = {
-        api: api
-    }
-
-})()

+ 0 - 1
node_modules/wxbarcode/index.js

@@ -1 +0,0 @@
-module.exports = require('./demo/utils')

+ 0 - 36
node_modules/wxbarcode/package.json

@@ -1,36 +0,0 @@
-{
-  "name": "wxbarcode",
-  "version": "1.0.2",
-  "description": "微信小程序条码、二维码生成模块",
-  "main": "index.js",
-  "scripts": {
-
-  },
-  "keywords": [
-    "wechat",
-    "weixin",  	
-    "wxapp",
-    "barcode",
-    "qrcode",
-    "微信",
-    "微信小程序",
-    "条码",
-    "二维码"
-  ],
-  "author": "Alsey (zamber@gmail.com)",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/alsey/wxbarcode/issues"
-  },
-  "homepage": "https://github.com/alsey/wxbarcode#readme",
-  "dependencies": {
-
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/alsey/wxbarcode.git"
-  },
-  "devDependencies": {
-  	
-  }
-}

+ 0 - 13
package-lock.json

@@ -7,9 +7,6 @@
     "": {
       "name": "miniprogram-ts-less-quickstart",
       "version": "1.0.0",
-      "dependencies": {
-        "wxbarcode": "^1.0.2"
-      },
       "devDependencies": {
         "miniprogram-api-typings": "^2.8.3-1"
       }
@@ -19,11 +16,6 @@
       "resolved": "https://registry.npmmirror.com/miniprogram-api-typings/-/miniprogram-api-typings-2.12.0.tgz",
       "integrity": "sha512-ibvbqeslVFur0IAvTxLMvsbtvVcMo6gwvOnj0YZHV7aeDLu091VQRrETT2QuiG9P6aZWRcxeNGJChRKVPCp9VQ==",
       "dev": true
-    },
-    "node_modules/wxbarcode": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/wxbarcode/-/wxbarcode-1.0.2.tgz",
-      "integrity": "sha512-QFNva4OKNn6M3fYXLg+W+JI2FqdNeK69sSgLmxc36OPcrsDiR04If8SqGC4a6xMFHby0iiOFjIF8vsrtbXkRGA=="
     }
   },
   "dependencies": {
@@ -32,11 +24,6 @@
       "resolved": "https://registry.npmmirror.com/miniprogram-api-typings/-/miniprogram-api-typings-2.12.0.tgz",
       "integrity": "sha512-ibvbqeslVFur0IAvTxLMvsbtvVcMo6gwvOnj0YZHV7aeDLu091VQRrETT2QuiG9P6aZWRcxeNGJChRKVPCp9VQ==",
       "dev": true
-    },
-    "wxbarcode": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/wxbarcode/-/wxbarcode-1.0.2.tgz",
-      "integrity": "sha512-QFNva4OKNn6M3fYXLg+W+JI2FqdNeK69sSgLmxc36OPcrsDiR04If8SqGC4a6xMFHby0iiOFjIF8vsrtbXkRGA=="
     }
   }
 }

+ 0 - 3
package.json

@@ -6,9 +6,6 @@
   "keywords": [],
   "author": "",
   "license": "",
-  "dependencies": {
-    "wxbarcode": "^1.0.2"
-  },
   "devDependencies": {
     "miniprogram-api-typings": "^2.8.3-1"
   }

部分文件因为文件数量过多而无法显示