初始提交
This commit is contained in:
204
libs/chat.js
Normal file
204
libs/chat.js
Normal file
@@ -0,0 +1,204 @@
|
||||
import define from '@/utils/define'
|
||||
import jnpf from '@/utils/jnpf'
|
||||
import {
|
||||
useChatStoreWithOut
|
||||
} from '@/store/modules/chat'
|
||||
import {
|
||||
useUserStore
|
||||
} from '@/store/modules/user'
|
||||
|
||||
const chatStore = useChatStoreWithOut()
|
||||
const userStore = useUserStore()
|
||||
let socketTask = false
|
||||
const Socket = {
|
||||
conTime: 0,
|
||||
initSocket() {
|
||||
try {
|
||||
const token = uni.getStorageSync('token') || ''
|
||||
const sys = uni.getStorageSync('systemInfo') || ''
|
||||
const userInfo = uni.getStorageSync('userInfo') || {}
|
||||
socketTask = uni.connectSocket({
|
||||
url: define.webSocketUrl + '/' + encodeURIComponent(token),
|
||||
// #ifdef APP
|
||||
header: {
|
||||
'User-Agent': sys
|
||||
},
|
||||
// #endif
|
||||
success() {
|
||||
setTimeout(() => chatStore.setSocket(socketTask), 0)
|
||||
},
|
||||
});
|
||||
socketTask.onMessage((res) => {
|
||||
let dataStr = res.data;
|
||||
const data = JSON.parse(dataStr)
|
||||
let options = {
|
||||
cover: false,
|
||||
sound: 'system',
|
||||
title: data.title
|
||||
};
|
||||
switch (data.method) {
|
||||
case "initMessage": //初始化
|
||||
const msgInfo = {
|
||||
messageText: data.messageDefaultText || '暂无数据',
|
||||
messageCount: data.unreadMessageCount + data.unreadSystemMessageCount < 0 ?
|
||||
0 : data.unreadMessageCount + data.unreadSystemMessageCount + data
|
||||
.unreadScheduleCount,
|
||||
messageDate: data.messageDefaultTime || 0,
|
||||
}
|
||||
let badgeNum = data.unreadTotalCount
|
||||
for (let i = 0; i < data.unreadNums.length; i++) {
|
||||
badgeNum = badgeNum + data.unreadNums[i].unreadNum
|
||||
}
|
||||
chatStore.setBadgeNum(badgeNum)
|
||||
chatStore.setMsgInfo(msgInfo)
|
||||
break;
|
||||
case "Online": //在线用户
|
||||
|
||||
break;
|
||||
case "Offline": //离线用户
|
||||
|
||||
break;
|
||||
case "sendMessage": //发送消息
|
||||
chatStore.sendMessage(data)
|
||||
break;
|
||||
case "receiveMessage": //接收消息
|
||||
// #ifdef APP
|
||||
plus.push.createMessage('你有一条聊天消息', {
|
||||
...data,
|
||||
messageType: 100
|
||||
}, options);
|
||||
// #endif
|
||||
chatStore.receiveMessage(data)
|
||||
break;
|
||||
case "messageList": //消息列表
|
||||
chatStore.getMessageList(data)
|
||||
break;
|
||||
case "messagePush": //消息推送
|
||||
// #ifdef APP
|
||||
let content = "公告"
|
||||
if (data.messageType == 2) content = '流程'
|
||||
if (data.messageType == 3) content = '系统'
|
||||
if (data.messageType == 4) content = '日程'
|
||||
uni.createPushMessage(res => {})
|
||||
uniCloud.callFunction({
|
||||
name: 'jnpfPush', // 云函数名称
|
||||
data: {
|
||||
"push_clientid": uni.getStorageSync('push_clientid'),
|
||||
"title": data.title,
|
||||
"content": `你有一条${content}消息`,
|
||||
"payload": {
|
||||
"data": {
|
||||
...data
|
||||
},
|
||||
"options": {
|
||||
...options
|
||||
}
|
||||
}
|
||||
},
|
||||
success: res => {},
|
||||
fail: err => {}
|
||||
});
|
||||
// #endif
|
||||
chatStore.messagePush(data)
|
||||
break;
|
||||
case "closeSocket": //断开websocket连接
|
||||
Socket.close()
|
||||
break;
|
||||
case "logout":
|
||||
uni.showToast({
|
||||
title: data.msg || '登录已过期',
|
||||
icon: 'none',
|
||||
complete: () => {
|
||||
setTimeout(() => {
|
||||
userStore.resetToken()
|
||||
setTimeout(() => {
|
||||
Socket.close()
|
||||
uni.reLaunch({
|
||||
url: '/pages/login/index'
|
||||
})
|
||||
}, 500)
|
||||
}, 1000)
|
||||
}
|
||||
})
|
||||
break;
|
||||
case "refresh":
|
||||
uni.showToast({
|
||||
title: '您的权限发生变更,正在刷新界面!',
|
||||
icon: 'none',
|
||||
complete: () => {
|
||||
setTimeout(() => {
|
||||
setTimeout(() => {
|
||||
uni.reLaunch({
|
||||
url: '/pages/index/index'
|
||||
})
|
||||
}, 500)
|
||||
}, 1000)
|
||||
}
|
||||
})
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
})
|
||||
|
||||
socketTask.onOpen((data) => {
|
||||
Socket.conTime = 0
|
||||
const msg = JSON.stringify({
|
||||
method: "OnConnection",
|
||||
token,
|
||||
mobileDevice: true,
|
||||
systemId: userInfo.appSystemId
|
||||
});
|
||||
Socket.sendMsg(msg)
|
||||
})
|
||||
|
||||
socketTask.onClose((data) => {
|
||||
socketTask = false
|
||||
chatStore.setSocket(null)
|
||||
})
|
||||
|
||||
socketTask.onError((data) => {
|
||||
chatStore.setSocket(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'
|
||||
})
|
||||
}
|
||||
}, 10000)
|
||||
})
|
||||
} catch (e) {}
|
||||
},
|
||||
sendMsg(data) {
|
||||
if (socketTask === false) return Socket.reConnect()
|
||||
let content = data;
|
||||
socketTask.send({
|
||||
data: content,
|
||||
complete(e) {}
|
||||
})
|
||||
},
|
||||
//重连
|
||||
reConnect() {
|
||||
Socket.initSocket()
|
||||
},
|
||||
close() {
|
||||
socketTask.close({
|
||||
complete(e) {
|
||||
socketTask = false
|
||||
chatStore.setSocket(null)
|
||||
}
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
export default Socket
|
||||
Reference in New Issue
Block a user