modify:优化
This commit is contained in:
411
Sale/pages/trend/CLAUDE.md
Normal file
411
Sale/pages/trend/CLAUDE.md
Normal file
@@ -0,0 +1,411 @@
|
||||
[根目录](../../CLAUDE.md) > [pages](../) > **trend**
|
||||
|
||||
---
|
||||
|
||||
# pages/trend - 价格趋势页
|
||||
|
||||
> **模块状态**: ✅ 已完成
|
||||
>
|
||||
> **最后更新**: 2026-01-07 09:16:32
|
||||
|
||||
---
|
||||
|
||||
## 变更记录 (Changelog)
|
||||
|
||||
### 2026-01-07 09:16:32
|
||||
- 重新生成模块文档
|
||||
- 补充 ECharts 图表集成说明
|
||||
- 添加数据流与状态管理说明
|
||||
|
||||
### 2026-01-06
|
||||
- 完成价格趋势页面开发
|
||||
- 集成 ECharts 图表组件
|
||||
- 实现多维度筛选功能
|
||||
- 添加统计数据展示
|
||||
|
||||
---
|
||||
|
||||
## 模块职责
|
||||
|
||||
**trend** 是价格趋势分析页面,负责:
|
||||
|
||||
1. **趋势图表展示**:使用 ECharts 绘制价格走势折线图
|
||||
2. **多维度筛选**:支持地区、材质、时间范围的组合查询
|
||||
3. **数据统计**:显示起始价格、最新价格、价格变动
|
||||
4. **可视化交互**:平滑曲线、区域填充、响应式图表
|
||||
|
||||
---
|
||||
|
||||
## 入口与启动
|
||||
|
||||
### 页面路径
|
||||
- **注册路径**:`pages/trend/trend`(在 `app.json` 中注册)
|
||||
- **物理路径**:`pages/trend/trend.js`
|
||||
- **访问方式**:通过 TabBar 导航或页面跳转
|
||||
|
||||
### 页面配置
|
||||
```json
|
||||
{
|
||||
"navigationBarTitleText": "价格趋势",
|
||||
"usingComponents": {
|
||||
"ec-canvas": "../../components/ec-canvas/ec-canvas"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 生命周期
|
||||
```javascript
|
||||
Page({
|
||||
onLoad(options) { }, // 页面加载,初始化图表
|
||||
onReady() { }, // 页面初次渲染完成
|
||||
onShow() { } // 页面显示
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 对外接口
|
||||
|
||||
### 页面跳转接口
|
||||
```javascript
|
||||
// 从价格查询页跳转
|
||||
wx.navigateTo({
|
||||
url: '/pages/trend/trend'
|
||||
})
|
||||
```
|
||||
|
||||
### TabBar 切换
|
||||
```javascript
|
||||
onTabChange(e) {
|
||||
const tabIndex = parseInt(e.detail.value)
|
||||
if (tabIndex === 0) {
|
||||
wx.navigateTo({ url: '/pages/index/index' })
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 关键依赖与配置
|
||||
|
||||
### 依赖文件
|
||||
| 文件 | 用途 |
|
||||
|------|------|
|
||||
| `trend.js` | 页面逻辑(270 行) |
|
||||
| `trend.wxml` | 页面结构 |
|
||||
| `trend.wxss` | 页面样式 |
|
||||
| `trend.json` | 页面配置 |
|
||||
|
||||
### 外部依赖
|
||||
- **API 封装**:`utils/request.js`
|
||||
- **图表组件**:`components/ec-canvas/ec-canvas`
|
||||
- **图表库**:`components/ec-canvas/echarts.js`
|
||||
|
||||
### 配置项
|
||||
```javascript
|
||||
// 地区选项
|
||||
regions: ['全部', '昆明', '玉溪', '楚雄', '大理', ...]
|
||||
|
||||
// 材质选项
|
||||
materials: ['全部', 'HPB300', 'HRB400', 'HRB400E', ...]
|
||||
|
||||
// 时间范围选项
|
||||
dayRanges: [
|
||||
{ label: '最近 7 天', value: 7 },
|
||||
{ label: '最近 15 天', value: 15 },
|
||||
{ label: '最近 30 天', value: 30 },
|
||||
...
|
||||
]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 数据模型
|
||||
|
||||
### 页面数据结构
|
||||
```javascript
|
||||
data: {
|
||||
// 筛选条件
|
||||
regions: [], // 地区选项
|
||||
materials: [], // 材质选项
|
||||
dayRanges: [], // 时间范围选项
|
||||
selectedRegionIndex: 0,
|
||||
selectedMaterialIndex: 0,
|
||||
selectedDayIndex: 2,
|
||||
|
||||
// 状态
|
||||
loading: false, // 加载状态
|
||||
searched: false, // 是否已搜索
|
||||
hasData: false, // 是否有数据
|
||||
|
||||
// 图表实例
|
||||
ec: {
|
||||
onInit: null // 图表初始化函数
|
||||
},
|
||||
|
||||
// 趋势数据
|
||||
trendData: {
|
||||
dates: [], // 日期数组
|
||||
prices: [] // 价格数组
|
||||
},
|
||||
|
||||
// 统计数据
|
||||
startPrice: '-', // 起始价格
|
||||
endPrice: '-', // 最新价格
|
||||
priceChange: '-' // 价格变动
|
||||
}
|
||||
```
|
||||
|
||||
### API 返回数据格式
|
||||
```javascript
|
||||
// GET /api/prices/trend
|
||||
[
|
||||
{ date: '2026-01-01', avgPrice: 3850 },
|
||||
{ date: '2026-01-02', avgPrice: 3860 },
|
||||
...
|
||||
]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 核心功能实现
|
||||
|
||||
### 1. 图表初始化
|
||||
```javascript
|
||||
initChart(canvas, width, height, res) {
|
||||
const chartInstance = echarts.init(canvas)
|
||||
|
||||
const option = {
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: this.data.trendData.dates
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value'
|
||||
},
|
||||
series: [{
|
||||
data: this.data.trendData.prices,
|
||||
type: 'line',
|
||||
smooth: true, // 平滑曲线
|
||||
areaStyle: {} // 区域填充
|
||||
}]
|
||||
}
|
||||
|
||||
chartInstance.setOption(option)
|
||||
return chartInstance
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 趋势查询
|
||||
```javascript
|
||||
async onQuery() {
|
||||
const { region, material, days } = this.getQueryParams()
|
||||
|
||||
this.setData({ loading: true })
|
||||
|
||||
try {
|
||||
const result = await api.getPriceTrend({ region, material, days })
|
||||
|
||||
const dates = result.data.map(item => {
|
||||
const date = new Date(item.date)
|
||||
return `${date.getMonth() + 1}/${date.getDate()}`
|
||||
})
|
||||
const prices = result.data.map(item => item.avgPrice)
|
||||
|
||||
// 计算统计
|
||||
const startPrice = prices[0]
|
||||
const endPrice = prices[prices.length - 1]
|
||||
const priceChange = endPrice - startPrice
|
||||
|
||||
this.setData({
|
||||
trendData: { dates, prices },
|
||||
startPrice,
|
||||
endPrice,
|
||||
priceChange,
|
||||
hasData: true,
|
||||
loading: false
|
||||
})
|
||||
} catch (error) {
|
||||
// 错误处理
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. TabBar 导航
|
||||
```javascript
|
||||
onTabChange(e) {
|
||||
const value = parseInt(e.detail.value)
|
||||
|
||||
if (value === 0) {
|
||||
// 跳转到价格查询页
|
||||
wx.navigateTo({
|
||||
url: '/pages/index/index'
|
||||
})
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## UI 组件结构
|
||||
|
||||
### WXML 结构
|
||||
```xml
|
||||
<view class="container">
|
||||
<!-- 筛选条件区域 -->
|
||||
<view class="filter-section">
|
||||
<!-- 地区选择 -->
|
||||
<!-- 材质选择 -->
|
||||
<!-- 时间范围选择 -->
|
||||
<!-- 查询按钮 -->
|
||||
</view>
|
||||
|
||||
<!-- 图表展示区域 -->
|
||||
<view class="chart-section" wx:if="{{hasData}}">
|
||||
<ec-canvas ec="{{ ec }}"></ec-canvas>
|
||||
|
||||
<!-- 统计摘要 -->
|
||||
<view class="stats-summary">
|
||||
<view class="stat-item">起始价格</view>
|
||||
<view class="stat-item">最新价格</view>
|
||||
<view class="stat-item">价格变动</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 欢迎提示 -->
|
||||
<view class="welcome-section" wx:if="{{!hasData && !loading}}">
|
||||
<!-- 引导文案 -->
|
||||
</view>
|
||||
|
||||
<!-- TabBar -->
|
||||
<t-tab-bar value="1" bindchange="onTabChange">
|
||||
<t-tab-bar-item value="0" label="价格查询" />
|
||||
<t-tab-bar-item value="1" label="价格趋势" />
|
||||
</t-tab-bar>
|
||||
</view>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 测试与质量
|
||||
|
||||
### 测试覆盖
|
||||
- **手动测试**:已在微信开发者工具中验证
|
||||
- **图表渲染**:ECharts 图表正常显示
|
||||
- **数据统计**:价格变动计算正确
|
||||
|
||||
### 测试要点
|
||||
1. **筛选条件**:验证地区、材质、时间范围选择
|
||||
2. **图表渲染**:验证折线图、坐标轴、数据点
|
||||
3. **统计数据**:验证起始价、最新价、变动值
|
||||
4. **空状态**:无数据时提示友好
|
||||
5. **加载状态**:查询中显示加载提示
|
||||
6. **错误处理**:网络异常时提示用户
|
||||
|
||||
### 已知问题
|
||||
- 图表在真机上可能存在性能问题(数据量大时)
|
||||
- 时间范围选择器不支持自定义日期
|
||||
|
||||
---
|
||||
|
||||
## 常见问题 (FAQ)
|
||||
|
||||
### Q: 图表不显示怎么办?
|
||||
|
||||
**A**: 检查以下几点:
|
||||
1. 确保 `ec-canvas` 组件已正确引入
|
||||
2. 检查 `trendData` 数据是否已更新
|
||||
3. 确认图表初始化函数 `initChart` 被正确调用
|
||||
4. 查看控制台是否有错误信息
|
||||
|
||||
### Q: 如何修改图表样式?
|
||||
|
||||
**A**: 编辑 `initChart` 方法中的 `option` 配置:
|
||||
```javascript
|
||||
const option = {
|
||||
xAxis: { ... },
|
||||
yAxis: { ... },
|
||||
series: [{
|
||||
smooth: true, // 平滑曲线
|
||||
lineStyle: {
|
||||
color: '#1890ff', // 线条颜色
|
||||
width: 3 // 线条宽度
|
||||
},
|
||||
areaStyle: {
|
||||
color: 'rgba(24, 144, 255, 0.3)' // 填充颜色
|
||||
}
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
### Q: 如何添加更多的时间范围选项?
|
||||
|
||||
**A**: 编辑 `dayRanges` 数组:
|
||||
```javascript
|
||||
dayRanges: [
|
||||
{ label: '最近 7 天', value: 7 },
|
||||
{ label: '最近 30 天', value: 30 },
|
||||
{ label: '最近 90 天', value: 90 },
|
||||
{ label: '最近 180 天', value: 180 }, // 新增
|
||||
{ label: '最近 365 天', value: 365 } // 新增
|
||||
]
|
||||
```
|
||||
|
||||
### Q: 如何导出图表数据?
|
||||
|
||||
**A**: 添加导出按钮:
|
||||
```javascript
|
||||
onExport() {
|
||||
const { trendData } = this.data
|
||||
const csvContent = this.convertToCSV(trendData)
|
||||
|
||||
wx.showToast({
|
||||
title: '导出功能开发中',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 相关文件清单
|
||||
|
||||
```
|
||||
pages/trend/
|
||||
├── trend.js # 页面逻辑(270 行)
|
||||
├── trend.wxml # 页面结构(128 行)
|
||||
├── trend.wxss # 页面样式
|
||||
├── trend.json # 页面配置
|
||||
└── CLAUDE.md # 本文档
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 下一步建议
|
||||
|
||||
### 功能增强
|
||||
1. **数据交互**
|
||||
- 点击数据点显示详细信息
|
||||
- 十字准星显示数值
|
||||
- 缩放功能查看细节
|
||||
|
||||
2. **图表增强**
|
||||
- 支持多条折线对比
|
||||
- 添加 K 线图
|
||||
- 添加标记点(最高价、最低价)
|
||||
|
||||
3. **数据导出**
|
||||
- 导出图表为图片
|
||||
- 导出数据为 Excel
|
||||
|
||||
### 性能优化
|
||||
1. **虚拟滚动**:大量数据时的性能优化
|
||||
2. **懒加载**:图表按需加载
|
||||
3. **数据缓存**:减少重复请求
|
||||
|
||||
---
|
||||
|
||||
**模块状态**: ✅ 已完成
|
||||
**优先级**: 高(核心功能)
|
||||
**预估工作量**: 已完成
|
||||
**相关模块**: [pages/index](../index/CLAUDE.md) | [components/ec-canvas](../../components/ec-canvas/CLAUDE.md) | [utils/request](../../utils/request.md)
|
||||
Reference in New Issue
Block a user