Skip to content

-
-分钟

公开站点 E2E 审计

审计时间:2026-08-23
开发服务:http://localhost:2212/
范围:首页、文章归档/详情、标签、圈子、关于、电台列表/详情、记忆、主题切换、移动端。

这是本轮修复前的初始证据记录。文中 5 项问题现已全部修复并通过回归测试;最新可提交的公开产品审计结论见 docs/public-audit.md

已覆盖且通过的流程

  • 首页首屏异步内容最终加载完成;文章、电台、记忆、圈子入口可见。
  • 首页“开始浏览”能滚动到内容区;首页电台轮播按钮能切换当前节目。
  • 文章归档按年份切换,文章详情可打开,文章移动端(390x844)无横向溢出。
  • 标签按钮会更新 ?tag=,并滚动到对应标签;标签内容可见。
  • 圈子页面能加载创作者文章(本次加载 100 篇文章卡片),图片没有发现加载失败。
  • 关于页面正常渲染;电台列表正常加载 28 期,电台详情可打开。
  • 电台详情播放/暂停按钮能切换图标,上一曲/下一曲可导航。
  • 记忆卡片可进入预览,缩略图切换、快门切换下一张、关闭预览均可用。
  • 主题开关可在亮/暗模式间切换;移动端菜单可展开;首页、文章、电台详情在 390x844 下无横向溢出。

已复现问题

[已修复][P1] 电台播放结束会同时触发上一曲和下一曲导航

  • 路径/根因/.vitepress/theme/pages/RadioDetail.vue:224-231
  • 复现步骤:打开 /r/aemeda.html,点击播放并让节目播放至结束(或在调试环境触发该 Audioended 事件)。
  • 实际:同一个 audioPlayerended 上同时注册 nextTrackprevTrack,随后又注册了一次 nextTrack。结束时会连续执行上一曲、下一曲、下一曲,导航结果不确定/可能跳过节目。
  • 预期:结束只执行一次下一曲(或按产品规则停留),不应执行上一曲。
  • 证据
    • audioPlayer.addEventListener('ended', nextTrack);
    • audioPlayer.addEventListener('ended', prevTrack);
    • audioPlayer.addEventListener('ended', () => { nextTrack(); });

[已修复][P2] 首页“流浪星球”快捷功能永远不会显示

  • 路径/根因/.vitepress/theme/pages/Home/composables/useHomeData.js:200-209 定义了 title: '流浪星球' 的功能;/.vitepress/theme/pages/Home/components/FunSection.vue:107-116 只渲染 funList.slice(0, 4)、索引 5 的答案卡和索引 6-9 的阅读卡,索引 4 被跳过。
  • 复现步骤:打开首页,滚动到“玩点好玩的”区域,检查所有快捷卡片;源码中的“流浪星球”无对应按钮。
  • 实际:页面只显示随机文章、情感电台、散落记忆、荣华富贵大家庭、答案之书及 4 个阅读项,没有“流浪星球”,用户无法触发该已定义功能。
  • 预期:已定义功能应显示为可操作卡片,或从数据中移除并明确不提供该功能。
  • 浏览器证据:首页快捷区渲染 9 个按钮,文本中不存在“流浪星球”。

[已修复][P2] 电台列表“随机播放”卡片不播放节目

  • 路径/根因/.vitepress/theme/pages/Radio/components/RadioList.vue:130-138 的随机卡片点击只调用 handleRandomPlay() 并发送事件;/.vitepress/theme/pages/Radio/components/RadioContent.vue:51-55handleRandomPlayconsole.log,没有打开节目、创建播放器或开始播放。
  • 复现步骤:打开 /radio.html,点击“随机播放”卡片。
  • 实际:卡片只执行闪烁/随机选中动画,URL 不变,也没有播放控制状态或音频开始;无障碍标签却声明“按回车键播放”。
  • 预期:随机选择一期开启播放(或进入对应详情页),并同步更新播放状态;若仅做随机选择,文案不应称为“播放”。

[已修复][P2] 记忆页标题数量与实际可浏览卡片不一致,首条记忆被漏掉

  • 路径/根因/.vitepress/theme/pages/Memory/components/MemoryContent.vue:49 使用 memories.value.slice(1) 作为列表,但 :memory-count-change:52-54 仍发送完整数组长度。
  • 复现步骤:打开 /nostalgia.html,观察标题显示“28 个记忆”,再统计 .memory-card 或页面可点击卡片。
  • 实际:标题显示 28 个,但列表只有 27 张卡片;数据首条“鸳鸯戏水”被从列表中排除,只作为封面/首页精选出现,无法从记忆列表进入预览。
  • 预期:列表应展示全部 28 条,或标题明确只统计可浏览的 27 条;首条记忆不应无入口。
  • 浏览器证据/nostalgia.html DOM 中 .memory-card 数量为 27,标题文本为“28 个记忆”。

[已修复][P2] 记忆预览的在线状态变量绑定错误,离线时仍会显示在线

  • 路径/根因/.vitepress/theme/pages/Memory/components/MemoryPreview.vue:168-170 将三个 composable 的返回值解构到两个变量:const [fps, online] = [useFps(), useNow(), useOnline()]。因此 online 实际拿到 useNow() 的时间 ref,而不是 useOnline() 的在线状态。
  • 复现步骤:打开 /nostalgia.html,进入任意记忆预览;在离线/断网环境观察顶部状态灯。
  • 实际:模板中的 online ? 'bg-green-500 flashing' : 'bg-red-600' 永远取到 truthy 的时间 ref,离线时仍显示绿色在线灯。
  • 预期:在线时绿色,离线时红色;online 应绑定 useOnline() 返回值。

低风险数据/展示观察

  • 标签页同时出现 CSScss 两个标签(大小写敏感导致同义标签分裂)。这不是运行时故障,但会造成标签云重复,建议统一内容数据或在聚合时规范化大小写。
  • 控制台存在 giscus 的 Discussion not found 警告;评论区在没有对应 discussion 时仍能渲染,暂未观察到页面阻断,因此未列为功能故障。
正在连接 GitHub评论区马上就来...