From 96f7c3004b7df035310f7d1eae53e397c8bff41d Mon Sep 17 00:00:00 2001 From: lion <120344285@qq.com> Date: Tue, 29 Sep 2026 15:51:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=91=84=E5=83=8F=E5=A4=B4=E9=A2=84=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/cameraMonitoring.ts | 18 ++++++++++++ src/router/routeLoaders.ts | 1 + src/views/venues/CameraAlerts.vue | 49 +++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 src/api/cameraMonitoring.ts create mode 100644 src/views/venues/CameraAlerts.vue diff --git a/src/api/cameraMonitoring.ts b/src/api/cameraMonitoring.ts new file mode 100644 index 0000000..12df578 --- /dev/null +++ b/src/api/cameraMonitoring.ts @@ -0,0 +1,18 @@ +import { http } from './http' + +export type CameraDevice = { + id: number; venue_id?: number | null; venue_name?: string | null; name: string; ip: string; sdk_port: number; http_port?: number; channel: number; device_slot?: number | null; group_id?: string | null; monitor_enabled: boolean; notification_enabled: boolean; include_in_venue_stats: boolean; maintenance_until?: string | null; push_timeout_seconds: number; health?: CameraHealth | null; venue?: { id: number; name: string } | null +} +export type CameraHealth = { status: string; sdk_status?: string; alarm_status?: string; tcp_reachable?: boolean | null; last_pdc_at?: string | null; push_age_seconds?: number | null; last_tcp_error?: string | null; reconnect_attempts?: number; observed_at?: string | null } +export type CameraAlert = { id: number; alert_type: string; status: string; severity: string; title: string; reason?: string; first_occurred_at?: string; last_occurred_at?: string; recovered_at?: string | null; camera?: Pick; venue?: { id: number; name: string } } +export type CameraSettings = { timezone: string; notification_start_time: string; notification_end_time: string; default_push_interval_seconds: number; default_push_timeout_seconds: number; probe_interval_seconds: number; probe_failure_threshold: number; auto_reconnect_max_attempts: number; send_manual_action_email: boolean; send_recovery_email: boolean; recipient_emails: string[] } +export async function fetchCameraDevices(params?: Record) { const { data } = await http.get('/camera-devices', { params }); return data } +export async function createCameraDevice(payload: Record) { const { data } = await http.post('/camera-devices', payload); return data } +export async function updateCameraDevice(id: number, payload: Record) { const { data } = await http.put(`/camera-devices/${id}`, payload); return data } +export async function deleteCameraDevice(id: number) { const { data } = await http.delete(`/camera-devices/${id}`); return data } +export async function retryCameraDevice(id: number) { const { data } = await http.post(`/camera-devices/${id}/retry`); return data } +export async function fetchCameraHealth() { const { data } = await http.get('/camera-health'); return data } +export async function fetchCameraAlerts(params?: Record) { const { data } = await http.get('/camera-alerts', { params }); return data } +export async function acknowledgeCameraAlert(id: number) { const { data } = await http.post(`/camera-alerts/${id}/acknowledge`); return data } +export async function fetchCameraSettings() { const { data } = await http.get('/camera-monitor-settings'); return data } +export async function updateCameraSettings(payload: CameraSettings) { const { data } = await http.put('/camera-monitor-settings', payload); return data } diff --git a/src/router/routeLoaders.ts b/src/router/routeLoaders.ts index bbcc005..310077f 100644 --- a/src/router/routeLoaders.ts +++ b/src/router/routeLoaders.ts @@ -2,6 +2,7 @@ export const routeLoaders: Record Promise<{ default: unknown }>> = { '/dashboard': () => import('../views/Dashboard.vue'), '/venues': () => import('../views/venues/VenueList.vue'), + '/venues/camera-alerts': () => import('../views/venues/CameraAlerts.vue'), '/activities': () => import('../views/activities/ActivityList.vue'), '/activities/registrations': () => import('../views/activities/Registrations.vue'), '/activities/verify': () => import('../views/activities/Verify.vue'), diff --git a/src/views/venues/CameraAlerts.vue b/src/views/venues/CameraAlerts.vue new file mode 100644 index 0000000..dc84ebc --- /dev/null +++ b/src/views/venues/CameraAlerts.vue @@ -0,0 +1,49 @@ + + +