1
0
Fork 0
master
panliang 2023-12-08 15:03:08 +08:00
parent 37dc686af0
commit feaad6fd2f
18 changed files with 323 additions and 32 deletions

View File

@ -74,20 +74,19 @@ class PartyCateController extends AdminController
amisMake()->TableColumn()->name('remarks')->label(__('party_cate.remarks')), amisMake()->TableColumn()->name('remarks')->label(__('party_cate.remarks')),
$this->rowActions([ $this->rowActions([
amisMake()->LinkAction()->label('党员管理')->level('link')->link('/party-cate/${'.$primary.'}/user'), amisMake()->LinkAction()->label('党员管理')->level('link')->link('/party-cate/${'.$primary.'}/user'),
amisMake()->DialogAction()->label('评星规则')->level('link')->level('link')->dialog( // 弹窗修改文章, initApi 参数请求次数有问题
amisMake()->Dialog()->size('lg')->title('')->body($this->baseForm() // amisMake()->DialogAction()->label('评星规则')->level('link')->level('link')->dialog(
->title('') // amisMake()->Dialog()->size('lg')->title('')->body(
->onEvent([]) // amisMake()->Form()
->redirect('') // ->initApi('/party-cate/${'.$primary.'}/article?_action=getData')
->initApi('/party-cate/${'.$primary.'}/article?_action=getData') // ->api('post:' . admin_url('/party-cate/${'.$primary.'}/article'))
->api('post:' . admin_url('/party-cate/${'.$primary.'}/article')) // ->body([
->body([ // amisMake()->TextControl()->name('title')->label(__('article.title'))->required(true),
amisMake()->TextControl()->name('title')->label(__('article.title'))->required(true), // amisMake()->ImageControl()->name('cover')->label(__('article.cover'))->autoUpload(true),
amisMake()->ImageControl()->name('cover')->label(__('article.cover'))->autoUpload(true), // Components::make()->fuEditorControl('content', __('article.content')),
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.'}/score'),
amisMake()->LinkAction()->label('排名')->level('link')->link('/party-cate/${'.$primary.'}/rank'), amisMake()->LinkAction()->label('排名')->level('link')->link('/party-cate/${'.$primary.'}/rank'),
$this->rowShowButton(), $this->rowShowButton(),
@ -186,8 +185,13 @@ class PartyCateController extends AdminController
return $this->response()->success(Article::where('party_cate_id', $cid)->first()); return $this->response()->success(Article::where('party_cate_id', $cid)->first());
} }
$service = ArticleService::make(); $service = ArticleService::make();
$data = $service->resloveData($request->all()); $params = $request->all();
Article::updateOrCreate(['party_cate_id' => $cid, 'category_id' => Keyword::where('key', 'category_2')->value('id')], $data); $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(); return $this->response()->success();
} }

View File

@ -50,7 +50,7 @@ class PartyUserController extends AdminController
public function form($edit): Form public function form($edit): Form
{ {
return $this->baseForm()->title('')->body([ 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()->TextControl()->name('name')->label(__('party_user.name'))->required(),
amisMake()->ImageControl()->name('avatar')->label(__('party_user.avatar')), amisMake()->ImageControl()->name('avatar')->label(__('party_user.avatar')),
amisMake()->TextControl()->name('username')->label(__('party_user.username'))->required(), amisMake()->TextControl()->name('username')->label(__('party_user.username'))->required(),

View File

@ -3,7 +3,7 @@
namespace App\Admin\Services; namespace App\Admin\Services;
use App\ModelFilters\BannerFilter; use App\ModelFilters\BannerFilter;
use App\Models\Banner; use App\Models\{Banner, Keyword};
class BannerService extends BaseService class BannerService extends BaseService
{ {
@ -29,4 +29,13 @@ class BannerService extends BaseService
return $query->orderBy('place_id')->sort(); 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;
}
} }

View File

@ -52,7 +52,7 @@ class CateRank extends Command
} }
CateRankModel::insert($list); CateRankModel::insert($list);
// 清空党支部当前得分 // 清空党支部当前得分
PartyCate::update([ PartyCate::where('current_score', '>', 0)->update([
'current_score' => 0 'current_score' => 0
]); ]);
} }

View File

@ -55,7 +55,7 @@ class UserRank extends Command
} }
UserRankModel::insert($list); UserRankModel::insert($list);
// 清空党员当前得分 // 清空党员当前得分
PartyUser::update([ PartyUser::where('current_score', '>', 0)->update([
'current_score' => 0 'current_score' => 0
]); ]);
} }

View File

@ -12,7 +12,16 @@ class AccountController extends Controller
{ {
$user = auth('api')->user(); $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) public function update(Request $request)

View File

@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\{Article, Keyword};
use App\Http\Resources\ArticleResource;
class ArticleController extends Controller
{
// 共性指标
public function common()
{
$category = Keyword::where('key', 'category_1')->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));
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Banner;
use App\Http\Resources\BannerResource;
class BannerController extends Controller
{
public function index(Request $request)
{
$list = Banner::filter($request->all())->enable()->sort()->get();
return $this->response()->success(BannerResource::collection($list));
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Feedback;
class FeedbackController extends Controller
{
public function store(Request $request)
{
$request->validate([
'content' => 'required',
]);
Feedback::create($request->all());
return $this->response()->success();
}
}

View File

@ -11,7 +11,7 @@ class KeywordController extends Controller
{ {
public function index(Request $request) 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)); return $this->response()->success(KeywordResource::collection($list));
} }

View File

@ -0,0 +1,89 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\{PartyUser, PartyCate, UserRank, CateRank};
use Illuminate\Validation\Rule;
class RankController extends Controller
{
// 本季度排名
public function index(Request $request)
{
$request->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);
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ArticleResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
];
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class BannerResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
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,
];
}
}

View File

@ -3,6 +3,7 @@
namespace App\ModelFilters; namespace App\ModelFilters;
use EloquentFilter\ModelFilter; use EloquentFilter\ModelFilter;
use App\Models\Keyword;
class BannerFilter extends ModelFilter class BannerFilter extends ModelFilter
{ {
@ -23,4 +24,10 @@ class BannerFilter extends ModelFilter
{ {
$this->whereLike('title', $title); $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);
}
} }

View File

@ -43,11 +43,11 @@ class Article extends Model
public function scopeSort($q) 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) public function scopePublish($q)
{ {
return $q->where('published_at', '<=', now())->where('is_enable', 1); $q->where('published_at', '<=', now())->where('is_enable', 1);
} }
} }

View File

@ -2,7 +2,8 @@
namespace Database\Seeders; 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\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
@ -14,6 +15,7 @@ class KeywordSeeder extends Seeder
*/ */
public function run(): void public function run(): void
{ {
$now = now();
Keyword::truncate(); Keyword::truncate();
$list = [ $list = [
@ -26,6 +28,7 @@ class KeywordSeeder extends Seeder
]], ]],
['key' => 'banner', 'name' => '广告位', 'children' => [ ['key' => 'banner', 'name' => '广告位', 'children' => [
['key' => 'banner_1', 'name' => '首页广告'], ['key' => 'banner_1', 'name' => '首页广告'],
['key' => 'banner_2', 'name' => '考核填报'],
]], ]],
['key' => 'category', 'name' => '文章分类', 'children' => [ ['key' => 'category', 'name' => '文章分类', 'children' => [
['key' => 'category_1', 'name' => '共性指标'], ['key' => 'category_1', 'name' => '共性指标'],
@ -34,6 +37,8 @@ class KeywordSeeder extends Seeder
]; ];
$this->createByTree($list); $this->createByTree($list);
$this->createBanner();
} }
protected function createByTree($list, $parent = null) protected function createByTree($list, $parent = null)
@ -43,11 +48,35 @@ class KeywordSeeder extends Seeder
$params['sort'] = $index + 1; $params['sort'] = $index + 1;
$params['parent_id'] = $parent ? $parent->id : 0; $params['parent_id'] = $parent ? $parent->id : 0;
$params['key'] = data_get($item, 'key', data_get($parent, 'key') . '_' . $params['sort']); $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')) { if ($children = data_get($item, 'children')) {
$this->createByTree($children, $model); $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));
}
}
}
} }

View File

@ -18,12 +18,12 @@ class PartyUserSeeder extends Seeder
*/ */
public function run(): void public function run(): void
{ {
PartyCate::truncate(); // PartyCate::truncate();
PartyUser::truncate(); // PartyUser::truncate();
(new PartyCateFactory())->count(20)->create(); // (new PartyCateFactory())->count(20)->create();
(new PartyUserFactory())->count(100)->create(); // (new PartyUserFactory())->count(100)->create();
// UserScore::truncate(); UserScore::truncate();
// UserScore::factory()->count(100)->create(); UserScore::factory()->count(100)->create();
} }
} }

View File

@ -16,10 +16,22 @@ use Illuminate\Support\Facades\Route;
Route::post('web/upload', [\App\Http\Controllers\WebController::class, 'upload']); 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::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::group(['middleware' => 'auth:api'], function () {
Route::get('logout', [\App\Http\Controllers\Api\AccountController::class, 'logout']); Route::get('logout', [\App\Http\Controllers\Api\AccountController::class, 'logout']);
Route::get('user/profile', [\App\Http\Controllers\Api\AccountController::class, 'profile']); Route::get('user/profile', [\App\Http\Controllers\Api\AccountController::class, 'profile']);
Route::post('user/profile', [\App\Http\Controllers\Api\AccountController::class, 'update']); Route::post('user/profile', [\App\Http\Controllers\Api\AccountController::class, 'update']);
Route::get('article/cate', [\App\Http\Controllers\Api\ArticleController::class, 'cate']);
}); });