forked from wangziqi/gongxue-base
feat: export daily practice image packages
This commit is contained in:
@@ -1015,10 +1015,11 @@ failed:导入结果和目标表不一致,必须提示管理员排查,不
|
||||
|
||||
## 题库导出对接
|
||||
|
||||
租户后台题库导出统一走后端生成结构化 payload,前端不要直接查 Supabase 表拼导出文件。当前后端支持两种交付形态:
|
||||
租户后台题库导出统一走后端生成结构化 payload,前端不要直接查 Supabase 表拼导出文件。当前后端支持三种交付形态:
|
||||
|
||||
- 同步结构化导出:`json`、`paper_json`、`print_payload`,接口直接返回 base64 JSON/payload。
|
||||
- 异步二进制导出:`pdf`、`docx`,接口先返回 `pending` job,由 `apps/worker --job exports` 渲染 PDF/Word、水印并写入 `content_assets`,前端轮询 job 后再走资源签名下载或预览。
|
||||
- 异步运营素材包:`daily_practice_zip`,仅支持 `exportType=daily_practice`,worker 会生成九宫格 PNG/SVG 卡片、拼图 PNG/SVG、`manifest.json` 和脱敏后的 `payload.json`,并作为 `asset_type=package` 写入 `content_assets`。
|
||||
|
||||
可用接口:
|
||||
|
||||
@@ -1088,9 +1089,9 @@ PDF/Word 异步导出:
|
||||
}
|
||||
```
|
||||
|
||||
`format` 可为 `pdf` 或 `docx`。`publishToAssets=true` 表示导出文件可作为资料资源展示给对应可见范围用户;不传时默认生成后台私有资源,仅后台可下载。`assetVisibility` 支持 `public`、`tenant`、`members`、`svip`、`private`,生产默认建议用 `tenant/private/svip`,不要轻易公开带题目的文件。
|
||||
`format` 可为 `pdf`、`docx`。`publishToAssets=true` 表示导出文件可作为资料资源展示给对应可见范围用户;不传时默认生成后台私有资源,仅后台可下载。`assetVisibility` 支持 `public`、`tenant`、`members`、`svip`、`private`,生产默认建议用 `tenant/private/svip`,不要轻易公开带题目的文件。
|
||||
|
||||
每日一练运营素材导出:
|
||||
每日一练运营素材导出 PDF/Word:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -1125,7 +1126,52 @@ PDF/Word 异步导出:
|
||||
}
|
||||
```
|
||||
|
||||
`daily_practice` 会自动限制最多 8 道题,并生成第 5 格中央品牌/CTA 位。同步 `json` 导出会返回 `export.dailyPractice.slots`,适合前端做九宫格预览;异步 `pdf/docx` 会由 worker 生成运营素材文件并进入 `content_assets`。图片拼图、ZIP 卡片包和更精细的旧项目同款视觉仍由后续 Taro 操作台继续增强。
|
||||
每日一练图片 ZIP 素材包:
|
||||
|
||||
```json
|
||||
{
|
||||
"scopeType": "collection",
|
||||
"scopeId": "<questionCollectionId>",
|
||||
"format": "daily_practice_zip",
|
||||
"exportType": "daily_practice",
|
||||
"includeAnswers": false,
|
||||
"includeExplanations": false,
|
||||
"limit": 8,
|
||||
"options": {
|
||||
"title": "每日一练 第 2 期",
|
||||
"issue": "每日一练 第 2 期",
|
||||
"date": "2026-06-29",
|
||||
"theme": "default",
|
||||
"cardFormat": "1:1",
|
||||
"publishToAssets": true,
|
||||
"assetVisibility": "tenant",
|
||||
"brand": {
|
||||
"name": "恭学教育",
|
||||
"english": "GONGXUE EDU",
|
||||
"slogan": "专注高职升本",
|
||||
"ctaLine": "每日一练 · 精选八题 · 稳步上岸"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
`daily_practice` 会自动限制最多 8 道题,并生成第 5 格中央品牌/CTA 位。同步 `json` 导出会返回 `export.dailyPractice.slots`,适合前端做九宫格预览;异步 `pdf/docx` 会由 worker 生成运营素材文件并进入 `content_assets`;异步 `daily_practice_zip` 会生成运营图片包,适合租户后台“一键下载每日一练素材”。
|
||||
|
||||
`daily_practice_zip` 产物结构:
|
||||
|
||||
```text
|
||||
manifest.json 导出任务、品牌、主题、文件清单和脱敏策略
|
||||
payload.json 后端导出 payload,遵守 includeAnswers/includeExplanations
|
||||
collage.png 3x3 九宫格拼图
|
||||
collage.svg 拼图 SVG 源文件
|
||||
cards/card-01.png 单张卡片 PNG
|
||||
cards/card-01.svg 单张卡片 SVG 源文件
|
||||
...
|
||||
cards/card-09.png
|
||||
cards/card-09.svg
|
||||
```
|
||||
|
||||
前端只需要轮询导出 job 并下载 ZIP,不需要在 Taro 端重写图片渲染。后台可读取 `manifest.json.files.cards` 做下载后预览;若导出时 `includeAnswers=false`,`payload.json` 和卡片都不会包含答案/解析。
|
||||
|
||||
响应关键结构:
|
||||
|
||||
@@ -1184,14 +1230,14 @@ worker 完成后,`GET /api/tenant-content/exports/jobs` 返回:
|
||||
"items": [
|
||||
{
|
||||
"id": "...",
|
||||
"format": "pdf",
|
||||
"format": "daily_practice_zip",
|
||||
"status": "completed",
|
||||
"assetId": "...",
|
||||
"attemptCount": 1,
|
||||
"outputMetadata": {
|
||||
"delivery": "content_asset",
|
||||
"fileName": "天津专升本模拟试卷.pdf",
|
||||
"mimeType": "application/pdf",
|
||||
"fileName": "每日一练-第-2-期.zip",
|
||||
"mimeType": "application/zip",
|
||||
"sizeBytes": 123456,
|
||||
"checksumSha256": "...",
|
||||
"assetId": "..."
|
||||
@@ -1207,9 +1253,9 @@ worker 完成后,`GET /api/tenant-content/exports/jobs` 返回:
|
||||
- 下载 JSON 时使用 `files[0].contentBase64` 生成 Blob,文件名使用后端返回的 `filename`。
|
||||
- `includeAnswers=false` 时,顶层答案字段和阅读理解/案例分析的子题答案都会被后端脱敏;前端不要在本地重新合并答案。
|
||||
- `includeExplanations=false` 时,不展示解析,也不要从题目详情接口额外补解析。
|
||||
- `paper_json` 可用于后台试卷预览和打印;`pdf/docx` 用于正式文件下载、资料发布和带水印留档。
|
||||
- `paper_json` 可用于后台试卷预览和打印;`pdf/docx` 用于正式文件下载、资料发布和带水印留档;`daily_practice_zip` 用于每日一练运营图片包。
|
||||
- `GET /api/tenant-content/exports/jobs?scopeType=collection&scopeId=...` 用于后台导出历史;结构化导出只记录 metadata 和输出 hash,二进制导出记录 `assetId`、文件名、大小和 checksum。
|
||||
- `status=pending/rendering` 时展示生成中;`completed` 且存在 `assetId` 后,后台可调用 `POST /api/tenant-content/assets/sign-download` 下载,PDF 也可调用 `POST /api/tenant-content/assets/sign-preview` 预览。
|
||||
- `status=pending/rendering` 时展示生成中;`completed` 且存在 `assetId` 后,后台可调用 `POST /api/tenant-content/assets/sign-download` 下载,PDF/图片资源也可调用 `POST /api/tenant-content/assets/sign-preview` 预览。ZIP 包通常直接下载,不做 inline 预览。
|
||||
- 学生资料页只展示 `content_assets.status=active` 且非 `private` 的资源;后台私有导出不会出现在学生资料列表。
|
||||
- 跨租户导出会返回 404 或 403,前端不要重试其它租户 ID。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user