跳转到内容

每日日语 · 工程现状分析与内容系统改进计划

每日日语 · 工程现状分析与内容系统改进计划

Section titled “每日日语 · 工程现状分析与内容系统改进计划”

[!IMPORTANT] 文档状态说明(2026-03-28)

这份文档的职责是:说明 当前工程现状与目标之间的差距,帮助团队理解 Yomiya 现有系统离目标内容平台还差什么。

它不是当前执行的唯一主规格。

当前执行请优先阅读:

  1. yomiya-phase1-execution-spec.md
  2. yomiya-canonical-naming.md
  3. yomiya-phase1-scope-boundary.md
  4. yomiya-implementation-spec-core.md
  5. yomiya-phase1-delivery-plan.md

阅读建议:

  • 想理解“为什么现在工程上要做这些事”,看本文档
  • 想知道“现在到底按什么规格执行”,不要只看本文档,要优先看 implementation-spec-core
  • 本文档里出现的 Streak、会员、专题运营控制、多套后台编排能力等 gap,默认理解为终局能力差距,不自动等于 Phase 1 必做项

文档性质:现状调研 × 策略对比 × 改进路径规划 调研仓库IntelliFuture/yomiya-service 对比依据yomiya-content-strategy.md 创建时间:2026-03-26 最后更新:2026-03-27(整合 Codex 三轮评审意见,删除留言区,形成统一文档) 作者:Captain(OpenClaw 主控 AI)


  1. 现有内容相关工程全景
  2. 内容主表及支撑表完整字段清单
  3. API 层完整接口清单
  4. Admin 侧可操作的内容参数清单
  5. 内容相关配置参数清单
  6. 现有内容生产流程
  7. 现状 vs 策划案:Gap 对照表
  8. 现有模型 → 目标模型映射表
  9. 首页改版 MVP:最小工程方案
  10. 完整改进路径(四个阶段)

yomiya-service(Go 主服务)
├── cmd/
│ ├── apiserver/ → HTTP API(客户端 + Admin)
│ ├── consumer/ → MQ 消费者(内容加工流水线)
│ ├── scheduler/ → 定时爬虫调度(内容采集)
│ └── oss-migration/ → 资产迁移工具
├── internal/
│ ├── crawler/ → 5 个图文爬虫(NHK/Watanoc/Hukumusume/Yahoo/Yomu)
│ ├── domain/entity/ → 核心领域模型(News/Sentence/AudioPosition 等)
│ ├── application/ → 业务逻辑(News/Featured/Channel/Scene/ContentImport)
│ ├── repository/ → DB 访问
│ └── infrastructure/ → DB/MQ/OSS/Azure/Google/飞书
└── services/ → 独立微服务
├── youtube-gateway/ → Node.js,YouTube 视频元信息 + 字幕获取
├── japanese-annotator/ → Python,日语假名标注(MeCab/UniDic)
└── craw4ai/ → 规划中的 AI 驱动爬虫
爬虫来源站点内容类型典型内容每日上限
nhkNHK Web Easy图文新闻简单日语新闻,N3 以下配置项控制
hukumusume福娘童话图文故事日本民间故事/童话配置项控制
watanocWatanoc.com图文新闻简单日语新闻配置项控制
yahoo_news_entertainmentYahoo! Japan 娱乐图文新闻娱乐资讯配置项控制
yomujpYomu.jp图文新闻简单日语新闻配置项控制

结论:5 个爬虫全部图文,零视频来源。

1.3 视频处理基础设施(已有但未运营化)

Section titled “1.3 视频处理基础设施(已有但未运营化)”

系统已具备视频内容的技术处理基础设施,但尚未具备运营批量生产能力

已具备未具备
YouTube 视频元信息获取(youtube-gateway 服务)运营批量采集视频
单条视频转录任务链路(transcription_tasks)批量审核与打标工具
Azure Speech 字幕转文字视频合集编排能力
YouTube 字幕直接获取(youtube-gateway)视频首页分发策略
用户手动导入单条视频(content_import 模块)运营侧视频批量导入工具

⚠️ 准确表述:系统已具备”视频内容处理基础设施”,但尚未具备”视频内容运营生产能力”。两者差距较大,不可混淆。


二、内容主表及支撑表完整字段清单

Section titled “二、内容主表及支撑表完整字段清单”
字段类型说明枚举值/备注
idUUID主键
news_idstring原始来源 ID爬虫抓取时为来源站点的唯一标识
titlestring日语标题
title_annotationstring标题假名标注由 japanese-annotator 生成
title_htmlstring标题 HTML(含注音标签)
datestring内容日期(YYYY-MM-DD)
published_attimestamp发布时间
levelint难度等级-1=未分析, 1=N5, 2=N4, 3=N3, 4=N2, 5=N1, 99=N1+
channel_idint64(FK)所属频道channels.id
typestring内容媒体类型webpage / video / audio
sourceenum内容来源news(爬虫)/ imports(用户导入)
visibilityenum可见性INVISIBLE / VISIBLE / MEMBERSHIP_VISIBLE / TIME_LIMIT_VISIBLE / ARCHIVED
news_web_urlstring原文 URL
movie_urlstring视频 URLtype=video 时有效
image_urlstring封面图 URL(旧字段)逐步迁移到 OSS 路径
image_bucket_namestring封面图 OSS bucket
image_object_namestring封面图 OSS 路径
is_resource_migratedboolOSS 迁移标记运维字段

当前 news 表缺失的策划案关键字段

缺失字段说明影响
duration_sec音视频时长无法在列表页显示时长
update_type日更/周更/常青/热点无法按更新属性筛选
topic_tags主题标签(文化/动漫/科技)无法做主题推荐
operator_tags运营标签(樱花季/热点)无法做运营专题
share_card_url金句截图卡片 URL无法支持社交传播
series_id / series_ref所属系列引用无法形成连续更新结构
collection_refs所属合集引用关系无法支持长期货架组织
topic_refs被哪些专题引用无法支持时效编排追踪

注:series_id / collection_refs / topic_refs 不一定都落在 news 表本身,也可以通过关联表实现;这里强调的是工程能力必须可表达这些引用关系,而不是强制单表存储。

字段类型说明
idint64主键
namestring唯一英文标识
display_namestring显示名称
descriptionstring频道描述
img_urlstring频道封面图(旧字段)
image_bucket_namestringOSS bucket
image_object_namestringOSS 路径
is_visiblebool是否在前端显示

缺失字段sort_order(排序)、channel_type(主栏目/子频道)、update_type(日更/周更)、primary_content_type(视频/音频/图文主导)

2.2.1 频道层补充说明:栏目是唯一归属容器

Section titled “2.2.1 频道层补充说明:栏目是唯一归属容器”

对照策略文档,channels 表承载的是一级长期归属容器,而不是首页任意展示模块。 因此在工程实现上需要补充两个明确边界:

  1. channel_id 的语义必须稳定

    • 它表示内容的长期归属栏目
    • 不表示首页某个临时区块,也不表示专题位置
    • 首页 Banner、热门推荐、本周专题等分发位,不能反向写回 channel_id
  2. 首页分发层与内容归属层应解耦

    • Item 的归属通过 channel_id 固定
    • 首页展示通过 Featured / Collections / Topics 等引用关系实现
    • 这样才能满足“每条内容唯一归属一个栏目,同时可被多个合集/专题引用”的策略要求

换言之:channels 是归属层,不是分发层;工程上必须避免混用。

2.3 场景标签表:scenes + news_scenes

Section titled “2.3 场景标签表:scenes + news_scenes”

scenes

字段说明
category大类(如”旅行”)
scene场景(如”机场”)
sub_scene子场景(如”问路”)
available是否可用

news_scenes(关联表):

字段说明
news_id→ news.id
scene_id→ scenes.id
scene_primaryprimary / secondary(主/次场景)

✅ 场景标签体系已有,可直接沿用扩展。

字段说明
idUUID
news_id→ news.id
paragraph_index段落序号
index_in_paragraph段内句子序号
text日语原文
annotation假名标注
htmlHTML 格式
typeTITLE / BODY

2.5 句子翻译层:news_sentence_translations

Section titled “2.5 句子翻译层:news_sentence_translations”
字段说明
sentence_id→ news_sentences.id
language语言代码(en/zh/…)
text翻译文本

2.6 音频对齐层:audio_sentence_offsets + audio_word_offsets

Section titled “2.6 音频对齐层:audio_sentence_offsets + audio_word_offsets”
字段说明
article_id→ news.id
sentence_id→ news_sentences.id
voice_name声音名(ja-JP-NanamiNeural / ja-JP-KeitaNeural)
audio_oss_file_id→ audio_oss_files.id
offset音频偏移(ms)
duration_ms时长(ms)
字段说明
news_sentence_id→ news_sentences.id
text词语文本
lemma原形
begin_offset词语在句子中的起始偏移
length词语长度
part_of_speech词性(int)

2.8 视频转录任务表:transcription_tasks

Section titled “2.8 视频转录任务表:transcription_tasks”
字段说明
url视频/音频 URL
channel_id所属频道
content_typevideo / audio
pluto_user_id发起用户
statusqueued / processing / completed / failed
transcript_type转录类型(word_level / segment_level)
news_id生成的 news 记录 ID
estimated_duration_seconds预估时长(秒)

2.9 用户内容导入表:user_content_imports

Section titled “2.9 用户内容导入表:user_content_imports”
字段说明
pluto_user_id导入用户
channel_id所属频道
content_typevideo / audio
url原始 URL
title内容标题
thumbnail_url缩略图 URL
duration时长(秒)
availability可用性
transcription_task_id→ transcription_tasks.id
news_id→ news.id(转录完成后生成)
字段说明
unique_id去重 ID
statusQUEUED / PROCESSING / DONE / REJECTED / FAILED
dataJSON(RawNewsData 结构,含 type/level/transcript 等)
risk_check_statusHIGH / MEDIUM / LOW / BLOCKED
channel来源频道名

方法路径功能
GET/v1/featured首页精选内容(当前核心分发接口)
GET/v1/news新闻列表(分页)
GET/v1/news/:id新闻详情
GET/v1/news/:id/translations句子翻译
GET/v1/news/:id/audios音频列表
GET/v1/news/:id/audios/:voiceName指定声音的音频
GET/v1/channels频道列表
GET/v1/scenes可用场景列表
GET/v1/categories分类列表
GET/v1/dictionary词典查询
POST/v1/news/:id/explainAI 解析文章
POST/v1/news/sentences/:id/explainAI 解析句子
方法路径功能
GET/v2/news新闻列表(v2版,返回字段有差异)
GET/v2/news/:id新闻详情(v2)
POST/v2/news/:id/explainAI 解析(v2,含配额控制)
GET/v2/explain/quota解析配额查询
方法路径功能
PUT/v1/content/imports导入内容(YouTube URL 等)
GET/v1/content/imports获取用户导入列表
GET/v1/content/imports/:id导入详情
DELETE/v1/content/imports/:id删除导入
PUT/v1/content/transcriptions请求转录
GET/v1/content/transcriptions/:taskId转录状态查询
POST/v1/content/transcriptions/:taskId转录操作(取消等)
方法路径功能
GET/admin/v1/news内容列表(支持按 category/visibility/level/date/search 筛选)
PUT/admin/v1/news/batch批量更新内容
GET/admin/v1/news/:id内容详情
PUT/admin/v1/news/:id更新内容(level/category/visibility/scenes)
DELETE/admin/v1/news/:id删除内容
POST/admin/v1/news/:id/analyze-difficultyAI 难度分析
POST/admin/v1/news/:id/scenes/genAI 场景标签生成
POST/admin/v1/news/:id/upload-image上传封面图
GET/admin/v1/channels频道管理
POST/admin/v1/channels创建频道
PUT/admin/v1/channels/:id更新频道
PATCH/admin/v1/channels/:id/toggle-visibility切换频道可见性
GET/admin/v1/scenes场景管理
POST/admin/v1/scenes创建场景
PUT/admin/v1/scenes/:id更新场景

四、Admin 侧可操作的内容参数清单

Section titled “四、Admin 侧可操作的内容参数清单”

目前后台可以手动操作的内容参数(通过 Admin API):

参数操作方式自动化程度
level(难度等级)手动设置 / AI 自动分析半自动(AI 初判 + 人工确认)
visibility(可见性)手动设置纯手动
category(分类/频道)手动设置纯手动
primary_scenes(主场景标签)手动设置 / AI 自动生成半自动
secondary_scenes(次场景标签)手动设置 / AI 自动生成半自动
image(封面图)手动上传纯手动
句子翻译批量触发翻译队列半自动(触发后自动完成)

当前后台不能操作的字段

  • 主题标签(不存在)
  • 运营标签(不存在)
  • 合集/系列归属(不存在)
  • 内容时长(news 表没有此字段)
  • 标题 A/B 版本(不存在)

4.1 Admin 层缺失的“容器准入”能力

Section titled “4.1 Admin 层缺失的“容器准入”能力”

对照策略文档,后台当前最大缺口之一,不只是“没有合集/系列/专题功能”,而是没有一套显式的容器准入与引用管理能力。这会导致运营虽然能修改内容字段,但无法稳定回答两个关键问题:

  1. 这条内容长期归属哪个栏目
  2. 这条内容还应该被组织进哪些合集 / 系列 / 专题

建议后台未来补充的能力包括:

  • 查看某条内容当前的栏目归属、主题标签、场景标签、难度标签
  • 查看该内容当前被哪些合集引用、被哪个系列收录、被哪些专题使用
  • 在后台中直接执行“加入合集 / 移出合集 / 设为系列内容 / 加入专题”
  • 对运营可见地展示“该内容承担的主要职责”(DAU / 留存 / 转化 / 传播,可先作为运营字段而非算法字段)

补上这层能力后,运营讨论才会真正从“改字段”升级为“做内容编排”。


配置模块关键参数说明
featuredchannels(JSON 数组)首页展示哪些频道及每个频道的条数,决定首页内容分发
crawler.nhkper_fetch_limit / daily_limitNHK 每次抓取数 / 每日上限
crawler.hukumusumeper_fetch_limit / daily_limit同上
crawler.yahoo_news_entertainmentper_fetch_limit / daily_limit同上
crawler.watanocper_fetch_limit / daily_limit同上
crawler.yomujpper_fetch_limit / daily_limit同上
crawlerllm_provider / llm_model内容清洗用的 LLM
content_importmax_video_duration(默认 3600s)视频导入最大时长限制
youtube_gatewaybase_url / tokenyoutube-gateway 微服务地址
speech_synthesisvoice_names(NanamiNeural/KeitaNeural)TTS 合成使用的声音
news_resource_ossbucket_name / object_path新闻封面图 OSS 存储位置
speech_synthesis_ossbucket_name / object_pathTTS 音频 OSS 存储位置
consumertranslation_whitelist / max_concurrency翻译目标语言 / 并发数

🔑 关键发现:首页分发完全由 featured.channels 配置驱动,是纯配置层控制。改变首页哪些频道出现、出现多少条,只需修改配置文件,不需要代码改动


① 定时调度(scheduler)
NHK / Hukumusume / Watanoc / Yahoo / Yomu
→ 写入 raw_news(status=QUEUED)
→ 发送 RabbitMQ 消息
② MQ 消费者(consumer)
→ 风险检查(risk_check_status)
→ AI 内容清洗(LLM 处理标题/正文)
→ 写入 news 表(visibility=INVISIBLE)
→ 触发后续队列:翻译 / 假名标注 / TTS
③ 并行加工(consumer 并发处理)
→ 逐句翻译(Youdao / DeepL / DeepSeek)
→ 假名标注(japanese-annotator Python 服务)
→ AI 难度分析(level 自动打分)
→ Azure TTS 语音合成(男声 + 女声)
→ Google NLP 分句分词(音频文本对齐)
④ 人工审核与发布(Admin 后台)
→ 确认难度等级
→ 更新场景标签
→ 设置可见性(INVISIBLE → VISIBLE)
→ 上传/确认封面图
⑤ 分发到客户端
→ GET /featured 返回 Channel + News 列表
→ 客户端按配置的频道展示内容

视频内容的独立路径(当前)

用户/运营 提交 YouTube URL
→ youtube-gateway 获取视频元信息 + 字幕
→ 创建 transcription_task
→ Azure Speech 转录(或使用 YouTube 字幕)
→ 写入 news 表(source=imports)
→ 同上 ③④⑤ 流程

策划案能力现状Gap 程度处理方式
视频内容采集(NHK World YouTube)无视频爬虫🔴 关键缺口新增视频爬虫,复用现有转录链路
动漫/日剧视频片段🔴 关键缺口新增采集器
热门推荐展示视频合集(≥60%)首页只有单条 news 列表🔴 架构改动新增合集数据模型 + 改首页 API
合集/专题层(Collections)完全缺失🔴 需新增新增 collections + collection_items
主题标签(文化/动漫/科技)完全缺失🔴 需新增新增 topic_tags + news_topic_tags
Streak 打卡与内容消费绑定无留存机制🔴 需新增新增 user_content_views + user_streaks
运营标签(樱花季/热点)完全缺失🔴 需新增新增字段或独立表
NHK Web Easy 图文新闻✅ nhk 爬虫已有直接沿用
难度等级(N5-N1)✅ news.level 已有直接沿用
场景标签✅ scenes + news_scenes 已有直接沿用,补主题标签
内容类型(视频/音频/图文)✅ news.type 字段已有🟡 需暴露前端显示 type 差异化 UI
内容频道/栏目✅ channels 表已有🟡 补字段加 sort_order/channel_type 等字段
音频 TTS✅ Azure TTS 已有直接沿用
翻译(中文)✅ 多引擎翻译已有直接沿用
假名标注✅ japanese-annotator 已有直接沿用
视频内容时长部分(user_content_imports.duration)🟡 补字段同步到 news 表
AI 难度自动分析✅ 已有直接沿用
AI 场景标签生成✅ Admin 接口已有直接沿用
内容 A/B 标题测试🟡 非优先阶段三以后考虑
金句截图卡片🟡 非优先可先做手动生产,后自动化

八、现有模型 → 目标模型映射表

Section titled “八、现有模型 → 目标模型映射表”
目标能力现有基础处理方式工程量
主栏目(≤7个频道)channels复用 + 加字段(sort_order/channel_type/update_type)极小(DDL)
场景标签scenes + news_scenes直接沿用
难度等级news.level(-1/1-5/99)直接沿用
内容类型news.type(webpage/video/audio)沿用 + API 暴露极小
视频时长user_content_imports.duration新增 news.duration_sec 字段极小(DDL+同步)
主题标签新增 topic_tags + news_topic_tags小(DDL + 运营录入)
运营标签新增 news.operator_tags(JSON 字段)或独立表
合集/系列新增 collections + collection_items中(新表 + API + Admin)
首页合集卡片分发FeaturedApplication 返回单条 news新增 GetFeaturedCollections() API
内容消费记录新增 user_content_views中(需 iOS 联动)
Streak 打卡连胜新增 user_streaks 表 + 打卡逻辑中(需 iOS 联动)
视频批量采集单条用户导入链路已通新增 YouTube 批量爬虫小(复用现有链路)

九、首页改版 MVP:最小工程方案

Section titled “九、首页改版 MVP:最小工程方案”

目标:最少改哪些地方,就能让首页从”单条 news 分发”升级为”合集卡片 + 视频主导”?

Step 1:新增 collections 表(约 3 天)

Section titled “Step 1:新增 collections 表(约 3 天)”
CREATE TABLE collections (
id VARCHAR(64) PRIMARY KEY,
created_at DATETIME,
updated_at DATETIME,
deleted_at DATETIME,
title VARCHAR(256) NOT NULL, -- 用"场景/问题"表述
description TEXT,
cover_image_url VARCHAR(512),
channel_id INT NOT NULL, -- 所属主栏目
collection_type VARCHAR(32), -- series(连载)/ topic(专题)
content_type VARCHAR(32), -- video / audio / mixed
sort_order INT DEFAULT 0,
is_featured BOOL DEFAULT FALSE, -- 是否出现在首页热门推荐
visibility VARCHAR(32) DEFAULT 'VISIBLE'
);
CREATE TABLE collection_items (
id INT AUTO_INCREMENT PRIMARY KEY,
collection_id VARCHAR(64) NOT NULL,
news_id VARCHAR(64) NOT NULL,
sort_order INT DEFAULT 0,
UNIQUE KEY uk_collection_news (collection_id, news_id),
INDEX idx_collection_id (collection_id)
);

Step 2:新增 Admin 操作接口(约 2 天)

Section titled “Step 2:新增 Admin 操作接口(约 2 天)”
POST /admin/v1/collections → 创建合集
GET /admin/v1/collections → 合集列表
PUT /admin/v1/collections/:id → 编辑合集(标题/封面/sort_order/is_featured)
POST /admin/v1/collections/:id/items → 向合集添加 news
DELETE /admin/v1/collections/:id/items/:newsId → 从合集移除 news

Step 3:新增首页合集 API(约 1 天)

Section titled “Step 3:新增首页合集 API(约 1 天)”
GET /v1/featured/collections

返回结构:

{
"collections": [
{
"id": "xxx",
"title": "用《鬼灭之刃》学日语",
"cover_image_url": "...",
"content_type": "video",
"collection_type": "series",
"item_count": 12,
"channel": { "id": 5, "name": "anime", "display_name": "动漫日剧" }
}
]
}

Step 4:补充 NHK World 视频爬虫(约 3 天)

Section titled “Step 4:补充 NHK World 视频爬虫(约 3 天)”

复用 youtube_importer.go 现有代码,新增 nhk_world_crawler.go

  • 从配置的 NHK World YouTube 频道/播放列表批量拉取视频 URL
  • 调用现有 youtube-gateway 获取元信息 + 字幕
  • 进入 raw_news 队列,走现有 consumer 处理链路

Step 5:暴露 news.type 到前端(约 0.5 天)

Section titled “Step 5:暴露 news.type 到前端(约 0.5 天)”

确认 /v1/featured/v1/news 返回的数据中包含 type 字段,让前端可以区分视频/音频/图文并展示不同 UI。

MVP 完成标准

  • 运营可以在 Admin 后台创建合集、添加内容、设置封面
  • 首页 API 返回合集列表(≥ 8 个,其中 ≥ 5 个视频合集)
  • 前端可以区分视频/音频/图文展示不同卡片样式

总工程量估算:约 2 周(1 后端开发 × 2 周)


十、完整改进路径(四个阶段)

Section titled “十、完整改进路径(四个阶段)”

阶段 0:配置层快速调整(本周,0 工程量)

Section titled “阶段 0:配置层快速调整(本周,0 工程量)”

不需要写代码,只改配置:

  • 调整 featured.channels 配置,确认首页频道顺序和条数符合策划案
  • 确认各爬虫的 daily_limit 满足每日内容更新需求
  • 验证 news.type 字段在现有 API 响应中正确返回

阶段 1:最小改动,最大收益(1–2 周)

Section titled “阶段 1:最小改动,最大收益(1–2 周)”

DDL 扩展(无需改业务代码):

-- channels 表加字段
ALTER TABLE channels
ADD COLUMN sort_order INT DEFAULT 0,
ADD COLUMN channel_type VARCHAR(32) DEFAULT 'main',
ADD COLUMN update_type VARCHAR(32) DEFAULT 'regular',
ADD COLUMN primary_content_type VARCHAR(32) DEFAULT 'mixed';
-- news 表加字段
ALTER TABLE news
ADD COLUMN duration_sec INT COMMENT '音视频时长(秒)',
ADD COLUMN update_type VARCHAR(32) COMMENT 'daily/weekly/evergreen/trending',
ADD COLUMN operator_tags JSON COMMENT '运营标签数组(如["樱花季","热点"])';

首页改版 MVP(参见第九章,约 2 周):

  • collections + collection_items
  • Admin 合集管理接口
  • 首页合集 API
  • NHK World 视频爬虫

阶段 2:主题标签 + 内容扩充(3–4 周)

Section titled “阶段 2:主题标签 + 内容扩充(3–4 周)”
CREATE TABLE topic_tags (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64) NOT NULL UNIQUE,
name_zh VARCHAR(64),
name_ja VARCHAR(64),
is_visible BOOL DEFAULT TRUE
);
CREATE TABLE news_topic_tags (
id INT AUTO_INCREMENT PRIMARY KEY,
news_id VARCHAR(64) NOT NULL,
topic_tag_id INT NOT NULL,
UNIQUE KEY uk_news_topic (news_id, topic_tag_id),
INDEX idx_news_id (news_id)
);
  • 主题标签表 + Admin 打标接口
  • 动漫/日剧视频采集器
  • JLPT 专区 Channel 配置
  • 前端支持按 type 筛选内容

阶段 3:留存机制(4–8 周,需 iOS 联动)

Section titled “阶段 3:留存机制(4–8 周,需 iOS 联动)”
CREATE TABLE user_content_views (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at DATETIME,
user_id BIGINT NOT NULL,
news_id VARCHAR(64) NOT NULL,
progress_pct TINYINT DEFAULT 0,
is_completed BOOL DEFAULT FALSE,
INDEX idx_user_date (user_id, created_at)
);
CREATE TABLE user_streaks (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL UNIQUE,
current_streak INT DEFAULT 0,
longest_streak INT DEFAULT 0,
last_checkin_date DATE,
streak_freeze_count INT DEFAULT 0,
updated_at DATETIME
);
  • 内容消费进度上报 API(iOS 端调用)
  • 打卡触发逻辑(消费完成 → 当日打卡)
  • Streak 维护逻辑 + 召回通知

阶段 4:精细化(阶段 3 完成后)

Section titled “阶段 4:精细化(阶段 3 完成后)”
  • A/B 标题测试能力
  • 金句截图自动生成
  • AI 个性化推荐(基于消费历史)
  • 内容效果数据看板

含义
-1未分析
1N5(初级)
2N4
3N3(中级)
4N2
5N1(高级)
99N1+(超高级)
含义
INVISIBLE不可见(待审核)
VISIBLE免费可见
MEMBERSHIP_VISIBLE会员可见
TIME_LIMIT_VISIBLE限时可见
ARCHIVED归档
含义
news爬虫抓取
imports用户/运营手动导入
含义
webpage图文网页(默认)
video视频
audio音频

文档版本:v2.0(基于 Codex 评审意见全面修订) 参与:cc(产品)× Captain(OpenClaw 主控 AI)× Codex(AI 深度评审) 创建:2026-03-26 | 最后更新:2026-03-26



十三、改版边界定义(MVP 执行约束)

Section titled “十三、改版边界定义(MVP 执行约束)”

本章整合 Codex 审阅意见,明确边界,防止项目执行发散。

本轮改版继续以 news 为统一内容容器,不在本阶段引入全新主表。

news 表已支持 type = video / audio / webpage,字段体系基本满足 Phase 1 需求。中长期是否演进为更抽象的 content_item 模型,待首页 MVP 跑通后再评估。

禁止在本阶段引入全新内容主表(防止大重构)。

首页 MVP 明确排除以下能力,不得在本阶段加入:

排除项说明
推荐算法首页合集先手工精选,无个性化分发
订阅/追更体系合集先做展示,不做 follow
标题 A/B 测试放到阶段 4
完整个性化分发先按运营编排
全新内容主表继续复用 news 表

13.3 视频比例是运营目标,不是系统约束

Section titled “13.3 视频比例是运营目标,不是系统约束”

“首页 ≥8 个合集,其中 ≥5 个视频合集” = 运营编排目标,不是后端硬校验规则。

后台不需要卡比例,接口不需要强制校验视频数量。这个目标由运营编排和后台配置保证。

本文档是工程差距分析与改造路径文档,不是最终产品形态定义文档。

正确使用方法:

  • 先以 yomiya-content-strategy.md(主策划文档)统一产品目标
  • 再以本文档解释:现状、缺口、阶段化改造路径

本文档不应作为产品最终边界的依据。现有工程有什么,不代表产品最终只能做什么。


十四、内容智能处理引擎 API 设计边界

Section titled “十四、内容智能处理引擎 API 设计边界”

本章整合 Codex 对第十二章的审阅意见,修正 API 定义和工时估算。

14.1 POST /admin/v1/content/analyze 分两层设计

Section titled “14.1 POST /admin/v1/content/analyze 分两层设计”

此接口不应设计为”大而全一次稳定返回”,而是分两层:

第一层:稳定返回(优先保证成功率)

  • 来源类型
  • 标题
  • 时长
  • 发布者/频道
  • 缩略图
  • 字幕可用性
  • 转录/字幕处理策略

第二层:AI 建议(允许为空或置信度不足)

  • 建议栏目
  • 场景标签候选
  • 主题标签候选
  • 难度建议
  • 合集建议
  • 风险提示

这两层必须解耦。第一层失败不影响第二层输出;第二层为空时,人工补全即可,不应阻断流程。

P0 = 飞书对话式分析辅助可立即开始,不等于飞书对话式自动入库已可立即支持。

P0 成立的是:

  • 通过 Captain 在飞书对话中提供分析辅助
  • 通过 prompts 表扩展分析能力

P0 不成立的是:

  • 结构化确认后稳定写入内容主库
  • 通过飞书完成完整入库闭环

两者是分析辅助能力和自动入库能力的区别,不应混淆。

AI 可以给出风险提示(官方频道/公开视频/第三方转载迹象),但:

不能把 copyright_risk = low 视为自动安全。工程和运营侧必须保留人工确认兜底。

以下任务工时需在原估算基础上预留缓冲:

  • POST /admin/v1/content/analyze:结构化输出调试时间 + 第三方来源不稳定兼容时间
  • POST /admin/v1/content/commit:AI 输出解析失败补救 + 联调时间
  • Apple Podcast RSS 解析:各频道格式差异兼容
  • Admin 后台链接分析 UI:异常状态展示 + 人工兜底界面

建议所有工时估算默认乘以 1.5 倍作为计划值。


模块任务负责人工作量前置依赖说明
后端新增 collectionsBackend0.5d含 migration
后端新增 collection_itemsBackend0.5d含索引
后端Admin 合集 CRUD APIBackend1dcollections 表管理合集标题/封面/排序
后端Admin 合集内容绑定 APIBackend0.5dcollection_items 表添加/移除 news
后端/v1/featured/collections 接口Backend0.5dcollections + items首页合集列表
后端news.type 字段确认返回Backend0.5d供前端识别样式
后端NHK World 批量视频采集器Backend2–3dyoutube-gateway复用现有导入链路
Admin合集管理页Admin FE/BE1–2dCRUD API可创建、编辑、排序、设封面
iOS首页合集区 UIiOS1–2dfeatured collections API新增合集卡片区
iOS卡片按 content_type 区分样式iOS0.5–1dtype 字段返回视频/音频/图文样式差异
运营准备首批 8 个合集Content Ops2–3dAdmin 可用至少 5 个视频合集
运营为合集制作封面与标题Content Ops1–2d合集结构确定保证首页展示质量

文档性质:工程现状分析与改造路径文档 参与:cc(产品负责人)× Captain(OpenClaw 主控 AI)× Codex(AI 深度评审) 创建时间:2026-03-26 | 最后更新:2026-03-27 注意:本文档是工程辅助文档,产品最终形态定义以 yomiya-content-strategy.md 为准