From c5ca1651db0285a1ade151aab74d2faa817ea357 Mon Sep 17 00:00:00 2001 From: peanut_hzm Date: Fri, 25 Jul 2025 00:25:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DWebSocket=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E9=97=AE=E9=A2=98=EF=BC=9A=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=AE=A2=E9=98=85=E8=B7=AF=E5=BE=84=E4=BB=A5?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E5=90=8E=E7=AB=AF=E6=8E=A8=E9=80=81=E8=B7=AF?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/services/websocket.ts | 66 +++++++++++++++++++++++++++++------ web/src/stores/chat.ts | 8 +++-- web/src/views/Chat/index.vue | 9 +++-- 3 files changed, 68 insertions(+), 15 deletions(-) diff --git a/web/src/services/websocket.ts b/web/src/services/websocket.ts index 4fdfe51..1fc6255 100644 --- a/web/src/services/websocket.ts +++ b/web/src/services/websocket.ts @@ -93,6 +93,12 @@ export class WebSocketService { connectHeaders['Authorization'] = `Bearer ${token}` } + console.log('WebSocket连接配置:', { + userId: this.userId, + hasToken: !!token, + headers: connectHeaders + }) + this.client.connect( connectHeaders, (frame) => { @@ -204,7 +210,11 @@ export class WebSocketService { try { this.client.send('/app/chat.send', {}, JSON.stringify(chatRequest)) - console.log('发送聊天消息:', chatRequest) + console.log('发送聊天消息:', { + ...chatRequest, + currentUserId: this.userId, + expectedSubscriptionPath: '/user/queue/messages' + }) } catch (error) { console.error('发送消息失败:', error) this.callbacks.onError?.({ @@ -249,16 +259,39 @@ export class WebSocketService { private subscribeToMessages(): void { if (!this.client?.connected) return - // 订阅用户私有消息 - this.client.subscribe('/user/queue/messages', (message) => { - try { - const wsMessage: WebSocketMessage = JSON.parse(message.body) - console.log('收到WebSocket消息:', wsMessage) - this.callbacks.onMessage?.(wsMessage) - } catch (error) { - console.error('解析WebSocket消息失败:', error) + // 订阅用户私有消息 - 包含用户ID的完整路径 + if (this.userId) { + const userQueuePath = `/user/${this.userId}/queue/messages` + console.log('订阅用户私有队列:', userQueuePath) + this.client.subscribe(userQueuePath, (message) => { + try { + const wsMessage: WebSocketMessage = JSON.parse(message.body) + console.log('收到用户私有WebSocket消息:', wsMessage) + this.callbacks.onMessage?.(wsMessage) + } catch (error) { + console.error('解析用户私有WebSocket消息失败:', error) + } + }) + } + + // 同时订阅基于sessionId的队列(从日志看后端也在使用这个) + if (this.client.ws && this.client.ws.url) { + // 从WebSocket URL中提取sessionId + const urlParts = this.client.ws.url.split('/') + const sessionId = urlParts[urlParts.length - 2] // 倒数第二个部分是sessionId + if (sessionId) { + console.log('订阅基于sessionId的队列:', `/queue/messages-user${sessionId}`) + this.client.subscribe(`/queue/messages-user${sessionId}`, (message) => { + try { + const wsMessage: WebSocketMessage = JSON.parse(message.body) + console.log('收到基于sessionId的WebSocket消息:', wsMessage) + this.callbacks.onMessage?.(wsMessage) + } catch (error) { + console.error('解析基于sessionId的WebSocket消息失败:', error) + } + }) } - }) + } // 订阅广播消息 this.client.subscribe('/topic/broadcast', (message) => { @@ -270,6 +303,19 @@ export class WebSocketService { console.error('解析广播消息失败:', error) } }) + + // 如果有会话ID,也订阅会话特定的消息 + if (this.conversationId) { + this.client.subscribe(`/topic/conversation/${this.conversationId}`, (message) => { + try { + const wsMessage: WebSocketMessage = JSON.parse(message.body) + console.log('收到会话WebSocket消息:', wsMessage) + this.callbacks.onMessage?.(wsMessage) + } catch (error) { + console.error('解析会话WebSocket消息失败:', error) + } + }) + } } /** diff --git a/web/src/stores/chat.ts b/web/src/stores/chat.ts index 4c2a303..f1fe427 100644 --- a/web/src/stores/chat.ts +++ b/web/src/stores/chat.ts @@ -190,12 +190,16 @@ export const useChatStore = defineStore('chat', () => { segments.forEach((segment, index) => { setTimeout(() => { - addMessage({ + const aiMessage = addMessage({ content: segment.trim(), type: 'ai', sessionId: currentSession.value?.id }) + // 强制触发响应式更新 + console.log('AI消息已添加,当前消息总数:', messages.value.length) + console.log('最新AI消息:', aiMessage) + // 最后一条消息后停止输入状态 if (index === segments.length - 1) { isTyping.value = false @@ -206,7 +210,7 @@ export const useChatStore = defineStore('chat', () => { // WebSocket消息处理 const handleWebSocketMessage = (wsMessage: WebSocketMessage) => { - console.log('处理WebSocket消息:', wsMessage) + console.log('收到WebSocket消息:', wsMessage.type, wsMessage.senderType) switch (wsMessage.type) { case 'TEXT': diff --git a/web/src/views/Chat/index.vue b/web/src/views/Chat/index.vue index 738387b..bc9ffbb 100644 --- a/web/src/views/Chat/index.vue +++ b/web/src/views/Chat/index.vue @@ -62,6 +62,8 @@
+ +