Browse Source

feat: socket

test2
xuesinan 4 years ago
parent
commit
996a1ca778
  1. 2
      App.vue
  2. 3
      CHANGELOG.md
  3. 2
      common/js/config.js
  4. 183
      store/socket/actions.js

2
App.vue

@ -55,7 +55,7 @@ export default {
// const token = await this.getToken(); // const token = await this.getToken();
// this.noPhone(this.$store.state.user.phone); // this.noPhone(this.$store.state.user.phone);
// this.$store.dispatch('socket/initSocket'); this.$store.dispatch('socket/initSocket');
}, },
methods: { methods: {

3
CHANGELOG.md

@ -1,4 +1,4 @@
# 1.0.0 (2022-02-18) # 1.0.0 (2022-02-23)
### 🌟 新功能 ### 🌟 新功能
范围|描述|commitId 范围|描述|commitId
@ -113,6 +113,7 @@
- | 解决默认角色不是第一个时显示出错问题 | [8dba578](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8dba578) - | 解决默认角色不是第一个时显示出错问题 | [8dba578](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8dba578)
- | 解决warning | [dcb0079](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/dcb0079) - | 解决warning | [dcb0079](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/dcb0079)
- | 拍照上传交付物 | [1cbb2ac](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1cbb2ac) - | 拍照上传交付物 | [1cbb2ac](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1cbb2ac)
- | 切换项目任务清空 | [1dd3b4b](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1dd3b4b)
- | 日历列表H5在手机端不显示 | [0b4ae72](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/0b4ae72) - | 日历列表H5在手机端不显示 | [0b4ae72](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/0b4ae72)
- | 删除多余的引入 | [050b12a](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/050b12a) - | 删除多余的引入 | [050b12a](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/050b12a)
- | 上查下查 | [48ee8cb](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/48ee8cb) - | 上查下查 | [48ee8cb](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/48ee8cb)

2
common/js/config.js

@ -6,7 +6,7 @@ var config = {
baseUrl: 'http://101.201.226.163', baseUrl: 'http://101.201.226.163',
apiUrl: 'http://101.201.226.163/gateway', apiUrl: 'http://101.201.226.163/gateway',
msgUrl: 'wss://101.201.226.163/websocket/message/v4.0/ws', msgUrl: 'ws://101.201.226.163:8196/message/v4.0/ws',
projectPath: 'https://101.201.226.163/tall-project', projectPath: 'https://101.201.226.163/tall-project',
// baseUrl: 'https://www.tall.wiki', // baseUrl: 'https://www.tall.wiki',

183
store/socket/actions.js

@ -1,72 +1,54 @@
const WS_BASE_URL = 'wss://test.tall.wiki/websocket/message/v4.0/ws'; // 测试 import Config from "@/common/js/config.js"
// const WS_BASE_URL = 'wss://www.tall.wiki/websocket/message/v4.0/ws'; // 生产 let prevSendTimeMs = 0; // 上一条消息发送时间
let prevTime = 0;
let socketMsgQueue = []; // socket消息队列 let socketMsgQueue = []; // socket消息队列
let sendHeartTimer = null; let sendHeartTimer = null;
let heartbeatConst = 15000; // 心跳常量
const actions = { const actions = {
// 初始化socket // 初始化socket
initSocket({ commit, dispatch, state, rootState }) { initSocket({ commit, dispatch, state }) {
if (state.lockSocket) return; if (state.lockSocket) return;
const { // const { token } = rootState.user;
token // if (!token) return;
} = rootState.user;
if (!token) return;
commit('setLockSocket', true); commit('setLockSocket', true);
commit('setSocket', uni.connectSocket({ commit('setSocket', uni.connectSocket({ url: Config.msgUrl, complete: () => {} }));
url: WS_BASE_URL, // dispatch('auth');
complete: () => {}
}));
dispatch('onSocketOpen'); dispatch('onSocketOpen');
dispatch('onSocketMessage'); dispatch('onSocketMessage');
dispatch('onSocketClose'); dispatch('onSocketClose');
state.socket.onError(errMsg => console.error(errMsg)); state.socket.onError(errMsg => console.error(errMsg));
commit('setLockSocket', false); commit('setLockSocket', false);
}, },
// websocket发送channelId进行认证
auth({ dispatch }) {
const token = uni.$storage.getStorageSync('anyringToken');
const data = { type: 'Auth', data: { token } };
dispatch('sendSocketMessage', data);
},
// 监听ws打开 // 监听ws打开
onSocketOpen({ onSocketOpen({ dispatch, commit, state }) {
dispatch,
commit,
state
}) {
// eslint-disable-next-line no-unused-vars
state.socket.onOpen(res => { state.socket.onOpen(res => {
// console.log('ws open: ', res);
commit('setConnected', true); commit('setConnected', true);
prevTime = Date.now(); prevSendTimeMs = Date.now();
// this.auth(); dispatch('auth'); // 认证
dispatch('auth'); // for (let i = 0; i < socketMsgQueue.length; i++) {
for (let i = 0; i < socketMsgQueue.length; i++) { // dispatch('sendSocketMessage', socketMsgQueue[i]);
dispatch('sendSocketMessage', socketMsgQueue[i]); // }
} // socketMsgQueue = [];
socketMsgQueue = [];
}); });
}, },
// 监听收到的ws消息 // 监听收到的ws消息
onSocketMessage({ onSocketMessage({ dispatch, state }) {
dispatch,
state
}) {
state.socket.onMessage(res => { state.socket.onMessage(res => {
// console.log('收到消息:', res);
prevTime = Date.now();
if (!res || !res.data || !JSON.parse(res.data)) return; if (!res || !res.data || !JSON.parse(res.data)) return;
const resData = JSON.parse(res.data); const resData = JSON.parse(res.data);
const { const { messageSet, ackId } = resData;
messageSet,
ackId
} = resData;
// 处理消息体对象 // 处理消息体对象
messageSet.forEach(item => dispatch('handleMessagesData', item)); messageSet.forEach(item => dispatch('handleMessagesData', item));
ackId && dispatch('sendSocketMessage', { ackId && dispatch('sendSocketMessage', { type: 'Ack', data: { ackId } });
type: 'Ack',
data: {
ackId
}
});
}); });
}, },
@ -74,77 +56,39 @@ const actions = {
* 处理收到的消息内容 * 处理收到的消息内容
* @param {object} item 单个消息体对象 * @param {object} item 单个消息体对象
*/ */
handleMessagesData({ handleMessagesData({ dispatch, commit }, item) {
dispatch,
commit
}, item) {
const data = JSON.parse(item.data); const data = JSON.parse(item.data);
switch (data.type) { switch (data.type) {
case 'Sync': // 开始某个节点 case 'Sync': // 开始某个节点
commit('messages/messagesAdd', { commit('messages/messagesAdd', { message: data, type: 'syncMessages' }, { root: true });
message: data,
type: 'syncMessages'
}, {
root: true
});
break; break;
case 'taskStatus': // 任务状态修改相关消息 case 'taskStatus': // 任务状态修改相关消息
commit('task/setTaskStatus', data.data, { commit('task/setTaskStatus', data.data, { root: true });
root: true
});
break; break;
// case 'Chrome': // !收到开始游戏的消息
// console.log('handleMessagesData', data);
// // @ts-ignore
// util.openGameApp({
// type: data.data.type,
// projectId: data.data.projectId,
// id: data.data.recordId,
// token: rootState.user.token,
// });
// break;
// case 'Deliver': // 交付物相关消息 // case 'Deliver': // 交付物相关消息
// commit('messages/messagesAdd', { type: 'checkMessages', message: data }, { root: true }); // commit('messages/messagesAdd', { type: 'checkMessages', message: data }, { root: true });
// break; // break;
case 'ChannelStatus': case 'ChannelStatus':
dispatch('handleAuthMessage', data); dispatch('handleAuthMessage', data);
break; break;
// case 'switchoverProject': // 康复相关消息
// dispatch('home/getProjectById', data.data.projectId, { root: true });
// break;
// case 'startDrill': // 康复开始训练相关消息
// console.log('setStartDrillInfo', data.data);
// commit('home/setStartDrillMessages', data.data, { root: true });
// break;
default: default:
break; break;
} }
}, },
// 发送消息 // 发送消息
sendSocketMessage({ sendSocketMessage({ state }, data) {
state if (state.connected) {
}, data) { prevSendTimeMs = Date.now();
if (state.connected) { const msg = JSON.stringify({ toDomain: 'Server', data: JSON.stringify(data) });
const msg = JSON.stringify({ state.socket.send({ data: msg });
toDomain: 'Server',
data: JSON.stringify(data)
});
state.socket.send({
data: msg
});
} else { } else {
socketMsgQueue.push(data); socketMsgQueue.push(data);
} }
}, },
// 监听关闭事件 // 监听关闭事件
onSocketClose({ onSocketClose({ dispatch, commit, state }) {
dispatch,
commit,
state
}) {
// console.log('onSocketClose');
state.socket.onClose(() => { state.socket.onClose(() => {
commit('setConnected', false); commit('setConnected', false);
if (sendHeartTimer) clearInterval(sendHeartTimer); if (sendHeartTimer) clearInterval(sendHeartTimer);
@ -154,58 +98,29 @@ const actions = {
}); });
}, },
// websocket发送channelId进行认证
auth({
dispatch,
rootState
}) {
const {
token
} = rootState.user;
if (!token) return;
const data = {
type: 'Auth',
data: {
token
}
};
dispatch('sendSocketMessage', data);
},
// 心跳检测
sendHeart({
dispatch,
state
}) {
if (sendHeartTimer) clearInterval(sendHeartTimer);
sendHeartTimer = setInterval(() => {
if (Date.now() - prevTime >= 15000) {
dispatch('sendSocketMessage', {
type: 'Ping'
});
if (Date.now() - prevTime >= 20000) {
state.socket.close();
}
}
}, 5000);
},
/** /**
* 处理auth认证返回的ChannelStatus消息 * 处理auth认证返回的ChannelStatus消息
* @param {object} data 消息内容对象 * @param {object} data 消息内容对象
*/ */
handleAuthMessage({ handleAuthMessage({ commit, dispatch }, data) {
commit,
dispatch
}, data) {
if (data.data.authed) { if (data.data.authed) {
dispatch('sendHeart'); dispatch('sendHeart');
} else { } else {
uni.$u.toast('消息系统认证失败, 请退出重新登录'); uni.$u.toast(data.data.error.text);
uni.$storage.removeStorageSync('anyringToken'); uni.$storage.removeStorageSync('anyringToken');
commit('setSocket', null); commit('setSocket', null);
} }
}, },
// 心跳检测
sendHeart({ dispatch, state }) {
if (sendHeartTimer) clearInterval(sendHeartTimer);
sendHeartTimer = setInterval(() => {
if (Date.now() - prevSendTimeMs >= heartbeatConst) {
dispatch('sendSocketMessage', { type: 'Ping' });
}
}, 5000);
},
}; };
export default actions; export default actions;

Loading…
Cancel
Save