# 项目开发历史记录
## 一、项目概述
本项目是一个牦牛产业数据可视化平台,采用 Vue.js 框架开发,包含多个功能模块:交易流向监测、市场环境监测、多维度市场分析、牦牛供应展示等。平台集成了 Element UI 组件库和 ECharts 数据可视化库,实现了响应式布局和交互式数据展示功能。
**技术栈:**
- 前端框架:Vue.js 3.x(Composition API)
- UI 组件库:Element Plus
- 图表库:ECharts
- 地图数据:GeoJSON(china.json)
- 样式方案:CSS Scoped + CSS Flexbox/Grid
- 构建工具:Vite
---
## 二、组件架构演变
### 2.1 初始阶段:单文件 App.vue
项目最初是一个单文件的 `App.vue`,包含了所有的业务逻辑和 UI 代码。随着功能增加,代码变得臃肿,难以维护。
### 2.2 组件拆分阶段
按照单一职责原则,将 monolithic App.vue 拆分为以下独立组件:
```
src/components/
├── AppHeader.vue # 顶部导航栏
├── TransactionStats.vue # 实时交易统计
├── SalesChart.vue # 销售趋势图表
├── YakPopulationChart.vue # 牦牛存栏图表
├── FlowMonitorMap.vue # 交易流向地图
├── SceneManagement.vue # 场景管理(监控+环境)
└── MarketAnalysis.vue # 多维度市场分析
```
---
## 三、主题风格演变
### 3.1 初始深绿色主题
最初尝试使用偏绿色的深色风格,模拟草原风格:
```css
--primary-color: #22c55e;
--primary-dark: #15803d;
--background-dark: #0f172a;
--card-dark: #1e293b;
```
### 3.2 朴素灰色白色主题
用户反馈绿色不太合适,要求改回朴实一点的深色主题:
```css
--background-color: #f8fafc;
--card-background: #ffffff;
--text-primary: #1e293b;
--text-secondary: #64748b;
--border-color: #e2e8f0;
--primary-color: #22c55e; /* 保留绿色作为强调色 */
```
### 3.3 顶部导航栏样式
将顶部导航栏从白色改为深蓝色,增强视觉层次:
```css
.app-header {
background: linear-gradient(135deg, #1e40af 0%, #3b82f6 100%);
color: white;
}
```
---
## 四、核心功能模块实现
### 4.1 场景管理组件(SceneManagement.vue)
场景管理组件是平台的核心模块之一,负责展示监控视频和环境监测数据。
**布局演变:**
1. **初始布局**:简单的垂直排列
2. **卡片式布局**:引入 Element UI 的 el-card 组件
3. **双栏布局**:左侧展示环境指标,右侧展示监控视频
**最终布局结构:**
```html
```
**环境监测状态样式:**
```css
.env-card.normal {
background: #ffffff;
border: 1px solid #e2e8f0;
}
.env-card.warning {
background: #fef2f2;
border: 1px solid #fecaca;
}
.env-card.critical {
background: #fef2f2;
border: 1px solid #ef4444;
}
```
### 4.2 交易流向监测组件(FlowMonitorMap.vue)
使用 ECharts 实现地理数据可视化,展示牦牛销售网络、源地供应和红原出栏分布。
**实现方案:**
```javascript
```
### 4.3 多维度市场分析组件(MarketAnalysis.vue)
包含三个分析维度:销售结构分析、价格趋势分析、客户来源分析。
**布局结构:**
```html
```
---
## 五、数据架构演变
### 5.1 初始阶段:组件内嵌 mock 数据
各组件内部定义模拟数据,导致数据冗余和重复请求。
```javascript
const mockData = {
salesByPriceRange: [...],
priceTrend: [...],
// ...
};
```
### 5.2 JSON 文件阶段
将 mock 数据移到静态 JSON 文件:
```json
{
"marketAnalysis": {
"salesByPriceRange": [...],
"salesByRegion": [...],
"priceTrend": [...],
"customerSource": [...]
}
}
```
### 5.3 共享数据架构阶段(最终方案)
在 App.vue 中集中获取数据,通过 props 传递给子组件:
```javascript
// App.vue
```
**优势:**
- 减少网络请求次数(只请求一次)
- 保证数据一致性
- 便于数据管理和维护
---
## 六、关键文件结构
```
zhhxjy/
├── public/
│ └── data/
│ ├── mockData.json # 共享模拟数据
│ └── china.json # 中国地图地理数据
├── src/
│ ├── components/
│ │ ├── AppHeader.vue # 顶部导航
│ │ ├── TransactionStats.vue
│ │ ├── SalesChart.vue
│ │ ├── YakPopulationChart.vue
│ │ ├── FlowMonitorMap.vue # 交易流向地图
│ │ ├── SceneManagement.vue # 场景管理
│ │ └── MarketAnalysis.vue # 市场分析
│ ├── App.vue # 主应用组件
│ ├── main.js # 应用入口
│ └── style.css # 全局样式
├── index.html
├── package.json
└── vite.config.js
```
---
## 七、遇到的问题及解决方案
### 7.1 地图数据加载失败
**问题**:从外部 URL 下载地图数据失败(404 错误)
**解决方案**:
- 使用本地 china.json 文件
- 放置在 public/data/ 目录下
- 通过 `/data/china.json` 路径访问
### 7.2 视频容器高度不匹配
**问题**:增加视频宽度后,容器高度计算错误,导致内容溢出或留白
**解决方案**:
```css
.video-wrapper {
height: 100%;
display: flex;
flex-direction: column;
}
.video-content {
flex: 1;
height: 100%;
}
.video-info-main {
flex: 1;
display: flex;
flex-direction: column;
}
```
### 7.3 右侧导航按钮消失
**问题**:视频宽度增加后,右侧切换按钮被隐藏
**解决方案**:
```css
.monitor-right {
width: 800px; /* 增加容器宽度 */
}
.video-content {
width: 320px; /* 固定视频宽度 */
}
```
### 7.4 预警颜色不一致
**问题**:环境监测的预警状态使用了黄色主题,与整体风格不符
**解决方案**:
```css
.env-card.warning {
background: #fef2f2;
border: 1px solid #fecaca;
}
.env-card.critical {
background: #fef2f2;
border: 1px solid #ef4444;
}
.warning-badge {
background: #ef4444;
color: white;
}
```
### 7.5 Mock 数据位置错误
**问题**:mockData.json 放在 src/data 目录,无法通过 HTTP 请求访问
**解决方案**:
- 创建 public/data/ 目录
- 将 mockData.json 移动到新目录
- 通过 `/data/mockData.json` 路径访问
---
## 八、开发里程碑
### 里程碑 1:组件拆分
- 完成 App.vue 到独立组件的拆分
- 建立规范的目录结构
### 里程碑 2:主题定制
- 实现灰色白色主题
- 保留绿色作为强调色
- 优化顶部导航栏样式
### 里程碑 3:布局优化
- 实现卡片式布局
- 优化监控视频布局
- 修复各种溢出和高度问题
### 里程碑 4:数据架构
- 实现共享数据获取
- 减少冗余请求
- 统一数据管理
### 里程碑 5:地图集成
- 实现本地地图数据加载
- 完成交易流向可视化
- 添加交互控制功能
---
## 九、后续优化建议
1. **性能优化**:对 ECharts 图表实现懒加载
2. **响应式设计**:增加移动端适配
3. **数据可视化**:添加更多交互功能(缩放、筛选、导出)
4. **错误处理**:增加请求失败的重试机制和错误提示
5. **代码规范**:添加 TypeScript 类型支持
6. **测试覆盖**:增加单元测试和 E2E 测试
---
## 十、技术要点总结
| 功能 | 技术方案 | 关键代码 |
|------|----------|----------|
| 组件通信 | Props + Events | `defineProps()`, `defineEmits()` |
| 状态管理 | Ref + Watch | `ref()`, `watch()` |
| 图表渲染 | ECharts | `echarts.init()`, `chart.setOption()` |
| 地图渲染 | ECharts Geo | `registerMap()`, `geo` 配置 |
| 卡片布局 | Element UI | `el-card`, `el-row`, `el-col` |
| 数据获取 | Fetch API | `fetch('/data/xxx.json')` |
| 样式隔离 | Scoped CSS | `