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')),
$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();
}

View File

@ -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(),

View File

@ -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;
}
}

View File

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

View File

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

View File

@ -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)

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)
{
$list = Keyword::filter($request->all())->get();
$list = Keyword::filter($request->all())->sort()->get();
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;
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);
}
}

View File

@ -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);
}
}

View File

@ -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));
}
}
}
}

View File

@ -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();
}
}

View File

@ -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']);
});