323 lines
16 KiB
Markdown
323 lines
16 KiB
Markdown
# 数据可视化
|
||
|
||
<cite>
|
||
**本文档引用的文件**
|
||
- [frontend/components/charts/trend-chart.tsx](file://frontend/components/charts/trend-chart.tsx)
|
||
- [frontend/components/charts/platform-chart.tsx](file://frontend/components/charts/platform-chart.tsx)
|
||
- [frontend/lib/platforms.ts](file://frontend/lib/platforms.ts)
|
||
- [frontend/lib/api.ts](file://frontend/lib/api.ts)
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx](file://frontend/app/(dashboard)/dashboard/page.tsx)
|
||
- [frontend/app/(dashboard)/dashboard/citations/page.tsx](file://frontend/app/(dashboard)/dashboard/citations/page.tsx)
|
||
- [frontend/app/(dashboard)/dashboard/queries/page.tsx](file://frontend/app/(dashboard)/dashboard/queries/page.tsx)
|
||
- [frontend/app/(dashboard)/dashboard/reports/page.tsx](file://frontend/app/(dashboard)/dashboard/reports/page.tsx)
|
||
- [frontend/tailwind.config.ts](file://frontend/tailwind.config.ts)
|
||
- [frontend/components/providers.tsx](file://frontend/components/providers.tsx)
|
||
- [frontend/app/layout.tsx](file://frontend/app/layout.tsx)
|
||
- [frontend/package.json](file://frontend/package.json)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [引言](#引言)
|
||
2. [项目结构](#项目结构)
|
||
3. [核心组件](#核心组件)
|
||
4. [架构总览](#架构总览)
|
||
5. [详细组件分析](#详细组件分析)
|
||
6. [依赖分析](#依赖分析)
|
||
7. [性能考虑](#性能考虑)
|
||
8. [故障排查指南](#故障排查指南)
|
||
9. [结论](#结论)
|
||
10. [附录](#附录)
|
||
|
||
## 引言
|
||
本文件系统性阐述基于 Recharts 的数据可视化实现,聚焦两类图表组件:趋势图表与平台对比图表。内容涵盖数据绑定机制、数据格式与配置选项、交互与动画、响应式适配、主题定制与样式、可访问性支持、使用示例、性能优化与调试方法。读者无需深入前端技术背景即可理解图表的设计思路与使用方式。
|
||
|
||
## 项目结构
|
||
前端采用 Next.js 应用程序目录结构,图表组件位于 components/charts 下,分别负责趋势与平台对比展示;统计数据由页面通过 API 获取并传递给图表组件;Tailwind CSS 提供主题变量与样式扩展;Radix UI 组件与 Lucide 图标增强交互体验。
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "应用层"
|
||
Dashboard["仪表板页面<br/>dashboard/page.tsx"]
|
||
Citations["引用记录页面<br/>citations/page.tsx"]
|
||
Queries["查询词页面<br/>queries/page.tsx"]
|
||
Reports["报告导出页面<br/>reports/page.tsx"]
|
||
end
|
||
subgraph "图表组件"
|
||
Trend["趋势图表<br/>trend-chart.tsx"]
|
||
Platform["平台对比图表<br/>platform-chart.tsx"]
|
||
end
|
||
subgraph "数据与工具"
|
||
API["API 客户端<br/>lib/api.ts"]
|
||
Platforms["平台映射<br/>lib/platforms.ts"]
|
||
end
|
||
subgraph "样式与主题"
|
||
Tailwind["Tailwind 配置<br/>tailwind.config.ts"]
|
||
Providers["会话提供者<br/>components/providers.tsx"]
|
||
Layout["根布局<br/>app/layout.tsx"]
|
||
end
|
||
Dashboard --> Trend
|
||
Dashboard --> Platform
|
||
Trend --> API
|
||
Platform --> API
|
||
Platform --> Platforms
|
||
API --> Layout
|
||
Providers --> Layout
|
||
Tailwind --> Layout
|
||
```
|
||
|
||
**图示来源**
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx](file://frontend/app/(dashboard)/dashboard/page.tsx)
|
||
- [frontend/components/charts/trend-chart.tsx](file://frontend/components/charts/trend-chart.tsx)
|
||
- [frontend/components/charts/platform-chart.tsx](file://frontend/components/charts/platform-chart.tsx)
|
||
- [frontend/lib/api.ts](file://frontend/lib/api.ts)
|
||
- [frontend/lib/platforms.ts](file://frontend/lib/platforms.ts)
|
||
- [frontend/tailwind.config.ts](file://frontend/tailwind.config.ts)
|
||
- [frontend/components/providers.tsx](file://frontend/components/providers.tsx)
|
||
- [frontend/app/layout.tsx](file://frontend/app/layout.tsx)
|
||
|
||
**章节来源**
|
||
- [frontend/package.json:25](file://frontend/package.json#L25)
|
||
- [frontend/tailwind.config.ts:10-52](file://frontend/tailwind.config.ts#L10-L52)
|
||
- [frontend/components/providers.tsx:6-8](file://frontend/components/providers.tsx#L6-L8)
|
||
- [frontend/app/layout.tsx:22-36](file://frontend/app/layout.tsx#L22-L36)
|
||
|
||
## 核心组件
|
||
- 趋势图表(TrendChart)
|
||
- 功能:以折线图展示随时间变化的引用次数趋势。
|
||
- 数据格式:数组对象,包含日期与引用次数字段。
|
||
- 关键特性:网格、坐标轴、提示框、响应式容器、单调曲线、点标记与高亮点。
|
||
- 平台对比图表(PlatformChart)
|
||
- 功能:以柱状图展示不同平台的引用率(百分比)对比。
|
||
- 数据格式:对象映射,键为平台标识,值包含查询数、引用数、引用率等统计。
|
||
- 关键特性:网格、坐标轴、提示框、响应式容器、颜色映射、柱状圆角、单元格填充。
|
||
|
||
**章节来源**
|
||
- [frontend/components/charts/trend-chart.tsx:13-20](file://frontend/components/charts/trend-chart.tsx#L13-L20)
|
||
- [frontend/components/charts/trend-chart.tsx:22-59](file://frontend/components/charts/trend-chart.tsx#L22-L59)
|
||
- [frontend/components/charts/platform-chart.tsx:15-23](file://frontend/components/charts/platform-chart.tsx#L15-L23)
|
||
- [frontend/components/charts/platform-chart.tsx:34-67](file://frontend/components/charts/platform-chart.tsx#L34-L67)
|
||
|
||
## 架构总览
|
||
图表组件通过页面从 API 获取统计数据,再以 props 形式注入图表。图表内部使用 Recharts 组合子组件完成渲染与交互。主题与样式通过 Tailwind CSS 的 CSS 变量与类名实现深浅色模式适配。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Page as "仪表板页面"
|
||
participant API as "API 客户端"
|
||
participant Chart as "图表组件"
|
||
participant Recharts as "Recharts 组件"
|
||
Page->>API : 请求统计数据
|
||
API-->>Page : 返回统计数据
|
||
Page->>Chart : 传入数据 props
|
||
Chart->>Recharts : 渲染图表组合子
|
||
Recharts-->>Chart : 呈现图形与交互
|
||
Chart-->>Page : 展示结果
|
||
```
|
||
|
||
**图示来源**
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx:128](file://frontend/app/(dashboard)/dashboard/page.tsx#L128)
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx:143](file://frontend/app/(dashboard)/dashboard/page.tsx#L143)
|
||
- [frontend/lib/api.ts:47-49](file://frontend/lib/api.ts#L47-L49)
|
||
- [frontend/components/charts/trend-chart.tsx:22-59](file://frontend/components/charts/trend-chart.tsx#L22-L59)
|
||
- [frontend/components/charts/platform-chart.tsx:34-67](file://frontend/components/charts/platform-chart.tsx#L34-L67)
|
||
|
||
## 详细组件分析
|
||
|
||
### 趋势图表(TrendChart)
|
||
- 数据绑定
|
||
- 接收数据数组,每个元素包含日期与引用次数字段。
|
||
- X 轴使用日期字符串作为数据键,并在渲染时格式化为“月/日”。
|
||
- Y 轴禁止小数,确保引用次数为整数。
|
||
- 交互与提示
|
||
- 提示框使用卡片主题色与边框,标签格式化为“年-月-日”,数值格式化为“引用次数: 数值”。
|
||
- 动画与视觉
|
||
- 折线类型为单调曲线,线条宽度与点标记半径较小,高亮点更大以便聚焦。
|
||
- 网格为虚线,颜色来自语义化类名。
|
||
- 响应式适配
|
||
- 使用响应式容器,宽度 100%,高度固定像素,自动适配父容器尺寸。
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start(["组件接收数据"]) --> Render["渲染 LineChart"]
|
||
Render --> Grid["绘制网格"]
|
||
Render --> XAxis["配置 X 轴日期"]
|
||
Render --> YAxis["配置 Y 轴整数"]
|
||
Render --> Tooltip["配置提示框卡片样式"]
|
||
Render --> Line["绘制折线单调曲线"]
|
||
Line --> End(["完成渲染"])
|
||
```
|
||
|
||
**图示来源**
|
||
- [frontend/components/charts/trend-chart.tsx:22-59](file://frontend/components/charts/trend-chart.tsx#L22-L59)
|
||
|
||
**章节来源**
|
||
- [frontend/components/charts/trend-chart.tsx:13-20](file://frontend/components/charts/trend-chart.tsx#L13-L20)
|
||
- [frontend/components/charts/trend-chart.tsx:22-59](file://frontend/components/charts/trend-chart.tsx#L22-L59)
|
||
|
||
### 平台对比图表(PlatformChart)
|
||
- 数据绑定
|
||
- 输入为平台统计对象映射,组件内部将其转换为包含平台标签与引用率的数组。
|
||
- 平台标签通过平台映射表进行本地化。
|
||
- 交互与提示
|
||
- 提示框格式化为“引用率: 数值%”。
|
||
- 视觉与样式
|
||
- Y 轴范围固定为 0–100,刻度格式化为百分比。
|
||
- 柱状图圆角,颜色按预设调色板循环填充。
|
||
- 响应式适配
|
||
- 同样使用响应式容器,保证在不同屏幕尺寸下保持一致的视觉比例。
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start(["接收平台统计对象"]) --> Map["遍历对象生成数组"]
|
||
Map --> Localize["平台标签本地化"]
|
||
Localize --> Render["渲染 BarChart"]
|
||
Render --> Grid["绘制网格"]
|
||
Render --> XAxis["配置 X 轴平台标签"]
|
||
Render --> YAxis["配置 Y 轴0-100%"]
|
||
Render --> Tooltip["配置提示框百分比"]
|
||
Render --> Bars["绘制柱状条带颜色"]
|
||
Bars --> End(["完成渲染"])
|
||
```
|
||
|
||
**图示来源**
|
||
- [frontend/components/charts/platform-chart.tsx:34-67](file://frontend/components/charts/platform-chart.tsx#L34-L67)
|
||
- [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18)
|
||
|
||
**章节来源**
|
||
- [frontend/components/charts/platform-chart.tsx:15-23](file://frontend/components/charts/platform-chart.tsx#L15-L23)
|
||
- [frontend/components/charts/platform-chart.tsx:34-67](file://frontend/components/charts/platform-chart.tsx#L34-L67)
|
||
- [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18)
|
||
|
||
### 数据预处理与格式转换
|
||
- 平台对比图表的数据转换
|
||
- 将输入对象映射转换为数组,计算引用率并四舍五入为整数百分比。
|
||
- 使用平台映射表将平台键转换为中文标签。
|
||
- 日期格式化
|
||
- 趋势图表在 X 轴渲染时将日期字符串格式化为“月/日”,在提示框标签中格式化为“年-月-日”。
|
||
|
||
**章节来源**
|
||
- [frontend/components/charts/platform-chart.tsx:35-39](file://frontend/components/charts/platform-chart.tsx#L35-L39)
|
||
- [frontend/lib/platforms.ts:1-8](file://frontend/lib/platforms.ts#L1-L8)
|
||
- [frontend/components/charts/trend-chart.tsx:30-46](file://frontend/components/charts/trend-chart.tsx#L30-L46)
|
||
|
||
### 实时更新机制
|
||
- 页面通过 API 客户端拉取最新统计数据,图表组件接收新数据后自动重新渲染。
|
||
- 仪表板页面在挂载时发起数据请求,图表组件在接收到 props 更新后即时反映。
|
||
|
||
**章节来源**
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx:128](file://frontend/app/(dashboard)/dashboard/page.tsx#L128)
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx:143](file://frontend/app/(dashboard)/dashboard/page.tsx#L143)
|
||
- [frontend/lib/api.ts:47-49](file://frontend/lib/api.ts#L47-L49)
|
||
|
||
### 主题定制与样式配置
|
||
- Tailwind CSS 扩展
|
||
- 定义了语义化颜色变量与圆角变量,图表中的网格与提示框颜色直接引用这些变量,实现深浅色模式一致性。
|
||
- 类名与内联样式结合
|
||
- 网格与提示框使用类名与内联样式混合,确保在不同主题下具备合适的对比度与可读性。
|
||
- 响应式容器
|
||
- 图表统一使用响应式容器,保证在移动端与桌面端均能良好显示。
|
||
|
||
**章节来源**
|
||
- [frontend/tailwind.config.ts:10-52](file://frontend/tailwind.config.ts#L10-L52)
|
||
- [frontend/components/charts/trend-chart.tsx:26-41](file://frontend/components/charts/trend-chart.tsx#L26-L41)
|
||
- [frontend/components/charts/platform-chart.tsx:44-56](file://frontend/components/charts/platform-chart.tsx#L44-L56)
|
||
|
||
### 可访问性支持
|
||
- 文本标签与格式化
|
||
- 提示框标签与坐标轴刻度均采用人类可读的日期与百分比格式,提升信息可理解性。
|
||
- 颜色与对比度
|
||
- 使用 Tailwind 语义化颜色变量,确保在深浅主题下具备足够对比度。
|
||
- 交互反馈
|
||
- 图表点标记与高亮点提供视觉反馈,便于用户定位数据点。
|
||
|
||
**章节来源**
|
||
- [frontend/components/charts/trend-chart.tsx:30-46](file://frontend/components/charts/trend-chart.tsx#L30-L46)
|
||
- [frontend/components/charts/platform-chart.tsx:48-57](file://frontend/components/charts/platform-chart.tsx#L48-L57)
|
||
- [frontend/tailwind.config.ts:12-46](file://frontend/tailwind.config.ts#L12-L46)
|
||
|
||
### 使用示例
|
||
- 在仪表板页面中引入并使用两个图表组件,分别传入趋势数据与平台统计数据。
|
||
- 页面通过 API 客户端获取数据,然后将数据作为 props 传递给图表组件。
|
||
|
||
**章节来源**
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx:5](file://frontend/app/(dashboard)/dashboard/page.tsx#L5)
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx:128](file://frontend/app/(dashboard)/dashboard/page.tsx#L128)
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx:143](file://frontend/app/(dashboard)/dashboard/page.tsx#L143)
|
||
|
||
## 依赖分析
|
||
- Recharts 版本
|
||
- 项目使用较新版本的 Recharts,具备良好的性能与丰富的交互能力。
|
||
- 样式与主题
|
||
- Tailwind CSS 提供主题变量,图表组件通过类名与 CSS 变量实现主题一致性。
|
||
- 会话与认证
|
||
- 通过会话提供者与 API 客户端配合,确保图表数据请求携带认证头。
|
||
|
||
```mermaid
|
||
graph LR
|
||
Package["package.json 依赖"] --> Recharts["recharts"]
|
||
Package --> Tailwind["tailwindcss"]
|
||
Tailwind --> Charts["图表组件样式"]
|
||
Providers["providers.tsx"] --> API["api.ts"]
|
||
API --> Charts
|
||
```
|
||
|
||
**图示来源**
|
||
- [frontend/package.json:25](file://frontend/package.json#L25)
|
||
- [frontend/tailwind.config.ts:10-52](file://frontend/tailwind.config.ts#L10-L52)
|
||
- [frontend/components/providers.tsx:6-8](file://frontend/components/providers.tsx#L6-L8)
|
||
- [frontend/lib/api.ts:1-21](file://frontend/lib/api.ts#L1-L21)
|
||
|
||
**章节来源**
|
||
- [frontend/package.json:11-27](file://frontend/package.json#L11-L27)
|
||
- [frontend/tailwind.config.ts:10-52](file://frontend/tailwind.config.ts#L10-L52)
|
||
- [frontend/components/providers.tsx:6-8](file://frontend/components/providers.tsx#L6-L8)
|
||
- [frontend/lib/api.ts:1-21](file://frontend/lib/api.ts#L1-L21)
|
||
|
||
## 性能考虑
|
||
- 数据规模控制
|
||
- 趋势图表建议限制历史天数,避免过多点导致渲染卡顿。
|
||
- 渲染优化
|
||
- 使用响应式容器与固定高度,减少重排与重绘。
|
||
- 折线与点标记半径较小,降低 SVG 渲染负担。
|
||
- 网络与缓存
|
||
- API 请求应合理设置缓存策略,避免频繁重复请求。
|
||
- 主题切换
|
||
- Tailwind CSS 变量在主题切换时无需重绘图表,提升切换流畅度。
|
||
|
||
[本节为通用指导,不直接分析具体文件]
|
||
|
||
## 故障排查指南
|
||
- 图表不显示或空白
|
||
- 检查传入数据是否为空或格式不符;确认页面已正确获取并传递数据。
|
||
- 日期显示异常
|
||
- 确认日期字符串格式与解析逻辑一致;检查提示框标签格式化函数。
|
||
- 百分比显示异常
|
||
- 确认数据转换逻辑是否将引用率乘以 100 并四舍五入为整数。
|
||
- 主题颜色不生效
|
||
- 检查 Tailwind CSS 变量定义与类名引用是否正确。
|
||
- 认证失败导致数据为空
|
||
- 确认会话提供者与 API 客户端的认证头设置。
|
||
|
||
**章节来源**
|
||
- [frontend/components/charts/trend-chart.tsx:30-46](file://frontend/components/charts/trend-chart.tsx#L30-L46)
|
||
- [frontend/components/charts/platform-chart.tsx:37-39](file://frontend/components/charts/platform-chart.tsx#L37-L39)
|
||
- [frontend/tailwind.config.ts:12-46](file://frontend/tailwind.config.ts#L12-L46)
|
||
- [frontend/lib/api.ts:12-14](file://frontend/lib/api.ts#L12-L14)
|
||
|
||
## 结论
|
||
本项目通过简洁的图表组件与清晰的数据绑定机制,实现了趋势与平台对比两类核心可视化需求。借助 Recharts 的强大能力与 Tailwind CSS 的主题体系,图表在交互、动画、响应式与可访问性方面均达到良好水平。后续可在数据规模控制、缓存策略与主题扩展方面进一步优化。
|
||
|
||
[本节为总结性内容,不直接分析具体文件]
|
||
|
||
## 附录
|
||
- API 客户端方法
|
||
- 查询词列表、引用记录列表、引用统计、报告导出等接口。
|
||
- 页面职责
|
||
- 仪表板页面负责聚合趋势与平台图表;引用记录与查询词页面负责数据筛选与管理;报告导出页面负责报表下载。
|
||
|
||
**章节来源**
|
||
- [frontend/lib/api.ts:23-57](file://frontend/lib/api.ts#L23-L57)
|
||
- [frontend/app/(dashboard)/dashboard/page.tsx:128-143](file://frontend/app/(dashboard)/dashboard/page.tsx#L128-L143)
|
||
- [frontend/app/(dashboard)/dashboard/citations/page.tsx:73-94](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L73-L94)
|
||
- [frontend/app/(dashboard)/dashboard/queries/page.tsx:102-113](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L102-L113)
|
||
- [frontend/app/(dashboard)/dashboard/reports/page.tsx:49-93](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L49-L93) |