# 分镜资源总览功能
**日期**: 2026-02-01
**类型**: Feature
**影响范围**: PreviewPanel, StoryboardResourcesPreview
## 变更内容
### Bug 修复
**问题**: 点击分镜轨道块时,PreviewPanel 错误地显示资源总览而非分镜预览
**原因**: 判断条件只检查了 `selectedStoryboardId && !selectedResourceId`,没有区分点击来源(分镜轨道 vs 资源轨道)
**解决方案**: 添加 `resourcesPanelOpen` 状态检查,只有当资源面板打开时才显示资源总览
**修改逻辑**:
```typescript
// 修改前:
if (selectedStoryboardId && !selectedResourceId && currentStoryboard) {
return ;
}
// 修改后:
if (selectedStoryboardId && !selectedResourceId && resourcesPanelOpen && currentStoryboard) {
return ;
}
```
### 新增功能
1. **分镜资源总览组件** (`StoryboardResourcesPreview`)
- 展示选中分镜关联的所有资源(角色、场景、道具、实拍)
- 支持点击资源卡片切换到该资源的详细预览
- 支持通过添加按钮关联新资源到分镜
2. **PreviewPanel 交互优化**
- 点击分镜看板资源轨道块时,显示该分镜的资源总览
- 点击资源总览中的资源卡片,切换到资源详细预览
- 点击添加按钮,打开资源选择器关联资源
### UI 设计
#### 资源总览布局
```
┌─────────────────────────────────────────────────────────────┐
│ 👤 角色 (3) [+添加] │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ 头像 │ │ 头像 │ │ 头像 │ │
│ │ 3:4 │ │ 3:4 │ │ 3:4 │ │
│ └──────┘ └──────┘ └──────┘ │
│ 角色名 角色名 角色名 │
│ 标签 标签 标签 │
└─────────────────────────────────────────────────────────────┘
```
#### 资源卡片设计
- **角色资源**: 3:4 比例缩略图 (48x64)
- **场景资源**: 16:9 比例缩略图 (64x36)
- **道具资源**: 1:1 比例缩略图 (48x48)
- **实拍资源**: 16:9 比例缩略图 (64x36)
#### 视觉规范
| 元素 | 规范 |
|------|------|
| 背景 | `bg-bg-element` |
| 行背景 | `bg-bg-page/30` (hover: `bg-bg-page/50`) |
| 卡片背景 | `bg-fill-lighter` (hover: `bg-fill-default`) |
| 边框 | `border-border-light` |
| 选中状态 | `border-primary ring-2 ring-primary/20` |
| 文字颜色 | 主要: `text-text-primary`, 次要: `text-text-tertiary` |
#### 交互设计
| 交互 | 行为 |
|------|------|
| hover 资源卡片 | 边框高亮 + 阴影 + cursor-pointer |
| 点击资源卡片 | 调用 `selectResource(resourceId)` 切换预览 |
| hover 添加按钮 | 背景变亮 |
| 点击添加按钮 | 打开 `ResourcePicker` 弹窗 |
| 资源被选中 | 边框变为主色 `border-primary` |
### 状态流转
```
用户操作 → PreviewPanel 显示
─────────────────────────────────────────────────────────
点击分镜轨道块 → 分镜多方案预览 ✓
点击资源轨道块 → 该分镜资源总览 ✓
点击资源总览中的具体资源 → 该资源详细预览 ✓
点击资源库中的资源 → 该资源详细预览 ✓
```
**关键判断逻辑**:
- `resourcesPanelOpen = false` → 显示分镜预览(点击分镜轨道)
- `resourcesPanelOpen = true` → 显示资源总览(点击资源轨道)
## 技术实现
### 新增文件
1. `/client/src/components/features/preview/StoryboardResourcesPreview.tsx`
- 资源总览组件
- 资源卡片子组件
- 分类展示逻辑
### 修改文件
1. `/client/src/components/features/preview/PreviewPanel.tsx`
- 添加资源总览模式渲染逻辑
- 实现 `handleAddResource` 处理资源添加
- 使用 `useUpdateStoryboard` 更新分镜资源
### API 调用
- **获取项目资源**: `useResources(projectId)`
- **更新分镜资源**: `useUpdateStoryboard()`
- **资源结构**: `StoryboardResources` (characters, locations, props, footages)
### 性能优化
- 使用 `memo` 包装组件,减少重渲染
- 使用 `useMemo` 缓存分组资源计算
- 使用 `useCallback` 优化事件处理器
## 使用说明
### 查看分镜资源
1. 在分镜看板中点击任意资源轨道块
2. PreviewPanel 自动切换到资源总览模式
3. 查看该分镜关联的所有资源
### 添加资源到分镜
1. 在资源总览中点击对应类型的"添加"按钮
2. 从资源选择器中选择资源
3. 资源自动关联到分镜并更新显示
### 预览资源详情
1. 在资源总览中点击任意资源卡片
2. PreviewPanel 切换到该资源的详细预览
3. 支持多视图切换(角色三视图等)
## 依赖说明
- **UI 组件**: ResourcePicker, EmptyState
- **图标**: Lucide React (User, MapPin, Package, Camera)
- **状态管理**: editorStore (selectResource)
- **API Hooks**: useResources, useUpdateStoryboard, useStoryboards
- **工具函数**: cn (Tailwind 样式合并)
## 后续优化
1. **拖拽排序**: 支持在资源总览中拖拽调整资源顺序
2. **批量操作**: 支持批量添加/删除资源
3. **资源标签**: 显示资源的更多元数据(类型、时长等)
4. **空状态优化**: 提供更友好的空状态提示和快捷操作
5. **键盘快捷键**: 支持键盘导航和操作