Files
Pre_Seg_Server/doc/02-current-implementation-map.md
admin f020ff3b4f feat: 打通全栈标注闭环、异步拆帧与模型状态
后端能力:

- 新增 Celery app、worker task、ProcessingTask 模型、/api/tasks 查询接口和 media_task_runner,将 /api/media/parse 改为创建后台任务并由 worker 执行 FFmpeg/OpenCV/pydicom 拆帧。

- 新增 Redis 进度事件模块和 FastAPI Redis pub/sub 订阅,将 worker 任务进度广播到 /ws/progress;Dashboard 后端概览接口改为聚合 projects/frames/annotations/templates/processing_tasks。

- 统一项目状态为 pending/parsing/ready/error,新增共享 status 常量,并让前端兼容归一化旧状态值。

- 扩展 AI 后端:新增 SAM registry、SAM2 真实运行状态、SAM3 状态检测与文本语义推理适配入口,以及 /api/ai/models/status GPU/模型状态接口。

- 补齐标注保存/更新/删除、COCO/PNG mask 导出相关后端契约和模板 mapping_rules 打包/解包行为。

前端能力:

- 新增运行时 API/WS 地址推导配置,前端 API 封装对齐 FastAPI 路由、字段映射、任务轮询、标注归档、导出下载和 AI 预测响应转换。

- Dashboard 改为读取 /api/dashboard/overview,并订阅 WebSocket progress/complete/error/status 更新解析队列和实时流转记录。

- 项目库导入视频/DICOM 后创建项目、上传媒体、触发异步解析并刷新真实项目列表。

- 工作区加载真实帧、无帧时触发解析任务、回显已保存标注、保存未归档 mask、更新 dirty mask、清空当前帧后端标注、导出 COCO JSON。

- Canvas 支持当前帧点/框提示调用后端 AI、渲染推理/已保存 mask、应用模板分类并维护保存状态计数;时间轴按项目 fps 播放。

- AI 页面新增 SAM2/SAM3 模型选择,预测请求携带 model;侧边栏和工作区新增真实 GPU/SAM 状态徽标。

- 模板库和本体面板接入真实模板 CRUD、分类编辑、拖拽排序、JSON 导入、默认腹腔镜分类和本地自定义分类选择。

测试与文档:

- 新增 Vitest 配置、前端测试 setup、API/config/websocket/store/组件测试,覆盖登录、项目库、Dashboard、Canvas、工作区、模型状态、时间轴、本体和模板库。

- 新增 pytest 后端测试夹具和 auth/projects/templates/media/AI/export/dashboard/tasks/progress 测试,使用 SQLite、fake MinIO、fake SAM registry 和 Redis monkeypatch 隔离外部服务。

- 新增 doc/ 文档结构,冻结当前需求、设计、接口契约、测试计划、前端逐元素审计、实现地图和后续实施计划,并同步更新 README 与 AGENTS。

验证:

- conda run -n seg_server pytest backend/tests:27 passed。

- npm run test:run:54 passed。

- npm run lint、npm run build、compileall、git diff --check 均通过;Vite 仅提示大 chunk 警告。
2026-05-01 13:29:14 +08:00

105 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 当前实现地图
## 运行入口
### 前端入口
- React 挂载:`src/main.tsx`
- 根组件:`src/App.tsx`
- 前端服务:`server.ts`
- 默认访问:`http://localhost:3000`
`server.ts` 的角色比较特殊:它既负责在开发模式下创建 Vite middleware也在生产模式下服务 `dist/`。同时它还保留了旧版 mock API`/api/login``/api/projects``/api/templates`。当前前端业务 API 主要不走这些 mock而是走 `src/lib/api.ts` 指向的 FastAPI。
### 后端入口
- FastAPI 应用:`backend/main.py`
- 默认访问:`http://localhost:8000`
- API 文档:`http://localhost:8000/docs`
- 健康检查:`GET /health`
后端启动时会通过 lifespan 执行:
- 创建数据库表。
- 检查 MinIO bucket。
- 测试 Redis。
- Seed 默认模板。
- 如果存在 `Data_MyVideo_1.mp4`,创建默认项目并拆前 100 帧。
## 前端模块切换
`App.tsx` 使用 Zustand 中的 `activeModule` 做模块切换,没有使用路由库。
| activeModule | 组件 | 页面 |
|--------------|------|------|
| `dashboard` | `Dashboard` | 系统概况 |
| `projects` | `ProjectLibrary` | 项目库 |
| `workspace` | `VideoWorkspace` | 分割工作区 |
| `ai` | `AISegmentation` | AI 智能分割页 |
| `templates` | `TemplateRegistry` | 模板库 |
未登录时,`App.tsx` 直接渲染 `Login`
## 全局状态
全局状态在 `src/store/useStore.ts` 中,主要包括:
- 登录状态:`isAuthenticated``token`
- 项目:`projects``currentProject`
- 工作区:`activeModule``activeTool``frames``currentFrameIndex`
- 标注与 mask`annotations``masks`
- 模板:`templates``activeTemplateId`
- UI`isLoading``error`
当前状态管理是前端内存状态,没有持久化到 localStorage除了登录 token。
## 数据流
### 登录
1. `Login.tsx` 调用 `login()`
2. `src/lib/api.ts` 请求 `POST /api/auth/login`
3. FastAPI `backend/routers/auth.py` 校验 `admin / 123456`
4. 前端把返回 token 写入 localStorage。
### 项目与拆帧
1. `ProjectLibrary.tsx` 调用 `getProjects()` 获取项目。
2. 上传视频时先 `createProject()`,再 `uploadMedia()`,再 `parseMedia()`
3. 后端 `media.py` 把原始文件上传到 MinIO。
4. `parseMedia()` 创建 `processing_tasks` 记录并投递 Celery worker。
5. Celery worker 下载 MinIO 文件,调用 `frame_parser.py` 拆帧。
6. worker 把拆出的帧重新上传 MinIO写入 `frames` 表,并更新任务状态。
7. 工作区通过 `GET /api/tasks/{id}` 等待任务完成,再通过 `GET /api/projects/{id}/frames` 获取预签名图片 URL。
### 工作区浏览
1. `VideoWorkspace.tsx` 根据 `currentProject.id` 加载帧。
2. `CanvasArea.tsx` 用当前帧 URL 加载底图。
3. `FrameTimeline.tsx` 显示缩略图和当前帧索引。
4. 播放按钮会推进 `currentFrameIndex`,从而更新画布底图。
### 模板管理
1. `TemplateRegistry.tsx` 调用模板 API。
2. 后端 `templates.py``classes``rules` 打包进 `mapping_rules` JSON 字段。
3. `OntologyInspector.tsx` 读取全局 `templates``activeTemplateId` 展示分类树。
## 后端数据模型
| 模型 | 表 | 用途 |
|------|----|------|
| `Project` | `projects` | 项目元数据包含视频路径、缩略图、状态、fps |
| `Frame` | `frames` | 拆帧后的图片记录 |
| `Template` | `templates` | 模板、本体类别、颜色、z-index、mapping_rules |
| `Annotation` | `annotations` | 标注数据、点、bbox、mask_data |
| `Mask` | `masks` | mask 文件元数据 |
## 当前主要风险点
- 前端 API/WS 地址虽然已支持环境变量和 hostname 推导,但部署时仍需要确认浏览器可访问 `:8000` 后端。
- AI 语义文本提示在选择 SAM 3 且运行环境满足官方依赖时走 SAM 3当前环境若不满足会在模型状态中标明不可用。
- 工作区顶部“导出 JSON 标注集”和“结构化归档保存”已接入导出、标注新增和 dirty 标注更新;清空当前帧遮罩会删除对应后端标注。撤销重做和手工绘制仍未持久化。
- Dashboard 初始统计、队列和活动日志来自后端聚合接口;解析队列来自 `processing_tasks`worker 进度通过 Redis `seg:progress` 转发到 WebSocket。
- 后端路由大多未做真实鉴权。