From b422b3c55c9b5692a3e42e942195e5b6635cae99 Mon Sep 17 00:00:00 2001
From: 2977094657 <2977094657@qq.com>
Date: Thu, 1 Jan 2026 23:24:15 +0800
Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E5=89=8D=E7=AB=AF=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E5=AE=9E=E6=97=B6=E5=BC=80=E5=85=B3=E5=B9=B6=E8=87=AA?=
=?UTF-8?q?=E5=8A=A8=E5=88=B7=E6=96=B0=E4=BC=9A=E8=AF=9D/=E6=B6=88?=
=?UTF-8?q?=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 聊天页新增实时开关,自动探测 realtime 可用性
- 监听 /api/chat/realtime/stream,变更时触发增量同步并刷新会话/消息
- useApi 增加 realtime 接口,sessions/messages 支持 source 参数
---
frontend/composables/useApi.js | 33 +++
frontend/pages/chat/[[username]].vue | 376 ++++++++++++++++++++++++++-
2 files changed, 400 insertions(+), 9 deletions(-)
diff --git a/frontend/composables/useApi.js b/frontend/composables/useApi.js
index 97e739f..9c4aa57 100644
--- a/frontend/composables/useApi.js
+++ b/frontend/composables/useApi.js
@@ -69,6 +69,7 @@ export const useApi = () => {
if (params && params.limit != null) query.set('limit', String(params.limit))
if (params && params.include_hidden != null) query.set('include_hidden', String(!!params.include_hidden))
if (params && params.include_official != null) query.set('include_official', String(!!params.include_official))
+ if (params && params.source) query.set('source', params.source)
const url = '/chat/sessions' + (query.toString() ? `?${query.toString()}` : '')
return await request(url)
}
@@ -81,10 +82,39 @@ export const useApi = () => {
if (params && params.offset != null) query.set('offset', String(params.offset))
if (params && params.order) query.set('order', params.order)
if (params && params.render_types) query.set('render_types', params.render_types)
+ if (params && params.source) query.set('source', params.source)
const url = '/chat/messages' + (query.toString() ? `?${query.toString()}` : '')
return await request(url)
}
+ const getChatRealtimeStatus = async (params = {}) => {
+ const query = new URLSearchParams()
+ if (params && params.account) query.set('account', params.account)
+ const url = '/chat/realtime/status' + (query.toString() ? `?${query.toString()}` : '')
+ return await request(url)
+ }
+
+ const syncChatRealtimeMessages = async (params = {}) => {
+ const query = new URLSearchParams()
+ if (params && params.account) query.set('account', params.account)
+ if (params && params.username) query.set('username', params.username)
+ if (params && params.max_scan != null) query.set('max_scan', String(params.max_scan))
+ const url = '/chat/realtime/sync' + (query.toString() ? `?${query.toString()}` : '')
+ return await request(url, { method: 'POST' })
+ }
+
+ const syncChatRealtimeAll = async (params = {}) => {
+ const query = new URLSearchParams()
+ if (params && params.account) query.set('account', params.account)
+ if (params && params.max_scan != null) query.set('max_scan', String(params.max_scan))
+ if (params && params.priority_username) query.set('priority_username', params.priority_username)
+ if (params && params.priority_max_scan != null) query.set('priority_max_scan', String(params.priority_max_scan))
+ if (params && params.include_hidden != null) query.set('include_hidden', String(!!params.include_hidden))
+ if (params && params.include_official != null) query.set('include_official', String(!!params.include_official))
+ const url = '/chat/realtime/sync_all' + (query.toString() ? `?${query.toString()}` : '')
+ return await request(url, { method: 'POST' })
+ }
+
const searchChatMessages = async (params = {}) => {
const query = new URLSearchParams()
if (params && params.account) query.set('account', params.account)
@@ -250,6 +280,9 @@ export const useApi = () => {
listChatAccounts,
listChatSessions,
listChatMessages,
+ getChatRealtimeStatus,
+ syncChatRealtimeMessages,
+ syncChatRealtimeAll,
searchChatMessages,
getChatSearchIndexStatus,
buildChatSearchIndex,
diff --git a/frontend/pages/chat/[[username]].vue b/frontend/pages/chat/[[username]].vue
index 595f2eb..69effc8 100644
--- a/frontend/pages/chat/[[username]].vue
+++ b/frontend/pages/chat/[[username]].vue
@@ -150,6 +150,18 @@
刷新
+