56 lines
2.3 KiB
Markdown
56 lines
2.3 KiB
Markdown
# 实现方案
|
||
|
||
开始时间:2026-05-03-23-22-10
|
||
|
||
## 本次方案路径
|
||
|
||
`工程分析/实现方案-2026-05-03-23-22-10.md`
|
||
|
||
## 实现目标
|
||
|
||
修复 DICOM 阅览切片/显示模式切换导致后端连接重置的问题,并降低 ZIP 下载误触发和 HTTP 文件加载警告。
|
||
|
||
## 涉及文件
|
||
|
||
- `web_backend.py`
|
||
- `WebSite/src/App.tsx`
|
||
- `工程分析/经验记录.md`
|
||
|
||
## 执行步骤
|
||
|
||
1. 后端增加 DICOM 体数据缓存:
|
||
- 增加 `DICOM_VOLUME_CACHE` 和锁。
|
||
- 基于 DICOM 目录路径、文件数量、最新修改时间生成签名。
|
||
- `/api/library/reformat-preview` 复用缓存体数据,避免每次切片/窗位变化都重新读取完整 DICOM。
|
||
- 控制缓存规模,避免多个大体数据长期驻留。
|
||
2. 后端下载容错:
|
||
- `send_file` 捕获 `BrokenPipeError`、`ConnectionResetError`、`ConnectionAbortedError`,避免客户端中断下载时污染日志或影响服务。
|
||
3. 前端 DICOM 阅览请求防抖:
|
||
- 增加 `debouncedViewerSliceIndex`。
|
||
- 切片滑杆变化后延迟短时间再请求后端,减少快速拖动时的请求数量。
|
||
- 显示模式或平面切换仍可即时重置到中间切片,但实际请求走防抖后的切片索引。
|
||
4. 前端 ZIP 下载防重复:
|
||
- 增加已下载 ZIP job id 记录,确保同一个 ZIP job 自动下载只触发一次。
|
||
5. 前端 ZIP 下载方式调整:
|
||
- 对后端文件路径优先使用 `fetch` 获取 blob,再使用本地 `blob:` URL 触发下载。
|
||
- 如 blob 下载失败,回退到原有 `/api/file` URL 方式,并提示用户。
|
||
6. 执行测试方案。
|
||
7. 更新 `工程分析/经验记录.md`。
|
||
8. 提交并推送 Gitea,commit 信息使用 `2026-05-03-23-22-10 修复阅览切换和下载触发`。
|
||
9. 重新部署到 `http://192.168.3.11:3005/`。
|
||
|
||
## 回滚思路
|
||
|
||
若缓存或 blob 下载出现问题,可回滚本次 `web_backend.py` 和 `WebSite/src/App.tsx` 修改,恢复直接读取体数据和直接 URL 下载方式。
|
||
|
||
## 风险控制
|
||
|
||
- 体数据缓存只影响阅览预览接口,不影响真实形变输出。
|
||
- 缓存使用目录签名,影像库数据变化后会重新读取。
|
||
- 删除影像库时同步清除 DICOM 文件缓存和体数据缓存。
|
||
- 前端保留下载回退路径,避免 blob 下载失败后无法下载。
|
||
|
||
## 人工审核状态
|
||
|
||
用户已明确本次不需要人工二次确认,直接执行。
|