架构

读完本页应能画出:运营后台、消费端、Studio、Go 进程、数据库各自站哪一层,以及鉴权怎么分。

谁调用谁

一个 Go 后端进程同时挂两套面:

  1. 运营后台:Admin 会话 + RBAC
  2. 消费端 BaaS:项目 X-API-Key + 用户 App JWT

Studio(AI 创作)是旁路创作栈:写成片后,由运营在后台手动导入内容库,再走标准上架。它不是第二套内容中台。

运营后台 (platform/admin)
        │  Admin 双 token

┌────────────── 车库 Go(单进程)──────────────┐
│  /api/v1/admin/*          /api/v1/app/* …     │
└───────────────┬──────────────────────────────┘

     ┌──────────┼──────────┐
     ▼          ▼          ▼
 PostgreSQL   Redis    对象存储 (RustFS)

                │  X-API-Key + App JWT
     心跳榜 H5 / Capacitor 壳
     上头短剧 Web + Flutter(开发中)

Studio (platform/studio)
  写成片 → 运营在后台手动导入 catalog → 上架 → 同上 BaaS

为什么这样切

取舍要避开的问题
一个 Go 进程挂 Admin 与 BaaS两套部署各写一遍领域逻辑;项目边界已落在 schema 与 API Key,拆实例可以后做
消费端不引用 platform 内部代码产品和中台绑死,无法独立发版;唯一耦合是 OpenAPI + HTTP
同步只写 ingest 台账外部全量冲进正式库,运营无法挑选与合规门禁
拆集短剧不进视频列表「加入短剧」的分集行污染单集视频管理;老司机「已加入」状态错乱

三层数据

隔离例子
内容层全平台共享catalog.*、ingest 台账
业务层schema-per-project用户、订单、钱包、追剧
分析层共享表 + project_id埋点、漏斗、留存

新建项目会幂等建 project_* schema。请求在事务里设 search_path,连接池不串项目态。

鉴权三套凭证

凭证身份
Admin登录双 token运营账号 + RBAC
App / BaaSX-API-Key项目(心跳榜 / 上头短剧)
App / BaaSAuthorization: Bearer用户(App JWT)
匿名白名单仅 API Key落地页、部分埋点

客户端不传随意的 project_id。项目身份解析顺序与细节见 BaaS 鉴权

前端与工程位置

工程说明
运营后台platform/adminVue 3;动态菜单由后端下发
心跳榜products/beatrank/h5Vue H5;需要 Android 壳时用 Capacitor 打同一套页面
上头短剧products/dramahook/webproducts/dramahook/app目标为响应式 Web + Flutter;仍在开发
AI 创作platform/studioPython FastAPI + Next.js;契约独立,成片入库走 Admin

X-Client-Platform: web | android | ios 只做提示,不改变订单与权益事实。

双契约

文件给谁原则
docs/openapi/openapi.yamlAdmin + 已落地 App 路径已实现即写入,零 stub
docs/openapi/baas-app-v1.yaml下游接入入口先立约;破坏性变更开 v2

Studio 自身 API 不受这两份 YAML 管辖,源码与其导出的 OpenAPI 为准;「成片导入 catalog」仍走主契约。路径规模以仓库文件为准。改 Go 路由必须过 internal/contracttest

基础设施

  • PostgreSQL,迁移在 database/migrations/(up/down 配对)。
  • Redis:Admin 会话、API Key 限流、部分 Feed。
  • 对象存储:现网 RustFS(S3 兼容),见 RustFS
  • 本地:infra/docker + tools/scripts/dev-up.sh

相关页面