前端:
增加会话缓存 后端: 增加触发消息创建事件 增加消息创建事件触发后的处理函数
This commit is contained in:
@@ -50,6 +50,7 @@ import { formatDate } from '@/utils/formatDate';
|
||||
import { useChatStore } from '@/stores/chat';
|
||||
import { generateSessionId } from '@/utils/sessionIdTools';
|
||||
import { useSignalRStore } from '@/stores/signalr';
|
||||
import { useConversationStore } from '@/stores/conversation';
|
||||
|
||||
const props = defineProps({
|
||||
id:{
|
||||
@@ -60,6 +61,7 @@ const props = defineProps({
|
||||
|
||||
const chatStore = useChatStore();
|
||||
const signalRStore = useSignalRStore();
|
||||
const conversationStore = useConversationStore();
|
||||
|
||||
const input = ref(''); // 输入框内容
|
||||
const historyRef = ref(null); // 绑定 DOM 用于滚动
|
||||
@@ -118,20 +120,20 @@ function toggleEmoji() {
|
||||
}
|
||||
|
||||
async function loadConversation(conversationId) {
|
||||
/*
|
||||
const res = await messageService.getConversationById(conversationId);
|
||||
conversationInfo.value = res.data;
|
||||
console.log(res)
|
||||
}
|
||||
|
||||
async function loadMessages(conversationId, msgId = null, pageSize = null) {
|
||||
const res = await messageService.getMessages(conversationId);
|
||||
messages.value = res.data;
|
||||
*/
|
||||
if(conversationStore.conversations.length == 0){
|
||||
await conversationStore.loadUserConversations();
|
||||
}
|
||||
conversationInfo.value = conversationStore.conversations.find(x => x.id == Number(conversationId));
|
||||
}
|
||||
|
||||
// 初始化时滚动到底部
|
||||
onMounted(async () => {
|
||||
await loadConversation(props.id);
|
||||
const sessionid = generateSessionId(conversationInfo.userId, conversationInfo.targetId)
|
||||
const sessionid = generateSessionId(conversationInfo.value.userId, conversationInfo.value.targetId)
|
||||
await chatStore.swtichSession(sessionid,props.id);
|
||||
scrollToBottom();
|
||||
});
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
class="list-item" :class="{active: activeId === s.id}" @click="selectSession(s)">
|
||||
<div class="avatar-container">
|
||||
<img :src="s.targetAvatar ?? defaultAvatar" class="avatar-std" />
|
||||
<span v-if="s.unread > 0" class="unread-badge">{{ s.unreadCount ?? 0 }}</span>
|
||||
<span v-if="s.unreadCount > 0" class="unread-badge">{{ s.unreadCount ?? 0 }}</span>
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="name-row">
|
||||
@@ -36,26 +36,19 @@ import { ref, computed, nextTick, onMounted } from 'vue'
|
||||
import { messageService } from '@/services/message'
|
||||
import defaultAvatar from '@/assets/default_avatar.png'
|
||||
import { formatDate } from '@/utils/formatDate'
|
||||
import { useConversationStore } from '@/stores/conversation'
|
||||
|
||||
const conversationStore = useConversationStore();
|
||||
|
||||
const searchQuery = ref('')
|
||||
const input = ref('')
|
||||
const historyRef = ref(null)
|
||||
const activeId = ref(1)
|
||||
const conversations = ref([]);
|
||||
|
||||
const filteredSessions = computed(() => conversations.value.filter(s => s.targetName.includes(searchQuery.value)))
|
||||
|
||||
const currentSession = computed(() => sessions.value.find(s => s.id === activeId.value))
|
||||
const filteredSessions = computed(() => conversationStore.conversations.filter(s => s.targetName.includes(searchQuery.value)))
|
||||
|
||||
function selectSession(s) {
|
||||
activeId.value = s.id
|
||||
router.push(`/messages/chat/${s.id}`)
|
||||
scrollToBottom()
|
||||
}
|
||||
|
||||
const scrollToBottom = async () => {
|
||||
await nextTick()
|
||||
if (historyRef.value) historyRef.value.scrollTop = historyRef.value.scrollHeight
|
||||
}
|
||||
|
||||
async function loadConversation() {
|
||||
@@ -65,7 +58,7 @@ async function loadConversation() {
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
await loadConversation();
|
||||
await conversationStore.loadUserConversations();
|
||||
})
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user