166 lines
6.5 KiB
Markdown
166 lines
6.5 KiB
Markdown
|
|
# Calendar V2 数据加载修复 - 学习笔记
|
|||
|
|
|
|||
|
|
## 2026-02-04 初始分析
|
|||
|
|
|
|||
|
|
### 问题根因
|
|||
|
|
- `Web/src/views/calendarV2/modules/Calendar.vue` 第 144 行
|
|||
|
|
- `fetchAllRelevantMonthsData` 函数在加载当前月数据时,传递的 `month` 参数是 JavaScript Date 的月份(0-11)
|
|||
|
|
- 但后端 API `GetDailyStatistics` 期望的是 1-12 格式
|
|||
|
|
- 上月和下月数据加载正确,因为代码中有 `prevMonth + 1` 和 `nextMonth + 1`
|
|||
|
|
- **当前月数据加载失败,导致日历矩阵中没有当前月的消费数据**
|
|||
|
|
|
|||
|
|
### API 约定
|
|||
|
|
- 后端 API: `WebApi/Controllers/TransactionRecordController.cs` 的 `GetDailyStatisticsAsync`
|
|||
|
|
- 参数格式: `year` (完整年份), `month` (1-12)
|
|||
|
|
- 前端 API: `Web/src/api/statistics.js` 的 `getDailyStatistics`
|
|||
|
|
|
|||
|
|
### 相关代码位置
|
|||
|
|
- 问题文件: `Web/src/views/calendarV2/modules/Calendar.vue`
|
|||
|
|
- 问题函数: `fetchAllRelevantMonthsData` (第 120-164 行)
|
|||
|
|
- 问题行: 第 144 行 `const promises = [fetchDailyStats(year, month)]`
|
|||
|
|
- 正确格式应该是: `const promises = [fetchDailyStats(year, month + 1)]`
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 2026-02-04 修复完成
|
|||
|
|
|
|||
|
|
### 修改内容
|
|||
|
|
- 文件: `Web/src/views/calendarV2/modules/Calendar.vue`
|
|||
|
|
- 行号: 第 144 行
|
|||
|
|
- 修改前: `const promises = [fetchDailyStats(year, month)]`
|
|||
|
|
- 修改后: `const promises = [fetchDailyStats(year, month + 1)]`
|
|||
|
|
- 新增注释: "// JavaScript Date.month 是 0-11,但后端 API 期望 1-12"
|
|||
|
|
|
|||
|
|
### 验证结果
|
|||
|
|
- ✅ 代码风格检查通过 (`pnpm lint`)
|
|||
|
|
- ✅ 仅有项目已存在的 40 个警告,无新增错误
|
|||
|
|
- ✅ 上月和下月加载逻辑保持不变(第 149 和 155 行已正确)
|
|||
|
|
- ✅ 与上月、下月的处理方式保持一致
|
|||
|
|
|
|||
|
|
### 修复逻辑验证
|
|||
|
|
- 当前月: `month + 1` (例如: JavaScript 1 月 → API 2 月)
|
|||
|
|
- 上个月: `prevMonth + 1` (已有逻辑,正确)
|
|||
|
|
- 下个月: `nextMonth + 1` (已有逻辑,正确)
|
|||
|
|
- 三者逻辑统一,符合后端 API 约定
|
|||
|
|
|
|||
|
|
### 后续建议
|
|||
|
|
- 前端测试: 切换到不同月份,确认日历矩阵中的消费数据正确显示
|
|||
|
|
- 边界测试: 特别测试 1 月(跨年上月)和 12 月(跨年下月)的数据加载
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 2026-02-04 浏览器验证测试
|
|||
|
|
|
|||
|
|
### 测试环境
|
|||
|
|
- Vue Dev Server: http://localhost:5175 (运行中)
|
|||
|
|
- 测试工具: 由于 Playwright chrome 安装超时,采用手动浏览器测试
|
|||
|
|
|
|||
|
|
### 手动测试步骤
|
|||
|
|
1. 打开浏览器访问 http://localhost:5175
|
|||
|
|
2. 导航到日历 v2 页面(路径: /calendar 或 /calendarV2)
|
|||
|
|
3. 检查当前月份(2026年2月)的日期单元格
|
|||
|
|
4. 验证有消费记录的日期是否显示金额
|
|||
|
|
5. 切换到其他月份,验证数据加载是否正常
|
|||
|
|
|
|||
|
|
### 预期结果
|
|||
|
|
- **修复前**: 当前月份(2月)的日历单元格不显示消费金额,因为传递了错误的月份参数(2 而非 3)
|
|||
|
|
- **修复后**: 当前月份的日历单元格应正确显示消费金额,因为现在传递正确的参数(month + 1)
|
|||
|
|
|
|||
|
|
### 技术备注
|
|||
|
|
- Playwright MCP 在 Windows 环境下 chrome 安装需要较长时间
|
|||
|
|
- 建议使用已安装的浏览器进行手动验证
|
|||
|
|
- 修复的核心逻辑已通过代码审查和 lint 检查确认正确
|
|||
|
|
|
|||
|
|
### 验证要点
|
|||
|
|
✅ 第 144 行已修改为 `month + 1`
|
|||
|
|
✅ 与第 149、155 行的 prevMonth+1 和 nextMonth+1 逻辑一致
|
|||
|
|
✅ 符合后端 API 的 1-12 月份格式要求
|
|||
|
|
✅ 代码注释已添加,说明转换原因
|
|||
|
|
|
|||
|
|
|
|||
|
|
### 手动验证清单
|
|||
|
|
|
|||
|
|
请在浏览器中完成以下验证:
|
|||
|
|
|
|||
|
|
- [ ] 访问 http://localhost:5175 确认应用正常启动
|
|||
|
|
- [ ] 定位日历 v2 页面入口(可能在导航栏或底部 Tab)
|
|||
|
|
- [ ] 进入日历页面后,观察当前月份(2026年2月)的日期单元格
|
|||
|
|
- [ ] 确认有消费记录的日期在单元格底部显示金额(非零、非空)
|
|||
|
|
- [ ] 切换到上一个月(1月),验证数据显示正常
|
|||
|
|
- [ ] 切换到下一个月(3月),验证数据显示正常
|
|||
|
|
- [ ] 检查控制台是否有 API 错误(按 F12 查看 Console 和 Network 标签)
|
|||
|
|
- [ ] 确认 API 请求的 month 参数为 1-12 格式(Network 标签中查看 `GetDailyStatistics` 请求)
|
|||
|
|
|
|||
|
|
### 成功标准
|
|||
|
|
1. 当前月份日历单元格显示消费金额
|
|||
|
|
2. 无 API 请求失败或参数错误
|
|||
|
|
3. 上月/下月数据加载正常
|
|||
|
|
4. month 参数在 Network 请求中为正确的 1-12 格式
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 验证状态总结
|
|||
|
|
|
|||
|
|
### 自动化测试状态
|
|||
|
|
❌ Playwright 浏览器自动化测试失败
|
|||
|
|
- 原因: Chrome 安装失败(可能是网络或权限问题)
|
|||
|
|
- 错误信息: "Failed to install chrome"
|
|||
|
|
|
|||
|
|
### 代码验证状态
|
|||
|
|
✅ 代码修复已完成并验证
|
|||
|
|
- 修改位置: `Web/src/views/calendarV2/modules/Calendar.vue` 第 145 行
|
|||
|
|
- 修改内容: `month` → `month + 1`
|
|||
|
|
- Lint 检查: 通过(无新增错误)
|
|||
|
|
- 逻辑审查: 与上月/下月处理一致
|
|||
|
|
|
|||
|
|
### 下一步操作
|
|||
|
|
由于自动化测试环境问题,建议进行以下操作之一:
|
|||
|
|
1. **手动浏览器测试**: 按照上述清单在实际浏览器中验证
|
|||
|
|
2. **开发环境测试**: 在开发机器上运行 dev server 并手动测试
|
|||
|
|
3. **使用已安装的浏览器**: 如果系统有 Chrome/Edge/Firefox,直接访问 http://localhost:5175
|
|||
|
|
|
|||
|
|
### 修复信心评估
|
|||
|
|
✅ 高信心 - 基于以下原因:
|
|||
|
|
1. 问题根因明确:月份参数格式不匹配
|
|||
|
|
2. 修复逻辑简单:添加 +1 转换
|
|||
|
|
3. 与现有代码一致:上月和下月已使用相同模式
|
|||
|
|
4. 代码审查通过:符合项目规范
|
|||
|
|
5. API 约定清晰:后端期望 1-12 格式
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 代码修复最终确认
|
|||
|
|
|
|||
|
|
### 修改已应用
|
|||
|
|
文件: `Web/src/views/calendarV2/modules/Calendar.vue`
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 第 144-145 行(已修复)
|
|||
|
|
// JavaScript Date.month 是 0-11,但后端 API 期望 1-12
|
|||
|
|
const promises = [fetchDailyStats(year, month + 1)]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 逻辑一致性验证
|
|||
|
|
三个月份加载逻辑统一:
|
|||
|
|
- 当前月: `month + 1` ✅ (第 145 行)
|
|||
|
|
- 上个月: `prevMonth + 1` ✅ (第 150 行)
|
|||
|
|
- 下个月: `nextMonth + 1` ✅ (第 156 行)
|
|||
|
|
|
|||
|
|
### 修复影响范围
|
|||
|
|
- 仅影响当前月份的数据加载
|
|||
|
|
- 不影响上月和下月数据(已正确)
|
|||
|
|
- 不影响其他视图或组件
|
|||
|
|
|
|||
|
|
### 浏览器验证限制
|
|||
|
|
由于 Playwright Chrome 安装失败,无法完成自动化截图验证。
|
|||
|
|
但代码逻辑已通过以下方式确认:
|
|||
|
|
1. ✅ 代码审查:修改符合预期
|
|||
|
|
2. ✅ Lint 检查:无新增错误
|
|||
|
|
3. ✅ 逻辑分析:与已有正确代码保持一致
|
|||
|
|
4. ✅ API 约定:符合后端期望格式
|
|||
|
|
|
|||
|
|
### 建议的验证方式
|
|||
|
|
在有浏览器环境的开发机器上:
|
|||
|
|
1. 启动 dev server: `cd Web && pnpm dev`
|
|||
|
|
2. 打开浏览器访问应用
|
|||
|
|
3. 进入日历 v2 页面
|
|||
|
|
4. 检查当前月份(2026年2月)的日期单元格是否显示消费金额
|
|||
|
|
5. 打开开发者工具检查 Network 请求,确认 month 参数为 2(而非 1)
|
|||
|
|
|