feat: export daily practice image packages

This commit is contained in:
Codex
2026-06-29 17:40:10 +08:00
parent 60501a0f70
commit a68b4ab9e3
16 changed files with 809 additions and 62 deletions

View File

@@ -70,7 +70,7 @@ POST /api/tenant-content/assets/sign-preview
npm --workspace @tiku-saas/worker run assets:once
```
题库 PDF/Word 导出 worker
题库 PDF/Word/每日一练 ZIP 导出 worker
```bash
npm --workspace @tiku-saas/worker run exports:once
@@ -91,16 +91,16 @@ npm --workspace @tiku-saas/worker run exports:once
## 题库导出生成资源
题库导出 PDF/Word 不走前端上传,而是由后端和 worker 自动进入资源台账:
题库导出 PDF/Word/每日一练 ZIP 不走前端上传,而是由后端和 worker 自动进入资源台账:
1. 租户后台调用 `POST /api/tenant-content/exports/questions``format=pdf``format=docx`
1. 租户后台调用 `POST /api/tenant-content/exports/questions``format=pdf``format=docx``format=daily_practice_zip`
2. API 校验租户内容权限、导出范围和答案/解析开关,创建 `content_export_jobs.status=pending`
3. `apps/worker --job exports` 抢占 pending job复用后端导出 payload 规则渲染 PDF/Word应用 `options.watermarkText` 水印。
3. `apps/worker --job exports` 抢占 pending job复用后端导出 payload 规则渲染 PDF/Word或为每日一练生成 ZIP 素材包PDF/Word 会应用 `options.watermarkText` 水印ZIP 包会包含 PNG/SVG 卡片、拼图、manifest 和脱敏 payload
4. worker 将二进制文件写入配置的对象存储。`local_dev` 会写入 `EXPORT_LOCAL_STORAGE_ROOT`,生产建议使用 `supabase_storage``aliyun_oss``tencent_cos`
5. worker 创建 `content_assets`,设置 `uploadStatus=verified`,并把 `assetId`、文件名、大小和 SHA-256 回填到 `content_export_jobs.output_metadata`
6. 前端轮询 `GET /api/tenant-content/exports/jobs`,拿到 `assetId` 后通过 `POST /api/tenant-content/assets/sign-download``sign-preview` 下载/预览。
注意PDF/Word 文件本身不直接存入数据库,数据库只保存 job、资源台账和校验 metadata。
注意PDF/Word/ZIP 文件本身不直接存入数据库,数据库只保存 job、资源台账和校验 metadata。`daily_practice_zip` 资源类型为 `package`,通常只做签名下载,不做 inline 预览。
确认上传示例: