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

@@ -97,13 +97,6 @@ export interface FileProfileResponse {
face_filter: FaceFilterSettings;
}
const defaultRules: UiFilterRules = {
min_confidence: 0.5,
min_bbox_size: 80,
source: 'all',
backend_status: 'accept'
};
const STORAGE_KEY = 'momentry_face_filter_preferences';
// API helpers
@@ -196,7 +189,7 @@ function hybridFilter(faces: FaceMetadata[], rules: UiFilterRules): FaceMetadata
export function useFaceFilter() {
const mode = ref<'instant' | 'backend' | 'hybrid'>('instant');
const rules = ref<UiFilterRules>({ ...defaultRules });
const settings = ref<FaceFilterSettings>(FaceFilterSettingsMigration.defaults());
const allFaces = ref<FaceMetadata[]>([]);
const filteredFaces = ref<FaceMetadata[]>([]);
const filterResult = ref<FilterResult | null>(null);
@@ -204,10 +197,9 @@ export function useFaceFilter() {
const loading = ref(false);
const error = ref<string | null>(null);
const faceFilterSettings = ref<FaceFilterSettings>(FaceFilterSettingsMigration.defaults());
const faceFilterSettingsLoading = ref(false);
const faceFilterSettingsError = ref<string | null>(null);
const faceFilterSettingsModified = ref(false);
const settingsLoading = ref(false);
const settingsError = ref<string | null>(null);
const settingsModified = ref(false);
const currentFileUuid = ref<string | null>(null);
let autoSaveTimer: ReturnType<typeof setTimeout> | null = null;
@@ -219,26 +211,24 @@ export function useFaceFilter() {
removed: allFaces.value.length - filteredFaces.value.length
}));
// Load preferences from localStorage
function loadPreferences() {
try {
const stored = localStorage.getItem(STORAGE_KEY);
if (stored) {
const prefs = JSON.parse(stored);
mode.value = prefs.mode || 'instant';
rules.value = prefs.rules || { ...defaultRules };
settings.value = prefs.settings || FaceFilterSettingsMigration.defaults();
}
} catch (err) {
console.error('Failed to load preferences:', err);
}
}
// Save preferences to localStorage
function savePreferences() {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify({
mode: mode.value,
rules: rules.value
settings: settings.value
}));
} catch (err) {
console.error('Failed to save preferences:', err);
@@ -297,11 +287,10 @@ export function useFaceFilter() {
});
}
// Apply local filter based on mode
function applyLocalFilter() {
switch (mode.value) {
case 'instant':
filteredFaces.value = quickFilter(allFaces.value, rules.value);
filteredFaces.value = quickFilter(allFaces.value, settings.value.ui_filter_rules);
break;
case 'backend':
filteredFaces.value = allFaces.value.filter(face =>
@@ -309,13 +298,13 @@ export function useFaceFilter() {
);
break;
case 'hybrid':
filteredFaces.value = hybridFilter(allFaces.value, rules.value);
filteredFaces.value = hybridFilter(allFaces.value, settings.value.ui_filter_rules);
break;
}
}
function updateRules(newRules: Partial<UiFilterRules>) {
rules.value = { ...rules.value, ...newRules };
settings.value.ui_filter_rules = { ...settings.value.ui_filter_rules, ...newRules };
applyLocalFilter();
savePreferences();
}
@@ -371,52 +360,51 @@ function updateRules(newRules: Partial<UiFilterRules>) {
}
}
// Reset to default
function resetToDefault() {
rules.value = { ...defaultRules };
settings.value = FaceFilterSettingsMigration.defaults();
applyLocalFilter();
savePreferences();
}
async function loadSingleFrameSettings(fileUuid: string) {
faceFilterSettingsLoading.value = true;
faceFilterSettingsError.value = null;
settingsLoading.value = true;
settingsError.value = null;
try {
currentFileUuid.value = fileUuid;
const profile = await getFileProfile(fileUuid);
if (profile.face_filter) {
faceFilterSettings.value = profile.face_filter;
settings.value = profile.face_filter;
} else {
faceFilterSettings.value = FaceFilterSettingsMigration.defaults();
settings.value = FaceFilterSettingsMigration.defaults();
}
faceFilterSettingsModified.value = false;
settingsModified.value = false;
} catch (err: any) {
faceFilterSettingsError.value = err.message || 'Failed to load settings';
settingsError.value = err.message || 'Failed to load settings';
console.error('Failed to load single frame settings:', err);
} finally {
faceFilterSettingsLoading.value = false;
settingsLoading.value = false;
}
}
async function saveSingleFrameSettings(fileUuid: string): Promise<boolean> {
faceFilterSettingsLoading.value = true;
faceFilterSettingsError.value = null;
settingsLoading.value = true;
settingsError.value = null;
try {
const success = await updateFileProfile(fileUuid, faceFilterSettings.value);
const success = await updateFileProfile(fileUuid, settings.value);
if (success) {
faceFilterSettingsModified.value = false;
settingsModified.value = false;
}
return success;
} catch (err: any) {
faceFilterSettingsError.value = err.message || 'Failed to save settings';
settingsError.value = err.message || 'Failed to save settings';
console.error('Failed to save single frame settings:', err);
return false;
} finally {
faceFilterSettingsLoading.value = false;
settingsLoading.value = false;
}
}
@@ -426,7 +414,7 @@ function autoSaveSettings() {
}
autoSaveTimer = setTimeout(async () => {
if (currentFileUuid.value && faceFilterSettingsModified.value) {
if (currentFileUuid.value && settingsModified.value) {
const success = await saveSingleFrameSettings(currentFileUuid.value);
if (!success) {
console.error('Auto-save failed for single frame settings');
@@ -444,19 +432,18 @@ function cleanupAutoSave() {
}
function resetSingleFrameSettings() {
faceFilterSettings.value = FaceFilterSettingsMigration.defaults();
faceFilterSettingsModified.value = true;
settings.value = FaceFilterSettingsMigration.defaults();
settingsModified.value = true;
autoSaveSettings();
}
function markSingleFrameSettingsModified() {
faceFilterSettingsModified.value = true;
settingsModified.value = true;
autoSaveSettings();
}
return {
mode,
rules,
allFaces,
filteredFaces,
filterResult,
@@ -464,10 +451,10 @@ return {
loading,
error,
stats,
faceFilterSettings,
faceFilterSettingsLoading,
faceFilterSettingsError,
faceFilterSettingsModified,
settings,
settingsLoading,
settingsError,
settingsModified,
currentFileUuid,
initialize,