来源:AI开发日志公众号专辑「Build Your Own X With AI」
原文链接:https://mp.weixin.qq.com/s?__biz=MzUxMjg3MjE2OA==&mid=2247485975&idx=1&sn=d7d06bd4a9b22e8c54d489bca3ad14c0&chksm=f95c9190ce2b1886b1f5c382a97fb545dffce20df4cbd2488d18de2b1c3360c31f88308e3d12#rd

需求文档

介绍

本功能旨在创建一个交互式 3D 可视化系统,用于展示 Git 版本控制系统的核心概念和操作。通过 3D 动画,用户可以直观地理解 Git 的分支、提交、合并等操作,使抽象的版本控制概念变得具象化和易于理解。

术语表

Visualization System(可视化系统)

负责渲染和管理 3D 场景的核心系统

Git Parser(Git 解析器)

读取和解析 Git 仓库数据的组件

Commit Node(提交节点)

在 3D 空间中代表单个 Git 提交的可视化对象

Branch Line(分支线)

连接提交节点的 3D 线条,表示 Git 分支

Animation Controller(动画控制器)

管理场景中所有动画效果的组件

Camera System(相机系统)

控制用户视角和场景导航的系统

User Interface(用户界面)

提供用户交互控制的界面层

需求

需求 1

用户故事: 作为开发者,我想要看到 Git 提交历史的 3D 可视化,以便更直观地理解项目的演进过程

验收标准

WHEN Git Parser 读取仓库数据,THE Visualization System SHALL 为每个提交创建一个 Commit Node

THE Visualization System SHALL 在 3D 空间中按时间顺序排列 Commit Node

THE Visualization System SHALL 使用 Branch Line 连接父子提交关系

THE Commit Node SHALL 显示提交的哈希值、作者和消息摘要

WHEN 用户悬停在 Commit Node 上,THE User Interface SHALL 显示完整的提交详情

需求 2

用户故事: 作为开发者,我想要看到 Git 分支的 3D 表示,以便理解分支之间的关系和合并历史

验收标准

THE Visualization System SHALL 为每个 Git 分支分配唯一的颜色

THE Branch Line SHALL 使用对应分支的颜色进行渲染

WHEN 检测到分支分叉,THE Visualization System SHALL 在 3D 空间中分离 Branch Line

WHEN 检测到分支合并,THE Animation Controller SHALL 播放合并动画效果

THE User Interface SHALL 显示所有活动分支的列表和颜色标识

需求 3

用户故事: 作为用户,我想要控制 3D 场景的视角,以便从不同角度查看 Git 历史

验收标准

THE Camera System SHALL 支持鼠标拖拽旋转视角

THE Camera System SHALL 支持鼠标滚轮缩放场景

THE Camera System SHALL 支持键盘方向键平移视角

THE Camera System SHALL 提供重置视角到默认位置的功能

WHEN 用户双击 Commit Node,THE Camera System SHALL 平滑移动并聚焦到该节点

需求 4

用户故事: 作为用户,我想要看到 Git 操作的动画效果,以便理解操作的执行过程

验收标准

WHEN 播放提交操作,THE Animation Controller SHALL 显示新 Commit Node 的创建动画

WHEN 播放分支操作,THE Animation Controller SHALL 显示新 Branch Line 的生长动画

WHEN 播放合并操作,THE Animation Controller SHALL 显示两条 Branch Line 汇聚的动画

THE Animation Controller SHALL 提供播放、暂停和重置动画的控制功能

THE User Interface SHALL 显示当前动画的时间轴和进度

需求 5

用户故事: 作为用户,我想要加载本地或远程 Git 仓库,以便可视化任何项目的历史

验收标准

THE User Interface SHALL 提供输入本地仓库路径的功能

THE User Interface SHALL 提供输入远程仓库 URL 的功能

WHEN 用户提交仓库路径,THE Git Parser SHALL 验证路径的有效性

IF 仓库路径无效,THEN THE User Interface SHALL 显示错误提示信息

WHEN Git Parser 成功加载仓库,THE Visualization System SHALL 开始渲染 3D 场景

需求 6

用户故事: 作为用户,我想要过滤和搜索特定的提交,以便专注于感兴趣的历史部分

验收标准

THE User Interface SHALL 提供按作者过滤提交的功能

THE User Interface SHALL 提供按日期范围过滤提交的功能

THE User Interface SHALL 提供按提交消息搜索的功能

WHEN 应用过滤条件,THE Visualization System SHALL 仅显示匹配的 Commit Node

THE Visualization System SHALL 保持过滤后节点之间的连接关系可见

需求 7

用户故事: 作为用户,我想要导出 3D 场景的截图或视频,以便分享可视化结果

验收标准

THE User Interface SHALL 提供截图功能按钮

THE User Interface SHALL 提供录制视频功能按钮

WHEN 用户点击截图,THE Visualization System SHALL 捕获当前视角的高分辨率图像

WHEN 用户开始录制,THE Visualization System SHALL 记录场景的帧序列

THE User Interface SHALL 允许用户选择导出文件的保存位置和格式

实施计划

[-] 1. 初始化项目结构和依赖

使用 Vite 创建 React + TypeScript 项目

安装核心依赖:three, @react-three/fiber, @react-three/drei, isomorphic-git, zustand, gsap, tailwindcss

配置 TypeScript 和 ESLint

创建基础目录结构:src/components, src/lib, src/hooks, src/store, src/types

需求: 5.5

[ ] 2. 实现 Git 数据解析层

创建 TypeScript 类型定义(Commit, Branch, Repository 等接口)

实现 GitParser 类,包含 loadLocalRepository 和 getCommitHistory 方法

实现仓库路径验证逻辑

添加错误处理和自定义错误类型(GitVisualizationError)

需求: 5.3, 5.4, 1.1

[ ] 3. 实现数据转换和布局算法

创建 DataTransformer 类

实现 transformCommitsToNodes 方法,将 Git 提交转换为 3D 节点数据

实现 calculateNodePositions 方法,使用时间轴布局算法计算节点位置

实现 generateBranchLines 方法,生成贝塞尔曲线连接线

实现 assignBranchColors 方法,为分支分配唯一颜色

需求: 1.1, 1.2, 1.3, 2.1, 2.3

[ ] 4. 创建状态管理 Store

使用 Zustand 创建全局状态管理

定义 AppState 接口,包含 repository, commits, branches, nodes, lines 等状态

实现 loadRepository action

实现 selectNode action

实现 applyFilters action

需求: 5.5, 6.4

[ ] 5. 实现 3D 场景核心组件

[ ] 5.1 创建 CommitNodeMesh 组件

使用 Three.js 创建球体几何体表示提交节点

添加文字标签显示提交哈希和消息

实现高亮和取消高亮效果

需求: 1.1, 1.4

[ ] 5.2 创建 BranchLineMesh 组件

使用 Three.js Line 创建分支连接线

实现贝塞尔曲线路径

应用分支颜色

需求: 1.3, 2.2

[ ] 5.3 创建 SceneManager 组件

使用 React Three Fiber 初始化 3D 场景

实现 addNode 和 addLine 方法

设置场景光照和背景

实现渲染循环

需求: 1.1, 1.2, 5.5

[ ] 6. 实现相机控制系统

创建 CameraController 类

使用 @react-three/drei 的 OrbitControls 实现鼠标拖拽旋转

实现鼠标滚轮缩放功能

实现键盘方向键平移功能

实现 focusOnNode 方法,双击节点时平滑聚焦

实现 reset 方法,重置相机到默认位置

需求: 3.1, 3.2, 3.3, 3.4, 3.5

[ ] 7. 实现动画控制系统

创建 AnimationController 类

使用 GSAP 实现提交节点的创建动画(淡入 + 缩放)

实现分支线的生长动画(路径绘制效果)

实现合并动画(两条线汇聚效果)

创建动画时间轴控制(播放、暂停、停止、速度调整)

需求: 4.1, 4.2, 4.3, 4.4

[ ] 8. 创建用户界面组件

[ ] 8.1 创建仓库加载面板

创建输入框组件用于输入本地仓库路径

创建输入框组件用于输入远程仓库 URL

添加加载按钮和加载状态指示器

实现错误提示显示

需求: 5.1, 5.2, 5.4

[ ] 8.2 创建控制面板

创建动画控制按钮(播放、暂停、停止)

创建速度调节滑块

创建时间轴进度条

创建相机重置按钮

需求: 4.4, 4.5, 3.4

[ ] 8.3 创建信息面板

创建提交详情显示组件(悬停时显示)

创建分支列表组件,显示所有分支和颜色标识

实现节点选中时的详细信息展示

需求: 1.5, 2.5

[ ] 8.4 创建过滤和搜索面板

创建作者过滤下拉选择器

创建日期范围选择器

创建提交消息搜索输入框

实现过滤条件应用和清除功能

需求: 6.1, 6.2, 6.3

[ ] 9. 实现过滤引擎

创建 FilterEngine 类

实现 filterByAuthor 方法

实现 filterByDateRange 方法

实现 searchByMessage 方法

实现 applyFilters 方法,组合多个过滤条件

更新场景以仅显示过滤后的节点和连线

需求: 6.1, 6.2, 6.3, 6.4, 6.5

[ ] 10. 实现导出功能

实现截图功能,使用 canvas.toDataURL 捕获当前场景

创建截图按钮和下载逻辑

实现视频录制功能,使用 MediaRecorder API 记录帧序列

创建录制控制按钮(开始/停止录制)

实现文件保存对话框和格式选择

需求: 7.1, 7.2, 7.3, 7.4, 7.5

[ ] 11. 实现性能优化

实现视锥剔除,只渲染可见节点

使用 THREE.InstancedMesh 优化大量相似节点的渲染

实现 LOD(细节层次),远处节点使用简化几何体

添加分页加载,限制一次渲染的节点数量

实现内存管理,及时释放不再使用的 Three.js 对象

需求: 1.1, 1.2

[ ] 12. 集成所有组件并完成主应用

创建主 App 组件,整合所有子组件

连接状态管理和 UI 组件

实现组件间的事件通信

添加加载状态和错误边界

测试完整的用户流程:加载仓库 → 查看可视化 → 交互控制 → 过滤搜索 → 导出

需求: 1.1, 1.2, 1.3, 1.4, 1.5, 2.1, 2.2, 2.3, 2.4, 2.5, 3.1, 3.2, 3.3, 3.4, 3.5, 4.1, 4.2, 4.3, 4.4, 4.5, 5.1, 5.2, 5.3, 5.4, 5.5, 6.1, 6.2, 6.3, 6.4, 6.5, 7.1, 7.2, 7.3, 7.4, 7.5

[ ]* 13. 编写测试

[ ]* 13.1 编写 GitParser 单元测试

测试 loadLocalRepository 方法

测试 getCommitHistory 方法

测试错误处理逻辑

需求: 5.3, 5.4

[ ]* 13.2 编写 DataTransformer 单元测试

测试节点位置计算算法

测试分支线生成逻辑

测试颜色分配算法

需求: 1.2, 1.3, 2.1

[ ]* 13.3 编写 FilterEngine 单元测试

测试各种过滤条件

测试过滤条件组合

测试边界情况

需求: 6.1, 6.2, 6.3, 6.4

[ ]* 13.4 编写组件集成测试

测试仓库加载流程

测试相机交互

测试动画播放

测试过滤和搜索

需求: 5.5, 3.1, 3.2, 4.4, 6.4

image-1