5.4 KiB
5.4 KiB
🔍 家长端日历无数据问题诊断
诊断时间: 2026-01-24
问题: 日历页面显示"暂无订单数据",统计数字都是0
问题分析
可能的原因
-
数据库中没有订单数据
- 当前用户没有创建任何订单
- 订单的service_date不在当前月份
-
用户ID获取错误
- 后端获取的userId与实际登录用户不匹配
- JWT token中的userId字段不正确
-
订单状态不符合查询条件
- 订单状态不在 [1,2,3,4] 范围内
- 订单被标记为deleted=1
-
日期格式问题
- 前端传递的日期格式与后端期望不一致
- LocalDate解析失败
诊断步骤
步骤1: 检查数据库中的订单数据
执行SQL: peidu/sql/🔍检查日历数据-2026-01-24.sql
-- 查看所有订单
SELECT id, order_no, user_id, service_date, status, deleted
FROM `order`
WHERE deleted = 0
ORDER BY service_date DESC
LIMIT 20;
检查点:
- ✅ 是否有订单数据?
- ✅ user_id是否正确?
- ✅ service_date是否在2026年1月?
- ✅ status是否在 [1,2,3,4] 范围?
- ✅ deleted是否为0?
步骤2: 检查后端日志
查看后端控制台输出:
[CalendarController] 获取预约记录, startDate: 2026-01-01, endDate: 2026-01-31
[CalendarController] 当前用户ID: [实际的用户ID]
[CalendarServiceImpl] 查询用户预约记录, userId: [用户ID], startDate: 2026-01-01, endDate: 2026-01-31
[CalendarServiceImpl] 查询到 X 条订单记录
检查点:
- ✅ 用户ID是否正确?
- ✅ 日期范围是否正确?
- ✅ 查询到的订单数量是多少?
步骤3: 检查前端请求
在浏览器开发者工具中查看Network:
Request URL: http://localhost:8080/api/calendar/appointments?startDate=2026-01-01&endDate=2026-01-31
Request Method: GET
Status Code: 200 OK
检查点:
- ✅ 请求是否成功(200)?
- ✅ 请求参数是否正确?
- ✅ 响应数据中是否有records?
步骤4: 检查JWT Token
查看请求头中的Authorization:
Authorization: Bearer [JWT Token]
解析token,检查payload中的userId字段。
解决方案
方案1: 创建测试数据
如果数据库中没有订单数据,执行:
# 在MySQL中执行
source peidu/sql/🚀创建日历测试数据-2026-01-24.sql
这将为用户ID=1创建6条测试订单:
- 1月10日 - 已完成
- 1月15日 - 待服务
- 1月20日 - 待接单
- 1月24日 - 服务中(今天)
- 1月25日 - 待服务(明天)
- 1月28日 - 待服务
方案2: 修复用户ID获取
如果用户ID获取错误,已在 CalendarController 中修复:
private Long getCurrentUserId(HttpServletRequest request) {
// 优先获取userId
Object userIdObj = request.getAttribute("userId");
if (userIdObj != null) {
return Long.valueOf(userIdObj.toString());
}
// 尝试获取teacherId
Object teacherIdObj = request.getAttribute("teacherId");
if (teacherIdObj != null) {
return Long.valueOf(teacherIdObj.toString());
}
return 1L; // 默认值
}
方案3: 检查订单状态
确保订单状态正确:
-- 更新订单状态为待服务
UPDATE `order`
SET status = 2
WHERE user_id = 1
AND service_date >= CURDATE()
AND status = 0
AND deleted = 0;
方案4: 检查deleted字段
确保订单没有被软删除:
-- 恢复被删除的订单
UPDATE `order`
SET deleted = 0
WHERE user_id = 1
AND service_date >= '2026-01-01'
AND deleted = 1;
测试验证
1. 重新编译后端
cd peidu/backend
mvn clean compile
2. 重启后端服务
确保后端服务重启以加载新代码。
3. 刷新前端页面
在微信开发者工具中:
- 点击"编译"按钮
- 进入家长端
- 访问"服务日历"页面
- 查看是否显示数据
4. 验证数据显示
预期结果:
- ✅ 日历上有彩色标记的日期
- ✅ 统计数字显示正确(总课时、已完成、待服务)
- ✅ 点击日期可以查看当天的服务详情
调试技巧
1. 查看后端日志
# 查看最新的日志
tail -f peidu/backend/logs/app.log
2. 使用Postman测试API
GET http://localhost:8080/api/calendar/appointments
Headers:
Authorization: Bearer [你的token]
Params:
startDate: 2026-01-01
endDate: 2026-01-31
3. 在前端添加调试日志
async loadScheduleData() {
console.log('[日历] 开始加载数据')
console.log('[日历] startDate:', this.getMonthStart())
console.log('[日历] endDate:', this.getMonthEnd())
const res = await calendarApi.getAppointments(startDate, endDate)
console.log('[日历] API响应:', res)
console.log('[日历] 订单数量:', res.data?.length || 0)
}
常见问题
Q1: 为什么我的用户看不到数据?
A: 检查用户ID是否正确。每个用户只能看到自己的订单(user_id匹配)。
Q2: 为什么统计数字都是0?
A: 检查订单的service_date是否在当前月份,以及status是否在有效范围内。
Q3: 为什么日历上没有标记?
A: 前端需要根据订单的service_date在日历上显示标记。检查scheduleData数组是否有数据。
Q4: 如何切换到其他月份?
A: 点击日历上的左右箭头切换月份,会自动重新加载该月的数据。
下一步
如果以上方案都无法解决问题,请:
- 提供后端完整日志
- 提供前端控制台输出
- 提供数据库查询结果
- 提供Network请求详情
这样可以更准确地定位问题。