ArticleController.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Http\Controllers\Home\Blog;
  3. use App\Models\Blog\Article;
  4. use App\Models\Blog\ArticleTag;
  5. use App\Models\Blog\Category;
  6. use App\Models\Blog\Tag;
  7. use DOMDocument;
  8. use Illuminate\Http\Request;
  9. use App\Http\Controllers\Controller;
  10. use Illuminate\Support\Facades\Auth;
  11. class ArticleController extends CommonController
  12. {
  13. //
  14. public function index(Request $request)
  15. {
  16. $size = 15;
  17. $data = Article::with('category:id,cate_name')
  18. ->select( 'cate_id', 'slug', 'title', 'read_count', 'created_at', 'is_top', 'description')
  19. ->orderByDesc('is_top')->orderByDesc('created_at');
  20. if (isset($request->id)) {
  21. $data = $data->where('id', '=', $request->id);
  22. }
  23. if (isset($request->name)) {
  24. $data = $data->where('name', 'like', '%' . $request->name . '%');
  25. }
  26. if (isset($request->start_at) && isset($request->end_at)) {
  27. $data = $data->whereBetween('created_at', array($request->start_at, $request->end_at));
  28. }
  29. $data = $data->paginate($size)->toArray();
  30. $this->sidebar($data);
  31. return view('home.index', $data);
  32. }
  33. public function show($slug)
  34. {
  35. $article = Article::with('category:id,cate_name')
  36. ->select( 'id', 'cate_id', 'slug', 'title', 'read_count', 'created_at', 'is_top', 'description', 'markdown', 'keywords')
  37. ->where('slug', '=', $slug)->first();
  38. if (!$article) {
  39. return view('errors.404');
  40. }
  41. $article->increment("read_count");
  42. $tags = ArticleTag::query()
  43. ->select('blog_tags.tag_name')
  44. ->where('article_id', '=', $article->id)
  45. ->leftJoin('blog_tags', 'blog_article_tags.tag_id', 'blog_tags.id')
  46. ->get();
  47. $article = $article->toArray();
  48. // $article['markdown'] = markdown($article['markdown']);
  49. $article['markdown'] = $this->lazyImageMarkdown(markdown($article['markdown']));
  50. $data['article'] = $article;
  51. $data['article']['tags'] = $tags->toArray();
  52. $data['guess_you_like_articles'] = $this->guessYouLikeArticles($article['cate_id'], $slug);
  53. $this->sidebar($data);
  54. $keywords = '';
  55. foreach ($data['article']['tags'] as $i => $tag) {
  56. if ($i == 0) $keywords .= $tag['tag_name'];
  57. else $keywords .= ','.$tag['tag_name'];
  58. }
  59. $data['meta']['title'] = $article['title'];
  60. $data['meta']['description'] = $article['description'];
  61. $data['meta']['keywords'] = $keywords;
  62. return view('home.blog.article.index', $data);
  63. }
  64. /* guess you like*/
  65. protected function guessYouLikeArticles($cate_id, $slug)
  66. {
  67. $articles = Article::query()
  68. ->select('slug', 'title', 'read_count', 'description')
  69. ->where('cate_id', '=', $cate_id)
  70. ->where('slug', '!=', $slug)
  71. ->inRandomOrder()
  72. ->limit(8)->get();
  73. return $this->parseToArray($articles);
  74. }
  75. protected function lazyImageMarkdown($markdown)
  76. {
  77. $dom = new DomDocument();
  78. $dom->loadHTML('<?xml encoding="UTF-8">'.$markdown);
  79. $list = $dom->getElementsByTagName('img');
  80. foreach($list as $i => $item){
  81. if ($i == 0) continue;
  82. $attr_src = $item->getAttribute('src');
  83. $item->setAttribute("data-original", $attr_src);
  84. $item->setAttribute("src", "data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201%201'%3E%3C/svg%3E");
  85. // $item->removeAttribute('src');
  86. $item->setAttribute('class', 'lazyload');
  87. }
  88. $html = $dom->saveHTML();
  89. return $html;
  90. }
  91. }