142 lines
3.4 KiB
JavaScript
142 lines
3.4 KiB
JavaScript
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 |