短剧应用在源码中的领域名是 ve。它同时处理内容运营、媒体播放和用户权益:租户后台管理剧目与分集,用户端提供发现、详情、追剧和播放,服务端在每次播放前重新校验剧目状态与购买权益。
代码与入口
| 层次 | 源码位置 | 主要职责 |
|---|---|---|
| PC 用户端 | pc/pages/ve、pc/api/ve.ts |
剧目列表、详情和播放入口 |
| 移动用户端 | uniapp/src/packages/pages/ve |
短剧首页与播放器 |
| 租户后台 | tenant/src/views/ve |
剧目、分集和订单管理 |
| 用户 API | server/app/api/*/ve |
分类、剧目、分集、发现流、追剧、历史与下单 |
| 领域服务 | server/app/common/service/ve |
安装同步和 VOD 播放地址签名 |
核心领域对象
| 对象 | 作用 | 关键约束 |
|---|---|---|
VeCategory / VeDramaCategory |
维护分类及剧目多对多关系 | 分类调整不改变用户已购权益 |
VeDrama |
保存剧目、价格、免费集数、上下架与统计 | 下架后不能继续新购或播放受限分集 |
VeEpisode |
保存分集顺序和媒体地址 | 分集必须属于当前剧目,顺序在剧目内唯一 |
VeDiscover |
提供短视频式发现内容 | 只返回当前可播放的媒体资源 |
VeUserRecord |
保存追剧状态和最后观看位置 | 一名用户对一部剧保持一条汇总记录 |
VeOrder |
保存整剧解锁订单和支付事实 | 同一用户已购买后不重复创建付费订单 |
上架、购买与播放
flowchart LR
Admin[租户后台] --> Drama[创建剧目与分类]
Drama --> Episodes[维护分集和媒体地址]
Episodes --> Publish[上架]
User[用户选择分集] --> Check[校验剧目 / 分集状态]
Check --> Free{是否免费集}
Free -- 是 --> Sign[签发短期播放地址]
Free -- 否 --> Entitlement{是否已购买整剧}
Entitlement -- 否 --> Order[创建解锁订单]
Order --> Pay[统一支付]
Pay --> Sign
Entitlement -- 是 --> Sign
Sign --> Play[播放并记录进度]
剧目通过 free_episodes 定义试看范围。请求收费分集时,API 查询该用户是否存在已支付的剧目订单;校验通过后,VeVodService 才生成播放地址。购买的是剧目访问权益,不是某个永久 URL,因此媒体域名、签名策略或存储供应商变化时不需要改写历史订单。
追剧和观看历史保存在 VeUserRecord 中,用户可以查看关注列表和最近观看内容。进度或统计更新失败不应中断播放,但权益校验、剧目上下架和媒体签名失败必须阻止受限资源下发。
媒体与运行边界
- 原始媒体、转码任务、业务剧目和播放地址应分开建模;
- VOD 回调需要按远端任务号幂等处理,并允许乱序到达;
- 播放地址只短期有效,不能把对象存储永久地址直接返回给客户端;
- 旧视频源不可用时,系统应暂停播放和付费,不能继续出售无法交付的内容;
- 剧目、分集、订单和观看记录都应带租户范围,媒体对象路径也应使用租户命名空间;
- 播放、收藏和历史属于高频写入,可异步聚合统计,但购买权益必须由事实订单同步判断。
后续完善
当前模型已经覆盖分类、剧目、分集、发现、追剧、历史和整剧购买。后续适合补充独立媒体任务表、转码回调、失败重试、清晰度与字幕资源、单集购买策略、播放心跳以及 CDN/VOD 成本监控。