这个项目能做什么

UniPlateTracker 是一个自托管的私有仪表盘,用于跟踪由 UniFi Protect 相机捕获的车牌。它通过 webhook 接收来自 UniFi NVR 的实时检测事件,将数据记录到 PostgreSQL 数据库,并通过网页界面进行展示,以便查看、搜索和分析车辆活动。缩略图和视频文件均存储在用户自己的服务器上,并可选地集成英国 DVLA 查询,作为唯一描述的外部数据源。 功能包括: - 实时事件处理:车牌检测通过 webhook 实时到达并被处理。 - 按需视频捕获:一个独立的 Node.js 工作进程从相机的 RTSP 流中记录每个检测的短视频片段,由一个单独的缓冲区管理器处理预/后事件缓冲。 - 可选的 DVLA 集成(英国):获取车辆的详细信息,例如品牌、颜色、税收和 MOT 状态。国际模式下,非英国车牌将显示为“未知”,除非配置了 ENABLE_INTERNATIONAL_API。 - 管理员仪表盘:一个受保护的区域,包含图表和使用统计,以及分层管理员账户,允许初始管理员授予或撤销其他管理员的访问权限,并记录操作日志。 - 检测表格:密集且可排序,便于快速阅读。排序和过滤在数据库中执行,因此适用于整个结果集,而不是仅当前页。在窄屏上,表格会重排为卡片列表。 - 状态高亮:有效税收和 MOT 的车辆保持视觉安静,而过期、未缴税或 SORN 车辆则会被高亮。没有 DVLA 记录的车辆显示为虚线空心芯片,以区分缺失信息和干净结果。 - 可访问性:控件带有标签,支持键盘操作的排序和分页,表格具有 aria-sort 属性,并支持 prefers-reduced-motion。项目声称经过审计,无违规。 技术栈: Next.js 16(App Router)与 TypeScript、React 19、Tailwind CSS v4 和 shadcn/ui;Next.js API 路由与独立 Node.js 工作进程/缓冲区管理器;PostgreSQL 用于存储;FFmpeg 用于视频处理;集成 UniFi Protect webhook 和 DVLA API。由于 Tailwind v4 从 CSS 读取主题,因此没有 tailwind.config.ts 文件,设计令牌和样式位于 src/app/globals.css 的 @theme 块中。 部署: 文档中描述了两种方法:手动安装(安装 Node.js 20+、PostgreSQL 和 FFmpeg,配置 .env.local,初始化数据库,启动应用)和 Docker(下载 compose 文件,配置 .env.local,运行初始化容器,启动服务)。在 UniFi Protect 中,需要创建报警规则,触发条件为 ID > LPR,作用域为 LPR 相机,目标为应用的 /webhook URL,并启用缩略图。 故障排除: 如果检测显示“无剪辑”,可能是因为检测和捕获是独立路径,捕获可能失败而检测仍在到达。建议检查 VIDEO_FINAL_CAPTURE_PATH 中的最新文件、FFmpeg 是否安装、相机凭证是否有效、后台进程是否运行,以及用户是否有读取捕获目录的权限。虚线“无剪辑”表示预期有剪辑但缺失,而纯相机图标表示从未引用过剪辑。视频和缩略图请求仅接受特定字符集的文件名,以防止目录遍历攻击。