Complete V2 user H5 flow

This commit is contained in:
2026-07-06 18:00:21 +08:00
parent 207340973c
commit 86cbed2437
10 changed files with 383 additions and 15 deletions

View File

@@ -23,6 +23,7 @@ const loading = ref(false);
const booting = ref(true);
const statusText = ref("连接后端中");
const bottomRef = ref<HTMLElement | null>(null);
const activeAbortController = ref<AbortController | null>(null);
onMounted(async () => {
if (!getToken()) {
@@ -82,28 +83,53 @@ async function send(message: string) {
const assistantMessage: UiMessage = { id: `assistant-${Date.now()}`, role: "assistant", content: "", streaming: true };
messages.value.push(userMessage, assistantMessage);
loading.value = true;
activeAbortController.value = new AbortController();
await scrollToBottom();
try {
await streamChat(activeSessionId.value, message, async (chunk) => {
assistantMessage.content += chunk;
await scrollToBottom();
});
}, activeAbortController.value.signal);
assistantMessage.streaming = false;
await refreshSessions(activeSessionId.value);
user.value = await api.profile();
} catch (error) {
assistantMessage.streaming = false;
assistantMessage.content = error instanceof Error ? error.message : "AI 回复失败";
if (error instanceof DOMException && error.name === "AbortError") {
assistantMessage.content = assistantMessage.content || "已停止生成";
} else {
assistantMessage.content = error instanceof Error ? error.message : "AI 回复失败";
}
} finally {
loading.value = false;
activeAbortController.value = null;
}
}
async function stop() {
if (!activeSessionId.value) return;
activeAbortController.value?.abort();
await api.stop(activeSessionId.value);
loading.value = false;
}
async function renameSession(sessionId: number, title: string) {
await api.renameSession(sessionId, title);
await refreshSessions(sessionId);
}
async function deleteSession(sessionId: number) {
await api.deleteSession(sessionId);
sessions.value = await api.listSessions();
if (activeSessionId.value === sessionId) {
messages.value = [];
activeSessionId.value = null;
if (sessions.value.length > 0) {
await selectSession(sessions.value[0].id);
}
}
}
async function logout() {
try {
await api.logout();
@@ -175,6 +201,8 @@ async function scrollToBottom() {
@close="drawerOpen = false"
@select="selectSession"
@create="createSession"
@rename="renameSession"
@delete="deleteSession"
/>
</template>
</section>