微信小程序笔记、小程序打印

小程序介绍

目录结构

在这里插入图片描述

app.js
//程序的入口
App({
    //小程序的生命周期函数
    onLaunch: function () {
        this.globalData.sysinfo = wx.getSystemInfoSync()
    },
    //可以定义一些全局的函数
    getVersion: function () { //获取微信版本号
        return this.globalData.sysinfo["version"]
    },
    //也可以定义一些全局变量,通过app.globalData来调用
    globalData: {        
    }
})
单个页面的目录结构

在这里插入图片描述

.wxml : 用来描述当前这个页面的结构,同时提供了类似于Vue中指令的语法
.js : 用来定义当前页面中用到的数据、交互逻辑和响应用户的操作
.json : 用来定义当前页面的个性化配置,例如,为每个页面单独配置顶部颜色、是否允许下拉刷新等
.wxss : 用来定义样式

注意:在小程序页面的.js文件当中,即使我们没有任何的逻辑要写,也要在js文件中写一个页面初始化的Page({})函数

生命周期

生命周期:是指一个对象从创建 -> 运行 -> 销毁的整个阶段,强调的是一个时间段
小程序应用的生命周期:

App({
  //小程序初始化完成时,执行此函数,全局只触发一次。可以做一些初始化的工作。
  onLaunch: function(options) { },
  
  //小程序启动,或从后台进入前台显示时触发。
  onShow : function(options) { },
  
  //小程序从前台进入后台时触发。
  onHide : function() { }
})

小程序页面的生命周期:

Page({
  //监听页面加载,一个页面只调用1次
  onLoad : function(options) { }//监听页面显示
  onShow : function() { },
  //监听页面初次渲染完成,一个页面只调用1次
  onReady : function() { },
  //监听页面隐藏
  onHide: function() { },
  //监听页面卸载,一个页面只调用1次
  onUnload: function() { }
})

Page中除了生命周期函数外,自定义的函数和变量,还有一些事件的监听都是写在这里

Page({
  //监听页面滚动
  onPageScroll: function() {
    // Do something when page scroll
  },
  //自定义函数
  viewTap: function() {
    this.setData({
      hi: 'nizhenhao.'
    }, function() {
      // this is setData callback
    })
  },
  //自定义的变量
  data: {
    hi: 'nihao'
  }
})

一、微信小程序的关键配置

app.json

{
    "pages": [
        "pages/web/web",
        "pages/all/all",
        "pages/camera/camera",
        "pages/scanCode/scanCode",
        "pages/result/result"
    ],
    "window": {
        "backgroundTextStyle": "light",
        "navigationBarBackgroundColor": "#2069d7",
        "navigationBarTitleText": "xxxxxxx",
        "navigationBarTextStyle": "white"
    },
    "sitemapLocation": "sitemap.json"
}

pages 数组:配置小程序的页面路径(第一个路径为默认访问的路径)
window 对象:用于设置小程序的状态栏、导航条、标题、窗口背景色
在这里插入图片描述

开发配置
服务器域名请在 「小程序后台 - 开发 - 开发设置 - 服务器域名」 中进行配置。

注意:
域名只支持 https (wx.request、wx.uploadFile、wx.downloadFile) 和 wss (wx.connectSocket) 协议;
域名不能使用 IP 地址(小程序的局域网 IP 除外)或 localhost;
可以配置端口,如 https://gago.com:8080,但是配置后只能向 https://gago.com:8080 发起请求。如果向 https://gago.com等 URL 请求则会失败。
如果不配置端口。如 https://gago.com,那么请求的 URL 中也不能包含端口,甚至是默认的 443 端口也不可以。如果向 https://gago.com:443 请求则会失败。
业务域名是在web-view中加载的h5的地址。
在这里插入图片描述

二、小程序与网页间通信

小程序与H5跳转

H5 ==> 小程序

1、在H5页面引入JSSDK
首先需要在H5页面中引入JSSDK,它可以让H5页面的js文件执行微信小程序的部分API命令。
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
2、使用wx API路由跳转
url就是在小程序里app.json的pages里面写的路由,需要传的参数就像get请求那样拼接在后面就行。

window.wx.miniProgram.navigateTo({
      url: `../all/all?${queryString.stringify(params)}`,
    });

接收参数:在小程序的生命周期函数onLoad里接收一个options
onLoad: function (options) {}

小程序 ==> H5
wx.navigateBack({
  delta: 2,
});
wx.navigateTo({
    url: `../web/web`,
})

navigateBack:顾名思义就是返回,delta就是路由回退的数量
navigateTo:这个就是跳转到制定到路由,这里是返回到的地方。
使用navigateTo,会重新渲染H5的页面,也就是会经过路由重定向到登陆页的过程,所以H5中要做token的保存和验证。

小程序向H5传输数据

每个微信小程序需要事先设置通讯域名(上面的服务器域名),小程序只可以跟指定的域名进行网络通信。包括普通 HTTPS 请求(wx.request)、上传文件(wx.uploadFile)、下载文件(wx.downloadFile) 和 WebSocket 通信(wx.connectSocket)

request

文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html

wx.request({
      url: 'url',
      method: 'POST',
      data: {
        xxx: xxx
        ...
      },
      header: {
        'content-type': 'application/json', // 默认值
      },
      success(res) {
        that.printSuccess(app.globalData.printData.certificateCode);
      }
    })

三、小程序与打印机间通信

  1. 搜索蓝牙、获取蓝牙列表、停止搜索
  2. 建立连接,获取deviceId
  3. 连接成功后获取蓝牙设备服务(serviceId
  4. 根据deviceId、deviceId 来获取设备的读写特征。(notify、write、read
  5. 向低功耗蓝牙设备特征值(write)中写入二进制数据

在小程序中,要使用蓝牙能力(Beacon 除外)必须首先调用 wx.openBluetoothAdapter 初始化蓝牙适配器模块,其生效周期为调用 wx.openBluetoothAdapter 至调用 wx.closeBluetoothAdapter 或小程序被销毁为止。

每个蓝牙设备都有唯一的 deviceId 来标识。建立蓝牙连接需要的参数就是这个deviceId。需要注意,在不同设备上扫描获取到的 deviceId 可能是变化的。因此 deviceId 不能写死在代码中。

向低功耗蓝牙设备特征值(write)中写入二进制数据

建议每次写入的buffer不超过20字节,超过会有写入错误的风险
所以需要将数据分包发送

Send: function (buff) { //分包发送
    var that = this
    var currentTime = that.data.currentTime
    var loopTime = that.data.looptime // parseInt(buff.length / time);
    var lastData = that.data.lastData // parseInt(buff.length % time);
    var onTimeData = that.data.oneTimeData //每次数据大小:20字节
    var printNum = that.data.printSize //printNumber
    var currentPrint = that.data.currentPrint
    var buf
    var dataView
    if (currentTime < loopTime) {
      buf = new ArrayBuffer(onTimeData)
      dataView = new DataView(buf)
      for (var i = 0; i < onTimeData; ++i) {
        dataView.setUint8(i, buff[(currentTime - 1) * onTimeData + i])
      }
    } else {
      buf = new ArrayBuffer(lastData)
      dataView = new DataView(buf)
      for (var i = 0; i < lastData; ++i) {
        dataView.setUint8(i, buff[(currentTime - 1) * onTimeData + i])
      }
    }
    wx.writeBLECharacteristicValue({
      deviceId: app.BLEInformation.deviceId,
      serviceId: app.BLEInformation.writeServiceId,
      characteristicId: app.BLEInformation.writeCharaterId,
      value: buf,
      success: function (res) {
        if (currentPrint == printNum) {
          wx.showToast({
            title: '打印成功',
          })
        }
      },
      fail: function (e) {
        wx.showToast({
          title: '打印失败',
          icon: 'none',
        })
      },
      complete: function () {
        currentTime++
        //分包发送结束
        if (currentTime <= loopTime) {
          that.setData({
            currentTime: currentTime
          })
          that.Send(buff)
        } else {
            //是否打印多张
          if (currentPrint == printNum) {
            that.setData({
              looptime: 0,
              lastData: 0,
              currentTime: 1,
              isLabelSend: false,
              currentPrint: 1
            })
            that.recordPrintNum(printNum);//将打印数量提交到后台
          } else {
            currentPrint++
            that.setData({
              currentPrint: currentPrint,
              currentTime: 1,
            })
            that.Send(buff)
          }
        }
      }
    })
  },

四、小程序真机调试

小程序的控制台:

真机调试的控制台:

手机上打开控制台:

五、小程序的更新与发版

如果需要测试环境,则在微信小程序官网,在版本管理->开发版本,选择你要用做测试的版本,将其设为体验版。

注意:
微信的 web-view 组件就是一个嵌在小程序里的浏览器,它在缓存上并没有完全遵照上述的规则,也即它的缓存并不能及时得到清理。想必下面的操作大家都有尝试过:

· 手动退出小程序,再次进入;
· 将微信从后台退出再打开并重新进入小程序;
· 修改 Nginx 关于 Cache-Control 的配置;
· 用 debugx5.qq.com 手动清除安卓微信浏览器缓存;
· iOS 利用微信自带清楚缓存功能。

无法及时刷新缓存会导致发布了最新的页面,而小程序里仍然是以前的页面,从而会带来许多问题,如前后端的数据不一致,新的特性无法及时起作用,修改的问题没有得到解决等等。这里需要说明一下:web-view 在过一段时间(时间不定,一天或者几小时,无明显规律)是可以进行缓存刷新的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值