Files
vision-record/web/static/index.html

290 lines
13 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>视觉记录系统</title>
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
<div class="container">
<!-- 头部 -->
<header class="header">
<h1>📷 视觉记录系统</h1>
<div class="status-bar">
<span id="scheduler-status">状态: 加载中...</span>
<span id="capture-count">拍照次数: 0</span>
<span id="refresh-info">刷新间隔: 5秒</span>
</div>
</header>
<!-- 控制面板 -->
<section class="control-panel">
<div class="panel-section">
<h3>📹 摄像头控制</h3>
<div class="control-buttons">
<button onclick="startScheduler()" id="start-btn" class="btn-primary">▶ 启动</button>
<button onclick="stopScheduler()" id="stop-btn" class="btn-danger">⏹ 停止</button>
<button onclick="captureNow()" class="btn-secondary">📸 立即拍照</button>
</div>
</div>
<div class="panel-section">
<h3>👥 人员库</h3>
<button onclick="openPersonsModal()" class="btn-settings">查看人员库</button>
</div>
<div class="panel-section">
<h3>📊 统计图表</h3>
<button onclick="openStatsModal()" class="btn-settings">查看统计</button>
</div>
<div class="panel-section">
<h3>⚙️ 系统设置</h3>
<button onclick="openSettingsModal()" class="btn-settings">🔧 设置参数</button>
</div>
<div class="panel-section">
<h3>📊 系统统计</h3>
<div class="stats-grid" id="stats-display">
<div class="stat-item">
<span class="stat-label">总图片数</span>
<span class="stat-value" id="total-images">0</span>
</div>
<div class="stat-item">
<span class="stat-label">已分析</span>
<span class="stat-value" id="analyzed-images">0</span>
</div>
<div class="stat-item">
<span class="stat-label">总事件数</span>
<span class="stat-value" id="total-events">0</span>
</div>
</div>
</div>
</section>
<!-- 主内容区 -->
<div class="main-content">
<!-- 图片时间线 -->
<section class="images-section">
<h2>📷 图片时间线</h2>
<div class="filter-bar">
<select id="date-filter">
<option value="all">全部日期</option>
</select>
<select id="image-filter">
<option value="all">全部</option>
<option value="analyzed">已分析</option>
<option value="unanalyzed">未分析</option>
</select>
<button onclick="analyzeUnanalyzed()" class="btn-small">分析未处理</button>
</div>
<div class="images-list" id="images-list">
<!-- 图片列表将显示序号+分析信息 -->
</div>
</section>
<!-- 事件列表 -->
<section class="events-section">
<h2>📋 事件列表</h2>
<div class="filter-bar">
<select id="event-filter">
<option value="all">全部类型</option>
</select>
</div>
<div class="events-list" id="events-list">
<!-- 事件卡片 -->
</div>
</section>
</div>
<!-- 设置模态框 -->
<div class="modal" id="settings-modal" onclick="closeModalOnBackground(event, 'settings-modal')">
<div class="modal-content settings-modal-content" onclick="event.stopPropagation()">
<span class="modal-close" onclick="closeSettingsModal()">×</span>
<h2>Settings</h2>
<div class="settings-section">
<h4>Save Settings</h4>
<div class="setting-item">
<label>Save Dir:</label>
<input type="text" id="setting-images-dir">
</div>
<div class="setting-item">
<label>Interval (s):</label>
<input type="number" id="setting-interval" value="60" min="10" max="3600">
</div>
<div class="setting-item">
<label>Display Limit:</label>
<input type="number" id="setting-display-limit" value="20" min="5" max="100">
</div>
<div class="setting-item">
<label>Refresh (s):</label>
<input type="number" id="setting-refresh-interval" value="5" min="1" max="60">
</div>
</div>
<div class="settings-section">
<h4>Person Detection (YOLO)</h4>
<div class="setting-item">
<label>Enable:</label>
<input type="checkbox" id="setting-use-yolo" checked>
</div>
<div class="setting-item">
<label>Min Conf:</label>
<input type="number" id="setting-yolo-confidence" value="0.3" min="0.1" max="1" step="0.1">
</div>
</div>
<div class="settings-section">
<h4>Person Identification</h4>
<div class="setting-item">
<label>Face Rec:</label>
<input type="checkbox" id="setting-use-face-rec" checked>
</div>
<div class="setting-item">
<label>MediaPipe:</label>
<input type="checkbox" id="setting-use-mediapipe" checked>
</div>
<div class="setting-item">
<label>Color Hist:</label>
<input type="checkbox" id="setting-use-color-hist" checked>
</div>
<div class="setting-item">
<label>Threshold:</label>
<input type="number" id="setting-match-threshold" value="0.6" min="0.1" max="1" step="0.1">
</div>
</div>
<div class="settings-section">
<h4>Confirmation</h4>
<div class="setting-item">
<label>Confirm Frames:</label>
<input type="number" id="setting-confirm-frames" value="3" min="1" max="10">
</div>
<div class="setting-item">
<label>Leave Frames:</label>
<input type="number" id="setting-leave-frames" value="2" min="1" max="10">
</div>
</div>
<div class="settings-section">
<h4>AI Analysis</h4>
<div class="setting-item">
<label>Enable:</label>
<input type="checkbox" id="setting-use-vision-api">
</div>
<div class="setting-item">
<label>Trigger:</label>
<select id="setting-vision-trigger">
<option value="person_change">Person Change</option>
<option value="motion">Motion</option>
<option value="brightness">Brightness</option>
<option value="always">Always</option>
</select>
</div>
</div>
<div class="settings-section">
<h4>API Config</h4>
<div class="setting-item">
<label>URL:</label>
<input type="text" id="setting-api-url">
</div>
<div class="setting-item">
<label>Key:</label>
<input type="password" id="setting-api-key">
</div>
<div class="setting-item">
<label>Model:</label>
<input type="text" id="setting-model">
</div>
</div>
<div class="settings-actions">
<button onclick="saveSettings()" class="btn-primary">Save</button>
<button onclick="closeSettingsModal()" class="btn-secondary">Cancel</button>
</div>
</div>
</div>
<!-- 统计图表模态框 -->
<!-- 统计图表模态框 -->
<div class="modal" id="stats-modal" onclick="closeModalOnBackground(event, 'stats-modal')">
<div class="modal-content stats-modal-content" onclick="event.stopPropagation()">
<span class="modal-close" onclick="closeStatsModal()">×</span>
<h2>📊 统计图表</h2>
<div class="stats-controls">
<select id="stats-date-select">
<option value="yesterday">Yesterday</option>
<option value="today">Today</option>
</select>
<button onclick="loadDailyStats()" class="btn-small">Refresh</button>
</div>
<div class="stats-summary-box" id="stats-summary">
<!-- 统计摘要 -->
</div>
<div class="chart-container">
<h4>👥 Person Count Timeline</h4>
<canvas id="person-chart"></canvas>
</div>
<div class="chart-container">
<h4>📋 Event Types Distribution</h4>
<div id="event-types-chart">
<!-- 事件类型图表 -->
</div>
</div>
<div class="chart-container">
<h4>📈 History (Last 7 Days)</h4>
<div id="history-chart">
<!-- 历史趋势 -->
</div>
</div>
</div>
</div>
<!-- 人员库模态框 -->
<div class="modal" id="persons-modal" onclick="closeModalOnBackground(event, 'persons-modal')">
<div class="modal-content settings-modal-content" onclick="event.stopPropagation()">
<span class="modal-close" onclick="closePersonsModal()">×</span>
<h2>👥 人员库管理</h2>
<div class="persons-stats" id="persons-stats">
<!-- 统计信息 -->
</div>
<div class="persons-list" id="persons-list">
<!-- 人员列表 -->
</div>
</div>
</div>
<!-- 图片详情模态框 -->
<div class="modal" id="image-modal" onclick="closeModalOnBackground(event, 'image-modal')">
<div class="modal-content" onclick="event.stopPropagation()">
<span class="modal-close" onclick="closeImageModal()">×</span>
<img id="modal-image" src="" alt="图片详情">
<div class="modal-info">
<h3 id="modal-title">图片详情</h3>
<p id="modal-time">时间: </p>
<p id="modal-folder">日期文件夹: </p>
<div id="modal-events" class="modal-events">
</div>
<div class="modal-actions">
<button onclick="analyzeCurrentImage()" class="btn-secondary">🔍 分析</button>
<button onclick="deleteCurrentImage()" class="btn-danger">🗑 删除</button>
</div>
</div>
</div>
</div>
</div>
<script src="/static/app.js"></script>
</body>
</html>ml>