You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
9.8 KiB
9.8 KiB
项目结构
文档版本:v1.1
最后更新:2025-01-18
目录
1. 目录结构
src/
├── app/ # 应用入口层
│ ├── App.tsx # 根组件
│ ├── Router.tsx # 路由配置
│ └── providers/ # Provider 组件
│ ├── index.tsx
│ ├── QueryProvider.tsx
│ └── ThemeProvider.tsx
│
├── components/ # 组件层
│ ├── ui/ # 基础 UI 组件 (shadcn/ui)
│ │ ├── button.tsx
│ │ ├── input.tsx
│ │ ├── dialog.tsx
│ │ └── ...
│ │
│ ├── layout/ # 布局组件
│ │ ├── AppLayout.tsx # 应用主布局
│ │ ├── TopBar.tsx # 顶部导航栏
│ │ ├── LeftSidebar.tsx # 左侧边栏(项目/素材库)
│ │ ├── CenterArea.tsx # 中间区域(分镜列表+预览+AI输入)
│ │ └── RightSidebar.tsx # 右侧边栏(图片提示词/角度变换/镜头调整)
│ │
│ ├── features/ # 功能组件
│ │ ├── storyboard/ # 分镜相关
│ │ │ ├── StoryboardPanel.tsx
│ │ │ ├── StoryboardItem.tsx
│ │ │ ├── StoryboardEditor.tsx
│ │ │ └── index.ts
│ │ │
│ │ ├── timeline/ # 分镜看板相关
│ │ │ ├── Storyboard BoardPanel.tsx
│ │ │ ├── Storyboard BoardTrack.tsx
│ │ │ ├── Storyboard BoardItem.tsx
│ │ │ ├── Storyboard BoardControls.tsx
│ │ │ └── index.ts
│ │ │
│ │ ├── preview/ # 预览相关
│ │ │ ├── PreviewPanel.tsx
│ │ │ ├── VideoPlayer.tsx
│ │ │ ├── PlaybackControls.tsx
│ │ │ └── index.ts
│ │ │
│ │ ├── ai/ # AI 功能
│ │ │ ├── AIPromptPanel.tsx
│ │ │ ├── AIGenerateForm.tsx
│ │ │ ├── AIPreviewModal.tsx
│ │ │ └── index.ts
│ │ │
│ │ ├── resources/ # 资源管理
│ │ │ ├── ResourcePanel.tsx
│ │ │ ├── ResourceGrid.tsx
│ │ │ ├── ResourceUploader.tsx
│ │ │ └── index.ts
│ │ │
│ │ ├── project/ # 项目管理
│ │ │ ├── ProjectList.tsx
│ │ │ ├── ProjectCard.tsx
│ │ │ ├── CreateProjectModal.tsx
│ │ │ └── index.ts
│ │ │
│ │ └── settings/ # 设置
│ │ ├── SettingsPanel.tsx
│ │ ├── ExportSettings.tsx
│ │ └── index.ts
│ │
│ └── common/ # 通用组件
│ ├── LoadingSpinner.tsx
│ ├── ErrorBoundary.tsx
│ ├── EmptyState.tsx
│ ├── Tooltip.tsx
│ └── index.ts
│
├── hooks/ # 自定义 Hooks
│ ├── api/ # API 相关 Hooks
│ │ ├── useProjects.ts
│ │ ├── useStoryboards.ts
│ │ ├── useResources.ts
│ │ └── useAIGenerate.ts
│ │
│ ├── useDebounce.ts
│ ├── useLocalStorage.ts
│ ├── useMediaQuery.ts
│ ├── useKeyboardShortcuts.ts
│ └── index.ts
│
├── stores/ # Zustand 状态管理
│ ├── appStore.ts # 全局应用状态
│ ├── projectStore.ts # 项目状态
│ ├── editorStore.ts # 编辑器状态
│ ├── uiStore.ts # UI 状态
│ └── index.ts
│
├── services/ # 服务层
│ ├── api/ # API 服务
│ │ ├── client.ts # Axios 客户端配置
│ │ ├── projects.ts # 项目 API
│ │ ├── storyboards.ts # 分镜 API
│ │ ├── resources.ts # 资源 API
│ │ ├── ai.ts # AI 生成 API
│ │ └── index.ts
│ │
│ └── mock/ # Mock 数据服务
│ ├── mockClient.ts
│ ├── mockData.ts
│ └── handlers.ts
│
├── types/ # TypeScript 类型定义
│ ├── project.ts
│ ├── storyboard.ts
│ ├── resource.ts
│ ├── timeline.ts
│ ├── ai.ts
│ ├── api.ts
│ └── index.ts
│
├── utils/ # 工具函数
│ ├── format.ts # 格式化工具
│ ├── validation.ts # 验证工具
│ ├── storage.ts # 存储工具
│ ├── time.ts # 时间处理
│ └── index.ts
│
├── constants/ # 常量定义
│ ├── config.ts # 配置常量
│ ├── routes.ts # 路由常量
│ ├── keys.ts # 键名常量
│ └── index.ts
│
├── styles/ # 全局样式
│ ├── globals.css # 全局 CSS
│ └── animations.css # 动画定义
│
├── assets/ # 静态资源
│ ├── images/
│ └── fonts/
│
├── lib/ # 第三方库配置
│ └── utils.ts # shadcn/ui 工具
│
├── main.tsx # 应用入口
└── vite-env.d.ts # Vite 类型声明
2. 模块职责说明
| 目录 | 职责 | 原则 |
|---|---|---|
app/ |
应用配置、Provider、路由 | 只放应用级配置 |
components/ui/ |
基础 UI 组件 | 无业务逻辑,纯展示 |
components/layout/ |
布局组件 | 定义页面结构 |
components/features/ |
功能组件 | 按功能模块组织 |
components/common/ |
通用组件 | 跨模块复用 |
hooks/ |
自定义 Hooks | 逻辑复用 |
stores/ |
全局状态 | Zustand stores |
services/ |
外部服务交互 | API 调用、Mock |
types/ |
类型定义 | 所有 TS 类型 |
utils/ |
工具函数 | 纯函数,无副作用 |
constants/ |
常量 | 配置、枚举、键名 |
2.1 组件层级说明
UI 组件 (components/ui/)
- 职责:提供基础的、可复用的 UI 组件
- 特点:无业务逻辑,完全受控
- 示例:Button、Input、Dialog、Select
- 来源:主要来自 shadcn/ui
布局组件 (components/layout/)
- 职责:定义页面的整体结构和布局
- 特点:组合 UI 组件,定义页面骨架
- 示例:AppLayout、TopBar、Sidebar
功能组件 (components/features/)
- 职责:实现具体的业务功能
- 特点:包含业务逻辑,调用 API 和状态管理
- 组织:按功能模块分组(storyboard、timeline、preview 等)
通用组件 (components/common/)
- 职责:跨功能模块复用的组件
- 特点:通用性强,可配置性高
- 示例:LoadingSpinner、ErrorBoundary、EmptyState
3. 导入别名配置
3.1 Vite 配置
// vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import path from "path";
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
"@components": path.resolve(__dirname, "./src/components"),
"@hooks": path.resolve(__dirname, "./src/hooks"),
"@stores": path.resolve(__dirname, "./src/stores"),
"@services": path.resolve(__dirname, "./src/services"),
"@types": path.resolve(__dirname, "./src/types"),
"@utils": path.resolve(__dirname, "./src/utils"),
"@constants": path.resolve(__dirname, "./src/constants"),
"@assets": path.resolve(__dirname, "./src/assets"),
},
},
});
3.2 TypeScript 配置
// tsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["src/*"],
"@components/*": ["src/components/*"],
"@hooks/*": ["src/hooks/*"],
"@stores/*": ["src/stores/*"],
"@services/*": ["src/services/*"],
"@types/*": ["src/types/*"],
"@utils/*": ["src/utils/*"],
"@constants/*": ["src/constants/*"],
"@assets/*": ["src/assets/*"]
}
}
}
3.3 使用示例
// ✅ 推荐:使用别名
import { Button } from "@components/ui/button";
import { useStoryboards } from "@hooks/api/useStoryboards";
import { useEditorStore } from "@stores/editorStore";
import { cn } from "@/lib/utils";
import type { Storyboard } from "@types";
// ❌ 避免:使用相对路径(深层嵌套时)
import { Button } from "../../../components/ui/button";
import { useStoryboards } from "../../../hooks/api/useStoryboards";
相关文档
最后更新:2025-01-18 | 版本:v1.1