Repository navigation
导出/导入文件名与多语言优化:显示名+视图名+时间戳命名、模板全中文、导出↔导入选项标签闭环 #2916
Copy link
Copy link
Closed
Description
Activity
真机 UI 实测报告(汇总)
环境:objectstack dev :3000(showcase,
--seed-admin)+ objectui console Vite :5180,zh-CN 会话;下载物通过 hookHTMLAnchorElement.click(读a.download)+URL.createObjectURL(读 blob 原文)捕获真实落盘文件名与内容,非代码推断。1. 导出文件名:对象显示名-视图名-时间戳 ✅
操作 实际下载文件名 任务 → In Progress 视图 → 导出为 CSV 任务-In Progress-20260714-082725.csv任务 → In Progress 视图 → 导出为 XLSX 任务-In Progress-20260714-082801.xlsx(第一轮,视图名功能前)导出 CSV / XLSX 任务-20260714-064550.csv/任务-20260714-064607.xlsx服务端
Content-Disposition同步验证:curl -H 'Accept-Language: zh-CN' …/export?format=xlsx→filename="showcase_task-…xlsx"; filename*=UTF-8''任务-….xlsx(RFC 5987 双写);en-US →Task-….csv。2. 导入「下载模板」全中文 ✅
文件名:
任务-导入模板.csv。真实 blob 内容:所有者,标题 *,项目 *,负责人,状态 *,优先级,预计工时,进度,已完成,截止日期,开始日期,结束日期,创建时间,工作地点,封面,标签,备注,同步状态,同步错误 ,,,,待规划,低,0,,true,2024-01-31,2024-01-31,2024-01-31,2024-01-31 09:00,,,,,已同步,
两轮遗留英文(
Owner/Done/Labels/Sync Status表头,Backlog/Low/Synced示例值)全部消除。导出 CSV 单元格同样中文化(进行中/高/紧急)。3. 导出↔导入闭环(本次发现并修复的平台缺陷)✅
dry-run POST
/api/v1/data/showcase_task/import,Accept-Language: zh-CN:输入 结果 中文往返测试,…,待规划,紧急(翻译标签){"total":1,"ok":1,"errors":0,"created":1}✅无locale英文标签,Backlog(作者标签,无 locale)ok:1✅ 不回归非法值仍报错,不存在的状态invalid_option: "不存在的状态" is not a known option✅ 仍拦截4. 边界行为
- All Tasks 视图未配
exportOptions→ 无导出按钮(符合预期,不受影响) fileNamePrefix配置后作为完整前缀,不追加视图名;视图名与对象名重复时自动省略;80 字符截断;非法字符清洗但保留中文
5. 单测与 CI
- framework:rest 265/265(+5 例 import-prepare)、spec 6756、plugin-reports 29 — PR feat(rest,spec): 导出文件名本地化 + 系统字段标签内置多语言回退 #2911 CI 15/15 绿
- objectui:export-filename 15/15、plugin-grid 194、plugin-list 149、plugin-view 28、app-shell 698、i18n 176 — PR feat(grid,list,core,i18n): 导出文件名本地化 + 导入模板中文化修复 objectui#2491 CI 9/9 绿
带截图的分轮详细报告见 PR 评论:
- All Tasks 视图未配
操作截图(真机 UI 实测,Playwright + Chromium,zh-CN 会话)
本轮为发 issue 独立复测一遍(2026-07-14),真实下载名由浏览器 download 事件捕获:
操作 实际下载文件名 任务 → In Progress → 导出为 CSV 任务-In Progress-20260714-094541.csv任务 → In Progress → 导出为 XLSX 任务-In Progress-20260714-094543.xlsx导入 → 下载模板 任务-导入模板.csv1. In Progress 视图网格(状态/优先级全中文:进行中、高、紧急)
2. 导出弹层(导出为 CSV / XLSX / JSON)
3. 导入对话框(下载模板入口,全中文)
本次下载的模板内容(真实文件原文,表头+示例行零英文):
所有者,标题 *,项目 *,负责人,状态 *,优先级,预计工时,进度,已完成,截止日期,开始日期,结束日期,创建时间,工作地点,封面,标签,备注,同步状态,同步错误 ,,,,待规划,低,0,,true,2024-01-31,2024-01-31,2024-01-31,2024-01-31 09:00,,,,,已同步,
导出 CSV 内容:
标题,项目,负责人,状态,优先级,截止日期 Build homepage,Website Relaunch,sam@example.com,进行中,高,2026-07-24 Ingest pipeline,Data Platform,linus@example.com,进行中,紧急,2026-08-03
截图托管在本仓
assets/issue-2916-screenshots分支(孤儿提交,不进 main)。
Metadata
Metadata
Assignees
Labels
No labels



背景(用户反馈,3 个递进诉求)
contracts.csv这种裸 API 名,重复导出互相覆盖、中文用户不可读。期望「对象显示名-时间戳.扩展名」。Backlog/prepare这类 slug/英文标签。深挖后还发现平台级缺陷:导出/模板写出的是翻译后的选项标签,但导入 coercion 只认作者原始标签——用户把自己刚导出的中文文件原样导回,select 字段全报invalid_option(导出↔导入闭环断裂)。方案与范围
objectui(前端,PR objectstack-ai/objectui#2491)
buildExportFileName(ext, { prefix, label, objectName, viewLabel }, now?):生成对象显示名-视图名-yyyymmdd-hhmmss.扩展名;exportOptions.fileNamePrefix仍为完整前缀;视图名与对象名重复时省略;80 字符截断 + 非法字符清洗(保留 Unicode)。viewDef.label写进传给 ListView 的 schema(此前从不传递)。{{object}}-导入模板.csv。framework(服务端,PR #2911)
GET /data/:object/export的Content-Disposition改为「对象显示名-时间戳」,RFC 5987/6266 双写(ASCII 兜底 +filename*=UTF-8''…)。prepareImportRequest新增localizeSchema钩子,REST 导入路由传translateMetaItem,翻译标签并入选项匹配同义词;作者标签/选项 code 照常,非法值照常报错。验收标准(均已真机 UI 实测通过)
任务-In Progress-20260714-082725.csv/…-082801.xlsx任务-导入模板.csv,表头与示例行零英文(所有者,…,同步状态,同步错误+待规划/低/已同步){"total":1,"ok":1,"errors":0};英文标签不回归;非法值仍报invalid_option关联