All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 20s
Docker Build & Deploy / Deploy to Production (push) Successful in 8s
Docker Build & Deploy / Cleanup Dangling Images (push) Successful in 1s
Docker Build & Deploy / WeChat Notification (push) Successful in 1s
6.5 KiB
6.5 KiB
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 安装超时,采用手动浏览器测试
手动测试步骤
- 打开浏览器访问 http://localhost:5175
- 导航到日历 v2 页面(路径: /calendar 或 /calendarV2)
- 检查当前月份(2026年2月)的日期单元格
- 验证有消费记录的日期是否显示金额
- 切换到其他月份,验证数据加载是否正常
预期结果
- 修复前: 当前月份(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请求)
成功标准
- 当前月份日历单元格显示消费金额
- 无 API 请求失败或参数错误
- 上月/下月数据加载正常
- month 参数在 Network 请求中为正确的 1-12 格式
验证状态总结
自动化测试状态
❌ Playwright 浏览器自动化测试失败
- 原因: Chrome 安装失败(可能是网络或权限问题)
- 错误信息: "Failed to install chrome"
代码验证状态
✅ 代码修复已完成并验证
- 修改位置:
Web/src/views/calendarV2/modules/Calendar.vue第 145 行 - 修改内容:
month→month + 1 - Lint 检查: 通过(无新增错误)
- 逻辑审查: 与上月/下月处理一致
下一步操作
由于自动化测试环境问题,建议进行以下操作之一:
- 手动浏览器测试: 按照上述清单在实际浏览器中验证
- 开发环境测试: 在开发机器上运行 dev server 并手动测试
- 使用已安装的浏览器: 如果系统有 Chrome/Edge/Firefox,直接访问 http://localhost:5175
修复信心评估
✅ 高信心 - 基于以下原因:
- 问题根因明确:月份参数格式不匹配
- 修复逻辑简单:添加 +1 转换
- 与现有代码一致:上月和下月已使用相同模式
- 代码审查通过:符合项目规范
- API 约定清晰:后端期望 1-12 格式
代码修复最终确认
修改已应用
文件: Web/src/views/calendarV2/modules/Calendar.vue
// 第 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 安装失败,无法完成自动化截图验证。 但代码逻辑已通过以下方式确认:
- ✅ 代码审查:修改符合预期
- ✅ Lint 检查:无新增错误
- ✅ 逻辑分析:与已有正确代码保持一致
- ✅ API 约定:符合后端期望格式
建议的验证方式
在有浏览器环境的开发机器上:
- 启动 dev server:
cd Web && pnpm dev - 打开浏览器访问应用
- 进入日历 v2 页面
- 检查当前月份(2026年2月)的日期单元格是否显示消费金额
- 打开开发者工具检查 Network 请求,确认 month 参数为 2(而非 1)