# Task P01-004: Upload 模块(图片上传 + S3) ## 元信息 | 字段 | 值 | |------|-----| | 状态 | `todo` | | 优先级 | P1 | | 依赖 | P01-001(DB Schema) | | 分配给 | Coder AI (Trae CN + GLM-4.6) | ## 输入 **要读的文件**: - `docs/02_系统架构/模块设计.md` — 3.5 Upload 模块(或相关 API 定义) - `docs/02_系统架构/数据模型.md` — error_item_images 表结构 - `docs/02_系统架构/技术选型.md` — S3 SDK + Sharp 版本 - `projects/app/src/db/schema/*.ts` — P01-001 产出的 Drizzle Schema **参考的 ADR**: - 无特殊 ADR **上游依赖产出**: - P01-001: error_item_images 表 Drizzle Schema ## 输出 **要生成/修改的文件**: - `projects/app/src/modules/upload/upload.module.ts` - `projects/app/src/modules/upload/upload.controller.ts` — POST /upload/image - `projects/app/src/modules/upload/upload.service.ts` — 接收文件 → 上传 S3 → 生成缩略图 → 写 DB **API**: | 方法 | 路径 | 说明 | |------|------|------| | POST | /upload/image | multipart 上传图片 → S3 URL + 缩略图 URL | **关键逻辑**: - 原图上传 S3(bucket: errlens-originals) - Sharp 生成缩略图(max 300x300)→ 上传 S3(bucket: errlens-thumbnails) - 写入 error_item_images 表(关联 error_item_id 可选,拍照时先上传图片再创建错题记录) ## 验收方法 ```bash # 编译检查 npx tsc --noEmit # 上传测试图片 curl -X POST http://localhost:3000/upload/image \ -F "image=@test.jpg" # 预期: { id, originalUrl, thumbnailUrl, width, height } ``` ## 约束 - 不碰: `projects/app/tests/`、Image 模块目录、Print 模块目录 - 技术栈: NestJS + Sharp + @aws-sdk/client-s3(或 Minio SDK) - 遵循: `.ai/prompts/coding/code-style.md` ## 完成报告 > Coder 完成后填写。Commit message 以 `[READY_FOR_TEST]` 结尾。 - [ ] 输出文件已生成 - [ ] 验收命令通过 - [ ] Commit: `{hash}` - [ ] Commit message: `feat(P01-004): Upload 模块(图片上传+S3+缩略图) [READY_FOR_TEST]`