优化联系人消息获取

This commit is contained in:
2026-09-14 21:31:34 +08:00
parent b959d1dcc5
commit 25c684d16b
2 changed files with 85 additions and 59 deletions
+76 -58
View File
@@ -41,45 +41,15 @@
<input v-model="searchText" type="text" placeholder="搜索联系人" /> <input v-model="searchText" type="text" placeholder="搜索联系人" />
</div> </div>
<!-- 联系人列表 --> <!-- 最近联系人列表 -->
<!--
<div class="message-list"> <div class="message-list">
<div <div
v-for="contact in filteredContacts" v-for="contact in filteredContacts"
:key="contact.id"
class="contact-item"
:class="{
active: currentContact && currentContact.id === contact.id,
}"
@click="selectContact(contact)"
>
<div class="avatar">
{{ contact.name.charAt(0) }}
</div>
<div class="contact-info">
<div class="contact-name">
{{ contact.name }}
</div>
<div class="last-message">
{{ getLastMessage(contact.id) }}
</div>
</div>
<div v-if="contact.unread > 0" class="unread">
{{ contact.unread }}
</div>
</div>
</div>
-->
<!-- 联系人列表 -->
<div class="contact-list">
<div
v-for="contact in contactList"
:key="contact.contactId" :key="contact.contactId"
class="contact-item" class="contact-item"
:class="{
active: currentContact && currentContact.contactId === contact.contactId,
}"
@click="selectContact(contact)" @click="selectContact(contact)"
> >
<div class="avatar"> <div class="avatar">
@@ -90,9 +60,18 @@
<div class="contact-name"> <div class="contact-name">
{{ contact.contactName }} {{ contact.contactName }}
</div> </div>
<div class="last-message">
{{ getLastMessage(contact.contactId) }}
</div>
</div>
<div v-if="contact.unread > 0" class="unread">
{{ contact.unread }}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- 右侧聊天区域 --> <!-- 右侧聊天区域 -->
@@ -108,7 +87,7 @@
<!-- 聊天顶部 --> <!-- 聊天顶部 -->
<div class="chat-header"> <div class="chat-header">
<div class="avatar"> <div class="avatar">
{{ currentContact.name.charAt(0) }} {{ currentContact.contactName.charAt(0) }}
</div> </div>
<div class="chat-user-info"> <div class="chat-user-info">
@@ -135,7 +114,7 @@
> >
<!-- 对方头像 --> <!-- 对方头像 -->
<div v-if="message.from === 'other'" class="avatar message-avatar"> <div v-if="message.from === 'other'" class="avatar message-avatar">
{{ currentContact.name.charAt(0) }} {{ currentContact.contactName.charAt(0) }}
</div> </div>
<div class="message-content"> <div class="message-content">
@@ -190,7 +169,7 @@
</template> </template>
<script> <script>
import { getUserInfo, getContactInfo } from "@/utils/user"; import { getUserInfo, getContactInfo, getContactMessages } from "@/utils/user";
export default { export default {
name: "ChatPage", name: "ChatPage",
@@ -207,7 +186,7 @@ export default {
currentContact: null, currentContact: null,
// 聊天消息 // 聊天消息
messages: {}, groupedMessages: {},
}; };
}, },
@@ -220,7 +199,7 @@ export default {
const keyword = this.searchText.trim().toLowerCase(); const keyword = this.searchText.trim().toLowerCase();
return this.contacts.filter((contact) => return this.contactList.filter((contact) =>
contact.name.toLowerCase().includes(keyword), contact.name.toLowerCase().includes(keyword),
); );
}, },
@@ -231,23 +210,23 @@ export default {
return []; return [];
} }
return this.messages[this.currentContact.id] || []; return this.groupedMessages[this.currentContact.contactId] || [];
}, },
}, },
mounted() {
// 默认选择第一个联系人
// if (this.contacts.length > 0) {
// this.selectContact(this.contacts[0]);
// }
},
created() { created() {
this.getCurrentUser(); this.getCurrentUser();
// this.getContactList(); this.getContactList();
this.getMessageList();
}, },
methods: { methods: {
logout() {
// 清除 token 和用户信息
this.$store.commit("SET_TOKEN", "");
this.$store.commit("SET_USERNAME", "");
this.$router.push("/login");
},
getCurrentUser() { getCurrentUser() {
// 获取当前登录用户信息 // 获取当前登录用户信息
getUserInfo() getUserInfo()
@@ -260,16 +239,48 @@ export default {
this.$router.push("/login"); this.$router.push("/login");
}); });
}, },
logout() { getMessageList() {
// 清除 token 和用户信息 // 获取当前用户的联系人消息列表
this.$store.commit("SET_TOKEN", ""); getContactMessages()
this.$store.commit("SET_USERNAME", ""); .then((response) => {
this.$router.push("/login"); const groupedMessages = {};
const messages = response.data.messages || [];
// 把联系人的消息按联系人 id 分组存储
messages.forEach((item) => {
// 这个联系人的 id 是和当前用户聊天消息的发送者 id 或接收者 id
const contactId =
item.senderId === this.currentUser.userId
? item.receiverId
: item.senderId;
// 把联系人 id 为属性进行分组,每个联系人id对应一个消息数组,内容有接收消息也有发送消息
if (!groupedMessages[contactId]) {
groupedMessages[contactId] = [];
}
groupedMessages[contactId].push({
...item,
from: item.senderId === this.currentUser.userId ? "me" : "other",
time: item.time || item.createdAt,
});
});
this.groupedMessages = groupedMessages;
console.log("groupedMessages", groupedMessages)
})
.catch((error) => {
console.error(error);
this.$message.error("获取消息列表失败");
});
}, },
getContactList() { getContactList() {
getContactInfo() getContactInfo()
.then((response) => { .then((response) => {
this.contactList = response.data.contacts; this.contactList = response.data.contacts.map((contact) => ({
...contact,
unread: contact.unread || 0,
}));
console.log("contactList", this.contactList);
this.selectFirstContact();
}) })
.catch((error) => { .catch((error) => {
console.error(error); console.error(error);
@@ -289,9 +300,16 @@ export default {
}); });
}, },
// 选择第一个联系人
selectFirstContact() {
if (!this.currentContact && this.contactList.length > 0) {
this.selectContact(this.contactList[0]);
}
},
// 获取最后一条消息 // 获取最后一条消息
getLastMessage(contactId) { getLastMessage(contactId) {
const messageList = this.messages[contactId]; const messageList = this.groupedMessages[contactId];
if (!messageList || messageList.length === 0) { if (!messageList || messageList.length === 0) {
return "暂无消息"; return "暂无消息";
@@ -308,11 +326,11 @@ export default {
return; return;
} }
if (!this.messages[this.currentContact.id]) { if (!this.groupedMessages[this.currentContact.id]) {
this.$set(this.messages, this.currentContact.id, []); this.$set(this.groupedMessages, this.currentContact.id, []);
} }
this.messages[this.currentContact.id].push({ this.groupedMessages[this.currentContact.id].push({
id: Date.now(), id: Date.now(),
from: "me", from: "me",
content: content, content: content,
+9 -1
View File
@@ -29,7 +29,15 @@ export function getUserInfo() {
// 获取用户的联系人信息 // 获取用户的联系人信息
export function getContactInfo() { export function getContactInfo() {
return request({ return request({
url: '/contactInfo', url: '/contactsInfo',
method: 'get'
})
}
// 获取用户的联系人消息
export function getContactMessages() {
return request({
url: '/messagesInfo',
method: 'get' method: 'get'
}) })
} }