201 lines
7.3 KiB
Markdown
201 lines
7.3 KiB
Markdown
# 现金流图表 (CashFlowChart)
|
||
|
||
<cite>
|
||
**本文档中引用的文件**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx)
|
||
- [types.ts](file://src/types.ts)
|
||
- [mock-cashflow.json](file://src/mock-cashflow.json)
|
||
- [mock-cashflow-original.json](file://src/mock-cashflow-original.json)
|
||
- [DualChartView.tsx](file://src/DualChartView.tsx)
|
||
- [Root.tsx](file://src/Root.tsx)
|
||
- [UnifiedHUD.tsx](file://src/UnifiedHUD.tsx)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [简介](#简介)
|
||
2. [项目结构](#项目结构)
|
||
3. [核心组件](#核心组件)
|
||
4. [架构概述](#架构概述)
|
||
5. [详细组件分析](#详细组件分析)
|
||
6. [依赖分析](#依赖分析)
|
||
7. [性能考虑](#性能考虑)
|
||
8. [故障排除指南](#故障排除指南)
|
||
9. [结论](#结论)
|
||
|
||
## 简介
|
||
现金流图表 (CashFlowChart) 组件是一个复合图表,用于可视化年度收入与支出构成。该组件结合了堆叠柱状图和折线图,分别展示各项支出(生活、住房、教育、事件、税费)和总收入。通过顺序增长动画和插值点技术,实现了动态的视觉效果。HUD区域展示了净现金流和总支出等关键指标。
|
||
|
||
## 项目结构
|
||
项目结构清晰,主要包含前端和后端两个部分。前端部分位于`frontend/src`目录下,包含了渲染属性类型定义。后端部分位于`backend`目录下,包含了视频处理和数据提取的逻辑。核心的图表组件位于`src`目录下,包括`CashFlowChart.tsx`、`DualChartView.tsx`等文件。
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "前端"
|
||
Frontend[frontend/src]
|
||
end
|
||
subgraph "后端"
|
||
Backend[backend]
|
||
end
|
||
subgraph "核心组件"
|
||
Src[src]
|
||
end
|
||
Frontend --> Src
|
||
Backend --> Src
|
||
```
|
||
|
||
**图表来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L1-L441)
|
||
- [DualChartView.tsx](file://src/DualChartView.tsx#L1-L176)
|
||
|
||
**章节来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L1-L441)
|
||
- [DualChartView.tsx](file://src/DualChartView.tsx#L1-L176)
|
||
|
||
## 核心组件
|
||
`CashFlowChart` 组件是本项目的核心,负责展示年度收支构成。它使用 Recharts 库中的 `ComposedChart` 组件,结合 `Bar` 和 `Line` 组件,实现了堆叠柱状图和折线图的组合。通过 `getMultiplier` 函数控制每个支出类别依次增长的视觉效果,实现了顺序增长动画。
|
||
|
||
**章节来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L75-L441)
|
||
|
||
## 架构概述
|
||
`CashFlowChart` 组件的架构设计合理,通过 `flattenedData` 结构将嵌套的 `expenses` 对象转换为 Recharts 可读的扁平字段。Y轴域(yAxisDomain)基于完整时间线数据保持稳定,防止图表跳动。HUD区域通过计算并展示净现金流和总支出,提供了直观的财务概览。
|
||
|
||
```mermaid
|
||
graph TB
|
||
A[CashFlowData] --> B[flattenedData]
|
||
B --> C[ComposedChart]
|
||
C --> D[Bar]
|
||
C --> E[Line]
|
||
C --> F[HUD]
|
||
```
|
||
|
||
**图表来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L116-L131)
|
||
- [UnifiedHUD.tsx](file://src/UnifiedHUD.tsx#L1-L164)
|
||
|
||
**章节来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L116-L131)
|
||
- [UnifiedHUD.tsx](file://src/UnifiedHUD.tsx#L1-L164)
|
||
|
||
## 详细组件分析
|
||
### CashFlowChart 分析
|
||
`CashFlowChart` 组件通过 `flattenedData` 结构将嵌套的 `expenses` 对象转换为 Recharts 可读的扁平字段。`getMultiplier` 函数控制每个支出类别依次增长的视觉效果,实现了顺序增长动画。在年内进度(yearProgress)期间,通过插值点(interpolatedPoint)实现收入红线的水平延伸动画。
|
||
|
||
#### 对象导向组件
|
||
```mermaid
|
||
classDiagram
|
||
class CashFlowData {
|
||
+year : number
|
||
+age : number
|
||
+income : Income
|
||
+expenses : Expenses
|
||
}
|
||
class Income {
|
||
+total : number
|
||
}
|
||
class Expenses {
|
||
+living : number
|
||
+housing : number
|
||
+education : number
|
||
+tax : number
|
||
+event : number
|
||
}
|
||
class CashFlowChart {
|
||
+timeline : CashFlowData[]
|
||
+meta : Meta
|
||
+hideHeader : boolean
|
||
+externalDataIndex : number
|
||
+externalYearProgress : number
|
||
}
|
||
CashFlowData --> Income
|
||
CashFlowData --> Expenses
|
||
CashFlowChart --> CashFlowData
|
||
```
|
||
|
||
**图表来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L16-L32)
|
||
- [types.ts](file://src/types.ts#L4-L32)
|
||
|
||
#### API/服务组件
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Frame as "当前帧"
|
||
participant Config as "视频配置"
|
||
participant Progress as "进度计算"
|
||
participant Data as "数据处理"
|
||
participant Chart as "图表渲染"
|
||
Frame->>Config : 获取帧数
|
||
Config->>Progress : 计算精确进度
|
||
Progress->>Data : 计算数据结束索引
|
||
Data->>Data : 计算年内进度
|
||
Data->>Chart : 生成扁平化数据
|
||
Chart->>Chart : 应用顺序增长动画
|
||
Chart->>Chart : 添加插值点
|
||
Chart->>Chart : 渲染图表
|
||
```
|
||
|
||
**图表来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L83-L179)
|
||
|
||
**章节来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L83-L179)
|
||
|
||
### 概念概述
|
||
`CashFlowChart` 组件的设计理念是通过动态的视觉效果,直观地展示年度收支构成。通过顺序增长动画和插值点技术,增强了用户的交互体验。HUD区域提供了关键的财务指标,帮助用户快速了解财务状况。
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start([开始]) --> LoadData["加载数据"]
|
||
LoadData --> ProcessData["处理数据"]
|
||
ProcessData --> AnimateBars["动画柱状图"]
|
||
AnimateBars --> ExtendLine["延伸折线"]
|
||
ExtendLine --> RenderChart["渲染图表"]
|
||
RenderChart --> ShowHUD["显示HUD"]
|
||
ShowHUD --> End([结束])
|
||
```
|
||
|
||
[无来源,因为此图表显示的是概念性工作流,而非实际代码结构]
|
||
|
||
[无来源,因为此部分不分析特定文件]
|
||
|
||
## 依赖分析
|
||
`CashFlowChart` 组件依赖于 Recharts 库和 Remotion 库。Recharts 提供了图表渲染功能,Remotion 提供了动画和视频渲染功能。通过 `useCurrentFrame` 和 `useVideoConfig` 钩子,实现了与视频帧的同步。
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[CashFlowChart] --> B[Recharts]
|
||
A --> C[Remotion]
|
||
B --> D[ComposedChart]
|
||
B --> E[Bar]
|
||
B --> F[Line]
|
||
C --> G[useCurrentFrame]
|
||
C --> H[useVideoConfig]
|
||
```
|
||
|
||
**图表来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L2-L13)
|
||
- [DualChartView.tsx](file://src/DualChartView.tsx#L1-L2)
|
||
|
||
**章节来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L2-L13)
|
||
- [DualChartView.tsx](file://src/DualChartView.tsx#L1-L2)
|
||
|
||
## 性能考虑
|
||
`CashFlowChart` 组件通过 `React.memo` 和 `React.useMemo` 优化了性能,避免了不必要的重新渲染。Y轴域(yAxisDomain)基于完整时间线数据保持稳定,防止图表跳动。通过 `interpolate` 函数实现了平滑的动画效果。
|
||
|
||
[无来源,因为此部分提供一般性指导]
|
||
|
||
## 故障排除指南
|
||
在使用 `CashFlowChart` 组件时,可能会遇到以下问题:
|
||
- 数据未正确加载:检查 `timeline` 和 `meta` 属性是否正确传递。
|
||
- 动画效果不正常:检查 `externalDataIndex` 和 `externalYearProgress` 属性是否正确设置。
|
||
- 图表跳动:检查 `yAxisDomain` 是否基于完整时间线数据。
|
||
|
||
**章节来源**
|
||
- [CashFlowChart.tsx](file://src/CashFlowChart.tsx#L228-L236)
|
||
- [DualChartView.tsx](file://src/DualChartView.tsx#L34-L39)
|
||
|
||
## 结论
|
||
`CashFlowChart` 组件通过结合堆叠柱状图和折线图,实现了年度收支构成的动态可视化。通过顺序增长动画和插值点技术,增强了用户的交互体验。HUD区域提供了关键的财务指标,帮助用户快速了解财务状况。通过合理的架构设计和性能优化,确保了组件的稳定性和高效性。
|
||
|
||
[无来源,因为此部分总结而不分析特定文件] |