Bladeren bron

!47 修复断线重连期间数据丢失的bug
Merge pull request !47 from blue/v_2.0.0

blue 2 jaren geleden
bovenliggende
commit
d8dde92738
5 gewijzigde bestanden met toevoegingen van 37 en 16 verwijderingen
  1. 8 1
      im-ui/src/api/wssocket.js
  2. 7 4
      im-ui/src/view/Home.vue
  3. 1 1
      im-ui/src/view/Login.vue
  4. 14 10
      im-uniapp/App.vue
  5. 7 0
      im-uniapp/common/wssocket.js

+ 8 - 1
im-ui/src/api/wssocket.js

@@ -1,6 +1,7 @@
 var websock = null;
 let rec; //断线重连后,延迟5秒重新创建WebSocket连接  rec用来存储延迟请求的代码
 let isConnect = false; //连接标识 避免重复连接
+let connectCallBack= null;
 let messageCallBack = null;
 let closeCallBack = null
 
@@ -16,6 +17,8 @@ let connect = (wsurl,accessToken) => {
 			let sendInfo = JSON.parse(e.data)
 			if (sendInfo.cmd == 0) {	
 				heartCheck.start()
+				// 登录成功才算真正完成连接
+				connectCallBack && connectCallBack();
 				console.log('WebSocket登录成功')
 			} else if (sendInfo.cmd == 1) {
 				// 重新开启心跳定时
@@ -119,6 +122,9 @@ let sendMessage = (agentData) => {
 	}
 }
 
+let onConnect = (callback) => {
+	connectCallBack = callback;
+}
 
 let onMessage = (callback) => {
 	messageCallBack = callback;
@@ -134,6 +140,7 @@ export {
 	reconnect,
 	close,
 	sendMessage,
+	onConnect,
 	onMessage,
-	onClose
+	onClose,
 }

+ 7 - 4
im-ui/src/view/Home.vue

@@ -80,11 +80,14 @@
 		methods: {
 			init() {
 				this.$store.dispatch("load").then(() => {
-					// 加载离线消息
-					this.loadPrivateMessage(this.$store.state.chatStore.privateMsgMaxId);
-					this.loadGroupMessage(this.$store.state.chatStore.groupMsgMaxId);
+					
 					// ws初始化
 					this.$wsApi.connect(process.env.VUE_APP_WS_URL, sessionStorage.getItem("accessToken"));
+					this.$wsApi.onConnect(()=>{
+						// 加载离线消息
+						this.loadPrivateMessage(this.$store.state.chatStore.privateMsgMaxId);
+						this.loadGroupMessage(this.$store.state.chatStore.groupMsgMaxId);
+					});
 					this.$wsApi.onMessage((cmd, msgInfo) => {
 						if (cmd == 2) {
 							// 关闭ws
@@ -104,7 +107,7 @@
 							// 插入群聊消息
 							this.handleGroupMessage(msgInfo);
 						}
-					})
+					});
 					this.$wsApi.onClose((e) => {
 						console.log(e);
 						if (e.code != 3000) {   

+ 1 - 1
im-ui/src/view/Login.vue

@@ -35,7 +35,7 @@
 					<a class="login-icon" href="https://gitee.com/bluexsx/box-im" target="_blank">
 						<img src="https://gitee.com/bluexsx/box-im/badge/star.svg" />
 					</a>
-					<a class="login-icon" href="https://gitee.com/bluexsx/box-im" target="_blank">
+					<a class="login-icon" href="https://github.com/bluexsx/box-im" target="_blank">
 						<img src="https://img.shields.io/github/stars/bluexsx/box-im.svg?style=flat&logo=GitHub" />
 					</a>
 

+ 14 - 10
im-uniapp/App.vue

@@ -18,9 +18,6 @@
 					this.initAudit();
 					// 初始化websocket
 					this.initWebSocket();
-					// 加载离线消息
-					this.loadPrivateMessage(store.state.chatStore.privateMsgMaxId);
-					this.loadGroupMessage(store.state.chatStore.groupMsgMaxId);
 				}).catch((e) => {
 					console.log(e);
 					this.exit();
@@ -30,6 +27,11 @@
 				let loginInfo = uni.getStorageSync("loginInfo")
 				wsApi.init();
 				wsApi.connect(process.env.WS_URL, loginInfo.accessToken);
+				wsApi.onConnect(() => {
+					// 加载离线消息
+					this.loadPrivateMessage(store.state.chatStore.privateMsgMaxId);
+					this.loadGroupMessage(store.state.chatStore.groupMsgMaxId);
+				});
 				wsApi.onMessage((cmd, msgInfo) => {
 					if (cmd == 2) {
 						// 异地登录,强制下线
@@ -69,9 +71,9 @@
 						msgInfo.selfSend = msgInfo.sendId == store.state.userStore.userInfo.id;
 						let friendId = msgInfo.selfSend ? msgInfo.recvId : msgInfo.sendId;
 						let friend = store.state.friendStore.friends.find((f) => f.id == friendId);
-						if(friend){
-							this.insertPrivateMessage(friend,msgInfo);
-						}	
+						if (friend) {
+							this.insertPrivateMessage(friend, msgInfo);
+						}
 					})
 					if (msgInfos.length == 100) {
 						// 继续拉取
@@ -91,8 +93,8 @@
 						msgInfo.selfSend = msgInfo.sendId == store.state.userStore.userInfo.id;
 						let groupId = msgInfo.groupId;
 						let group = store.state.groupStore.groups.find((g) => g.id == groupId);
-						if(group){
-							this.insertGroupMessage(group,msgInfo);
+						if (group) {
+							this.insertGroupMessage(group, msgInfo);
 						}
 					})
 					if (msgInfos.length == 100) {
@@ -119,8 +121,10 @@
 						store.commit("resetUnreadCount", chatInfo)
 					} else {
 						// 对方已读我的消息,修改消息状态为已读
-						store.commit("readedMessage", {friendId:friendId})
-						
+						store.commit("readedMessage", {
+							friendId: friendId
+						})
+
 					}
 					return;
 				}

+ 7 - 0
im-uniapp/common/wssocket.js

@@ -2,6 +2,7 @@ let wsurl = "";
 let accessToken = "";
 let messageCallBack = null;
 let closeCallBack = null;
+let connectCallBack = null;
 let isConnect = false; //连接标识 避免重复连接
 let rec = null;
 let isInit = false;
@@ -31,6 +32,7 @@ let init = () => {
 		let sendInfo = JSON.parse(res.data)
 		if (sendInfo.cmd == 0) {
 			heartCheck.start()
+			connectCallBack && connectCallBack();
 			console.log('WebSocket登录成功')
 		} else if (sendInfo.cmd == 1) {
 			// 重新开启心跳定时
@@ -145,6 +147,10 @@ function sendMessage(agentData) {
 	})
 }
 
+let onConnect = (callback) => {
+	connectCallBack = callback;
+}
+
 
 function onMessage(callback) {
 	messageCallBack = callback;
@@ -163,6 +169,7 @@ export {
 	reconnect,
 	close,
 	sendMessage,
+	onConnect,
 	onMessage,
 	onClose
 }