From e109e59f1aceb2842609a168e493c561fde15c4f Mon Sep 17 00:00:00 2001 From: Peanut Date: Sun, 19 Jul 2026 15:24:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(mini-program):=20sendChat=20=E6=8C=89=20ge?= =?UTF-8?q?nerationPhase=20=E5=88=87=E6=8D=A2=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E8=BF=9B=E7=BB=9F=E4=B8=80=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mini-program/src/pages/main/ScriptView.vue | 30 +++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/mini-program/src/pages/main/ScriptView.vue b/mini-program/src/pages/main/ScriptView.vue index cabb065..fb8a5c1 100644 --- a/mini-program/src/pages/main/ScriptView.vue +++ b/mini-program/src/pages/main/ScriptView.vue @@ -611,6 +611,10 @@ const sendChat = async () => { if (!chatInput.value.trim() || generating.value) return const content = chatInput.value.trim() chatInput.value = '' + + // 仅在 generationPhase === 'done' 时处理;生成流程中底部输入栏不显示,但防御性 short-circuit + if (generationPhase.value !== 'done') return + const messageId = currentVersionMessageId.value const userMessageRes = await createMessage({ @@ -622,15 +626,21 @@ const sendChat = async () => { }) const userMessageId = userMessageRes.data?.id - messages.value.push({ - id: userMessageId, - conversationId: conversationId.value, + // 用户消息追加到统一对话流 resultMessages + resultMessages.value.push({ + id: userMessageId || createMessageId(), + role: 'user', + kind: 'text', content, - sender: 'user', - type: 'chat' + pending: false, + time: formatMessageTime(), + submitted: false, + confirmed: false }) + keepResultAtBottom() generating.value = true + generationStatus.value = 'streaming' await streamScriptChat({ operationType: 'chat', conversationId: conversationId.value, @@ -638,13 +648,21 @@ const sendChat = async () => { userMessageId, content, scriptId: scriptId.value, - onDelta: () => {}, + onDelta: (delta) => { + // 往最后一条 AI 小说消息追加 delta + const lastAssistant = [...resultMessages.value].reverse().find(m => m.role === 'assistant' && m.kind === 'novel') + if (lastAssistant) { + lastAssistant.content += delta + } + }, onDone: () => { generating.value = false + generationStatus.value = 'idle' loadMessages() }, onError: (error) => { generating.value = false + generationStatus.value = 'idle' uni.showToast({ title: error || '生成失败', icon: 'none' }) } })