From 47a76af4b0881abb40a84a1645520588e4285b0b Mon Sep 17 00:00:00 2001 From: JaguarJack Date: Fri, 16 Dec 2022 18:30:36 +0800 Subject: [PATCH] new feature --- modules/Options/Repository/Controllers.php | 4 +- modules/Options/Repository/Modules.php | 4 +- .../Controllers/PermissionsController.php | 8 +- .../Http/Controllers/RolesController.php | 10 +- .../Permissions/Models/PermissionsModel.php | 37 ++++++ modules/Permissions/Models/RolesModel.php | 15 ++- .../views/permissions/form/create.vue | 2 +- .../Permissions/views/permissions/index.vue | 8 +- .../Permissions/views/roles/form/create.vue | 106 +++++++++++++----- modules/Permissions/views/roles/index.vue | 13 ++- .../User/Http/Controllers/UserController.php | 20 ++-- .../admin/layout/components/Menu/index.vue | 2 - .../admin/stores/modules/user/permissions.ts | 2 - 13 files changed, 170 insertions(+), 61 deletions(-) diff --git a/modules/Options/Repository/Controllers.php b/modules/Options/Repository/Controllers.php index 5f828aa..50c38f6 100644 --- a/modules/Options/Repository/Controllers.php +++ b/modules/Options/Repository/Controllers.php @@ -17,9 +17,9 @@ class Controllers implements OptionInterface foreach ($controllerFiles as $controllerFile) { $controllers[] = [ - 'label' => Str::of(File::name($controllerFile))->remove('Controller'), + 'label' => Str::of(File::name($controllerFile))->lcfirst()->remove('Controller'), - 'value' => Str::of(File::name($controllerFile))->remove('Controller'), + 'value' => Str::of(File::name($controllerFile))->lcfirst()->remove('Controller'), ]; } } diff --git a/modules/Options/Repository/Modules.php b/modules/Options/Repository/Modules.php index b9890cd..37fc14d 100644 --- a/modules/Options/Repository/Modules.php +++ b/modules/Options/Repository/Modules.php @@ -14,9 +14,9 @@ class Modules implements OptionInterface ->each(function ($module) use (&$modules) { $modules[] = [ - 'label' => $module['name'], + 'label' => $module['title'], - 'value' => $module['path'] + 'value' => $module['name'] ]; }); diff --git a/modules/Permissions/Http/Controllers/PermissionsController.php b/modules/Permissions/Http/Controllers/PermissionsController.php index 3412a3d..5d2ea14 100644 --- a/modules/Permissions/Http/Controllers/PermissionsController.php +++ b/modules/Permissions/Http/Controllers/PermissionsController.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Modules\Permissions\Http\Controllers; use Catch\Base\CatchController as Controller; +use Modules\Permissions\Enums\MenuType; use Modules\Permissions\Models\PermissionsModel; use Illuminate\Http\Request; @@ -16,12 +17,13 @@ class PermissionsController extends Controller } /** - * @param Request $request * @return mixed */ - public function index(Request $request): mixed + public function index(): mixed { - return $this->model->getList(); + return $this->model->setBeforeGetList(function ($query){ + return $query->with('actions')->whereIn('type', [MenuType::Top->value(), MenuType::Menu->value]); + })->getList(); } public function store(Request $request) diff --git a/modules/Permissions/Http/Controllers/RolesController.php b/modules/Permissions/Http/Controllers/RolesController.php index b6c485b..6a7b525 100644 --- a/modules/Permissions/Http/Controllers/RolesController.php +++ b/modules/Permissions/Http/Controllers/RolesController.php @@ -20,7 +20,9 @@ class RolesController extends Controller */ public function index(): mixed { - return $this->model->getList(); + return $this->model->setBeforeGetList(function ($query){ + return $query->with(['permissions' => function($query){ $query->select('id');}]); + })->getList(); } public function store(RoleRequest $request) @@ -30,7 +32,11 @@ class RolesController extends Controller public function show($id) { - return $this->model->firstBy($id); + $role = $this->model->firstBy($id); + + $role->setAttribute('permissions', $role->permissions()->get()->toTree()); + + return $role; } public function update($id, RoleRequest $request) diff --git a/modules/Permissions/Models/PermissionsModel.php b/modules/Permissions/Models/PermissionsModel.php index 1c22f62..55a91f7 100644 --- a/modules/Permissions/Models/PermissionsModel.php +++ b/modules/Permissions/Models/PermissionsModel.php @@ -6,6 +6,7 @@ namespace Modules\Permissions\Models; use Catch\Base\CatchModel as Model; use Catch\Enums\Status; +use Illuminate\Database\Eloquent\Relations\HasMany; use Modules\Permissions\Enums\MenuStatus; use Modules\Permissions\Enums\MenuType; @@ -51,8 +52,11 @@ class PermissionsModel extends Model */ public array $searchable = [ 'permission_name' => 'like', + + 'role_id' => '=' ]; + protected $hidden = ['pivot']; /** * @var bool @@ -88,4 +92,37 @@ class PermissionsModel extends Model { return $this->type == MenuType::Action; } + + /** + * actions + * + * @return HasMany + */ + public function actions(): HasMany + { + return $this->hasMany(self::class, 'parent_id', 'id')->where('type', MenuType::Action); + } + + /** + * + * @param array $data + * @return bool + */ + public function storeBy(array $data): bool + { + $model = $this->fill($data); + + if ($model->isAction()) { + $parentMenu = $this->firstBy($model->parent_id, 'id'); + $model->setAttribute('module', $parentMenu->module); + $model->setAttribute('permission_mark', $parentMenu->permission_mark . '@' . $data['permission_mark']); + $model->setAttribute('route', ''); + $model->setAttribute('icon', ''); + $model->setAttribute('component', ''); + $model->setAttribute('redirect', ''); + return $model->setCreatorId()->save(); + } else { + return parent::storeBy($data); + } + } } diff --git a/modules/Permissions/Models/RolesModel.php b/modules/Permissions/Models/RolesModel.php index 382ae93..4e25cc1 100644 --- a/modules/Permissions/Models/RolesModel.php +++ b/modules/Permissions/Models/RolesModel.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Modules\Permissions\Models; use Catch\Base\CatchModel as Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; /** * @property $role_name @@ -33,6 +34,7 @@ class RolesModel extends Model */ protected array $form = ['role_name','identify','parent_id','description','data_range']; + protected array $formRelations = ['permissions']; /** * @var bool @@ -44,8 +46,19 @@ class RolesModel extends Model */ public array $searchable = [ 'role_name' => 'like', + + 'id' => '<>' ]; - protected bool $asTree = true; + + + /** + * + * @return BelongsToMany + */ + public function permissions(): BelongsToMany + { + return $this->belongsToMany(PermissionsModel::class, 'role_has_permissions', 'role_id', 'permission_id'); + } } diff --git a/modules/Permissions/views/permissions/form/create.vue b/modules/Permissions/views/permissions/form/create.vue index 59cd889..7c41ff8 100644 --- a/modules/Permissions/views/permissions/form/create.vue +++ b/modules/Permissions/views/permissions/form/create.vue @@ -136,7 +136,7 @@ onMounted(() => { // 监听 form data watch( formData, - (value, oldValue) => { + () => { const type: number = formData.value.type if (type === 1) { diff --git a/modules/Permissions/views/permissions/index.vue b/modules/Permissions/views/permissions/index.vue index 7f97cd2..4087ad6 100644 --- a/modules/Permissions/views/permissions/index.vue +++ b/modules/Permissions/views/permissions/index.vue @@ -12,7 +12,13 @@ - + + +