From bfd68026ca5f08758743c366dd5f513be4a52b9a Mon Sep 17 00:00:00 2001
From: wuzhuorong <973204353@qq.com>
Date: Mon, 15 Jun 2026 17:38:03 +0800
Subject: [PATCH] =?UTF-8?q?perf(web):=E4=BC=98=E5=8C=96=E5=9B=BE=E7=89=87?=
=?UTF-8?q?=E6=A3=80=E6=B5=8B=E5=88=87=E6=8D=A2=E5=88=B0=E8=A7=86=E9=A2=91?=
=?UTF-8?q?=E6=A3=80=E6=B5=8B=E7=9A=84=E6=A8=A1=E5=9E=8B=E5=88=87=E6=8D=A2?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/web/src/components/ImageDetection.vue | 15 ++++++++++++---
apps/web/src/components/VideoDetection.vue | 17 +++++++++++++----
apps/web/src/views/Home.vue | 13 +++++++++++++
3 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/apps/web/src/components/ImageDetection.vue b/apps/web/src/components/ImageDetection.vue
index 645f635..28fbeb9 100644
--- a/apps/web/src/components/ImageDetection.vue
+++ b/apps/web/src/components/ImageDetection.vue
@@ -5,7 +5,7 @@
@@ -351,13 +351,17 @@ const props = defineProps({
models: {
type: Array,
default: () => []
+ },
+ selectedModel: {
+ type: String,
+ default: ''
}
})
-const emit = defineEmits(['type-change'])
+const emit = defineEmits(['type-change', 'model-change'])
const config = ref({
- model: props.models.length > 0 ? props.models[0].id : 'fire_detection',
+ model: props.selectedModel || (props.models.length > 0 ? props.models[0].id : 'fire_detection'),
confidence: 0.5,
iou: 0.45,
composite: false,
@@ -369,7 +373,12 @@ const onTypeChange = (type) => {
}
const onConfigChange = (newConfig) => {
+ const oldModel = config.value.model
config.value = { ...newConfig }
+ // 模型变化时通知父组件
+ if (newConfig.model && newConfig.model !== oldModel) {
+ emit('model-change', newConfig.model)
+ }
}
// 可拖拽调整宽度相关
diff --git a/apps/web/src/components/VideoDetection.vue b/apps/web/src/components/VideoDetection.vue
index 314831f..fbd06c0 100644
--- a/apps/web/src/components/VideoDetection.vue
+++ b/apps/web/src/components/VideoDetection.vue
@@ -5,7 +5,7 @@
@@ -223,13 +223,17 @@ const props = defineProps({
models: {
type: Array,
default: () => []
+ },
+ selectedModel: {
+ type: String,
+ default: ''
}
})
-const emit = defineEmits(['type-change'])
+const emit = defineEmits(['type-change', 'model-change'])
const config = ref({
- model: props.models.length > 0 ? props.models[0].id : 'fire_detection',
+ model: props.selectedModel || (props.models.length > 0 ? props.models[0].id : 'fire_detection'),
confidence: 0.5,
iou: 0.45,
composite: false,
@@ -241,8 +245,13 @@ const onTypeChange = (type) => {
}
const onConfigChange = (newConfig) => {
+ const oldModel = config.value.model
config.value = { ...newConfig }
-
+ // 模型变化时通知父组件
+ if (newConfig.model && newConfig.model !== oldModel) {
+ emit('model-change', newConfig.model)
+ }
+
// 如果摄像头已连接,实时更新配置
if (websocket.value && cameraConnected.value) {
updateCameraConfig()
diff --git a/apps/web/src/views/Home.vue b/apps/web/src/views/Home.vue
index f386414..b5f7d8b 100644
--- a/apps/web/src/views/Home.vue
+++ b/apps/web/src/views/Home.vue
@@ -4,14 +4,18 @@
@@ -26,15 +30,24 @@ import VideoDetection from '@/components/VideoDetection.vue'
const activeTab = ref('image')
const models = ref([])
+const selectedModel = ref('')
const handleTypeChange = (type) => {
activeTab.value = type
}
+const handleModelChange = (modelId) => {
+ selectedModel.value = modelId
+}
+
const loadModels = async () => {
try {
const response = await detectionApi.getModels()
models.value = response.data
+ // 初始化默认选中第一个模型
+ if (models.value.length > 0 && !selectedModel.value) {
+ selectedModel.value = models.value[0].id
+ }
} catch (error) {
ElMessage.error('加载模型列表失败')
}