yuhdemo/cms-app/libs/chat.js
2026-01-30 16:22:13 +08:00

142 lines
3.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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