fix: 合并图库吸顶区域并关闭自动刷新

This commit is contained in:
GouJ
2026-09-04 11:38:30 +08:00
parent acc0a1e9ad
commit bd66f7e719
16 changed files with 359 additions and 197 deletions
+110 -108
View File
@@ -31,7 +31,7 @@ import FormPromptBatch from './components/FormPromptBatch.vue'
import { useKeyframeImpact } from './useKeyframeImpact'
import { queryText, referenceLocation, referenceTargets } from '../production/asset-links'
/** 形态图库以正式数据库为准,自动显示已在后端生成的图片。 */
/** 形态图库以正式数据库为准;首次读取、手动刷新和自身操作完成后更新,不定时刷新。 */
const route = useRoute()
const router = useRouter()
const {
@@ -39,6 +39,7 @@ const {
forms,
staleForms,
query,
refreshProject,
operation,
session,
concurrency,
@@ -205,7 +206,7 @@ function selectImpactShot(shotId: string | null) {
/** 同时刷新素材和镜头影响状态,查询仍不启动生成。 */
async function refreshAssets() {
await Promise.all([query.refresh(), impact.query.refresh(), impact.references.refresh()])
await Promise.all([refreshProject(), query.refresh(), impact.query.refresh(), impact.references.refresh()])
}
/** 全局过期筛选不沿用深链接的单个素材限制。 */
@@ -279,8 +280,7 @@ async function showStaleForms() {
</p>
</div>
<p class="mt-2 text-[11px] leading-6 text-muted">
6
秒更新图片记录主图供分镜引用候选图和历史失败记录均保留过期主图不会自动删除也不会被批量任务静默替换
图库不自动刷新可点击刷新图库读取最新记录主图供分镜引用候选图和历史失败记录均保留过期主图不会自动删除或替换
</p>
<NAlert v-if="staleForms.length" type="error" :show-icon="false" class="mt-4"
><div class="flex flex-wrap items-center justify-between gap-3">
@@ -420,117 +420,119 @@ async function showStaleForms() {
>镜头影响检查失败暂时无法确认有无过期首帧{{ impact.query.error.value }}
<NButton text size="small" @click="impact.query.refresh">重试检查</NButton></NAlert
>
<div class="form-image-filter-region">
<div
class="form-image-toolbar"
:class="{
'has-impact-picker': impactOptions.length || sourceShotId,
'has-impact-actions': sourceShotId || targetFormId
}"
>
<div class="gallery-sticky-controls">
<div class="form-image-filter-region">
<div
v-if="impactOptions.length || sourceShotId"
class="asset-impact-picker"
role="group"
aria-label="镜头定位与导航"
class="form-image-toolbar"
:class="{
'has-impact-picker': impactOptions.length || sourceShotId,
'has-impact-actions': sourceShotId || targetFormId
}"
>
<NSelect
:value="sourceShot?.shotId ?? null"
:options="impactOptions"
placeholder="选择过期镜头,查看关联素材"
clearable
aria-label="选择关联镜头"
class="asset-impact-select"
@update:value="selectImpactShot"
/>
<RouterLink v-if="sourceLocation" :to="sourceLocation" custom v-slot="{ href, navigate }">
<NButton
tag="a"
:href="href"
@click="navigate"
class="icon-button"
:aria-label="`返回第 ${sourceShot?.episodeNo} · 镜头 ${sourceShot?.shotNo}`"
:title="`返回第 ${sourceShot?.episodeNo} 集 · 镜头 ${sourceShot?.shotNo}`"
>
<template #icon><ArrowLeft :size="16" /></template>
<span class="sr-only"
>返回第 {{ sourceShot?.episodeNo }} · 镜头 {{ sourceShot?.shotNo }}</span
>
</NButton>
</RouterLink>
<NButton
v-if="sourceShotId || targetFormId"
class="icon-button"
aria-label="查看全部素材"
title="查看全部素材(清除定位与筛选)"
@click="resetFilters"
<div
v-if="impactOptions.length || sourceShotId"
class="asset-impact-picker"
role="group"
aria-label="镜头定位与导航"
>
<template #icon><LayoutGrid :size="16" /></template>
</NButton>
</div>
<div class="form-image-filters" role="group" aria-label="形态图片筛选">
<NInput
placeholder="搜索主体、引用或形态"
:input-props="{ 'aria-label': '搜索形态图片' }"
v-model:value="search"
clearable
><template #prefix><Search :size="14" /></template
></NInput>
<NSelect
aria-label="筛选主体类型"
v-model:value="module"
:options="[
{ label: String('全部类型'), value: 'all' },
{ label: String('人物'), value: 'character' },
{ label: String('场景'), value: 'scene' },
{ label: String('道具'), value: 'prop' }
]"
></NSelect>
<div class="filter-toggles">
<NCheckbox v-model:checked="onlyMissing">仅看缺少主图</NCheckbox>
<NCheckbox v-model:checked="onlyStale">仅看身份过期</NCheckbox>
<NSelect
:value="sourceShot?.shotId ?? null"
:options="impactOptions"
placeholder="选择过期镜头,查看关联素材"
clearable
aria-label="选择关联镜头"
class="asset-impact-select"
@update:value="selectImpactShot"
/>
<RouterLink v-if="sourceLocation" :to="sourceLocation" custom v-slot="{ href, navigate }">
<NButton
tag="a"
:href="href"
@click="navigate"
class="icon-button"
:aria-label="`返回第 ${sourceShot?.episodeNo} · 镜头 ${sourceShot?.shotNo}`"
:title="`返回第 ${sourceShot?.episodeNo} 集 · 镜头 ${sourceShot?.shotNo}`"
>
<template #icon><ArrowLeft :size="16" /></template>
<span class="sr-only"
>返回第 {{ sourceShot?.episodeNo }} · 镜头 {{ sourceShot?.shotNo }}</span
>
</NButton>
</RouterLink>
<NButton
v-if="sourceShotId || targetFormId"
class="icon-button"
aria-label="查看全部素材"
title="查看全部素材(清除定位与筛选)"
@click="resetFilters"
>
<template #icon><LayoutGrid :size="16" /></template>
</NButton>
</div>
<div class="form-image-filters" role="group" aria-label="形态图片筛选">
<NInput
placeholder="搜索主体、引用或形态"
:input-props="{ 'aria-label': '搜索形态图片' }"
v-model:value="search"
clearable
><template #prefix><Search :size="14" /></template
></NInput>
<NSelect
aria-label="筛选主体类型"
v-model:value="module"
:options="[
{ label: String('全部类型'), value: 'all' },
{ label: String('人物'), value: 'character' },
{ label: String('场景'), value: 'scene' },
{ label: String('道具'), value: 'prop' }
]"
></NSelect>
<div class="filter-toggles">
<NCheckbox v-model:checked="onlyMissing">仅看缺少主图</NCheckbox>
<NCheckbox v-model:checked="onlyStale">仅看身份过期</NCheckbox>
</div>
<span class="filter-result-count">{{ filtered.length }} 个形态</span>
</div>
<span class="filter-result-count">{{ filtered.length }} 个形态</span>
</div>
</div>
</div>
<div v-if="showImpactDetails" class="asset-impact-context mt-3" aria-label="镜头与素材定位">
<p v-if="sourceMissing" class="text-danger">来源镜头不存在或不属于当前项目未读取其素材</p>
<p v-if="sourceCurrent" class="text-xs">
当前检查{{
sourceShot?.primaryKeyframeId ? '该镜头主首帧未被标记为过期' : '该镜头暂无主首帧'
}}请以后端最新就绪状态为准
</p>
<p v-if="sourceShot?.inconsistent" class="text-xs text-danger">
当前镜头首帧检查未标记过期但视频检查报告过期请核对后端检查逻辑与身份母版暂不建议重复生图
</p>
<p v-if="targetUnlinked" class="text-xs text-danger">
指定形态不在该镜头当前的有效引用列表中关联可能已调整或主图缺失请从下方关联素材重新核对
</p>
<NScrollbar
v-if="linkedReferences.length && !impact.references.error.value"
:key="sourceShotId"
class="asset-impact-links-scroll"
content-class="asset-impact-links"
x-scrollable
trigger="none"
role="region"
aria-label="本镜头关联素材可横向滚动"
>
<span class="text-xs text-muted">本镜头当前关联素材</span
><RouterLink
v-for="target in linkedReferences"
:key="target.formId || target.subjectRef"
:to="referenceLocation(id, sourceShotId, target)"
class="text-button"
>{{ target.label }} </RouterLink
<div v-if="showImpactDetails" class="asset-impact-context" aria-label="镜头与素材定位">
<p v-if="sourceMissing" class="text-danger">来源镜头不存在或不属于当前项目未读取其素材</p>
<p v-if="sourceCurrent" class="text-xs">
当前检查{{
sourceShot?.primaryKeyframeId ? '该镜头主首帧未被标记为过期' : '该镜头暂无主首帧'
}}请以后端最新就绪状态为准
</p>
<p v-if="sourceShot?.inconsistent" class="text-xs text-danger">
当前镜头首帧检查未标记过期但视频检查报告过期请核对后端检查逻辑与身份母版暂不建议重复生图
</p>
<p v-if="targetUnlinked" class="text-xs text-danger">
指定形态不在该镜头当前的有效引用列表中关联可能已调整或主图缺失请从下方关联素材重新核对
</p>
<NScrollbar
v-if="linkedReferences.length && !impact.references.error.value"
:key="sourceShotId"
class="asset-impact-links-scroll"
content-class="asset-impact-links"
x-scrollable
trigger="none"
role="region"
aria-label="本镜头关联素材可横向滚动"
>
</NScrollbar>
<p v-if="impact.references.loading.value" class="text-xs text-muted">正在读取镜头关联素材</p>
<p v-if="impact.references.error.value" class="text-xs text-danger">
{{ impact.references.error.value }}
<NButton text size="small" @click="impact.references.refresh">重试读取素材</NButton>
</p>
<span class="text-xs text-muted">本镜头当前关联素材</span
><RouterLink
v-for="target in linkedReferences"
:key="target.formId || target.subjectRef"
:to="referenceLocation(id, sourceShotId, target)"
class="text-button"
>{{ target.label }} </RouterLink
>
</NScrollbar>
<p v-if="impact.references.loading.value" class="text-xs text-muted">正在读取镜头关联素材</p>
<p v-if="impact.references.error.value" class="text-xs text-danger">
{{ impact.references.error.value }}
<NButton text size="small" @click="impact.references.refresh">重试读取素材</NButton>
</p>
</div>
</div>
<NAlert
v-if="targetFormId"