Skip to content

Commit abc8e3e

Browse files
committed
improvement(sns): 优化视频号卡片样式(页面/导出)
- sns.vue:视频号 card 改为正方形封面(无图用文字占位),并移除 source/显示计数 - sns_export_service:HTML 导出同步相同布局与播放按钮样式
1 parent ffa6491 commit abc8e3e

2 files changed

Lines changed: 26 additions & 43 deletions

File tree

frontend/pages/sns.vue

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,7 @@
179179
<div v-else-if="posts.length === 0" class="text-sm text-gray-400 py-16 text-center">暂无朋友圈数据</div>
180180

181181
<div v-if="!error && posts.length > 0" class="text-[11px] text-gray-500 mb-2 flex flex-wrap gap-x-3 gap-y-1">
182-
<span>已显示:{{ posts.length }}</span>
183182
<span v-if="selectedSnsUserInfo">缓存统计:{{ selectedSnsUserInfo.postCount || 0 }}</span>
184-
<span v-if="timelineSource">source: {{ timelineSource }}</span>
185183
<span v-if="!hasMore && !isLoading">(已到末尾)</span>
186184
</div>
187185
<div v-if="showSnsCountMismatchHint" class="text-[11px] text-amber-700 mb-3">
@@ -247,30 +245,23 @@
247245
</a>
248246
</div>
249247

250-
<div v-else-if="post.type === 28 && post.finderFeed && Object.keys(post.finderFeed).length > 0" class="mt-2 w-full" :class="{ 'privacy-blur': privacyMode }">
251-
<!-- 浏览器没有看微信视频号的环境,暂时不进行跳转!! -->
252-
<div class="block w-full bg-[#F7F7F7] p-2 rounded-sm">
253-
<div class="flex items-center gap-3">
254-
<div class="flex-1 min-w-0 flex items-center overflow-hidden h-12">
255-
<div class="text-[13px] text-gray-900 leading-tight line-clamp-2">{{ formatFinderFeedCardText(post) }}</div>
256-
</div>
257-
<div class="relative w-12 h-12 rounded-sm overflow-hidden flex-shrink-0 bg-white">
258-
<img
259-
v-if="getFinderFeedThumbSrc(post)"
260-
:src="getFinderFeedThumbSrc(post)"
261-
class="w-full h-full object-cover"
262-
alt=""
263-
loading="lazy"
264-
referrerpolicy="no-referrer"
265-
/>
266-
<div v-else class="w-full h-full flex items-center justify-center bg-gray-200 text-gray-400 text-xs">
267-
视频
268-
</div>
269-
<div class="absolute inset-0 flex items-center justify-center pointer-events-none">
270-
<div class="w-8 h-8 rounded-full bg-black/45 flex items-center justify-center">
271-
<svg class="w-4 h-4 text-white" fill="currentColor" viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg>
272-
</div>
273-
</div>
248+
<div v-else-if="post.type === 28 && post.finderFeed && Object.keys(post.finderFeed).length > 0" class="mt-2 w-full max-w-[304px]" :class="{ 'privacy-blur': privacyMode }">
249+
<!-- 浏览器没有看微信视频号的环境,暂时不进行跳转 -->
250+
<div class="relative w-full overflow-hidden rounded-sm bg-[#F7F7F7]">
251+
<img
252+
v-if="getFinderFeedThumbSrc(post)"
253+
:src="getFinderFeedThumbSrc(post)"
254+
class="block w-full aspect-square object-cover"
255+
alt=""
256+
loading="lazy"
257+
referrerpolicy="no-referrer"
258+
/>
259+
<div v-else class="w-full aspect-square flex items-center justify-center bg-gray-200">
260+
<span class="line-clamp-3 px-4 text-center text-[13px] leading-5 text-gray-500">{{ formatFinderFeedCardText(post) }}</span>
261+
</div>
262+
<div class="absolute inset-0 flex items-center justify-center pointer-events-none">
263+
<div class="w-12 h-12 rounded-full bg-black/45 flex items-center justify-center">
264+
<svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg>
274265
</div>
275266
</div>
276267
</div>
@@ -622,7 +613,6 @@ const seenPostIds = new Set()
622613
// NOTE: Backend `/api/sns/timeline` uses SQL OFFSET on the raw timeline rows.
623614
// The UI filters out some rows (e.g. type=7 cover), so `posts.length` must NOT be used as the next OFFSET.
624615
const timelineOffset = ref(0)
625-
const timelineSource = ref('')
626616
const hasMore = ref(true)
627617
// When timeline API reports `hasMore=false` but cached sidebar count indicates more, keep paging.
628618
// If we hit an empty page, stop trying to avoid infinite requests.
@@ -1615,7 +1605,6 @@ const loadPosts = async ({ reset }) => {
16151605
try {
16161606
if (reset) {
16171607
timelineOffset.value = 0
1618-
timelineSource.value = ''
16191608
hasMore.value = true
16201609
cachePagingExhausted.value = false
16211610
seenPostIds.clear()
@@ -1633,7 +1622,6 @@ const loadPosts = async ({ reset }) => {
16331622
offset,
16341623
usernames: selectedSnsUser.value ? [String(selectedSnsUser.value).trim()] : []
16351624
})
1636-
timelineSource.value = String(resp?.source || '').trim()
16371625
const items = Array.isArray(resp?.timeline) ? resp.timeline : []
16381626
// Advance offset by the number of rows consumed by the backend.
16391627
// When `hasMore` is true, the backend definitely scanned at least `limit` raw rows (even if it filtered some out).

src/wechat_decrypt_tool/sns_export_service.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,29 +1204,24 @@ def export_external_thumb(url: str, *, kind: str) -> str:
12041204
ff = post.get("finderFeed") if isinstance(post.get("finderFeed"), dict) else {}
12051205
thumb_url = str(ff.get("thumbUrl") or "").strip() if isinstance(ff, dict) else ""
12061206
thumb_arc = export_external_thumb(thumb_url, kind="finder") if thumb_url else ""
1207-
out.append('<div class="mt-2 w-full">')
1208-
out.append('<div class="block w-full bg-[#F7F7F7] p-2 rounded-sm">')
1209-
out.append('<div class="flex items-center gap-3">')
1210-
out.append('<div class="flex-1 min-w-0 flex items-center overflow-hidden h-12">')
1211-
out.append(
1212-
f'<div class="text-[13px] text-gray-900 leading-tight line-clamp-2">{_esc_text(format_finder_feed_card_text(post))}</div>'
1213-
)
1214-
out.append("</div>")
1215-
out.append('<div class="relative w-12 h-12 rounded-sm overflow-hidden flex-shrink-0 bg-white">')
1207+
out.append('<div class="mt-2 w-full max-w-[304px]">')
1208+
out.append('<div class="relative w-full overflow-hidden rounded-sm bg-[#F7F7F7]">')
12161209
if thumb_arc:
12171210
out.append(
1218-
f'<img src="{_esc_attr(thumb_arc)}" class="w-full h-full object-cover" alt="" loading="lazy" referrerpolicy="no-referrer" />'
1211+
f'<img src="{_esc_attr(thumb_arc)}" class="block w-full aspect-square object-cover" alt="" loading="lazy" referrerpolicy="no-referrer" />'
12191212
)
12201213
else:
12211214
out.append(
1222-
'<div class="w-full h-full flex items-center justify-center bg-gray-200 text-gray-400 text-xs">视频</div>'
1215+
'<div class="w-full aspect-square flex items-center justify-center bg-gray-200">'
1216+
f'<span class="line-clamp-3 px-4 text-center text-[13px] leading-5 text-gray-500">{_esc_text(format_finder_feed_card_text(post))}</span>'
1217+
"</div>"
12231218
)
12241219
out.append('<div class="absolute inset-0 flex items-center justify-center pointer-events-none">')
1225-
out.append('<div class="w-8 h-8 rounded-full bg-black/45 flex items-center justify-center">')
1220+
out.append('<div class="w-12 h-12 rounded-full bg-black/45 flex items-center justify-center">')
12261221
out.append(
1227-
'<svg class="w-4 h-4 text-white" fill="currentColor" viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg>'
1222+
'<svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg>'
12281223
)
1229-
out.append("</div></div></div></div></div></div>")
1224+
out.append("</div></div></div>")
12301225
else:
12311226
out.append(render_media_block(zf=zf, post=post))
12321227

0 commit comments

Comments
 (0)