fix: use identityUuid (camelCase) for person data

This commit is contained in:
2026-06-15 12:25:48 +08:00
parent c9964ce4fb
commit 97af4da331
2 changed files with 32 additions and 23 deletions

View File

@@ -22,10 +22,10 @@
<div class="ms-ppl-section-title">已知人物</div>
</div>
<div class="ms-ppl-face-grid">
<div v-for="p in confirmedPeople" :key="p.identity_uuid" class="ms-ppl-face-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
<div v-for="p in confirmedPeople" :key="p.identityUuid" class="ms-ppl-face-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
<div class="ms-ppl-face-img-wrap">
<img v-if="profiles[p.identity_uuid]" :src="profiles[p.identity_uuid]" alt="" @vue:mounted="loadProfile(p.identity_uuid)">
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identity_uuid)" viewBox="0 0 120 120" fill="none">
<img v-if="profiles[p.identityUuid]" :src="profiles[p.identityUuid]" alt="" @vue:mounted="loadProfile(p.identityUuid)">
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identityUuid)" viewBox="0 0 120 120" fill="none">
<circle cx="60" cy="45" r="25" fill="#d1d5db"/>
<ellipse cx="60" cy="105" rx="40" ry="25" fill="#d1d5db"/>
</svg>
@@ -44,10 +44,10 @@
<div class="ms-ppl-section-title">待定人物</div>
</div>
<div class="ms-ppl-face-grid">
<div v-for="p in pendingPeople" :key="p.identity_uuid" class="ms-ppl-face-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
<div v-for="p in pendingPeople" :key="p.identityUuid" class="ms-ppl-face-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
<div class="ms-ppl-face-img-wrap">
<img v-if="profiles[p.identity_uuid]" :src="profiles[p.identity_uuid]" alt="" @vue:mounted="loadProfile(p.identity_uuid)">
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identity_uuid)" viewBox="0 0 120 120" fill="none">
<img v-if="profiles[p.identityUuid]" :src="profiles[p.identityUuid]" alt="" @vue:mounted="loadProfile(p.identityUuid)">
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identityUuid)" viewBox="0 0 120 120" fill="none">
<circle cx="60" cy="45" r="25" fill="#d1d5db"/>
<ellipse cx="60" cy="105" rx="40" ry="25" fill="#d1d5db"/>
</svg>
@@ -72,10 +72,10 @@
</div>
</div>
<div class="ms-ppl-face-grid">
<div v-for="p in skippedPeople" :key="p.identity_uuid" class="ms-ppl-face-card skipped-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
<div v-for="p in skippedPeople" :key="p.identityUuid" class="ms-ppl-face-card skipped-card" @click="selectPerson(p)" @contextmenu.prevent="showContextMenu($event, p)">
<div class="ms-ppl-face-img-wrap">
<img v-if="profiles[p.identity_uuid]" :src="profiles[p.identity_uuid]" alt="" @vue:mounted="loadProfile(p.identity_uuid)">
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identity_uuid)" viewBox="0 0 120 120" fill="none">
<img v-if="profiles[p.identityUuid]" :src="profiles[p.identityUuid]" alt="" @vue:mounted="loadProfile(p.identityUuid)">
<svg v-else class="ms-silhouette" @vue:mounted="loadProfile(p.identityUuid)" viewBox="0 0 120 120" fill="none">
<circle cx="60" cy="45" r="25" fill="#d1d5db"/>
<ellipse cx="60" cy="105" rx="40" ry="25" fill="#d1d5db"/>
</svg>
@@ -224,7 +224,13 @@ function onSearch() {
async function loadProfile(uuid: string) {
if (profiles.value[uuid]) return
try { profiles.value[uuid] = await invoke('get_identity_profile', { uuid }) } catch {}
try {
const result: string = await invoke('get_identity_profile', { uuid })
console.log('Profile loaded for:', uuid, result ? 'success' : 'empty')
profiles.value[uuid] = result
} catch (e) {
console.error('Profile load failed for:', uuid, e)
}
}
async function loadCandidateThumb(uuid: string) {
@@ -233,7 +239,10 @@ async function loadCandidateThumb(uuid: string) {
}
function selectPerson(p: any) {
router.push({ name: 'PersonDetail', params: { uuid: p.identity_uuid } })
const uuid = p.identityUuid || p.identityUuid
console.log('selectPerson called:', uuid, p.name)
router.push({ name: 'PersonDetail', params: { uuid } })
.catch(e => console.error('Router push failed:', e))
}
async function toggleStar() {
@@ -247,7 +256,7 @@ async function confirmDelete() {
if (!confirm(`Delete "${selected.value.name}"?`)) return
try {
await invoke('delete_identity', { uuid: selected.value.identity_uuid })
people.value = people.value.filter((p: any) => p.identity_uuid !== selected.value.identity_uuid)
people.value = people.value.filter((p: any) => p.identityUuid !== selected.value.identity_uuid)
selected.value = null
} catch (e) { console.error('Failed to delete:', e) }
}
@@ -273,7 +282,7 @@ async function confirmMerge() {
try {
await invoke('merge_identities', { uuid: selected.value.identity_uuid, intoUuid: mergeTarget.value })
showMerge.value = false
people.value = people.value.filter((p: any) => p.identity_uuid !== selected.value.identity_uuid)
people.value = people.value.filter((p: any) => p.identityUuid !== selected.value.identity_uuid)
selected.value = null
} catch (e) { console.error('Merge failed:', e) }
}
@@ -304,16 +313,16 @@ function ctxAction(action: string) {
ctxMenu.value.show = false
if (action === 'star') {
p.starred = !p.starred
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identity_uuid)
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identityUuid)
if (idx >= 0) people.value[idx].starred = p.starred
} else if (action === 'skip') {
invoke('update_identity_status', { uuid: p.identity_uuid, status: 'skipped' }).then(() => {
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identity_uuid)
invoke('update_identity_status', { uuid: p.identityUuid, status: 'skipped' }).then(() => {
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identityUuid)
if (idx >= 0) people.value[idx].status = 'skipped'
}).catch(e => console.error('Skip failed:', e))
} else if (action === 'confirm') {
invoke('update_identity_status', { uuid: p.identity_uuid, status: 'confirmed' }).then(() => {
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identity_uuid)
invoke('update_identity_status', { uuid: p.identityUuid, status: 'confirmed' }).then(() => {
const idx = people.value.findIndex((x: any) => x.identity_uuid === p.identityUuid)
if (idx >= 0) people.value[idx].status = 'confirmed'
}).catch(e => console.error('Confirm failed:', e))
} else if (action === 'rename' || action === 'merge') {

View File

@@ -162,7 +162,7 @@ onMounted(async () => {
console.log('getPeople raw result:', JSON.stringify(people).slice(0, 200))
console.log('getPeople result count:', Array.isArray(people) ? people.length : 'not array')
peopleCount.value = Array.isArray(people) ? people.length : 0
const found = (Array.isArray(people) ? people : []).find((p: any) => p.identity_uuid === uuid)
const found = (Array.isArray(people) ? people : []).find((p: any) => p.identityUuid === uuid)
console.log('Person found:', !!found, found?.name)
if (found) {
person.value = { ...found, status: found.status || 'confirmed' }
@@ -245,7 +245,7 @@ async function toggleStar() {
async function confirmDelete() {
if (!person.value || !confirm(`Delete "${person.value.name}"?`)) return
try {
await invoke('delete_identity', { uuid: person.value.identity_uuid })
await invoke('delete_identity', { uuid: person.value.identityUuid })
router.back()
} catch (e) { console.error('Failed to delete:', e) }
}
@@ -253,16 +253,16 @@ async function confirmDelete() {
async function bindCandidate(c: any) {
if (!person.value) return
try {
await invoke('bind_face', { uuid: person.value.identity_uuid, faceId: String(c.id), fileUuid: c.file_uuid })
await invoke('bind_face', { uuid: person.value.identityUuid, faceId: String(c.id), fileUuid: c.file_uuid })
showCandidates.value = false
await loadFaces(person.value.identity_uuid)
await loadFaces(person.value.identityUuid)
} catch (e) { console.error('Bind failed:', e) }
}
async function confirmMerge() {
if (!person.value || !mergeTarget.value) return
try {
await invoke('merge_identities', { uuid: person.value.identity_uuid, intoUuid: mergeTarget.value })
await invoke('merge_identities', { uuid: person.value.identityUuid, intoUuid: mergeTarget.value })
router.back()
} catch (e) { console.error('Merge failed:', e) }
}