# 系统磁盘监控功能设计 ## 1. 背景 当前仓库已经存在系统监控入口页与磁盘监控占位页: - `frontend/src/views/systemMonitor/index.vue` - `frontend/src/views/systemMonitor/diskMonitor/index.vue` 本次目标是在现有“系统监控 > 磁盘监控”入口下,补齐一套完整的磁盘监控方案设计,覆盖: - 多盘符监控配置 - 盘符级预警/告警阈值配置 - 配置保存与回显 - 应用启动后自动执行一次监控 - 每日统一时间执行定时监控 - 本地目录/网络路径通知 - HTTP 回调通知 - 监控结果与通知日志留痕 - MySQL 表结构与建表 SQL ## 2. 已确认需求结论 ### 2.1 业务范围 - 磁盘监控配置由页面完成,配置后持久化保存 - 页面支持配置磁盘预警和告警阈值,配置后持久化保存 - 支持多个盘符监控,每个盘符独立配置预警和告警阈值 - 应用启动时立即执行一次监控 - 支持录入通知路径,录入完成后按规则通知 - 支持每天定时执行监控 ### 2.2 已确认的约束 - 监控阈值采用“已使用率”而不是“剩余容量” - “系统启动时即可进行监控”指“应用启动后立即执行一次”,不包含操作系统开机自启动 - 每日定时监控采用“全局统一时间”,而不是每盘符独立时间 - 通知方式同时支持: - 本地目录路径 - 网络共享路径 - HTTP 回调地址 - 通知规则固定为: - 告警状态下每次监控都通知 - 其他状态按状态变化通知 ### 2.3 当前仓库边界 - 当前仓库包含前端和 Electron 壳层 - 当前仓库中未提供可直接修改的业务后端源码 - 因此本设计覆盖完整业务方案,但在本仓库实际落地时,前端页面和接口契约可直接实现,真正的扫描、调度、通知执行需由后端配合实现 ## 3. 推荐方案 采用“分层业务方案”,但按最终确认结果收敛为 5 张核心表: 1. `disk_monitor_policy` 2. `disk_monitor_target` 3. `disk_monitor_job` 4. `disk_monitor_result` 5. `disk_monitor_notify_log` 其中: - `disk_monitor_policy` 负责全局监控策略 - `disk_monitor_target` 单独存盘符配置,并合并该盘符的通知目标配置 - `disk_monitor_job` 记录每次监控批次 - `disk_monitor_result` 记录批次内每个盘符的扫描结果 - `disk_monitor_notify_log` 记录通知发送结果 该方案兼顾当前需求与后续可维护性,避免把状态判断、任务记录、通知日志混在单表里。 ## 4. 页面设计 ## 4.1 页面入口 页面入口保留在系统监控模块下: - 入口页:`frontend/src/views/systemMonitor/index.vue` - 目标页:`frontend/src/views/systemMonitor/diskMonitor/index.vue` 磁盘监控页作为独立配置页,不再只是占位内容。 ## 4.2 页面布局 页面分为 4 个区域。 ### 4.2.1 顶部摘要区 展示当前系统的全局监控状态,字段建议包括: - 监控总开关 - 应用启动即监控 - 每日统一执行时间 - 最近执行时间 - 最近执行状态 - 监控盘符数量 - 当前告警盘符数量 ### 4.2.2 全局策略区 用于维护全局监控策略,字段包括: - 是否启用磁盘监控 - 应用启动后立即执行一次 - 每日统一监控时间 - 通知规则说明 通知规则在页面上只展示,不开放复杂配置: - 预警:状态变化通知 - 告警:每次命中都通知 ### 4.2.3 通知配置区 通知配置跟盘符走,每个盘符都带一组通知目标。页面上建议以“盘符展开卡片”或“盘符表格 + 弹窗”方式编辑通知配置。 每个盘符支持两类通知目标: - 路径通知: - 本地目录,如 `D:\disk-monitor` - 网络共享目录,如 `\\server\share\disk-monitor` - HTTP 回调通知: - 如 `http://127.0.0.1:8080/api/disk/notify` 每条通知目标包含: - 名称 - 地址 - 是否启用 - 备注 HTTP 目标额外包含: - 请求方法,默认 `POST` - 超时时间,默认 `5000ms` ### 4.2.4 盘符配置区 盘符配置区以表格展示,支持新增、编辑、删除盘符配置。字段包括: - 盘符 - 是否监控 - 预警使用率 - 告警使用率 - 当前状态 - 最近扫描时间 - 最近使用率 - 操作 ## 4.3 页面交互规则 ### 4.3.1 配置保存 页面保存时一次性提交整页配置,包含: - 全局策略 - 所有盘符配置 - 每个盘符下的路径通知配置 - 每个盘符下的 HTTP 通知配置 ### 4.3.2 配置回显 页面加载时一次性读取当前生效配置,并回显: - 全局策略 - 盘符列表 - 各盘符的通知配置 - 最近执行摘要 ### 4.3.3 手动执行 页面建议提供“立即执行监控”按钮,用于: - 联调验证 - 保存配置后立刻测试 - 验证通知逻辑 ### 4.3.4 最近执行结果 页面下半区建议展示最近若干次执行记录,支持查看: - 任务来源 - 开始/结束时间 - 执行状态 - 预警数量 - 告警数量 - 每盘符结果 - 通知发送记录 ## 4.4 页面校验规则 - 盘符不能为空 - 盘符不能重复 - 预警使用率必须在 `1-100` 之间 - 告警使用率必须在 `1-100` 之间 - 告警使用率必须大于等于预警使用率 - 每日统一执行时间不能为空,格式固定 `HH:mm:ss` - 路径通知目标不能为空 - HTTP 通知目标必须是合法 URL ## 5. 数据库设计 ## 5.1 设计原则 - 使用 MySQL 8.0 - 使用 `InnoDB` - 字符集使用 `utf8mb4` - 配置表与日志表分离 - 为减少配置调整对历史记录的影响,表之间以“索引型关联”为主,不强依赖数据库外键 - 通知目标与盘符配置合并到 `disk_monitor_target`,使用 JSON 字段存多条通知目标 ## 5.2 表结构概览 ### 5.2.1 `disk_monitor_policy` 用途:存全局策略,仅保留一套当前生效配置。 关键字段: - `id` - `policy_name` - `monitor_enabled` - `run_on_app_start` - `daily_run_time` - `warning_notify_mode` - `alarm_notify_mode` - `last_job_id` - `remark` - `created_by` - `created_at` - `updated_by` - `updated_at` ### 5.2.2 `disk_monitor_target` 用途:存盘符配置,并合并该盘符的通知配置。 关键字段: - `id` - `policy_id` - `drive_letter` - `monitor_enabled` - `warning_usage_percent` - `alarm_usage_percent` - `notify_path_enabled` - `notify_path_list_json` - `notify_http_enabled` - `notify_http_list_json` - `last_status` - `last_scan_time` - `last_used_percent` - `remark` - `created_by` - `created_at` - `updated_by` - `updated_at` ### 5.2.3 `disk_monitor_job` 用途:记录每次监控任务批次。 关键字段: - `id` - `job_no` - `job_source` - `planned_time` - `started_at` - `finished_at` - `job_status` - `target_count` - `success_count` - `warning_count` - `alarm_count` - `message` - `created_at` ### 5.2.4 `disk_monitor_result` 用途:记录一次任务下每个盘符的扫描结果。 关键字段: - `id` - `job_id` - `target_id` - `drive_letter` - `total_bytes` - `used_bytes` - `free_bytes` - `used_percent` - `current_status` - `previous_status` - `status_changed` - `should_notify` - `notify_reason` - `scan_time` - `message` ### 5.2.5 `disk_monitor_notify_log` 用途:记录每次通知发送日志。 关键字段: - `id` - `job_id` - `result_id` - `target_id` - `drive_letter` - `notify_level` - `channel_type` - `channel_target` - `notify_title` - `notify_content` - `send_status` - `response_message` - `sent_at` ## 5.3 JSON 字段结构 ### 5.3.1 `notify_path_list_json` ```json [ { "path": "D:\\disk-monitor", "name": "本地通知目录", "enabled": true }, { "path": "\\\\server\\share\\disk-monitor", "name": "共享目录通知", "enabled": true } ] ``` ### 5.3.2 `notify_http_list_json` ```json [ { "url": "http://127.0.0.1:8080/api/disk/notify", "name": "运维平台回调", "method": "POST", "timeoutMs": 5000, "enabled": true } ] ``` ## 5.4 状态值约定 ### 5.4.1 盘符状态 - `UNKNOWN` - `NORMAL` - `WARNING` - `ALARM` ### 5.4.2 任务来源 - `APP_START` - `DAILY_SCHEDULE` - `MANUAL` ### 5.4.3 任务状态 - `RUNNING` - `SUCCESS` - `PARTIAL_SUCCESS` - `FAILED` ### 5.4.4 通知原因 - `ALARM_EVERY_TIME` - `STATUS_CHANGED` - `NO_NOTIFY` ### 5.4.5 通知级别 - `WARNING` - `ALARM` - `RECOVER` ### 5.4.6 通知通道类型 - `PATH` - `HTTP` ### 5.4.7 通知发送状态 - `SUCCESS` - `FAILED` ## 5.5 索引设计 ### 5.5.1 `disk_monitor_policy` - 主键:`id` ### 5.5.2 `disk_monitor_target` - 主键:`id` - 唯一索引:`uk_drive_letter(drive_letter)` - 普通索引:`idx_policy_id(policy_id)` ### 5.5.3 `disk_monitor_job` - 主键:`id` - 唯一索引:`uk_job_no(job_no)` - 普通索引:`idx_job_source(job_source)` - 普通索引:`idx_started_at(started_at)` ### 5.5.4 `disk_monitor_result` - 主键:`id` - 普通索引:`idx_job_id(job_id)` - 普通索引:`idx_target_id(target_id)` - 普通索引:`idx_drive_letter(drive_letter)` - 普通索引:`idx_scan_time(scan_time)` ### 5.5.5 `disk_monitor_notify_log` - 主键:`id` - 普通索引:`idx_job_id(job_id)` - 普通索引:`idx_result_id(result_id)` - 普通索引:`idx_target_id(target_id)` - 普通索引:`idx_sent_at(sent_at)` ## 5.6 MySQL 建表 SQL ```sql CREATE TABLE IF NOT EXISTS `disk_monitor_policy` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', `policy_name` VARCHAR(100) NOT NULL DEFAULT '默认磁盘监控策略' COMMENT '策略名称', `monitor_enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用监控:0否 1是', `run_on_app_start` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '应用启动后是否执行一次:0否 1是', `daily_run_time` TIME NOT NULL COMMENT '每日统一执行时间', `warning_notify_mode` VARCHAR(32) NOT NULL DEFAULT 'STATUS_CHANGE' COMMENT '预警通知模式', `alarm_notify_mode` VARCHAR(32) NOT NULL DEFAULT 'EVERY_TIME' COMMENT '告警通知模式', `last_job_id` BIGINT NULL COMMENT '最近一次任务ID', `remark` VARCHAR(500) NULL COMMENT '备注', `created_by` VARCHAR(64) NULL COMMENT '创建人', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` VARCHAR(64) NULL COMMENT '更新人', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='磁盘监控全局策略表'; CREATE TABLE IF NOT EXISTS `disk_monitor_target` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', `policy_id` BIGINT NOT NULL COMMENT '策略ID', `drive_letter` VARCHAR(10) NOT NULL COMMENT '盘符,例如 C:', `monitor_enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用监控:0否 1是', `warning_usage_percent` TINYINT UNSIGNED NOT NULL COMMENT '预警使用率阈值', `alarm_usage_percent` TINYINT UNSIGNED NOT NULL COMMENT '告警使用率阈值', `notify_path_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用路径通知:0否 1是', `notify_path_list_json` JSON NULL COMMENT '路径通知目标列表JSON', `notify_http_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用HTTP通知:0否 1是', `notify_http_list_json` JSON NULL COMMENT 'HTTP通知目标列表JSON', `last_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN' COMMENT '最近一次状态', `last_scan_time` DATETIME NULL COMMENT '最近扫描时间', `last_used_percent` DECIMAL(5,2) NULL COMMENT '最近一次使用率', `remark` VARCHAR(500) NULL COMMENT '备注', `created_by` VARCHAR(64) NULL COMMENT '创建人', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` VARCHAR(64) NULL COMMENT '更新人', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_drive_letter` (`drive_letter`), KEY `idx_policy_id` (`policy_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='磁盘监控盘符配置表'; CREATE TABLE IF NOT EXISTS `disk_monitor_job` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', `job_no` VARCHAR(64) NOT NULL COMMENT '任务编号', `job_source` VARCHAR(32) NOT NULL COMMENT '任务来源', `planned_time` DATETIME NULL COMMENT '计划执行时间', `started_at` DATETIME NOT NULL COMMENT '开始时间', `finished_at` DATETIME NULL COMMENT '结束时间', `job_status` VARCHAR(32) NOT NULL COMMENT '任务状态', `target_count` INT NOT NULL DEFAULT 0 COMMENT '计划扫描盘符数量', `success_count` INT NOT NULL DEFAULT 0 COMMENT '成功扫描数量', `warning_count` INT NOT NULL DEFAULT 0 COMMENT '预警数量', `alarm_count` INT NOT NULL DEFAULT 0 COMMENT '告警数量', `message` VARCHAR(1000) NULL COMMENT '结果说明', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_job_no` (`job_no`), KEY `idx_job_source` (`job_source`), KEY `idx_started_at` (`started_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='磁盘监控任务批次表'; CREATE TABLE IF NOT EXISTS `disk_monitor_result` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', `job_id` BIGINT NOT NULL COMMENT '任务ID', `target_id` BIGINT NOT NULL COMMENT '盘符配置ID', `drive_letter` VARCHAR(10) NOT NULL COMMENT '盘符', `total_bytes` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '总容量字节数', `used_bytes` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '已使用字节数', `free_bytes` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '剩余字节数', `used_percent` DECIMAL(5,2) NOT NULL DEFAULT 0.00 COMMENT '使用率', `current_status` VARCHAR(32) NOT NULL COMMENT '当前状态', `previous_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN' COMMENT '上一次状态', `status_changed` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '状态是否变化:0否 1是', `should_notify` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '本次是否通知:0否 1是', `notify_reason` VARCHAR(32) NOT NULL DEFAULT 'NO_NOTIFY' COMMENT '通知原因', `scan_time` DATETIME NOT NULL COMMENT '扫描时间', `message` VARCHAR(1000) NULL COMMENT '扫描说明', PRIMARY KEY (`id`), KEY `idx_job_id` (`job_id`), KEY `idx_target_id` (`target_id`), KEY `idx_drive_letter` (`drive_letter`), KEY `idx_scan_time` (`scan_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='磁盘监控结果表'; CREATE TABLE IF NOT EXISTS `disk_monitor_notify_log` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', `job_id` BIGINT NOT NULL COMMENT '任务ID', `result_id` BIGINT NOT NULL COMMENT '结果ID', `target_id` BIGINT NOT NULL COMMENT '盘符配置ID', `drive_letter` VARCHAR(10) NOT NULL COMMENT '盘符', `notify_level` VARCHAR(32) NOT NULL COMMENT '通知级别', `channel_type` VARCHAR(32) NOT NULL COMMENT '通知通道类型', `channel_target` VARCHAR(1000) NOT NULL COMMENT '通知目标', `notify_title` VARCHAR(255) NOT NULL COMMENT '通知标题', `notify_content` TEXT NOT NULL COMMENT '通知内容', `send_status` VARCHAR(32) NOT NULL COMMENT '发送状态', `response_message` VARCHAR(2000) NULL COMMENT '响应结果或异常信息', `sent_at` DATETIME NOT NULL COMMENT '发送时间', PRIMARY KEY (`id`), KEY `idx_job_id` (`job_id`), KEY `idx_result_id` (`result_id`), KEY `idx_target_id` (`target_id`), KEY `idx_sent_at` (`sent_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='磁盘监控通知日志表'; ``` ## 6. 接口设计 ## 6.1 配置查询 ### 接口 `GET /disk-monitor/policy/detail` ### 用途 页面初始化时一次性返回: - 当前生效的全局策略 - 所有盘符配置 ### 返回结构 ```json { "code": "A0000", "message": "success", "data": { "policy": { "id": 1, "policyName": "默认磁盘监控策略", "monitorEnabled": true, "runOnAppStart": true, "dailyRunTime": "08:30:00", "warningNotifyMode": "STATUS_CHANGE", "alarmNotifyMode": "EVERY_TIME", "lastJobId": 1001, "remark": "" }, "targets": [ { "id": 11, "driveLetter": "C:", "monitorEnabled": true, "warningUsagePercent": 80, "alarmUsagePercent": 90, "notifyPathEnabled": true, "notifyPathList": [ { "path": "D:\\disk-monitor", "name": "本地目录", "enabled": true } ], "notifyHttpEnabled": true, "notifyHttpList": [ { "url": "http://127.0.0.1:8080/api/disk/notify", "name": "运维平台", "method": "POST", "timeoutMs": 5000, "enabled": true } ], "lastStatus": "NORMAL", "lastScanTime": "2026-04-22 08:30:00", "lastUsedPercent": 76.42, "remark": "" } ] } } ``` ## 6.2 配置保存 ### 接口 `POST /disk-monitor/policy/save` ### 用途 页面点击保存时,整页提交一次: - 全局策略 - 所有盘符配置 - 所有通知配置 ### 请求结构 ```json { "policy": { "id": 1, "policyName": "默认磁盘监控策略", "monitorEnabled": true, "runOnAppStart": true, "dailyRunTime": "08:30:00", "warningNotifyMode": "STATUS_CHANGE", "alarmNotifyMode": "EVERY_TIME", "remark": "" }, "targets": [ { "id": 11, "driveLetter": "C:", "monitorEnabled": true, "warningUsagePercent": 80, "alarmUsagePercent": 90, "notifyPathEnabled": true, "notifyPathList": [ { "path": "D:\\disk-monitor", "name": "本地目录", "enabled": true } ], "notifyHttpEnabled": true, "notifyHttpList": [ { "url": "http://127.0.0.1:8080/api/disk/notify", "name": "运维平台", "method": "POST", "timeoutMs": 5000, "enabled": true } ], "remark": "" } ] } ``` ### 保存规则 - 已存在盘符则更新 - 新增盘符则插入 - 请求中已移除的盘符可按业务选择: - 直接删除 - 逻辑删除 - 必须做完整参数校验 ## 6.3 手动执行监控 ### 接口 `POST /disk-monitor/job/run` ### 用途 页面“立即执行监控”按钮触发一次人工监控。 ### 请求结构 ```json { "jobSource": "MANUAL" } ``` ### 返回结构 ```json { "code": "A0000", "message": "任务已启动", "data": { "jobId": 1002, "jobNo": "DM202604220001" } } ``` ## 6.4 最近任务列表 ### 接口 `POST /disk-monitor/job/list` ### 用途 查询最近执行记录,用于页面结果区展示。 ### 请求结构 ```json { "pageNum": 1, "pageSize": 100, "sortField": "startedAt", "sortOrder": "desc" } ``` 说明:该接口默认用于“最近任务”区域,后端应按 `startedAt desc` 返回最近记录,前端再截取前 10 条进行展示。 ### 列表字段 - `jobId` - `jobNo` - `jobSource` - `startedAt` - `finishedAt` - `jobStatus` - `targetCount` - `warningCount` - `alarmCount` - `message` ## 6.5 任务详情 ### 接口 `GET /disk-monitor/job/{jobId}/detail` ### 用途 查看一次任务的盘符结果和通知发送情况。 ### 返回结构 ```json { "code": "A0000", "message": "success", "data": { "job": { "id": 1002, "jobNo": "DM202604220001", "jobSource": "MANUAL", "jobStatus": "SUCCESS" }, "results": [ { "resultId": 2001, "targetId": 11, "driveLetter": "C:", "totalBytes": 512000000000, "usedBytes": 430000000000, "freeBytes": 82000000000, "usedPercent": 83.98, "currentStatus": "WARNING", "previousStatus": "NORMAL", "statusChanged": true, "shouldNotify": true, "notifyReason": "STATUS_CHANGED", "scanTime": "2026-04-22 15:10:00", "message": "" } ], "notifyLogs": [ { "id": 3001, "resultId": 2001, "driveLetter": "C:", "notifyLevel": "WARNING", "channelType": "HTTP", "channelTarget": "http://127.0.0.1:8080/api/disk/notify", "sendStatus": "SUCCESS", "responseMessage": "200 OK", "sentAt": "2026-04-22 15:10:02" } ] } } ``` ## 6.6 通知测试接口 ### 接口 `POST /disk-monitor/notify/test` ### 用途 用于页面保存配置后,快速验证通知目标是否可用。 ### 请求结构 ```json { "driveLetter": "C:" } ``` 该接口非必须,但建议保留,便于联调。 ## 7. 执行流设计 ## 7.1 应用启动监控 执行条件: - `disk_monitor_policy.monitor_enabled = 1` - `disk_monitor_policy.run_on_app_start = 1` 执行流程: 1. 应用启动完成 2. 后端读取当前全局策略 3. 创建一条 `disk_monitor_job` 4. `job_source = APP_START` 5. 扫描所有启用监控的盘符 6. 为每个盘符生成一条 `disk_monitor_result` 7. 若本次需通知,则生成 `disk_monitor_notify_log` 8. 更新 `disk_monitor_target.last_status / last_scan_time / last_used_percent` ## 7.2 每日定时监控 执行条件: - `disk_monitor_policy.monitor_enabled = 1` - 已配置 `daily_run_time` 执行流程: 1. 后端启动时注册统一调度器 2. 每天到 `daily_run_time` 执行一次 3. 创建一条 `disk_monitor_job` 4. `job_source = DAILY_SCHEDULE` 5. 扫描所有启用监控的盘符 6. 生成结果与通知日志 ## 7.3 手动执行监控 执行流程: 1. 页面点击“立即执行监控” 2. 调用 `POST /disk-monitor/job/run` 3. 创建一条 `disk_monitor_job` 4. `job_source = MANUAL` 5. 扫描所有启用盘符 6. 返回任务编号 ## 8. 状态判定与通知规则 ## 8.1 盘符状态判定 设: - `usedPercent` 为当前使用率 - `warningUsagePercent` 为预警阈值 - `alarmUsagePercent` 为告警阈值 判定规则: - `usedPercent >= alarmUsagePercent` -> `ALARM` - `usedPercent >= warningUsagePercent 且 usedPercent < alarmUsagePercent` -> `WARNING` - 其他 -> `NORMAL` ## 8.2 通知判定规则 本次需求固定为: - 告警后需要每次都通知 - 其余状态按状态变化通知 执行逻辑: ```text if currentStatus == ALARM: shouldNotify = true notifyReason = ALARM_EVERY_TIME else if currentStatus == WARNING and previousStatus != WARNING: shouldNotify = true notifyReason = STATUS_CHANGED else if currentStatus == NORMAL and previousStatus in (WARNING, ALARM): shouldNotify = true notifyReason = STATUS_CHANGED else: shouldNotify = false notifyReason = NO_NOTIFY ``` ## 8.3 恢复通知 当盘符由: - `WARNING -> NORMAL` - `ALARM -> NORMAL` 时,视为状态变化,发送恢复通知,通知级别建议记为 `RECOVER`。 ## 9. 通知执行设计 ## 9.1 路径通知 执行方式: - 遍历 `notify_path_list_json` - 对每个启用路径生成一份通知文件 建议文件内容为 JSON 或文本,至少包含: - 任务编号 - 盘符 - 当前状态 - 当前使用率 - 预警阈值 - 告警阈值 - 扫描时间 每次路径写入都要记录到 `disk_monitor_notify_log`。 ## 9.2 HTTP 回调通知 执行方式: - 遍历 `notify_http_list_json` - 按配置的 `url / method / timeoutMs` 发请求 建议请求体: ```json { "jobNo": "DM202604220001", "driveLetter": "C:", "currentStatus": "ALARM", "usedPercent": 93.12, "warningUsagePercent": 80, "alarmUsagePercent": 90, "scanTime": "2026-04-22 15:10:00" } ``` HTTP 执行结果需要记录: - 发送成功或失败 - 状态码 - 异常信息 并统一写入 `disk_monitor_notify_log`。 ## 10. 前端改动范围建议 若后续进入本仓库实现,预计改动集中在: - `frontend/src/views/systemMonitor/diskMonitor/index.vue` - `frontend/src/views/systemMonitor/diskMonitor/components/` - `frontend/src/api/systemMonitor/` - 必要的前端类型定义文件 页面入口继续复用: - `frontend/src/views/systemMonitor/index.vue` ## 11. 验证方案 ## 11.1 配置验证 - 页面保存后重新进入 - 全局策略正确回显 - 盘符配置正确回显 - 通知路径与 HTTP 回调正确回显 ## 11.2 启动验证 - 应用启动后自动生成一条 `APP_START` 任务记录 - 启用盘符均生成结果记录 ## 11.3 定时验证 - 到设定时间后自动生成一条 `DAILY_SCHEDULE` 任务记录 - 所有启用盘符都参与扫描 ## 11.4 通知规则验证 - `NORMAL -> WARNING` 时通知一次 - 连续 `WARNING -> WARNING` 不重复通知 - 连续 `ALARM -> ALARM` 每次都通知 - `WARNING -> NORMAL` 时发恢复通知 - `ALARM -> NORMAL` 时发恢复通知 ## 11.5 通知通道验证 - 路径通知能成功写入本地目录 - 路径通知能成功写入网络共享目录 - HTTP 回调能成功返回状态码 - 失败情况能正确写入通知日志 ## 12. 风险与注意事项 - 当前仓库中未提供业务后端源码,设计中的扫描、调度、通知逻辑需由后端配合实现 - 通知目标合并进 `disk_monitor_target` 后,当前需求下表结构更简洁,但后续若要做通知目标复用统计,不如独立通知表灵活 - 路径通知涉及网络共享目录时,需要额外关注运行账户权限 - HTTP 回调需要处理超时、重复通知、目标不可达等异常情况 - 若后续允许删除盘符配置,建议保留结果表中的 `drive_letter` 冗余字段,避免历史查询受影响 ## 13. 结论 本设计采用“全局策略 + 盘符配置 + 任务批次 + 扫描结果 + 通知日志”的五表方案,在满足当前需求的前提下,保证了: - 多盘符独立配置 - 启动监控 - 每日统一定时监控 - 路径与 HTTP 双通知通道 - 告警每次通知、其他状态变化通知 - 配置、结果、通知日志完整留痕 该设计可直接作为后续接口开发、数据库建表和前端页面实现的依据。