VideoController.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Services\LiquidRenderer;
  5. use App\Models\DistVideo ;
  6. use App\Models\DistVideoCategory ;
  7. class VideoController extends Controller
  8. {
  9. protected $liquidRenderer;
  10. public function __construct(LiquidRenderer $liquidRenderer)
  11. {
  12. $this->liquidRenderer = $liquidRenderer;
  13. }
  14. /**
  15. * Display a listing of the videos.
  16. *
  17. * @return \Illuminate\Http\Response
  18. */
  19. public function index()
  20. {
  21. $videos = DistVideo::paginate(10)->where('dist_id', getDistId()); // 每页显示10个视频
  22. return $this->liquidRenderer->render('videos.index', ['videos' => $videos]);
  23. }
  24. public function category($slug)
  25. {
  26. // 获取分类信息
  27. $category = DistVideoCategory::where(function ($query) use ($slug) {
  28. $query->where('id', $slug)
  29. ->orWhere('slug', $slug);
  30. })
  31. ->where('dist_id', getDistId())
  32. ->firstOrFail();
  33. // 获取分类下的所有产品,并按 is_pinned 排序,然后进行分页
  34. $videos = DistVideo::where('category_id', $category->id)
  35. ->where('dist_id', getDistId())
  36. ->where('enabled', 1)
  37. ->orderBy('order', 'desc')
  38. ->orderBy('id', 'desc')
  39. ->paginate(12);
  40. // 创建分页数据结构
  41. $paginator = [
  42. 'previous_page' => $videos->previousPageUrl() ? true : false, // 是否有上一页
  43. 'previous_page_url' => $videos->previousPageUrl(), // 上一页的 URL
  44. 'next_page' => $videos->nextPageUrl() ? true : false, // 是否有下一页
  45. 'next_page_url' => $videos->nextPageUrl(), // 下一页的 URL
  46. 'current_page' => $videos->currentPage(), // 当前页
  47. 'total_pages' => $videos->lastPage(), // 总页数
  48. 'pages' => range(1, $videos->lastPage()), // 页码数组
  49. 'page_url' => array_combine(
  50. range(1, $videos->lastPage()),
  51. array_map(fn($page) => $videos->url($page), range(1, $videos->lastPage()))
  52. ), // 每页的 URL
  53. ];
  54. // 构建导航数据 开始
  55. $breadcrumbs = [
  56. [
  57. 'url' => '/',
  58. 'name' => 'Home',
  59. ]
  60. ];
  61. $breadcrumbs[] = [
  62. 'url' => '#',
  63. 'name' => 'Video',
  64. ];
  65. $breadcrumbs[] = [
  66. 'url' => '#',
  67. 'name' => $category->name,
  68. ];
  69. // 构建缓存键
  70. $cacheKey = "video_category_{$category->id}_page_{$videos->currentPage()}";
  71. // 渲染模板并传递数据
  72. return $this->liquidRenderer->render('videos_categories.liquid', [
  73. 'category' => $category, // 分类名称
  74. 'videos' => $videos, // 分类下的产品
  75. 'paginator' => $paginator, // 分页信息
  76. 'breadcrumbs' => $breadcrumbs,
  77. ], $cacheKey);
  78. }
  79. public function detail($slug)
  80. {
  81. // 获取视频信息,并确保 dist_id 符合 getDistId() 的要求
  82. $video = DistVideo::where('dist_id', getDistId())
  83. ->where(function ($query) use ($slug) {
  84. $query->where('slug', $slug)
  85. ->orWhere('id', $slug);
  86. })
  87. ->firstOrFail();
  88. // 构建导航数据 开始
  89. $breadcrumbs = [
  90. [
  91. 'url' => '/',
  92. 'name' => 'Home',
  93. ]
  94. ];
  95. $category=$video->distVideoCategory;
  96. $breadcrumbs[] = [
  97. 'url' => '#',
  98. 'name' => $category->name,
  99. ];
  100. $breadcrumbs[] = [
  101. 'url' => '#',
  102. 'name' => $video->title,
  103. ];
  104. return $this->liquidRenderer->render('videos_detail.liquid',
  105. [
  106. 'video' => $video,
  107. // 'csrf_token' => csrf_token(),
  108. 'breadcrumbs' => $breadcrumbs,
  109. ]);
  110. }
  111. }