变更日志 (Changelog)
本项目的所有重要变更都将记录在此文件中。
格式基于 Keep a Changelog,
版本号遵循 语义化版本。
[1.10.0] - 2025-12-15 20:27
新增 (Added)
- Cordova环境日志保存功能 (src/log/)
- 实现Cordova环境下使用文件系统保存日志,支持本地离线存储
- 新增CordovaLogWriter类,支持2MB文件大小限制和自动轮转机制
- 文件命名格式:
YYYY-MM-DD_XXX.log,XXX从000开始递增
- 集成到主日志系统中,支持动态环境检测和写入器选择
- 自动等待Cordova deviceready事件,确保文件系统可用性
- 完善的错误处理,避免应用崩溃
核心功能:
- 文件大小轮转:超过2MB自动创建新文件,避免单文件过大
- 异步写入:不阻塞应用主线程,提升用户体验
- 跨平台兼容:支持Android和iOS的文件系统路径
- 错误容忍:文件操作失败时只记录警告,不抛出异常
技术实现:
- 使用cordova-plugin-file API进行文件操作
- 单例模式确保只有一个日志写入器实例
- 动态导入避免在非Cordova环境下加载相关代码
改动文件:
- src/log/logger.js - 添加Cordova环境检测和日志写入逻辑
- src/log/cordova-log-writer.js (新增) - Cordova日志写入器实现
- src/log/cordova-log-writer.js.md (新增) - 详细使用文档
- .build/build-android.js - 自动安装cordova-plugin-file插件
[1.9.0] - 2025-12-15 18:40
新增 (Added)
- 注释删除逻辑优化 (src/features/imageAnnotation/services/AnnotationManager.ts)
- 重构
deleteAnnotation 方法,实现基于 FrameOfReferenceUID 的正确删除逻辑
- 新增
findElementsByFOR 方法,支持通过 referencedImageId 查找相关 viewport elements
- 使用
annotation.state.getAnnotations() 获取删除操作后的完整注释状态
- 修复
annotation 命名冲突,重命名为 corAnnotation 避免与参数冲突
- 实现注释数据的完整性验证和错误处理
核心改进:
- 基于 FrameOfReference 级别的注释管理,确保多视口场景下的数据一致性
- 正确处理 Cornerstone3D v3.28 的注释状态获取机制
- 提升注释删除操作的可靠性和性能
改动文件:
- src/features/imageAnnotation/services/AnnotationManager.ts
[1.8.0] - 2025-12-15 17:03
重构 (Refactored)
改动文件:
- .build/h5_for_electron.build.linux.arm.js
[1.8.0] - 2025-12-15 16:54
重构 (Refactored)
改动文件:
- .build/h5_for_electron.build.win.x64.js
[1.8.0] - 2025-12-15 16:47
变更 (Changed)
- Git工作流程文档优化 (.clinerules/workflows/git-commit-and-push.md)
- 添加自动更新CHANGELOG.md的步骤说明,确保每次提交都记录变更历史
- 调整步骤顺序:先更新CHANGELOG.md(第3步),再更新package.json版本(第4步)
- 明确CHANGELOG条目格式要求:标题需包含日期和时间(如 ## [1.8.0] - 2025-12-15 16:14)
- 优化步骤编号,确保文档结构更加清晰合理
核心改进:
- 规范化提交流程,确保变更历史完整记录
- 新增CHANGELOG条目始终放在顶部,便于查看最新变更
- 提高文档可维护性,为自动化工作流提供明确指导
改动文件:
- .clinerules/workflows/git-commit-and-push.md
- CHANGELOG.md
[1.8.0] - 2025-12-15 16:36
变更 (Changed)
- 开发环境配置优化 (config/dev.ts)
- 添加 MQTT WebSocket 代理配置,指向 ws://192.168.110.245:8083
- 启用 WebSocket 代理支持,便于开发环境下的 MQTT 通信调试
- 注释掉 HTTPS 服务器配置,简化开发环境启动流程
技术实现:
- 新增
/mqtt 代理路径配置
- 启用
ws: true 支持 WebSocket 协议代理
- 保留路径不重写,确保 MQTT 连接正确转发
改动文件:
[1.8.0] - 2025-12-15 16:14
重构 (Refactored)
- 服务器配置统一到单一数据源 (#server-config-unification)
- 在 ConfigService 中定义并导出
DEFAULT_SERVER_CONFIG 常量作为唯一默认配置源
- 更新 serverConfigSlice 的 prod 预设使用
DEFAULT_SERVER_CONFIG
- 更新 ServerConfigModal 的表单默认值使用
DEFAULT_SERVER_CONFIG
- 重构配置接口:将
apiBaseUrl/mqttBrokerUrl 改为 ip/apiPort/mqttPort 结构
- 重构 API 配置获取逻辑,适配新的配置结构
- 删除
mqttConfig.ts,将功能合并到 config.ts 中
- 更新所有 MQTT 服务使用新的配置导入方式
- 更新图像查看器使用动态
getIpPort() 函数
核心改进:
- 单一数据源:只在 ConfigService.ts 中定义默认配置
- 完全统一:所有使用默认配置的地方都引用同一个常量
- 自动同步:修改一处,所有地方自动更新
- 架构合理:组件和状态管理层都依赖服务层,符合依赖倒置原则
- 类型安全:TypeScript 检查通过,没有引入新的类型错误
- 易于维护:未来修改默认配置只需要改一处
改动文件:
- src/features/serverConfig/services/ConfigService.ts
- src/features/serverConfig/state/serverConfigSlice.ts
- src/features/serverConfig/components/ServerConfigModal.tsx
- src/features/serverConfig/types/index.ts
- src/API/config.ts
- src/domain/mqttService.ts
- src/domain/mqttServiceForDevice.ts
- src/domain/mqttConfig.ts (删除)
- src/pages/view/components/viewers/stack.image.viewer.tsx
- package.json (版本更新: 1.7.1 -> 1.8.0)
[1.7.1] - 2025-12-12 17:48
修复 (Fixed)
- 测量工具删除操作崩溃问题 (src/utils/measurementToolManager.ts)
- 修复点击删除测量导致崩溃的问题
- 新增
getLengthMeasurements 方法获取指定 viewport 的所有线段测量结果
- 新增
activateLengthToolForViewports 方法为多个 viewport 批量激活线段测量工具
- 新增
deactivateLengthToolForViewports 方法为多个 viewport 批量停用线段测量工具
- 新增
clearLengthMeasurementsForViewports 方法为多个 viewport 批量清除线段测量
技术实现:
- 增强测量工具管理器的批量操作能力
- 添加完整的错误处理和边界检查
- 支持多 viewport 场景的测量工具管理
改动文件:
- package.json (版本更新: 1.7.0 -> 1.7.1)
- src/utils/measurementToolManager.ts
[1.7.0] - 2025-12-12 17:14
修复 (Fixed)
- Android模拟器ES5兼容性问题 (config/index.ts)
- 添加webpack配置强制转换node_modules中的ES2020+语法为ES5
- 解决雷神模拟器上运行Android时不支持ES2020语法的问题
- 配置babel-loader处理ahooks、lodash-es、dayjs、antd-mobile、@ant-design、@cornerstonejs、react-query等常用库
- 在h5配置中添加esnextModules空数组
- 设置目标环境为Chrome 91,确保良好的兼容性
技术实现:
- 使用webpack chain API配置force-es5规则
- 针对特定node_modules包应用babel-loader转换
- 配置@babel/preset-env实现ES2020+到ES5的语法降级
- 启用useBuiltIns: 'usage'和corejs: 3实现按需polyfill
改动文件:
[1.7.0] - 2025-12-12 14:47
变更 (Changed)
- Android构建流程改进 (.build/build-android.js)
- 实现index.html自动注入cordova.js脚本功能
- 添加智能检测机制,避免重复添加cordova.js引用
- 在业务代码执行前确保Cordova环境就绪
- 新增cordova-plugin-nativestorage插件安装,支持本地数据存储
- 优化构建流程注释,提高代码可读性
技术实现:
- 自动读取并修改生成的index.html文件
- 在
<head>标签后插入cordova.js脚本引用
- 检查现有内容避免重复注入
- 输出清晰的构建日志信息
改动文件:
[1.6.0] - 2025-12-11 17:40
新增 (Added)
- Android构建系统统一化改造 (.build/build-android.js)
- 将Android SDK安装和构建功能合并到单个脚本中
- 实现完整的自动化构建流程:先安装SDK,然后构建APK
- 新增Gradle wrapper配置功能,强制使用预装的Gradle 9.0.0版本
- 集成智能SDK路径检测,支持多平台路径fallback策略
- 添加跨平台环境变量管理,确保构建一致性
变更 (Changed)
移除 (Removed)
- 独立的setup-android-sdk.js脚本 - 功能已完全合并到build-android.js中
[1.7.0] - 2025-12-11 19:02
新增 (Added)
- 注释保存和加载渲染功能 - 实现完整的注释数据持久化系统
- 新增注释序列化/反序列化服务,支持Cornerstone注释对象的JSON存储
- 实现注释管理器,监听Cornerstone事件并自动保存注释数据
- 新增注释验证器,确保数据完整性和格式正确性
- 集成Redux状态管理,支持注释数据的全局状态维护
- 实现延迟批量保存机制,提升性能和用户体验
- 支持多工具类型注释:LengthTool、AngleTool、LabelTool、HipNHAAngleMeasurementTool等
核心功能实现:
- 注释自动保存:监听Cornerstone注释完成事件,实时保存到后端
- 注释自动加载:图像加载时自动从后端获取并渲染注释
- 注释状态管理:支持注释的高亮、选中等状态控制
- 数据验证:确保注释数据的格式和完整性
- 错误处理:完善的异常处理和用户反馈机制
技术架构:
- 基于Feature模块化设计,代码组织清晰
- TypeScript类型安全,支持完整的类型检查
- 异步操作和状态机管理,确保数据一致性
- 优化的性能:延迟保存、批量操作、最小化API调用
改动文件:
- 新增
src/features/imageAnnotation/ Feature模块
src/features/imageAnnotation/services/AnnotationSerializer.ts - 注释序列化服务
src/features/imageAnnotation/services/AnnotationManager.ts - 注释管理器
src/features/imageAnnotation/services/AnnotationValidator.ts - 注释验证器
src/features/imageAnnotation/state/annotationSlice.ts - Redux状态管理
src/features/imageAnnotation/types/annotation.ts - 类型定义
src/features/imageAnnotation/index.ts - 模块导出
src/API/annotation.ts - API接口定义
src/states/store.ts - 注册annotation slice
package.json - 版本号更新至1.7.0
新增 (Added)
变更 (Changed)
修复 (Fixed)
移除 (Removed)
[1.6.0] - 2025-12-11
新增 (Added)
- 运行时配置后端 API 地址功能 (#server-config-runtime)
- 实现完整的服务器配置管理系统,支持 Electron、Cordova、浏览器三端
- 新增
serverConfig Feature 模块,包含类型定义、服务层、状态管理和UI组件
- 支持用户手动配置 API 基础地址和 MQTT Broker 地址
- 实现跨平台存储适配器:Electron使用文件系统,Cordova使用NativeStorage,浏览器使用内存存储
- 添加服务器连接检测机制,启动时自动验证配置有效性
- 实现智能配置优先级:用户配置 > 浏览器动态检测 > webpack编译配置 > 默认值
- 新增服务器配置对话框,支持地址验证和测试连接功能
- 集成 MQTT 服务动态配置,确保设备通信正常工作
- 优化应用初始化流程,添加连接检查和错误处理
核心架构改进:
- 新增
src/features/serverConfig/ Feature 模块
- 新增
src/utils/platform.ts 统一平台检测工具
- 新增
src/domain/mqttConfig.ts MQTT 配置服务
- 改造
src/API/config.ts 支持动态配置
- 优化
src/app.tsx 初始化流程和错误处理
技术实现亮点:
- Feature-based 架构设计,支持模块化开发
- 统一的存储适配器接口,支持多平台存储策略
- 状态机驱动的初始化流程,确保可靠的启动顺序
- 完整的 TypeScript 类型支持和错误处理
- 用户友好的配置界面和连接测试功能
改动文件:
新增文件:
src/features/serverConfig/types/index.ts
src/features/serverConfig/storage/IStorageAdapter.ts
src/features/serverConfig/storage/ElectronStorageAdapter.ts
src/features/serverConfig/storage/CordovaStorageAdapter.ts
src/features/serverConfig/storage/BrowserStorageAdapter.ts
src/features/serverConfig/storage/index.ts
src/features/serverConfig/services/ConfigService.ts
src/features/serverConfig/state/serverConfigSlice.ts
src/features/serverConfig/components/ServerConfigModal.tsx
src/features/serverConfig/index.ts
src/domain/mqttConfig.ts
src/utils/platform.ts
docs/实现/运行时配置后端地址功能.md
docs/实现/初始化管道系统设计方案.md
修改文件:
src/app.tsx - 添加服务器连接检查和配置对话框
src/API/config.ts - 改为动态配置函数
src/API/interceptor.ts - 支持动态修改 baseURL
src/states/store.ts - 注册 serverConfig slice
src/domain/mqttService.ts - 使用动态 MQTT 配置
src/domain/mqttServiceForDevice.ts - 使用动态 MQTT 配置
main.js - 修复 ES 模块兼容性
preload.js - 更新存储 API
types/global.d.ts - 添加平台类型定义
package.json - 更新版本号至 1.6.0
[1.5.0] - 2025-12-11
新增 (Added)
- 矩形灰度测量工具完整交互功能 (#rectangle-grayscale-interaction)
- 实现线段精确检测功能,支持点击矩形边框进行整体拖拽
- 实现文本框独立拖拽功能,支持自由移动测量结果显示位置
- 实现智能光标反馈系统:
- 文本框悬停显示手型光标(pointer)
- 线段和手柄悬停显示十字准星光标(crosshair)
- 矩形内部显示默认光标
- 实现选中状态下手柄半径动态调整(默认6 → 悬停9 → 选中12)
- 实现三级交互优先级:文本框 → 手柄 → 线段 → 内部区域
- 优化矩形内部点击行为:仅选中,不触发拖拽
修复 (Fixed)
- 矩形拖拽坐标计算问题修复
- 修复整体拖拽时坐标计算错误导致工具跑出视区的问题
- 简化偏移计算逻辑:新质心位置 = 当前鼠标位置 - 初始偏移
- 确保矩形能够准确跟随鼠标移动,不产生额外偏移
核心改进:
- 新增
_isPointNearLine 和 _isPointNearLineSegment 方法实现精确线段检测
- 新增
_isPointInTextBox 和 _checkTextBoxBounds 方法实现文本框检测
- 优化
_mouseDownModifyCallback 实现文本框、手柄、线段的优先级检测
- 优化
_mouseDragModifyCallback 支持文本框拖拽和修复整体拖拽坐标计算
- 优化
_mouseMoveModifyCallback 实现智能光标样式切换和悬停高亮
- 优化
renderAnnotation 根据选中和高亮状态动态调整手柄大小
改动文件:
- src/components/measures/RectangleGrayscaleMeasurementTool.ts
[1.4.2] - 2025-12-11
新增 (Added)
- 直线灰度测量工具文本框交互功能 (#line-grayscale-text-interaction)
- 实现文本框拖拽功能,支持自由移动测量结果显示位置
- 实现文本框悬停时显示手型光标,提供清晰的交互提示
- 实现点击文本框选中整个工具,统一选中行为
- 优化文本框检测逻辑,使用默认位置作为备选值
- 调整检测区域 padding 从 50 减小到 10,提高检测精度
核心改进:
- 修复文本框位置未定义时检测逻辑不执行的问题
- 实现三级交互优先级:文本框 → 手柄 → 线段
- 确保所有文本框交互功能正常工作
改动文件:
- src/components/measures/LineGrayscaleMeasurementTool.ts
[1.4.1] - 2025-12-11
新增 (Added)
- 直线灰度测量工具交互功能增强 (#line-grayscale-measurement-interaction)
- 实现整个工具平移功能,点击线段可拖拽移动整个测量工具
- 实现手柄拖拽功能,支持单独调整端点位置
- 实现选中状态管理,选中时手柄半径从6增大到12
- 实现线段和手柄悬停时显示十字准星光标
- 实现悬停高亮效果,提供更好的视觉反馈
- 点击空白区域可取消工具选中状态
- 优化数据更新逻辑,只在必要时重新计算统计数据
核心改进:
- 使用
handleIndex = -1 标识整个工具的拖拽操作
- 使用
wholeToolOffset 追踪工具平移的拖拽状态
- 实现优先级检测:手柄 → 线段
- 选中状态下保持高亮,提供更好的用户体验
改动文件:
- src/components/measures/LineGrayscaleMeasurementTool.ts
[1.4.0] - 2025-12-10
新增 (Added)
- 矩形区域灰度测量功能 (#rectangle-grayscale-measurement)
- 实现完整的矩形区域灰度测量工具,提供医学影像选区统计分析
- 新增
RectangleGrayscaleMeasurementTool 类,基于Cornerstone3D实现
- 支持在医学图像上绘制矩形选区并自动计算平均、最小、最大灰度值
- 集成完整的测量工具管理系统,支持多视口和状态管理
- 修复矩形手柄拖拽算法,确保角点移动时矩形形状保持正确
- 测量结果实时显示,包括像素平均值、极值和选区面积信息
- 支持工具切换、清除和历史记录管理
核心文件变更:
src/components/measures/RectangleGrayscaleMeasurementTool.ts (新增)
src/utils/measurementToolManager.ts (更新测量工具管理)
src/pages/view/components/viewers/stack.image.viewer.tsx (工具集成)
docs/实现/矩形区域灰度测量的实现方案.md (功能设计文档)
[1.3.5] - 2025-12-10
修复 (Fixed)
- 工作列表患者照片显示逻辑修复 (#worklist.tsx)
- 修复患者照片查找条件类型比较错误,解决 undefined === '' 导致照片不显示的问题
[1.2.7] - 2025-12-09
修复 (Fixed)
- Reset Image 功能反色问题 (#stack.image.viewer.tsx)
- 修复了点击 Reset Image 按钮后,DICOM 图像显示反色的问题
- 从图像缓存中正确获取原始
photometricInterpretation 元数据
- 发现并处理
resetProperties() 后需要反转 invert 值的特殊行为
- 解决了 MONOCHROME1/MONOCHROME2 格式图像的正确显示问题
关键技术发现:
resetProperties() 会重置 VOI LUT 等渲染参数
- 导致需要与初始加载相反的 invert 值才能正确显示
- MONOCHROME1: 初始
invert=true,Reset 后需要 invert=false
- MONOCHROME2: 初始
invert=false,Reset 后需要 invert=true
影响范围:
- 确保无论用户是否使用"反色对比"功能,Reset 都能正确恢复初始显示
- 所有使用 Cornerstone3D 显示的 DICOM 图像
[1.2.6] - 2025-12-XX
说明
版本号说明
本项目遵循语义化版本 2.0.0规范:
- 主版本号 (Major):当你做了不兼容的 API 修改
- 次版本号 (Minor):当你做了向下兼容的功能性新增
- 修订号 (Patch):当你做了向下兼容的问题修正
变更类型说明
- 新增 (Added): 添加的新功能
- 变更 (Changed): 对现有功能的变更
- 弃用 (Deprecated): 即将移除的功能
- 移除 (Removed): 已移除的功能
- 修复 (Fixed): 任何 bug 修复
- 安全 (Security): 针对安全漏洞的修复
链接说明