From 507811b713fe9e04d2a0d78bd286f7be1827a007 Mon Sep 17 00:00:00 2001 From: xuanchen <122383162@qq.com> Date: Thu, 1 Apr 2021 17:03:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Article/IndexController.php | 33 ++++++++++++----- .../Controllers/Category/IndexController.php | 6 ++- app/Admin/Selectable/CategorySelectAble.php | 37 +++++++++++++++++++ app/Helpers/function.php | 27 ++++++++++---- app/Http/Controllers/ArticleController.php | 19 ++++------ app/Http/Controllers/IndexController.php | 19 +++------- app/Models/Article.php | 27 ++++++++++++-- app/Models/ArticleCategory.php | 11 ++++++ app/Models/Category.php | 7 ++-- ...151442_create_article_categories_table.php | 32 ++++++++++++++++ resources/views/article/show.blade.php | 29 +++++++-------- 11 files changed, 181 insertions(+), 66 deletions(-) create mode 100644 app/Admin/Selectable/CategorySelectAble.php create mode 100644 app/Models/ArticleCategory.php create mode 100644 database/migrations/2021_04_01_151442_create_article_categories_table.php diff --git a/app/Admin/Controllers/Article/IndexController.php b/app/Admin/Controllers/Article/IndexController.php index e0808fc..531eb81 100644 --- a/app/Admin/Controllers/Article/IndexController.php +++ b/app/Admin/Controllers/Article/IndexController.php @@ -2,6 +2,7 @@ namespace App\Admin\Controllers\Article; +use App\Admin\Selectable\CategorySelectAble; use App\Models\Article; use App\Models\Category; use Encore\Admin\Controllers\AdminController; @@ -33,7 +34,9 @@ class IndexController extends AdminController $grid->column('id', '#ID#'); $grid->column('cover', '封面图片')->image('', 100); - $grid->column('category.title', '所属分类'); + $grid->column('所属分类')->display(function () { + return $this->categories()->pluck('title'); + })->label(); $grid->column('title', '文章标题'); $grid->column('sort', '序号'); $states = [ @@ -51,20 +54,16 @@ class IndexController extends AdminController $form = new Form(new Article); $form->text('title', '文章标题')->rules('min:2'); - $form->select('category_id', '所属分类') - ->options(Category::selectOptions(function ($model) { - return $model->where('status', 1)->whereIn('type', [Category::TYPE_ARTICLE, Category::TYPE_SHOW]); - }, '选择分类')) - ->rules('required|min:1', [ - 'required' => '必须选择所属分类', - 'min' => '必须选择所属分类', - ]); + + $form->belongsToMany('categories', CategorySelectAble::class, __('关联分类')); + $form->textarea('description', '内容简介'); $form->text('tenure', '任期')->help('领导班子需要添加此数据'); $form->image('cover', '封面') ->move('images/' . date('Y/m/d')) ->removable() ->uniqueName(); + $form->ueditor('content', '文章内容')->rules('required', ['required' => '详情不能为空']); $form->number('sort', '序号')->default(0)->rules('required', ['required' => '序号必须填写'])->help('倒序优先'); $states = [ @@ -75,6 +74,22 @@ class IndexController extends AdminController $form->switch('status', '状态')->states($states)->default(1); + // $form->saved(function (Form $form) { + // $category_ids = request()->category_ids; + // if ($category_ids) { + // $categories = []; + // foreach ($category_ids as $key => $category_id) { + // if ($category_id) { + // $form->model()->article_categories()->updateOrCreate([ + // 'category_id' => $category_id, + // ]); + // $categories[] = $category_id; + // } + // } + // $form->model()->article_categories()->whereNotIn('category_id', $categories)->delete(); + // } + // }); + return $form; } diff --git a/app/Admin/Controllers/Category/IndexController.php b/app/Admin/Controllers/Category/IndexController.php index 3a1aafa..15ffd74 100644 --- a/app/Admin/Controllers/Category/IndexController.php +++ b/app/Admin/Controllers/Category/IndexController.php @@ -37,9 +37,11 @@ class IndexController extends AdminController $form->select('type', '分类类型') ->options(Category::TYPES) ->when('show', function (WidgetsForm $form) { + // $form->text('article_id', '关联文章'); + $form->select('article_id', '关联文章') ->options(function ($option, $info) { - return Article::whereHas('category', function ($q) { + return Article::whereHas('categories', function ($q) { $q->where('type', 'show'); })->pluck('title', 'id'); })->help('当分类类型是文章详情的时候需要选择关联文章'); @@ -103,7 +105,7 @@ class IndexController extends AdminController ->when('show', function (Form $form) { $form->select('article_id', '关联文章') ->options(function ($option, $info) { - return Article::whereHas('category', function ($q) { + return Article::whereHas('categories', function ($q) { $q->where('type', 'show'); })->pluck('title', 'id'); })->help('当分类类型是文章详情的时候需要选择关联文章'); diff --git a/app/Admin/Selectable/CategorySelectAble.php b/app/Admin/Selectable/CategorySelectAble.php new file mode 100644 index 0000000..bf24684 --- /dev/null +++ b/app/Admin/Selectable/CategorySelectAble.php @@ -0,0 +1,37 @@ +categories)->title; + }; + } + + public function make() + { + $this->model()->where('status', 1); + + $this->column('id', 'ID'); + $this->column('title', '分类名称'); + + $this->filter(function (Filter $filter) { + $filter->like('title', '分类名称'); + }); + } + +} diff --git a/app/Helpers/function.php b/app/Helpers/function.php index 2843fbc..be28af0 100644 --- a/app/Helpers/function.php +++ b/app/Helpers/function.php @@ -49,7 +49,12 @@ function getOneCategory($categoryId, $return = '') */ function getOneArticleBYCate($categoryId, $result = '') { - $info = Article::where('category_id', $categoryId)->latest('sort')->latest()->first(); + $info = Article::latest('sort') + ->whereHas('categories', function ($q) use ($categoryId) { + $q->where('id', $categoryId); + }) + ->latest() + ->first(); if ($info) { if ($result) { @@ -78,8 +83,10 @@ function getOneArticleBYCate($categoryId, $result = '') function getArticlesBYCate($categoryId, $take = 8, $mark = 'one', $hasCover = false, $order = 'desc') { if ($mark == 'one') { - $articles = Article::where('category_id', $categoryId) - ->where('status', 1) + $articles = Article::where('status', 1) + ->whereHas('categories', function ($q) use ($categoryId) { + $q->where('id', $categoryId); + }) ->orderBy('sort', $order) ->when($hasCover, function ($q) { $q->whereNotNull('cover'); @@ -90,8 +97,10 @@ function getArticlesBYCate($categoryId, $take = 8, $mark = 'one', $hasCover = fa $cate = Category::find($categoryId); $ids = $cate->getAllChildrenId(); - $articles = Article::whereIn('category_id', $ids) - ->where('status', 1) + $articles = Article::where('status', 1) + ->whereHas('categories', function ($q) use ($ids) { + $q->whereIN('id', $ids); + }) ->when($hasCover, function ($q) { $q->whereNotNull('cover'); }) @@ -157,11 +166,13 @@ function getArticlesByCateIds($take = 8, $hasCover = false) { $ids = [7, 17, 8, 5, 12, 30]; - $articles = Article::whereIn('category_id', $ids) - ->where('status', 1) + $articles = Article::where('status', 1) + ->whereHas('categories', function ($q) use ($ids) { + $q->whereIN('id', $ids); + }) ->latest() ->when($hasCover, function ($q) { - $q->whereNotNull('cover'); + $q->whereNotNull('cover')->orWhere('cover', '<>', ''); }) ->take($take) ->get(); diff --git a/app/Http/Controllers/ArticleController.php b/app/Http/Controllers/ArticleController.php index 5d445a3..442de36 100644 --- a/app/Http/Controllers/ArticleController.php +++ b/app/Http/Controllers/ArticleController.php @@ -16,17 +16,15 @@ class ArticleController extends Controller */ public function show(Article $article) { - $parent = $category = $article->category; - if ($category->id) { - $parent = getTopCate($category->id); - } + $categories = $article->categories; + $next = Article::where('id', '>', $article->id) + ->whereHas('categories', function ($q) use ($categories) { + $q->whereIN('id', $categories->pluck('id')); + }) + ->where('status', 1) + ->first(); - $next = Article::where('id', '>', $article->id) - ->where('category_id', $article->category_id) - ->where('status', 1) - ->first(); - - return view('article.show', compact('article', 'next', 'parent', 'category')); + return view('article.show', compact('article', 'next')); } @@ -38,7 +36,6 @@ class ArticleController extends Controller ->when($title, function ($q) use ($title) { $q->where('title', 'like', "%{$title}%"); }) - ->where('category_id', '>', 0) ->paginate(); return view('article.search', compact('articles')); diff --git a/app/Http/Controllers/IndexController.php b/app/Http/Controllers/IndexController.php index 6a85fb0..fe66085 100644 --- a/app/Http/Controllers/IndexController.php +++ b/app/Http/Controllers/IndexController.php @@ -16,26 +16,17 @@ class IndexController extends Controller */ public function index() { - $fydt = $this->getArticle([6], 9); //分院动态 - $kydt = $this->getArticle([9], 9); //科研动态 - $ldbz = $this->getArticle([3], 4); //领导班子 - $kycg = $this->getArticle([10], 8); //科研成果 - $rctd = $this->getArticle([4], 9); //人才团队介绍 - $info = Article::where('category_id', 2)->first(); //院所介绍 - $links = Link::get(); - - $advert = Advert::where('category_id', 26)->latest('sort')->first(); - $center_advert = Advert::where('category_id', 28)->latest('sort')->first(); - - return view('index.index', compact('advert', 'center_advert', 'fydt', 'kydt', 'ldbz', 'kycg', 'rctd', 'info')); + return view('index.index'); } //通用获取文章 public function getArticle($category_ids, $take = 3) { - return Article::whereIn('category_id', $category_ids) + return Article::latest('sort') + ->whereHas('categories', function ($q) use ($category_ids) { + $q->where('id', $category_ids); + }) ->select('id', 'description', 'title', 'created_at', 'cover', 'content') - ->latest('sort') ->latest() ->take($take) ->get(); diff --git a/app/Models/Article.php b/app/Models/Article.php index eda2b5a..e7017e6 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -4,18 +4,21 @@ namespace App\Models; use App\Models\Traits\BelongsToCategory; use App\Models\Traits\HasOneCover; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Arr; class Article extends Model { - use HasOneCover, BelongsToCategory; + use HasOneCover; - public function getLinkAttribute() + public function getLinkAttribute(): string { return route('article.show', $this); } - - public function get_content_cover() + + public function get_content_cover(): string { preg_match("/].*?>/isU", str_ireplace("\\", "", $this->content), $matches); @@ -26,6 +29,22 @@ class Article extends Model } } + /** + * Notes: 关联分类的中间表 + * @Author: 玄尘 + * @Date : 2021/4/1 15:19 + */ + public function article_categories(): HasMany + { + return $this->hasMany(ArticleCategory::class); + } + + public function categories(): BelongsToMany + { + return $this->belongsToMany(Category::class) + ->using(ArticleCategory::class); + } + /** * Notes: 获取一个默认图片 * @Author: 玄尘 diff --git a/app/Models/ArticleCategory.php b/app/Models/ArticleCategory.php new file mode 100644 index 0000000..897b0d0 --- /dev/null +++ b/app/Models/ArticleCategory.php @@ -0,0 +1,11 @@ +belongsTo(Article::class); break; case self::TYPE_ARTICLE: - return $this->hasMany(Article::class); + return $this->belongsToMany(Article::class); break; case self::TYPE_ADVERT: return $this->hasMany(Advert::class); @@ -55,9 +56,9 @@ class Category extends Model return $this->hasOne(self::class, 'id', 'parent_id'); } - public function article() + public function articles(): BelongsToMany { - return $this->belongsTo(Article::class); + return $this->belongsToMany(Article::class); } /** diff --git a/database/migrations/2021_04_01_151442_create_article_categories_table.php b/database/migrations/2021_04_01_151442_create_article_categories_table.php new file mode 100644 index 0000000..002906d --- /dev/null +++ b/database/migrations/2021_04_01_151442_create_article_categories_table.php @@ -0,0 +1,32 @@ +foreignId('article_id'); + $table->foreignId('category_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * @return void + */ + public function down() + { + Schema::dropIfExists('article_categories'); + } + +} diff --git a/resources/views/article/show.blade.php b/resources/views/article/show.blade.php index 765160c..55407c7 100644 --- a/resources/views/article/show.blade.php +++ b/resources/views/article/show.blade.php @@ -7,26 +7,25 @@
- @include('category.left') -
+
-
-
-
- - {{ $category->title }} -
+ {{--
--}} + {{--
--}} + {{--
--}} + {{-- --}} + {{-- {{ $category->title }}--}} + {{--
--}} + {{--
--}} +
+
+ {{ $article->title }}
-
-
- {{ $article->title }} -
-
- {!! $article->content !!} +
+ {!! $article->content !!} -
+ {{--
--}}