feat: 07 创作者中心批 4(数据看板,只读)

为什么:创作者在后台能看到自己的作品与定价了,但看不到"有没有人看、有没有收入"。
本批补一个只读看板,数据全部按 drama.creator_id = 当前创作者 收敛,取不到的一律 null + notes。

- 新增 CreatorDashboardService(放 admin-api):和 3-3 的运营大盘同样的理由 —— 跨内容/播放/互动/交易
  四域取数,建模块只会把依赖摊开一层;归属解析复用 CreatorCenterService.requireCurrentCreator(),
  接口不接收 creatorId
- 新增 GET /admin/creator-center/dashboard(权限点 creator-center:stat:view)
- 口径(逐条写进代码注释与 docs/api-phase1.md):viewTotal/playTotal 是短剧表累计计数;
  watchedDramas/finishedDramas 来自 watch_progress(该表唯一索引是 user_id + drama_id,
  每用户每剧一条续看进度,**不是按集**,所以字段名按「用户 × 剧」命名);
  playEvents7d/playEventsTotal 是 watch_history 流水;finishEvents 是流水中 position>=duration 的完播事件;
  favoriteTotal/commentTotal/commentPending 是我的作品的互动;unlockCount/coinIncome 取
  entitlement(source=ORDER) 与 coin_ledger(UNLOCK, biz_id=我的分集)
- paidOrderAmount 与 daily 恒为 null:前者要等 Apple/Google 商店接入,后者 creator_stat_daily 表已建但无产出任务
- 权限点 creator-center:stat:view(创作者角色 + 超管)

实测:看板输出与 SQL 手工口径逐项一致;乙的看板只有自己的数(甲 1200 播放 / 2 条评论 / 50 金币未串过去)。
This commit is contained in:
Vicky committed 2026-10-15 14:28:29 +08:00
1 parent 8b8ebf944f
commit b0fea1d237
4 files changed
+253 -4

No files matched your search

+26 -1
View File
@@ -436,7 +436,32 @@ POST /app/auth/register
定价沿用「可编辑状态」口径:`draft` / `offline` 可改,已上线要改价需先申请下线(避免创作者悄悄改已上线内容的价格);
`dramaId` 以路径为准,body 里传别人的剧 id 无效,列表里带别人的 `episodeId` 会被忽略(只作用于自己剧的分集)。
**进度**:批 4(创作者数据看板)、批 5(前端页面)未开始。
**创作数据看板(批 4,只读)**
| 方法 | 路径 | 权限点 | 说明 |
| --- | --- | --- | --- |
| GET | `/admin/creator-center/dashboard` | `creator-center:stat:view` | 播放 / 完播 / 收藏 / 评论 / 解锁收入概览 |
**口径**(与代码注释一致,前端 tooltip 可直接复用;统计范围只含 `drama.creator_id = 当前创作者`)
| 分组 | 指标 | 口径 |
| --- | --- | --- |
| 作品 | `total` / `draft` / `reviewing` / `approved` / `published` / `offline` | 我的短剧按 `status` 计数(当前快照) |
| 作品 | `episodeTotal` / `episodeWithMedia` | 我的分集总数 / `video_url` 非空数 |
| 播放 | `viewTotal` / `playTotal` | 短剧表累计计数列求和(**累计口径,不限时间**) |
| 播放 | `watchedDramas` / `finishedDramas` / `finishRate` | `watch_progress` 是按「用户 × 剧」存的续看进度(唯一索引 `user_id + drama_id`),所以是**有多少人看过我的剧** / 其中最近一次标记完播的 / 完播率;**不是按集** |
| 播放 | `playEvents7d` / `playEventsTotal` | `watch_history` **流水口径**(近 7 天 / 全部),与累计口径不可相加 |
| 播放 | `finishEvents` | `watch_history` 中 `position_ms >= duration_ms` 的完播事件数(流水口径) |
| 互动 | `favoriteTotal` | `user_favorite` 指向我作品的行数 |
| 互动 | `commentTotal` / `commentPending` | `content_comment` 中属于我作品的评论数 / 其中待审数 |
| 收入 | `unlockCount` | `entitlement` 中 `source=ORDER` 且剧属于我的记录数(人工补发的 `ADMIN` 权益不计) |
| 收入 | `coinIncome` / `coinIncome7d` | `coin_ledger` 中 `biz_type=UNLOCK` 且 `biz_id` 命中我分集的扣币绝对值合计(全部 / 近 7 天) |
| 收入 | `paidOrderAmount` | **暂无数据源**,恒为 `null`:金币解锁不产生法币订单,真实金额要等 Apple/Google 商店接入 |
| 趋势 | `daily` | **暂无数据源**,恒为 `null`:`creator_stat_daily` 表已建但无产出任务 |
取不到的一律 `null` 并在 `notes` 说明缺什么、怎么补,**不用 0 冒充**(与运营大盘同口径)。
**进度**:批 5(前端页面)未开始。
## 3. 契约与实现状态对照