diff --git a/backend/apps/generation/views.py b/backend/apps/generation/views.py index a4b014b..5b890f0 100644 --- a/backend/apps/generation/views.py +++ b/backend/apps/generation/views.py @@ -1818,6 +1818,7 @@ def admin_records_view(request): 'duration': r.duration, 'seed': r.seed, 'ark_task_id': r.ark_task_id or '', + 'result_url': r.result_url or '', }) return Response({ @@ -1882,6 +1883,7 @@ def team_records_view(request): 'duration': r.duration, 'seed': r.seed, 'ark_task_id': r.ark_task_id or '', + 'result_url': r.result_url or '', }) return Response({ diff --git a/web/src/components/RecordDetailModal.tsx b/web/src/components/RecordDetailModal.tsx index c9882a6..2f46613 100644 --- a/web/src/components/RecordDetailModal.tsx +++ b/web/src/components/RecordDetailModal.tsx @@ -1,5 +1,6 @@ import type { AdminRecord } from '../types'; import { ReferenceList } from './ReferenceList'; +import { rewriteTosUrl } from '../lib/api'; const STATUS_MAP: Record = { completed: { label: '已完成', color: 'var(--color-success)', bg: 'var(--color-success-bg)' }, @@ -43,54 +44,63 @@ export function RecordDetailModal({ record: r, onClose, showTeam, showCost }: Pr + {/* Body — 左视频 / 右信息 双栏 */}
- {/* Status */} -
- {st.label} + {/* ── 左:视频 ── */} +
+
- {/* Error */} - {r.status === 'failed' && r.error_message && ( -
-
失败原因
-
{r.error_message}
- {r.raw_error && r.raw_error !== r.error_message && ( -
- 原始错误:{r.raw_error} -
- )} + {/* ── 右:信息(原有内容整体搬过来,排版不动)── */} +
+ {/* Status */} +
+ {st.label}
- )} - {/* Info Grid */} -
基本信息
-
- {r.ark_task_id && } - {r.username && } - {showTeam && r.team_name && } - - - - - - - - - {showCost && } - {r.seed != null && r.seed !== -1 && } + {/* Error */} + {r.status === 'failed' && r.error_message && ( +
+
失败原因
+
{r.error_message}
+ {r.raw_error && r.raw_error !== r.error_message && ( +
+ 原始错误:{r.raw_error} +
+ )} +
+ )} + + {/* Info Grid */} +
基本信息
+
+ {r.ark_task_id && } + {r.username && } + {showTeam && r.team_name && } + + + + + + + + + {showCost && } + {r.seed != null && r.seed !== -1 && } +
+ + {/* Prompt */} +
提示词
+
{r.prompt || '(无提示词)'}
+ + {/* References */} + {refs.length > 0 && ( + <> +
参考素材({refs.length})
+ + + )}
- - {/* Prompt */} -
提示词
-
{r.prompt || '(无提示词)'}
- - {/* References */} - {refs.length > 0 && ( - <> -
参考素材({refs.length})
- - - )}
@@ -98,6 +108,63 @@ export function RecordDetailModal({ record: r, onClose, showTeam, showCost }: Pr ); } +/** + * 左侧媒体区 — 根据任务状态决定显示什么: + * - completed + result_url → 视频播放器(controls,不自动播放) + * - completed - result_url → "视频已生成"占位 + * - failed → RGB 故障字 "生成失败" + 错误原因摘要 + 斜纹底纹 + * - processing / queued → 旋转 spinner + 文字 + */ +function MediaArea({ record: r }: { record: AdminRecord }) { + return ( +
+ {r.status === 'completed' && r.result_url ? ( +
+ ); +} + +/** + * RGB 故障字失败态 — "生成失败"主标题用 cyan/magenta text-shadow 偏移 + * 模拟坏掉的 CRT 信号丢失;副标题等宽字体显示错误摘要。 + */ +function FailureGlitch({ errorMessage }: { errorMessage?: string }) { + const msg = (errorMessage || 'Generation failed').slice(0, 80); + return ( +
+