Files
CN_Tool_client/docs/superpowers/specs/2026-04-22-disk-monitor-design.md

1039 lines
26 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.

# 系统磁盘监控功能设计
## 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 双通知通道
- 告警每次通知、其他状态变化通知
- 配置、结果、通知日志完整留痕
该设计可直接作为后续接口开发、数据库建表和前端页面实现的依据。