diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index e3c939e..a62cf8a 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -24,6 +24,10 @@ const Dashboard: React.FC = () => { const [recentAlerts, setRecentAlerts] = useState([]); const [cameraStatus, setCameraStatus] = useState([]); + const handleViewSnapshot = (alert: Alert) => { + window.open(`/api/alarms/${alert.id}/snapshot`, '_blank'); + }; + useEffect(() => { fetchStats(); fetchAlerts(); @@ -139,7 +143,7 @@ const Dashboard: React.FC = () => { description={formatTime(alert.created_at)} /> {alert.snapshot_path && ( - )} diff --git a/logs/app.log b/logs/app.log index e4b27b7..2413183 100644 --- a/logs/app.log +++ b/logs/app.log @@ -218,3 +218,24 @@ 2026-01-21 14:41:27,191 - security_monitor - INFO - 启动安保异常行为识别系统 2026-01-21 14:41:27,205 - security_monitor - INFO - 数据库初始化完成 2026-01-21 14:41:39,701 - security_monitor - INFO - 推理Pipeline启动,活跃摄像头数: 2 +2026-01-21 15:03:14,674 - security_monitor - INFO - 启动安保异常行为识别系统 +2026-01-21 15:03:14,688 - security_monitor - INFO - 数据库初始化完成 +2026-01-21 15:03:27,230 - security_monitor - INFO - 推理Pipeline启动,活跃摄像头数: 2 +2026-01-21 15:06:28,976 - security_monitor - INFO - 启动安保异常行为识别系统 +2026-01-21 15:06:28,990 - security_monitor - INFO - 数据库初始化完成 +2026-01-21 15:06:41,537 - security_monitor - INFO - 推理Pipeline启动,活跃摄像头数: 2 +2026-01-21 15:06:41,539 - security_monitor - INFO - 正在关闭系统... +2026-01-21 15:06:49,686 - security_monitor - INFO - 系统已关闭 +2026-01-21 15:07:27,870 - security_monitor - INFO - 启动安保异常行为识别系统 +2026-01-21 15:07:27,884 - security_monitor - INFO - 数据库初始化完成 +2026-01-21 15:07:40,380 - security_monitor - INFO - 推理Pipeline启动,活跃摄像头数: 2 +2026-01-21 15:07:58,160 - security_monitor - INFO - 正在关闭系统... +2026-01-21 15:07:58,299 - security_monitor - INFO - 系统已关闭 +2026-01-21 15:08:28,521 - security_monitor - INFO - 启动安保异常行为识别系统 +2026-01-21 15:08:28,533 - security_monitor - INFO - 数据库初始化完成 +2026-01-21 15:08:41,019 - security_monitor - INFO - 推理Pipeline启动,活跃摄像头数: 2 +2026-01-21 15:09:16,894 - security_monitor - INFO - 正在关闭系统... +2026-01-21 15:09:17,139 - security_monitor - INFO - 系统已关闭 +2026-01-21 15:09:41,042 - security_monitor - INFO - 启动安保异常行为识别系统 +2026-01-21 15:09:41,055 - security_monitor - INFO - 数据库初始化完成 +2026-01-21 15:09:53,555 - security_monitor - INFO - 推理Pipeline启动,活跃摄像头数: 2 diff --git a/main.py b/main.py index 6f23400..f625a19 100644 --- a/main.py +++ b/main.py @@ -11,11 +11,14 @@ os.environ["TENSORRT_DISABLE_MYELIN"] = "1" import cv2 import numpy as np -from fastapi import FastAPI, HTTPException +from fastapi import FastAPI, HTTPException, Depends from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse, StreamingResponse +from sqlalchemy.orm import Session from prometheus_client import start_http_server +from db.models import get_db + sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from ultralytics.engine.results import Boxes as UltralyticsBoxes @@ -144,6 +147,23 @@ async def get_snapshot_base64(camera_id: int): return {"image": base64.b64encode(buffer).decode("utf-8")} +@app.get("/api/alarms/{alarm_id}/snapshot") +async def get_alarm_snapshot(alarm_id: int, db: Session = Depends(get_db)): + from db.models import Alarm + + alarm = db.query(Alarm).filter(Alarm.id == alarm_id).first() + if not alarm: + raise HTTPException(status_code=404, detail="告警不存在") + + if not alarm.snapshot_path: + raise HTTPException(status_code=404, detail="该告警没有截图") + + if not os.path.exists(alarm.snapshot_path): + raise HTTPException(status_code=404, detail="截图文件不存在") + + return FileResponse(alarm.snapshot_path, media_type="image/jpeg") + + @app.get("/api/camera/{camera_id}/detect") async def get_detection_with_overlay(camera_id: int): pipeline = get_pipeline()