修改前端

This commit is contained in:
zhangxunhui 2026-01-27 17:26:17 +08:00
parent b932bf8ae0
commit de8b06defe
3 changed files with 33 additions and 6 deletions

View File

@ -4,8 +4,8 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RAG 聊天助手</title>
<link rel="stylesheet" href="/static/chat/style.css?v=202601271553">
<script src="/static/chat/script.js?v=202601271553"></script>
<link rel="stylesheet" href="/static/chat/style.css?v=202601271705">
<script src="/static/chat/script.js?v=202601271705"></script>
<script src="/static/chat/marked.min.js"></script>
</head>
<body>

View File

@ -4,6 +4,7 @@ let currentUser = null; // 当前登录用户对象
let isStreaming = false;
let currentStreamResponse = null;
let currentStreamReader = null;
let currentAssistantMessageElement = null; // 保存当前助手消息元素
// API 基础 URL
const API_BASE_URL = '/';
@ -746,6 +747,7 @@ async function handleStreamResponse(response) {
// 创建助手消息容器
const now = new Date().toISOString();
messageElement = createAssistantMessageContainer(now);
currentAssistantMessageElement = messageElement; // 保存到全局变量
try {
while (true) {
@ -765,9 +767,16 @@ async function handleStreamResponse(response) {
} catch (error) {
console.error('Error reading stream:', error);
updateAssistantMessageContent(messageElement, `流式响应错误: ${error.message}`);
// 检查是否是用户主动取消的错误
if (error.name === 'AbortError' || error.message.includes('cancel')) {
// 用户主动取消,不显示错误消息
} else {
// 其他错误,显示错误消息
updateAssistantMessageContent(messageElement, `流式响应错误: ${error.message}`);
}
} finally {
reader.releaseLock();
currentAssistantMessageElement = null; // 重置全局变量
}
}
@ -782,7 +791,7 @@ function createAssistantMessageContainer(time) {
</div>
<div class="message-content">
<div class="message text">
<div class="typing-dots" id="assistantTypingDots" style="display: flex;">
<div class="typing-dots" id="assistantTypingDots" style="display: flex; align-items: center;">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
@ -835,12 +844,29 @@ async function stopStreamResponse() {
currentStreamResponse = null;
currentStreamReader = null;
// 隐藏打字指示器
hideTypingIndicator();
// 更新助手消息内容,替换打字指示器
let assistantMessageElement = currentAssistantMessageElement;
// 如果 currentAssistantMessageElement 为 null尝试查找最新的助手消息元素
if (!assistantMessageElement) {
const messageElements = elements.messagesContainer.querySelectorAll('.message.assistant');
if (messageElements.length > 0) {
assistantMessageElement = messageElements[messageElements.length - 1];
}
}
if (assistantMessageElement) {
updateAssistantMessageContent(assistantMessageElement, '流式响应已中止');
}
// 重置全局变量
currentAssistantMessageElement = null;
// 更新按钮状态
updateSendButtonState(false);
// 滚动到底部
scrollToBottom();
} catch (error) {
console.error('Error stopping stream:', error);
}

View File

@ -490,6 +490,7 @@ body {
.message.text .typing-dots .dot:nth-child(3) {
animation-delay: 0s;
transform: translateY(0);
}
@keyframes typing {