From f8389d8d991d95216e42217c3783fc6695d3630a Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Thu, 27 Apr 2023 15:27:12 +0800 Subject: [PATCH] api --- .../Controllers/AdminNoticeController.php | 8 +--- app/Admin/Controllers/ArticleController.php | 2 +- app/Admin/Controllers/BannerController.php | 12 +++-- app/Filters/ArticleCategoryFilter.php | 7 +++ app/Filters/ArticleFilter.php | 2 + app/Filters/BannerFilter.php | 2 +- .../Controllers/Api/AdminNoticeController.php | 31 ++++++++++++ .../Controllers/Api/ArticleController.php | 48 +++++++++++++++++++ app/Http/Controllers/Api/BannerController.php | 20 ++++++++ app/Http/Controllers/Controller.php | 22 +++++++++ app/Http/Resources/AdminNoticeResource.php | 27 +++++++++++ .../Resources/ArticleCategoryResource.php | 27 +++++++++++ app/Http/Resources/ArticleResource.php | 29 +++++++++++ app/Http/Resources/BannerResource.php | 29 +++++++++++ app/Models/AdminNotice.php | 10 +++- app/Models/Article.php | 7 ++- app/Models/ArticleCategory.php | 7 ++- app/Models/Banner.php | 6 +++ app/Models/BannerPlace.php | 5 ++ app/Services/Admin/BannerPlaceService.php | 17 +++++++ routes/api.php | 12 +++-- 21 files changed, 311 insertions(+), 19 deletions(-) create mode 100644 app/Http/Controllers/Api/AdminNoticeController.php create mode 100644 app/Http/Controllers/Api/ArticleController.php create mode 100644 app/Http/Controllers/Api/BannerController.php create mode 100644 app/Http/Resources/AdminNoticeResource.php create mode 100644 app/Http/Resources/ArticleCategoryResource.php create mode 100644 app/Http/Resources/ArticleResource.php create mode 100644 app/Http/Resources/BannerResource.php diff --git a/app/Admin/Controllers/AdminNoticeController.php b/app/Admin/Controllers/AdminNoticeController.php index 672dbf1..3b54b95 100644 --- a/app/Admin/Controllers/AdminNoticeController.php +++ b/app/Admin/Controllers/AdminNoticeController.php @@ -25,13 +25,9 @@ class AdminNoticeController extends AdminController ->columns([ TableColumn::make()->name('id')->label(__('admin-notice.id'))->sortable(true), TableColumn::make()->name('title')->label(__('admin-notice.title')), - TableColumn::make() - ->name('article.title') - ->label(__('admin-notice.article_id')), - // ->type('button') - // ->actionType('link') - // ->link('articles/${article_id}'), + TableColumn::make()->name('article.title')->label(__('admin-notice.article_id')), TableColumn::make()->name('is_enable')->type('switch')->label(__('admin-notice.is_enable'))->quickEdit(SwitchControl::make()->saveImmediately(true)->mode('inline')), + TableColumn::make()->name('sort')->label(__('admin-notice.sort'))->align('center')->quickEdit(Components::make()->sortControl('sort', __('admin-notice.sort'))->saveImmediately(true)), TableColumn::make()->name('published_at')->label(__('admin-notice.published_at')), $this->rowActions(), ]); diff --git a/app/Admin/Controllers/ArticleController.php b/app/Admin/Controllers/ArticleController.php index aad5786..8d64294 100644 --- a/app/Admin/Controllers/ArticleController.php +++ b/app/Admin/Controllers/ArticleController.php @@ -79,7 +79,7 @@ class ArticleController extends AdminController public function options() { - $list = $this->service->listQuery()->select(['id as value', 'title as label'])->without('category')->show()->get(); + $list = $this->service->listQuery()->select(['id as value', 'title as label'])->without('category')->get(); return $this->response()->success($list); } diff --git a/app/Admin/Controllers/BannerController.php b/app/Admin/Controllers/BannerController.php index b22021e..0550ac8 100644 --- a/app/Admin/Controllers/BannerController.php +++ b/app/Admin/Controllers/BannerController.php @@ -3,7 +3,7 @@ namespace App\Admin\Controllers; use Slowlyo\OwlAdmin\Renderers\{Page, Form}; -use Slowlyo\OwlAdmin\Renderers\{TableColumn, TextControl, Image, ImageControl, SelectControl, SwitchControl, DateTimeControl, InputKV, Status, Json}; +use Slowlyo\OwlAdmin\Renderers\{Component, TableColumn, TextControl, Image, Button, ImageControl, SelectControl, SwitchControl, DateTimeControl, InputKV, Status, Json}; use Slowlyo\OwlAdmin\Controllers\AdminController; use App\Services\Admin\BannerService; use App\Admin\Components; @@ -16,11 +16,13 @@ class BannerController extends AdminController { $crud = $this->baseCRUD() ->filterTogglable(false) - // ->headerToolbar([ - // $this->createButton(true), - // ...$this->baseHeaderToolBar(), - // ]) ->quickSaveItemApi(admin_url('quick-edit/banners/$id')) + ->filter($this->baseFilter()->actions([])->body([ + SelectControl::make()->name('place_id')->label(__('banner.place_id'))->source(admin_url('api/banner-places/options'))->size('md'), + TextControl::make()->name('name')->label(__('banner.name'))->size('md'), + Button::make()->label(__('admin.reset'))->actionType('clear-and-submit'), + Component::make()->setType('submit')->label(__('admin.search'))->level('primary'), + ])) ->columns([ TableColumn::make()->name('place.name')->label(__('banner.place_id')), TableColumn::make()->name('name')->label(__('banner.name')), diff --git a/app/Filters/ArticleCategoryFilter.php b/app/Filters/ArticleCategoryFilter.php index 33c70bc..a5e95ce 100644 --- a/app/Filters/ArticleCategoryFilter.php +++ b/app/Filters/ArticleCategoryFilter.php @@ -6,6 +6,8 @@ use EloquentFilter\ModelFilter; class ArticleCategoryFilter extends ModelFilter { + protected $drop_id = false; + /** * Related Models that have ModelFilters as well as the method on the ModelFilter * As [relationMethod => [input_key1, input_key2]]. @@ -28,4 +30,9 @@ class ArticleCategoryFilter extends ModelFilter { $this->where('path', 'like', '%-'.$v.'-%'); } + + public function level($v) + { + $this->where('level', $v); + } } diff --git a/app/Filters/ArticleFilter.php b/app/Filters/ArticleFilter.php index fd57422..13df6f7 100644 --- a/app/Filters/ArticleFilter.php +++ b/app/Filters/ArticleFilter.php @@ -6,6 +6,8 @@ use EloquentFilter\ModelFilter; class ArticleFilter extends ModelFilter { + protected $drop_id = false; + /** * Related Models that have ModelFilters as well as the method on the ModelFilter * As [relationMethod => [input_key1, input_key2]]. diff --git a/app/Filters/BannerFilter.php b/app/Filters/BannerFilter.php index 40eef0a..feef705 100644 --- a/app/Filters/BannerFilter.php +++ b/app/Filters/BannerFilter.php @@ -21,7 +21,7 @@ class BannerFilter extends ModelFilter public function key($v) { - $this->whereHas('place', fn ($q) => $q->whereIn('key', explode(',', $v))); + $this->whereHas('place', fn ($q) => $q->enable()->whereIn('key', explode(',', $v))); } public function name($v) diff --git a/app/Http/Controllers/Api/AdminNoticeController.php b/app/Http/Controllers/Api/AdminNoticeController.php new file mode 100644 index 0000000..691a668 --- /dev/null +++ b/app/Http/Controllers/Api/AdminNoticeController.php @@ -0,0 +1,31 @@ +all())->sort()->enable(); + + $list = $query->get(); + + return $this->json(AdminNoticeResource::collection($list)); + } + + public function show($id) + { + $info = AdminNotice::enable()->find($id); + + if (!$info) { + return $this->error('记录不存在'); + } + + return $this->json(AdminNoticeResource::make($info)); + } +} diff --git a/app/Http/Controllers/Api/ArticleController.php b/app/Http/Controllers/Api/ArticleController.php new file mode 100644 index 0000000..10049ed --- /dev/null +++ b/app/Http/Controllers/Api/ArticleController.php @@ -0,0 +1,48 @@ +all())->enable()->sort(); + + $list = $query->get(); + + return $this->json(ArticleCategoryResource::collection($list)); + } + + public function tree(Request $request) + { + $pid = $request->input('parent_id'); + $list = ArticleCategory::filter(['parent_path' => $pid])->enable()->sort()->select(['id', 'name', 'icon', 'parent_id'])->get()->toArray(); + + return $this->json(array2tree($list, $pid ?? 0)); + } + + public function index(Request $request) + { + $query = Article::filter($request->all())->enable()->sort(); + + $list = $query->paginate($request->input('per_page')); + + return $this->json(ArticleResource::collection($list)); + } + + public function show($id) + { + $info = Article::enable()->find($id); + + if (!$info) { + return $this->error('记录不存在'); + } + + return $this->json(ArticleResource::make($info)); + } +} diff --git a/app/Http/Controllers/Api/BannerController.php b/app/Http/Controllers/Api/BannerController.php new file mode 100644 index 0000000..85eb452 --- /dev/null +++ b/app/Http/Controllers/Api/BannerController.php @@ -0,0 +1,20 @@ +filter($request->all())->sort()->enable(); + + $list = $query->get(); + + return $this->json(BannerResource::collection($list)); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index a0a2a8a..359e510 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -6,8 +6,30 @@ use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; +use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Http\Resources\Json\ResourceCollection ; +use Illuminate\Support\Arr; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; + + public function json($data, $code = 0, $message = '') + { + if ($data instanceof ResourceCollection ) { + $data = $data->resource; + } + $result = ['data' => $data ?: '', 'status' => $code, 'msg' => $message]; + return response()->json($result); + } + + public function success($message = '', $data = null) + { + return $this->json($data, 0, $message); + } + + public function error($message = '', $data = null) + { + return $this->json($data, 1, $message); + } } diff --git a/app/Http/Resources/AdminNoticeResource.php b/app/Http/Resources/AdminNoticeResource.php new file mode 100644 index 0000000..1f4e5f3 --- /dev/null +++ b/app/Http/Resources/AdminNoticeResource.php @@ -0,0 +1,27 @@ + $this->id, + 'title' => $this->title, + 'content' => $this->content, + 'article_id' => $this->article_id, + 'sort' => $this->sort, + 'published_at' => $this->published_at ? $this->published_at->timestamp : '', + 'created_at' => $this->created_at->timestamp + ]; + } +} diff --git a/app/Http/Resources/ArticleCategoryResource.php b/app/Http/Resources/ArticleCategoryResource.php new file mode 100644 index 0000000..177488d --- /dev/null +++ b/app/Http/Resources/ArticleCategoryResource.php @@ -0,0 +1,27 @@ + $this->id, + 'icon' => $this->icon, + 'name' => $this->name, + 'parent_id' => $this->parent_id, + 'level' => $this->level, + 'path' => $this->path, + 'sort' => $this->sort, + ]; + } +} diff --git a/app/Http/Resources/ArticleResource.php b/app/Http/Resources/ArticleResource.php new file mode 100644 index 0000000..8eda41a --- /dev/null +++ b/app/Http/Resources/ArticleResource.php @@ -0,0 +1,29 @@ + $this->id, + 'title' => $this->title, + 'sub_title' => $this->sub_title, + 'category_id' => $this->category_id, + 'category' => ArticleCategoryResource::make($this->whenLoaded('category')), + 'content' => $this->content, + 'cover' => $this->cover, + 'published_at' => $this->published_at ? $this->published_at->timestamp : '', + 'created_at' => $this->created_at->timestamp + ]; + } +} diff --git a/app/Http/Resources/BannerResource.php b/app/Http/Resources/BannerResource.php new file mode 100644 index 0000000..9e82dde --- /dev/null +++ b/app/Http/Resources/BannerResource.php @@ -0,0 +1,29 @@ + $this->id, + 'place_id' => $this->place_id, + 'key' => data_get($this->whenLoaded('place'), 'key'), + 'name' => $this->name, + 'picture' => $this->picture, + 'link_config' => $this->link_config, + 'sort' => $this->sort, + 'published_at' => $this->published_at ? $this->published_at->timestamp : '', + 'created_at' => $this->created_at->timestamp, + ]; + } +} diff --git a/app/Models/AdminNotice.php b/app/Models/AdminNotice.php index 8e85f34..42eaf32 100644 --- a/app/Models/AdminNotice.php +++ b/app/Models/AdminNotice.php @@ -5,6 +5,9 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use EloquentFilter\Filterable; +/** + * 公告 + */ class AdminNotice extends Model { use Filterable; @@ -27,8 +30,13 @@ class AdminNotice extends Model return $q->orderBy('sort', 'desc')->orderBy('published_at', 'desc'); } - public function scopeShow($q) + public function scopeEnable($q) { return $q->where('is_enable', 1)->where('published_at', '<=', now()); } + + public function modelFilter() + { + return \App\Filters\AdminNoticeFilter::class; + } } diff --git a/app/Models/Article.php b/app/Models/Article.php index c847d54..c45a8d1 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -42,8 +42,13 @@ class Article extends Model return $q->orderBy('sort', 'desc')->orderBy('published_at', 'desc'); } - public function scopeShow($q) + public function scopeEnable($q) { return $q->where('is_enable', 1)->where('published_at', '<=', now()); } + + public function modelFilter() + { + return \App\Filters\ArticleFilter::class; + } } diff --git a/app/Models/ArticleCategory.php b/app/Models/ArticleCategory.php index efd75ca..42279c3 100644 --- a/app/Models/ArticleCategory.php +++ b/app/Models/ArticleCategory.php @@ -50,8 +50,13 @@ class ArticleCategory extends Model return $q->orderBy('sort', 'desc'); } - public function scopeShow($q) + public function scopeEnable($q) { return $q->where('is_enable', 1); } + + public function modelFilter() + { + return \App\Filters\ArticleCategoryFilter::class; + } } diff --git a/app/Models/Banner.php b/app/Models/Banner.php index 51df467..1f96f01 100644 --- a/app/Models/Banner.php +++ b/app/Models/Banner.php @@ -3,6 +3,7 @@ namespace App\Models; use Illuminate\Support\Str; +use App\Filters\BannerFilter; use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Storage; @@ -44,4 +45,9 @@ class Banner extends Model { return $q->where('is_enable', 1)->where('published_at', '<=', now()); } + + public function modelFilter() + { + return BannerFilter::class; + } } diff --git a/app/Models/BannerPlace.php b/app/Models/BannerPlace.php index a5c5a29..83a04f4 100644 --- a/app/Models/BannerPlace.php +++ b/app/Models/BannerPlace.php @@ -26,4 +26,9 @@ class BannerPlace extends Model { return $q->where('is_enable', 1); } + + public function scopeSort($q) + { + return $q->orderBy('id', 'desc'); + } } diff --git a/app/Services/Admin/BannerPlaceService.php b/app/Services/Admin/BannerPlaceService.php index bdd16c9..2e6968f 100644 --- a/app/Services/Admin/BannerPlaceService.php +++ b/app/Services/Admin/BannerPlaceService.php @@ -15,6 +15,23 @@ class BannerPlaceService extends BaseService protected string $modelFilterName = BannerPlaceFilter::class; + public function listQuery() + { + $model = $this->getModel(); + $filter = $this->getModelFilter(); + + $query = $this->query(); + if($this->withRelationships){ + $query->with($this->withRelationships); + } + + if ($filter) { + $query->filter(request()->input(), $filter); + } + + return $query->sort(); + } + public function delete(string $ids): mixed { $id = explode(',', $ids); diff --git a/routes/api.php b/routes/api.php index eb6fa48..09872b0 100644 --- a/routes/api.php +++ b/routes/api.php @@ -14,6 +14,12 @@ use Illuminate\Support\Facades\Route; | */ -Route::middleware('auth:sanctum')->get('/user', function (Request $request) { - return $request->user(); -}); +Route::get('banner', [\App\Http\Controllers\Api\BannerController::class, 'index']); + +Route::get('notice', [\App\Http\Controllers\Api\AdminNoticeController::class, 'index']); +Route::get('notice/{id}', [\App\Http\Controllers\Api\AdminNoticeController::class, 'show']); + +Route::get('article/category', [\App\Http\Controllers\Api\ArticleController::class, 'category']); +Route::get('article/tree', [\App\Http\Controllers\Api\ArticleController::class, 'tree']); +Route::get('article', [\App\Http\Controllers\Api\ArticleController::class, 'index']); +Route::get('article/{id}', [\App\Http\Controllers\Api\ArticleController::class, 'show']);