EpisodeController.php 7.0 KB

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