022207-修复房屋排行榜第二页数据问题.md 3.5 KB

修复房屋排行榜第二页数据问题

时间: 2025年07月02日 22:07 任务: 修复 House-Rank 排行榜第二页数据显示问题

问题描述

用户反馈房屋排行榜第二页数据有问题:

  • 响应中有分页信息(总数15,当前页2,每页10条)
  • 但是列表数据为空,没有显示第二页的数据

    {
    "runUnid": "6865391969844",
    "runMs": "21", 
    "code": "OK",
    "callpath": "House-Rank",
    "lastData": {},
    "houseRank": {
    "page": {
      "currentPage": "2",
      "perPage": "10", 
      "lastPage": "2",
      "total": "15"
    },
    "userRank": "13",
    "reason": "1"
    }
    }
    

问题分析

通过代码分析发现了多个问题:

1. 类型错误

app/Module/Farm/Logics/HouseLogic.phpgetHouseRankListCache 方法中:

  • 方法声明返回类型为 array
  • 但在第329-335行,当请求数据超出前100名时,返回的是 HouseRankDto 对象
  • 导致后续 array_slice 操作失败

2. 设计问题

  • getHouseRankListCache 方法不应该处理分页逻辑
  • 分页应该在外部的 getHouseRankList 方法中处理
  • 缓存方法应该只负责获取和缓存数据

3. 用户排名计算错误

  • 用户排名计算中错误地加上了当前页偏移量
  • 应该是在整个排行榜中的绝对位置

4. 总数统计不准确

  • getTotalHouseRankCount() 统计的是 FarmUser::count()
  • 但实际排行榜查询需要JOIN user_infos
  • 导致总数与实际数据不匹配

修复方案

1. 重构缓存方法

// 修改前
protected function getHouseRankListCache(int $userId, int $page = 1, int $pageSize = 20): array

// 修改后  
protected function getHouseRankListCache(): array

2. 移除分页逻辑

  • 将分页检查逻辑移到 getHouseRankList 方法中
  • 缓存方法只负责获取完整的排行榜数据

3. 修复用户排名计算

// 修改前
$rank = $offset + $index + 1;

// 修改后
$userRank = $index + 1; // 用户在整个排行榜中的排名

4. 使用缓存数据统计总数

// 修改前
'total' => min($maxRankLimit, $this->getTotalHouseRankCount())

// 修改后
'total' => count($cachedRankList) // 直接使用缓存数据的行数

测试验证

创建测试命令验证修复效果:

docker exec kku_laravel php artisan test:house-rank

测试结果:

  • 缓存数据总数: 7条
  • 第一页 (page=1, pageSize=5): 显示5条数据,排名1-5
  • 第二页 (page=2, pageSize=5): 显示2条数据,排名6-7
  • 分页信息: 总数7,每页5条,分页计算正确

修改文件

  • app/Module/Farm/Logics/HouseLogic.php
    • 重构 getHouseRankListCache 方法
    • 修复 getHouseRankList 方法中的分页逻辑
    • 修复用户排名计算
    • 删除不再使用的 getTotalHouseRankCount 方法

提交信息

修复房屋排行榜第二页数据问题

- 修复getHouseRankListCache方法返回类型错误
- 移除分页参数,缓存方法只负责获取数据  
- 修复用户排名计算错误
- 使用缓存数据行数作为总数,确保分页信息准确
- 删除不再使用的getTotalHouseRankCount方法

总结

问题已完全修复:

  1. ✅ 修复了类型错误和设计问题
  2. ✅ 分页逻辑正确,第二页能正常显示数据
  3. ✅ 用户排名计算准确
  4. ✅ 分页信息与实际数据一致
  5. ✅ 代码结构更清晰,职责分离明确

现在房屋排行榜的分页功能完全正常,第二页数据能够正确显示。