# 备份与恢复 - 布局与组件结构描述 ## 页面概览 **备份与恢复**是系统之家一级菜单下的二级页面,提供系统数据的备份、恢复和操作记录查询功能。 --- ## 1. 布局与组件结构 ### 1.1 整体布局结构 ``` Page (备份与恢复) ├── Tabs Component (选项卡容器) │ ├── Tab Panel 1: 操作记录 │ ├── Tab Panel 2: 备份 │ └── Tab Panel 3: 恢复 ``` **布局类型**: Tabs Layout (选项卡布局) **排列方向**: Horizontal Tabs (水平标签) **区域划分**: 3个独立的Tab Panel,通过标签切换 --- ### 1.2 Tab 1: 操作记录页面 #### 1.2.1 层级结构 ``` Tab Panel (操作记录) ├── Section: 查询区域 (Query Section) │ ├── Container: 时间范围筛选 │ │ ├── DatePicker: 开始时间 │ │ └── DatePicker: 结束时间 │ ├── Container: 条件筛选 │ │ ├── Input: 用户名称输入框 │ │ ├── Select: 对象下拉选择 │ │ ├── Select: 操作下拉选择 │ │ └── Select: 结果下拉选择 │ └── Button: 查询按钮 └── Section: 数据展示区域 (Data Display Section) ├── Table: 操作记录表格 │ ├── Column: 时间 │ ├── Column: 用户 │ ├── Column: 操作对象 │ ├── Column: 操作 │ └── Column: 结果 └── Pagination: 分页控件 ``` **布局特点**: - **Vertical Stack Layout**: 查询区域和数据展示区域垂直堆叠 - **Grid Layout**: 查询条件采用栅格布局,自适应排列 - **Fixed Header**: 表格标题固定,内容区可滚动 #### 1.2.2 组件详情 | 组件类型 | 实例 | 参数配置 | 说明 | |---------|------|---------|------| | **DatePicker** | 开始时间、结束时间 | showTime, format | 支持精确到秒的时间选择 | | **Input** | 用户名称 | placeholder="请输入用户名称" | 模糊搜索用户 | | **Select** | 对象、操作、结果 | allowClear, placeholder | 支持清空选择 | | **Button** | 查询 | type="primary" | 触发查询操作 | | **Table** | 操作记录表格 | - | 展示操作历史 | | **Pagination** | 分页 | pageSize=20, showSizeChanger | 支持切换每页条数 | | **Empty** | 暂无数据 | - | 空状态展示 | --- ### 1.3 Tab 2: 备份页面 #### 1.3.1 层级结构 ``` Tab Panel (备份) ├── Split View Layout (左右分割布局) │ ├── Left Panel: 选择备份文件 │ │ ├── Section Header: "选择备份文件" │ │ ├── List: 备份项目列表 │ │ │ ├── Checkbox + Label: 文件目录 │ │ │ ├── Checkbox + Label: 协议配置 │ │ │ ├── Checkbox + Label: 平板探测器 │ │ │ ├── Checkbox + Label: 发生器 │ │ │ ├── Checkbox + Label: 机架 │ │ │ ├── Checkbox + Label: 同步盒 │ │ │ ├── Checkbox + Label: PPACS节点 │ │ │ ├── Checkbox + Label: DICOM节点 │ │ │ ├── Checkbox + Label: 用户账户 │ │ │ ├── Checkbox + Label: 四角信息 │ │ │ └── Checkbox + Label: 配置数据库 │ │ └── Button: 备份 │ └── Right Panel: 数据回显 │ ├── Section Header: "数据回显" │ └── Status Display: 备份状态信息 │ └── Text: "备份状态:未开始" ``` **布局特点**: - **Split View**: 左右分割视图,左侧固定宽度,右侧占据剩余空间 - **Vertical List**: 备份项目垂直排列 - **Fixed Bottom**: 备份按钮固定在左侧面板底部 - **Scrollable**: 备份项目列表可滚动 #### 1.3.2 组件详情 | 组件类型 | 实例 | 参数配置 | 说明 | |---------|------|---------|------| | **Checkbox** | 11个备份项目 | defaultChecked=true | 默认全选 | | **List** | 备份项目列表 | - | 垂直列表布局 | | **Button** | 备份 | type="primary", size="large" | 底部固定按钮 | | **Panel** | 数据回显区域 | - | 展示备份进度和结果 | --- ### 1.4 Tab 3: 恢复页面 #### 1.4.1 层级结构 ``` Tab Panel (恢复) ├── Split View Layout (左右分割布局) │ ├── Left Panel: 选择恢复文件 │ │ ├── Section: 选择文件包 │ │ │ ├── Section Header: "选择文件包" │ │ │ ├── Input: 文件路径输入框 │ │ │ └── Button: 选择路径 │ │ ├── Divider: 分隔线 │ │ ├── Section: 选择恢复文件 │ │ │ ├── Section Header: "选择恢复文件" │ │ │ └── List: 恢复项目列表 │ │ │ ├── Checkbox + Label: 文件目录 │ │ │ ├── Checkbox + Label: 协议配置 │ │ │ ├── Checkbox + Label: 平板探测器 │ │ │ ├── Checkbox + Label: 发生器 │ │ │ ├── Checkbox + Label: 机架 │ │ │ ├── Checkbox + Label: 同步盒 │ │ │ ├── Checkbox + Label: PPACS节点 │ │ │ ├── Checkbox + Label: DICOM节点 │ │ │ ├── Checkbox + Label: 用户账户 │ │ │ ├── Checkbox + Label: 四角信息 │ │ │ └── Checkbox + Label: 配置数据库 │ │ └── Button: 恢复 │ └── Right Panel: 数据回显 │ ├── Section Header: "数据回显" │ └── Status Display: 恢复状态信息 │ └── Text: "恢复状态:未开始" ``` **布局特点**: - **Split View**: 与备份页面相同的左右分割布局 - **Vertical Stack**: 左侧面板内容垂直堆叠 - **Two-Section Left Panel**: 左侧分为"选择文件包"和"选择恢复文件"两个区域 - **Input Group**: 文件路径输入框与选择按钮组合 #### 1.4.2 组件详情 | 组件类型 | 实例 | 参数配置 | 说明 | |---------|------|---------|------| | **Input** | 文件路径 | placeholder="请选择文件包", readOnly | 只读输入框 | | **Button** | 选择路径 | - | 打开文件选择对话框 | | **Checkbox** | 11个恢复项目 | defaultChecked=false | 默认不选中 | | **List** | 恢复项目列表 | - | 垂直列表布局 | | **Button** | 恢复 | type="primary", size="large", disabled | 初始禁用状态 | | **Panel** | 数据回显区域 | - | 展示恢复进度和结果 | --- ## 2. Ant Design 组件选择理由 ### 2.1 Tabs 组件 **选择理由**: - **清晰的功能分组**: 备份、恢复、操作记录三个功能相关但独立,使用Tabs可以在同一页面组织,避免页面跳转 - **状态保持**: Tabs内置状态管理,切换时保持各Tab的状态 - **一致的视觉体验**: Ant Design的Tabs组件风格统一,与系统整体设计一致 - **易于扩展**: 如果未来需要添加新的功能模块(如"导入导出"),可以轻松添加新Tab ### 2.2 DatePicker 组件 **选择理由**: - **时间范围筛选**: 操作记录需要按时间范围查询,DatePicker提供了便捷的日期时间选择 - **格式化支持**: 支持自定义时间格式显示和解析 - **范围选择**: 可以使用RangePicker组件简化时间范围选择 - **验证功能**: 内置日期验证,防止选择无效时间范围 ### 2.3 Select 组件 **选择理由**: - **枚举值选择**: 对象、操作、结果都是预定义的枚举值,Select最适合 - **支持搜索**: 可以启用搜索功能,快速定位选项 - **清空选项**: allowClear属性方便用户重置筛选条件 - **多选支持**: 如果未来需要支持多条件筛选,可以轻松切换到多选模式 ### 2.4 Table 组件 **选择理由**: - **数据展示专业**: Ant Design的Table组件功能强大,支持排序、筛选、分页 - **固定表头**: 长列表场景下固定表头提升体验 - **空状态处理**: 内置Empty组件集成,无数据时自动显示友好提示 - **列配置**: 支持动态显示/隐藏列,满足不同用户需求 ### 2.5 Checkbox 组件 **选择理由**: - **多选场景**: 备份和恢复需要选择多个数据项,Checkbox最适合 - **全选/反选**: 可以方便实现全选、反选功能 - **状态清晰**: 选中/未选中状态视觉清晰 - **分组支持**: Checkbox.Group可以统一管理所有选项的值 ### 2.6 Button 组件 **选择理由**: - **操作触发**: 查询、备份、恢复等操作需要明确的触发点 - **状态反馈**: 支持loading状态,操作进行时提供视觉反馈 - **禁用控制**: 可以根据条件禁用按钮,防止误操作 - **视觉层级**: 通过type属性区分主要和次要操作 ### 2.7 Pagination 组件 **选择理由**: - **大数据集处理**: 操作记录可能很多,分页是必需的 - **跳转功能**: 支持快速跳转到指定页 - **条数切换**: showSizeChanger允许用户调整每页显示条数 - **总数显示**: 清晰显示总记录数,帮助用户了解数据规模 --- ## 3. 页面功能描述 ### 3.1 操作记录功能 #### 3.1.1 查询功能 - **时间范围筛选**: 用户可以选择开始和结束时间,查询特定时间段内的操作记录 - **多条件组合查询**: 支持按用户、操作对象、操作类型、操作结果多维度筛选 - **模糊搜索**: 用户名称支持模糊匹配 - **结果展示**: 以表格形式展示查询结果,包含时间、用户、操作对象、操作类型、结果等信息 #### 3.1.2 分页浏览 - **分页展示**: 大量记录分页显示,提升性能 - **页码跳转**: 快速跳转到指定页 - **条数调整**: 用户可以选择每页显示20/50/100条记录 #### 3.1.3 空状态处理 - **无数据提示**: 查询无结果时显示"暂无数据"提示 - **友好引导**: 提示用户调整筛选条件 ### 3.2 备份功能 #### 3.2.1 备份项目选择 - **全选/反选**: 默认全选所有备份项目,用户可以取消不需要的项目 - **分类清晰**: 备份项目按类型分类(配置类、硬件类、数据类) - **备份项目说明**: - 文件目录: 系统文件和用户数据 - 协议配置: 检查协议和体位配置 - 平板探测器: 探测器配置参数 - 发生器: 高压发生器配置 - 机架: 机架配置参数 - 同步盒: 同步盒配置 - PPACS节点: PACS服务器配置 - DICOM节点: DICOM网络配置 - 用户账户: 用户账号信息 - 四角信息: 图像四角显示配置 - 配置数据库: 系统配置数据库 #### 3.2.2 备份执行 - **一键备份**: 点击备份按钮开始备份操作 - **进度显示**: 右侧数据回显区域实时显示备份进度 - **状态反馈**: 显示当前备份状态(未开始、进行中、已完成、失败) - **备份文件生成**: 生成包含所选项目的备份文件包 #### 3.2.3 备份结果 - **成功提示**: 备份完成后显示成功信息和备份文件路径 - **失败处理**: 备份失败时显示错误原因,支持重试 - **日志记录**: 备份操作记录到操作记录中 ### 3.3 恢复功能 #### 3.3.1 备份文件选择 - **文件浏览**: 点击"选择路径"按钮打开文件选择对话框 - **备份包解析**: 选择备份文件后自动解析包含的备份项目 - **项目展示**: 在"选择恢复文件"列表中显示备份包中的可用项目 #### 3.3.2 恢复项目选择 - **按需恢复**: 用户可以选择性恢复部分项目,不必全部恢复 - **依赖检查**: 某些项目可能有依赖关系,系统应提示或自动选择依赖项 - **风险提示**: 恢复操作会覆盖现有配置,应有明确的风险提示 #### 3.3.3 恢复执行 - **确认对话框**: 执行恢复前弹出确认对话框,列出将要恢复的项目 - **进度显示**: 右侧数据回显区域实时显示恢复进度 - **分项反馈**: 每个项目恢复完成后显示状态(成功/失败) - **回滚机制**: 如果恢复失败,应能回滚到恢复前状态 #### 3.3.4 恢复结果 - **成功提示**: 恢复完成后显示成功信息 - **重启提示**: 某些配置恢复后需要重启系统才能生效 - **失败处理**: 部分项目恢复失败时显示详细错误信息 - **日志记录**: 恢复操作记录到操作记录中 --- ## 4. 功能思考与需求描述 ### 4.1 操作记录功能需求 #### 4.1.1 数据来源 - **系统级操作**: 备份、恢复、系统配置修改等重要操作 - **用户级操作**: 用户登录、权限变更等安全相关操作 - **记录内容**: 操作时间、操作用户、操作对象、操作类型、操作结果、详细信息 #### 4.1.2 查询性能 - **索引优化**: 时间、用户、操作对象等常用筛选字段应建立索引 - **分页加载**: 前端分页,避免一次加载大量数据 - **缓存策略**: 近期查询结果可以缓存,减少服务器压力 #### 4.1.3 权限控制 - **访问权限**: 只有管理员可以查看所有操作记录 - **数据隔离**: 普通用户只能查看自己的操作记录(如果开放) - **敏感信息**: 某些敏感操作记录可能需要额外的查看权限 ### 4.2 备份功能需求 #### 4.2.1 备份策略 - **增量备份**: 支持增量备份,只备份变更的数据 - **定时备份**: 支持设置定时自动备份 - **备份保留**: 设置备份文件保留策略(如最多保留10个备份) - **备份验证**: 备份完成后验证备份文件完整性 #### 4.2.2 备份范围 - **完整备份**: 包含所有选中项目的完整数据 - **配置备份**: 只备份配置信息,不包含大文件 - **数据备份**: 包含配置和数据文件 #### 4.2.3 备份安全 - **加密存储**: 备份文件可以加密存储,防止泄露 - **压缩优化**: 备份文件压缩,节省存储空间 - **完整性校验**: 使用校验和确保备份文件完整 #### 4.2.4 用户体验 - **预估时间**: 显示预计备份所需时间 - **可取消**: 备份过程中可以取消操作 - **后台执行**: 备份在后台执行,不阻塞用户其他操作 ### 4.3 恢复功能需求 #### 4.3.1 恢复策略 - **完整恢复**: 恢复所有选中的项目 - **部分恢复**: 允许只恢复部分项目 - **版本选择**: 如果有多个备份版本,允许用户选择恢复哪个版本 #### 4.3.2 恢复安全 - **备份当前状态**: 恢复前自动备份当前状态 - **验证备份文件**: 恢复前验证备份文件有效性 - **依赖检查**: 检查项目之间的依赖关系 - **冲突解决**: 处理恢复数据与现有数据的冲突 #### 4.3.3 恢复流程 - **文件解析**: 解析备份文件,显示可恢复项目 - **项目选择**: 用户选择要恢复的项目 - **风险确认**: 显示恢复将覆盖的配置,要求用户确认 - **执行恢复**: 按依赖顺序恢复各项目 - **结果反馈**: 显示每个项目的恢复结果 #### 4.3.4 异常处理 - **部分失败**: 某些项目恢复失败时,其他项目继续恢复 - **回滚机制**: 提供回滚到恢复前状态的选项 - **错误日志**: 详细记录恢复过程中的错误 --- ## 5. 后续实现建议 ### 5.1 状态管理 (Redux Slice) 建议创建 `backupRecoverySlice` 来管理备份与恢复的状态。 #### 5.1.1 Slice 结构 ```typescript // src/store/slices/backupRecoverySlice.ts interface BackupRecoveryState { // 当前激活的Tab activeTab: 'backup' | 'recovery' | 'logs'; // 操作记录 logs: { list: OperationLog[]; total: number; loading: boolean; filters: { startTime: string; endTime: string; username: string; object: string; operation: string; result: string; }; pagination: { current: number; pageSize: number; }; }; // 备份 backup: { selectedItems: string[]; // 选中的备份项目ID status: 'idle' | 'preparing' | 'backing-up' | 'success' | 'failed'; progress: { current: number; total: number; currentItem: string; }; result: { success: boolean; filePath?: string; errorMessage?: string; }; }; // 恢复 recovery: { backupFilePath: string; // 选择的备份文件路径 availableItems: string[]; // 备份文件中可用的项目 selectedItems: string[]; // 选中要恢复的项目 status: 'idle' | 'parsing' | 'restoring' | 'success' | 'failed'; progress: { current: number; total: number; currentItem: string; itemResults: Array<{ item: string; success: boolean; error?: string; }>; }; result: { success: boolean; needRestart: boolean; errorMessage?: string; }; }; } ``` #### 5.1.2 Actions ```typescript // 操作记录相关 - setLogsFilters: 设置筛选条件 - fetchLogs: 获取操作记录列表 - setLogsPagination: 设置分页参数 // 备份相关 - setBackupItems: 设置选中的备份项目 - startBackup: 开始备份 - updateBackupProgress: 更新备份进度 - backupComplete: 备份完成 - backupFailed: 备份失败 - resetBackup: 重置备份状态 // 恢复相关 - selectBackupFile: 选择备份文件 - parseBackupFile: 解析备份文件 - setRecoveryItems: 设置选中的恢复项目 - startRecovery: 开始恢复 - updateRecoveryProgress: 更新恢复进度 - recoveryComplete: 恢复完成 - recoveryFailed: 恢复失败 - resetRecovery: 重置恢复状态 ``` ### 5.2 API 接口设计 #### 5.2.1 操作记录接口 ```typescript // GET /api/system/operation-logs interface FetchLogsParams { startTime?: string; endTime?: string; username?: string; object?: string; operation?: string; result?: string; page: number; pageSize: number; } interface FetchLogsResponse { data: OperationLog[]; total: number; } ``` #### 5.2.2 备份接口 ```typescript // POST /api/system/backup interface BackupRequest { items: string[]; // 要备份的项目ID列表 } interface BackupResponse { success: boolean; filePath?: string; errorMessage?: string; } // WebSocket: /ws/backup-progress // 实时推送备份进度 interface BackupProgressMessage { current: number; total: number; currentItem: string; status: 'backing-up' | 'success' | 'failed'; } ``` #### 5.2.3 恢复接口 ```typescript // POST /api/system/parse-backup interface ParseBackupRequest { filePath: string; } interface ParseBackupResponse { success: boolean; availableItems: string[]; errorMessage?: string; } // POST /api/system/recovery interface RecoveryRequest { filePath: string; items: string[]; // 要恢复的项目ID列表 } interface RecoveryResponse { success: boolean; needRestart: boolean; errorMessage?: string; } // WebSocket: /ws/recovery-progress // 实时推送恢复进度 interface RecoveryProgressMessage { current: number; total: number; currentItem: string; status: 'restoring' | 'success' | 'failed'; itemResults: Array<{ item: string; success: boolean; error?: string; }>; } ``` ### 5.3 组件实现建议 #### 5.3.1 页面组件结构 ``` src/pages/system/BackupRecovery/ ├── index.tsx // 主页面组件 ├── OperationLogs.tsx // 操作记录Tab ├── Backup.tsx // 备份Tab ├── Recovery.tsx // 恢复Tab └── components/ ├── BackupItemList.tsx // 备份项目列表组件 ├── ProgressPanel.tsx // 进度显示面板组件 └── LogsTable.tsx // 操作记录表格组件 ``` #### 5.3.2 主页面组件 ```typescript // src/pages/system/BackupRecovery/index.tsx const BackupRecovery: React.FC = () => { const dispatch = useDispatch(); const { activeTab } = useSelector((state) => state.backupRecovery); const handleTabChange = (key: string) => { dispatch(setActiveTab(key)); }; return (