EpisodeController.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. namespace App\Http\Controllers\V1;
  3. use App\Models\Banner;
  4. use App\Models\Episode;
  5. use App\Models\EpisodesCategory;
  6. use App\Models\NavBar;
  7. use App\Models\Tabbar;
  8. use App\Models\User;
  9. use App\Models\UserEpisodesRecord;
  10. use App\Models\UserWatchRecord;
  11. use Carbon\Carbon;
  12. use Illuminate\Database\Eloquent\Builder;
  13. use Illuminate\Support\Collection;
  14. class EpisodeController extends Controller
  15. {
  16. private $number;
  17. public function __construct()
  18. {
  19. $this->number = env('HOME_RECOMMEND_NUMBER', 6);
  20. }
  21. /**
  22. * 推荐
  23. */
  24. public function recommend()
  25. {
  26. $history = UserWatchRecord::filterUser()
  27. ->withCount(['episode'])
  28. ->inRandomOrder()
  29. //->where('created_at','>=', Carbon::now()->subDays(7)->toDateTime())
  30. ->first();
  31. $lists = [];
  32. $ids = [];
  33. if($history){
  34. $ids[] = $history->episode->id;
  35. $history->episode->recent = true;
  36. $history->episode->status_text = $history->episode->status;
  37. $history->episode->total = $history->episode->lists->count();
  38. unset( $history->episode->lists);
  39. $lists[] = $history->episode;
  40. }
  41. $limit = $this->number - count($lists);
  42. // 推荐
  43. $episodes = Episode::withCount(['lists'])
  44. ->where('is_opend', 1)
  45. ->where('platform', \user()->info->platform)
  46. ->when($history,function ($query) use($history){
  47. /* @var Builder $query*/
  48. return $query->where('category_id', $history->episode->category_id)
  49. ->where('id','<>', $history->episode->id);
  50. })
  51. ->limit($limit)
  52. ->get();
  53. /* @var Episode $episode*/
  54. foreach ($episodes as $episode){
  55. $ids[] = $episode->id;
  56. $episode->status_text = $episode->status;
  57. $episode->total = $episode->lists_count;
  58. $episode->guess = true;
  59. $lists[] = $episode;
  60. }
  61. // 推荐的不够两个 需要补充
  62. $limit = $this->number - count($lists);
  63. if($limit){
  64. $supplement = Episode::withCount(['lists'])
  65. ->where('is_opend', 1)
  66. ->where('platform', \user()->info->platform)
  67. ->when($ids, function ($query) use($ids){
  68. /* @var Builder $query*/
  69. return $query->whereNotIn('id',$ids);
  70. })
  71. ->limit($limit)
  72. ->get();
  73. /* @var Episode $episode*/
  74. foreach ($supplement as $episode){
  75. $episode->status_text = $episode->status;
  76. $episode->total = $episode->lists_count;
  77. $episode->guess = true;
  78. $lists[] = $episode;
  79. }
  80. }
  81. return $this->success($lists);
  82. }
  83. /**
  84. * 最新
  85. */
  86. public function news()
  87. {
  88. $limit = request()->input('limit', $this->number);
  89. $page = request()->input('page',1);
  90. $offset = ($page - 1) * $limit;
  91. $episodes = Episode::withCount(['lists'])
  92. ->where('is_opend', 1)
  93. ->where('platform', \user()->info->platform)
  94. ->inRandomOrder()
  95. ->orderByDesc('created_at')
  96. ->limit($limit)
  97. ->offset($offset)
  98. ->get();
  99. $lists = Episode::complete($episodes);
  100. return $this->success($lists);
  101. }
  102. /**
  103. * 今日推荐
  104. */
  105. public function todayRecommend()
  106. {
  107. $limit = request()->input('limit', $this->number);
  108. $page = request()->input('page',1);
  109. $offset = ($page - 1) * $limit;
  110. $episodes = Episode::withCount(['lists'])
  111. ->where('is_opend', 1)
  112. ->where('platform', \user()->info->platform)
  113. ->inRandomOrder()
  114. ->orderByDesc('sort')
  115. ->limit($limit)
  116. ->offset($offset)
  117. ->get();
  118. $lists = Episode::complete($episodes);
  119. return $this->success($lists);
  120. }
  121. /**
  122. * 排行
  123. */
  124. public function rank()
  125. {
  126. $limit = request()->input('limit', $this->number);
  127. $page = request()->input('page',1);
  128. $offset = ($page - 1) * $limit;
  129. $episodes = Episode::withCount(['userEpisodesRecords','lists'])
  130. ->where('is_opend', 1)
  131. ->where('platform', \user()->info->platform)
  132. ->orderByDesc('user_episodes_records_count')
  133. ->limit($limit)
  134. ->offset($offset)
  135. ->get();
  136. $lists = [];
  137. $rank = (($page - 1) * $limit) + 1;
  138. /* @var Episode $episode*/
  139. foreach ($episodes as $episode){
  140. $episode->status_text = $episode->status;
  141. $episode->total = $episode->lists_count;
  142. $episode->rank = $rank++;
  143. $lists[] = $episode;
  144. }
  145. return $this->success($lists);
  146. }
  147. // 追剧
  148. public function trace()
  149. {
  150. $lists = EpisodesCategory::with(['episodes' =>function($query){
  151. /* @var Builder $query*/
  152. return $query->limit(3);
  153. }])->has('episodes')
  154. ->orderByDesc('sort')
  155. ->get();
  156. /* @var EpisodesCategory $list*/
  157. foreach ($lists as $list){
  158. /* @var Episode $episode*/
  159. foreach ($list->episodes as $episode){
  160. $count = $episode->withCount('lists')->first()->toArray();
  161. $episode->total = $count['lists_count'];
  162. $episode->status_text = $episode->status;
  163. }
  164. }
  165. return $this->success($lists);
  166. }
  167. /**
  168. * 最新
  169. */
  170. public function search()
  171. {
  172. $keywords = request()->input('keywords','');
  173. $limit = request()->input('limit',3);
  174. $page = request()->input('page',1);
  175. $offset = ($page - 1) * $limit;
  176. $episodes = Episode::withCount(['lists'])
  177. ->where('is_opend', 1)
  178. ->where('platform', \user()->info->platform)
  179. ->when($keywords, function ($query, $keywords) {
  180. /* @var Builder $query*/
  181. return $query->where('name','like', "%$keywords%");
  182. })
  183. ->inRandomOrder()
  184. ->orderByDesc('id')
  185. ->limit($limit)
  186. ->offset($offset)
  187. ->get();
  188. $lists = Episode::complete($episodes);
  189. return $this->success($lists);
  190. }
  191. public function vipFree()
  192. {
  193. $limit = request()->input('limit',3);
  194. $page = request()->input('page',1);
  195. $offset = ($page - 1) * $limit;
  196. $episodes = Episode::withCount(['lists'])
  197. ->where('is_opend', 1)
  198. ->where('is_vip_watch', 1)
  199. ->where('platform', \user()->info->platform)
  200. ->inRandomOrder()
  201. ->orderByDesc('id')
  202. ->limit($limit)
  203. ->offset($offset)
  204. ->get();
  205. $lists = Episode::complete($episodes);
  206. return $this->success($lists);
  207. }
  208. // 详情
  209. public function detail($id)
  210. {
  211. $episodes = Episode::withCount(['userWatchRecord','userCollect','userFavorite','lists'])
  212. ->with(['category:id,name','lists:id,episodes_id,sort,url,is_free,origin_price,sale_price'])
  213. ->where('is_opend', 1)
  214. ->where('id', $id)
  215. ->where('platform', \user()->info->platform)
  216. ->first();
  217. return $this->success($episodes);
  218. }
  219. public function listBuyNum($listId)
  220. {
  221. $count = UserEpisodesRecord::where('list_id',$listId)->count();
  222. return $this->success($count);
  223. }
  224. // 分享
  225. public function shared($id)
  226. {
  227. $res = Episode::find($id);
  228. if(!$res){
  229. return $this->success();
  230. }
  231. $res->share_count = $res->share_count + 1;
  232. $res->save();
  233. return $this->success();
  234. }
  235. }