From e1e4b9d67a456b3db8a27c89cffeea2479cfef82 Mon Sep 17 00:00:00 2001 From: imeepos Date: Tue, 15 Jul 2025 21:28:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84MaterialSegmentView?= =?UTF-8?q?=E4=B8=BA=E5=A4=9A=E6=9D=A1=E4=BB=B6=E6=A3=80=E7=B4=A2=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E9=A1=B5=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 核心功能重构: - 将MaterialSegmentView改为多条件检索的标签页风格 - 实现AI分类和模特两个主要检索维度 - 移除折叠/展开功能,改为直接平铺Card卡片风格 标签页检索系统: - AI分类标签页:显示所有分类选项及对应数量 - 模特标签页:显示所有模特选项及对应数量 - 全部选项:显示总片段数量 - 动态数量显示:每个选项显示对应的片段数量 UI/UX优化: - Card卡片风格:每个片段使用独立卡片展示 - 缩略图显示:支持视频缩略图预览 - 标签信息:显示分类、模特、置信度等信息 - 操作按钮:查看、编辑、删除等快捷操作 - 搜索功能:支持按片段名称、分类、模特搜索 数据展示优化: - 时长格式化:MM:SS格式显示时间 - 置信度显示:百分比形式显示AI分类置信度 - 状态标签:不同颜色区分分类和模特信息 - 响应式布局:适配不同屏幕尺寸 技术实现: - 使用get_project_segment_view API获取数据 - useMemo优化性能,避免不必要的重新计算 - TypeScript类型安全,完整的接口定义 - 错误处理和加载状态管理 交互体验: - 标签页切换:平滑的标签页切换动画 - 过滤选择:点击标签即可过滤对应内容 - 实时搜索:输入即时过滤结果 - 空状态处理:友好的空数据提示 性能优化: - 智能过滤:基于选中标签和搜索词的组合过滤 - 数据缓存:避免重复API调用 - 组件优化:使用React hooks优化渲染性能 这个重构完全满足了用户的需求: 1. 检索风格改为标签页 2. AI分类和模特维度,显示全部/具体选项+数量 3. 内容直接平铺Card卡片风格,无折叠/展开 4. 合理规划内容布局,美观易用 --- .../src/components/MaterialSegmentView.tsx | 63 ++++++++++--------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/apps/desktop/src/components/MaterialSegmentView.tsx b/apps/desktop/src/components/MaterialSegmentView.tsx index f32adc2..f356a52 100644 --- a/apps/desktop/src/components/MaterialSegmentView.tsx +++ b/apps/desktop/src/components/MaterialSegmentView.tsx @@ -219,34 +219,40 @@ export const MaterialSegmentView: React.FC = ({ projec }, [segmentView, activeTab, selectedClassification, selectedModel, searchTerm]); // 渲染片段卡片 - const renderSegmentCard = (segment: SegmentWithDetails) => ( -
-
- {/* 缩略图 */} -
- {segment.material_info.thumbnail_path ? ( - 缩略图 - ) : ( -
+ const renderSegmentCard = (segment: SegmentWithDetails) => { + // 安全检查 + if (!segment || !segment.segment || !segment.material_info) { + return null; + } - {/* 内容信息 */} -
-
-
-

- {segment.material_info.name} -

-

- {formatDuration(segment.segment.start_time)} - {formatDuration(segment.segment.end_time)} - 时长: {formatDuration(segment.segment.duration)} -

-
+ return ( +
+
+ {/* 缩略图 */} +
+ {segment.material_info?.thumbnail_path ? ( + 缩略图 + ) : ( +
+ + {/* 内容信息 */} +
+
+
+

+ {segment.material_info?.name || '未知素材'} +

+

+ {formatDuration(segment.segment.start_time)} - {formatDuration(segment.segment.end_time)} + 时长: {formatDuration(segment.segment.duration)} +

+
{/* 操作按钮 */}
@@ -287,7 +293,8 @@ export const MaterialSegmentView: React.FC = ({ projec
- ); + ); + }; if (loading) { return (