新增AIoT边缘智能模块:摄像头ROI配置、算法管理、配置推送

- 后端:新增aiot模块(bean/dao/service/controller),支持ROI区域CRUD、
  算法注册表管理、ROI-算法绑定、配置推送到FastAPI边缘端、变更日志
- 前端:新增摄像头配置页(列表+ROI子页面)、算法配置页、Canvas绘图组件
  (矩形/多边形)、动态算法参数编辑器、ZLM截图作为ROI编辑背景
- 数据库:新建4张表(wvp_ai_roi/algorithm/roi_algo_bind/config_log)
  字段与FastAPI端SQLite兼容,含2个预置算法
- 路由裁剪:隐藏无关菜单(地图/部标/推流/录制计划等)
- 修复cameraId含/导致REST路径解析错误(改用query参数)
- 新增ai.service配置项(边缘端地址/超时/开关)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-04 08:59:20 +08:00
parent 6c471cdfd7
commit d7bf969694
44 changed files with 2943 additions and 12 deletions

View File

@@ -23,6 +23,8 @@ import gbRecord from './modules/gbRecord'
import log from './modules/log'
import frontEnd from './modules/frontEnd'
import jtDevice from './modules/jtDevice'
import aiRoi from './modules/aiRoi'
import aiAlgorithm from './modules/aiAlgorithm'
Vue.use(Vuex)
@@ -49,7 +51,9 @@ const store = new Vuex.Store({
gbRecord,
log,
frontEnd,
jtDevice
jtDevice,
aiRoi,
aiAlgorithm
},
getters
})

View File

@@ -0,0 +1,41 @@
import {
queryAlgorithmList,
toggleAlgorithmActive,
syncAlgorithmsFromEdge
} from '@/api/aiAlgorithm'
const actions = {
queryAlgorithmList({ commit }) {
return new Promise((resolve, reject) => {
queryAlgorithmList().then(response => {
const { data } = response
resolve(data)
}).catch(error => {
reject(error)
})
})
},
toggleAlgorithmActive({ commit }, [id, isActive]) {
return new Promise((resolve, reject) => {
toggleAlgorithmActive(id, isActive).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
},
syncAlgorithmsFromEdge({ commit }) {
return new Promise((resolve, reject) => {
syncAlgorithmsFromEdge().then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
}
}
export default {
namespaced: true,
actions
}

View File

@@ -0,0 +1,93 @@
import {
queryRoiList,
queryRoiDetail,
queryRoiByCameraId,
saveRoi,
deleteRoi,
bindAlgo,
unbindAlgo,
updateAlgoParams
} from '@/api/aiRoi'
const actions = {
queryRoiList({ commit }, params) {
return new Promise((resolve, reject) => {
queryRoiList(params).then(response => {
const { data } = response
resolve(data)
}).catch(error => {
reject(error)
})
})
},
queryRoiDetail({ commit }, id) {
return new Promise((resolve, reject) => {
queryRoiDetail(id).then(response => {
const { data } = response
resolve(data)
}).catch(error => {
reject(error)
})
})
},
queryRoiByCameraId({ commit }, cameraId) {
return new Promise((resolve, reject) => {
queryRoiByCameraId(cameraId).then(response => {
const { data } = response
resolve(data)
}).catch(error => {
reject(error)
})
})
},
saveRoi({ commit }, data) {
return new Promise((resolve, reject) => {
saveRoi(data).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
},
deleteRoi({ commit }, roiId) {
return new Promise((resolve, reject) => {
deleteRoi(roiId).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
},
bindAlgo({ commit }, data) {
return new Promise((resolve, reject) => {
bindAlgo(data).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
},
unbindAlgo({ commit }, bindId) {
return new Promise((resolve, reject) => {
unbindAlgo(bindId).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
},
updateAlgoParams({ commit }, data) {
return new Promise((resolve, reject) => {
updateAlgoParams(data).then(response => {
resolve(response)
}).catch(error => {
reject(error)
})
})
}
}
export default {
namespaced: true,
actions
}