import Vue from 'vue' import define from '@/utils/define' import store from '@/store' const Socket = { contime: 0, ws: null, initSocket() { try { const token = uni.getStorageSync('token') || '' const sys = uni.getStorageSync('systemInfo') || '' Socket.ws = uni.connectSocket({ url: define.webSocketUrl + '/' + encodeURIComponent(token), // #ifdef APP-PLUS header: { 'User-Agent': sys }, // #endif success() { // console.log("websocket连接成功") }, }); store.state.chat.socket = Socket.ws uni.onSocketOpen(res => { Socket.contime = 0 const msg = JSON.stringify({ method: "OnConnection", token, mobileDevice: true }); Socket.sendMsg(msg) }); uni.onSocketError(res => { store.state.chat.socket = null setTimeout(() => { Socket.contime += 1 if (Socket.contime <= 10) { if (Socket.contime >= 3) { uni.showToast({ title: 'IM通讯正在连接:' + '连接第' + Socket.contime + '次!稍后...', icon: 'none' }) } Socket.reConnect(); } else { uni.showToast({ title: 'IM通讯连接失败,联系服务器管理员', icon: 'none' }) } }, 10) }); uni.onSocketClose(res => { store.state.chat.socket = null }); uni.onSocketMessage(res => { const data = JSON.parse(res.data) let options = { cover: false, sound: 'system', title: data.title }; switch (data.method) { case "initMessage": //初始化 const msgInfo = { messageText: data.messageDefaultText || '暂无数据', messageCount: data.unreadTotalCount || 0, } let badgeNum = data.unreadTotalCount || 0 for (let i = 0; i < data.unreadNums.length; i++) { badgeNum = badgeNum + data.unreadNums[i].unreadNum } store.commit('chat/SET_BADGE_NUM', badgeNum) store.commit('chat/SET_MSGINFO', msgInfo) break; case "Online": //在线用户 break; case "Offline": //离线用户 break; case "sendMessage": //发送消息 store.dispatch('chat/sendMessage', data) break; case "receiveMessage": //接收消息 // #ifdef APP-PLUS plus.push.createMessage('你有一条聊天消息', data, options); // #endif store.dispatch('chat/receiveMessage', data) break; case "messageList": //消息列表 store.dispatch('chat/getMessageList', data) break; case "messagePush": //消息推送 // #ifdef APP-PLUS let content = data.messageType == 2 ? '流程' : '公告' plus.push.createMessage(`你有一条${content}消息`, data, options); // #endif store.dispatch('chat/messagePush', data) break; case "closeSocket": //断开websocket连接 uni.closeSocket() break; case "logout": uni.showToast({ title: data.msg || '登录已过期', icon: 'none', complete: () => { setTimeout(() => { store.dispatch('user/resetToken').then(() => { uni.closeSocket() uni.reLaunch({ url: '/pages/login/index' }) }) }, 1500) } }) break; default: break; } }); } catch (e) {} }, sendMsg(msg) { uni.sendSocketMessage({ data: msg, fail: (e) => { Socket.reConnect() } }) }, //重连 reConnect() { Socket.initSocket() }, }; export default Socket