PingWatch 网络设备离线监控系统
- FastAPI 后端 + Vue 3 前端 - Docker Compose 一键部署 - Casdoor OAuth 认证集成 - LogHive 集中式日志 - 设备批量 CSV 导入/导出 - WebSocket 实时状态推送 - 企业微信告警通知 - fping 高性能并发 Ping 检测 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class AlertEventOut(BaseModel):
|
||||
id: int
|
||||
device_id: int
|
||||
device_name: str = ""
|
||||
device_ip: str = ""
|
||||
device_type: str = ""
|
||||
location: str = ""
|
||||
project_name: str = ""
|
||||
alert_type: str
|
||||
message: str
|
||||
start_at: datetime
|
||||
end_at: Optional[datetime] = None
|
||||
duration_minutes: Optional[int] = None
|
||||
is_resolved: bool
|
||||
notification_sent: bool
|
||||
created_at: datetime
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
class AlertEventQuery(BaseModel):
|
||||
page: int = 1
|
||||
page_size: int = 20
|
||||
device_id: Optional[int] = None
|
||||
alert_type: Optional[str] = None
|
||||
is_resolved: Optional[bool] = None
|
||||
start_time: Optional[datetime] = None
|
||||
end_time: Optional[datetime] = None
|
||||
@@ -0,0 +1,49 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel, IPvAnyAddress
|
||||
|
||||
|
||||
class DeviceCreate(BaseModel):
|
||||
name: str
|
||||
ip: str
|
||||
device_type: str = "other"
|
||||
location: str = ""
|
||||
project_name: str = ""
|
||||
tags: str = ""
|
||||
ping_interval: int = 30
|
||||
alert_threshold: int = 5
|
||||
is_enabled: bool = True
|
||||
|
||||
|
||||
class DeviceUpdate(BaseModel):
|
||||
name: Optional[str] = None
|
||||
ip: Optional[str] = None
|
||||
device_type: Optional[str] = None
|
||||
location: Optional[str] = None
|
||||
project_name: Optional[str] = None
|
||||
tags: Optional[str] = None
|
||||
ping_interval: Optional[int] = None
|
||||
alert_threshold: Optional[int] = None
|
||||
is_enabled: Optional[bool] = None
|
||||
|
||||
|
||||
class DeviceOut(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
ip: str
|
||||
device_type: str
|
||||
location: str
|
||||
project_name: str
|
||||
tags: str
|
||||
ping_interval: int
|
||||
alert_threshold: int
|
||||
is_enabled: bool
|
||||
current_status: str
|
||||
consecutive_failures: int
|
||||
last_ping_time: Optional[datetime] = None
|
||||
last_online_time: Optional[datetime] = None
|
||||
last_offline_time: Optional[datetime] = None
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
@@ -0,0 +1,40 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class DeviceStatusSummary(BaseModel):
|
||||
total: int
|
||||
online: int
|
||||
offline: int
|
||||
checking: int
|
||||
unknown: int
|
||||
online_rate: float
|
||||
|
||||
|
||||
class DeviceStatsItem(BaseModel):
|
||||
device_id: int
|
||||
device_name: str
|
||||
device_ip: str
|
||||
device_type: str
|
||||
location: str
|
||||
project_name: str
|
||||
total_pings: int
|
||||
alive_pings: int
|
||||
packet_loss_rate: float
|
||||
avg_response_time: Optional[float] = None
|
||||
offline_count: int
|
||||
total_offline_duration: int # 分钟
|
||||
max_offline_duration: int
|
||||
|
||||
|
||||
class TimeSeriesPoint(BaseModel):
|
||||
time: datetime
|
||||
value: float
|
||||
|
||||
|
||||
class DashboardStats(BaseModel):
|
||||
summary: DeviceStatusSummary
|
||||
recent_offline: list # list[AlertEventOut]
|
||||
offline_trend: list[TimeSeriesPoint]
|
||||
packet_loss_top: list[DeviceStatsItem]
|
||||
Reference in New Issue
Block a user