fix: 对话创建和消息发送时同步到backend

This commit is contained in:
2026-04-27 18:20:06 +08:00
parent 8199773ef6
commit 773fb89b01

View File

@@ -2823,7 +2823,7 @@ function showAgentHistoryPage() {
} }
// 打开智能体对话 // 打开智能体对话
function openAgent(agentId) { async function openAgent(agentId) {
currentAgent = systemAgents.find(a => a.id === agentId); currentAgent = systemAgents.find(a => a.id === agentId);
if (!currentAgent) return; if (!currentAgent) return;
@@ -2844,9 +2844,31 @@ function openAgent(agentId) {
setAgentUsed(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 = { const newConv = {
id: Date.now().toString(), id: backendId || Date.now().toString(),
title: currentAgent.name, title: currentAgent.name,
messages: [], messages: [],
agentId: agentId, agentId: agentId,
@@ -3297,15 +3319,33 @@ function togglePinConversation(convId) {
} }
// 创建新对话 // 创建新对话
function createNewConversation() { async function createNewConversation() {
// 检查未登录用户的对话限制 // 检查未登录用户的对话限制
if (!currentUser && !canCreateNewChat()) { if (!currentUser && !canCreateNewChat()) {
showLimitDialog('chat_session'); showLimitDialog('chat_session');
return; 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 = { const newConv = {
id: Date.now().toString(), id: backendId || Date.now().toString(), // 使用 backend ID 或本地 ID
title: '新对话', title: '新对话',
messages: [], messages: [],
createdAt: Date.now(), createdAt: Date.now(),
@@ -3622,6 +3662,9 @@ async function sendMessage() {
currentConversation.updatedAt = Date.now(); currentConversation.updatedAt = Date.now();
saveConversations(); saveConversations();
// 同步当前对话到 backend用户已登录
syncConversationToBackend(currentConversation);
// 增加消息计数(未登录用户) // 增加消息计数(未登录用户)
if (!currentUser) { if (!currentUser) {
if (currentConversation.agentId) { if (currentConversation.agentId) {
@@ -3742,6 +3785,7 @@ async function streamGenerate(userMsgIndex) {
contentEl.innerHTML = renderMarkdown(currentConversation.messages[aiMessageIndex].content); contentEl.innerHTML = renderMarkdown(currentConversation.messages[aiMessageIndex].content);
currentConversation.updatedAt = Date.now(); currentConversation.updatedAt = Date.now();
saveConversations(); saveConversations();
syncConversationToBackend(currentConversation);
renderMessages(); renderMessages();
}; };
} }
@@ -3818,6 +3862,7 @@ async function streamGenerate(userMsgIndex) {
hideStopGenerateBtn(); hideStopGenerateBtn();
currentConversation.updatedAt = Date.now(); currentConversation.updatedAt = Date.now();
saveConversations(); saveConversations();
syncConversationToBackend(currentConversation);
renderMessages(); renderMessages();
// 自动总结标题第一次对话和每隔5次对话 // 自动总结标题第一次对话和每隔5次对话
@@ -4226,23 +4271,17 @@ function setupScrollListener() {
function saveConversations() { function saveConversations() {
// 保存到本地存储(离线可用) // 保存到本地存储(离线可用)
localStorage.setItem('conversations', JSON.stringify(conversations)); localStorage.setItem('conversations', JSON.stringify(conversations));
// 如果用户已登录,同步到 backend
if (currentUser && currentUser.id) {
syncConversationsToBackend();
}
} }
// 同步对话数据到 backend // 同步单个对话到 backend(新创建或更新)
async function syncConversationsToBackend() { async function syncConversationToBackend(conv) {
if (!currentUser || !currentUser.id) return; if (!currentUser || !currentUser.id) return;
try {
// 批量同步所有对话
for (const conv of conversations) {
const convId = parseInt(conv.id); const convId = parseInt(conv.id);
if (convId > 0) {
// 更新现有对话 try {
if (convId > 0 && convId < 1e12) {
// 已有 backend ID更新对话
await fetch(`/api/user/${currentUser.id}/conversations/${convId}`, { await fetch(`/api/user/${currentUser.id}/conversations/${convId}`, {
method: 'PUT', method: 'PUT',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
@@ -4253,7 +4292,7 @@ async function syncConversationsToBackend() {
}) })
}); });
} else { } else {
// 新对话,需要创建 // 新对话(本地 ID 是时间戳),创建
const res = await fetch(`/api/user/${currentUser.id}/conversations`, { const res = await fetch(`/api/user/${currentUser.id}/conversations`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
@@ -4265,13 +4304,13 @@ async function syncConversationsToBackend() {
}); });
const data = await res.json(); const data = await res.json();
if (data.success && data.id) { if (data.success && data.id) {
// 更新本地IDbackend ID // 更新本地 IDbackend ID
conv.id = data.id; conv.id = data.id;
} // 更新 localStorage
localStorage.setItem('conversations', JSON.stringify(conversations));
} }
} }
} catch (e) { } catch (e) {
// 同步失败,静默处理(下次登录时会重新加载)
console.error('同步对话失败:', e); console.error('同步对话失败:', e);
} }
} }