Commit Graph

4105 Commits

Author SHA1 Message Date
lzh
887e51eaaa [F11] 设备查询页 subsystemId 筛选 + 未归属标签
- apps/web-antd/src/api/iot/device/device/index.ts
  - Device 接口加 subsystemId/subsystemName
  - 新增 BindSubsystemReqVO + bindDeviceSubsystem (PUT /iot/device/bindSubsystem)
- apps/web-antd/src/views/iot/device/device/index.vue
  - 筛选器:子系统下拉 + 未归属哨兵 -1 (→ queryParams.unassigned=true)
  - 单设备/批量绑定弹窗,批量 100 台/批
  - 行操作 + TableAction 增加"绑定子系统"按钮 (auth: iot:device:update)
- apps/web-antd/src/views/iot/device/device/data.ts
  - useGridColumns 追加"所属子系统"列 (slot: subsystem)
- apps/web-antd/src/views/iot/device/device/modules/card-view.vue
  - 卡片视图加子系统信息行 + 未归属红标签
  - Props 透传 subsystems / searchParams.subsystemId / unassigned
- apps/web-antd/src/views/iot/device/device/__tests__/device-subsystem-filter.spec.ts
  - 14 用例: 筛选参数转换 / 未归属标签条件 / 批量分批逻辑
- locales/langs/{zh-CN,en-US}/page.json: iot.device.filter.subsystem.* 12 键同步
- Known Pitfalls 落地: 评审 A2 NULL 醒目红标签 / 哨兵 -1 → unassigned=true /
  批量 100 台分批 / iot:device:update 权限 / simple-list 加载静默降级

后端 B11 API 补充契约:
- GET /iot/device/page?unassigned=true (subsystemId IS NULL 过滤)
- PUT /iot/device/bindSubsystem { deviceId, subsystemId: number | null }
- 分页响应 Device 含 subsystemId?: number | null + subsystemName?: string

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 23:02:01 +08:00
lzh
ba459aa1d7 [F9/F10] 子系统管理 + 告警正交 5 态列表(UI 骨架 + mock)
两任务并行完成,因同动 router/iot.ts 与 locales/page.json 合并 commit。

F9 子系统管理 + 设备批量绑定:
- apps/web-antd/src/api/iot/subsystem/index.ts
- apps/web-antd/src/views/iot/subsystem/{list,form,devices}.vue
- apps/web-antd/src/views/iot/subsystem/__tests__/subsystem-utils.test.ts (18 用例)
- Known Pitfalls: 评审 A6 Redis stats 降级 / A7 403 拦截器 / 批量 100 台 / code regex snake_case
- 后端 B10/B11 API 契约: /iot/subsystem/{page,get,create,update,delete,simple-list,device-count}
  + /iot/device/{batchBindSubsystem,bindSubsystem} + /iot/device/page 加 subsystemId 过滤

F10 告警记录 (评审 C1 正交 5 态):
- apps/web-antd/src/views/iot/alarm/record/{list,detail}.vue
- apps/web-antd/src/views/iot/alarm/record/{alarm-state,api}.ts
- apps/web-antd/src/views/iot/alarm/record/components/{AlarmStateTag,AlarmOperations}.vue
- apps/web-antd/src/views/iot/alarm/record/__tests__/AlarmStateTag.spec.ts (12 用例)
- 5 态: 活跃·未确认(red) / 活跃·已确认(orange) / 已清除·未确认(gold醒目) / 已清除·已确认(green) / 已归档(default)
- Known Pitfalls: C1 5 态必展示 / archived 优先判断 / 30s 轮询 / 严重度颜色映射
- 后端 B12 API 契约: /iot/alarm-record/{page,get,ack,unack,clear,archive,batch-*,history,remark}

共同:
- apps/web-antd/src/router/routes/modules/iot.ts 追加 subsystem + alarm 路由
- locales/langs/{zh-CN,en-US}/page.json 追加 iot.subsystem.* + iot.alarm.*

note: 路由用顶级路径;项目采用动态菜单机制,菜单注册需后端 menu 表配置(运维侧工作),
      前端路由可通过 URL 直接访问。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:39:47 +08:00
lzh
8613641d1d [F2] DAG 节点面板(左侧拖拽区)
- apps/web-antd/src/components/iot-dag/DagNodePanel.vue
  - 3 类分组 collapse + 搜索过滤 + 加载/错误/空态
- apps/web-antd/src/components/iot-dag/NodeTypeCard.vue
  - HTML5 dragstart 双 MIME:application/x-iot-dag-node + text/plain
  - payload: { type: providerType, category: dagNodeType }
- apps/web-antd/src/components/iot-dag/hooks/useNodeCatalog.ts
  - Mock 13 节点类型(5 trigger / 3 condition / 5 action)
  - fetcher 可注入、permissionFilter 预留
  - TODO(F3/F7): 替换为 @vben/request /iot/rule/provider/metadata
- apps/web-antd/src/components/iot-dag/__tests__/useNodeCatalog.spec.ts 17 用例
- apps/web-antd/src/components/iot-dag/index.ts barrel 增加 DagNodePanel/NodeTypeCard
- i18n: iot.dag.panel.* + iot.dag.node.<type>.{name,desc} zh-CN/en-US 同步
- Known Pitfalls 落地: ⚠️ Firefox dataTransfer 双 MIME / 权限过滤预留 / icon Lucide 名

note: Acceptance #3 drop 由 F3/F7 DagCanvasContainer 实现,F2 只负责发送方。
      图标通过 data-icon attribute 传递,F3/F7 集成时接入 lucide-vue-next 渲染。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:07:37 +08:00
lzh
5253a7a818 [F8] DAG JSON ↔ vue-flow 双向转换
- apps/web-antd/src/views/iot/rule/chain/utils/dag-converter.ts
  - toCanvas / fromCanvas 对称转换
  - newTempId (crypto.randomUUID) + isTempId (new_ 前缀)
  - RuleChainGraphVO/RuleChainNodeVO/RuleChainLinkVO 本地类型定义
  - B2 后端 DTO 就绪后可平替类型,转换函数签名不变
- apps/web-antd/src/views/iot/rule/chain/utils/dag-converter.spec.ts
  - 23 用例:roundtrip_simple / roundtrip_branch / newNode_tempId / emptyGraph
  - 对称性断言 toCanvas(fromCanvas(toCanvas(x))) ≡ toCanvas(x)
- Known Pitfalls 落地: ⚠️ 临时 ID 字符串穿透 / Math.round 坐标 / relationType PascalCase / edge source-target 校验

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:59:13 +08:00
lzh
7dbf41b75f [F1] @vue-flow/core 依赖 + DagCanvas 基础组件
- apps/web-antd/src/components/iot-dag/ 7 文件
  - DagCanvas.vue / DagCanvasToolbar.vue
  - hooks/useDagState.ts(50 步撤销栈 + structuredClone 深拷贝)
  - hooks/useDagShortcuts.ts(Del/Ctrl+Z/Ctrl+Y + input guard)
  - types.ts(DagNode/DagEdge/DagCanvasProps + 6 emits)
  - index.ts barrel + __tests__/DagCanvas.spec.ts(16 用例全绿)
- pnpm-workspace.yaml: catalog 新增 @vue-flow/{core,background,controls,minimap}
- apps/web-antd/package.json: 4 包全部 'catalog:' 引用
- i18n: zh-CN/en-US iot.dag.toolbar.* + iot.dag.canvas.* 同步
- Known Pitfalls 落地: ⚠️ catalog 约束 / 样式 import / TS 严格零 any

note: Acceptance #7 (Storybook/playground) 项目未集成 Storybook,
      由 F7 规则链编辑页自然 dogfood。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:32:11 +08:00
lzh
c0646a4f4f chore: CLAUDE.md 改为本地不追踪
原 restore-yudao-backend 分支将 CLAUDE.md 纳入追踪,合并后与 .gitignore
规则冲突(gitignore 声明忽略该文件但已追踪文件不受影响)。本 commit 将
其从索引移除,文件保留在工作树上作为 Claude Code 本地配置,符合
.gitignore 与 AGENTS.md/CLAUDE.md 方案 C 的约定。
2026-04-23 20:24:48 +08:00
lzh
be0d6d5289 chore: 同步 restore-yudao-backend 分支到 feat/iot-2.0
合并 restore-yudao-backend 累积的 99 个 commit(登录 UI 重构 / SSO 单点 /
告警看板 / ROI 改造 / 工单 H5 / 多项目切换 / video 模块重构等),
作为 IoT v2.0 前端开发基线。

# Conflicts:
#	.gitignore
2026-04-23 20:20:31 +08:00
lzh
b90b371d53 新增: 登录页 UI 重构 + 品牌 logo 与 Lottie 启动动画
视觉与品牌
- public/logo.svg、public/login-illustration.svg、favicon 替换为 logo.svg。
- preferences.ts 新增 logo.source 指向 /logo.svg。
- packages/effects/layouts 导出 LoginIllustration 共享组件(浮动插画,加载失败自动隐藏)。

Auth 布局重构
- layouts/auth.vue 替换默认 AuthPageLayout:主题色渐变背景 + 左侧浮动插画 +
  品牌卡片 + 右上 LanguageToggle + 圆角登录卡片;KeepAlive 仅缓存 Login
  (CodeLogin/QrCodeLogin 需要每次刷新验证码/二维码)。
- 表单样式通过 :deep(.login-form-container) 覆盖输入框、选择框、主按钮,
  全部走 --primary 变量,与主题色联动。

登录组件
- views/_core/authentication/login.vue: 关闭默认 codeLogin/qrcodeLogin/
  thirdPartyLogin/register/docLink,改为手机 / 二维码 / 企微三按钮(IconifyIcon);
  三方登录前检查租户,缺失时 message.warning + validateField。
- packages/effects/common-ui/authentication/login.vue + types.ts:
  新增 showDocLink prop(默认 true),替代原本 HTML 注释掉 DocLink 的做法。
- sso-callback.vue: 等待提示改为 LottieLoading 动画。

Lottie 启动动画
- 新增 loading.html(注入进 index.html)+ public/loading.json + 运行时拷贝的
  public/lottie_light.min.js(.gitignore 忽略)。
- 新增 public/lottie-tint.js:共享主题色适配器(LIGHTNESSES / SHADE_MAP /
  hslToRgb / patchColors / readPrimary),同时被启动白屏脚本与 Vue 组件使用,
  消除两份几乎一致的实现。
- 新增 src/components/lottie-loading/LottieLoading.vue:按需加载 lottie-tint.js
  并根据 CSS 变量 --primary 重新上色。
- vite.config.mts 新增 copyLottiePlayer 插件:configResolved 时无条件把
  node_modules/lottie-web/.../lottie_light.min.js 拷到 public/,避免 mtime 误判。
- package.json 新增 lottie-web ^5.13.0 依赖。

i18n
- 新增 otherLoginMethods / contactSupport / weComLogin 三个文案(zh-CN / en-US)。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 19:35:04 +08:00
lzh
6e2ca79c44 配置: 默认首页切换到 /iot/home,下线旧 Dashboard 与设备分布地图
- preferences.ts: 覆盖框架默认的 defaultHomePath: '/analytics' 为 '/iot/home',
  登录后直接进入 IoT 概览页。
- router/routes/modules/dashboard.ts: 删除 Dashboard/Workspace/Analytics 路由
  (不再作为菜单项暴露),仅保留 Profile。
- views/iot/home/index.vue: 移除 DeviceMapCard(依赖的后端
  /admin-api/iot/device/location-list 接口尚未就绪,避免无效请求)。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 19:34:20 +08:00
lzh
ea15ef332c 重构: video 模块走芋道网关统一鉴权,移除独立 WVP JWT 客户端
- api/video/request.ts: 删除自实现的 WVP access-token 登录/缓存/401 续期逻辑,
  直接 re-export requestClient(yudao Authorization: Bearer),
  wvpRequestClient 名字仅作过渡期别名,TODO 标记后续统一重命名。
- api/video/device/index.ts: 路径从 /video/device/{proxy,user,server,...} 迁移到
  后端 @RequestMapping 对齐的 /video/{proxy,ai/*,server/media_server};
  删除 getAlertImageUrl(老 WVP 时代产物),删除截图 URL 里的 ?access-token。
- api/video/edge/index.ts: /video/device/device/* -> /video/ai/device/*(对齐 AiEdgeDeviceController)。
- views/video/device/camera: HEAD 探活 URL 同步,补注释说明后端需对
  /video/ai/roi/snap/image permitAll 或依赖 session cookie。
- vite.config: 删除 /admin-api/video/device/* 按子路径 rewrite 到 WVP:18080 的规则,
  统一走 /admin-api 到芋道网关 48080;去掉 VITE_WVP_USERNAME/PASSWORD_MD5 依赖
  (安全改进:凭据不再打进客户端 bundle)。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 19:33:37 +08:00
lzh
5d42c2bfe6 feat(iot-v2): 新增 AGENTS.md 跨 agent 通用规范(方案 C)
- AGENTS.md 作为 agents.md 标准规范文件(Claude Code/Cursor/Codex 等通用)
- .gitignore 补充 .claude/ 和 CLAUDE.md 忽略规则
- AGENTS.md 追踪进入 git(团队共享)

涵盖:
- 项目背景(IoT v2.0 前端升级)
- 任务卡系统引用(14-任务执行卡/Fxx)
- 硬约束(分支 feat/iot-2.0 / 禁止 push / 决策 5 双入口)
- 前端约定(TS 严格 / pnpm catalog / i18n / 模板变量)
- 告警正交状态 5 种组合展示(评审 C1)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 17:49:22 +08:00
lzh
0aa4a2f68e 新增: 多项目切换 + 业务平台 SSO 单点跳转
核心功能:
1. 多项目切换:header 新增 ProjectDropdown,切项目时自动刷新权限菜单
2. 业务平台 SSO:header 新增「业务平台」按钮,OAuth2 授权码流程无感跳转
3. SSO 回调:/sso-callback 页面接收业务平台跳回的 code,换 IoT token 登录

共享包改动:
- packages/stores:access store 新增 projectId 字段并加入持久化
- packages/effects/layouts:新增 ProjectDropdown 共享组件

apps/web-antd 改动:
- api/request.ts:
  · project-id 请求头仅在非 null 时设置(避免 axios 把 null 序列化为字符串 "null")
  · X-Client-Id 改读 VITE_APP_CLIENT_ID,允许多个壳应用各自声明
- api/core/sso.ts:ssoCallback 参数走 body,避免 code 出现在浏览器历史/nginx 日志
- api/system/project:新增项目 simple-list API
- constants/sso.ts:集中 IOT_CLIENT_ID/BIZ_CLIENT_ID 等常量;
  generateOauthState 用 crypto.randomUUID 生成 state,替代不安全的 Math.random
- store/auth.ts:抽 completeLogin 公共收尾逻辑,新增 ssoLogin 复用
- views/_core/authentication/sso-callback.vue:SSO 回调页;
  dev 模式保留时延日志,失败时通过 query 透给登录页
- router/routes/core.ts:/sso-callback 路由 + beforeEnter 守卫
  (缺 code 直接拦回登录页,避免死循环)
- layouts/basic.vue:
  · 以 ProjectDropdown 替换 TenantDropdown(列表拉取失败兜底隐藏)
  · 切项目时调用 fetchUserInfo,避免菜单/权限陈旧
  · 新增「业务平台」跳转按钮;state 写 sessionStorage,
    生产缺 VITE_BIZ_BASE_URL 时显式报错而非静默回 localhost
  · setInterval 在 onUnmounted 中清理

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 00:08:33 +08:00
lzh
5cd86e6cf1 重构: aiot 模块重命名为 video,WVP 凭据移至环境变量
路径重命名:
- api/aiot/{alarm,device,edge,request} → api/video/{alarm,device,edge,request}
- views/aiot/{alarm,device,edge} → views/video/{alarm,device,edge}
- vite.config.mts 代理路径 /admin-api/aiot/* → /admin-api/video/*

video/request.ts 改造:
- WVP 用户名/密码 MD5 改读 import.meta.env,不再写死在源码里
- force 截图失败时补一条 console.debug,便于回溯 COS 图片加载异常

video/alarm/index.ts 顺带清理:
- 移除无调用方的重复 API getRecentAlerts(与 getAlertPage 重叠)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:57:44 +08:00
lzh
4111c3a34f 配置: 品牌更名「物联运维平台」+ SSO/WVP 环境变量
- 四个 apps 的 VITE_APP_TITLE 改为「物联运维平台」
- web-antd 开发端口改为 5667,与业务平台 5666 错开
- web-antd 新增 VITE_APP_CLIENT_ID(OAuth2 客户端编号,后端按此过滤菜单)
- web-antd 新增 VITE_BIZ_BASE_URL(业务平台地址,用于 SSO 跳转;生产环境按实际域名覆盖)
- web-antd 新增 VITE_WVP_USERNAME / VITE_WVP_PASSWORD_MD5(WVP 凭据走 env,便于生产覆盖)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:56:19 +08:00
lzh
e49a1db57e 同步:iot 模块同步至 yudao/master 最新
- 新增 Modbus 支持:config/point API + 3 个表单/列表组件
  - apps/web-antd/src/api/iot/device/modbus/{config,point}/index.ts
  - apps/web-antd/src/views/iot/device/device/detail/modules/modbus-*.vue
- 设备详情页与子设备列表按 upstream 更新对齐
- 产品/数据类型、物模型常量更新
- packages/constants/dict-enum: 新增 IOT_MODBUS_MODE / IOT_MODBUS_FRAME_FORMAT,
  IOT_CODEC_TYPE 重命名为 IOT_SERIALIZE_TYPE(本地无引用)

对比 yudao/master 范围:
  git diff 36aa19537..yudao/master -- 'apps/web-antd/src/{views,api}/iot'

类型检查:对 iot 模块净引入 4/净修复 4,均为 upstream 本身的历史问题。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 10:02:02 +08:00
lzh
ddd305fef0 恢复:框架层对接芋道后端
- vite.config.mts: 移除 /admin-api/system/* 5 条转发至 8000 的规则,
  system/infra 等基础接口回归兜底 /admin-api → 48080;
  保留 AIoT 业务必需的代理(/admin-api/aiot/*、/uploads、/captures)
- store/auth.ts: 移除 hideMenuItems/renameMenuItems 菜单后处理,
  恢复 accessStore.setAccessMenus 直接写入后端原始菜单
- .env: VITE_APP_TITLE / VITE_APP_TENANT_ENABLE / VITE_APP_API_ENCRYPT_ENABLE
  三项恢复 upstream 默认值(芋道管理系统 / true / true)

保留项(AIoT 业务):/work-order 公开路由、AIoT API & 视图、
WVP 代理规则、packages/@core/preferences 默认主题

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 09:14:00 +08:00
717832aa4f 修复: 设备切换防竞态 + isModified 设备模式比较基准修正 2026-04-13 15:48:43 +08:00
e0983a693a 改造: 全局参数配置页面支持按设备查看和修改 ROI 绑定参数 2026-04-10 12:51:49 +08:00
6eea4e81cd 新增: 算法全局参数配置页面 + ROI 编辑器显示全局默认提示 2026-04-09 17:09:58 +08:00
a82ccbd145 新增: 告警列表支持非机动车违停类型显示和筛选 2026-04-09 10:00:54 +08:00
7e13025e3b 优化:ROI 编辑页删除边缘设备选择器
device_id 现在由后端从摄像头配置自动继承,前端不再需要手动选择。
2026-03-30 14:14:28 +08:00
ed25910679 重构:ROI选区界面改造 — 全图+自定义选区+可收起面板
RoiCanvas.vue:
- 移除矩形绘制模式,保留多边形+鼠标跟随线+闭合预览
- 键盘事件:Esc取消、Ctrl+Z撤销上一顶点
- 支持 fullscreen 类型渲染和点击检测
- 绘制中底部浮动提示条

index.vue:
- 工具栏:默认[全图][自定义选区],绘制中[完成][撤销][取消]
- 全图按钮一键创建覆盖整张图的ROI
- 初始Canvas全宽,点击ROI后右侧面板滑出(60%/40%)
- 面板关闭按钮+删除最后ROI时自动收起
- ROI标签显示全图/自定义/矩形
2026-03-27 09:21:23 +08:00
9449c48327 修复:告警操作按钮改造 — 处理弹窗+误报按钮
1. "处理"按钮改为弹窗(支持备注输入),状态直接变为已处理
2. "忽略"按钮文案改为"误报",语义更准确
3. 处理中状态(企微保安负责)无多余操作按钮
2026-03-25 15:10:58 +08:00
dddaaddd4d 修复:移除 @ant-design/icons-vue 依赖,改用 emoji 图标
work-order/index.vue 引用了未安装的 @ant-design/icons-vue,
导致生产构建失败。改用 emoji 替代。
2026-03-23 17:27:12 +08:00
5182e81429 Revert "功能:摄像头页面增加区域选择器"
This reverts commit 84ec762d09.
2026-03-23 17:02:30 +08:00
84ec762d09 功能:摄像头页面增加区域选择器
1. 编辑弹窗新增「所属区域」下拉框,支持搜索,数据来自 IoT 平台
2. 表格新增「区域」列显示已绑定的区域名称
3. API 新增 getAreaList 函数查询 vsp-service 区域列表接口
4. Vite 代理新增 /api/area → vsp-service:8000
5. Camera 类型新增 areaId 字段
2026-03-23 16:49:27 +08:00
d3eb97eb8b 功能:H5 工单页企微 OAuth2 认证
页面打开时检查 URL 中的 code,有则换 userid,
无则跳转企微授权页。未配置企微参数时跳过(开发模式)。
2026-03-23 12:59:59 +08:00
8077d4204a 功能:添加 /work-order 路由,无布局无需登录,企微 H5 直接访问 2026-03-23 12:05:26 +08:00
bf304e5dfd 功能:H5 工单详情页
- 展示告警截图、类型、级别、摄像头、时间
- 处理中状态:处理描述输入+拍照上传+提交按钮
- 已完成状态:展示处理结果(只读)
- 移动端适配,企微内打开
2026-03-23 12:03:00 +08:00
6dca2a68c0 功能:摄像头管理页面增加边缘设备绑定选择
- 表格新增「边缘设备」列
- 编辑弹窗新增边缘设备下拉选择(edge/edge_002)
- 新建摄像头默认绑定 edge
2026-03-22 01:08:03 +08:00
aa76e3cba9 修复:ROI页面边缘设备列表API路径去掉多余前缀 2026-03-20 21:45:20 +08:00
b0120432a6 修复:ROI页面边缘设备下拉框API路径 2026-03-20 16:27:03 +08:00
7332ff5f1e 修复:app/stream 填充默认值 default/001,不再用 cameraName 覆盖 2026-03-19 11:49:08 +08:00
a0d4e6d05d 优化:告警趋势图从堆叠面积改为独立折线图
去掉 stack + areaStyle,每种告警类型独立一条折线,
都从 Y 轴 0 开始,更直观易读。
2026-03-19 11:42:50 +08:00
8bce09a17a 功能:摄像头配置页面适配 cameraName
- 表格列:app+stream 改为摄像头名称
- 编辑弹窗:去掉应用名+流ID,改为摄像头名称(必填)
- app/stream 由后端自动处理,前端不再暴露
- Camera 类型新增 cameraName 字段
2026-03-19 11:42:17 +08:00
617cdc8c15 功能:告警列表摄像头搜索改为下拉选择+输入搜索
- 新增 getCameraOptions API(从 WVP 获取摄像头列表)
- 搜索框改为 ApiSelect 组件,支持下拉选择和输入前缀匹配
- 选中后用 cameraCode 查询后端
2026-03-19 11:36:56 +08:00
4c287ca690 性能:看板改为单次请求加载,从5个并发请求优化为1个
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 17:31:21 +08:00
852be25413 功能:侧边栏菜单「告警汇总」重命名为「告警看板」
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 17:20:59 +08:00
d2a77079af 功能:告警数据看板替换原告警汇总页
- 5 个 KPI 卡片(今日告警/待处理/已处理/平均响应/在线设备)
- 告警趋势面积图(7天/30天切换,按类型堆叠)
- 告警类型分布环形图(中心显示总数)
- 设备告警 Top10 横向条形图
- 告警级别分布柱状图
- 24小时时段分布图(高亮高峰时段)
- 最近告警滚动列表
- 60秒自动刷新

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 17:11:02 +08:00
58db3c7eb4 功能:算法绑定页增加告警等级选择器
支持在 ROI 算法绑定中配置告警等级(紧急/重要/普通/轻微),
等级保存在 params JSON 中,各算法有默认等级。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 16:32:58 +08:00
67085ffcfc 功能:告警级别调整为四级(轻微/普通/重要/紧急)并更新颜色
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 16:32:57 +08:00
8d5f2f138d 功能:隐藏 ROI 菜单项,ROI 配置已整合到摄像头管理中
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 16:32:33 +08:00
72b97453d3 修复:ROI Canvas 响应式对齐,精确覆盖图片内容区域
通过计算 object-fit: contain 下图片的真实渲染区域,让 Canvas 精确覆盖
图片内容而非整个容器(含黑边),解决不同屏幕/缩放下 ROI 偏移问题。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 16:30:33 +08:00
694c5c7af1 功能:边缘节点页面重写为卡片列表
- VxeGrid 表格改为 Card 卡片布局
- 新增 getDeviceList() 调用 WVP list 接口
- 每张卡片展示:设备ID、状态Tag、最后心跳、运行时长、摄像头数、配置版本
- data.ts 精简为状态配置和 formatUptime 工具函数

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 17:47:31 +08:00
4cd07c3fef 功能:前端支持车辆违停和车辆拥堵算法
- data.ts: ALERT_TYPE_OPTIONS新增车辆违停/拥堵选项
- AlgorithmParamEditor.vue: 新增违停和拥堵参数中英文名称及说明映射
- RoiAlgorithmBind.vue: 新增车辆算法帧率映射(1帧/秒)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:54:50 +08:00
0aa45be41f 修复:状态栏位置 + 导入顺序 + 移除多余token
1. 状态栏位置修正
   - 正确位置:应用名 -> 流ID -> 拉流地址 -> 状态 -> ROI
   - 之前错误地放在了流ID和拉流地址之间

2. 修复导入顺序
   - useAppConfig应在script setup顶部导入
   - 避免apiURL未正确初始化的问题

3. 状态检测优化
   - /snap/image已免认证,移除access-token参数
   - 简化HEAD请求逻辑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 16:50:24 +08:00
0e73aa2b8d 修复:状态栏位置调整 + HEAD请求检测截图状态
1. 状态栏位置调整
   - 列顺序改为:应用名 -> 流ID -> 状态 -> 拉流地址 -> ROI

2. 状态检测优化
   - 使用 HEAD 请求替代 GET,避免下载完整图片
   - 使用 fetch API 直接发送 HEAD 请求到 /snap/image
   - 大幅提升状态检测性能

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 16:29:47 +08:00
fae585f5e9 功能:摄像头状态指示器 + 截图缓存优化 + 截图预热
1. 摄像头列表状态指示器(绿/红点)
   - 新增状态列显示摄像头截图可用性
   - 绿色=截图正常,红色=截图失败,灰色=加载中
   - 使用 /snap/image 代理端点检测状态

2. 截图缓存优化(getSnapUrl 重写)
   - 非强制模式:返回稳定URL(无时间戳),浏览器缓存5分钟
   - 强制模式:先触发边缘截图,再返回带时间戳URL破缓存
   - 使用 /snap/image 代理端点,避免COS预签名URL过期问题

3. 截图预热(新增摄像头时)
   - 添加摄像头成功后自动触发首次截图
   - 预热失败不影响主流程(非阻塞)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 16:02:41 +08:00
eab4337a77 功能:ROI绑定算法时校验RTSP地址有效性
截图加载失败时阻止算法绑定并提示"RTSP拉流地址无效",
通过Canvas截图加载状态逐层传递到算法绑定组件实现校验。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 15:25:07 +08:00
d8e1ae5dab refactor: 摄像头管理页面移除状态栏、拉流和导出按钮
- 删除"状态"列(拉流中/未拉流)
- 删除操作栏中"拉流"和"导出"按钮,保留ROI配置、编辑、删除
- 删除搜索栏中"拉流状态"筛选
- 清理无用import和方法(toggleStream/handleExport/startCamera/stopCamera/exportConfig)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 11:20:01 +08:00