fix: 修复首页空白、小红书/游记封面图、定制页二维码

1. 首页大面积空白:useScrollReveal 添加 MutationObserver,
   确保异步子组件的 .reveal 元素也能触发入场动画

2. 小红书/游记封面图不显示:
   - 小红书 CDN 签名链接过期+防盗链,全部下载到本地
   - 新增 download-covers.mjs 脚本批量下载封面
   - 新增 useImageProxy composable 转换外部 URL
   - 页面 img 标签添加 referrerpolicy="no-referrer"
   - 管理端保存时自动下载外部封面图到本地
   - 种子数据更新为本地路径

3. 定制页微信号文字替换为二维码图片

4. prerender 路由添加 /xiaohongshu 和 /youji

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
这个提交包含在:
刘涛
2026-03-25 15:37:58 +08:00
共同撰写人 Claude Opus 4.6
父节点 b82712deed
当前提交 8832762e51
共修改 16 个文件,包含 599 行新增和 106 行删除
+3 -2
查看文件
@@ -13,7 +13,7 @@
<main class="detail-main">
<!-- 封面 -->
<div class="detail-cover" :class="{ 'detail-cover--wide': note.ratio === 'horizontal' }">
<img :src="note.cover" :alt="note.title" />
<img :src="proxyImage(note.cover)" :alt="note.title" referrerpolicy="no-referrer" />
</div>
<!-- 正文 -->
@@ -97,7 +97,7 @@
:class="{ 'sidebar-note--active': n.id === note.id }"
>
<NuxtLink :to="`/youji/${n.id}`" class="sidebar-note__link">
<img :src="n.cover" :alt="n.title" class="sidebar-note__thumb" />
<img :src="proxyImage(n.cover)" :alt="n.title" class="sidebar-note__thumb" referrerpolicy="no-referrer" />
<div class="sidebar-note__info">
<span class="sidebar-note__title">{{ n.title }}</span>
<span class="sidebar-note__meta">
@@ -143,6 +143,7 @@
<script setup>
import { useBreadcrumbSchema } from '~/composables/useJsonLd'
import { proxyImage } from '~/composables/useImageProxy'
const { data: youjiData } = await usePublicApi('youji')
+2 -1
查看文件
@@ -93,7 +93,7 @@
class="note-card"
>
<div class="note-card__cover" :class="{ 'note-card__cover--wide': note.ratio === 'horizontal' }">
<img :src="note.cover" :alt="note.title" loading="lazy" @error="handleImageError" />
<img :src="proxyImage(note.cover)" :alt="note.title" loading="lazy" referrerpolicy="no-referrer" @error="handleImageError" />
<div class="note-card__overlay">
<span class="note-card__read">查看详情</span>
</div>
@@ -136,6 +136,7 @@
<script setup>
import { useBreadcrumbSchema } from '~/composables/useJsonLd'
import { proxyImage } from '~/composables/useImageProxy'
const { data: youjiData } = await usePublicApi('youji')