【开源剪映小助手-客户端】前端界面设计

5 阅读5分钟

前端界面设计

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构概览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论
  10. 附录

简介

本文件面向 capcut-mate 桌面客户端的前端界面设计,系统性阐述基于 React 的组件结构、页面布局与用户交互设计。文档重点覆盖以下方面:

  • 页面组织与路由策略(当前采用 Tab 切换)
  • 功能模块设计:草稿管理、下载控制、历史记录、配置中心
  • 组件间通信机制与状态管理
  • 用户操作流程与体验优化
  • 响应式设计与主题适配建议
  • 面向开发者的界面定制与功能扩展指导

项目结构

前端位于 desktop-client/web 目录,采用 Vite 构建,React 19 作为核心框架,配合 Bootstrap 和 react-bootstrap-icons 提供基础 UI 能力。Electron 作为桌面宿主,通过 IPC 暴露能力给前端使用。

graph TB
Root["应用根节点<br/>index.jsx"] --> App["应用容器<br/>App.jsx"]
App --> Header["顶部导航<br/>Header/index.jsx"]
App --> Content["主内容区"]
Content --> Download["下载页面<br/>pages/Download/index.jsx"]
Content --> History["历史记录页面<br/>pages/History/index.jsx"]
Content --> Config["配置中心页面<br/>pages/ConfigCenter/index.jsx"]
Download --> Components["通用组件集合"]
Components --> Tabs["示例草稿模板<br/>components/Tabs.jsx"]
Components --> Textarea["多行文本输入<br/>components/Textarea.jsx"]
Components --> Controls["下载控制开关<br/>components/DownloadControls.jsx"]
Components --> Button["下载按钮<br/>components/DownloadButton.jsx"]
Components --> Log["日志模块<br/>components/LogModule.jsx"]
Components --> Ext["外部网页展示<br/>components/ExternalWebpage.jsx"]
App --> Electron["Electron 服务封装<br/>services/electronService.js"]

核心组件

  • 应用入口与挂载:负责创建 React 根实例并渲染 App 容器。
  • 应用容器:集中管理全局状态(如当前选中的 Tab)与页面内容渲染。
  • 顶部导航:提供页面切换与外部链接跳转。
  • 页面组件:下载页面、历史记录页面、配置中心页面。
  • 通用组件:示例草稿模板、多行文本输入、下载控制开关、下载按钮、日志模块、外部网页展示。
  • Electron 服务封装:统一浏览器与 Electron 环境下的 API 调用差异。

架构概览

capcut-mate 前端采用“容器 + 组件”分层设计:

  • 容器层:App.jsx 负责状态持有与页面切换;各页面组件负责具体业务逻辑。
  • 组件层:通用 UI 组件复用度高,职责单一,便于测试与维护。
  • 服务层:electronService.js 抽象 Electron 与浏览器环境差异,提供统一接口。
  • 数据流:页面组件通过 electronService 与桌面端通信,接收日志、历史、配置等数据;UI 通过状态驱动更新。
graph TB
subgraph "容器层"
App["App.jsx"]
Header["Header/index.jsx"]
end
subgraph "页面层"
Download["Download/index.jsx"]
History["History/index.jsx"]
Config["ConfigCenter/index.jsx"]
end
subgraph "组件层"
Tabs["Tabs.jsx"]
Textarea["Textarea.jsx"]
Controls["DownloadControls.jsx"]
Button["DownloadButton.jsx"]
Log["LogModule.jsx"]
Ext["ExternalWebpage.jsx"]
end
subgraph "服务层"
Electron["electronService.js"]
end
App --> Header
App --> Download
App --> History
App --> Config
Download --> Tabs
Download --> Textarea
Download --> Controls
Download --> Button
Download --> Log
Download --> Ext
Download --> Electron
History --> Electron
Config --> Electron

详细组件分析

应用容器与页面切换

  • App.jsx 通过 useState 维护当前选中的 Tab,使用对象映射根据 Tab 渲染对应页面。
  • 顶部导航通过回调通知 App 切换 Tab,实现页面级切换。
  • 使用 ToastContainer 全局提示,避免页面内重复引入。
sequenceDiagram
participant U as "用户"
participant H as "Header"
participant A as "App"
participant D as "Download 页面"
participant Y as "History 页面"
participant C as "Config 页面"
U->>H : 点击导航项
H->>A : onTabChange(tab)
A->>A : 更新 selectedTab
alt 选中 download
A->>D : 渲染 Download 页面
else 选中 history
A->>Y : 渲染 History 页面
else 选中 config
A->>C : 渲染 Config 页面
end

下载页面(草稿管理与下载控制)

  • 状态管理:包含文本输入值、下载开关、日志列表、加载状态等。
  • 日志订阅:通过 electronService.onFileOperationLog 订阅日志事件,自动滚动到底部。
  • 下载流程:校验输入、解析 draft_id、获取远程文件列表、匹配目标文件、调用 saveFile 并提示结果。
  • 组件组合:Textarea、Tabs、DownloadControls、DownloadButton、LogModule、ExternalWebpage。
sequenceDiagram
participant U as "用户"
participant P as "Download 页面"
participant S as "electronService"
participant E as "Electron 主进程"
U->>P : 输入草稿地址并点击下载
P->>P : 校验输入并拆分多行
loop 对每个地址
P->>S : getUrlJsonData(url)
S->>E : IPC 调用
E-->>S : 返回 JSON 数据
S-->>P : 文件列表
P->>P : 过滤匹配的文件
P->>S : saveFile({sourceUrl, remoteFileUrls, targetId, isOpenDir})
S->>E : IPC 调用
E-->>S : 下载完成
S-->>P : 结果
P->>U : Toast 提示
end
P->>S : onFileOperationLog 订阅日志
S-->>P : 实时推送日志

历史记录页面(数据展示与分页)

  • 数据加载:首次加载时调用 electronService.getHistoryRecord 获取全部历史,按时间倒序排序。
  • 分页策略:固定每页条数,计算总页数,动态生成页码项,支持省略号。
  • 交互细节:复制草稿地址到剪贴板,悬浮提示展示完整 URL,加载状态友好提示。
  • UI 基于 react-bootstrap 组件库,样式通过内联样式与类名结合实现。
flowchart TD
Start(["进入历史页面"]) --> Load["加载历史记录<br/>getHistoryRecord()"]
Load --> Sort["按时间倒序排序"]
Sort --> CalcPage["计算总页数"]
CalcPage --> Render["渲染当前页数据"]
Render --> Interact{"用户操作?"}
Interact --> |复制地址| Copy["复制到剪贴板"]
Interact --> |切换页码| ChangePage["更新当前页并渲染"]
Interact --> |无| End(["结束"])
Copy --> End
ChangePage --> Render

配置中心页面(路径设置)

  • 功能:读取并展示剪映草稿保存路径,提供选择新路径的能力。
  • 交互:点击“选择...”触发 Electron 更新路径流程,成功后刷新显示。
  • 提示:使用 Toast 提示错误与成功信息。

通用组件设计

  • Tabs:提供示例草稿模板快速填充,简化用户输入。
  • Textarea:自适应高度,限制最大高度,提升输入体验。
  • DownloadControls:下载完成后是否自动打开文件夹的开关。
  • DownloadButton:下载过程中的禁用与加载态处理。
  • LogModule:实时日志展示与清空,自动滚动到底部。
  • ExternalWebpage:外部网页 iframe 展示,具备可访问性检测与降级展示。

依赖关系分析

  • 依赖管理:package.json 中声明 React、Bootstrap、react-bootstrap-icons、react-toastify 等依赖。
  • 构建配置:vite.config.js 配置别名 @ 指向 src,开发服务器端口 9000,构建输出到 ../ui。
  • Electron 集成:Vite 插件 electron 在生产构建时启用(注释),开发阶段通过浏览器环境运行。
graph LR
Pkg["package.json 依赖"] --> React["react / react-dom"]
Pkg --> Bootstrap["react-bootstrap / bootstrap"]
Pkg --> Icons["react-bootstrap-icons"]
Pkg --> Toast["react-toastify"]
Pkg --> Axios["axios"]
Vite["vite.config.js"] --> Alias["@ -> src"]
Vite --> Dev["开发服务器: 9000"]
Vite --> Build["构建输出: ../ui"]

性能考虑

  • 日志自动滚动:通过 useEffect 在日志数组变化时滚动到底部,避免阻塞主线程。
  • 文本域自适应:限制最大高度,减少重排开销。
  • 分页渲染:历史记录页面按页渲染,避免一次性渲染大量节点。
  • 事件清理:下载页面在卸载时移除日志监听,防止内存泄漏。
  • 环境适配:electronService 在浏览器环境提供降级实现,避免直接依赖 Electron API 导致的性能问题。

故障排除指南

  • 下载失败或无文件列表:
    • 检查输入的草稿地址是否包含 draft_id 参数。
    • 确认 getUrlJsonData 返回的 files 数组包含匹配的文件。
  • 日志不更新:
    • 确认 onFileOperationLog 已正确订阅,且在组件卸载时调用了 removeAllFileOperationLogListeners。
  • 外部网页无法展示:
    • 检查 checkUrlAccess 返回的 accessible 状态,若为 false,将显示默认静态广告。
  • 路径选择无效:
    • 浏览器环境不支持选择路径,需在 Electron 环境下使用 updateDraftPath。

结论

capcut-mate 前端采用清晰的容器-组件分层与服务抽象,实现了跨环境的一致体验。通过 electronService 统一封装 IPC 调用,页面组件专注于业务逻辑,通用组件保证了良好的复用性与可维护性。建议后续在保持现有架构稳定的基础上,逐步引入更完善的主题系统与国际化支持,持续优化日志与错误提示的可视化表现。

附录

  • 开发与构建

    • 开发模式:npm run dev 或 npm run dev:electron
    • 生产构建:npm run build 或 npm run build:electron
  • 目录约定

    • 组件目录:components/
    • 页面目录:pages/
    • 服务目录:services/
    • 样式目录:styles/
    • 工具目录:utils/
  • 接口文档: docs.jcaigc.cn

  • 效果案例: www.jcaigc.cn/workflow

  • 开源仓库: capcut-mate