generated from panliang/owl-admin-starter
api.php
parent
37dc686af0
commit
feaad6fd2f
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ class CateRank extends Command
|
|||
}
|
||||
CateRankModel::insert($list);
|
||||
// 清空党支部当前得分
|
||||
PartyCate::update([
|
||||
PartyCate::where('current_score', '>', 0)->update([
|
||||
'current_score' => 0
|
||||
]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ class UserRank extends Command
|
|||
}
|
||||
UserRankModel::insert($list);
|
||||
// 清空党员当前得分
|
||||
PartyUser::update([
|
||||
PartyUser::where('current_score', '>', 0)->update([
|
||||
'current_score' => 0
|
||||
]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue