Commit Graph

4024 Commits

Author SHA1 Message Date
5d43b46155 debug(aiot): 添加工作时间参数保存的详细日志
问题:用户保存工作时间参数时提示"参数保存失败"
调试:添加详细console日志帮助排查问题
- 显示保存前的原始数据
- 显示参数验证过程
- 显示working_hours格式检查
- 显示请求payload
- 显示完整的错误响应

使用:打开浏览器F12控制台查看日志
2026-02-13 16:07:25 +08:00
792424717a fix(aiot): ROI配置页面显示应用名而不是camera_code
问题:ROI配置页面显示camera_code(技术标识符),用户体验差
修复:
- 摄像头选择器显示应用名
- 页面标题显示应用名(如:测试区域A - ROI配置)
- camera_code仅作为后台标识符使用,不暴露给用户

影响页面:/aiot/device/roi
2026-02-13 15:52:58 +08:00
bf93a1afec fix(aiot): 恢复摄像头管理页面应用名显示和输入 - 改善用户体验
- 表格恢复显示应用名和流ID列,移除用户看不懂的摄像头编码列
- 表单恢复应用名输入框,用户可输入有意义的名称(如:大堂、停车场等)
- 恢复应用名必填验证
- camera_code在后台自动生成,前端只在编辑时只读显示
- 改善用户体验:用户看到的是可理解的应用名,而不是技术编码
2026-02-13 13:29:58 +08:00
ac345a4728 feat(aiot): ROI配置页面改用cameraCode参数和截图调用
- 路由参数:从query读取cameraCode替代cameraId
- 移除app/stream状态变量,统一使用cameraCode
- 截图调用:getSnapUrl(cameraCode)替代getSnapUrl(app, stream)
- loadCameraOptions:使用cameraCode作为选项value和label
- onCameraSelected:直接设置cameraCode,移除app/stream赋值
- 配置推送/导出:使用cameraCode参数
- 页面标题:显示cameraCode

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:34:59 +08:00
4bbc4b16dd feat(aiot): 摄像头管理页面改用cameraCode,隐藏app输入
- 表格列:将"应用名"改为"摄像头编码",显示cameraCode字段
- loadRoiCounts:使用cameraCode替代app/stream拼接
- handleRoiConfig:路由query使用cameraCode替代cameraId
- handleExport:使用cameraCode导出配置
- 表单:隐藏app输入框,编辑模式显示cameraCode(只读)
- 删除确认:显示cameraCode而非app/stream
- 验证逻辑:移除app字段必填验证

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:34:34 +08:00
2583ed5335 feat(aiot): Camera接口增加cameraCode字段,getSnapUrl改用cameraCode
- Camera interface 增加 cameraCode?: string 字段
- getSnapUrl 函数参数从 (app, stream) 改为 (cameraCode)
- 截图URL查询参数从 app/stream 改为 cameraCode
- 配合后端 camera_code 重构计划

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:24:31 +08:00
92a6031e72 fix(aiot): 修复告警列表自动计时 - duration_ms为NULL时显示进行中
问题描述:
- 前端告警列表对于新触发的告警(duration_ms=null)仍然显示"5分"等具体时长
- 这是因为前端在显示时没有正确处理null值

解决方案:
- 修改 formatDuration 函数,显式检查 duration_ms 是否为 null/undefined
- 当 duration_ms 为 null 时,返回"进行中"而不是"--"
- 简化模板代码,直接调用 formatDuration 函数处理所有情况

影响范围:
- 告警列表表格的持续时长列
- 告警详情弹窗的持续时长字段

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:29:26 +08:00
b6217a8b02 feat(aiot): 优化算法参数配置界面 - 修复保存失败+精美时间选择器
问题修复:
1. 修复算法参数保存失败问题
   - working_hours 数据格式错误(字符串数组 → 对象数组)
   - 添加参数校验逻辑
   - 改进错误提示(显示后端具体错误信息)

2. 全新时间段选择器组件
   - WorkingHoursEditor.vue(精美可视化界面)
   - 快捷模板:全天/单班制/两班制/三班制
   - 可视化时间选择(TimePicker.RangePicker)
   - 智能校验(时间段不重叠、结束>开始)
   - 实时预览已配置时间段

核心改进:
1. AlgorithmParamEditor.vue
   - 引入 WorkingHoursEditor 组件
   - 特殊处理 working_hours 字段
   - validateParams() 参数校验
   - 改进错误提示(catch块显示详细错误)
   - 增加帮助提示

2. WorkingHoursEditor.vue(新建)
   - 快捷模板区域:
     * 全天监控(空数组)
     * 单班制(09:00-18:00)
     * 两班制(09:00-12:00, 14:00-18:00)
     * 三班制(08:00-16:00, 16:00-00:00, 00:00-08:00)
   - 自定义时间段:
     * TimePicker.RangePicker 可视化选择
     * 时间段卡片展示
     * 一键删除、清空全部
     * 显示时长(小时+分钟)
   - 智能校验:
     * 结束时间 > 开始时间
     * 时间段不重叠
     * 实时错误提示
   - 帮助说明:使用提示

UI设计亮点:
- 卡片式布局,清晰直观
- 快捷模板一键应用
- 时间段自动排序
- 空状态优化
- 响应式设计
- 精美的图标和颜色

数据格式:
before: ["09:00-18:00"]  //  字符串数组
after:  [{"start": "09:00", "end": "18:00"}]  //  对象数组

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-12 17:31:31 +08:00
a2284d8991 feat(aiot): 告警列表-持续时长格式化 + 创建时间改为结束时间
API类型定义:
- Alert接口新增durationMs、lastFrameTime字段

列表展示优化:
- 持续时长列改为读取durationMs,自适应格式化(秒/分/时)
- "创建时间"列替换为"结束时间"列,显示lastFrameTime或handledAt
- 详情弹窗持续时长同步使用formatDuration格式化
2026-02-11 17:56:17 +08:00
e54fcf1f8c feat(aiot): 告警截图展示 + 全局配置同步 + API兼容修复
- 告警列表新增截图缩略图列,支持预览大图
- 告警详情显示截图 URL 链接
- 摄像头管理页新增「同步全局配置」按钮
- 告警 API 路径修正: camera-summary → device-summary
- 告警 ID 兼容 alarmId 字符串格式
- Vite 代理新增 /uploads、/captures、/aiot/storage 路由

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 09:57:29 +08:00
777e52986e fix(aiot): 修复摄像头保存失败 + 标题改为摄像头管理系统
- saveCamera 拆分为 addCamera/updateCamera 匹配WVP实际接口
- .env 标题改为"摄像头管理系统"
- 告警列表字段适配新三表结构
- preferences 配置调整

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 15:22:31 +08:00
4b54a50d8c fix(aiot): 删除实时视频模块
删除 views/aiot/video 和 api/aiot/video 目录,
撤回 auth.ts 中的菜单过滤逻辑。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:40:56 +08:00
649d9e2a76 fix(aiot): 前端过滤 visible=false 的菜单项
在 fetchUserInfo 中对后端返回的菜单做递归过滤,
移除 visible=false 的菜单项,确保隐藏菜单不会显示。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:29:01 +08:00
f78eaa2ae1 refactor(aiot-device): 规范整理摄像头管理和 ROI 配置页面代码
- 摄像头管理:代码按功能分区(列表状态/编辑弹窗/数据加载/增删改/拉流控制/配置导出)
- ROI 配置:代码按功能分区(摄像头选择/截图/数据加载/绘制/选择/编辑/删除/推送)
- getSnapUrl 适配 async 调用,截图 URL 携带 access-token 认证参数
- 统一中文注释风格

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:25:19 +08:00
eb11e7ed1f refactor(aiot-device): 规范整理设备 API 层和类型定义
- 按功能分区:摄像头管理、ROI 区域、算法管理、算法绑定、配置推送
- Camera 接口扩展完整字段(streamKey、createTime 等)
- 新增 PageResult、MediaServer 类型定义
- getSnapUrl 改为 async,通过 query param 传递 access-token 支持认证截图
- 所有 API 函数添加精确的泛型返回类型

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:25:03 +08:00
184bb863b0 fix(aiot): 修复 WVP 认证机制,实现自动登录和 token 管理
- WVP 使用独立 JWT 认证(access-token 头),与芋道 Authorization Bearer 不同
- 实现 WVP 自动登录:首次请求时自动调用 /api/user/login 获取 token
- 缓存 token 防止重复登录,401 时自动续期
- 响应拦截器自动解包 WVP {code:0, data:...} 格式
- Vite 代理新增 /aiot/device/user 和 /aiot/device/server 路由规则
- 移除已废弃的 aiot/video 代理规则

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:24:47 +08:00
f7bfde0135 feat(aiot-device): 摄像头管理增加增删改功能
- Camera 接口扩展完整字段(type、timeout、rtspType、enable 等)
- 新增 saveCamera、deleteCamera、getMediaServerList API
- 摄像头管理页面增加添加/编辑弹窗(表单含代理类型、拉流地址、RTSP方式等)
- 增加删除确认对话框
- Vite 代理增加媒体服务器 API 转发规则

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:51:37 +08:00
e59eb5fe65 fix(aiot): 删除静态路由文件,消除重复菜单
accessMode 为 backend 模式时菜单由后端接口返回,
静态路由文件 aiot.ts 导致出现两个重复的 AIoT 菜单。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:33:34 +08:00
e2bde76f20 feat(aiot-device): 重写 ROI 配置页面,迁移 WVP 画布式交互
从 WVP 的 roiConfig 整套组件迁移至 Vue3 + Ant Design:

ROI 配置主页面 (roi/index.vue):
- 无参数时显示摄像头选择器,有参数时直接进入配置
- 左侧画布面板 + 右侧 ROI 列表/属性/算法侧边栏
- 画矩形(拖拽)、画多边形(点击+双击完成)
- ROI 属性编辑:名称、颜色、优先级、描述
- 推送配置到边缘端

RoiCanvas 组件 (roi/components/RoiCanvas.vue):
- Canvas 叠加在摄像头截图上,归一化坐标 (0-1)
- 矩形拖拽绘制、多边形逐点绘制
- ROI 选中高亮、点击选择、右键删除
- 窗口 resize 自适应

RoiAlgorithmBind 组件 (roi/components/RoiAlgorithmBind.vue):
- 算法列表加载、绑定/解绑操作
- 启用/禁用开关、参数配置入口

AlgorithmParamEditor 组件 (roi/components/AlgorithmParamEditor.vue):
- 根据 JSON Schema 动态生成表单
- 支持 int(数字输入)、list(标签列表)、string(文本输入)
- 参数保存到后端

删除旧的 data.ts(VxeGrid 列定义,已不再使用)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 23:24:48 +08:00
b72839622e feat(aiot-device): 重写摄像头管理页面,迁移 WVP 功能
从 WVP 的 cameraConfig/index.vue 迁移至 Vue3 + Ant Design:
- 搜索过滤:支持名称/地址搜索和拉流状态筛选
- 摄像头列表:显示应用名、流ID、拉流地址、状态
- ROI 数量徽标:异步加载每个摄像头的 ROI 数量
- 操作按钮:ROI 配置(跳转)、拉流/停止、导出配置
- 配置导出:JSON 文件下载

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 23:24:27 +08:00
fc56ea0f75 feat(aiot-device): 完善设备模块 API 层,对接 WVP 实际接口
从 WVP 项目迁移全部设备管理 API:
- 摄像头管理:列表查询、开始/停止拉流
- ROI 区域:增删改查、按摄像头查询、截图
- 算法绑定:绑定/解绑/更新参数
- 配置推送:推送到边缘端、导出配置
- 移除未使用的 PageParam 导入

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 23:24:12 +08:00
c28606df4e feat(aiot-device): 新增摄像头代理 Vite 规则
WVP 的摄像头拉流代理接口位于 /api/proxy 路径下,
与 ROI/算法接口的 /api/ai 前缀不同,需单独匹配。
新增 /admin-api/aiot/device/proxy → /api/proxy 代理规则。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 23:23:56 +08:00
936dff610c feat(aiot): 更新 Vite 代理规则,移除旧 ai-alert 路由
- 添加 4 条 aiot 代理规则:
  /admin-api/aiot/alarm → 告警服务 :8000(直通)
  /admin-api/aiot/edge → 告警服务 :8000(直通)
  /admin-api/aiot/device → WVP :18080(rewrite 为 /api/ai)
  /admin-api/aiot/video → WVP :18080(rewrite 为 /api)
- 移除旧的 /admin-api/ai-alert 和 /admin-api/video 代理规则
- 删除旧的 ai-alert 路由、视图、API 文件

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:41:00 +08:00
c601395a03 feat(aiot): 添加 aiot 全部业务视图页面
- alarm/list:告警列表(搜索、详情弹窗、处理/忽略操作)
- alarm/summary:摄像头告警汇总(跳转到对应摄像头告警列表)
- device/camera:摄像头通道管理(跳转配置 ROI)
- device/roi:ROI 区域配置列表(删除操作)
- video/live:实时视频播放(输入设备/通道 ID 播放)
- edge/node:边缘节点管理(状态徽标、运行时长、帧数统计)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:40:43 +08:00
159a82aaa9 feat(aiot): 搭建 aiot 前端模块路由和 API 层
- 新增 router/routes/modules/aiot.ts:6 个页面路由
  告警列表、摄像头汇总、摄像头管理、ROI配置、实时视频、边缘节点
- 新增 api/aiot/alarm/:告警 API(分页、详情、处理、删除、统计、汇总)
- 新增 api/aiot/edge/:边缘设备 API(分页、详情、统计)
- 新增 api/aiot/device/:摄像头和 ROI API(调用 WVP 后端)
- 新增 api/aiot/video/:视频播放 API(playStart/playStop)
- 新增 api/aiot/request.ts:WVP 专用请求客户端(跳过芋道响应拦截器)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:40:26 +08:00
bc2f1e89c9 fix: 恢复默认主题色系,关闭租户和 API 加密
- 移除自定义暖黄色主题,恢复芋道默认蓝色色系
- 关闭租户功能(VITE_APP_TENANT_ENABLE=false)
- 关闭 API 加密(VITE_APP_API_ENCRYPT_ENABLE=false)
- 以上配置适配当前 FastAPI 后端(不支持租户和加密)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:40:08 +08:00
cab08dfaca 初始化项目
Some checks failed
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
2026-01-27 09:53:02 +08:00
xingyu
36aa195378 !325 remove playground
Merge pull request !325 from xingyu/dev
2026-01-26 07:08:43 +00:00
xingyu4j
de2662ca8f fix: remove playground 2026-01-26 15:08:14 +08:00
xingyu
35acb9558b !324 merge dev
Merge pull request !324 from xingyu/dev
2026-01-26 07:06:52 +00:00
xingyu4j
c4a262d1e2 docs: README 2026-01-26 15:06:10 +08:00
xingyu4j
a1e021074e docs: README 2026-01-26 15:03:32 +08:00
xingyu4j
0a7ead980a feat: naive add AutoComplete 2026-01-26 14:59:34 +08:00
xingyu4j
cdcbd58f0e fix: ele auto complete 2026-01-26 14:35:53 +08:00
xingyu4j
c57f3d8820 fix: ele auto complete 2026-01-26 14:34:45 +08:00
xingyu4j
02c977f969 fix: IDLPAD 2026-01-26 11:06:38 +08:00
xingyu4j
a0019cef04 chore: update deps 2026-01-26 10:37:44 +08:00
xingyu4j
e447a8a569 chore: remove unused deps 2026-01-26 10:34:58 +08:00
xingyu4j
071468b716 chore: yaml validate 2026-01-26 10:34:33 +08:00
xingyu4j
24b8bba754 fix: lint 2026-01-26 10:34:14 +08:00
xingyu4j
6d60071515 fix: lint sort 2026-01-26 10:33:23 +08:00
xingyu4j
baed599fcc Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2026-01-26 10:13:23 +08:00
Jin Mao
7cb2699f19 chore: 更新pnpm工作区配置
- 移除 neverBuiltDependencies 配置
- 移除 peerDependencyRules.allowedVersions 配置
- 重新整理 overrides 和 catalog 部分
- 保持 @ast-grep/napi 等依赖的目录引用配置
- 维持 eslint 版本约束在目录顶层配置中
2026-01-25 19:55:53 +08:00
YunaiV
1ce562601f feat(iot):【网关设备:80%】动态注册的初步实现(已测试) 2026-01-25 18:50:26 +08:00
Jin Mao
4b5da81ba6 chore(deps): 更新项目依赖包版本
- 更新 @playwright/test 从 1.57.0 到 1.58.0
- 更新 @tanstack/vue-query 从 5.92.8 到 5.92.9
- 更新 cheerio 从 1.1.2 到 1.2.0
- 更新 eslint-config-turbo 从 2.7.5 到 2.7.6
- 更新 playwright 从 1.57.0 到 1.58.0
- 更新 turbo 从 2.7.5 到 2.7.6
- 更新 vxe-pc-ui 从 4.12.10 到 4.12.12
- 更新 @babel/helper-define-polyfill-provider 从 0.6.5 到 0.6.6
- 更新 @cspell/dict-fullstack 从 3.2.7 到 3.2.8
- 更新 @cspell/dict-git 从 3.0.7 到 3.1.0
- 更新 @cspell/dict-node 从 5.0.8 到 5.0.9
- 更新 @cspell/dict-npm 从 5.2.29 到 5.2.30
- 更新 @parcel/watcher 相关包从 2.5.4 到 2.5.6
- 更新 @tanstack/query-core 从 5.90.19 到 5.90.20
- 更新 babel-plugin-polyfill 相关包到最新版本
- 更新 baseline-browser-mapping 从 2.9.17 到 2.9.18
- 更新 caniuse-lite 从 1.0.30001765 到 1.0.30001766
- 更新 electron-to-chromium 从 1.5.277 到 1.5.278
- 更新 eslint-plugin-turbo 从 2.7.5 到 2.7.6
- 更新 playwright-core 从 1.57.0 到 1.58.0
- 更新 turbo 平台特定版本到 2.7.6
- 更新 undici 从 7.19.0 到 7.19.1
2026-01-25 15:05:14 +08:00
Jin Mao
6aca9a9c99 test(dom): 更新元素可见区域计算的测试用例
- 修正了getElementVisibleRect函数的期望值断言
- 将bottom值从800更正为0以匹配实际计算结果
- 将left值从1100更正为0以匹配实际计算结果
- 将right值从1000更正为0以匹配实际计算结果
- 将top值从900更正为0以匹配实际计算结果
2026-01-25 14:22:22 +08:00
YunaiV
c55465a6c0 chore: merge origin/dev branch 2026-01-24 09:31:43 +08:00
YunaiV
2ae684bdad feat(iot):【设备定位】添加设备位置功能,支持地图展示和坐标选择 2026-01-23 07:06:28 +00:00
haohao
ce2bfa5cd2 refactor:【antd】【iot】将 DeviceSaveReqVO 和 DeviceRespVO 合并到 Device,简化设备 API 接口 2026-01-23 07:06:28 +00:00
jason
63265c1a6b feat: [bpm][antd] 审批签名大小控制 2026-01-23 07:06:28 +00:00