Skip to content

About

云瞰的User Interface

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

云瞰 · VMS Web UI

面向家庭监控场景的轻量 VMS 管理界面。项目直接消费现有云瞰 API,不包含演示摄像机、模拟事件或硬编码统计数据。

功能

  • 首次使用:选择语言 → 填写服务器地址 → 用户名与密码登录 → 服务端验证
  • 五种完整界面语言:简体中文、English、繁體中文、日本語、Français
  • 系统总览:真实相机快照、事件统计与趋势、录像/检测/服务健康、存储容量
  • 实时快照墙、事件主从视图、录像时间线、设备、存储和系统状态页面
  • 各数据模块独立 loading / error / empty 状态,一个接口失败不会拖垮整页
  • 桌面优先并支持窄屏与移动端导航

本地运行

npm install
npm run dev

开发服务器仅监听 127.0.0.1,端口由 Vite 自动选择;默认端口被占用时会继续尝试下一个可用端口。UI 始终根据当前页面的 origin 定位代理,不依赖固定的 4173 或 5173。当所选 VMS 地址与页面跨源时,UI 会自动使用内置的同源开发代理转发 /healthz 和 /api/*,因此不需要修改旧 VMS 的 CORS 配置,也不会把 JWT 放入 URL。修改代理配置后需重启开发服务器。

生产构建与预览:

npm run build
npm run preview

测试:

npm test

API 与安全

  • 登录:POST /api/auth/login,请求体为 { username, password }
  • 当前账号:GET /api/auth/me
  • 鉴权:Authorization: Bearer <access_token>
  • 相机快照和事件图片通过带鉴权的 fetch 获取 Blob,再创建浏览器 Object URL;令牌不会放入图片 URL
  • 服务器地址和界面语言保存在 localStorage
  • 默认情况下 Bearer 会话仅保存在 sessionStorage,密码不持久化
  • 用户主动勾选“保持登录(记住密码)”后,用户名、密码和 Bearer 会话会保存在当前浏览器的 localStorage;仅建议在私人设备上启用
  • 不发送全局 Accept-Language;后端业务错误消息保持原文
  • 设备 URL 在展示前会移除用户名和密码

核心总览数据来自:

  • /api/cameras
  • /api/events/stats?include_hourly=true
  • /api/events/recent
  • /api/detection/status
  • /api/recordings/health
  • /api/system/storage
  • /api/storage/by-camera
  • /api/system/status
  • /api/system/services

部署说明

UI 使用 Hash Router,可部署为静态资源。npm run dev 和 npm run preview 中的代理仅用于本机开发与验收,不会进入静态构建产物,也不应作为生产服务。生产环境需将 UI 与 VMS Web/API 统一入口同源部署,或由 Nginx/Caddy 将 /healthz 和 /api/* 反向代理到 VMS。当前旧 Web 入口对部分受保护路由的 CORS 预检会返回 401,因此生产环境也不要依赖跨源 Bearer 请求,更不要把 JWT 放入 query string。

服务端 Logo 从所选服务器的 /icons/icon-192-maskable.png 动态读取;不可用时使用内置的无品牌回退图标。

About

云瞰的User Interface

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages