forked from wangziqi/gongxue-base
feat: add question export foundation
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Taro 前端对接指南
|
||||
|
||||
更新时间:2026-06-28
|
||||
更新时间:2026-06-29
|
||||
|
||||
目标:用一套 Taro 工程同时服务微信小程序和 H5 Web 题库,并采用“Supabase Auth/JWT + `apps/api` 业务 API 优先”的混合架构,支持多租户、品牌主题、地区题库、会员权益、销售追踪和对象存储资源。
|
||||
|
||||
@@ -185,6 +185,7 @@ tenant:<tenantId>:theme
|
||||
| 租户反馈处理 | `GET /api/tenant-admin/feedbacks`、`POST /api/tenant-admin/feedbacks/status`、`GET /api/tenant-admin/feedbacks/events` |
|
||||
| 租户勋章 | `GET/PUT /api/tenant-admin/badges`、`GET/POST /api/tenant-admin/badge-grants` |
|
||||
| 公共题库采纳/同步 | `GET /api/tenant-content/public-question-banks`、`POST /api/tenant-content/public-question-banks/adopt`、`POST /api/tenant-content/public-question-banks/sync` |
|
||||
| 题库导出 | `POST /api/tenant-content/exports/questions`、`GET /api/tenant-content/exports/jobs` |
|
||||
|
||||
## 练习访问控制契约
|
||||
|
||||
@@ -817,6 +818,105 @@ failed:导入结果和目标表不一致,必须提示管理员排查,不
|
||||
- 绑定题目必须提供 `questionId` 或 `legacyQuestionId`。
|
||||
- 生产建议把私有视频先入 `content_assets`,导入时传 `assetId`,避免长期暴露源站 URL。
|
||||
|
||||
## 题库导出对接
|
||||
|
||||
租户后台题库导出统一走后端生成结构化 payload,前端不要直接查 Supabase 表拼导出文件。当前后端已支持 JSON、`paper_json` 和 `print_payload` 三类基础导出,适合先做后台“导出 JSON/试卷预览”功能;PDF/Word 二进制、水印和发布到资料下载后续由 worker 增强。
|
||||
|
||||
可用接口:
|
||||
|
||||
```text
|
||||
POST /api/tenant-content/exports/questions
|
||||
GET /api/tenant-content/exports/jobs
|
||||
```
|
||||
|
||||
导出范围:
|
||||
|
||||
| scopeType | scopeId | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `collection` | `question_collections.id` | 导出某个题目列表或试卷集合 |
|
||||
| `entry` | `content_entries.id` | 导出某个题库入口下全部已发布题目 |
|
||||
| `content_node` | `content_nodes.id` | 导出某个分类节点及其子节点下全部已发布题目 |
|
||||
|
||||
普通题库 JSON 导出:
|
||||
|
||||
```json
|
||||
{
|
||||
"scopeType": "collection",
|
||||
"scopeId": "<questionCollectionId>",
|
||||
"format": "json",
|
||||
"exportType": "questions",
|
||||
"includeAnswers": false,
|
||||
"includeExplanations": false,
|
||||
"options": {
|
||||
"title": "天津专升本题库导出"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
试卷 payload 导出:
|
||||
|
||||
```json
|
||||
{
|
||||
"scopeType": "content_node",
|
||||
"scopeId": "<contentNodeId>",
|
||||
"format": "paper_json",
|
||||
"exportType": "paper",
|
||||
"includeAnswers": true,
|
||||
"includeExplanations": true,
|
||||
"options": {
|
||||
"title": "全真模拟试卷",
|
||||
"durationMinutes": 120,
|
||||
"watermarkText": "仅供内部使用"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
响应关键结构:
|
||||
|
||||
```json
|
||||
{
|
||||
"job": {
|
||||
"id": "...",
|
||||
"status": "completed",
|
||||
"questionCount": 1,
|
||||
"outputHash": "..."
|
||||
},
|
||||
"export": {
|
||||
"_tikuExport": "3.0",
|
||||
"jobId": "...",
|
||||
"summary": {
|
||||
"questionCount": 1,
|
||||
"sectionCount": 1
|
||||
},
|
||||
"sections": [],
|
||||
"questions": [],
|
||||
"files": [
|
||||
{
|
||||
"filename": "天津专升本题库导出.json",
|
||||
"mimeType": "application/json",
|
||||
"encoding": "base64",
|
||||
"contentBase64": "..."
|
||||
}
|
||||
],
|
||||
"renderHints": {
|
||||
"pdfLayout": "paper",
|
||||
"pageSize": "A4",
|
||||
"answerPlacement": "inline_or_appendix"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
前端处理规则:
|
||||
|
||||
- 导出按钮只给具备租户内容编辑权限的后台成员展示;接口仍以后端 `TENANT_CONTENT_EDITOR_REQUIRED` 为准。
|
||||
- 下载 JSON 时使用 `files[0].contentBase64` 生成 Blob,文件名使用后端返回的 `filename`。
|
||||
- `includeAnswers=false` 时,顶层答案字段和阅读理解/案例分析的子题答案都会被后端脱敏;前端不要在本地重新合并答案。
|
||||
- `includeExplanations=false` 时,不展示解析,也不要从题目详情接口额外补解析。
|
||||
- `paper_json` 可先用于后台试卷预览和打印;正式 PDF/Word 导出等后端 worker 完成后再接二进制文件下载。
|
||||
- `GET /api/tenant-content/exports/jobs?scopeType=collection&scopeId=...` 用于后台导出历史;当前记录 metadata 和输出 hash,不长期保存完整导出内容。
|
||||
- 跨租户导出会返回 404 或 403,前端不要重试其它租户 ID。
|
||||
|
||||
## 公共题库采纳对接
|
||||
|
||||
平台超级管理员后台使用:
|
||||
|
||||
Reference in New Issue
Block a user