Просмотр исходного кода

提升拉取离线消息性能

xsx 6 месяцев назад
Родитель
Сommit
b1d331ee3e
2 измененных файлов с 35 добавлено и 39 удалено
  1. 19 25
      im-uniapp/store/friendStore.js
  2. 16 14
      im-uniapp/store/groupStore.js

+ 19 - 25
im-uniapp/store/friendStore.js

@@ -5,36 +5,27 @@ import { TERMINAL_TYPE } from '../common/enums.js'
 export default defineStore('friendStore', {
 export default defineStore('friendStore', {
 	state: () => {
 	state: () => {
 		return {
 		return {
-			friends: [],
+			friendMap: new Map(),
 			timer: null
 			timer: null
 		}
 		}
 	},
 	},
 	actions: {
 	actions: {
 		setFriends(friends) {
 		setFriends(friends) {
-			friends.forEach((f) => {
-				f.online = false;
-				f.onlineWeb = false;
-				f.onlineApp = false;
-			})
-			this.friends = friends;
+			this.friendMap.clear();
+			friends.forEach(f => this.friendMap.set(f.id, f))
 		},
 		},
 		updateFriend(friend) {
 		updateFriend(friend) {
 			let f = this.findFriend(friend.id);
 			let f = this.findFriend(friend.id);
-			let copy = JSON.parse(JSON.stringify(f));
-			Object.assign(f, friend);
-			f.online = copy.online;
-			f.onlineWeb = copy.onlineWeb;
-			f.onlineApp = copy.onlineApp;
+			friend.online = f.online;
+			friend.onlineWeb = f.onlineWeb;
+			friend.onlineApp = f.onlineApp;
+			this.friendMap.set(friend.id, friend)
 		},
 		},
 		removeFriend(id) {
 		removeFriend(id) {
-			this.friends.filter(f => f.id == id).forEach(f => f.deleted = true);
+			this.friendMap.get(id).deleted = true;
 		},
 		},
 		addFriend(friend) {
 		addFriend(friend) {
-			if (this.friends.some((f) => f.id == friend.id)) {
-				this.updateFriend(friend)
-			} else {
-				this.friends.unshift(friend);
-			}
+			this.friendMap.set(friend.id, friend)
 		},
 		},
 		setOnlineStatus(onlineTerminals) {
 		setOnlineStatus(onlineTerminals) {
 			this.friends.forEach((f) => {
 			this.friends.forEach((f) => {
@@ -68,12 +59,11 @@ export default defineStore('friendStore', {
 			}, 30000)
 			}, 30000)
 		},
 		},
 		setDnd(id, isDnd) {
 		setDnd(id, isDnd) {
-			let friend = this.findFriend(id);
-			friend.isDnd = isDnd;
+			this.friendMap.get(id).isDnd = isDnd;
 		},
 		},
 		clear() {
 		clear() {
+			this.friendMap.clear();
 			clearTimeout(this.timer);
 			clearTimeout(this.timer);
-			this.friends = [];
 			this.timer = null;
 			this.timer = null;
 		},
 		},
 		loadFriend() {
 		loadFriend() {
@@ -92,11 +82,15 @@ export default defineStore('friendStore', {
 		}
 		}
 	},
 	},
 	getters: {
 	getters: {
-		isFriend: (state) => (userId) => {
-			return state.friends.filter((f) => !f.deleted).some((f) => f.id == userId);
+		friends: (state) => {
+			return Array.from(state.friendMap.values());
 		},
 		},
-		findFriend: (state) => (id) => {
-			return state.friends.find((f) => f.id == id);
+		findFriend: (state) => (userId) => {
+			return state.friendMap.get(userId);
+		},
+		isFriend: (state) => (userId) => {
+			let f = state.findFriend(userId)
+			return f && !f.deleted
 		}
 		}
 	}
 	}
 })
 })

+ 16 - 14
im-uniapp/store/groupStore.js

@@ -4,33 +4,28 @@ import http from '@/common/request';
 export default defineStore('groupStore', {
 export default defineStore('groupStore', {
 	state: () => {
 	state: () => {
 		return {
 		return {
-			groups: []
+			groupMap: new Map()
 		}
 		}
 	},
 	},
 	actions: {
 	actions: {
 		setGroups(groups) {
 		setGroups(groups) {
-			this.groups = groups;
+			this.groupMap.clear();
+			groups.forEach(g => this.groupMap.set(g.id, g))
 		},
 		},
 		addGroup(group) {
 		addGroup(group) {
-			if (this.groups.some((g) => g.id == group.id)) {
-				this.updateGroup(group);
-			} else {
-				this.groups.unshift(group);
-			}
+			this.groupMap.set(group.id, group);
 		},
 		},
 		removeGroup(id) {
 		removeGroup(id) {
-			this.groups.filter(g => g.id == id).forEach(g => g.quit = true);
+			this.groupMap.get(id).quit = true;
 		},
 		},
 		updateGroup(group) {
 		updateGroup(group) {
-			let g = this.findGroup(group.id);
-			Object.assign(g, group);
+			this.groupMap.set(group.id, group);
 		},
 		},
 		setDnd(id, isDnd) {
 		setDnd(id, isDnd) {
-			let group = this.findGroup(id);
-			group.isDnd = isDnd;
+			this.groupMap.get(id).isDnd = isDnd;
 		},
 		},
 		clear() {
 		clear() {
-			this.groups = [];
+			this.groupMap.clear();
 		},
 		},
 		loadGroup() {
 		loadGroup() {
 			return new Promise((resolve, reject) => {
 			return new Promise((resolve, reject) => {
@@ -47,8 +42,15 @@ export default defineStore('groupStore', {
 		}
 		}
 	},
 	},
 	getters: {
 	getters: {
+		groups: (state) => {
+			return Array.from(state.groupMap.values());
+		},
 		findGroup: (state) => (id) => {
 		findGroup: (state) => (id) => {
-			return state.groups.find((g) => g.id == id);
+			return state.groupMap.get(id);
+		},
+		isGroup: (state) => (id) => {
+			let group = state.findGroup(id);
+			return group && !group.quit
 		}
 		}
 	}
 	}
 })
 })