perf(web):优化图片检测切换到视频检测的模型切换问题

This commit is contained in:
2026-06-15 17:38:03 +08:00
parent 4283fb1332
commit bfd68026ca
3 changed files with 38 additions and 7 deletions
+12 -3
View File
@@ -5,7 +5,7 @@
<DetectionConfig <DetectionConfig
:models="models" :models="models"
:default-type="'image'" :default-type="'image'"
:default-model="config.model" :default-model="selectedModel || (models.length > 0 ? models[0].id : '')"
@type-change="onTypeChange" @type-change="onTypeChange"
@config-change="onConfigChange" @config-change="onConfigChange"
/> />
@@ -351,13 +351,17 @@ const props = defineProps({
models: { models: {
type: Array, type: Array,
default: () => [] default: () => []
},
selectedModel: {
type: String,
default: ''
} }
}) })
const emit = defineEmits(['type-change']) const emit = defineEmits(['type-change', 'model-change'])
const config = ref({ 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, confidence: 0.5,
iou: 0.45, iou: 0.45,
composite: false, composite: false,
@@ -369,7 +373,12 @@ const onTypeChange = (type) => {
} }
const onConfigChange = (newConfig) => { const onConfigChange = (newConfig) => {
const oldModel = config.value.model
config.value = { ...newConfig } config.value = { ...newConfig }
// 模型变化时通知父组件
if (newConfig.model && newConfig.model !== oldModel) {
emit('model-change', newConfig.model)
}
} }
// 可拖拽调整宽度相关 // 可拖拽调整宽度相关
+12 -3
View File
@@ -5,7 +5,7 @@
<DetectionConfig <DetectionConfig
:models="models" :models="models"
:default-type="'video'" :default-type="'video'"
:default-model="config.model" :default-model="selectedModel || (models.length > 0 ? models[0].id : '')"
@type-change="onTypeChange" @type-change="onTypeChange"
@config-change="onConfigChange" @config-change="onConfigChange"
/> />
@@ -223,13 +223,17 @@ const props = defineProps({
models: { models: {
type: Array, type: Array,
default: () => [] default: () => []
},
selectedModel: {
type: String,
default: ''
} }
}) })
const emit = defineEmits(['type-change']) const emit = defineEmits(['type-change', 'model-change'])
const config = ref({ 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, confidence: 0.5,
iou: 0.45, iou: 0.45,
composite: false, composite: false,
@@ -241,7 +245,12 @@ const onTypeChange = (type) => {
} }
const onConfigChange = (newConfig) => { const onConfigChange = (newConfig) => {
const oldModel = config.value.model
config.value = { ...newConfig } config.value = { ...newConfig }
// 模型变化时通知父组件
if (newConfig.model && newConfig.model !== oldModel) {
emit('model-change', newConfig.model)
}
// 如果摄像头已连接,实时更新配置 // 如果摄像头已连接,实时更新配置
if (websocket.value && cameraConnected.value) { if (websocket.value && cameraConnected.value) {
+13
View File
@@ -4,14 +4,18 @@
<ImageDetection <ImageDetection
v-if="activeTab === 'image'" v-if="activeTab === 'image'"
:models="models" :models="models"
:selected-model="selectedModel"
@type-change="handleTypeChange" @type-change="handleTypeChange"
@model-change="handleModelChange"
/> />
<!-- 视频检测模块 --> <!-- 视频检测模块 -->
<VideoDetection <VideoDetection
v-if="activeTab === 'video'" v-if="activeTab === 'video'"
:models="models" :models="models"
:selected-model="selectedModel"
@type-change="handleTypeChange" @type-change="handleTypeChange"
@model-change="handleModelChange"
/> />
</div> </div>
</template> </template>
@@ -26,15 +30,24 @@ import VideoDetection from '@/components/VideoDetection.vue'
const activeTab = ref('image') const activeTab = ref('image')
const models = ref([]) const models = ref([])
const selectedModel = ref('')
const handleTypeChange = (type) => { const handleTypeChange = (type) => {
activeTab.value = type activeTab.value = type
} }
const handleModelChange = (modelId) => {
selectedModel.value = modelId
}
const loadModels = async () => { const loadModels = async () => {
try { try {
const response = await detectionApi.getModels() const response = await detectionApi.getModels()
models.value = response.data models.value = response.data
// 初始化默认选中第一个模型
if (models.value.length > 0 && !selectedModel.value) {
selectedModel.value = models.value[0].id
}
} catch (error) { } catch (error) {
ElMessage.error('加载模型列表失败') ElMessage.error('加载模型列表失败')
} }