let config = require("./config/config.js"); const Http = require("./utils/HttpBasics"); const extConfig = wx.getExtConfigSync ? wx.getExtConfigSync() : {} App({ data: {}, onLaunch: function (options) { var that = this; console.log("onLuanch") that.globalData.sceneAddress = options.scene; /** * 用户登录 */ that.userLogin(options.scene); /** * 小程序版本更新 */ if (wx.canIUse('getUpdateManager')) { const updateManager = wx.getUpdateManager() updateManager.onCheckForUpdate(function (res) { // 请求完新版本信息的回调 if (res.hasUpdate) { console.log('res.hasUpdate====') updateManager.onUpdateReady(function () { wx.showModal({ title: '更新提示', content: '新版本已经准备好,是否重启应用?', success: function (res) { console.log('success====', res) // res: {errMsg: "showModal: ok", cancel: false, confirm: true} if (res.confirm) { // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 updateManager.applyUpdate() } } }) }) updateManager.onUpdateFailed(function () { // 新的版本下载失败 wx.showModal({ title: '已经有新版本了哟~', content: '新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~' }) }) } }) } }, /** * 用户登录 */ userLogin: function (sceneAddress) { let that = this; // 登录 wx.login({ success: ({ code }) => { let usrdata = { appId: config.weapp.AppId, code: code, sceneAddress: sceneAddress } Http.post({ url: config.api.login, data: usrdata }) .then(res => { if (res.data && res.data.score) { if (res.data.score != 0) { that.globalData.score = res.data.score; } } Http.setToken(res.data.token); that.globalData.token = res.data.token; console.log(that.globalData.token) if (that.tokenCallback) { that.tokenCallback(res.data.token); } }) .catch(err => { console.log(err) wx.showModal({ title: '提示', showCancel: false, content: '登录失败,请重新尝试', success: function (res) { if (res.cancel) { //点击取消,默认隐藏弹框 } else { //点击确定 wx.reLaunch({ url: '/pages/index/index', }) } } }) }) } }) }, /** * 获取地址位置信息 */ getLocation: function () { var that = this; wx.getLocation({ type: "wgs84", success: function (res) { that.globalData.locationInfo = res; }, fail: error => { console.log(error); } }); }, globalData: { // token token: null, // user openId openId: null, // 渠道 sceneAddress: null, // location info locationInfo: null, // 二维码参数 scene: null, // 支持智慧停车, 用户名下有车 phone: null, supportCar: false, parkVendor: 1, // 1: ETCP, 2: TJD // ETCP token etcpToken: null, carLogin: false, // 当前商场信息 market: { name: "陕西大悦城" }, // websocket socketClient: null, socketReceiver: function (e) { }, //收到消息回调 }, // 初始化websocket initSocket: function () { let that = this; // socket是否连接 let socketConnected = false; // 待发送的消息队列 let messageQueue = []; // 是否断线重连 let reconnect = true; // 发送消息 function sendSocketMessage(msg) { // console.log(msg); // 如果socket已连接则发送消息 if (socketConnected) { wx.sendSocketMessage({ data: msg }) } else { // socket没有连接将消息放入队列中 messageQueue.push(msg); } } // 关闭连接 function close() { if (socketConnected) { wx.closeSocket() socketConnected = false; } } // 符合WebSocket定义的对象 var ws = { send: sendSocketMessage, close: close } // 创建一个 WebSocket 连接 function connect() { wx.connectSocket({ url: config.wsurl, header: { token: that.globalData.token //从服务端获取一个token,服务端验证token是否允许连接,案例中没做限制 } }) } connect(); // 监听 WebSocket 连接打开事件 wx.onSocketOpen(function (res) { console.log("WebSocket 连接成功") socketConnected = true; ws.onopen(); // 连接成功后,将队列中的消息发送出去 let queueLength = messageQueue.length for (let i = 0; i < queueLength; i++) { sendSocketMessage(messageQueue.shift()) } }) // 监听 WebSocket 接受到服务器的消息事件 wx.onSocketMessage(function (res) { ws.onmessage(res); }) // 监听 WebSocket 错误事件 wx.onSocketError(function (res) { console.log("WebSocket 错误事件") if (!socketConnected) { // 断线重连 if (reconnect) { connect(); } } }) // 监听 WebSocket 连接关闭事件 wx.onSocketClose(function (res) { console.log("WebSocket 连接关闭") socketConnected = false; // 断线重连 if (reconnect) { connect(); } }) const Stomp = require('/utils/stomp.min.js').Stomp; /** * 定期发送心跳或检测服务器心跳 * The heart-beating is using window.setInterval() to regularly send heart-beats and/or check server heart-beats. * 可看stomp.js的源码(195,207,489行),由于小程序没有window对象,所以我们要调用小程序的定时器api实现 */ Stomp.setInterval = function (interval, f) { return setInterval(f, interval); }; // 结束定时器的循环调用 Stomp.clearInterval = function (id) { return clearInterval(id); }; const stompClient = Stomp.over(ws); that.globalData.socketClient = stompClient; stompClient.connect({}, function (callback) { // 订阅自己的 stompClient.subscribe('/user/' + config.weapp.AppId + '/' + that.globalData.openId + '/message', function (message, headers) { console.log('收到只发送给我的消息:', message); that.globalData.socketReceiver(JSON.parse(message.body)); // 通知服务端收到消息 message.ack(); }); stompClient.subscribe('/topic/' + config.weapp.AppId, function (message, headers) { console.log('收到TOPIC的消息:', message); that.globalData.socketReceiver(JSON.parse(message.body)); // 通知服务端收到消息 //message.ack(); }); // 向服务端发送消息 stompClient.send("/app/message", {}, JSON.stringify({ 'msg': 'client: ' + that.globalData.openId })); }) }, //统一发送消息 sendSocketMessage: function (msg) { this.globalData.socketClient.send("/app/message", {}, JSON.stringify(msg)); } });