123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- <?php
- namespace App\Http\Controllers\V1;
- use App\Models\Banner;
- use App\Models\Episode;
- use App\Models\EpisodesCategory;
- use App\Models\NavBar;
- use App\Models\Tabbar;
- use App\Models\User;
- use App\Models\UserEpisodesRecord;
- use App\Models\UserWatchRecord;
- use Carbon\Carbon;
- use Illuminate\Database\Eloquent\Builder;
- use Illuminate\Support\Collection;
- use function GuzzleHttp\Promise\all;
- class EpisodeController extends Controller
- {
- private $number;
- public function __construct()
- {
- $this->number = env('HOME_RECOMMEND_NUMBER', 6);
- }
- /**
- * 推荐
- */
- public function recommend()
- {
- $history = UserWatchRecord::filterUser()
- ->withCount(['episode'])
- ->whereHas('episode', function (Builder $query){
- $query->where('is_opend', 1);
- })
- ->inRandomOrder()
- //->where('created_at','>=', Carbon::now()->subDays(7)->toDateTime())
- ->first();
- $lists = [];
- $ids = [];
- if($history){
- $ids[] = $history->episode->id;
- $history->episode->recent = true;
- $history->episode->status_text = $history->episode->status;
- $history->episode->total = $history->episode->lists->count();
- unset( $history->episode->lists);
- $lists[] = $history->episode;
- }
- $limit = $this->number - count($lists);
- // 推荐
- $episodes = Episode::filterPlatform()->withCount(['lists'])
- ->where('is_opend', 1)
- ->when($history,function ($query) use($history){
- /* @var Builder $query*/
- return $query->where('category_id', $history->episode->category_id)
- ->where('id','<>', $history->episode->id);
- })
- ->limit($limit)
- ->get();
- /* @var Episode $episode*/
- foreach ($episodes as $episode){
- $ids[] = $episode->id;
- $episode->status_text = $episode->status;
- $episode->total = $episode->lists_count;
- $episode->guess = true;
- $lists[] = $episode;
- }
- // 推荐的不够两个 需要补充
- $limit = $this->number - count($lists);
- if($limit){
- $supplement = Episode::filterPlatform()->withCount(['lists'])
- ->where('is_opend', 1)
- ->when($ids, function ($query) use($ids){
- /* @var Builder $query*/
- return $query->whereNotIn('id',$ids);
- })
- ->limit($limit)
- ->get();
- /* @var Episode $episode*/
- foreach ($supplement as $episode){
- $episode->status_text = $episode->status;
- $episode->total = $episode->lists_count;
- $episode->guess = true;
- $lists[] = $episode;
- }
- }
- return $this->success($lists);
- }
- /**
- * 最新
- */
- public function news()
- {
- $limit = request()->input('limit', $this->number);
- $page = request()->input('page',1);
- $offset = ($page - 1) * $limit;
- $episodes = Episode::filterPlatform()->withCount(['lists'])
- ->where('is_opend', 1)
- //->inRandomOrder()
- ->orderByDesc('created_at')
- ->limit($limit)
- ->offset($offset)
- ->get();
- $lists = Episode::complete($episodes);
- return $this->success($lists);
- }
- /**
- * 今日推荐
- */
- public function todayRecommend()
- {
- $limit = request()->input('limit', $this->number);
- $page = request()->input('page',1);
- $offset = ($page - 1) * $limit;
- $episodes = Episode::filterPlatform()->withCount(['lists'])
- ->where('is_opend', 1)
- //->inRandomOrder()
- ->orderBy('sort')
- ->limit($limit)
- ->offset($offset)
- ->get();
- $lists = Episode::complete($episodes);
- return $this->success($lists);
- }
- /**
- * 排行
- */
- public function rank()
- {
- $limit = request()->input('limit', $this->number);
- $page = request()->input('page',1);
- $offset = ($page - 1) * $limit;
- $episodes = Episode::filterPlatform()->withCount(['userEpisodesRecords','lists'])
- ->where('is_opend', 1)
- ->orderByDesc('user_episodes_records_count')
- ->limit($limit)
- ->offset($offset)
- ->get();
- $lists = [];
- $rank = (($page - 1) * $limit) + 1;
- /* @var Episode $episode*/
- foreach ($episodes as $episode){
- $episode->status_text = $episode->status;
- $episode->total = $episode->lists_count;
- $episode->rank = $rank++;
- $lists[] = $episode;
- }
- return $this->success($lists);
- }
- public function list()
- {
- $limit = request()->input('limit', $this->number);
- $page = request()->input('page',1);
- $cateId = request()->input('cateId',0);
- $offset = ($page - 1) * $limit;
- $episodes = Episode::filterPlatform()->withCount(['lists'])
- ->when($cateId, function ($query, $cateId){
- /* @var Builder $query*/
- return $query->where('category_id',$cateId);
- })
- ->where('is_opend', 1)
- ->limit($limit)
- ->offset($offset)
- ->get();
- $lists = [];
- /* @var Episode $episode*/
- foreach ($episodes as $episode){
- $episode->status_text = $episode->status;
- $episode->total = $episode->lists_count;
- $lists[] = $episode;
- }
- return $this->success($lists);
- }
- // 追剧
- public function trace()
- {
- $category = EpisodesCategory::with(['child:id,pid'])
- ->where('level',1)
- ->orderBy('sort')
- ->get(['id','name']);
- $lists = [];
- /* @var EpisodesCategory $item*/
- foreach ($category as $item){
- $childIds = $item->child->pluck('id');
- $childIds[] = $item->id;
- $episodes = Episode::filterPlatform()->whereIn('category_id', $childIds)
- ->where('is_opend', 1)
- ->limit(3)
- ->get();
- /* @var Episode $episode*/
- foreach ($episodes as $episode){
- $count = $episode->withCount('lists')->first()->toArray();
- $episode->total = $count['lists_count'];
- $episode->status_text = $episode->status;
- }
- $item->episodes = $episodes;
- unset($item->child);
- if($episodes->count()){
- $lists[] = $item;
- }
- }
- return $this->success($lists);
- }
- /**
- * 最新
- */
- public function search()
- {
- $keywords = request()->input('keywords','');
- $limit = request()->input('limit',3);
- $page = request()->input('page',1);
- $offset = ($page - 1) * $limit;
- $episodes = Episode::filterPlatform()->withCount(['lists'])
- ->where('is_opend', 1)
- ->when($keywords, function ($query, $keywords) {
- /* @var Builder $query*/
- return $query->where('name','like', "%$keywords%");
- })
- ->inRandomOrder()
- ->orderByDesc('id')
- ->limit($limit)
- ->offset($offset)
- ->get();
- $lists = Episode::complete($episodes);
- return $this->success($lists);
- }
- public function vipFree()
- {
- $limit = request()->input('limit',3);
- $page = request()->input('page',1);
- $offset = ($page - 1) * $limit;
- $episodes = Episode::filterPlatform()->withCount(['lists'])
- ->where('is_opend', 1)
- ->where('is_vip_watch', 1)
- ->inRandomOrder()
- ->orderByDesc('id')
- ->limit($limit)
- ->offset($offset)
- ->get();
- $lists = Episode::complete($episodes);
- return $this->success($lists);
- }
- // 详情
- public function detail($id)
- {
- $episodes = Episode::filterPlatform()->withCount(['userWatchRecord','userCollect','userFavorite','lists'])
- ->with([
- 'category:id,name',
- 'lists'=> function($query){
- $query->select([
- 'id','episodes_id','sort','url','is_free','origin_price','sale_price'
- ])
- ->orderBy('sort');
- }
- ])
- ->where('is_opend', 1)
- ->where('id', $id)
- ->first();
- return $this->success($episodes);
- }
- public function listBuyNum($listId)
- {
- $count = UserEpisodesRecord::where('list_id',$listId)->count();
- return $this->success($count);
- }
- // 分享
- public function shared($id)
- {
- $res = Episode::find($id);
- if(!$res){
- return $this->success();
- }
- $res->share_count = $res->share_count + 1;
- $res->save();
- return $this->success();
- }
- }
|