You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.1 KiB
5.1 KiB
导出功能复核与开发指引(2026-04-24)
1. 文档目的
本文件用于后续迭代开发时快速理解“用户数据导出”功能的当前实现状态、行为边界与已知风险,避免重复摸索。
2. 复核范围
本次复核覆盖:
- 后端 API:创建 / 列表 / 下载 / 删除
- 服务层:任务状态机、任务删除与目录清理、导出执行流程
- 导出产物:
data/、files/、manifest.json - 前端导出中心交互:创建、刷新、下载、删除、重新导出
- 关键测试可执行性
3. 关键代码位置
- API
server/api/me/export/request.post.tsserver/api/me/export/tasks.get.tsserver/api/me/export/tasks/[id]/download.get.tsserver/api/me/export/tasks/[id].delete.ts
- 服务层
server/service/export/jobs.tsserver/service/export/run.tsserver/service/export/build-data.tsserver/service/export/build-files.tsserver/service/export/build-manifest.ts
- 前端
app/pages/me/export/index.vueapp/types/export.ts
- 测试
server/service/export/jobs.test.tsserver/service/export/build-manifest.test.tsserver/utils/me-export-request-body.test.ts
4. 当前功能状态(复核结论)
4.1 已实现并可用
-
任务生命周期
- 支持
queued -> running -> succeeded/failed/expired - 同一用户存在
queued/running任务时,禁止再次创建(409)
- 支持
-
导出产物构建
- 导出目录结构:
manifest.jsondata/*.jsonfiles/*
manifest包含:schemaVersionexportedAt/exportCutoffAtmaskPolicystatschecksums.data/files
- 导出目录结构:
-
下载完整包
- 下载接口返回完整压缩包(
tar.gz) - 通过
tar -czf -流式返回,不落地额外压缩文件
- 下载接口返回完整压缩包(
-
任务列表自愈
- 刷新任务列表时会检查已完成任务的导出文件可用性
- 缺失/过期会自动标记为
expired并写入错误信息
-
任务删除
DELETE /api/me/export/tasks/:id- 非
running任务可删 - 删除时尝试清理对应
.tmp/exports目录,并做路径边界保护
-
前端交互
- 支持创建、刷新、下载、删除
expired任务显示“重新导出”按钮
5. 实测结果(本地复核)
执行命令:
bun test server/service/export/jobs.test.ts
bun test server/service/export/build-manifest.test.ts
bun test server/utils/me-export-request-body.test.ts
结果:
server/service/export/jobs.test.ts:通过(12 pass)server/service/export/build-manifest.test.ts:通过(1 pass)server/utils/me-export-request-body.test.ts:失败(Cannot find package 'h3')
6. 已知问题与风险
R1(中):me-export-request-body 单测依赖问题
- 现象:测试环境无法解析
h3,导致server/utils/me-export-request-body.test.ts失败。 - 影响:该 util 的单测在当前环境不稳定,CI/新开发机可能复现。
- 建议:
- 方案 A:
me-export-request-body.ts改为抛项目通用错误对象({ statusCode, statusMessage }),不直接依赖h3。 - 方案 B:明确把
h3作为可解析依赖并固定版本,确保测试环境一致。
- 方案 A:
R2(中):下载包格式依赖系统 tar
- 当前下载使用子进程
tar打包,依赖运行环境存在tar命令。 - 建议:
- 在部署文档里明确依赖项;
- 或改为 Node 库打包,避免系统命令依赖。
R3(中):下载失败时状态修正为 expired 的语义边界
- 当前将“文件缺失/打包失败/过期”统一落到
expired。 - 建议:
- 若需更细粒度运维排障,可新增状态或错误码区分(如
EXPORT_MISSING、EXPORT_PACKAGE_FAILED)。
- 若需更细粒度运维排障,可新增状态或错误码区分(如
7. 对外接口行为(当前版本)
7.1 创建任务
POST /api/me/export/request- body:
{ "maskPolicy": "masked" | "raw" }(可省略,默认masked) - 返回:
taskId,status
7.2 获取任务列表
GET /api/me/export/tasks- 返回当前用户任务
- 返回前会自动做“已完成任务文件存在性检查”,必要时改为
expired
7.3 下载任务产物
GET /api/me/export/tasks/:id/download- 仅允许下载本人且
succeeded的任务 - 返回完整
tar.gz包 - 常见错误:
409:任务未完成410:任务过期或文件丢失(并同步标记为expired)
7.4 删除任务
DELETE /api/me/export/tasks/:id- 仅允许删除本人任务
running任务返回409
8. 后续开发建议(按优先级)
- 修复 R1:先解决
h3解析导致的单测不稳定。 - 补 API 级测试:增加
request/tasks/download/delete的集成测试。 - 下载格式可配置:支持
zip(前端兼容性更好)或可选tar.gz/zip。 - 导出清理任务:增加后台任务,定期清理已过期目录与旧任务数据。
- 更细状态与错误码:提高运维可观测性。
9. 最终结论
- 功能可用性:通过(可用于后续开发迭代)
- 工程稳定性:有条件通过(需优先修复 R1)