feat: 补齐前端主流程并收紧工作台布局

统一工作台紧凑头部与形态图库间距,修复主体身份布局,并接入正式严格视频质量流水线。
This commit is contained in:
GouJ
2026-09-08 09:25:14 +08:00
committed by GitHub
parent 0f8b2074e4
commit 4edb0ff6cc
25 changed files with 355 additions and 233 deletions
@@ -3,24 +3,13 @@ import { NScrollbar, NAlert, NButton, NTable } from 'naive-ui'
import { computed } from 'vue'
import { Download } from '@lucide/vue'
import { downloadText } from '../../../lib/format'
import type { StoryboardIssue, StoryboardReceipt } from '../types'
import type { StoryboardReceipt } from '../types'
/** 独立展示提交结果,不能将 HTTP 成功或局部成功显示为整批完成。 */
const props = defineProps<{ receipt: StoryboardReceipt }>()
const issues = computed<StoryboardIssue[]>(() => {
if (props.receipt.kind === 'direction') return props.receipt.result.validation.issues
if (props.receipt.kind === 'visual-state')
return props.receipt.result.remainingIssues.length
? props.receipt.result.remainingIssues
: props.receipt.result.validation.issues
return []
})
const failed = computed(() => {
if (props.receipt.kind === 'batch') return props.receipt.result.failedEpisodes > 0
if (props.receipt.kind === 'prompts') return props.receipt.result.failed > 0
if (props.receipt.kind === 'visual-state' && !props.receipt.result.persisted) return true
return !props.receipt.result.validation.valid
})
const failed = computed(() =>
props.receipt.kind === 'batch' ? props.receipt.result.failedEpisodes > 0 : props.receipt.result.failed > 0
)
/** 导出原始回执,保留后端提供的完整失败诊断。 */
function exportReceipt() {
@@ -91,24 +80,6 @@ function exportReceipt() {
当前批量接口不返回成功镜头的 Prompt 正文选择镜头后点击读取生成提示词已有内容会直接复用
</p>
</template>
<template v-else>
<p class="mt-4 text-sm" :class="failed ? 'text-danger' : 'text-success'">
{{ receipt.result.validation.valid ? '生成校验通过' : '校验失败,未保存本次生成结果'
}}<span v-if="receipt.kind === 'visual-state'">
· 自动修复 {{ receipt.result.repairAttempts }} ·
{{ receipt.result.persisted ? '已持久化' : '未持久化' }}</span
>
</p>
<p v-if="receipt.kind === 'direction' && receipt.result.validation.valid" class="mt-2 text-xs text-muted">
已请求持久化数据库实际覆盖率以下方刷新后的数据为准
</p>
<ul class="mt-3 space-y-2 text-xs text-danger">
<li v-for="(issue, index) in issues" :key="index">
{{ issue.episodeNo }} / Beat {{ issue.beatNo ?? '' }} / Shot {{ issue.shotNo ?? '' }}
{{ issue.subjectRef }}{{ issue.message }}
</li>
</ul>
</template>
<p class="mt-4 text-[11px] text-muted">回执仅保留在当前浏览器会话中数据库结果是覆盖率和镜头详情的依据</p>
</section>
</template>