From 9f7a3d4970bb55d8c0ae69d04e3190ef40a1bad7 Mon Sep 17 00:00:00 2001
From: xsx <825657193@qq.com>
Date: Wed, 3 Apr 2024 16:01:21 +0800
Subject: [PATCH 1/8] =?UTF-8?q?fix:=20=E6=96=87=E6=A1=A3=E8=B7=AF=E5=BE=84?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
im-ui/src/view/Login.vue | 2 +-
.../components/chat-record/chat-record.vue | 21 ++++++++++++++++---
2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/im-ui/src/view/Login.vue b/im-ui/src/view/Login.vue
index f3d8b2f..c64b6d4 100644
--- a/im-ui/src/view/Login.vue
+++ b/im-ui/src/view/Login.vue
@@ -20,7 +20,7 @@
web端音视频功能优化:支持语音呼叫、会话中加入通话状态消息
uniapp端支持音视频通话,并与web端打通
uniapp端音视频源码通话源码暂未开源,需付费获取:
- uniapp端音视频通源码购买说明
+ uniapp端音视频通源码购买说明
diff --git a/im-uniapp/components/chat-record/chat-record.vue b/im-uniapp/components/chat-record/chat-record.vue
index 623333a..77de146 100644
--- a/im-uniapp/components/chat-record/chat-record.vue
+++ b/im-uniapp/components/chat-record/chat-record.vue
@@ -1,7 +1,10 @@
- {{recording?'正在录音':'长按 说话'}}
+ {{recording?'正在录音':'长按 说话'}}
@@ -13,7 +16,7 @@
{{recordTip}}
-
+
@@ -40,7 +43,19 @@
const moveY = e.touches[0].clientY;
this.moveToCancel = moveY < this.recordBarTop-40;
},
+ onCancel(){
+ if(this.recording){
+ this.moveToCancel = true;
+ this.onEndRecord();
+ }
+ },
onStartRecord() {
+ /* 用户第一次使用语音会唤醒录音权限请求,此时会导致@touchend失效,
+ 一直处于录音状态,这里允许用户再次点击发送语音并结束录音 */
+ if(this.recording){
+ this.onEndRecord();
+ return;
+ }
console.log("开始录音")
this.moveToCancel = false;
this.initRecordBar();
From 943efae7a0cc66bdb488ff76954f4eebcef54d20 Mon Sep 17 00:00:00 2001
From: xsx <825657193@qq.com>
Date: Fri, 12 Apr 2024 18:39:59 +0800
Subject: [PATCH 2/8] =?UTF-8?q?fix:=20=E5=9B=BE=E7=89=87=E5=87=BA=E7=8E=B0?=
=?UTF-8?q?=E5=9C=A8=E5=A4=B4=E9=83=A8=E7=9A=84bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
im-ui/src/store/chatStore.js | 7 ++-----
im-uniapp/store/chatStore.js | 13 ++++++++-----
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/im-ui/src/store/chatStore.js b/im-ui/src/store/chatStore.js
index 0e626fa..9a240be 100644
--- a/im-ui/src/store/chatStore.js
+++ b/im-ui/src/store/chatStore.js
@@ -176,9 +176,8 @@ export default {
}
// 根据id顺序插入,防止消息乱序
let insertPos = chat.messages.length;
-
- if(msgInfo.id>0){
- //防止 图片、文件 在发送方 显示 在顶端 因为还没存库,id=0
+ // 防止 图片、文件 在发送方 显示 在顶端 因为还没存库,id=0
+ if(msgInfo.id && msgInfo.id > 0){
for (let idx in chat.messages) {
if (chat.messages[idx].id && msgInfo.id < chat.messages[idx].id) {
insertPos = idx;
@@ -187,8 +186,6 @@ export default {
}
}
}
-
-
chat.messages.splice(insertPos, 0, msgInfo);
this.commit("saveToStorage");
},
diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js
index 005ec61..0d9ba68 100644
--- a/im-uniapp/store/chatStore.js
+++ b/im-uniapp/store/chatStore.js
@@ -178,11 +178,14 @@ export default {
}
// 根据id顺序插入,防止消息乱序
let insertPos = chat.messages.length;
- for (let idx in chat.messages) {
- if (chat.messages[idx].id && msgInfo.id < chat.messages[idx].id) {
- insertPos = idx;
- console.log(`消息出现乱序,位置:${chat.messages.length},修正至:${insertPos}`);
- break;
+ // 防止 图片、文件 在发送方 显示 在顶端 因为还没存库,id=0
+ if(msgInfo.id && msgInfo.id > 0){
+ for (let idx in chat.messages) {
+ if (chat.messages[idx].id && msgInfo.id < chat.messages[idx].id) {
+ insertPos = idx;
+ console.log(`消息出现乱序,位置:${chat.messages.length},修正至:${insertPos}`);
+ break;
+ }
}
}
chat.messages.splice(insertPos, 0, msgInfo);
From aac6eb0d1cd48b76544cc13593d55aee458ddab5 Mon Sep 17 00:00:00 2001
From: xsx <825657193@qq.com>
Date: Mon, 15 Apr 2024 23:48:05 +0800
Subject: [PATCH 3/8] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20uniapp=E6=8B=89?=
=?UTF-8?q?=E5=8F=96=E8=BF=87=E5=A4=9A=E7=A6=BB=E7=BA=BF=E6=B6=88=E6=81=AF?=
=?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=8D=A1=E9=A1=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
im-ui/src/store/chatStore.js | 7 +-
.../chat-message-item/chat-message-item.vue | 21 +-
im-uniapp/components/pop-menu/pop-menu.vue | 4 +-
im-uniapp/pages/chat/chat-box.vue | 24 +-
im-uniapp/store/chatStore.js | 205 +++++++++---------
5 files changed, 144 insertions(+), 117 deletions(-)
diff --git a/im-ui/src/store/chatStore.js b/im-ui/src/store/chatStore.js
index 9a240be..90e62e6 100644
--- a/im-ui/src/store/chatStore.js
+++ b/im-ui/src/store/chatStore.js
@@ -186,7 +186,12 @@ export default {
}
}
}
- chat.messages.splice(insertPos, 0, msgInfo);
+ if(insertPos == chat.messages.length){
+ // 这种赋值效率最高
+ chat.messages[insertPos]= msgInfo;
+ }else{
+ chat.messages.splice(insertPos, 0, msgInfo);
+ }
this.commit("saveToStorage");
},
updateMessage(state, msgInfo) {
diff --git a/im-uniapp/components/chat-message-item/chat-message-item.vue b/im-uniapp/components/chat-message-item/chat-message-item.vue
index 43dc856..a77b5ab 100644
--- a/im-uniapp/components/chat-message-item/chat-message-item.vue
+++ b/im-uniapp/components/chat-message-item/chat-message-item.vue
@@ -11,16 +11,17 @@
:class="{'chat-msg-mine':msgInfo.selfSend}">
-
+
{{showName}}
-
+
+ :nodes="$emo.transform(msgInfo.content)"
+ @longpress="onShowMenu($event)">
-
+
@@ -30,7 +31,7 @@
class="send-fail iconfont icon-warning-circle-fill">
-
+
@@ -43,13 +44,14 @@
class="send-fail iconfont icon-warning-circle-fill">
+ @click="onPlayAudio()" @longpress="onShowMenu($event)">
{{JSON.parse(msgInfo.content).duration+'"'}}
-
+
{{msgInfo.content}}
@@ -68,7 +70,7 @@
-
@@ -129,6 +131,9 @@
}
})
},
+ onHideMenu(){
+ this.menu.show = false;
+ },
onSendFail() {
uni.showToast({
title: "该文件已发送失败,目前不支持自动重新发送,建议手动重新发送",
diff --git a/im-uniapp/components/pop-menu/pop-menu.vue b/im-uniapp/components/pop-menu/pop-menu.vue
index 8f08c1e..6c18861 100644
--- a/im-uniapp/components/pop-menu/pop-menu.vue
+++ b/im-uniapp/components/pop-menu/pop-menu.vue
@@ -1,11 +1,10 @@
-
@@ -29,6 +28,7 @@
this.$emit("select", item);
},
onClose() {
+ console.log("@touchmove")
this.$emit("close");
}
}
diff --git a/im-uniapp/pages/chat/chat-box.vue b/im-uniapp/pages/chat/chat-box.vue
index ffd421b..a7a2bd5 100644
--- a/im-uniapp/pages/chat/chat-box.vue
+++ b/im-uniapp/pages/chat/chat-box.vue
@@ -6,8 +6,9 @@
-
+
10 ? this.showMinIdx - 10 : 0;
+ // 多展示0条信息
+ this.showMinIdx = this.showMinIdx > 20 ? this.showMinIdx - 20 : 0;
},
onShowMore() {
if (this.chat.type == "GROUP") {
@@ -649,9 +657,9 @@
onLoad(options) {
// 聊天数据
this.chat = this.$store.state.chatStore.chats[options.chatIdx];
- // 初始状态只显示30条消息
+ // 初始状态只显示20条消息
let size = this.chat.messages.length;
- this.showMinIdx = size > 30 ? size - 30 : 0;
+ this.showMinIdx = size > 20 ? size - 20 : 0;
// 激活当前会话
this.$store.commit("activeChat", options.chatIdx);
// 消息已读
diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js
index 0d9ba68..b8f610f 100644
--- a/im-uniapp/store/chatStore.js
+++ b/im-uniapp/store/chatStore.js
@@ -1,10 +1,14 @@
-import { MESSAGE_TYPE, MESSAGE_STATUS } from '@/common/enums.js';
+import {
+ MESSAGE_TYPE,
+ MESSAGE_STATUS
+} from '@/common/enums.js';
import userStore from './userStore';
export default {
state: {
activeIndex: -1,
chats: [],
+ copyChats: [],
privateMsgMaxId: 0,
groupMsgMaxId: 0,
loadingPrivateMsg: false,
@@ -13,9 +17,9 @@ export default {
mutations: {
initChats(state, chatsData) {
- state.chats = chatsData.chats ||[];
- state.privateMsgMaxId = chatsData.privateMsgMaxId||0;
- state.groupMsgMaxId = chatsData.groupMsgMaxId||0;
+ state.chats = chatsData.chats || [];
+ state.privateMsgMaxId = chatsData.privateMsgMaxId || 0;
+ state.groupMsgMaxId = chatsData.groupMsgMaxId || 0;
// 防止图片一直处在加载中状态
state.chats.forEach((chat) => {
chat.messages.forEach((msg) => {
@@ -24,15 +28,18 @@ export default {
}
})
})
+ // 拷贝一份,用于缓存离线消息
+ state.copyChats = JSON.parse(JSON.stringify(state.chats))
},
openChat(state, chatInfo) {
+ let chats = this.getters.findChats();
let chat = null;
- for (let idx in state.chats) {
- if (state.chats[idx].type == chatInfo.type &&
- state.chats[idx].targetId === chatInfo.targetId) {
- chat = state.chats[idx];
+ for (let idx in chats) {
+ if (chats[idx].type == chatInfo.type &&
+ chats[idx].targetId === chatInfo.targetId) {
+ chat = chats[idx];
// 放置头部
- this.commit("moveTop",idx)
+ this.commit("moveTop", idx)
break;
}
}
@@ -50,38 +57,40 @@ export default {
atMe: false,
atAll: false
};
- state.chats.unshift(chat);
+ chats.unshift(chat);
}
this.commit("saveToStorage");
},
activeChat(state, idx) {
+ let chats = this.getters.findChats();
state.activeIndex = idx;
if (idx >= 0) {
- state.chats[idx].unreadCount = 0;
+ chats[idx].unreadCount = 0;
}
},
resetUnreadCount(state, chatInfo) {
- for (let idx in state.chats) {
- if (state.chats[idx].type == chatInfo.type &&
- state.chats[idx].targetId == chatInfo.targetId) {
- state.chats[idx].unreadCount = 0;
- state.chats[idx].atMe = false;
- state.chats[idx].atAll = false;
+ let chats = this.getters.findChats();
+ for (let idx in chats) {
+ if (chats[idx].type == chatInfo.type &&
+ chats[idx].targetId == chatInfo.targetId) {
+ chats[idx].unreadCount = 0;
+ chats[idx].atMe = false;
+ chats[idx].atAll = false;
}
}
this.commit("saveToStorage");
},
readedMessage(state, pos) {
- for (let idx in state.chats) {
- if (state.chats[idx].type == 'PRIVATE' &&
- state.chats[idx].targetId == pos.friendId) {
- state.chats[idx].messages.forEach((m) => {
+ let chats = this.getters.findChats();
+ for (let idx in chats) {
+ if (chats[idx].type == 'PRIVATE' &&
+ chats[idx].targetId == pos.friendId) {
+ chats[idx].messages.forEach((m) => {
if (m.selfSend && m.status != MESSAGE_STATUS.RECALL) {
// pos.maxId为空表示整个会话已读
- if(!pos.maxId || m.id <= pos.maxId){
+ if (!pos.maxId || m.id <= pos.maxId) {
m.status = MESSAGE_STATUS.READED
}
-
}
})
}
@@ -89,26 +98,25 @@ export default {
this.commit("saveToStorage");
},
removeChat(state, idx) {
- state.chats.splice(idx, 1);
+ let chats = this.getters.findChats();
+ chats.splice(idx, 1);
this.commit("saveToStorage");
},
removePrivateChat(state, userId) {
- for (let idx in state.chats) {
- if (state.chats[idx].type == 'PRIVATE' &&
- state.chats[idx].targetId == userId) {
+ let chats = this.getters.findChats();
+ for (let idx in chats) {
+ if (chats[idx].type == 'PRIVATE' &&
+ chats[idx].targetId == userId) {
this.commit("removeChat", idx);
}
}
},
moveTop(state, idx) {
- // 加载中不移动,很耗性能
- if(state.loadingPrivateMsg || state.loadingGroupMsg){
- return ;
- }
+ let chats = this.getters.findChats();
if (idx > 0) {
- let chat = state.chats[idx];
- state.chats.splice(idx, 1);
- state.chats.unshift(chat);
+ let chat = chats[idx];
+ chats.splice(idx, 1);
+ chats.unshift(chat);
this.commit("saveToStorage");
}
},
@@ -125,46 +133,45 @@ export default {
// 如果是已存在消息,则覆盖旧的消息数据
let chat = this.getters.findChat(msgInfo);
let message = this.getters.findMessage(chat, msgInfo);
- if(message){
+ if (message) {
Object.assign(message, msgInfo);
// 撤回消息需要显示
- if(msgInfo.type == MESSAGE_TYPE.RECALL){
+ if (msgInfo.type == MESSAGE_TYPE.RECALL) {
chat.lastContent = msgInfo.content;
}
this.commit("saveToStorage");
return;
}
// 会话列表内容
- if(!state.loadingPrivateMsg && !state.loadingGroupMsg){
- if (msgInfo.type == MESSAGE_TYPE.IMAGE) {
- chat.lastContent = "[图片]";
- } else if (msgInfo.type == MESSAGE_TYPE.FILE) {
- chat.lastContent = "[文件]";
- } else if (msgInfo.type == MESSAGE_TYPE.AUDIO) {
- chat.lastContent = "[语音]";
- } else if (msgInfo.type == MESSAGE_TYPE.TEXT || msgInfo.type == MESSAGE_TYPE.RECALL) {
- chat.lastContent = msgInfo.content;
- } else if (msgInfo.type == MESSAGE_TYPE.RT_VOICE) {
- chat.lastContent = "[语音通话]";
- } else if (msgInfo.type == MESSAGE_TYPE.RT_VIDEO) {
- chat.lastContent = "[视频通话]";
- }
- chat.lastSendTime = msgInfo.sendTime;
- chat.sendNickName = msgInfo.sendNickName;
+ if (msgInfo.type == MESSAGE_TYPE.IMAGE) {
+ chat.lastContent = "[图片]";
+ } else if (msgInfo.type == MESSAGE_TYPE.FILE) {
+ chat.lastContent = "[文件]";
+ } else if (msgInfo.type == MESSAGE_TYPE.AUDIO) {
+ chat.lastContent = "[语音]";
+ } else if (msgInfo.type == MESSAGE_TYPE.TEXT || msgInfo.type == MESSAGE_TYPE.RECALL) {
+ chat.lastContent = msgInfo.content;
+ } else if (msgInfo.type == MESSAGE_TYPE.RT_VOICE) {
+ chat.lastContent = "[语音通话]";
+ } else if (msgInfo.type == MESSAGE_TYPE.RT_VIDEO) {
+ chat.lastContent = "[视频通话]";
}
+ chat.lastSendTime = msgInfo.sendTime;
+ chat.sendNickName = msgInfo.sendNickName;
+
// 未读加1
- if (!msgInfo.selfSend && msgInfo.status != MESSAGE_STATUS.READED
- && msgInfo.type != MESSAGE_TYPE.TIP_TEXT) {
+ if (!msgInfo.selfSend && msgInfo.status != MESSAGE_STATUS.READED &&
+ msgInfo.type != MESSAGE_TYPE.TIP_TEXT) {
chat.unreadCount++;
}
// 是否有人@我
- if(!msgInfo.selfSend && chat.type=="GROUP" && msgInfo.atUserIds
- && msgInfo.status != MESSAGE_STATUS.READED){
+ if (!msgInfo.selfSend && chat.type == "GROUP" && msgInfo.atUserIds &&
+ msgInfo.status != MESSAGE_STATUS.READED) {
let userId = userStore.state.userInfo.id;
- if(msgInfo.atUserIds.indexOf(userId)>=0){
+ if (msgInfo.atUserIds.indexOf(userId) >= 0) {
chat.atMe = true;
}
- if(msgInfo.atUserIds.indexOf(-1)>=0){
+ if (msgInfo.atUserIds.indexOf(-1) >= 0) {
chat.atAll = true;
}
}
@@ -179,7 +186,7 @@ export default {
// 根据id顺序插入,防止消息乱序
let insertPos = chat.messages.length;
// 防止 图片、文件 在发送方 显示 在顶端 因为还没存库,id=0
- if(msgInfo.id && msgInfo.id > 0){
+ if (msgInfo.id && msgInfo.id > 0 ) {
for (let idx in chat.messages) {
if (chat.messages[idx].id && msgInfo.id < chat.messages[idx].id) {
insertPos = idx;
@@ -188,14 +195,19 @@ export default {
}
}
}
- chat.messages.splice(insertPos, 0, msgInfo);
+ if(insertPos == chat.messages.length){
+ // 这种赋值效率最高
+ chat.messages[insertPos]= msgInfo;
+ }else{
+ chat.messages.splice(insertPos, 0, msgInfo);
+ }
this.commit("saveToStorage");
},
updateMessage(state, msgInfo) {
// 获取对方id或群id
let chat = this.getters.findChat(msgInfo);
let message = this.getters.findMessage(chat, msgInfo);
- if(message){
+ if (message) {
// 属性拷贝
Object.assign(message, msgInfo);
this.commit("saveToStorage");
@@ -220,8 +232,9 @@ export default {
this.commit("saveToStorage");
},
updateChatFromFriend(state, friend) {
- for (let i in state.chats) {
- let chat = state.chats[i];
+ let chats = this.getters.findChats();
+ for (let i in chats) {
+ let chat = chats[i];
if (chat.type == 'PRIVATE' && chat.targetId == friend.id) {
chat.headImage = friend.headImageThumb;
chat.showName = friend.nickName;
@@ -231,8 +244,9 @@ export default {
this.commit("saveToStorage");
},
updateChatFromGroup(state, group) {
- for (let i in state.chats) {
- let chat = state.chats[i];
+ let chats = this.getters.findChats();
+ for (let i in chats) {
+ let chat = chats[i];
if (chat.type == 'GROUP' && chat.targetId == group.id) {
chat.headImage = group.headImageThumb;
chat.showName = group.remark;
@@ -243,40 +257,26 @@ export default {
},
loadingPrivateMsg(state, loadding) {
state.loadingPrivateMsg = loadding;
- if(!state.loadingPrivateMsg && !state.loadingGroupMsg){
+ if (!state.loadingPrivateMsg && !state.loadingGroupMsg) {
this.commit("refreshChats")
}
},
loadingGroupMsg(state, loadding) {
state.loadingGroupMsg = loadding;
- if(!state.loadingPrivateMsg && !state.loadingGroupMsg){
+ if (!state.loadingPrivateMsg && !state.loadingGroupMsg) {
this.commit("refreshChats")
}
},
- refreshChats(state){
- state.chats.forEach((chat)=>{
- if(chat.messages.length>0){
- let msgInfo = chat.messages[chat.messages.length-1];
- if (msgInfo.type == MESSAGE_TYPE.IMAGE) {
- chat.lastContent = "[图片]";
- } else if (msgInfo.type == MESSAGE_TYPE.FILE) {
- chat.lastContent = "[文件]";
- } else if (msgInfo.type == MESSAGE_TYPE.AUDIO) {
- chat.lastContent = "[语音]";
- } else if (msgInfo.type == MESSAGE_TYPE.TEXT || msgInfo.type == MESSAGE_TYPE.RECALL) {
- chat.lastContent = msgInfo.content;
- }
- chat.lastSendTime = msgInfo.sendTime;
- }else{
- chat.lastContent = "";
- chat.lastSendTime = new Date().getTime()
- }
- })
- state.chats.sort((chat1, chat2) => {
- return chat2.lastSendTime-chat1.lastSendTime;
- });
+ refreshChats(state) {
+ // 将离线消息一次性装载回来
+ state.chats = JSON.parse(JSON.stringify(state.copyChats))
+ this.commit("saveToStorage");
},
saveToStorage(state) {
+ // 加载中不保存,防止卡顿
+ if(state.loadingPrivateMsg || state.loadingGroupMsg){
+ return;
+ }
let userId = userStore.state.userInfo.id;
let key = "chats-" + userId;
let chatsData = {
@@ -291,6 +291,7 @@ export default {
},
clear(state) {
state.chats = [];
+ state.copyChats = [];
state.activeIndex = -1;
state.privateMsgMaxId = 0;
state.groupMsgMaxId = 0;
@@ -316,24 +317,32 @@ export default {
}
},
getters: {
- findChatIdx: (state) => (chat) => {
- for (let idx in state.chats) {
- if (state.chats[idx].type == chat.type &&
- state.chats[idx].targetId === chat.targetId) {
+ findChats: (state) => () => {
+ /* uniapp渲染消息性能非常拉胯,所以这里先把离线消息存储到state.copyChats,
+ 等待所有离线消息拉取完成后,再统一进行渲染 */
+ let isLoading = state.loadingPrivateMsg || state.loadingGroupMsg;
+ return isLoading ? state.copyChats : state.chats;
+ },
+ findChatIdx: (state, getters) => (chat) => {
+ let chats = getters.findChats();
+ for (let idx in chats) {
+ if (chats[idx].type == chat.type &&
+ chats[idx].targetId === chat.targetId) {
chat = state.chats[idx];
return idx;
}
}
},
- findChat: (state) => (msgInfo) => {
+ findChat: (state, getters) => (msgInfo) => {
+ let chats = getters.findChats();
// 获取对方id或群id
let type = msgInfo.groupId ? 'GROUP' : 'PRIVATE';
let targetId = msgInfo.groupId ? msgInfo.groupId : msgInfo.selfSend ? msgInfo.recvId : msgInfo.sendId;
let chat = null;
- for (let idx in state.chats) {
- if (state.chats[idx].type == type &&
- state.chats[idx].targetId === targetId) {
- chat = state.chats[idx];
+ for (let idx in chats) {
+ if (chats[idx].type == type &&
+ chats[idx].targetId === targetId) {
+ chat = chats[idx];
break;
}
}
From 10d98af6e3510963f6fb76a79500c24e93b986ab Mon Sep 17 00:00:00 2001
From: xsx <825657193@qq.com>
Date: Wed, 17 Apr 2024 00:38:51 +0800
Subject: [PATCH 4/8] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20uniapp=E6=8B=89?=
=?UTF-8?q?=E5=8F=96=E8=BF=87=E5=A4=9A=E7=A6=BB=E7=BA=BF=E6=B6=88=E6=81=AF?=
=?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=8D=A1=E9=A1=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/head-image/head-image.vue | 4 +-
im-uniapp/pages/chat/chat.vue | 46 +++++++++------
im-uniapp/store/chatStore.js | 56 ++++++++++++-------
3 files changed, 67 insertions(+), 39 deletions(-)
diff --git a/im-uniapp/components/head-image/head-image.vue b/im-uniapp/components/head-image/head-image.vue
index cdb3248..4055656 100644
--- a/im-uniapp/components/head-image/head-image.vue
+++ b/im-uniapp/components/head-image/head-image.vue
@@ -83,9 +83,7 @@
.avatar-text {
background-color: #f2f2f2;
- /* 默认背景色 */
- border-radius: 50%;
- /* 圆角效果 */
+ border-radius: 10%;
display: flex;
align-items: center;
justify-content: center;
diff --git a/im-uniapp/pages/chat/chat.vue b/im-uniapp/pages/chat/chat.vue
index 0cbed13..f65d9d1 100644
--- a/im-uniapp/pages/chat/chat.vue
+++ b/im-uniapp/pages/chat/chat.vue
@@ -1,8 +1,8 @@
-
-
+
+
消息接收中...
@@ -129,21 +129,33 @@
\ No newline at end of file
diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js
index b8f610f..e14dae6 100644
--- a/im-uniapp/store/chatStore.js
+++ b/im-uniapp/store/chatStore.js
@@ -4,11 +4,14 @@ import {
} from '@/common/enums.js';
import userStore from './userStore';
+/* uniapp渲染消息性能非常拉胯,所以这里先把离线消息存储到cacheChats,
+ 等待所有离线消息拉取完成后,再统一进行渲染 */
+let cacheChats = [];
+
export default {
state: {
activeIndex: -1,
chats: [],
- copyChats: [],
privateMsgMaxId: 0,
groupMsgMaxId: 0,
loadingPrivateMsg: false,
@@ -17,19 +20,26 @@ export default {
mutations: {
initChats(state, chatsData) {
- state.chats = chatsData.chats || [];
+ // 暂存至缓冲区
+ cacheChats = JSON.parse(JSON.stringify(chatsData.chats))
+ // 只取前10条数据做做样子,一切都为了加快初始化时间
+ let size = Math.min(chatsData.chats.length,10);
+ for (let i = 0; i < size; i++) {
+ let chat = chatsData.chats[i];
+ chat.messages = [];
+ state.chats[i] = chat;
+ }
state.privateMsgMaxId = chatsData.privateMsgMaxId || 0;
state.groupMsgMaxId = chatsData.groupMsgMaxId || 0;
// 防止图片一直处在加载中状态
- state.chats.forEach((chat) => {
+ cacheChats.forEach((chat) => {
chat.messages.forEach((msg) => {
if (msg.loadStatus == "loading") {
msg.loadStatus = "fail"
}
})
})
- // 拷贝一份,用于缓存离线消息
- state.copyChats = JSON.parse(JSON.stringify(state.chats))
+
},
openChat(state, chatInfo) {
let chats = this.getters.findChats();
@@ -112,6 +122,10 @@ export default {
}
},
moveTop(state, idx) {
+ // 加载中不移动,防止卡顿
+ if (this.getters.isLoading()) {
+ return;
+ }
let chats = this.getters.findChats();
if (idx > 0) {
let chat = chats[idx];
@@ -158,7 +172,7 @@ export default {
}
chat.lastSendTime = msgInfo.sendTime;
chat.sendNickName = msgInfo.sendNickName;
-
+
// 未读加1
if (!msgInfo.selfSend && msgInfo.status != MESSAGE_STATUS.READED &&
msgInfo.type != MESSAGE_TYPE.TIP_TEXT) {
@@ -186,7 +200,7 @@ export default {
// 根据id顺序插入,防止消息乱序
let insertPos = chat.messages.length;
// 防止 图片、文件 在发送方 显示 在顶端 因为还没存库,id=0
- if (msgInfo.id && msgInfo.id > 0 ) {
+ if (msgInfo.id && msgInfo.id > 0) {
for (let idx in chat.messages) {
if (chat.messages[idx].id && msgInfo.id < chat.messages[idx].id) {
insertPos = idx;
@@ -195,10 +209,10 @@ export default {
}
}
}
- if(insertPos == chat.messages.length){
+ if (insertPos == chat.messages.length) {
// 这种赋值效率最高
- chat.messages[insertPos]= msgInfo;
- }else{
+ chat.messages[insertPos] = msgInfo;
+ } else {
chat.messages.splice(insertPos, 0, msgInfo);
}
this.commit("saveToStorage");
@@ -268,13 +282,18 @@ export default {
}
},
refreshChats(state) {
- // 将离线消息一次性装载回来
- state.chats = JSON.parse(JSON.stringify(state.copyChats))
+
+ // 排序
+ cacheChats.sort((chat1, chat2) => {
+ return chat2.lastSendTime - chat1.lastSendTime;
+ });
+ // 将消息一次性装载回来,只显示前30个会话,多了卡的不行
+ state.chats = JSON.parse(JSON.stringify(cacheChats.slice(0,30)))
this.commit("saveToStorage");
},
saveToStorage(state) {
// 加载中不保存,防止卡顿
- if(state.loadingPrivateMsg || state.loadingGroupMsg){
+ if (this.getters.isLoading()) {
return;
}
let userId = userStore.state.userInfo.id;
@@ -291,7 +310,6 @@ export default {
},
clear(state) {
state.chats = [];
- state.copyChats = [];
state.activeIndex = -1;
state.privateMsgMaxId = 0;
state.groupMsgMaxId = 0;
@@ -317,11 +335,11 @@ export default {
}
},
getters: {
- findChats: (state) => () => {
- /* uniapp渲染消息性能非常拉胯,所以这里先把离线消息存储到state.copyChats,
- 等待所有离线消息拉取完成后,再统一进行渲染 */
- let isLoading = state.loadingPrivateMsg || state.loadingGroupMsg;
- return isLoading ? state.copyChats : state.chats;
+ isLoading: (state) => () => {
+ return state.loadingPrivateMsg || state.loadingGroupMsg
+ },
+ findChats: (state, getters) => () => {
+ return getters.isLoading() ? cacheChats : state.chats;
},
findChatIdx: (state, getters) => (chat) => {
let chats = getters.findChats();
From 267e790188c86d70514c5650c9f68770199265d4 Mon Sep 17 00:00:00 2001
From: blue <825657193@qq.com>
Date: Sat, 20 Apr 2024 15:26:54 +0800
Subject: [PATCH 5/8] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20uniapp=E4=BC=9A?=
=?UTF-8?q?=E8=AF=9D=E7=BD=AE=E9=A1=B6=E3=80=81=E5=88=A0=E9=99=A4=E4=BC=9A?=
=?UTF-8?q?=E8=AF=9D=E3=80=81=E5=A5=BD=E5=8F=8B=E7=8A=B6=E6=80=81=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E5=AF=BC=E8=87=B4=E5=8D=A1=E9=A1=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/GroupMessageController.java | 2 +-
.../controller/PrivateMessageController.java | 2 +-
.../impl/PrivateMessageServiceImpl.java | 3 +-
.../implatform/util/SensitiveFilterUtil.java | 9 +--
im-ui/src/store/chatStore.js | 7 +-
im-uniapp/App.vue | 4 +-
im-uniapp/components/chat-item/chat-item.vue | 24 ++++--
.../chat-message-item/chat-message-item.vue | 8 +-
im-uniapp/components/pop-menu/pop-menu.vue | 1 -
.../components/user-search/user-search.vue | 2 +-
im-uniapp/package.json | 3 +-
im-uniapp/pages/chat/chat-box.vue | 15 ++--
im-uniapp/pages/chat/chat.vue | 42 ++++++++--
im-uniapp/pages/common/user-info.vue | 5 +-
im-uniapp/pages/friend/friend-add.vue | 2 +-
im-uniapp/pages/friend/friend-search.vue | 5 +-
im-uniapp/pages/friend/friend.vue | 17 +++-
im-uniapp/pages/group/group-info.vue | 3 +-
im-uniapp/pages/group/group-invite.vue | 3 +
im-uniapp/store/chatStore.js | 77 ++++++++++---------
im-uniapp/store/friendStore.js | 55 ++++++-------
21 files changed, 168 insertions(+), 121 deletions(-)
diff --git a/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java b/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java
index b7e7e94..9a0f959 100644
--- a/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java
+++ b/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java
@@ -37,7 +37,7 @@ public class GroupMessageController {
@GetMapping("/loadMessage")
- @ApiOperation(value = "拉取消息", notes = "拉取消息,一次最多拉取100条")
+ @ApiOperation(value = "拉取消息(已废弃)", notes = "拉取消息,一次最多拉取100条")
public Result> loadMessage(@RequestParam Long minId) {
return ResultUtils.success(groupMessageService.loadMessage(minId));
}
diff --git a/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java b/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java
index 8c30239..758c86f 100644
--- a/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java
+++ b/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java
@@ -38,7 +38,7 @@ public class PrivateMessageController {
@GetMapping("/loadMessage")
- @ApiOperation(value = "拉取消息", notes = "拉取消息,一次最多拉取100条")
+ @ApiOperation(value = "拉取消息(已废弃)", notes = "拉取消息,一次最多拉取100条")
public Result> loadMessage(@RequestParam Long minId) {
return ResultUtils.success(privateMessageService.loadMessage(minId));
}
diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java
index 0d9c2e3..45f2126 100644
--- a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java
+++ b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java
@@ -237,8 +237,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl sendMessage = new IMPrivateMessage<>();
sendMessage.setData(msgInfo);
sendMessage.setSender(new IMUserInfo(session.getUserId(), session.getTerminal()));
- sendMessage.setRecvId(session.getUserId());
- sendMessage.setSendToSelf(false);
+ sendMessage.setSendToSelf(true);
sendMessage.setSendResult(false);
imClient.sendPrivateMessage(sendMessage);
// 推送回执消息给对方,更新已读状态
diff --git a/im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java b/im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java
index 78158c2..bad68c1 100644
--- a/im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java
+++ b/im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java
@@ -79,11 +79,10 @@ public final class SensitiveFilterUtil {
*/
@PostConstruct
public void init() {
- try (
- // 类加载器
- InputStream is = this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt");
- BufferedReader reader = new BufferedReader(new InputStreamReader(is));
- ) {
+ try {
+ // 类加载器
+ InputStream is = this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt");
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String keyword;
while ((keyword = reader.readLine()) != null) {
// 添加到前缀树
diff --git a/im-ui/src/store/chatStore.js b/im-ui/src/store/chatStore.js
index 90e62e6..9a240be 100644
--- a/im-ui/src/store/chatStore.js
+++ b/im-ui/src/store/chatStore.js
@@ -186,12 +186,7 @@ export default {
}
}
}
- if(insertPos == chat.messages.length){
- // 这种赋值效率最高
- chat.messages[insertPos]= msgInfo;
- }else{
- chat.messages.splice(insertPos, 0, msgInfo);
- }
+ chat.messages.splice(insertPos, 0, msgInfo);
this.commit("saveToStorage");
},
updateMessage(state, msgInfo) {
diff --git a/im-uniapp/App.vue b/im-uniapp/App.vue
index 5a3a7fe..06e58a0 100644
--- a/im-uniapp/App.vue
+++ b/im-uniapp/App.vue
@@ -63,12 +63,14 @@
})
},
pullPrivateOfflineMessage(minId) {
+ store.commit("loadingPrivateMsg",true)
http({
url: "/message/private/pullOfflineMessage?minId=" + minId,
method: 'get'
});
},
pullGroupOfflineMessage(minId) {
+ store.commit("loadingGroupMsg",true)
http({
url: "/message/group/pullOfflineMessage?minId=" + minId,
method: 'get'
@@ -195,7 +197,7 @@
},
loadFriendInfo(id) {
return new Promise((resolve, reject) => {
- let friend = store.state.friendStore.friends.find((f) => f.id == id);
+ let friend = store.getters.findFriend(id);
if (friend) {
resolve(friend);
} else {
diff --git a/im-uniapp/components/chat-item/chat-item.vue b/im-uniapp/components/chat-item/chat-item.vue
index 8b8e2f5..aade43c 100644
--- a/im-uniapp/components/chat-item/chat-item.vue
+++ b/im-uniapp/components/chat-item/chat-item.vue
@@ -1,5 +1,5 @@
-
+
{{chat.unreadCount}}
@@ -30,6 +30,10 @@
},
index: {
type: Number
+ },
+ active: {
+ type: Boolean,
+ default: false
}
},
methods: {
@@ -62,11 +66,15 @@
padding-left: 20rpx;
align-items: center;
background-color: white;
- white-space: nowrap;
+ white-space: nowrap;
&:hover {
background-color: #eeeeee;
}
+
+ &.active {
+ background-color: #eeeeee;
+ }
.left {
position: relative;
@@ -100,8 +108,8 @@
.chat-name {
display: flex;
- line-height: 50rpx;
- height: 50rpx;
+ line-height: 44rpx;
+ height: 44rpx;
.chat-name-text {
flex: 1;
@@ -122,11 +130,12 @@
.chat-content {
display: flex;
- line-height: 44rpx;
+ line-height: 60rpx;
+ height: 60rpx;
.chat-at-text {
color: #c70b0b;
font-size: 24rpx;
- }
+ }
.chat-send-name {
font-size: 26rpx;
@@ -137,8 +146,7 @@
font-size: 28rpx;
white-space: nowrap;
overflow: hidden;
- line-height: 50rpx;
- text-overflow: ellipsis;
+ text-overflow: ellipsis;
}
}
}
diff --git a/im-uniapp/components/chat-message-item/chat-message-item.vue b/im-uniapp/components/chat-message-item/chat-message-item.vue
index a77b5ab..7fc701e 100644
--- a/im-uniapp/components/chat-message-item/chat-message-item.vue
+++ b/im-uniapp/components/chat-message-item/chat-message-item.vue
@@ -17,9 +17,11 @@
-
+
+
+
f.id == userId);
- return friend != undefined;
+ return friend&&!friend.delete;
}
}
}
diff --git a/im-uniapp/package.json b/im-uniapp/package.json
index 680d46c..b1f64ef 100644
--- a/im-uniapp/package.json
+++ b/im-uniapp/package.json
@@ -4,7 +4,6 @@
"scripts": {}
},
"dependencies": {
- "js-audio-recorder": "^1.0.7",
- "recorder-core": "^1.3.23122400"
+ "js-audio-recorder": "^1.0.7"
}
}
diff --git a/im-uniapp/pages/chat/chat-box.vue b/im-uniapp/pages/chat/chat-box.vue
index a7a2bd5..99e694a 100644
--- a/im-uniapp/pages/chat/chat-box.vue
+++ b/im-uniapp/pages/chat/chat-box.vue
@@ -10,7 +10,7 @@
upper-threshold="200" @scrolltoupper="onScrollToTop"
:scroll-into-view="'chat-item-'+scrollMsgIdx">
-
@@ -544,8 +544,14 @@
});
},
readedMessage() {
+ if(this.unreadCount == 0){
+
+ console.log("0000000000")
+ return;
+ }
+ let url = ""
if (this.chat.type == "GROUP") {
- var url = `/message/group/readed?groupId=${this.chat.targetId}`
+ url = `/message/group/readed?groupId=${this.chat.targetId}`
} else {
url = `/message/private/readed?friendId=${this.chat.targetId}`
}
@@ -565,7 +571,6 @@
this.group = group;
this.$store.commit("updateChatFromGroup", group);
this.$store.commit("updateGroup", group);
-
});
this.$http({
@@ -660,8 +665,6 @@
// 初始状态只显示20条消息
let size = this.chat.messages.length;
this.showMinIdx = size > 20 ? size - 20 : 0;
- // 激活当前会话
- this.$store.commit("activeChat", options.chatIdx);
// 消息已读
this.readedMessage()
// 加载好友或群聊信息
@@ -671,6 +674,8 @@
this.loadFriend(this.chat.targetId);
this.loadReaded(this.chat.targetId)
}
+ // 激活当前会话
+ this.$store.commit("activeChat", options.chatIdx);
// 复位回执消息
this.isReceipt = false;
},
diff --git a/im-uniapp/pages/chat/chat.vue b/im-uniapp/pages/chat/chat.vue
index f65d9d1..a00e079 100644
--- a/im-uniapp/pages/chat/chat.vue
+++ b/im-uniapp/pages/chat/chat.vue
@@ -10,12 +10,14 @@
温馨提示:您现在还没有任何聊天消息,快跟您的好友发起聊天吧~
-
-
+
+
-
@@ -30,12 +32,12 @@
chatIdx: -1,
items: [{
key: 'DELETE',
- name: '删除',
+ name: '删除该聊天',
icon: 'trash'
},
{
key: 'TOP',
- name: '置顶',
+ name: '置顶该聊天',
icon: 'arrow-up'
}
]
@@ -57,6 +59,7 @@
this.menu.show = false;
},
onShowMenu(e, chatIdx) {
+ this.menu.chatIdx = chatIdx;
uni.getSystemInfo({
success: (res) => {
let touches = e.touches[0];
@@ -81,6 +84,10 @@
}
})
},
+ onCloseMenu() {
+ this.menu.chatIdx = -1;
+ this.menu.show = false;
+ },
removeChat(chatIdx) {
this.$store.commit("removeChat", chatIdx);
},
@@ -103,13 +110,30 @@
}
},
computed: {
+ chatsPos() {
+ // 计算会话的顺序
+ let chatsPos = [];
+ let chats = this.chatStore.chats;
+ chats.forEach((chat, idx) => {
+ chatsPos.push({
+ idx: idx,
+ sendTime: chat.lastSendTime
+ })
+ })
+ chatsPos.sort((chatPos1, chatPos2) => {
+ return chatPos2.sendTime - chatPos1.sendTime;
+ });
+ return chatsPos;
+ },
chatStore() {
return this.$store.state.chatStore;
},
unreadCount() {
let count = 0;
this.chatStore.chats.forEach(chat => {
- count += chat.unreadCount;
+ if (!chat.delete) {
+ count += chat.unreadCount;
+ }
})
return count;
},
@@ -147,10 +171,16 @@
.chat-loading {
display: block;
+ width: 100%;
height: 100rpx;
background: white;
position: relative;
color: blue;
+
+ .loading-box {
+ position: relative;
+
+ }
}
.scroll-bar {
diff --git a/im-uniapp/pages/common/user-info.vue b/im-uniapp/pages/common/user-info.vue
index ee71979..2dbeea8 100644
--- a/im-uniapp/pages/common/user-info.vue
+++ b/im-uniapp/pages/common/user-info.vue
@@ -55,8 +55,9 @@
headImage: this.userInfo.headImage,
};
this.$store.commit("openChat", chat);
+ let chatIdx = this.$store.getters.findChatIdx(chat);
uni.navigateTo({
- url:"/pages/chat/chat-box?chatIdx=0"
+ url:"/pages/chat/chat-box?chatIdx=" + chatIdx
})
},
onAddFriend() {
@@ -130,7 +131,7 @@
},
computed: {
isFriend() {
- return this.friendInfo != undefined;
+ return this.friendInfo&&!this.friendInfo.delete;
},
friendInfo(){
let friends = this.$store.state.friendStore.friends;
diff --git a/im-uniapp/pages/friend/friend-add.vue b/im-uniapp/pages/friend/friend-add.vue
index 88c99e5..296c0a9 100644
--- a/im-uniapp/pages/friend/friend-add.vue
+++ b/im-uniapp/pages/friend/friend-add.vue
@@ -70,7 +70,7 @@
isFriend(userId) {
let friends = this.$store.state.friendStore.friends;
let friend = friends.find((f) => f.id == userId);
- return friend != undefined;
+ return friend&&!friend.delete;
}
}
}
diff --git a/im-uniapp/pages/friend/friend-search.vue b/im-uniapp/pages/friend/friend-search.vue
index 20aa91a..9e55379 100644
--- a/im-uniapp/pages/friend/friend-search.vue
+++ b/im-uniapp/pages/friend/friend-search.vue
@@ -5,8 +5,9 @@
-
-
+
+
diff --git a/im-uniapp/pages/friend/friend.vue b/im-uniapp/pages/friend/friend.vue
index 6c0bcb1..f1a167e 100644
--- a/im-uniapp/pages/friend/friend.vue
+++ b/im-uniapp/pages/friend/friend.vue
@@ -8,13 +8,18 @@
-
+
温馨提示:您现在还没有任何好友,快点击右上方'+'按钮添加好友吧~
-
-
+
+
+
+
+
+
+
@@ -40,8 +45,12 @@
url: "/pages/friend/friend-add"
})
}
+ },
+ computed:{
+ friends(){
+ return this.$store.state.friendStore.friends;
+ }
}
-
}
diff --git a/im-uniapp/pages/group/group-info.vue b/im-uniapp/pages/group/group-info.vue
index c91b160..60cff9b 100644
--- a/im-uniapp/pages/group/group-info.vue
+++ b/im-uniapp/pages/group/group-info.vue
@@ -86,8 +86,9 @@
headImage: this.group.headImage,
};
this.$store.commit("openChat", chat);
+ let chatIdx = this.$store.getters.findChatIdx(chat);
uni.navigateTo({
- url: "/pages/chat/chat-box?chatIdx=0"
+ url: "/pages/chat/chat-box?chatIdx=" + chatIdx
})
},
onQuitGroup() {
diff --git a/im-uniapp/pages/group/group-invite.vue b/im-uniapp/pages/group/group-invite.vue
index 93596d8..f1a6980 100644
--- a/im-uniapp/pages/group/group-invite.vue
+++ b/im-uniapp/pages/group/group-invite.vue
@@ -84,6 +84,9 @@
this.friendItems = [];
let friends = this.$store.state.friendStore.friends;
friends.forEach((f => {
+ if(f.delete){
+ return
+ }
let item = {
id: f.id,
headImage: f.headImage,
diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js
index e14dae6..b1cdfc9 100644
--- a/im-uniapp/store/chatStore.js
+++ b/im-uniapp/store/chatStore.js
@@ -3,14 +3,20 @@ import {
MESSAGE_STATUS
} from '@/common/enums.js';
import userStore from './userStore';
+/*
+ uniapp性能优化:
+ 1.由于uniapp渲染消息性能非常拉胯,所以先把离线消息存储到cacheChats,等
+ 待所有离线消息拉取完成后,再统一进行渲染
+ 2.在vuex中对数组进行unshift,splice特别卡,所以删除会话、会话置顶、删
+ 除消息等操作进行优化,不通过unshift,splice实现,改造方案如下:
+ 删除会话: 通过delete标志判断是否删除
+ 删除消息:通过delete标志判断是否删除
+ 会话置顶:通过lastSendTime排序确定会话顺序
+*/
-/* uniapp渲染消息性能非常拉胯,所以这里先把离线消息存储到cacheChats,
- 等待所有离线消息拉取完成后,再统一进行渲染 */
let cacheChats = [];
-
export default {
state: {
- activeIndex: -1,
chats: [],
privateMsgMaxId: 0,
groupMsgMaxId: 0,
@@ -20,14 +26,19 @@ export default {
mutations: {
initChats(state, chatsData) {
- // 暂存至缓冲区
- cacheChats = JSON.parse(JSON.stringify(chatsData.chats))
- // 只取前10条数据做做样子,一切都为了加快初始化时间
- let size = Math.min(chatsData.chats.length,10);
- for (let i = 0; i < size; i++) {
- let chat = chatsData.chats[i];
- chat.messages = [];
- state.chats[i] = chat;
+ cacheChats = [];
+ for (let chat of chatsData.chats) {
+ // 已删除的会话直接丢弃
+ if (chat.delete) {
+ continue;
+ }
+ // 暂存至缓冲区
+ cacheChats.push(JSON.parse(JSON.stringify(chat)));
+ // 加载期间显示只前15个会话做做样子,一切都为了加快初始化时间
+ if (state.chats.length < 15) {
+ chat.messages = [];
+ state.chats.push(chat);
+ }
}
state.privateMsgMaxId = chatsData.privateMsgMaxId || 0;
state.groupMsgMaxId = chatsData.groupMsgMaxId || 0;
@@ -48,6 +59,7 @@ export default {
if (chats[idx].type == chatInfo.type &&
chats[idx].targetId === chatInfo.targetId) {
chat = chats[idx];
+ chat.delete = false;
// 放置头部
this.commit("moveTop", idx)
break;
@@ -65,15 +77,15 @@ export default {
unreadCount: 0,
messages: [],
atMe: false,
- atAll: false
+ atAll: false,
+ delete: false
};
- chats.unshift(chat);
+ chats.push(chat);
+ this.commit("moveTop", chats.length - 1)
}
- this.commit("saveToStorage");
},
activeChat(state, idx) {
let chats = this.getters.findChats();
- state.activeIndex = idx;
if (idx >= 0) {
chats[idx].unreadCount = 0;
}
@@ -109,7 +121,7 @@ export default {
},
removeChat(state, idx) {
let chats = this.getters.findChats();
- chats.splice(idx, 1);
+ chats[idx].delete = true;
this.commit("saveToStorage");
},
removePrivateChat(state, userId) {
@@ -122,17 +134,11 @@ export default {
}
},
moveTop(state, idx) {
- // 加载中不移动,防止卡顿
- if (this.getters.isLoading()) {
- return;
- }
let chats = this.getters.findChats();
- if (idx > 0) {
- let chat = chats[idx];
- chats.splice(idx, 1);
- chats.unshift(chat);
- this.commit("saveToStorage");
- }
+ let chat = chats[idx];
+ // 最新的时间会显示在顶部
+ chat.lastSendTime = new Date().getTime();
+ this.commit("saveToStorage");
},
insertMessage(state, msgInfo) {
// 获取对方id或群id
@@ -233,13 +239,13 @@ export default {
for (let idx in chat.messages) {
// 已经发送成功的,根据id删除
if (chat.messages[idx].id && chat.messages[idx].id == msgInfo.id) {
- chat.messages.splice(idx, 1);
+ chat.messages[idx].delete = true;
break;
}
// 正在发送中的消息可能没有id,根据发送时间删除
if (msgInfo.selfSend && chat.messages[idx].selfSend &&
chat.messages[idx].sendTime == msgInfo.sendTime) {
- chat.messages.splice(idx, 1);
+ chat.messages[idx].delete = true;
break;
}
}
@@ -271,24 +277,23 @@ export default {
},
loadingPrivateMsg(state, loadding) {
state.loadingPrivateMsg = loadding;
- if (!state.loadingPrivateMsg && !state.loadingGroupMsg) {
+ if (!this.getters.isLoading()) {
this.commit("refreshChats")
}
},
loadingGroupMsg(state, loadding) {
state.loadingGroupMsg = loadding;
- if (!state.loadingPrivateMsg && !state.loadingGroupMsg) {
+ if (!this.getters.isLoading()) {
this.commit("refreshChats")
}
},
refreshChats(state) {
-
// 排序
cacheChats.sort((chat1, chat2) => {
return chat2.lastSendTime - chat1.lastSendTime;
});
- // 将消息一次性装载回来,只显示前30个会话,多了卡的不行
- state.chats = JSON.parse(JSON.stringify(cacheChats.slice(0,30)))
+ // 将消息一次性装载回来
+ state.chats = cacheChats;
this.commit("saveToStorage");
},
saveToStorage(state) {
@@ -305,12 +310,12 @@ export default {
}
uni.setStorage({
key: key,
- data: chatsData
+ data: chatsData ,
})
},
clear(state) {
+ cacheChats = [];
state.chats = [];
- state.activeIndex = -1;
state.privateMsgMaxId = 0;
state.groupMsgMaxId = 0;
state.loadingPrivateMsg = false;
diff --git a/im-uniapp/store/friendStore.js b/im-uniapp/store/friendStore.js
index b13c08d..cc827d5 100644
--- a/im-uniapp/store/friendStore.js
+++ b/im-uniapp/store/friendStore.js
@@ -13,7 +13,7 @@ export default {
},
updateFriend(state, friend) {
state.friends.forEach((f, index) => {
- if (f.id == friend.id) {
+ if (!f.delete && f.id == friend.id) {
// 拷贝属性
let online = state.friends[index].online;
Object.assign(state.friends[index], friend);
@@ -22,40 +22,24 @@ export default {
})
},
removeFriend(state, id) {
- state.friends.forEach((f, idx) => {
- if (f.id == id) {
- state.friends.splice(idx, 1)
- }
- });
+ let friend = this.getters.findFriend(id);
+ if(friend){
+ friend.delete = true;
+ }
},
addFriend(state, friend) {
- state.friends.push(friend);
+ let f = this.getters.findFriend(friend.id);
+ if(f){
+ Object.assign(f, friend);
+ f.delete = false;
+ }else{
+ state.friends.push(friend);
+ }
},
-
- setOnlineStatus(state, onlineTerminals) {
+ setOnlineStatus(state, onlineUsers) {
state.friends.forEach((f) => {
- let userTerminal = onlineTerminals.find((o) => f.id == o.userId);
- if (userTerminal) {
- f.online = true;
- f.onlineTerminals = userTerminal.terminals;
- f.onlineWeb = userTerminal.terminals.indexOf(TERMINAL_TYPE.WEB) >= 0
- f.onlineApp = userTerminal.terminals.indexOf(TERMINAL_TYPE.APP) >= 0
- } else {
- f.online = false;
- f.onlineTerminals = [];
- f.onlineWeb = false;
- f.onlineApp = false;
- }
- });
-
- state.friends.sort((f1, f2) => {
- if (f1.online && !f2.online) {
- return -1;
- }
- if (f2.online && !f1.online) {
- return 1;
- }
- return 0;
+ let onlineUser = onlineUsers.find((o) => f.id == o.userId);
+ f.online = !!onlineUser
});
},
refreshOnlineStatus(state) {
@@ -67,8 +51,8 @@ export default {
http({
url: '/user/terminal/online?userIds=' + userIds.join(','),
method: 'GET'
- }).then((onlineTerminals) => {
- this.commit("setOnlineStatus", onlineTerminals);
+ }).then((onlineUsers) => {
+ this.commit("setOnlineStatus", onlineUsers);
})
}
// 30s后重新拉取
@@ -98,5 +82,10 @@ export default {
})
});
}
+ },
+ getters:{
+ findFriend: (state) => (id) => {
+ return state.friends.find((f)=>f.id==id);
+ }
}
}
\ No newline at end of file
From 339365b552e2111fb6dccd3f4e169994b8f20ee2 Mon Sep 17 00:00:00 2001
From: blue <825657193@qq.com>
Date: Sat, 20 Apr 2024 15:40:13 +0800
Subject: [PATCH 6/8] =?UTF-8?q?=E6=96=87=E5=AD=97=E5=9B=BE=E5=83=8F?=
=?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=96=B9=E5=BD=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/com/bx/imclient/sender/IMSender.java | 47 ++++++++++---------
im-ui/src/components/common/HeadImage.vue | 2 +-
2 files changed, 26 insertions(+), 23 deletions(-)
diff --git a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java
index 6fc1297..1e0a7f6 100644
--- a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java
+++ b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java
@@ -30,30 +30,33 @@ public class IMSender {
public void sendPrivateMessage(IMPrivateMessage message) {
List results = new LinkedList<>();
- for (Integer terminal : message.getRecvTerminals()) {
- // 获取对方连接的channelId
- String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getRecvId().toString(), terminal.toString());
- Integer serverId = (Integer)redisTemplate.opsForValue().get(key);
- // 如果对方在线,将数据存储至redis,等待拉取推送
- if (serverId != null) {
- String sendKey = String.join(":", IMRedisKey.IM_MESSAGE_PRIVATE_QUEUE, serverId.toString());
- IMRecvInfo recvInfo = new IMRecvInfo();
- recvInfo.setCmd(IMCmdType.PRIVATE_MESSAGE.code());
- recvInfo.setSendResult(message.getSendResult());
- recvInfo.setServiceName(appName);
- recvInfo.setSender(message.getSender());
- recvInfo.setReceivers(Collections.singletonList(new IMUserInfo(message.getRecvId(), terminal)));
- recvInfo.setData(message.getData());
- redisTemplate.opsForList().rightPush(sendKey, recvInfo);
- } else {
- IMSendResult result = new IMSendResult();
- result.setSender(message.getSender());
- result.setReceiver(new IMUserInfo(message.getRecvId(), terminal));
- result.setCode(IMSendCode.NOT_ONLINE.code());
- result.setData(message.getData());
- results.add(result);
+ if(!Objects.isNull(message.getRecvId())){
+ for (Integer terminal : message.getRecvTerminals()) {
+ // 获取对方连接的channelId
+ String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getRecvId().toString(), terminal.toString());
+ Integer serverId = (Integer)redisTemplate.opsForValue().get(key);
+ // 如果对方在线,将数据存储至redis,等待拉取推送
+ if (serverId != null) {
+ String sendKey = String.join(":", IMRedisKey.IM_MESSAGE_PRIVATE_QUEUE, serverId.toString());
+ IMRecvInfo recvInfo = new IMRecvInfo();
+ recvInfo.setCmd(IMCmdType.PRIVATE_MESSAGE.code());
+ recvInfo.setSendResult(message.getSendResult());
+ recvInfo.setServiceName(appName);
+ recvInfo.setSender(message.getSender());
+ recvInfo.setReceivers(Collections.singletonList(new IMUserInfo(message.getRecvId(), terminal)));
+ recvInfo.setData(message.getData());
+ redisTemplate.opsForList().rightPush(sendKey, recvInfo);
+ } else {
+ IMSendResult result = new IMSendResult();
+ result.setSender(message.getSender());
+ result.setReceiver(new IMUserInfo(message.getRecvId(), terminal));
+ result.setCode(IMSendCode.NOT_ONLINE.code());
+ result.setData(message.getData());
+ results.add(result);
+ }
}
}
+
// 推送给自己的其他终端
if(message.getSendToSelf()){
for (Integer terminal : IMTerminalType.codes()) {
diff --git a/im-ui/src/components/common/HeadImage.vue b/im-ui/src/components/common/HeadImage.vue
index 0ca2985..ce438de 100644
--- a/im-ui/src/components/common/HeadImage.vue
+++ b/im-ui/src/components/common/HeadImage.vue
@@ -84,7 +84,7 @@
.avatar-text{
background-color: #f2f2f2; /* 默认背景色 */
- border-radius: 50%; /* 圆角效果 */
+ border-radius: 10%; /* 圆角效果 */
display: flex;
align-items: center;
justify-content: center;
From 21ec3459233ab4696612a31b4f00c5c86fc7dabb Mon Sep 17 00:00:00 2001
From: blue <825657193@qq.com>
Date: Sat, 20 Apr 2024 16:02:07 +0800
Subject: [PATCH 7/8] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=B0=8F=E7=A8=8B?=
=?UTF-8?q?=E5=BA=8F=E8=BF=87=E5=AE=A1=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
im-uniapp/App.vue | 17 ---
.../components/user-search/user-search.vue | 118 ------------------
im-uniapp/pages.json | 2 +-
im-uniapp/pages/group/group.vue | 6 +-
4 files changed, 2 insertions(+), 141 deletions(-)
delete mode 100644 im-uniapp/components/user-search/user-search.vue
diff --git a/im-uniapp/App.vue b/im-uniapp/App.vue
index 06e58a0..4274b60 100644
--- a/im-uniapp/App.vue
+++ b/im-uniapp/App.vue
@@ -15,8 +15,6 @@
init() {
// 加载数据
store.dispatch("load").then(() => {
- // 审核
- this.initAudit();
// 初始化websocket
this.initWebSocket();
}).catch((e) => {
@@ -241,21 +239,6 @@
// this.audioTip = uni.createInnerAudioContext();
// this.audioTip.src = "/static/audio/tip.wav";
// this.audioTip.play();
- },
- initAudit() {
- if (store.state.userStore.userInfo.type == 1) {
- // 显示群组功能
- uni.setTabBarItem({
- index: 2,
- text: "群聊"
- })
- } else {
- // 隐藏群组功能
- uni.setTabBarItem({
- index: 2,
- text: "搜索"
- })
- }
}
},
onLaunch() {
diff --git a/im-uniapp/components/user-search/user-search.vue b/im-uniapp/components/user-search/user-search.vue
deleted file mode 100644
index fadd7f6..0000000
--- a/im-uniapp/components/user-search/user-search.vue
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- {{ user.nickName}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/im-uniapp/pages.json b/im-uniapp/pages.json
index 520b23c..6949536 100644
--- a/im-uniapp/pages.json
+++ b/im-uniapp/pages.json
@@ -61,7 +61,7 @@
"pagePath": "pages/group/group",
"iconPath": "static/tarbar/group.png",
"selectedIconPath": "static/tarbar/group_active.png",
- "text": "搜索"
+ "text": "群聊"
},
{
"pagePath": "pages/mine/mine",
diff --git a/im-uniapp/pages/group/group.vue b/im-uniapp/pages/group/group.vue
index a215665..537b283 100644
--- a/im-uniapp/pages/group/group.vue
+++ b/im-uniapp/pages/group/group.vue
@@ -1,5 +1,5 @@
-
+
@@ -19,10 +19,6 @@
-
-
-
-