index.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. Vue.use(Vuex)
  4. let lifeData = {};
  5. try {
  6. // 尝试获取本地是否存在lifeData变量,第一次启动APP时是不存在的
  7. lifeData = uni.getStorageSync('lifeData');
  8. } catch (e) {
  9. }
  10. // 需要永久存储,且下次APP启动需要取出的,在state中的变量名
  11. let saveStateKeys = [
  12. 'vuex_user',
  13. 'vuex_token',
  14. 'vuex_userData',
  15. 'vuex_payType',
  16. 'vuex_payStatus',
  17. 'vuex_storeLabel',
  18. 'vuex_orderInfo',
  19. 'vuex_workStatus',
  20. 'orderDjs',
  21. 'loadingDjs',
  22. ];
  23. // 保存变量到本地存储中
  24. const saveLifeData = function(key, value) {
  25. // 判断变量名是否在需要存储的数组中
  26. if (saveStateKeys.indexOf(key) != -1) {
  27. // 获取本地存储的lifeData对象,将变量添加到对象中
  28. let tmp = uni.getStorageSync('lifeData');
  29. // 第一次打开APP,不存在lifeData变量,故放一个{}空对象
  30. tmp = tmp ? tmp : {};
  31. tmp[key] = value;
  32. // 执行这一步后,所有需要存储的变量,都挂载在本地的lifeData对象中
  33. uni.setStorageSync('lifeData', tmp);
  34. }
  35. }
  36. const store = new Vuex.Store({
  37. // 下面这些值仅为示例,使用过程中请删除
  38. state: {
  39. // 如果上面从本地获取的lifeData对象下有对应的属性,就赋值给state中对应的变量
  40. // 加上vuex_前缀,是防止变量名冲突,也让人一目了然
  41. vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {
  42. account: '',
  43. password: ''
  44. },
  45. vuex_token: lifeData.vuex_token ? lifeData.vuex_token : '',
  46. vuex_userData: lifeData.vuex_userData ? lifeData.vuex_userData : '',
  47. vuex_payType: lifeData.vuex_payType ? lifeData.vuex_payType : [], // 支付方式数据字典
  48. vuex_payStatus: lifeData.vuex_payStatus ? lifeData.vuex_payStatus : [], // 支付状态数据字典
  49. vuex_storeLabel: lifeData.vuex_storeLabel ? lifeData.vuex_storeLabel : [], // 网点标签数据字典
  50. // 如果无需保存到本地永久存储,无需lifeData.xx方式
  51. vuex_socket: null,
  52. vuex_wsMessageData: '',
  53. vuex_heartInterId: null,
  54. // 当前网络连接状态
  55. netStatus: '',
  56. // 设备是否正在运行中
  57. vuex_workStatus: 'linking',
  58. // 订单信息
  59. vuex_orderInfo: {
  60. storeId: '', // 网点id
  61. bizId: '', // 设备编号
  62. itemCode: '', // 服务类型
  63. duration: 0, // 不同服务的机器运行时间
  64. orderNo: '', // 订单编号
  65. orderStatus: '' // 订单状态
  66. },
  67. // 设备运行页面的计时器
  68. vuex_orderDjs: 0, // 订单完成倒计时
  69. vuex_workStep: 0, // 进度条步骤
  70. // 优惠券码
  71. vuex_couponCode: ''
  72. },
  73. mutations: {
  74. $uStore(state, payload) {
  75. // 判断是否多层级调用,state中为对象存在的情况,诸如user.info.score = 1
  76. let nameArr = payload.name.split('.');
  77. let saveKey = '';
  78. let len = nameArr.length;
  79. if (nameArr.length >= 2) {
  80. let obj = state[nameArr[0]];
  81. for (let i = 1; i < len - 1; i++) {
  82. obj = obj[nameArr[i]];
  83. }
  84. obj[nameArr[len - 1]] = payload.value;
  85. saveKey = nameArr[0];
  86. } else {
  87. // 单层级变量,在state就是一个普通变量的情况
  88. state[payload.name] = payload.value;
  89. saveKey = payload.name;
  90. }
  91. // 保存变量到本地,见顶部函数定义
  92. saveLifeData(saveKey, state[saveKey])
  93. },
  94. // 创建通知消息websocket
  95. $webSocket(state, params) {
  96. let _this = this
  97. let token = getApp().globalData.token
  98. let url = getApp().globalData.baseUrl
  99. let wsBaseUrl = url.indexOf("https:") >= 0 ? url.replace("https:", "wss:") : url.replace("http:", "ws:")
  100. let wsUrl = wsBaseUrl + 'websocket/weixin/' + state.vuex_orderInfo.bizId
  101. // 开始连接
  102. state.vuex_socket = uni.connectSocket({
  103. header: {
  104. 'X-AUTH-TOKEN': token
  105. },
  106. url: wsUrl, // ws 请求地址
  107. complete: () => {
  108. console.log('连接complete回调!')
  109. }
  110. });
  111. // 打开连接
  112. state.vuex_socket.onOpen(function(e) {
  113. console.log('连接成功!')
  114. })
  115. // 连接关闭
  116. state.vuex_socket.onClose(function(e) {
  117. console.log('ws关闭!')
  118. })
  119. // 连接错误
  120. state.vuex_socket.onError(function(e) {
  121. console.log('ws错误!', JSON.stringify(e))
  122. })
  123. // 接受消息
  124. state.vuex_socket.onMessage(function(e) {
  125. if (e.data == 'pong' || e.data == 'connected') {
  126. uni.$emit('wsMessage', e.data)
  127. }else{
  128. uni.$emit('wsMessage', JSON.parse(e.data))
  129. }
  130. })
  131. // 发送心跳包
  132. state.vuex_heartInterId = setInterval(function() {
  133. // console.log(state.vuex_socket.readyState)
  134. if (state.vuex_socket.readyState != 1) {
  135. state.vuex_socket = uni.connectSocket({
  136. header: {
  137. 'X-AUTH-TOKEN': token
  138. },
  139. url: wsUrl, // ws 请求地址
  140. complete: () => {
  141. console.log('连接complete回调!')
  142. }
  143. });
  144. } else {
  145. _this.commit("$sendWebsocket", "ping")
  146. }
  147. }, 10000)
  148. },
  149. // 关闭websocket
  150. $closeWebsocket(state) {
  151. if (state.vuex_socket) {
  152. state.vuex_socket.close({
  153. complete: function(e) {
  154. console.log('关闭websocket完成', e)
  155. // 停止心跳
  156. clearInterval(state.vuex_heartInterId)
  157. }
  158. })
  159. }
  160. },
  161. // 发送消息
  162. $sendWebsocket(state, msg) {
  163. state.vuex_socket.send({
  164. data: msg,
  165. complete: function(e) {
  166. console.log('ws发送完成', e)
  167. }
  168. })
  169. },
  170. }
  171. })
  172. export default store