UserBoardController.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace app\api\controller\board;
  3. use crmeb\services\UtilService;
  4. use app\models\board\UserBoard;
  5. use \think\facade\Config;
  6. use tw\lib\robot\Robots;
  7. use tw\redis\BoardRds;
  8. /**
  9. * 协议见文档 docs/board.md, 协议可能变更
  10. *
  11. * 使用 UserBoard Model, 数据表为 store_order_cart_info
  12. *
  13. * 策略:定时利用 sql 生成排行榜,缓存 json 到 redis
  14. *
  15. * Class UserBoardController
  16. * @package app\api\controller\board
  17. */
  18. class UserBoardController
  19. {
  20. /**
  21. * @api {get} /boards 获取排行榜
  22. * @apiName GetBoards
  23. * @apiGroup Public
  24. *
  25. * @apiParam {int=1,2} type 1|2 日榜单|周榜单
  26. *
  27. * @apiSuccess {string} banner 顶部 banner 图片
  28. * @apiSuccess {string} name 排行榜名称, 暂未使用
  29. * @apiSuccess {Object[]} board 排行榜数据
  30. *
  31. * @apiSuccessExample
  32. * {
  33. * "banner": "http://xxx.png",
  34. * "name": "daily board",
  35. * "board": [{
  36. * "uid": 123,
  37. * "avatar": "http://2.png",
  38. * "nickname": "xxx",
  39. * "level": 1,
  40. * "value": 23.3,
  41. * "border": 1,
  42. * "vip": 2
  43. * }]
  44. * }
  45. */
  46. public function boards()
  47. {
  48. [$type,] = UtilService::getMore([
  49. ['type', BoardRds::DAILY],
  50. ], null, true);
  51. $board = json_decode((new BoardRds)->get($type), true);
  52. return app('json')->successful('ok', $board);
  53. }
  54. /**
  55. * 讀取数据库中每日榜单的今日榜单
  56. */
  57. protected function daily_win_money($max = 30)
  58. {
  59. $board = new UserBoard();
  60. $res = $board->getDailyWinMoney($max);
  61. foreach ($res as &$row) {
  62. $row['value'] = floatval($row['value']);
  63. $row['border'] = 0;
  64. $row['vip'] = 0;
  65. }
  66. return [
  67. 'banner' => sys_config('leader_board_banner'),
  68. 'name' => "日榜",
  69. 'board' => $res,
  70. ];
  71. }
  72. /**
  73. * 缓存数据库取得的排行结果,定时调用
  74. */
  75. public function cache_board()
  76. {
  77. $max = sys_config('leader_max_num');
  78. $real_board = $this->daily_win_money($max);
  79. $robot_board = Robots::first_n_by_value($max);
  80. $board = array_merge($robot_board, $real_board['board']);
  81. // 过滤掉 value == 0 的记录
  82. $board = array_filter($board, function ($v) {
  83. return $v['value'] > 0.0;
  84. });
  85. usort($board, function ($l, $r) {
  86. return $r['value'] <=> $l['value'];
  87. });
  88. $real_board['board'] = $board;
  89. $res = (new BoardRds)->set(BoardRds::DAILY, json_encode($real_board));
  90. if (!$res) {
  91. errlog("cache_board() returned $res");
  92. }
  93. }
  94. }