From 773fb89b01082351fdc011c45a54d6c160d0d5fd Mon Sep 17 00:00:00 2001 From: hubian <908234780@qq.com> Date: Mon, 27 Apr 2026 18:20:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AF=B9=E8=AF=9D=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=92=8C=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E6=97=B6=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=88=B0backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- www/app.js | 123 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 81 insertions(+), 42 deletions(-) diff --git a/www/app.js b/www/app.js index 8a19d92..e89961f 100644 --- a/www/app.js +++ b/www/app.js @@ -2823,7 +2823,7 @@ function showAgentHistoryPage() { } // 打开智能体对话 -function openAgent(agentId) { +async function openAgent(agentId) { currentAgent = systemAgents.find(a => a.id === agentId); if (!currentAgent) return; @@ -2844,9 +2844,31 @@ function openAgent(agentId) { setAgentUsed(agentId); } + // 如果用户已登录,先在 backend 创建对话 + let backendId = null; + if (currentUser && currentUser.id) { + try { + const res = await fetch(`/api/user/${currentUser.id}/conversations`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + title: currentAgent.name, + messages: [], + agentId: agentId + }) + }); + const data = await res.json(); + if (data.success && data.id) { + backendId = data.id; + } + } catch (e) { + console.error('创建智能体对话失败:', e); + } + } + // 创建新对话并设置智能体 const newConv = { - id: Date.now().toString(), + id: backendId || Date.now().toString(), title: currentAgent.name, messages: [], agentId: agentId, @@ -3297,15 +3319,33 @@ function togglePinConversation(convId) { } // 创建新对话 -function createNewConversation() { +async function createNewConversation() { // 检查未登录用户的对话限制 if (!currentUser && !canCreateNewChat()) { showLimitDialog('chat_session'); return; } + // 如果用户已登录,先在 backend 创建对话 + let backendId = null; + if (currentUser && currentUser.id) { + try { + const res = await fetch(`/api/user/${currentUser.id}/conversations`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ title: '新对话', messages: [] }) + }); + const data = await res.json(); + if (data.success && data.id) { + backendId = data.id; + } + } catch (e) { + console.error('创建对话失败:', e); + } + } + const newConv = { - id: Date.now().toString(), + id: backendId || Date.now().toString(), // 使用 backend ID 或本地 ID title: '新对话', messages: [], createdAt: Date.now(), @@ -3622,6 +3662,9 @@ async function sendMessage() { currentConversation.updatedAt = Date.now(); saveConversations(); + // 同步当前对话到 backend(用户已登录) + syncConversationToBackend(currentConversation); + // 增加消息计数(未登录用户) if (!currentUser) { if (currentConversation.agentId) { @@ -3742,6 +3785,7 @@ async function streamGenerate(userMsgIndex) { contentEl.innerHTML = renderMarkdown(currentConversation.messages[aiMessageIndex].content); currentConversation.updatedAt = Date.now(); saveConversations(); + syncConversationToBackend(currentConversation); renderMessages(); }; } @@ -3818,6 +3862,7 @@ async function streamGenerate(userMsgIndex) { hideStopGenerateBtn(); currentConversation.updatedAt = Date.now(); saveConversations(); + syncConversationToBackend(currentConversation); renderMessages(); // 自动总结标题:第一次对话和每隔5次对话 @@ -4226,52 +4271,46 @@ function setupScrollListener() { function saveConversations() { // 保存到本地存储(离线可用) localStorage.setItem('conversations', JSON.stringify(conversations)); - - // 如果用户已登录,同步到 backend - if (currentUser && currentUser.id) { - syncConversationsToBackend(); - } } -// 同步对话数据到 backend -async function syncConversationsToBackend() { +// 同步单个对话到 backend(新创建或更新) +async function syncConversationToBackend(conv) { if (!currentUser || !currentUser.id) return; + const convId = parseInt(conv.id); + try { - // 批量同步所有对话 - for (const conv of conversations) { - const convId = parseInt(conv.id); - if (convId > 0) { - // 更新现有对话 - await fetch(`/api/user/${currentUser.id}/conversations/${convId}`, { - method: 'PUT', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - title: conv.title, - messages: conv.messages, - agentId: conv.agentId - }) - }); - } else { - // 新对话,需要创建 - const res = await fetch(`/api/user/${currentUser.id}/conversations`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - title: conv.title, - messages: conv.messages, - agentId: conv.agentId - }) - }); - const data = await res.json(); - if (data.success && data.id) { - // 更新本地ID为backend ID - conv.id = data.id; - } + if (convId > 0 && convId < 1e12) { + // 已有 backend ID,更新对话 + await fetch(`/api/user/${currentUser.id}/conversations/${convId}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + title: conv.title, + messages: conv.messages, + agentId: conv.agentId + }) + }); + } else { + // 新对话(本地 ID 是时间戳),创建 + const res = await fetch(`/api/user/${currentUser.id}/conversations`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + title: conv.title, + messages: conv.messages, + agentId: conv.agentId + }) + }); + const data = await res.json(); + if (data.success && data.id) { + // 更新本地 ID 为 backend ID + conv.id = data.id; + // 更新 localStorage + localStorage.setItem('conversations', JSON.stringify(conversations)); } } } catch (e) { - // 同步失败,静默处理(下次登录时会重新加载) console.error('同步对话失败:', e); } }