Bez popisu

肖天鹤 19cc5234aa chore: 添加 tsbuildinfo 到 gitignore před 1 týdnem
frontend f3c4f40db2 feat: 硬件监控仪表盘 - 完整项目 před 1 týdnem
src f3c4f40db2 feat: 硬件监控仪表盘 - 完整项目 před 1 týdnem
.gitignore 19cc5234aa chore: 添加 tsbuildinfo 到 gitignore před 1 týdnem
README.md f3c4f40db2 feat: 硬件监控仪表盘 - 完整项目 před 1 týdnem
pom.xml f3c4f40db2 feat: 硬件监控仪表盘 - 完整项目 před 1 týdnem

README.md

网页端本机硬件设备基础信息监控系统

1. 项目简介

基于 Java 21 + Spring Boot 3.4 + React 18 的本机硬件监控系统,通过 OSHI 采集硬件指标,WebSocket 实时推送至前端仪表盘,支持历史数据持久化与趋势分析。

技术栈

技术
后端 Java 21, Spring Boot 3.4.4, Spring WebSocket, Spring Data JPA, OSHI 6.6.5
数据库 H2 (嵌入式文件存储)
缓存 Caffeine
前端 React 18, TypeScript, Ant Design 5, ECharts 5, Zustand, Vite 6
构建 Maven, Vite

监控指标

类别 指标
CPU 使用率、各核心负载、温度、频率、缓存
内存 使用率、已用/可用/总量、交换分区
磁盘 容量、读写速率、接口类型、S.M.A.R.T. 健康状态
GPU 型号、显存、温度
网络 上下行速率、接口详情、MAC/IP 脱敏
系统 主板、BIOS、OS 版本

2. 使用说明

2.1 启动方式

方式一:开发模式(前后端分离)

# 终端 1:启动后端
cd hw-monitor
mvn clean package -DskipTests
java -jar target/hw-monitor-1.0.0.jar

# 终端 2:启动前端开发服务器
cd hw-monitor/frontend
npm install
npm run dev

访问 http://127.0.0.1:3000 查看仪表盘。

方式二:生产模式(前端打包进后端)

# 1. 构建前端
cd hw-monitor/frontend
npm install
npm run build

# 2. 复制构建产物到 static 目录
cp -r dist/* ../src/main/resources/static/

# 3. 打包并运行
cd ..
mvn clean package -DskipTests
java -jar target/hw-monitor-1.0.0.jar

访问 http://127.0.0.1:9988 查看仪表盘。

2.2 页面导航

页面 路由 功能说明
仪表盘总览 / 6 个核心指标卡片,异常告警高亮
CPU 详情 /cpu 各核心柱状图 + 温度 + 频率
内存详情 /memory 环形图 + 交换分区 + 内存条表格
磁盘详情 /disk 容量饼图 + 读写速率 + S.M.A.R.T.
GPU 详情 /gpu 仪表盘 + 温度 + 显存
网络详情 /network 实时速率对比 + 接口详情
系统信息 /system 主板/BIOS/OS 静态信息
历史趋势 /history 时间范围 + 指标类型筛选

2.3 采集频率切换

Header 右侧提供 30 秒 / 60 秒 两档切换按钮,点击即时生效,无需重启。

2.4 告警阈值

仪表盘卡片在以下情况自动红色高亮边框:

指标 阈值
CPU 使用率 > 90%
内存使用率 > 85%
磁盘使用率 > 90%
温度 > 80°C

2.5 REST API

方法 端点 说明
GET /api/v1/overview 获取所有硬件概览数据
GET /api/v1/cpu 获取 CPU 详情
GET /api/v1/memory 获取内存详情
GET /api/v1/disk 获取磁盘详情
GET /api/v1/gpu 获取 GPU 详情
GET /api/v1/network 获取网络详情
GET /api/v1/system 获取系统信息
GET /api/v1/history 获取历史数据(支持 ?start=&end=&category= 筛选)
GET /api/v1/config/interval 获取当前采集间隔
PUT /api/v1/config/interval 修改采集间隔(body: {"intervalSeconds": 30}
GET /api/v1/health 健康检查

2.6 WebSocket

  • 地址:ws://127.0.0.1:9988/ws/metrics
  • 推送频率:与采集间隔一致(默认 30 秒)
  • 消息格式:

    {
    "type": "metrics",
    "timestamp": 1700000000000,
    "data": {
    "cpu": { "usagePercent": 23.0, "temperature": 45.0, ... },
    "memory": { "usagePercent": 74.2, "usedBytes": 25125584896, ... },
    "disk": { "partitions": [...] },
    "gpu": { "name": "Intel(R) Arc(TM) 130T GPU", ... },
    "network": { "interfaces": [...] },
    "system": { "osName": "Windows 11", ... }
    }
    }
    

3. 部署说明

3.1 环境要求

依赖 版本
JDK 21+
Maven 3.9+
Node.js 18+ (仅前端开发)
操作系统 Windows / Linux / macOS

3.2 配置参数

所有可配置参数位于 src/main/resources/application.yml

server:
  port: 9988                  # 监听端口
  address: 127.0.0.1          # 仅监听本地,实现网络隔离

spring:
  threads:
    virtual:
      enabled: true           # 启用虚拟线程

hwmonitor:
  collect-interval-seconds: 30  # 采集间隔(30/60)
  history:
    retention-days: 7          # 历史数据保留天数
  alert:
    cpu-threshold: 90          # CPU 告警阈值 (%)
    memory-threshold: 85       # 内存告警阈值 (%)
    disk-threshold: 90         # 磁盘告警阈值 (%)
    temp-threshold: 80         # 温度告警阈值 (°C)
  security:
    allowed-origins: http://localhost:9988
    enable-token: false        # Token 认证(默认关闭)
    read-only: true            # 只读模式

3.3 安全措施

措施 说明
网络隔离 服务仅监听 127.0.0.1,不对外暴露
只读原则 所有 API 均为 GET 请求(除配置修改外)
数据脱敏 MAC 地址掩码、公网 IP 仅显示前两段、磁盘序列号脱敏
日志安全 不输出敏感硬件信息
H2 Console 已禁用
Actuator 仅暴露 /health 端点

3.4 数据存储

  • 数据库文件:./data/hwmonitor.mv.db
  • 历史数据每天凌晨 3:00 自动清理超过 7 天的记录
  • 若要重置数据,删除 ./data 目录后重启即可

3.5 系统服务部署(Windows)

使用 WinSW 将 jar 注册为 Windows 服务:

<!-- hw-monitor-service.xml -->
<service>
  <id>hw-monitor</id>
  <name>Hardware Monitor</name>
  <description>本机硬件监控服务</description>
  <executable>java</executable>
  <arguments>-jar hw-monitor-1.0.0.jar</arguments>
  <workingdirectory>D:\ideaFactory\hw-monitor</workingdirectory>
  <log mode="roll-by-size">
    <sizeThreshold>10240</sizeThreshold>
    <keepFiles>8</keepFiles>
  </log>
</service>
# 安装服务
hw-monitor-service.exe install

# 启动服务
hw-monitor-service.exe start

3.6 系统服务部署(Linux)

# /etc/systemd/system/hw-monitor.service
[Unit]
Description=Hardware Monitor Service
After=network.target

[Service]
Type=simple
User=monitor
WorkingDirectory=/opt/hw-monitor
ExecStart=/usr/bin/java -jar /opt/hw-monitor/hw-monitor-1.0.0.jar
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable hw-monitor
sudo systemctl start hw-monitor

4. 项目结构

hw-monitor/
├── src/main/java/com/hwmonitor/
│   ├── HwMonitorApplication.java      # Spring Boot 启动类
│   ├── collector/                      # 硬件采集器(6个)
│   │   ├── CpuCollector.java
│   │   ├── MemoryCollector.java
│   │   ├── DiskCollector.java
│   │   ├── GpuCollector.java
│   │   ├── NetworkCollector.java
│   │   └── SystemCollector.java
│   ├── config/                         # 配置类
│   │   ├── BrowserLauncher.java        # 启动自动打开浏览器
│   │   ├── CacheConfig.java            # Caffeine 缓存
│   │   ├── MonitorConfig.java          # 采集频率配置
│   │   └── WebSocketConfig.java        # WebSocket 配置
│   ├── controller/                     # 控制器
│   │   ├── MetricsController.java      # REST API
│   │   ├── ConfigController.java       # 配置 API
│   │   ├── HistoryController.java      # 历史数据 API
│   │   └── MetricsWebSocketHandler.java # WebSocket 处理器
│   ├── model/                          # 数据模型
│   │   ├── dto/                        # 7个 DTO
│   │   └── entity/                     # 1个实体
│   ├── repository/                     # JPA Repository
│   ├── scheduler/                      # 定时调度
│   └── service/                        # 业务服务
├── src/main/resources/
│   └── application.yml                 # 全局配置
├── frontend/                           # 前端项目
│   └── src/
│       ├── components/                 # 页面组件(8个)
│       ├── services/api.ts             # API 封装
│       ├── store/metricsStore.ts       # 状态管理
│       ├── types.ts                    # TypeScript 类型
│       └── App.tsx                     # 根组件
└── pom.xml                             # Maven 配置

5. 常见问题

Q: 启动后浏览器显示"连接断开"? A: 等待 3-5 秒,WebSocket 会自动重连。若持续断开,检查后端是否正常启动在 9988 端口。

Q: 磁盘使用率显示 0%? A: 某些磁盘分区信息需管理员权限才能获取使用量,以管理员身份运行可解决。

Q: GPU 信息显示 "--"? A: OSHI 在某些平台无法获取 GPU 使用率,型号和显存信息正常即可。

Q: 如何修改采集频率? A: 方式一:点击前端 Header 右侧 30秒/60秒 按钮即时切换;方式二:修改 application.yml 中的 collect-interval-seconds 配置后重启。

Q: 历史数据占用空间大吗? A: 按默认 30 秒采集间隔,每条记录约 100 字节,7 天约产生 2MB 数据,可忽略不计。