# Dramivio 后端与管理后台复用方案

2026-10-02 · PRD v3.3补充 · 新增框架接入方案，尚未执行兼容PoC。

## 1. 交付范围澄清

现有文档不是只有前端：已定义服务端身份、播放授权、原子扣次、邀请账本、离线订单、续播同步与后台参数。现有可运行展示是前端高保真原型，真实后端尚未实现。之前Hono仅是API框架，不能自动提供管理后台；这一处补充采用成熟后台框架。

## 2. 确定的复用方向

**管理后台采用自托管Payload CMS开源核心；用户登录继续Better Auth；业务API保留Hono。** 不自行建设后台表格、表单、资源上传、基础管理身份和版本浏览。Payload核心为MIT；只用核验为开源的组件，不依赖付费SSO/高级发布工作流。[许可证](https://raw.githubusercontent.com/payloadcms/payload/main/LICENSE.md)、[官方项目](https://github.com/payloadcms/payload)。

这是复用优先的折中：Payload包含Next.js运行时，重量高于单Hono，但省去管理后台建设。初期一个代码仓库、同一PostgreSQL实例，业务API与管理后台可分别两个进程，另有worker；不先拆微服务或引入Kubernetes。不要声称Payload可直接嵌入Hono且零成本。若未来合并HTTP宿主，必须另外验证Better Auth路由/Cookie/任务生命周期，不作为首版前置。

| 能力 | 直接复用 | 必要配置/业务代码 |
|---|---|---|
| 运营列表、表单、分页、媒体上传 | Payload Admin与Collections | 定义字段、双语标签、校验与菜单 |
| 运营身份、会话、密码散列 | Payload官方管理员认证 | 管理账号独立集合，仅管理员可登录；角色矩阵与敏感操作校验 |
| 用户邮箱OTP、会话 | Better Auth官方能力 | SMTP、协议、限流、业务Profile接线 |
| 内容草稿、版本、历史恢复 | Payload Versions/Drafts | 发布前10标签/许可校验；恢复旧稿不能撤销已承诺权益 |
| 数据/字段访问控制 | Payload Access Control | 编写运营/审核/财务/超级管理员权限函数；不是角色开箱即符合业务 |
| 常规内容后台任务 | Payload Jobs | 工作任务定义、运行器、重试/监控；不自动保证扣次或发奖恰好一次 |
| 剧库去重、源接入 | 复用CRUD与任务承载 | 每源适配、统一集映射、去重审核仍需开发 |
| 播放次数与邀请奖励 | PostgreSQL事务/唯一约束 | 原子账本、幂等、资格和风控属于专属业务，不能直接CRUD余额 |
| 播放位置与离线权限 | 框架路由/DB基础 | CAS/epoch、授权订单和补偿状态机仍需开发 |

能力依据：[访问控制](https://payloadcms.com/docs/access-control/overview)、[版本](https://payloadcms.com/docs/versions/overview)、[任务队列](https://payloadcms.com/docs/jobs-queue/overview)、[PostgreSQL](https://payloadcms.com/docs/database/postgres)。版本历史不是覆盖所有后台事件的完整安全审计，登录、拒绝操作、审核、发布与人工调整另外记录不可随意修改的审计事件。

## 3. 数据与权限边界

- Payload管理内容、标签、推荐、广告素材和策略草稿；框架生成CRUD只对运营开放。App/Web不直连管理员CRUD，不暴露源地址、私钥或媒体凭证。
- Better Auth拥有用户认证表；Payload拥有管理员集合；业务模块拥有账本/进度/邀请/离线订单。管理员身份与消费者身份分离，不为用户重复注册第二套账号。两系统迁移各管自己表，不能两套ORM同时迁移同一表。
- 同一数据库实例优先用独立schema或经过实测的表名前缀，分别用最小权限数据库角色。Payload不能任意写用户认证或余额表；任务必须经有权限的业务命令。
- 后台“增加次数/审批奖励/撤权/发布配置”调用同一业务命令与审计逻辑；提供只读账本视图。禁止直接编辑余额、直接改paid状态或删除消费记录。
- 发布把已验证草稿生成不可变policy_version供API读取；在同一业务事务写有效指针及Outbox。框架恢复版本只恢复草稿，再走发布命令；不是直接回滚活跃奖励承诺。
- Payload Local API默认可绕过访问控制，用户触发的调用必须显式传递user并设置overrideAccess:false；后台服务任务用专用角色/命令。只隐藏按钮不算权限。[Local API说明](https://payloadcms.com/docs/local-api/overview)。
- 管理账号必须关闭公开注册、限制后台网络入口、使用强密码及安全会话；MFA只能采用核验开源且兼容的方案，未验证不得宣称内置。不要为此新增自研认证内核。
- 业务Outbox仍与业务事务写入；Payload Jobs可调度worker或处理内容任务，但外部邮件/许可证/奖励结果未知仍按PRD对账。定时器不是事务保障。

### 管理命令身份与发布事务

Payload服务端先验证真实管理员会话和动作权限，再经专用命令适配器调用Hono；不得从请求体/普通Header读取user或role作为可信主体。跨进程复用成熟签名库提供短期、限定aud/用途/动作/操作者/nonce的凭据，业务端验证并重新核对管理员当前权限与会话有效性；仅内网不是身份凭证。nonce重放防护与命令幂等分别处理，网络重试读取原操作结果。浏览器不得持有服务密钥，普通Better Auth消费者身份即使ID相同也无管理权限。禁止自改管理员角色、公开创建管理员；首次引导完成后关闭且重启不重新开启。

发布必须读取并冻结精确draft revision/hash，生成不可变快照；事务CAS校验预期有效版本，提交新指针、Outbox和操作者审计。校验后草稿有变化则拒绝并重新校验，不能提交变化后的未校验内容。Payload保存草稿和业务事务属于不同边界，不能假装一个Payload hook自动让两者原子；失败可按稳定发布操作ID恢复，业务已生效结果是唯一依据。

运行角色与迁移角色分离；Payload运行角色不能写认证表、余额/订单/消费/业务Outbox，不能执行DDL。管理API只允许白名单命令，凭据不提供任意SQL或全库访问。

## 4. 先执行B00后台框架接入关口

依赖D00；先于D07、D18。仅交付最小管理员登录、标签集合、草稿/版本、访问控制及业务发布命令样例，不一次做全部后台。

可复制任务：

> 执行B00。阅读PRD、后端复用方案与工程路线。用精确版本的Payload开源核心及PostgreSQL建立最小管理后台，保留Better Auth用户身份和Hono业务API；禁止自建后台CRUD和认证内核。验证同库表归属/迁移、管理账号隔离、角色权限、Local API不绕过、10双语标签草稿校验及发布版本命令。记录CPU/内存/构建与部署成本；不接付费工作流或SSO。输出真实测试结果与失败项，完成后停止。

验收：

1. 匿名、消费者会话、编辑角色无法调用发布/调整额度接口；绕开UI直接REST/GraphQL/Local API仍拒绝。
2. 管理注册入口关闭；管理员与用户退出/会话互不混用。认证表不被Payload迁移删除。
3. 9/11标签、缺英文、重复id发布失败，现行版本不变；并发发布有明确顺序与审计。
4. 旧稿恢复不立即上线，必须重新校验；策略发布失败不产生半版本，worker重试不重复生效。
5. 审核员只能审查授权范围；财务可读账本不能通过生成CRUD修改余额；人工命令幂等并记录操作者/理由。
6. 两进程重启、数据库恢复、配置回滚可复现；记录最低资源与备份步骤。用户请求高峰不应阻塞后台任务无限堆积。

B00通过后，D07用框架Collections管理剧库与标签；D18配置Payload字段与薄命令页面，不另建整套管理界面。消费账本仍按D08/D16的事务测试验收。

7. 伪造user/role/Header、消费者ID碰撞、服务凭据重放或错aud/动作、管理员撤会话/撤角色后均不能执行命令；分别测试REST、GraphQL、自定义端点与Local API。直接SQL验证运行角色拒写受保护表且不能DDL。
8. 并发修改草稿/发布旧revision时拒绝未校验快照；故障发生在Payload写入后或业务提交后时，重试查询原operation，不重复生效。

## 5. 部署与任务运行约束

Payload Jobs必须明确实际运行器和调度入口：单一调度责任方入队，独立runner执行；不只配置schedule，也不让两套调度重复入队。业务Outbox由业务worker消费，所有重试保持操作幂等。

生产禁自动schema push，迁移按模块归属版本化执行：先兼容新增schema，再服务升级，破坏性清理另一期；失败恢复保留账本事实，不用旧库覆盖已发生交易。B00测试两套迁移不越界删表。

记录Payload/Next、Hono、worker各自内存/CPU/数据库连接池与总连接预算；Cloudflare此次仅承载静态文档，不代表这些后端可直接部署Workers，后端宿主另行验证。
