diff --git a/app/Admin/Controllers/AuthController.php b/app/Admin/Controllers/AuthController.php index 594631f..3099cb2 100644 --- a/app/Admin/Controllers/AuthController.php +++ b/app/Admin/Controllers/AuthController.php @@ -6,5 +6,11 @@ use Slowlyo\OwlAdmin\Controllers\AuthController as AdminAuthController; class AuthController extends AdminAuthController { + public function logout(): \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource + { + Cache::forget('parte_cate_id_permission'); + $this->guard()->user()->currentAccessToken()->delete(); + return $this->response()->successMessage(); + } } diff --git a/app/Admin/Controllers/PartyCateController.php b/app/Admin/Controllers/PartyCateController.php index fb915e6..e4528ce 100644 --- a/app/Admin/Controllers/PartyCateController.php +++ b/app/Admin/Controllers/PartyCateController.php @@ -34,12 +34,7 @@ class PartyCateController extends AdminController public function index() { - $user = Admin::user(); - // 判断当前账户拥有的支部权限 - if (!$user->can('party_cate_all')) { - $permissions = $user->allPermissions()->where(fn ($item) => Str::startsWith($item->slug, 'party_cate_') && $item->http_method)->pluck('http_method')->all(); - request()->offsetSet('ids', $permissions); - } + request()->offsetSet('ids', $this->service->catePermissions()); if ($this->actionOfGetData()) { return $this->response()->success($this->service->list()); } diff --git a/app/Admin/Controllers/PartyUserController.php b/app/Admin/Controllers/PartyUserController.php index 35e430c..e97abb1 100644 --- a/app/Admin/Controllers/PartyUserController.php +++ b/app/Admin/Controllers/PartyUserController.php @@ -2,7 +2,7 @@ namespace App\Admin\Controllers; -use App\Admin\Services\PartyUserService; +use App\Admin\Services\{PartyUserService, PartyCateService}; use App\Models\PartyCate; use Slowlyo\OwlAdmin\Controllers\AdminController; use Slowlyo\OwlAdmin\Renderers\Form; @@ -17,6 +17,23 @@ class PartyUserController extends AdminController protected $cateOptions; + public function index() + { + if (!request()->filled('cate_id')) { + $cateIds = PartyCateService::make()->catePermissions(); + request()->offsetSet('cate_id', $cateIds); + } + if ($this->actionOfGetData()) { + return $this->response()->success($this->service->list()); + } + + if ($this->actionOfExport()) { + return $this->export(); + } + + return $this->response()->success($this->list()); + } + public function list(): Page { $crud = $this->baseCRUD() @@ -79,7 +96,8 @@ class PartyUserController extends AdminController public function getCateOptions() { if (!$this->cateOptions) { - $this->cateOptions = PartyCate::select(['id as value', 'name as label'])->get(); + $cateIds = PartyCateService::make()->catePermissions(); + $this->cateOptions = PartyCate::select(['id as value', 'name as label'])->filter(['ids' => $cateIds])->get(); } return $this->cateOptions; diff --git a/app/Admin/Controllers/UserScoreController.php b/app/Admin/Controllers/UserScoreController.php index 3ddfbd4..90ee928 100644 --- a/app/Admin/Controllers/UserScoreController.php +++ b/app/Admin/Controllers/UserScoreController.php @@ -2,7 +2,7 @@ namespace App\Admin\Controllers; -use App\Admin\Services\UserScoreService; +use App\Admin\Services\{UserScoreService, PartyCateService}; use App\Enums\CheckStatus; use App\Exceptions\BaseException; use App\Models\PartyUser; @@ -23,6 +23,23 @@ class UserScoreController extends AdminController protected $cateOptions; + public function index() + { + if (!request()->filled('cate_id')) { + $cateIds = PartyCateService::make()->catePermissions(); + request()->offsetSet('cate_id', $cateIds); + } + if ($this->actionOfGetData()) { + return $this->response()->success($this->service->list()); + } + + if ($this->actionOfExport()) { + return $this->export(); + } + + return $this->response()->success($this->list()); + } + public function list(): Page { $crud = $this->baseCRUD() @@ -154,7 +171,8 @@ class UserScoreController extends AdminController public function getUserOptions() { if (!$this->userOptions) { - $this->userOptions = PartyUser::select(['id as value', 'name as label'])->get(); + $cateIds = PartyCateService::make()->catePermissions(); + $this->userOptions = PartyUser::select(['id as value', 'name as label'])->filter(['cate' => $cateIds])->get(); } return $this->userOptions; @@ -163,7 +181,8 @@ class UserScoreController extends AdminController public function getCateOptions() { if (!$this->cateOptions) { - $this->cateOptions = PartyCate::select(['id as value', 'name as label'])->get(); + $cateIds = PartyCateService::make()->catePermissions(); + $this->cateOptions = PartyCate::select(['id as value', 'name as label'])->filter(['ids' => $cateIds])->get(); } return $this->cateOptions; diff --git a/app/Admin/Services/PartyCateService.php b/app/Admin/Services/PartyCateService.php index 83410b2..4573448 100644 --- a/app/Admin/Services/PartyCateService.php +++ b/app/Admin/Services/PartyCateService.php @@ -10,6 +10,9 @@ use App\Models\UserRank; use App\Models\UserScore; use Slowlyo\OwlAdmin\Models\AdminPermission; use Slowlyo\OwlAdmin\Services\AdminPermissionService; +use Slowlyo\OwlAdmin\Admin; +use Illuminate\Support\Str; +use Illuminate\Support\Facades\Cache; class PartyCateService extends BaseService { @@ -31,17 +34,42 @@ class PartyCateService extends BaseService $info = $this->modelName::create($data); - // 创建权限 - $parent = AdminPermission::firstOrCreate(['slug' => 'party_cate'], ['name' => '党支部']); + $this->createPermission($info); + + return true; + } + + /** + * 创建权限 + */ + public function createPermission(PartyCate $info) + { + $parent = AdminPermission::firstOrCreate(['slug' => 'party_cate_list'], ['name' => '党支部']); AdminPermissionService::make()->store([ 'slug' => 'party_cate_' . $info->id, 'name' => $info->name, 'parent_id' => $parent->id, - 'order' => 1, + 'order' => 2, 'http_method' => $info->id, ]); + } - return true; + /** + * 当前用户拥有的支部权限 id + * + * @return array null: 全部权限, []: 支部id + */ + public function catePermissions() + { + $user = Admin::user(); + // 判断当前账户拥有的支部权限 + if ($user->can('party_cate_all')) { + return null; + } + $permissions = Cache::get('parte_cate_id_permission', function () use ($user) { + return $user->allPermissions()->where(fn ($item) => Str::startsWith($item->slug, 'party_cate_') && $item->http_method)->pluck('http_method')->all(); + }); + return $permissions; } public function preDelete(array $ids) diff --git a/app/Admin/routes.php b/app/Admin/routes.php index e48c149..0452706 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -14,6 +14,8 @@ Route::group([ $router->get('login', [App\Admin\Controllers\AuthController::class, 'loginPage']); + $router->get('logout', [App\Admin\Controllers\AuthController::class, 'logout']); + $router->resource('system/settings', \App\Admin\Controllers\SettingController::class); $router->resource('system/admin_roles', \App\Admin\Controllers\AdminRoleController::class); diff --git a/app/ModelFilters/PartyUserFilter.php b/app/ModelFilters/PartyUserFilter.php index aa4ad2a..ad82c7d 100644 --- a/app/ModelFilters/PartyUserFilter.php +++ b/app/ModelFilters/PartyUserFilter.php @@ -21,6 +21,6 @@ class PartyUserFilter extends ModelFilter public function cate($id) { - $this->where('cate_id', $id); + $this->whereIn('cate_id', is_array($id) ? $id : explode(',', $id)); } } diff --git a/app/ModelFilters/UserScoreFilter.php b/app/ModelFilters/UserScoreFilter.php index b454fa5..d501a71 100644 --- a/app/ModelFilters/UserScoreFilter.php +++ b/app/ModelFilters/UserScoreFilter.php @@ -27,7 +27,7 @@ class UserScoreFilter extends ModelFilter public function cate($id) { - $this->where('cate_id', $id); + $this->whereIn('cate_id', is_array($id) ? $id : explode(',', $id)); } public function checkStatus($id) diff --git a/app/Models/PartyCate.php b/app/Models/PartyCate.php index 20e72af..5012658 100644 --- a/app/Models/PartyCate.php +++ b/app/Models/PartyCate.php @@ -5,13 +5,14 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use App\Traits\HasDateTimeFormatter; use EloquentFilter\Filterable; +use Illuminate\Database\Eloquent\Factories\HasFactory; /** * 党支部 */ class PartyCate extends Model { - use HasDateTimeFormatter, Filterable; + use HasDateTimeFormatter, Filterable, HasFactory; protected $fillable = ['name', 'master_id', 'plan_id', 'remarks', 'current_score', 'score', 'scores']; diff --git a/database/factories/PartyCateFactory.php b/database/factories/PartyCateFactory.php index fe78424..0a5ba85 100644 --- a/database/factories/PartyCateFactory.php +++ b/database/factories/PartyCateFactory.php @@ -4,6 +4,7 @@ namespace Database\Factories; use App\Models\PartyCate; use Illuminate\Database\Eloquent\Factories\Factory; +use App\Admin\Services\PartyCateService; /** * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\PartyCate> @@ -24,4 +25,11 @@ class PartyCateFactory extends Factory 'name' => $faker->streetName, ]; } + + public function configure(): static + { + return $this->afterCreating(function (PartyCate $cate) { + PartyCateService::make()->createPermission($cate); + }); + } } diff --git a/database/seeders/PartyUserSeeder.php b/database/seeders/PartyUserSeeder.php index 98c07c4..c99b0cd 100644 --- a/database/seeders/PartyUserSeeder.php +++ b/database/seeders/PartyUserSeeder.php @@ -20,7 +20,7 @@ class PartyUserSeeder extends Seeder { PartyCate::truncate(); PartyUser::truncate(); - (new PartyCateFactory())->count(20)->create(); + PartyCate::factory()->count(20)->create(); (new PartyUserFactory())->count(100)->create([ 'scores' => [ 'score_cate_1' => 0, diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php index 5c0871b..ffd31bc 100644 --- a/database/seeders/PermissionSeeder.php +++ b/database/seeders/PermissionSeeder.php @@ -19,9 +19,7 @@ class PermissionSeeder extends Seeder DB::table('admin_role_permissions')->truncate(); $list = [ ['name' => '主页', 'slug' => 'dashboard'], - ['name' => '支部管理', 'slug' => 'party_cate', 'children' => [ - ['name' => '全部', 'slug' => 'party_cate_all'], - ]], + ['name' => '支部管理', 'slug' => 'party_cate'], ['name' => '党员管理', 'slug' => 'party_user'], ['name' => '审核评定', 'slug' => 'user_score'], ['name' => '信息管理', 'slug' => 'article'], @@ -37,6 +35,9 @@ class PermissionSeeder extends Seeder ['name' => '字典管理', 'slug' => 'keyword'], // ['name' => '配置管理', 'slug' => 'admin_setting'], ]], + ['name' => '支部权限', 'slug' => 'party_cate_list', 'children' => [ + ['name' => '全部', 'slug' => 'party_cate_all'], + ]], ]; $this->createByTree($list);