From 3dbf5993d1d0aaa118a01bd0143a74d78d0a11c0 Mon Sep 17 00:00:00 2001 From: 2977094657 <2977094657@qq.com> Date: Tue, 17 Feb 2026 23:41:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(sns):=20=E6=9C=8B=E5=8F=8B=E5=9C=88?= =?UTF-8?q?=E9=A1=B5=E6=94=AF=E6=8C=81=E8=81=94=E7=B3=BB=E4=BA=BA=E4=BE=A7?= =?UTF-8?q?=E6=A0=8F=E3=80=81=E5=AF=BC=E5=87=BA=E4=B8=8E=20Live=20Photo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 左侧新增朋友圈联系人列表(按发圈数),支持搜索与“全部/单人”筛选 - 新增“导出全部/导出此人”,展示导出状态并支持下载 ZIP(SSE 优先,轮询兜底) - Live Photo/实况:悬停播放、静音切换与预览弹窗 - 媒体请求统一透传 use_cache;关闭缓存时追加时间戳避免浏览器缓存 --- frontend/components/LivePhotoIcon.vue | 29 + frontend/composables/useApi.js | 39 + frontend/pages/sns.vue | 1021 +++++++++++++++++++++++-- 3 files changed, 1034 insertions(+), 55 deletions(-) create mode 100644 frontend/components/LivePhotoIcon.vue diff --git a/frontend/components/LivePhotoIcon.vue b/frontend/components/LivePhotoIcon.vue new file mode 100644 index 0000000..79ae903 --- /dev/null +++ b/frontend/components/LivePhotoIcon.vue @@ -0,0 +1,29 @@ + + + + diff --git a/frontend/composables/useApi.js b/frontend/composables/useApi.js index 956e6e1..fe84ac3 100644 --- a/frontend/composables/useApi.js +++ b/frontend/composables/useApi.js @@ -236,6 +236,16 @@ export const useApi = () => { return await request(url) } + // 朋友圈联系人列表(按发圈数统计) + const listSnsUsers = async (params = {}) => { + const query = new URLSearchParams() + if (params && params.account) query.set('account', params.account) + if (params && params.keyword) query.set('keyword', String(params.keyword)) + if (params && params.limit != null) query.set('limit', String(params.limit)) + const url = '/sns/users' + (query.toString() ? `?${query.toString()}` : '') + return await request(url) + } + // 朋友圈图片本地缓存候选(用于错图时手动选择) const listSnsMediaCandidates = async (params = {}) => { const query = new URLSearchParams() @@ -356,6 +366,31 @@ export const useApi = () => { return await request(`/chat/exports/${encodeURIComponent(String(exportId))}`, { method: 'DELETE' }) } + // 朋友圈导出(离线 HTML zip) + const createSnsExport = async (data = {}) => { + return await request('/sns/exports', { + method: 'POST', + body: { + account: data.account || null, + scope: data.scope || 'selected', + usernames: Array.isArray(data.usernames) ? data.usernames : [], + use_cache: data.use_cache == null ? true : !!data.use_cache, + output_dir: data.output_dir == null ? null : String(data.output_dir || '').trim(), + file_name: data.file_name || null + } + }) + } + + const getSnsExport = async (exportId) => { + if (!exportId) throw new Error('Missing exportId') + return await request(`/sns/exports/${encodeURIComponent(String(exportId))}`) + } + + const cancelSnsExport = async (exportId) => { + if (!exportId) throw new Error('Missing exportId') + return await request(`/sns/exports/${encodeURIComponent(String(exportId))}`, { method: 'DELETE' }) + } + // 联系人 const listChatContacts = async (params = {}) => { const query = new URLSearchParams() @@ -454,6 +489,7 @@ export const useApi = () => { resolveNestedChatHistory, resolveAppMsg, listSnsTimeline, + listSnsUsers, listSnsMediaCandidates, saveSnsMediaPicks, openChatMediaFolder, @@ -465,6 +501,9 @@ export const useApi = () => { getChatExport, listChatExports, cancelChatExport, + createSnsExport, + getSnsExport, + cancelSnsExport, listChatContacts, exportChatContacts, getWrappedAnnual, diff --git a/frontend/pages/sns.vue b/frontend/pages/sns.vue index 14d231f..c7ca3d5 100644 --- a/frontend/pages/sns.vue +++ b/frontend/pages/sns.vue @@ -1,17 +1,154 @@ - : {{ String(c?.content || '').trim() }} + : + + {{ seg.content }} + + + @@ -302,10 +554,39 @@ @click="closeImagePreview" >
- 预览 + + 预览
+ +