EpisodeController.php 6.5 KB

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