feat: add import template downloads

This commit is contained in:
Codex
2026-06-29 14:02:38 +08:00
parent c07c9866f2
commit 215cbd05f7
8 changed files with 65 additions and 20 deletions

View File

@@ -64,7 +64,7 @@ pages/tenant-admin/marketing/index 优惠券、激活码、CRM、分佣摘要
pages/tenant-admin/settings/index 品牌、域名、支付、登录、角色模板
```
当前后台页面已经从只读联调推进到第一批运营写操作。题库内容页已接入公共题库采纳、公共题库同步、同步冲突查看、单条采纳平台版本/保留本地版本、导入任务详情、异步任务轮询、导入问题查看、模板预览、导入后复检详情,以及 JSON/CSV/Excel 的 H5 选择文件或粘贴内容、后端预览、字段别名覆盖和同步/异步执行导入第一版;营销、设置和学生页仍以扫描和轻量操作为主。真正权限以后端 permission keys 为准,前端菜单隐藏只做体验优化。
当前后台页面已经从只读联调推进到第一批运营写操作。题库内容页已接入公共题库采纳、公共题库同步、同步冲突查看、单条采纳平台版本/保留本地版本、导入任务详情、异步任务轮询、导入问题查看、模板预览/下载、导入后复检详情,以及 JSON/CSV/Excel 的 H5 选择文件或粘贴内容、后端预览、字段别名覆盖和同步/异步执行导入第一版;营销、设置和学生页仍以扫描和轻量操作为主。真正权限以后端 permission keys 为准,前端菜单隐藏只做体验优化。
## 当前平台后台页面

View File

@@ -97,6 +97,33 @@ function openH5FilePicker(format: ImportSourceFormat) {
});
}
function base64ToUint8Array(base64: string) {
const binary = atob(base64);
const bytes = new Uint8Array(binary.length);
for (let index = 0; index < binary.length; index += 1) {
bytes[index] = binary.charCodeAt(index);
}
return bytes;
}
function downloadTemplateFile(template: ImportTemplateItem) {
if (process.env.TARO_ENV !== 'h5' || typeof document === 'undefined') {
throw new Error('当前端暂不支持直接下载模板,请先使用模板预览。');
}
if (!template.contentBase64) throw new Error('模板内容为空,请重新加载模板。');
const blob = new Blob([base64ToUint8Array(template.contentBase64)], {
type: template.mimeType || 'application/octet-stream',
});
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = template.fileName || `import-template.${template.format || 'json'}`;
document.body.appendChild(link);
link.click();
link.remove();
URL.revokeObjectURL(url);
}
function safeJsonPreview(value: unknown, maxLength = 360) {
try {
return JSON.stringify(value, null, 2).slice(0, maxLength);
@@ -246,14 +273,15 @@ export default function TenantContentPage() {
}
}
async function previewTemplate(type = selectedImportType) {
async function previewTemplate(type = selectedImportType, format = sourceFormat) {
setError('');
try {
const [mappingPayload, templatePayload] = await Promise.all([
loadImportFieldMapping(type),
loadImportTemplate(type, 'json'),
loadImportTemplate(type, format === 'excel' ? 'csv' : format),
]);
setSelectedImportType(type);
if (format !== 'excel') setSourceFormat(format);
setMapping(mappingPayload.item || null);
setMappingOverrides(Object.fromEntries(
(mappingPayload.item?.fields || [])
@@ -266,6 +294,21 @@ export default function TenantContentPage() {
}
}
async function downloadCurrentTemplate() {
setError('');
try {
const payload = template && template.importType === selectedImportType && template.format === sourceFormat
? { item: template }
: await loadImportTemplate(selectedImportType, sourceFormat === 'excel' ? 'csv' : sourceFormat);
if (!payload.item) throw new Error('模板不存在。');
downloadTemplateFile(payload.item);
setTemplate(payload.item);
Taro.showToast({ title: '已下载', icon: 'success' });
} catch (nextError) {
setError(nextError instanceof Error ? nextError.message : '模板下载失败');
}
}
async function chooseImportFile() {
setError('');
try {
@@ -510,7 +553,7 @@ export default function TenantContentPage() {
</View>
<View className='admin-tabs'>
{importTypes.map(type => (
<Button key={type} className={`admin-button ${selectedImportType === type ? 'active' : ''}`} onClick={() => previewTemplate(type)}>{type}</Button>
<Button key={type} className={`admin-button ${selectedImportType === type ? 'active' : ''}`} onClick={() => previewTemplate(type, sourceFormat)}>{type}</Button>
))}
</View>
<View className='admin-tabs'>
@@ -519,6 +562,7 @@ export default function TenantContentPage() {
setSourceFormat(format);
setPreviewResult(null);
setIssues([]);
previewTemplate(selectedImportType, format);
}}>{format}</Button>
))}
</View>
@@ -550,6 +594,7 @@ export default function TenantContentPage() {
setPreviewResult(null);
setIssues([]);
}}></Button>
<Button className='admin-button' onClick={downloadCurrentTemplate}></Button>
</View>
<View className='admin-grid'>
<View className='admin-metric'><Text className='admin-metric-label'></Text><Text className='admin-metric-value'>{selectedJobId ? selectedJobId.slice(0, 8) : '-'}</Text></View>

View File

@@ -32,10 +32,10 @@
| 会员与订单 | 可联调 | 下单、订单详情/状态轮询、优惠券领取/抵扣、零元订单自动开通、手工确认权限保护、激活码预检查/兑换、微信支付、支付宝、微信/支付宝发起退款、微信/支付宝退款查询确认、微信/支付宝退款通知 webhook、支付/退款补偿 worker、权益发放 | 完整资金流水对账、异常订单运营台 |
| 登录认证 | 可联调 | 短信 mock、阿里云/腾讯云短信 adapter、迁移期 session、Supabase Auth JWT、微信小程序登录、微信网页登录、QQ 登录、手机号绑定/换绑、OAuth 配置表 | 真实生产账号和回调域名联调 |
| 销售/代理/CRM | 基础完成 | 邀请码、首绑保护、团队关系、销售统计、CRM 入队 | 小程序码真实生成、分佣结算、钉钉/飞书/企微 worker |
| 内容导入 | 可联调 | 题目、单词、知识手册、分数线、视频 JSON/CSV/Excel preview/import、issue、job/detail、审计、幂等、`executionMode=async`、imports worker、导入后复检、模板下载、字段映射 API、字段映射覆盖白名单校验、PocketBase JSON dry-run 报告Taro 租户内容页已接上传/粘贴预览、字段别名编辑、同步/异步执行、异步轮询和复检详情第一版 | 模板文件下载按钮、真实数据 dry-run 执行验收、抽样校验和导入性能压测 |
| 内容导入 | 可联调 | 题目、单词、知识手册、分数线、视频 JSON/CSV/Excel preview/import、issue、job/detail、审计、幂等、`executionMode=async`、imports worker、导入后复检、模板下载、字段映射 API、字段映射覆盖白名单校验、PocketBase JSON dry-run 报告Taro 租户内容页已接上传/粘贴预览、模板文件下载、字段别名编辑、同步/异步执行、异步轮询和复检详情第一版 | 真实数据 dry-run 执行验收、抽样校验和导入性能压测 |
| 数据看板 | 可联调 | 租户 dashboard 聚合接口收益、注册、学习、内容、激活码、反馈、趋势、24h 活跃、套餐销量和运营动态 | 预聚合 worker、缓存、慢 SQL 监控和销售转化看板 |
| AI 择校推荐 | 未开始 | 暂无 | 数据上下文、AI JSON schema、报告渲染、PDF 生成 |
| Taro 前端 | 地基已建 | `apps/taro` 已有 Taro 4 React 工程、H5 三入口、租户解析、统一 API client、Supabase Auth client 初始化;学生端、租户后台和平台后台均已有第一批真实 API 页面;学生端已接地区选择、错题/收藏复习、题目反馈、视频解析、练习/模考报告、收银台、订单详情和售后入口第一版;平台后台已接关键写操作第一版,租户内容页已接公共题库采纳/同步、冲突查看、单条采纳平台/保留本地、导入问题、字段模板、上传/粘贴预览、字段别名覆盖、同步/异步导入、异步轮询和复检详情第一版 | 刷题细节 UI、租户后台模板下载按钮/冲突批量处理、平台后台审计/详情增强、小程序兼容验证和端到端测试 |
| Taro 前端 | 地基已建 | `apps/taro` 已有 Taro 4 React 工程、H5 三入口、租户解析、统一 API client、Supabase Auth client 初始化;学生端、租户后台和平台后台均已有第一批真实 API 页面;学生端已接地区选择、错题/收藏复习、题目反馈、视频解析、练习/模考报告、收银台、订单详情和售后入口第一版;平台后台已接关键写操作第一版,租户内容页已接公共题库采纳/同步、冲突查看、单条采纳平台/保留本地、导入问题、字段模板预览/下载、上传/粘贴预览、字段别名覆盖、同步/异步导入、异步轮询和复检详情第一版 | 刷题细节 UI、租户后台冲突批量处理、平台后台审计/详情增强、小程序兼容验证和端到端测试 |
## 前端接入建议
@@ -79,7 +79,7 @@
- 对象存储:上传/下载签名已接入阿里云 OSS、腾讯云 COS、Supabase Storage上传确认、PDF/图片预览签名和 assets worker 复检已完成,继续补 PDF 渲染、视频播放防盗链、杀毒扫描和水印。
- 真实数据 dry-run导出 PocketBase 用户、题库、单词、知识手册、分数线、订单、权益,先跑 `npm run pb:import:dry-run`,再跑迁移和校验报告。
- 生产环境配置:`.env.example``npm run readiness:production` / `npm run readiness:production:db` 已补;继续补数据库迁移流程、备份恢复、日志、告警和 API 容器部署说明。
- Taro scaffold`apps/taro` 地基已建立;学生端、租户后台、平台后台第一批 H5 页面已接真实 API学生端已接地区选择、错题/收藏复习、题目反馈、视频解析、练习/模考报告、收银台、订单详情和售后入口第一版,平台后台关键写操作第一版已接入,租户内容页已接公共题库采纳/同步、冲突查看、单条采纳平台/保留本地、导入问题、字段模板、上传/粘贴预览、字段别名覆盖、同步/异步导入、异步轮询和复检详情第一版;下一步补刷题细节 UI、租户后台模板下载按钮/冲突批量处理、平台后台审计增强和小程序兼容验证。
- Taro scaffold`apps/taro` 地基已建立;学生端、租户后台、平台后台第一批 H5 页面已接真实 API学生端已接地区选择、错题/收藏复习、题目反馈、视频解析、练习/模考报告、收银台、订单详情和售后入口第一版,平台后台关键写操作第一版已接入,租户内容页已接公共题库采纳/同步、冲突查看、单条采纳平台/保留本地、导入问题、字段模板预览/下载、上传/粘贴预览、字段别名覆盖、同步/异步导入、异步轮询和复检详情第一版;下一步补刷题细节 UI、租户后台冲突批量处理、平台后台审计增强和小程序兼容验证。
### P1商用收费和运营能力
@@ -87,7 +87,7 @@
- XPay 或其它实际支付网关 adapter。
- 阿里云/腾讯云短信、微信小程序登录、微信网页登录、QQ 登录真实账号联调。
- 公共题库/地区题库自动同步 worker 已具备单批执行能力,租户后台已有单条冲突采纳平台/保留本地操作;继续补版本通知、批量处理,以及租户按 SaaS 套餐购买地区、科目和题库范围的更细计费策略。
- 导入模板、字段映射、导入任务详情和复检 API 已可用Taro 租户内容页已接字段别名覆盖、导入执行、异步 job 轮询和复检结果面板第一版。前端继续补模板下载按钮、真实导入目标选择体验和大数据量导入验收。
- 导入模板、字段映射、导入任务详情和复检 API 已可用Taro 租户内容页已接模板下载、字段别名覆盖、导入执行、异步 job 轮询和复检结果面板第一版。前端继续补真实导入目标选择体验和大数据量导入验收。
- 视频深度防盗链、动态水印和播放统计。
- 数据看板 API收益、注册趋势、答题次数、收入趋势、题型分布、题目总量、套餐销量、24h 活跃。

View File

@@ -398,5 +398,5 @@ GET /api/tenant-content/imports/post-check?jobId=<jobId>
## 下一步
- 已补 `npm run pb:import:dry-run` 静态报告工具;拿到真实 PocketBase 全量导出数据后做多轮 dry-run并把 dry-run 报告、正式导入报告和复检报告作为上线验收材料。
- Taro 租户内容页已接可视化字段映射第一版、导入 job 详情/轮询、逐行 issue 展示和复检结果面板;继续补模板下载按钮和完整目标入口/集合选择表单。
- Taro 租户内容页已接模板下载、可视化字段映射第一版、导入 job 详情/轮询、逐行 issue 展示和复检结果面板;继续补完整目标入口/集合选择表单。
- 后续按大租户数据量补导入任务分页预览、抽样校验和导入性能压测。

View File

@@ -26,7 +26,7 @@
## 当前可进入的前端工作
- `apps/taro` 已经建立,且学生端第一批 H5 页面已经可构建:登录、首页、地区选择、题库、练习、错题/收藏、练习报告、视频解析、会员收银台、订单详情、背单词、知识手册、分数线、资料、个人中心。
- 租户后台第一批 H5 页面已经可构建:工作台、数据看板、学生/班级、题库内容、营销中心、租户设置;题库内容页已具备公共题库采纳/同步、冲突查看、单条采纳平台版本/保留本地版本、导入任务详情、异步轮询、导入问题查看、模板预览、导入后复检详情、JSON/CSV/Excel 选择文件或粘贴内容、后端预览、字段别名覆盖和同步/异步执行导入的第一版操作能力。
- 租户后台第一批 H5 页面已经可构建:工作台、数据看板、学生/班级、题库内容、营销中心、租户设置;题库内容页已具备公共题库采纳/同步、冲突查看、单条采纳平台版本/保留本地版本、导入任务详情、异步轮询、导入问题查看、模板预览/下载、导入后复检详情、JSON/CSV/Excel 选择文件或粘贴内容、后端预览、字段别名覆盖和同步/异步执行导入的第一版操作能力。
- 平台后台第一批 H5 页面已经可构建:工作台、租户管理、账务中心、公共题库授权。
- 可以继续复刻旧题库学生端主要视觉和交互:刷题细节、勋章展示和小程序端分享/支付体验。地区选择、视频解析、题目反馈、模考/练习报告、错题复习、收藏复习、商城收银台、订单详情和售后入口已经有第一版页面。
- 可以按新后端主模型接入内容导航:
@@ -47,7 +47,7 @@
- 不要把“Supabase 支持前端 Data API”误解为“本项目所有业务表都由 Taro 直写”订单、支付、权益、租户后台、导入、CRM、私有资源必须走 RPC、`apps/api`、Edge Function 或 worker 这类后端命令层。
- 短信、微信小程序/网页登录、QQ 登录、微信支付、支付宝支付 provider 已有本地 adapter 和测试覆盖;生产账号、回调域名、证书和商户资料仍需正式联调。
- 对象存储已完成签名 provider、上传后校验、PDF/图片预览和资源复检 worker但 CDN 防盗链、视频水印和杀毒扫描还要补。
- 题目/单词/知识手册/分数线/视频 JSON/CSV/Excel 导入已可联调;大批量导入可传 `executionMode=async` 交给 imports worker模板下载、字段映射 API、导入任务详情和导入后复检已可用。租户内容页已经可以选择文件或粘贴内容、执行后端预览、编辑本次字段别名、同步/异步提交导入、轮询异步 job、查看问题行并触发/查看复检;后续还要补模板文件下载按钮、真实数据 dry-run 验收和更完整的目标入口/集合选择。
- 题目/单词/知识手册/分数线/视频 JSON/CSV/Excel 导入已可联调;大批量导入可传 `executionMode=async` 交给 imports worker模板下载、字段映射 API、导入任务详情和导入后复检已可用。租户内容页已经可以选择文件或粘贴内容、下载模板、执行后端预览、编辑本次字段别名、同步/异步提交导入、轮询异步 job、查看问题行并触发/查看复检;后续还要补真实数据 dry-run 验收和更完整的目标入口/集合选择。
- 数据看板、分佣结算和勋章手动发放基础 API 已可联调;勋章自动发放、分佣真实打款/导出/凭证、AI 择校、主题模板市场等仍是后续商用增强项。
## 前后端协作建议
@@ -91,7 +91,7 @@
| 营销中心 | `apps/taro/src/pages/tenant-admin/marketing/index.tsx` | `tenant-admin/coupons``code-batches``activation-codes``crm/queue``commission/summary` |
| 租户设置 | `apps/taro/src/pages/tenant-admin/settings/index.tsx` | `tenant-admin/overview``domains``payment-accounts``auth-providers``role-templates` |
当前租户后台已有第一批运营操作:题库内容页支持公共题库采纳/同步、同步冲突查看、单条采纳平台版本/保留本地版本、导入任务详情、异步 job 轮询、导入问题查看、字段映射/模板预览、JSON/CSV/Excel 导入预览和执行、字段别名覆盖和导入后复检详情。下一批需要继续补完整后台写入表单、模板文件下载按钮、冲突批量处理、学生批量导入、角色模板配置 UI 和权限驱动菜单。
当前租户后台已有第一批运营操作:题库内容页支持公共题库采纳/同步、同步冲突查看、单条采纳平台版本/保留本地版本、导入任务详情、异步 job 轮询、导入问题查看、字段映射/模板预览/下载、JSON/CSV/Excel 导入预览和执行、字段别名覆盖和导入后复检详情。下一批需要继续补完整后台写入表单、冲突批量处理、学生批量导入、角色模板配置 UI 和权限驱动菜单。
## 已落地的 Taro 平台后台页面

View File

@@ -58,7 +58,7 @@
| 优惠券 | 已覆盖 | 后台配置、前台领取、同用户同券幂等、下单抵扣、全额优惠自动开通权益已有;复杂活动规则和核销报表待补 |
| 激活码 | 已覆盖 | 批次、生成、预检查、兑换、自用码拒绝、地区校验主链路已有 |
| 勋章管理 | 部分覆盖 | 后台勋章维护、手动发放、重复发放幂等、学生端勋章展示和权限隔离已覆盖;自动发放规则、积分活动联动和前端运营 UI 待补 |
| 题库录入 | 已覆盖 | 单题创建/更新、题目/单词/知识手册/分数线/视频 JSON/CSV/Excel 同步/异步导入、集合/蓝图、导入后复检、模板下载、字段映射 API 和导入任务详情已有Taro 租户内容页已接上传/粘贴预览、字段别名编辑、同步/异步执行、异步轮询和复检结果详情第一版;模板下载按钮和真实数据验收待补 |
| 题库录入 | 已覆盖 | 单题创建/更新、题目/单词/知识手册/分数线/视频 JSON/CSV/Excel 同步/异步导入、集合/蓝图、导入后复检、模板下载、字段映射 API 和导入任务详情已有Taro 租户内容页已接上传/粘贴预览、模板下载、字段别名编辑、同步/异步执行、异步轮询和复检结果详情第一版;真实数据验收待补 |
| 题库导出 PDF/Word/JSON | 部分覆盖 | 服务端 JSON、`paper_json` 和打印 payload 导出基础已补,含租户内容编辑权限、跨租户拒绝、答案/解析开关、子题脱敏、导出 job 和审计PDF/Word 二进制、水印、发布到资料下载和导出 worker 待补 |
| 题型分组/模拟卷配置 | 部分覆盖 | question_type_groups 表和 blueprint 有基础;后台配置体验待补 |
| 背单词维护 | 已覆盖 | 单元/单词 CRUD 和导入已有 |
@@ -98,7 +98,7 @@
1. 排行榜增强:刷题、模考、背单词、积分排行榜主接口已有;还需防刷、日/周榜预聚合、运营后台排名看板。
2. 账号设置完整流:绑定/更换手机号基础 API 已完成;仍缺头像上传、微信/QQ 账号合并、密码/邮箱能力。
3. 题库导出:服务端 JSON/试卷 payload 导出、权限审计和答案脱敏已补;仍缺 PDF/Word 二进制生成、水印、资料发布和后台导出操作台。
4. 导入扩展:题目/单词/知识手册/分数线/视频已支持 JSON、CSV 和 Excel 预览导入,并可用 `executionMode=async` 进入 imports worker导入后复检、导入任务详情、模板下载、字段映射 API、Taro 字段别名编辑、异步轮询和 PocketBase JSON dry-run 报告已补,仍缺模板下载按钮和真实数据执行验收。
4. 导入扩展:题目/单词/知识手册/分数线/视频已支持 JSON、CSV 和 Excel 预览导入,并可用 `executionMode=async` 进入 imports worker导入后复检、导入任务详情、模板下载按钮、字段映射 API、Taro 字段别名编辑、异步轮询和 PocketBase JSON dry-run 报告已补,仍缺真实数据执行验收。
5. 公共题库商业化:平台公共/地区题库授权、租户快照采纳、手动同步、自动同步 worker、冲突查询、租户自改冲突保护和单条冲突处理已完成基础闭环还需版本通知、批量处理和运营后台消息。
6. CRM/销售结算CRM worker、分佣规则、结算单、审核和打款状态基础闭环已完成仍缺轮询/定向分配、打款导出、凭证和销售结算看板。
7. 题目反馈增强:处理通知、消息提醒、问题聚合统计和内容修复闭环。
@@ -117,7 +117,7 @@
1. 微信/支付宝支付和 webhook 幂等。
2. 对象存储 PDF 预览、视频深度防盗链、动态水印。
3. 模板下载按钮、真实数据 dry-run 执行验收、导入抽样校验和性能压测。
3. 真实数据 dry-run 执行验收、导入抽样校验和性能压测。
4. 数据看板预聚合 worker、销售/代理转化看板和分佣结算。
5. 公共题库版本通知、冲突批量处理、租户确认/跳过策略和运营消息。

View File

@@ -78,8 +78,8 @@
3. 导入体系扩展
- 已完成题目、单词、知识手册、分数线、视频的 CSV/Excel 到规范 JSON 解析适配。
- 已完成大批量异步导入 worker、重试、导入后复检和审计。
- 模板下载、字段映射 API、导入任务详情、导入后复检和 PocketBase JSON dry-run 报告工具已补Taro 租户内容页已接 JSON/CSV/Excel 文件或粘贴内容、后端 preview、字段别名覆盖、同步/异步执行、异步 job 轮询和复检结果详情第一版;后端已对字段映射目标做白名单和危险 key 拦截。
- 继续补模板文件下载按钮、真实数据执行验收、导入前抽样校验和导入性能压测。
- 模板下载、字段映射 API、导入任务详情、导入后复检和 PocketBase JSON dry-run 报告工具已补Taro 租户内容页已接 JSON/CSV/Excel 文件或粘贴内容、模板下载、后端 preview、字段别名覆盖、同步/异步执行、异步 job 轮询和复检结果详情第一版;后端已对字段映射目标做白名单和危险 key 拦截。
- 继续补真实数据执行验收、导入前抽样校验和导入性能压测。
4. 题库导出增强
- 已完成服务端 JSON、`paper_json``print_payload` 基础导出和导出 job 台账。
@@ -212,7 +212,7 @@
## 推荐下一步顺序
1. 补租户后台写操作台:公共题库采纳/同步、冲突查看、单条冲突采纳平台/保留本地、导入问题、模板预览、上传/粘贴 preview/import、字段映射编辑、异步导入轮询和导入后复检详情已接第一版继续补模板文件下载、冲突批量处理、角色模板、CRM/分佣。
1. 补租户后台写操作台:公共题库采纳/同步、冲突查看、单条冲突采纳平台/保留本地、导入问题、模板预览/下载、上传/粘贴 preview/import、字段映射编辑、异步导入轮询和导入后复检详情已接第一版继续补冲突批量处理、角色模板、CRM/分佣。
2. 继续补 Taro 学生端旧体验:地区选择、视频播放、反馈、模考报告、错题/收藏专题、收银台、订单详情和售后入口已接第一版;继续补刷题细节 UI、小程序支付容器、分享场景和状态管理。
3. 补平台后台增强:租户详情/编辑、平台审计报表、自动计费、账单批量操作和更细平台权限点。
4. 云服务器部署 Supabase/PostgreSQL 和 API配置对象存储生产环境变量`check:refactor` 的远程等价测试。

View File

@@ -763,7 +763,7 @@ GET /api/tenant-content/imports/post-check
7. 导入进入 `completed/completed_with_errors` 后调用 `POST /api/tenant-content/imports/post-check`
8. 展示 `summary.importPostCheck``GET /api/tenant-content/imports/post-check?jobId=...` 返回的复检结果,再刷新内容列表、分数线列表或题目视频列表。
当前 `apps/taro/src/pages/tenant-admin/content/index.tsx` 已接第一版 H5 操作台:可切换导入类型和 JSON/CSV/Excel 格式,选择本地文件或粘贴内容,编辑本次字段别名,调用后端 preview再同步执行或传 `executionMode=async` 入队;选中任务后调用 `/api/tenant-content/imports/detail` 查看 worker 状态、item 状态统计、最近 issue 和复检结果,并会对 `pending/importing` 异步任务自动轮询。下一步继续补模板文件下载和目标入口/集合选择的完整表单。
当前 `apps/taro/src/pages/tenant-admin/content/index.tsx` 已接第一版 H5 操作台:可切换导入类型和 JSON/CSV/Excel 格式,选择本地文件或粘贴内容,预览/下载模板,编辑本次字段别名,调用后端 preview再同步执行或传 `executionMode=async` 入队;选中任务后调用 `/api/tenant-content/imports/detail` 查看 worker 状态、item 状态统计、最近 issue 和复检结果,并会对 `pending/importing` 异步任务自动轮询。下一步继续补目标入口/集合选择的完整表单。
`fieldMappingOverrides` 只影响 CSV/Excel 表头归一化,不改变 JSON 导入 schema。后端会按导入类型校验目标字段白名单并拒绝危险对象键前端可以用它提高旧表格兼容性但不能用它制造新业务字段或绕过后端校验。
@@ -1424,7 +1424,7 @@ npm run build:taro:h5:platform
下一批前端开发重点:
- 学生端:地区选择、题目视频播放、题目反馈、错题/收藏专题页、模考交卷报告、收银台、订单详情和售后入口已接第一版;下一批继续补刷题细节 UI、小程序支付容器和分享场景。
- 租户后台:题库内容页已接公共题库采纳/同步、冲突查看、单条采纳平台/保留本地、导入问题、模板预览、异步任务轮询和导入后复检第一版;下一批继续补完整写入表单、模板文件下载、冲突批量处理、学生批量导入、角色模板配置 UI、CRM 分配和分佣结算操作。
- 租户后台:题库内容页已接公共题库采纳/同步、冲突查看、单条采纳平台/保留本地、导入问题、模板预览/下载、异步任务轮询和导入后复检第一版;下一批继续补完整写入表单、冲突批量处理、学生批量导入、角色模板配置 UI、CRM 分配和分佣结算操作。
- 平台后台:租户创建、状态变更、订阅开通、账单生成、人工收款确认、用量录入、公共题库授权编辑已接第一版;继续补租户详情/编辑、平台审计、自动计费和批量账单操作。
- 小程序:验证 `Taro.login`、微信支付、分享 scene/referral、Supabase client 兼容性;如不稳定,保留 `apps/api/auth/*` 作为小程序登录适配层。