From 16a7e410a11449e2c0962533d2806132913b6bed Mon Sep 17 00:00:00 2001 From: 2977094657 <2977094657@qq.com> Date: Mon, 16 Mar 2026 11:07:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(chat-build):=20=E9=81=BF=E5=85=8D=E9=A2=84?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E9=98=B6=E6=AE=B5=E8=AF=B7=E6=B1=82=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除聊天页 setup 阶段的服务端会话预取\n- 改为客户端挂载后再加载账号和会话数据\n- 修复 nuxt generate 在发布机构建时访问本地聊天接口导致的失败 --- frontend/composables/chat/useChatSessions.js | 75 +------------------- frontend/pages/chat/[[username]].vue | 2 +- 2 files changed, 2 insertions(+), 75 deletions(-) diff --git a/frontend/composables/chat/useChatSessions.js b/frontend/composables/chat/useChatSessions.js index 7b62b8f..9010b15 100644 --- a/frontend/composables/chat/useChatSessions.js +++ b/frontend/composables/chat/useChatSessions.js @@ -7,7 +7,7 @@ const SESSION_LIST_WIDTH_DEFAULT = 295 const SESSION_LIST_WIDTH_MIN = 220 const SESSION_LIST_WIDTH_MAX = 520 -export const useChatSessions = async ({ chatAccounts, selectedAccount, realtimeEnabled, api }) => { +export const useChatSessions = ({ chatAccounts, selectedAccount, realtimeEnabled, api }) => { const showSearchAccountSwitcher = false const contacts = ref([]) @@ -134,79 +134,6 @@ export const useChatSessions = async ({ chatAccounts, selectedAccount, realtimeE loadSessionListWidth() }) - const apiBase = useApiBase() - - const { data: prefetchedAccounts } = await useAsyncData('chat-accounts', () => { - if (process.server) { - const port = process.env.WECHAT_TOOL_PORT || '10392' - return $fetch('/api/chat/accounts', { baseURL: `http://127.0.0.1:${port}` }) - } - return $fetch('/chat/accounts', { baseURL: apiBase }) - }, { watch: false, lazy: true }) - - if (prefetchedAccounts.value?.accounts?.length && !chatAccounts.loaded) { - const response = prefetchedAccounts.value - chatAccounts.accounts = response.accounts - const preferred = chatAccounts.selectedAccount - const fallback = response.default_account || response.accounts[0] || '' - chatAccounts.selectedAccount = (preferred && response.accounts.includes(preferred)) ? preferred : fallback - chatAccounts.loaded = true - } - - const ssrSelectedAccount = chatAccounts.selectedAccount || '' - const { data: prefetchedSessions } = await useAsyncData(`chat-sessions-${ssrSelectedAccount}`, () => { - if (!ssrSelectedAccount) return Promise.resolve(null) - const params = new URLSearchParams({ - account: ssrSelectedAccount, - limit: '400', - include_hidden: 'false', - include_official: 'false' - }) - if (process.server) { - const port = process.env.WECHAT_TOOL_PORT || '10392' - return $fetch(`/api/chat/sessions?${params}`, { baseURL: `http://127.0.0.1:${port}` }) - } - return $fetch(`/chat/sessions?${params}`, { baseURL: apiBase }) - }, { watch: false, lazy: true }) - - if (prefetchedSessions.value?.sessions?.length) { - const ssrAvatars = new Map() - contacts.value = prefetchedSessions.value.sessions.map((session) => { - if (session.avatar) ssrAvatars.set(session.username || session.id, session.avatar) - return { - id: session.id, - name: session.name || session.username || session.id, - avatar: null, - lastMessage: normalizeSessionPreview(session.lastMessage || ''), - lastMessageTime: session.lastMessageTime || '', - unreadCount: session.unreadCount || 0, - isGroup: !!session.isGroup, - isTop: !!session.isTop, - username: session.username - } - }) - - if (process.client && ssrAvatars.size) { - const applySsrAvatars = () => { - const entries = Array.from(ssrAvatars.entries()) - const batchSize = 6 - let index = 0 - const next = () => { - const batch = entries.slice(index, index + batchSize) - if (!batch.length) return - for (const [key, url] of batch) { - const contact = contacts.value.find((item) => (item.username || item.id) === key) - if (contact) contact.avatar = url - } - index += batchSize - if (index < entries.length) setTimeout(next, 150) - } - next() - } - setTimeout(applySsrAvatars, 500) - } - } - const filteredContacts = computed(() => { const query = String(searchQuery.value || '').trim().toLowerCase() if (!query) return contacts.value diff --git a/frontend/pages/chat/[[username]].vue b/frontend/pages/chat/[[username]].vue index 6ca5736..c456ac2 100644 --- a/frontend/pages/chat/[[username]].vue +++ b/frontend/pages/chat/[[username]].vue @@ -84,7 +84,7 @@ if (process.client) { const searchContext = ref(createEmptySearchContext()) -const sessionState = await useChatSessions({ +const sessionState = useChatSessions({ chatAccounts, selectedAccount, realtimeEnabled,