fix: 移除 FaceFilterSettings 重复字段,与 Rust 端结构一致

问题修正:
- 移除 FaceFilterSettings 中的重复字段
- 简化为三段式结构(ui_filter_rules, processing_thresholds, trace_settings)
- 新增 version 字段用于版本控制
- 删除 useFaceFilter.ts 中的 rules 变量
- 重命名 faceFilterSettings 为 settings
- 更新所有访问方式为 settings.value.ui_filter_rules.*

变更内容:
1. src/types/faceFilter.ts
   - FaceFilterSettings 只保留三段式结构
   - fromLegacy() 和 defaults() 不再返回重复字段

2. src/composables/useFaceFilter.ts
   - 删除 rules 变量(不再需要)
   - 删除 defaultRules 常量
   - 重命名 faceFilterSettings 为 settings
   - 更新 localStorage 逻辑保存完整 settings
   - 所有访问改为 settings.value.ui_filter_rules.*

3. src/components/FaceFilterPanel.vue
   - 更新 v-model 绑定为 settings.trace_settings.*
   - 更新解构,删除 rules
   - 更新所有访问为 settings.ui_filter_rules.*

测试:
- ✅ TypeScript 编译通过
- ✅ Vite build 成功

对应 Core API: 86c776ce
修正文档: docs/FACE_FILTER_TYPES_FIX_REQUIRED.md
This commit is contained in:
2026-10-09 15:55:30 +08:00
parent 6423eeed77
commit 8789770af2
3 changed files with 53 additions and 92 deletions

View File

@@ -57,7 +57,7 @@
<label>Confidence:</label>
<input
type="number"
v-model.number="rules.min_confidence"
v-model.number="settings.ui_filter_rules.min_confidence"
@change="onRuleChange"
min="0"
max="1"
@@ -72,7 +72,7 @@
<label>Bbox Size:</label>
<input
type="number"
v-model.number="rules.min_bbox_size"
v-model.number="settings.ui_filter_rules.min_bbox_size"
@change="onRuleChange"
min="0"
step="10"
@@ -84,7 +84,7 @@
<div class="filter-row">
<label>Source:</label>
<select v-model="rules.source" @change="onRuleChange" class="filter-select">
<select v-model="settings.ui_filter_rules.source" @change="onRuleChange" class="filter-select">
<option value="all">All</option>
<option value="apple_vision">Apple Vision</option>
<option value="mediapipe">MediaPipe</option>
@@ -93,7 +93,7 @@
<div class="filter-row">
<label>Backend Status:</label>
<select v-model="rules.backend_status" @change="onRuleChange" class="filter-select">
<select v-model="settings.ui_filter_rules.backend_status" @change="onRuleChange" class="filter-select">
<option value="all">All</option>
<option value="accept">Accept</option>
<option value="review">Review</option>
@@ -108,7 +108,7 @@
<label class="checkbox-label">
<input
type="checkbox"
v-model="faceFilterSettings.single_frame_trace_vlm_enabled"
v-model="settings.trace_settings.single_frame_trace_vlm_enabled"
@change="markModified"
/>
VLM Processing
@@ -120,7 +120,7 @@
<label class="checkbox-label">
<input
type="checkbox"
v-model="faceFilterSettings.single_frame_trace_group_enabled"
v-model="settings.trace_settings.single_frame_trace_group_enabled"
@change="markModified"
/>
Face Groups
@@ -132,7 +132,7 @@
<label class="checkbox-label">
<input
type="checkbox"
v-model="faceFilterSettings.single_frame_trace_unassigned_enabled"
v-model="settings.trace_settings.single_frame_trace_unassigned_enabled"
@change="markModified"
/>
Unassigned List
@@ -144,7 +144,7 @@
<label class="checkbox-label">
<input
type="checkbox"
v-model="faceFilterSettings.single_trace_group_filter_enabled"
v-model="settings.trace_settings.single_trace_group_filter_enabled"
@change="markModified"
/>
Single Trace Groups
@@ -154,19 +154,19 @@
<div class="section-actions">
<div class="auto-save-hint">
{{ faceFilterSettingsLoading ? '⏳ Saving...' : '✓ Auto-saved' }}
{{ settingsLoading ? '⏳ Saving...' : '✓ Auto-saved' }}
</div>
<button
class="action-btn"
@click="handleResetSingleFrame"
:disabled="faceFilterSettingsLoading"
:disabled="settingsLoading"
>
Reset to Default
</button>
</div>
<div v-if="faceFilterSettingsError" class="error-message">
❌ {{ faceFilterSettingsError }}
<div v-if="settingsError" class="error-message">
❌ {{ settingsError }}
</div>
</div>
@@ -232,7 +232,6 @@ const emit = defineEmits<{
const {
mode,
rules,
filterResult,
filterStats,
loading,
@@ -242,14 +241,14 @@ const {
updateRules,
applyBackendFilter,
resetToDefault,
faceFilterSettings,
faceFilterSettingsLoading,
faceFilterSettingsError,
faceFilterSettingsModified,
settings,
settingsLoading,
settingsError,
settingsModified,
loadSingleFrameSettings,
resetSingleFrameSettings,
markSingleFrameSettingsModified,
cleanupAutoSave
cleanupAutoSave,
} = useFaceFilter();
const showPanel = ref(false);
@@ -259,7 +258,7 @@ function togglePanel() {
}
function onRuleChange() {
updateRules(rules.value);
updateRules(settings.value.ui_filter_rules);
}
async function handleApplyBackend() {
@@ -291,7 +290,7 @@ watch(showPanel, (show) => {
}
});
watch(faceFilterSettingsModified, (newVal, oldVal) => {
watch(settingsModified, (newVal, oldVal) => {
if (oldVal === true && newVal === false) {
emit('settings-updated');
}