# 监控仪表盘 — 设计文档 > 日期:2026-07-20 | 优先级:P2 ## 1. 目标 升级现有仪表盘为停车监控大屏。登录后首页展示车位余量、在场车辆、今日收入、今日进出等关键指标,以及通道设备在线状态。 ## 2. 页面布局 ``` ┌─────────────────────────────────────────────────────┐ │ 智慧停车监控 2026-07-20 10:30 │ ├──────────┬──────────┬──────────┬────────────────────┤ │ 车位余量 │ 在场车辆 │ 今日收入 │ 今日进出 │ │ 48/50 │ 15 │ ¥1,250 │ 进32 出28 │ ├──────────┴──────────┴──────────┴────────────────────┤ │ 设备状态 │ │ ┌─────────────────────────────────────────────────┐│ │ │ ● 入口通道 1 设备1 [在线] │ ● 出口通道 1 ... ││ │ └─────────────────────────────────────────────────┘│ └─────────────────────────────────────────────────────┘ ``` - 顶部标题 + 当前时间 - 四个统计卡片(el-row + el-col) - 底部设备状态条(横向排列所有通道及其绑定设备) ## 3. API 设计 `GET /dashboard/monitor` ```json { "total_spaces": 50, "used_spaces": 15, "in_park": 12, "today_income": 1250.00, "today_entry": 32, "today_exit": 28, "devices": [ { "channel_name": "入口通道1", "direction": "in", "device_name": "入口设备1", "device_status": "online" } ] } ``` 数据来源: | 字段 | SQL | |------|-----| | total_spaces | `SUM(parking_lot.capacity)` | | used_spaces | `total - COUNT(record WHERE exit_time IS NULL)` | | in_park | `COUNT(vehicle_record WHERE exit_time IS NULL)` | | today_income | `SUM(payment_record.amount WHERE today)` | | today_entry | `COUNT(vehicle_record WHERE entry_time >= today)` | | today_exit | `COUNT(vehicle_record WHERE exit_time >= today)` | | devices | `channel LEFT JOIN uhf_reader` | ## 4. 前端实现 ### 文件变更 | 文件 | 操作 | 说明 | |------|------|------| | `frontend/src/view/dashboard/index.vue` | 修改 | 替换现有仪表盘内容 | | `frontend/src/api/dashboard.js` | 修改/新增 | 加 getMonitor API | ### 刷新策略 - `setInterval` 10 秒轮询 `GET /dashboard/monitor` - 组件 `onUnmounted` 清除定时器 ### 复用 - 使用 Element Plus `el-statistic` 组件(已在收费记录页用过,项目已有此组件) ## 5. 后端实现 ### 文件变更 | 文件 | 操作 | 说明 | |------|------|------| | `internal/api/v1/system/sys_dashboard.go` | 新增/修改 | GetMonitor handler | | `internal/service/system/sys_dashboard.go` | 新增/修改 | MonitorData service | | `internal/router/system/sys_dashboard.go` | 修改 | 注册路由 | 放在 system 模块下(与现有仪表盘接口同位置)。 ## 6. 菜单 不新增菜单,直接替换现有仪表盘页面(`view/dashboard/index.vue`)。原路由 `/dashboard` 不变。 ## 7. 边界情况 | 场景 | 处理 | |------|------| | 无车辆在场 | used_spaces 和 in_park 显示 0 | | 设备全部离线 | 设备卡片标红,数字卡片正常显示 | | 无停车场数据 | total_spaces = 0,显示"未配置" | | API 异常 | 保留上次数据,不刷新;卡片显示 "--" |