Index.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace app\common\model;
  3. use app\common\library\Redis;
  4. use app\main\service\BookService;
  5. use think\Model;
  6. class Index extends Model
  7. {
  8. /**
  9. * 首页免费/完结/点击榜/畅销榜书籍列表接口数据
  10. * @param int $sex 性别频道 0不区分 1男 2女
  11. * @param string $type 类型
  12. * @param int $page 页码
  13. * @param int $is_water 是否清水
  14. * @return array
  15. */
  16. public static function booklist($sex, $type, $page, $is_water=false)
  17. {
  18. $redis = Redis::instance();
  19. if (!$is_water) {
  20. $key = 'BL:' . $type . ':' . $sex . ':' . $page;
  21. } else {
  22. $key = 'BL:W:' . $type . ':' . $sex . ':' . $page;
  23. }
  24. $data = $redis->get($key);
  25. if ($data) {
  26. $books = json_decode($data, true);
  27. } else {
  28. $map = array();
  29. if ($is_water) {
  30. $map['book.classify_white_list'] = 1;
  31. }
  32. if ($sex != 0) {
  33. $map['sex'] = $sex;
  34. }
  35. $map['state'] = 1;
  36. switch ($type) {
  37. case 'free': //免费榜
  38. $now = time();
  39. $map['free_stime'] = array('lt', $now);
  40. $map['free_etime'] = array('gt', $now);
  41. $books = model('Book')->where($map)->order("idx", "desc")->page($page, 10)->select();
  42. foreach ($books as $key => $book) {
  43. $from_date = date('m月d日', $book['free_stime']);
  44. $end_date = date('m月d日', $book['free_etime']);
  45. $books[$key]['free_period'] = $from_date . '至' . $end_date;
  46. }
  47. break;
  48. case 'finish': //完结榜
  49. $map['is_finish'] = 1;
  50. $map['id'] = array('gt', 1);
  51. $books = model('Book')->where($map)->order("idx", "desc")->page($page, 10)->select();
  52. break;
  53. case 'click': //点击榜
  54. //$books = model('Book')->where($map)->order("read_num", "desc")->page($page, 10)->select();
  55. $books = model('BookRanklist')->join('book', 'book_ranklist.book_id = book.id', 'left')->field('book.*')->where($map)->where('rank_category', 'eq', '0')->where('book_ranklist.status', 'eq', 'normal')->order("book_ranklist.weight", "desc")->order("book_ranklist.createtime", "desc")->page($page, 10)->select();
  56. break;
  57. case 'sell': //畅销榜 按权重
  58. //$books = model('Book')->where($map)->order("idx", "desc")->page($page, 10)->select();
  59. $books = model('BookRanklist')->join('book', 'book_ranklist.book_id = book.id', 'left')->field('book.*')->where($map)->where('rank_category', 'eq', '1')->where('book_ranklist.status', 'eq', 'normal')->order("book_ranklist.weight", "desc")->order("book_ranklist.createtime", "desc")->page($page, 10)->select();
  60. break;
  61. default: //默认就按阅读量排
  62. $books = model('Book')->where($map)->order("idx", "desc")->page($page, 10)->select();
  63. break;
  64. }
  65. if ($books) {
  66. $categoryArr = model("BookCategory")->getCategoryList();
  67. foreach ($books as $key => $v) {
  68. // 是否展示 CP - VIP 付费角标
  69. $books[$key]['vip_pay'] = BookService::instance()->showCpVipSubScript($v['id']);
  70. $books[$key]['author'] = $categoryArr[$v['book_category_id']];
  71. $books[$key]['category_text'] = $categoryArr[$v['book_category_id']];
  72. }
  73. }
  74. $json = json_encode($books);
  75. $redis->setex($key, 900, $json);
  76. }
  77. return $books;
  78. }
  79. /**
  80. * 首页配置的指定区块书籍列表接口
  81. * @param int $block_id 区块id
  82. * @param int $page 页数
  83. * @param int $is_water 是否清水
  84. * @return array
  85. */
  86. public static function blockbooklist($block_id, $page, $is_water=false)
  87. {
  88. $redis = Redis::instance();
  89. if (!$is_water) {
  90. $key = 'BBL:' . $block_id;
  91. } else {
  92. $key = 'BBL:W:' . $block_id;
  93. }
  94. if (!$redis->exists($key)) {
  95. $where = array();
  96. $where['manage_block_resource.block_id'] = $block_id;
  97. $where['manage_block_resource.type'] = 1;
  98. if($is_water){
  99. $resources = model('manage_block_resource')
  100. ->join('book','manage_block_resource.book_id=book.id and book.state=1 and book.classify_white_list=1','left')
  101. ->where($where)
  102. ->select();
  103. }else{
  104. $resources = model('manage_block_resource')
  105. ->join('book', 'manage_block_resource.book_id=book.id and book.state=1')
  106. ->where($where)
  107. ->select();
  108. }
  109. if (!empty($resources)) {
  110. foreach ($resources as $k => $r) {
  111. $redis->zadd($key,$r['weigh'],'B:'.$r['book_id']);
  112. }
  113. $redis->expire($key,3600);
  114. }
  115. }
  116. $books = $redis->zrevrangebyscore($key,'+inf','-inf',array('withscores'=>false,'limit'=>array(($page-1)*10,10)));
  117. // $categoryArr = model("BookCategory")->getCategoryList();
  118. $data = array();
  119. foreach ($books as $bookkey) {
  120. $b = $redis->hgetall($bookkey);
  121. if (empty($b)) {
  122. $res = explode(':', $bookkey);
  123. $b = model('Book')->bookInfo($res[1]);
  124. }
  125. if ($b) {
  126. if ($b['state'] != 1) {
  127. continue;
  128. }
  129. $bookInfo = [
  130. 'id' => $b['id'],
  131. 'name' => $b['name'],
  132. 'description' => $b['description'],
  133. 'author' => $b['author'],
  134. 'image' => $b['image'],
  135. 'read_num' => $b['read_num'],
  136. 'is_finish' => $b['is_finish'],
  137. 'vip_pay' => BookService::instance()->showCpVipSubScript($b['id']),
  138. ];
  139. $bookInfo['tags'] = empty($b['tags']) ? [] : explode(',', $b['tags']);
  140. $data[] = $bookInfo;
  141. }
  142. }
  143. return $data;
  144. }
  145. }