You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.4 KiB

2 months ago
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