ArticleController.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. namespace App\Http\Controllers\Backend;
  3. use App\Models\Article;
  4. use App\Models\ArticleTag;
  5. use App\Models\Tag;
  6. use Illuminate\Http\Request;
  7. use App\Http\Controllers\Controller;
  8. use Auth;
  9. use App\Http\Requests\Backend\Article\CreateRequest;
  10. use App\Http\Requests\Backend\Article\UpdateRequest;
  11. class ArticleController extends Controller
  12. {
  13. /**
  14. * @param Request $request
  15. * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
  16. */
  17. public function index(Request $request)
  18. {
  19. $articles = tap(Article::latest(), function ($query) use ($request) {
  20. if ($request->filled('title')) {
  21. $query->where('title', 'like', "%{$request->title}%");
  22. }
  23. if ($request->filled('cate_id')) {
  24. $query->where('cate_id', $request->cate_id);
  25. }
  26. })->with(['user', 'category'])->paginate();
  27. return view('backend.article.index', compact('articles'));
  28. }
  29. /**
  30. * Show the form for creating a new resource.
  31. *
  32. * @return \Illuminate\Http\Response
  33. */
  34. public function create()
  35. {
  36. return view('backend.article.create');
  37. }
  38. /**
  39. * @param CreateRequest $request
  40. * @return $this|\Illuminate\Http\RedirectResponse
  41. */
  42. public function store(CreateRequest $request)
  43. {
  44. $article = Article::create(array_merge($this->basicFields($request), ['user_id' => Auth::id()]));
  45. if ($request->filled('tags')) {
  46. $this->storeArticleTags($article, $request->tags);
  47. }
  48. return redirect()->route('backend.article.index')->with('success', '文章添加成功');
  49. }
  50. /**
  51. * Display the specified resource.
  52. *
  53. * @param int $id
  54. * @return \Illuminate\Http\Response
  55. */
  56. public function show($id)
  57. {
  58. //
  59. }
  60. /**
  61. * @param $id
  62. * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
  63. */
  64. public function edit($id)
  65. {
  66. $article = Article::findOrFail($id);
  67. return view('backend.article.edit', compact('article'));
  68. }
  69. /**
  70. * @param UpdateRequest $request
  71. * @param $id
  72. * @return $this|\Illuminate\Http\RedirectResponse
  73. */
  74. public function update(UpdateRequest $request, $id)
  75. {
  76. $article = Article::findOrFail($id);
  77. $article->fill($this->basicFields($request));
  78. $article->save();
  79. ArticleTag::where('article_id', $id)->delete();
  80. if ($request->filled('tags')) {
  81. $this->storeArticleTags($article, $request->tags);
  82. }
  83. return redirect()->route('backend.article.index')->with('success', '文章修改成功');
  84. }
  85. /**
  86. * @param $id
  87. * @return \Illuminate\Http\JsonResponse
  88. */
  89. public function destroy($id)
  90. {
  91. return Article::destroy($id) ? response()->json(['status' => 0]) : response()->json(['status' => 1]);
  92. }
  93. private function storeArticleTags(Article $article, $tagNames)
  94. {
  95. $tagNameList = array_unique(explode(';', trim($tagNames, ';')));
  96. if (!$tagNameList) {
  97. return false;
  98. }
  99. foreach ($tagNameList as $tagName) {
  100. $tag = Tag::where('tag_name', $tagName)->first();
  101. ArticleTag::create([
  102. 'article_id' => $article->id,
  103. 'tag_id' => $tag ? $tag->id : (Tag::create(['tag_name' => $tagName]))->id
  104. ]);
  105. }
  106. return true;
  107. }
  108. private function basicFields(Request $request)
  109. {
  110. $html = (new \Parsedown())->parse($request->markdown_content);
  111. return array_merge($request->all([
  112. 'title',
  113. 'keyword',
  114. 'desc',
  115. 'cate_id'
  116. ]), [
  117. 'content' => $request->get('markdown_content'),
  118. 'html_content' => $html
  119. ]);
  120. }
  121. }