muse_creative_hotspots/doc/FeatureSummary.md
wxs 6cc703ada2 feat: monorepo 重构 + 新增 5 个平台适配器
项目从单体结构重构为 pnpm monorepo (shared/backend/frontend),
新增 YouTube、Instagram、Twitter/X、哔哩哔哩、微博 5 个平台适配器,
包含完整的单元测试和 E2E 测试覆盖。

- 完成 T-031~T-044: 5 个适配器实现、注册、配置和测试
- 重构前后端分离: Hono 后端 + Next.js 前端
- 151 个单元测试 + 21 个 Mock E2E + 25 个真实 E2E
- 适配器基于真实 TikHub API 响应结构实现

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 15:43:25 +08:00

29 KiB
Raw Blame History

Muse Creative Hotspots — 功能摘要

文档信息

项目 内容
版本 v1.0
创建日期 2026-03-02
来源文档 PRD.md

1. 功能总览

1.1 功能统计

类别 数量
功能模块 5 个

| P0 功能 | 14 个 | | P1 功能 | 2 个 | | P2 功能 | 1 个 | | 功能总计 | 17 个 |

1.2 功能架构图

┌─────────────────────────────────────────────────────────────────────────────┐
│                       Muse Creative Hotspots秒思创意热点                  │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐          │
│  │ A. 热点内容聚合   │  │ B. 数据刷新管理   │  │ C. 收藏/书签系统  │          │
│  │ ──────────────── │  │ ──────────────── │  │ ──────────────── │          │
│  │ • F-001 内容获取  │  │ • F-005 自动刷新  │  │ • F-007 内容收藏  │          │
│  │ • F-002 卡片展示  │  │ • F-006 手动刷新  │  │ • F-008 收藏管理  │          │
│  │ • F-003 筛选排序  │  │                  │  │ • F-009 数据持久化 │          │
│  │ • F-004 详情页    │  │                  │  │                  │          │
│  └──────────────────┘  └──────────────────┘  └──────────────────┘          │
│                                                                             │
│  ┌──────────────────┐  ┌──────────────────┐                                │
│  │ D. 设置管理       │  │ E. API 代理层     │                                │
│  │ ──────────────── │  │ ──────────────── │                                │
│  │ • F-010 Key配置   │  │ • F-014 请求代理  │                                │
│  │ • F-011 刷新间隔  │  │ • F-015 数据模型  │                                │
│  │ • F-012 平台管理  │  │ • F-016 平台适配  │                                │
│  │ • F-013 数量设置  │  │                  │                                │
│  │ • F-017 调用统计  │  │                  │                                │
│  └──────────────────┘  └──────────────────┘                                │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

1.3 模块依赖关系

┌──────────────────┐
│ E. API 代理层     │ ◀─── 所有数据请求的底层基础
│ F-014/F-015/F-016│
└───────┬──────────┘
        │ 被依赖
        ▼
┌──────────────────┐       ┌──────────────────┐
│ A. 热点内容聚合   │ ◀──── │ B. 数据刷新管理   │
│ F-001~F-004      │       │ F-005/F-006      │
└───────┬──────────┘       └──────────────────┘
        │ 被依赖                     ▲
        ▼                           │ 读取配置
┌──────────────────┐       ┌──────────────────┐
│ C. 收藏/书签系统  │       │ D. 设置管理       │
│ F-007~F-009      │       │ F-010~F-013      │
└──────────────────┘       └──────────────────┘
                                    │ 提供 API Key
                                    ▼
                           ┌──────────────────┐
                           │ E. API 代理层     │
                           └──────────────────┘

依赖说明:

  • 模块 E 是基础设施层,模块 A/B 依赖其提供数据
  • 模块 B 触发模块 A 的数据重新获取
  • 模块 C 依赖模块 A 提供可收藏的内容
  • 模块 D 为模块 B刷新间隔和模块 EAPI Key提供配置

2. 功能清单

2.1 模块 A — 热点内容聚合浏览

模块职责: 从各平台获取热点内容并以卡片信息流形式展示,支持筛选、排序和详情查看。

功能列表

ID 功能 描述 优先级 关联场景
F-001 内容获取 获取各平台官方热榜/推荐内容 P0 US-001/002/003
F-002 卡片信息流展示 瀑布流/网格卡片布局展示内容 P0 US-001/004
F-003 内容筛选与排序 按平台切换、按数据指标排序 P0 US-002/003
F-004 内容详情页 站内详情页展示完整内容信息 P0 US-001/003/004

功能契约详情

F-001: 内容获取

契约项 说明
触发条件 1. 页面首次加载2. 自动定时刷新触发3. 手动点击刷新按钮4. 切换平台 Tab
输入 平台标识platform、展示数量count默认 20-50、API Key从设置读取
处理逻辑 1. 通过 API 代理层调用 TikHub 对应平台端点2. 适配器将原始数据转换为统一 ContentItem3. 缓存结果供前端展示
输出 ContentItem[] 数组,包含 title、cover_url、author_name、play_count、like_count 等标准字段
异常情况 API Key 无效 → 提示配置;请求超时 → 显示重试按钮频率超限10 req/s→ 排队等待;平台未启用 → 跳过
边界说明 不包含内容的全文/完整视频获取;不做内容缓存持久化(刷新后替换);不支持分页加载更多

F-002: 卡片信息流展示

契约项 说明
触发条件 内容数据加载完成F-001 返回结果)
输入 ContentItem[] 数组
处理逻辑 1. 按瀑布流/网格布局渲染卡片2. 每张卡片展示:封面图/缩略图、标题(截断)、平台图标+名称、关键数据(播放量/点赞/评论/分享)、发布时间、作者头像+昵称3. 支持 hover 预览更多信息
输出 可视化的卡片网格界面
异常情况 封面图加载失败 → 显示占位图;数据为空 → 显示空状态提示
边界说明 不包含视频内联播放;不包含无限滚动(展示固定 Top N卡片内标题截断展示完整内容在详情页

F-003: 内容筛选与排序

契约项 说明
触发条件 用户点击平台 Tab 切换或选择排序方式
输入 筛选条件platform平台标识 / "all"排序条件sortByplay_count / like_count / comment_count / publish_time+ sortOrderasc / desc
处理逻辑 1. 按平台筛选:切换 Tab 时过滤或重新请求对应平台数据2. 按指标排序前端对当前列表重新排序3. "全部"视图聚合所有已启用平台的内容
输出 重新排列后的 ContentItem[] → 更新卡片信息流
异常情况 某平台数据为空 → Tab 上标注"暂无数据";排序字段缺失 → 该条目排到末尾
边界说明 不包含关键词搜索功能;不包含多条件组合筛选;排序为前端内存排序,不重新请求 API

F-004: 内容详情页

契约项 说明
触发条件 用户点击内容卡片
输入 ContentItem 的完整数据(或 contentId + platform 用于请求详情 API
处理逻辑 1. 展示完整内容信息标题、描述、标签2. 展示完整数据指标面板(播放/点赞/评论/分享3. 展示作者信息(头像+昵称4. 提供"查看原文"按钮跳转原平台页面5. 提供收藏按钮
输出 站内详情页面
异常情况 详情数据加载失败 → 显示错误提示 + 重试按钮;原文链接失效 → 提示"原文可能已被删除"

| 边界说明 | 不包含站内视频播放器(视频内容通过"查看原文"按钮跳转原平台播放video_url 不直接嵌入播放);不包含评论区展示;不包含相关推荐 |


2.2 模块 B — 数据刷新管理

模块职责: 管理内容数据的自动定时刷新和手动触发刷新机制。

功能列表

ID 功能 描述 优先级 关联场景
F-005 自动定时刷新 按设定间隔自动获取最新内容 P0 US-001/002
F-006 手动刷新 用户点击按钮立即刷新内容 P0 US-001/002

功能契约详情

F-005: 自动定时刷新

契约项 说明
触发条件 页面加载后自动启动定时器
输入 刷新间隔(从设置读取,默认 30 分钟)
处理逻辑 1. 启动定时器setInterval / TanStack Query refetchInterval2. 到达间隔时间后自动调用 F-001 重新获取所有已启用平台的内容3. 刷新时更新"上次刷新时间"显示
输出 更新后的内容列表 + 更新刷新时间戳
异常情况 刷新失败 → 保留上一次数据,显示刷新失败提示;页面后台(不可见)→ 暂停刷新节省 API 调用
边界说明 不包含增量更新(每次全量替换);不包含推送通知新内容;最小间隔限制 5 分钟(防止 API 滥用)

F-006: 手动刷新

契约项 说明
触发条件 用户点击工具栏刷新按钮 🔄
输入 当前选中平台(或"全部"
处理逻辑 1. 触发 F-001 重新获取内容2. 刷新按钮显示 loading 状态3. 完成后重置自动刷新计时器4. 更新"上次刷新时间"
输出 更新后的内容列表 + loading 状态反馈
异常情况 连续快速点击 → 防抖处理2 秒内忽略重复点击);刷新中再次点击 → 忽略

| 边界说明 | 【设计决策】不包含单平台独立刷新刷新所有已启用平台PRD 未明确此约束,后续可按需调整);手动刷新会重置自动刷新倒计时 |


2.3 模块 C — 收藏/书签系统

模块职责: 允许用户收藏感兴趣的内容,构建个人灵感库。

功能列表

ID 功能 描述 优先级 关联场景

| F-007 | 内容收藏 | 将任意内容卡片添加到收藏夹 | P0 | US-001/004 | | F-008 | 收藏夹管理 | 独立页面查看和管理收藏内容 | P0 | US-004 | | F-009 | 收藏数据持久化 | 收藏数据本地持久化存储 | P0 | US-004 |

功能契约详情

F-007: 内容收藏

契约项 说明
触发条件 用户在卡片上或详情页中点击收藏按钮
输入 ContentItem 完整数据
处理逻辑 1. 检查是否已收藏防重复2. 已收藏 → 取消收藏;未收藏 → 添加到收藏列表3. 更新收藏按钮状态(实心/空心4. 触发 F-009 持久化存储
输出 收藏状态变更 + 视觉反馈(按钮状态切换)
异常情况 存储空间不足 → 提示清理旧收藏
边界说明 不包含收藏分类/文件夹功能;不包含收藏备注;不包含收藏分享

F-008: 收藏夹管理

契约项 说明
触发条件 用户点击导航中的"收藏"入口
输入 本地存储的收藏列表
处理逻辑 1. 从本地存储读取收藏列表2. 以卡片网格形式展示所有收藏内容3. 支持取消收藏删除4. 点击卡片可跳转详情页
输出 收藏内容列表页面
异常情况 收藏为空 → 显示空状态引导
边界说明 不包含收藏搜索不包含收藏排序不包含收藏导出MVP 阶段不支持云同步

F-009: 收藏数据持久化

契约项 说明
触发条件 收藏列表发生变更(添加/删除)
输入 完整的收藏列表数据
处理逻辑 1. 使用 Zustand persist 中间件2. 将收藏数据序列化存储到 localStorage3. 页面加载时自动恢复收藏状态
输出 持久化的收藏数据
异常情况 localStorage 不可用 → 降级为内存存储(关闭页面丢失);数据损坏 → 重置收藏列表并提示
边界说明 MVP 仅支持 localStorage不包含 IndexedDB不包含数据库后端存储不包含跨设备同步

2.4 模块 D — 设置管理

模块职责: 提供应用配置界面,允许用户自定义 API 认证、刷新策略和平台偏好。

功能列表

ID 功能 描述 优先级 关联场景
F-010 API Key 配置 配置 TikHub API Key P0 -

| F-011 | 刷新间隔设置 | 自定义自动刷新频率 | P0 | US-001 | | F-012 | 平台管理 | 启用/禁用各平台 | P1 | US-002 | | F-013 | 展示数量设置 | 配置每平台默认展示数量 | P2 | US-003 |

| F-017 | API 调用量统计 | 展示当日 API 调用次数及成本估算 | P1 | - |

功能契约详情

F-010: API Key 配置

契约项 说明
触发条件 用户进入设置页面
输入 用户输入的 TikHub API Key 字符串
处理逻辑 1. 提供文本输入框供用户粘贴 API Key2. 保存时验证 Key 格式非空检查3. 存储到本地(加密或 env4. API 代理层读取此 Key 发起请求
输出 API Key 保存成功/失败提示

| 异常情况 | Key 为空 → 提示必填Key 无效 → 首次请求内容时 API 返回 401引导用户检查 Key 配置 | | 边界说明 | 保存时仅做非空校验,不测试 API 连通性(无效 Key 在实际请求时暴露);不包含多 Key 轮换Key 仅存储于服务端环境变量或加密本地存储 |

F-011: 刷新间隔设置

契约项 说明
触发条件 用户在设置页面调整刷新间隔
输入 刷新间隔值分钟可选范围5 / 10 / 15 / 30 / 60
处理逻辑 1. 提供下拉选择或滑块控件2. 保存后立即更新 F-005 的定时器间隔3. 持久化存储设置
输出 新的刷新间隔生效
异常情况 无特殊异常
边界说明 最小 5 分钟API 成本控制);不支持自定义任意分钟数

F-012: 平台管理

契约项 说明
触发条件 用户在设置页面切换平台开关
输入 平台标识 + 启用/禁用状态
处理逻辑 1. 展示所有支持的平台列表每个平台配有开关2. 切换开关后持久化设置3. 禁用的平台不再出现在首页 Tab 栏中4. 禁用平台的数据不再自动刷新
输出 平台启用状态更新
异常情况 至少保留一个平台启用 → 否则提示
边界说明 不包含平台顺序自定义;不包含自定义添加新平台

F-013: 展示数量设置

契约项 说明
触发条件 用户在设置页面调整展示数量
输入 每平台展示数量(默认 20可选 10 / 20 / 30 / 50
处理逻辑 1. 提供数量选择控件2. 保存后下次刷新时按新数量请求3. 影响 F-001 的请求参数
输出 新的展示数量配置生效
异常情况 无特殊异常
边界说明 不支持每个平台独立设置不同数量(全局统一);更改后需等待下次刷新才生效

F-017: API 调用量统计

契约项 说明
触发条件 用户进入设置页面或首页工具栏查看
输入 API 代理层的请求计数器数据
处理逻辑 1. API 代理层F-014每次转发请求时累加计数器2. 按日期维度统计调用次数3. 根据 $0.001/请求 计算估算成本4. 在设置页面或工具栏展示"今日调用: N 次(≈$X.XX"
输出 当日 API 调用次数 + 成本估算显示
异常情况 计数器数据丢失(页面刷新)→ 重新从 0 计数并提示"本次会话统计"
边界说明 仅统计当前会话/当日数据,不做历史统计;计数存储于内存或 localStorage成本为估算值不保证与实际账单一致

2.5 模块 E — API 代理层

模块职责: 通过 Next.js API Routes 代理 TikHub 请求,隐藏 API Key 并统一数据格式。

功能列表

ID 功能 描述 优先级 关联场景
F-014 API 请求代理 通过服务端代理 TikHub API 请求 P0 -
F-015 统一数据模型 所有平台数据映射为 ContentItem P0 -
F-016 平台适配器 各平台 API 调用与数据格式转换 P0 -

功能契约详情

F-014: API 请求代理

契约项 说明
触发条件 前端发起内容获取请求
输入 平台标识、请求类型(热榜/详情)、请求参数
处理逻辑 1. Next.js API Route 接收前端请求2. 从环境变量/设置读取 API Key3. 构建 TikHub API 请求Bearer Token 认证4. 转发请求并返回结果5. 遵守 10 req/s 频率限制
输出 TikHub API 原始响应数据
异常情况 API Key 未配置 → 返回 401 + 提示配置TikHub 返回错误 → 透传错误信息;请求超时 → 返回超时错误;频率超限 → 排队或返回 429
边界说明 不包含响应缓存(由 TanStack Query 在前端处理);不包含请求日志记录;代理层仅做转发,不做业务逻辑

F-015: 统一数据模型

契约项 说明
触发条件 适配器处理 API 响应时
输入 各平台原始 API 响应数据
处理逻辑 定义统一 ContentItem 类型包含title、cover_url、video_url、author_name、author_avatar、play_count、like_count、comment_count、share_count、publish_time、platform、original_url、tags
输出 标准化的 ContentItem 对象
异常情况 必填字段缺失 → 使用默认值(如"未知作者");数据类型不匹配 → 类型转换或置空
边界说明 ContentItem 为只读展示模型,不包含编辑能力;字段定义以 PRD 4.3 为准

F-016: 平台适配器

契约项 说明
触发条件 F-001 调用内容获取时
输入 平台标识 + API 原始响应
处理逻辑 1. 根据平台标识选择对应适配器2. 适配器调用平台特定的 TikHub API 端点3. 将原始响应字段映射为 ContentItem参照 PRD 中各平台的字段映射规则4. MVP 实现抖音/TikTok/小红书三个适配器
输出 ContentItem[] 标准化数组
异常情况 平台无适配器 → 返回空数组 + 日志警告API 端点变更 → 适配器更新
边界说明 每个适配器独立实现,互不影响;新增平台只需新增适配器,无需修改已有代码

3. 功能依赖矩阵

功能 F-001 F-002 F-003 F-004 F-005 F-006 F-007 F-008 F-009 F-010 F-011 F-012 F-013 F-014 F-015 F-016 F-017
F-001 内容获取 -
F-002 卡片展示 -
F-003 筛选排序 -
F-004 详情页 -
F-005 自动刷新 -
F-006 手动刷新 -
F-007 内容收藏 -
F-008 收藏管理 -
F-009 数据持久化 -
F-010 Key配置 -
F-011 刷新间隔 -
F-012 平台管理 -
F-013 数量设置 -
F-014 请求代理 -
F-015 数据模型 -
F-016 平台适配 -
F-017 调用统计 -

说明:

  • ✓ 表示行功能依赖列功能
  • 空白表示无依赖
  • - 表示自身

4. 功能流程图

4.1 核心流程:内容浏览主流程

┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐
│ F-010    │ ──▶ │ F-014    │ ──▶ │ F-016    │ ──▶ │ F-015    │ ──▶ │ F-001    │
│ Key配置  │     │ 请求代理  │     │ 平台适配  │     │ 数据模型  │     │ 内容获取  │
└──────────┘     └──────────┘     └──────────┘     └──────────┘     └─────┬────┘
                                                                          │
                      ┌───────────────────────────────────────────────────┘
                      ▼
                ┌──────────┐     ┌──────────┐     ┌──────────┐
                │ F-002    │ ──▶ │ F-003    │ ──▶ │ F-004    │
                │ 卡片展示  │     │ 筛选排序  │     │ 详情页   │
                └──────────┘     └──────────┘     └──────────┘

4.2 数据刷新流程

┌──────────────────────────────────────────────────────────┐
│                    刷新触发                                │
│  ┌──────────┐           ┌──────────┐                     │
│  │ F-005    │           │ F-006    │                     │
│  │ 自动刷新  │           │ 手动刷新  │                     │
│  │ (定时器)  │           │ (按钮)   │                     │
│  └────┬─────┘           └────┬─────┘                     │
│       │                      │                           │
│       └──────────┬───────────┘                           │
│                  ▼                                        │
│           ┌──────────┐     ┌──────────┐                  │
│           │ F-001    │ ──▶ │ F-002    │                  │
│           │ 内容获取  │     │ 更新展示  │                  │
│           └────┬─────┘     └──────────┘                  │
│                │                                          │
│                ▼ 失败                                     │
│         ┌────────────┐                                    │
│         │ 保留旧数据  │                                    │
│         │ 显示错误提示│                                    │
│         └────────────┘                                    │
└──────────────────────────────────────────────────────────┘

4.3 收藏流程

┌──────────┐     ┌──────────┐     ┌──────────┐
│ F-002    │ ──▶ │ F-007    │ ──▶ │ F-009    │
│ 卡片展示  │     │ 点击收藏  │     │ 持久化   │
└──────────┘     └──────────┘     └──────────┘
      或                               │
┌──────────┐                           ▼
│ F-004    │ ──▶ (同上)          ┌──────────┐
│ 详情页   │                     │ F-008    │
└──────────┘                     │ 收藏管理  │
                                 └──────────┘

5. 版本规划

版本 包含功能 功能ID 目标

| MVP | 3平台内容获取、卡片展示、筛选排序、详情页、自动/手动刷新、收藏系统、API Key配置、刷新间隔设置、API代理层 | F-001 ~ F-011, F-014 ~ F-016 | 跑通核心链路:抖音+TikTok+小红书热点聚合浏览 | | v1.1 | 平台管理、API调用量统计、新增5个P1平台适配器 | F-012, F-017 + P1平台适配 | 扩展至8个平台完善运维功能 | | v2.0 | 展示数量设置、剩余9个P2平台适配器 | F-013 + P2平台适配 | 全平台覆盖17个平台 |


6. 接口契约预览

详细接口定义在 DevelopmentPlan 中,此处仅列出关键接口

功能 接口类型 简要说明
F-001 API (GET) GET /api/tikhub/[platform] — 获取指定平台热榜内容
F-004 API (GET) GET /api/tikhub/[platform]/detail?id=xxx — 获取内容详情
F-005 Event TanStack Query refetchInterval 定时触发
F-006 Event 用户点击 → queryClient.invalidateQueries()
F-007 Store Zustand useFavoritesStore.addFavorite(item)
F-009 Storage Zustand persist → localStorage
F-010 API (POST) POST /api/settings — 保存 API Key
F-014 API (Proxy) Next.js API Route → TikHub APIBearer Token
F-016 Module PlatformAdapter.fetchTrending(platform)ContentItem[]

| F-017 | API (GET) | GET /api/stats — 获取当日 API 调用次数及成本估算 |


附录:用户场景映射

ID 场景 描述 关联功能
US-001 创意灵感获取 每天浏览各平台热点趋势,发现创意表达和内容形式 F-001~F-006
US-002 竞品/行业监控 跟踪特定领域在各平台的热门内容表现 F-001, F-003, F-005, F-006, F-012
US-003 数据分析研究 对比同类内容在不同平台的数据差异 F-001, F-003, F-004, F-013
US-004 内容搬运/分发 发现优质内容后进行跨平台二次创作 F-002, F-004, F-007, F-008