From feaad6fd2f725981f6e36221924c68b28673dde0 Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Fri, 8 Dec 2023 15:03:08 +0800 Subject: [PATCH] api.php --- app/Admin/Controllers/PartyCateController.php | 36 ++++---- app/Admin/Controllers/PartyUserController.php | 2 +- app/Admin/Services/BannerService.php | 11 ++- app/Console/Commands/CateRank.php | 2 +- app/Console/Commands/UserRank.php | 2 +- .../Controllers/Api/AccountController.php | 11 ++- .../Controllers/Api/ArticleController.php | 44 +++++++++ app/Http/Controllers/Api/BannerController.php | 18 ++++ .../Controllers/Api/FeedbackController.php | 21 +++++ .../Controllers/Api/KeywordController.php | 2 +- app/Http/Controllers/Api/RankController.php | 89 +++++++++++++++++++ app/Http/Resources/ArticleResource.php | 23 +++++ app/Http/Resources/BannerResource.php | 26 ++++++ app/ModelFilters/BannerFilter.php | 7 ++ app/Models/Article.php | 4 +- database/seeders/KeywordSeeder.php | 33 ++++++- database/seeders/PartyUserSeeder.php | 12 +-- routes/api.php | 12 +++ 18 files changed, 323 insertions(+), 32 deletions(-) create mode 100644 app/Http/Controllers/Api/ArticleController.php create mode 100644 app/Http/Controllers/Api/BannerController.php create mode 100644 app/Http/Controllers/Api/FeedbackController.php create mode 100644 app/Http/Controllers/Api/RankController.php create mode 100644 app/Http/Resources/ArticleResource.php create mode 100644 app/Http/Resources/BannerResource.php diff --git a/app/Admin/Controllers/PartyCateController.php b/app/Admin/Controllers/PartyCateController.php index 614165e..a73dd1e 100644 --- a/app/Admin/Controllers/PartyCateController.php +++ b/app/Admin/Controllers/PartyCateController.php @@ -74,20 +74,19 @@ class PartyCateController extends AdminController amisMake()->TableColumn()->name('remarks')->label(__('party_cate.remarks')), $this->rowActions([ amisMake()->LinkAction()->label('党员管理')->level('link')->link('/party-cate/${'.$primary.'}/user'), - amisMake()->DialogAction()->label('评星规则')->level('link')->level('link')->dialog( - amisMake()->Dialog()->size('lg')->title('')->body($this->baseForm() - ->title('') - ->onEvent([]) - ->redirect('') - ->initApi('/party-cate/${'.$primary.'}/article?_action=getData') - ->api('post:' . admin_url('/party-cate/${'.$primary.'}/article')) - ->body([ - amisMake()->TextControl()->name('title')->label(__('article.title'))->required(true), - amisMake()->ImageControl()->name('cover')->label(__('article.cover'))->autoUpload(true), - Components::make()->fuEditorControl('content', __('article.content')), - ]) - ) - ), + // 弹窗修改文章, initApi 参数请求次数有问题 + // amisMake()->DialogAction()->label('评星规则')->level('link')->level('link')->dialog( + // amisMake()->Dialog()->size('lg')->title('')->body( + // amisMake()->Form() + // ->initApi('/party-cate/${'.$primary.'}/article?_action=getData') + // ->api('post:' . admin_url('/party-cate/${'.$primary.'}/article')) + // ->body([ + // amisMake()->TextControl()->name('title')->label(__('article.title'))->required(true), + // amisMake()->ImageControl()->name('cover')->label(__('article.cover'))->autoUpload(true), + // Components::make()->fuEditorControl('content', __('article.content')), + // ]) + // ) + // ), amisMake()->LinkAction()->label('审核评定')->level('link')->link('/party-cate/${'.$primary.'}/score'), amisMake()->LinkAction()->label('排名')->level('link')->link('/party-cate/${'.$primary.'}/rank'), $this->rowShowButton(), @@ -186,8 +185,13 @@ class PartyCateController extends AdminController return $this->response()->success(Article::where('party_cate_id', $cid)->first()); } $service = ArticleService::make(); - $data = $service->resloveData($request->all()); - Article::updateOrCreate(['party_cate_id' => $cid, 'category_id' => Keyword::where('key', 'category_2')->value('id')], $data); + $params = $request->all(); + $category_id = Keyword::where('key', 'category_2')->value('id'); + $data = $service->resloveData(array_merge($params, [ + 'party_cate_id' => $cid, + 'category_id' => $category_id + ])); + Article::updateOrCreate(['party_cate_id' => $cid, 'category_id' => $category_id], $data); return $this->response()->success(); } diff --git a/app/Admin/Controllers/PartyUserController.php b/app/Admin/Controllers/PartyUserController.php index 8e53e12..af24ece 100644 --- a/app/Admin/Controllers/PartyUserController.php +++ b/app/Admin/Controllers/PartyUserController.php @@ -50,7 +50,7 @@ class PartyUserController extends AdminController public function form($edit): Form { return $this->baseForm()->title('')->body([ - amisMake()->SelectControl()->name('cate_id')->label(__('party_user.cate_id'))->options($this->getCateOptions()), + amisMake()->SelectControl()->name('cate_id')->label(__('party_user.cate_id'))->options($this->getCateOptions())->required(), amisMake()->TextControl()->name('name')->label(__('party_user.name'))->required(), amisMake()->ImageControl()->name('avatar')->label(__('party_user.avatar')), amisMake()->TextControl()->name('username')->label(__('party_user.username'))->required(), diff --git a/app/Admin/Services/BannerService.php b/app/Admin/Services/BannerService.php index 887c204..7662dcf 100644 --- a/app/Admin/Services/BannerService.php +++ b/app/Admin/Services/BannerService.php @@ -3,7 +3,7 @@ namespace App\Admin\Services; use App\ModelFilters\BannerFilter; -use App\Models\Banner; +use App\Models\{Banner, Keyword}; class BannerService extends BaseService { @@ -29,4 +29,13 @@ class BannerService extends BaseService return $query->orderBy('place_id')->sort(); } + + public function resloveData($data, $model = null) + { + $place = data_get($data, 'place_id'); + if ($place) { + $data['path'] = Keyword::where('id', $place)->value('path') . $place. '-'; + } + return $data; + } } diff --git a/app/Console/Commands/CateRank.php b/app/Console/Commands/CateRank.php index 78975bb..1c5111d 100644 --- a/app/Console/Commands/CateRank.php +++ b/app/Console/Commands/CateRank.php @@ -52,7 +52,7 @@ class CateRank extends Command } CateRankModel::insert($list); // 清空党支部当前得分 - PartyCate::update([ + PartyCate::where('current_score', '>', 0)->update([ 'current_score' => 0 ]); } diff --git a/app/Console/Commands/UserRank.php b/app/Console/Commands/UserRank.php index 7356c58..736f4a6 100644 --- a/app/Console/Commands/UserRank.php +++ b/app/Console/Commands/UserRank.php @@ -55,7 +55,7 @@ class UserRank extends Command } UserRankModel::insert($list); // 清空党员当前得分 - PartyUser::update([ + PartyUser::where('current_score', '>', 0)->update([ 'current_score' => 0 ]); } diff --git a/app/Http/Controllers/Api/AccountController.php b/app/Http/Controllers/Api/AccountController.php index 450be21..a3eb1d6 100644 --- a/app/Http/Controllers/Api/AccountController.php +++ b/app/Http/Controllers/Api/AccountController.php @@ -12,7 +12,16 @@ class AccountController extends Controller { $user = auth('api')->user(); - return $this->response()->success($user); + return $this->response()->success([ + 'id' => $user->id, + 'name' => $user->name, + 'avatar' => $user->avatar, + 'cate_id' => $user->cate_id, + 'cate_name' => $user->cate?->name, + 'current_score' => $user->current_score, + 'score' => $user->score, + 'scores' => $user->scores, + ]); } public function update(Request $request) diff --git a/app/Http/Controllers/Api/ArticleController.php b/app/Http/Controllers/Api/ArticleController.php new file mode 100644 index 0000000..583a0be --- /dev/null +++ b/app/Http/Controllers/Api/ArticleController.php @@ -0,0 +1,44 @@ +first(); + if (!$category) { + return $this->response()->error('文章不存在'); + } + + $article = Article::where('category_id', $category->id)->publish()->sort()->first(); + if (!$article) { + return $this->response()->success([]); + } + + return $this->response()->success(ArticleResource::make($article)); + } + + // 进阶指标 + public function cate() + { + $user = auth('api')->user(); + $category = Keyword::where('key', 'category_2')->first(); + if (!$category) { + return $this->response()->error('文章不存在'); + } + + $article = Article::where('category_id', $category->id)->where('party_cate_id', $user->cate_id)->publish()->sort()->first(); + if (!$article) { + return $this->response()->success([]); + } + + return $this->response()->success(ArticleResource::make($article)); + } +} diff --git a/app/Http/Controllers/Api/BannerController.php b/app/Http/Controllers/Api/BannerController.php new file mode 100644 index 0000000..8f6d0c2 --- /dev/null +++ b/app/Http/Controllers/Api/BannerController.php @@ -0,0 +1,18 @@ +all())->enable()->sort()->get(); + + return $this->response()->success(BannerResource::collection($list)); + } +} diff --git a/app/Http/Controllers/Api/FeedbackController.php b/app/Http/Controllers/Api/FeedbackController.php new file mode 100644 index 0000000..e5bdbd9 --- /dev/null +++ b/app/Http/Controllers/Api/FeedbackController.php @@ -0,0 +1,21 @@ +validate([ + 'content' => 'required', + ]); + + Feedback::create($request->all()); + + return $this->response()->success(); + } +} diff --git a/app/Http/Controllers/Api/KeywordController.php b/app/Http/Controllers/Api/KeywordController.php index 806f56b..dc9f778 100644 --- a/app/Http/Controllers/Api/KeywordController.php +++ b/app/Http/Controllers/Api/KeywordController.php @@ -11,7 +11,7 @@ class KeywordController extends Controller { public function index(Request $request) { - $list = Keyword::filter($request->all())->get(); + $list = Keyword::filter($request->all())->sort()->get(); return $this->response()->success(KeywordResource::collection($list)); } diff --git a/app/Http/Controllers/Api/RankController.php b/app/Http/Controllers/Api/RankController.php new file mode 100644 index 0000000..318da59 --- /dev/null +++ b/app/Http/Controllers/Api/RankController.php @@ -0,0 +1,89 @@ +validate([ + // user: 党员, cate: 党支部 + 'type' => ['required', Rule::in(['user', 'cate'])] + ]); + $type = $request->input('type', 'user'); + $query = match($type) { + 'user' => PartyUser::query(), + 'cate' => PartyCate::query(), + }; + $query->orderBy('current_score', 'desc'); + if ($request->filled('limit')) { + $query->limit($request->input('limit')); + } + $list = $query->get(); + $rankList = []; + foreach ($list as $index => $item) { + $rankList[] = [ + 'id' => $item->id, + 'name' => $item->name, + 'rank' => $index + 1, + 'score' => $item->current_score, + ]; + } + + return $this->response()->success($rankList); + } + + // 获取已有的期数 + public function dates(Request $request) + { + $request->validate([ + // user: 党员排名期数, cate: 党支部排名期数 + 'type' => ['required', Rule::in(['user', 'cate'])] + ]); + $type = $request->input('type', 'user'); + $query = match($type) { + 'user' => UserRank::query(), + 'cate' => CateRank::query(), + }; + $list = $query->select('sn')->groupBy('sn')->pluck('sn'); + + return $this->response()->success($list); + } + + // 党员其他季度的排名记录 + public function list(Request $request) + { + $request->validate([ + // 期数 + 'sn' => 'required', + // user: 党员, cate: 党支部 + 'type' => ['required', Rule::in(['user', 'cate'])] + ]); + $type = $request->input('type', 'user'); + $query = match($type) { + 'user' => UserRank::query(), + 'cate' => CateRank::query(), + }; + $list = $query->with([$type])->where('sn', $request->input('sn'))->orderBy('score', 'desc')->get(); + $rankList = []; + foreach ($list as $index => $item) { + $rankList[] = [ + 'id' => $item->id, + 'name' => match($type) { + 'user' => $item->user?->name, + 'cate' => $item->cate?->name, + }, + 'rank' => $index + 1, + 'score' => $item->score, + ]; + } + + return $this->response()->success($rankList); + } +} diff --git a/app/Http/Resources/ArticleResource.php b/app/Http/Resources/ArticleResource.php new file mode 100644 index 0000000..ca29173 --- /dev/null +++ b/app/Http/Resources/ArticleResource.php @@ -0,0 +1,23 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $this->id, + 'title' => $this->title, + 'content' => $this->content, + ]; + } +} diff --git a/app/Http/Resources/BannerResource.php b/app/Http/Resources/BannerResource.php new file mode 100644 index 0000000..6e9198d --- /dev/null +++ b/app/Http/Resources/BannerResource.php @@ -0,0 +1,26 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $this->id, + 'title' => $this->title, + 'picture' => $this->picture, + 'description' => $this->description, + 'place_id' => $this->place_id, + 'link_config' => $this->link_config, + ]; + } +} diff --git a/app/ModelFilters/BannerFilter.php b/app/ModelFilters/BannerFilter.php index e54e1d8..d9bf35a 100644 --- a/app/ModelFilters/BannerFilter.php +++ b/app/ModelFilters/BannerFilter.php @@ -3,6 +3,7 @@ namespace App\ModelFilters; use EloquentFilter\ModelFilter; +use App\Models\Keyword; class BannerFilter extends ModelFilter { @@ -23,4 +24,10 @@ class BannerFilter extends ModelFilter { $this->whereLike('title', $title); } + + public function key($key) + { + $ids = Keyword::whereIn('key', is_array($key) ? $key : explode(',', $key))->pluck('id'); + $this->whereIn('place_id', $ids); + } } diff --git a/app/Models/Article.php b/app/Models/Article.php index 2b99cfc..08ca5c1 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -43,11 +43,11 @@ class Article extends Model public function scopeSort($q) { - return $q->orderBy('sort', 'asc')->latest('published_at')->latest('id'); + $q->orderBy('sort', 'asc')->latest('published_at')->latest('id'); } public function scopePublish($q) { - return $q->where('published_at', '<=', now())->where('is_enable', 1); + $q->where('published_at', '<=', now())->where('is_enable', 1); } } diff --git a/database/seeders/KeywordSeeder.php b/database/seeders/KeywordSeeder.php index 0970bb1..aee6255 100644 --- a/database/seeders/KeywordSeeder.php +++ b/database/seeders/KeywordSeeder.php @@ -2,7 +2,8 @@ namespace Database\Seeders; -use App\Models\Keyword; +use App\Models\{Keyword, Banner}; +use App\Admin\Services\{KeywordService, BannerService}; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; use Illuminate\Support\Arr; @@ -14,6 +15,7 @@ class KeywordSeeder extends Seeder */ public function run(): void { + $now = now(); Keyword::truncate(); $list = [ @@ -26,6 +28,7 @@ class KeywordSeeder extends Seeder ]], ['key' => 'banner', 'name' => '广告位', 'children' => [ ['key' => 'banner_1', 'name' => '首页广告'], + ['key' => 'banner_2', 'name' => '考核填报'], ]], ['key' => 'category', 'name' => '文章分类', 'children' => [ ['key' => 'category_1', 'name' => '共性指标'], @@ -34,6 +37,8 @@ class KeywordSeeder extends Seeder ]; $this->createByTree($list); + + $this->createBanner(); } protected function createByTree($list, $parent = null) @@ -43,11 +48,35 @@ class KeywordSeeder extends Seeder $params['sort'] = $index + 1; $params['parent_id'] = $parent ? $parent->id : 0; $params['key'] = data_get($item, 'key', data_get($parent, 'key') . '_' . $params['sort']); - $model = Keyword::create($params); + $model = Keyword::create(KeywordService::make()->resloveData($params)); if ($children = data_get($item, 'children')) { $this->createByTree($children, $model); } } } + + protected function createBanner() + { + Banner::truncate(); + $banners = [ + 'banner_1' => [ + ['picture' => 'http://www.gzcsxy.cn/ewebeditor/uploadimages/WebLink/20231017160751707-767.jpg'] + ], + 'banner_2' => [ + ['picture' => 'http://www.gzcsxy.cn/ewebeditor/uploadimages/WebLink/20221027123658712-869.jpg'] + ], + ]; + foreach ($banners as $key => $values) { + $place = Keyword::where('key', $key)->first(); + foreach ($values as $index => $v) { + BannerService::make()->store(array_merge([ + 'title' => $place->name, + 'place_id' => $place->id, + 'published_at' => $now, + 'sort' => $index + 1, + ], $v)); + } + } + } } diff --git a/database/seeders/PartyUserSeeder.php b/database/seeders/PartyUserSeeder.php index 0a32b64..85301c0 100644 --- a/database/seeders/PartyUserSeeder.php +++ b/database/seeders/PartyUserSeeder.php @@ -18,12 +18,12 @@ class PartyUserSeeder extends Seeder */ public function run(): void { - PartyCate::truncate(); - PartyUser::truncate(); - (new PartyCateFactory())->count(20)->create(); - (new PartyUserFactory())->count(100)->create(); + // PartyCate::truncate(); + // PartyUser::truncate(); + // (new PartyCateFactory())->count(20)->create(); + // (new PartyUserFactory())->count(100)->create(); - // UserScore::truncate(); - // UserScore::factory()->count(100)->create(); + UserScore::truncate(); + UserScore::factory()->count(100)->create(); } } diff --git a/routes/api.php b/routes/api.php index 8a05f13..aafa580 100644 --- a/routes/api.php +++ b/routes/api.php @@ -16,10 +16,22 @@ use Illuminate\Support\Facades\Route; Route::post('web/upload', [\App\Http\Controllers\WebController::class, 'upload']); +Route::get('keyword', [\App\Http\Controllers\Api\KeywordController::class, 'index']); + Route::post('login', [\App\Http\Controllers\Api\AuthController::class, 'login']); +Route::get('rank', [\App\Http\Controllers\Api\RankController::class, 'index']); +Route::get('rank/list', [\App\Http\Controllers\Api\RankController::class, 'list']); +Route::get('rank/dates', [\App\Http\Controllers\Api\RankController::class, 'dates']); + +Route::get('article/common', [\App\Http\Controllers\Api\ArticleController::class, 'common']); + +Route::post('feedback', [\App\Http\Controllers\Api\FeedbackController::class, 'store']); + Route::group(['middleware' => 'auth:api'], function () { Route::get('logout', [\App\Http\Controllers\Api\AccountController::class, 'logout']); Route::get('user/profile', [\App\Http\Controllers\Api\AccountController::class, 'profile']); Route::post('user/profile', [\App\Http\Controllers\Api\AccountController::class, 'update']); + + Route::get('article/cate', [\App\Http\Controllers\Api\ArticleController::class, 'cate']); });