123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- <?php
- namespace app\common\model;
- use app\common\library\Redis;
- use app\main\service\BookService;
- use think\Model;
- class Index extends Model
- {
- /**
- * 首页免费/完结/点击榜/畅销榜书籍列表接口数据
- * @param int $sex 性别频道 0不区分 1男 2女
- * @param string $type 类型
- * @param int $page 页码
- * @param int $is_water 是否清水
- * @return array
- */
- public static function booklist($sex, $type, $page, $is_water=false)
- {
- $redis = Redis::instance();
- if (!$is_water) {
- $key = 'BL:' . $type . ':' . $sex . ':' . $page;
- } else {
- $key = 'BL:W:' . $type . ':' . $sex . ':' . $page;
- }
- $data = $redis->get($key);
- if ($data) {
- $books = json_decode($data, true);
- } else {
- $map = array();
- if ($is_water) {
- $map['book.classify_white_list'] = 1;
- }
- if ($sex != 0) {
- $map['sex'] = $sex;
- }
- $map['state'] = 1;
- switch ($type) {
- case 'free': //免费榜
- $now = time();
- $map['free_stime'] = array('lt', $now);
- $map['free_etime'] = array('gt', $now);
- $books = model('Book')->where($map)->order("idx", "desc")->page($page, 10)->select();
- foreach ($books as $key => $book) {
- $from_date = date('m月d日', $book['free_stime']);
- $end_date = date('m月d日', $book['free_etime']);
- $books[$key]['free_period'] = $from_date . '至' . $end_date;
- }
- break;
- case 'finish': //完结榜
- $map['is_finish'] = 1;
- $map['id'] = array('gt', 1);
- $books = model('Book')->where($map)->order("idx", "desc")->page($page, 10)->select();
- break;
- case 'click': //点击榜
- //$books = model('Book')->where($map)->order("read_num", "desc")->page($page, 10)->select();
- $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();
- break;
- case 'sell': //畅销榜 按权重
- //$books = model('Book')->where($map)->order("idx", "desc")->page($page, 10)->select();
- $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();
- break;
- default: //默认就按阅读量排
- $books = model('Book')->where($map)->order("idx", "desc")->page($page, 10)->select();
- break;
- }
- if ($books) {
- $categoryArr = model("BookCategory")->getCategoryList();
- foreach ($books as $key => $v) {
- // 是否展示 CP - VIP 付费角标
- $books[$key]['vip_pay'] = BookService::instance()->showCpVipSubScript($v['id']);
- $books[$key]['author'] = $categoryArr[$v['book_category_id']];
- $books[$key]['category_text'] = $categoryArr[$v['book_category_id']];
- }
- }
- $json = json_encode($books);
- $redis->setex($key, 900, $json);
- }
- return $books;
- }
- /**
- * 首页配置的指定区块书籍列表接口
- * @param int $block_id 区块id
- * @param int $page 页数
- * @param int $is_water 是否清水
- * @return array
- */
- public static function blockbooklist($block_id, $page, $is_water=false)
- {
- $redis = Redis::instance();
- if (!$is_water) {
- $key = 'BBL:' . $block_id;
- } else {
- $key = 'BBL:W:' . $block_id;
- }
- if (!$redis->exists($key)) {
- $where = array();
- $where['manage_block_resource.block_id'] = $block_id;
- $where['manage_block_resource.type'] = 1;
- if($is_water){
- $resources = model('manage_block_resource')
- ->join('book','manage_block_resource.book_id=book.id and book.state=1 and book.classify_white_list=1','left')
- ->where($where)
- ->select();
- }else{
- $resources = model('manage_block_resource')
- ->join('book', 'manage_block_resource.book_id=book.id and book.state=1')
- ->where($where)
- ->select();
- }
- if (!empty($resources)) {
- foreach ($resources as $k => $r) {
- $redis->zadd($key,$r['weigh'],'B:'.$r['book_id']);
- }
- $redis->expire($key,3600);
- }
- }
- $books = $redis->zrevrangebyscore($key,'+inf','-inf',array('withscores'=>false,'limit'=>array(($page-1)*10,10)));
- // $categoryArr = model("BookCategory")->getCategoryList();
- $data = array();
- foreach ($books as $bookkey) {
- $b = $redis->hgetall($bookkey);
- if (empty($b)) {
- $res = explode(':', $bookkey);
- $b = model('Book')->bookInfo($res[1]);
- }
- if ($b) {
- if ($b['state'] != 1) {
- continue;
- }
- $bookInfo = [
- 'id' => $b['id'],
- 'name' => $b['name'],
- 'description' => $b['description'],
- 'author' => $b['author'],
- 'image' => $b['image'],
- 'read_num' => $b['read_num'],
- 'is_finish' => $b['is_finish'],
- 'vip_pay' => BookService::instance()->showCpVipSubScript($b['id']),
- ];
- $bookInfo['tags'] = empty($b['tags']) ? [] : explode(',', $b['tags']);
- $data[] = $bookInfo;
- }
- }
- return $data;
- }
- }
|