new feature
This commit is contained in:
29
modules/Permissions/Enums/MenuStatus.php
Normal file
29
modules/Permissions/Enums/MenuStatus.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Permissions\Enums;
|
||||
|
||||
use Catch\Enums\Enum;
|
||||
|
||||
enum MenuStatus: int implements Enum
|
||||
{
|
||||
case Show = 1; // 显示
|
||||
case Hidden = 2; // 隐藏
|
||||
|
||||
public function value(): int
|
||||
{
|
||||
// TODO: Implement value() method.
|
||||
return match ($this) {
|
||||
self::Show => 1,
|
||||
self::Hidden => 2,
|
||||
};
|
||||
}
|
||||
|
||||
public function name(): string
|
||||
{
|
||||
// TODO: Implement name() method.
|
||||
return match ($this) {
|
||||
self::Show => '显示',
|
||||
self::Hidden => '隐藏',
|
||||
};
|
||||
}
|
||||
}
|
32
modules/Permissions/Enums/MenuType.php
Normal file
32
modules/Permissions/Enums/MenuType.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Permissions\Enums;
|
||||
|
||||
use Catch\Enums\Enum;
|
||||
|
||||
enum MenuType: int implements Enum
|
||||
{
|
||||
case Top = 1; // 目录
|
||||
case Menu = 2; // 菜单
|
||||
case Action = 3; // 按钮
|
||||
|
||||
public function value(): int
|
||||
{
|
||||
// TODO: Implement value() method.
|
||||
return match ($this) {
|
||||
self::Top => 1,
|
||||
self::Menu => 2,
|
||||
self::Action => 3,
|
||||
};
|
||||
}
|
||||
|
||||
public function name(): string
|
||||
{
|
||||
// TODO: Implement name() method.
|
||||
return match ($this) {
|
||||
self::Top => '目录类型',
|
||||
self::Menu => '菜单类型',
|
||||
self::Action => '按钮类型',
|
||||
};
|
||||
}
|
||||
}
|
13
modules/Permissions/Exceptions/PermissionForbidden.php
Normal file
13
modules/Permissions/Exceptions/PermissionForbidden.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Permissions\Exceptions;
|
||||
|
||||
use Catch\Enums\Code;
|
||||
use Catch\Exceptions\CatchException;
|
||||
|
||||
class PermissionForbidden extends CatchException
|
||||
{
|
||||
protected $message = 'permission forbidden';
|
||||
|
||||
protected $code = Code::PERMISSION_FORBIDDEN;
|
||||
}
|
@@ -46,6 +46,6 @@ class DepartmentsController extends Controller
|
||||
|
||||
public function enable($id)
|
||||
{
|
||||
return $this->model->disOrEnable($id);
|
||||
return $this->model->toggleBy($id);
|
||||
}
|
||||
}
|
||||
|
@@ -46,6 +46,6 @@ class JobsController extends Controller
|
||||
|
||||
public function enable($id)
|
||||
{
|
||||
return $this->model->disOrEnable($id);
|
||||
return $this->model->toggleBy($id);
|
||||
}
|
||||
}
|
||||
|
@@ -52,6 +52,6 @@ class PermissionsController extends Controller
|
||||
*/
|
||||
public function enable($id)
|
||||
{
|
||||
return $this->model->disOrEnable($id, 'hidden');
|
||||
return $this->model->toggleBy($id, 'hidden');
|
||||
}
|
||||
}
|
||||
|
26
modules/Permissions/Middlewares/PermissionGate.php
Normal file
26
modules/Permissions/Middlewares/PermissionGate.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Permissions\Middlewares;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Permissions\Exceptions\PermissionForbidden;
|
||||
use Modules\User\Models\User;
|
||||
|
||||
class PermissionGate
|
||||
{
|
||||
public function handle(Request $request, \Closure $next)
|
||||
{
|
||||
if ($request->isMethod('get')) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
/* @var User $user */
|
||||
$user = $request->user(getGuardName());
|
||||
|
||||
if (! $user->can()) {
|
||||
throw new PermissionForbidden();
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
@@ -26,10 +26,12 @@ class DepartmentsModel extends Model
|
||||
|
||||
protected $fillable = ['id', 'parent_id', 'department_name', 'principal', 'mobile', 'email', 'status', 'sort', 'creator_id', 'created_at', 'updated_at', 'deleted_at'];
|
||||
|
||||
protected bool $isPaginate = false;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected array $fieldsInList = ['id','parent_id','department_name','status','sort','created_at'];
|
||||
protected array $fields = ['id','parent_id','department_name','status','sort','created_at'];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
@@ -44,8 +46,5 @@ class DepartmentsModel extends Model
|
||||
'status' => '=',
|
||||
];
|
||||
|
||||
public function getList(): mixed
|
||||
{
|
||||
return self::query()->select($this->fieldsInList)->quickSearch()->get()->toTree();
|
||||
}
|
||||
protected bool $asTree = true;
|
||||
}
|
||||
|
@@ -27,7 +27,7 @@ class JobsModel extends Model
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected array $fieldsInList = ['id','job_name','coding','status','sort','description','created_at','updated_at'];
|
||||
protected array $fields = ['id','job_name','coding','status','sort','description','created_at','updated_at'];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
|
@@ -5,6 +5,9 @@ declare(strict_types=1);
|
||||
namespace Modules\Permissions\Models;
|
||||
|
||||
use Catch\Base\CatchModel as Model;
|
||||
use Catch\Enums\Status;
|
||||
use Modules\Permissions\Enums\MenuStatus;
|
||||
use Modules\Permissions\Enums\MenuType;
|
||||
|
||||
/**
|
||||
* @property $id
|
||||
@@ -34,7 +37,9 @@ class PermissionsModel extends Model
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected array $fieldsInList = ['id','parent_id','permission_name','route','icon','module','permission_mark','component','redirect','keepalive','type','hidden','sort','created_at','updated_at'];
|
||||
protected array $fields = ['id','parent_id','permission_name','route','icon','module','permission_mark','component','redirect','keepalive','type','hidden','sort','created_at','updated_at'];
|
||||
|
||||
protected bool $isPaginate = false;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
@@ -48,13 +53,21 @@ class PermissionsModel extends Model
|
||||
'permission_name' => 'like',
|
||||
];
|
||||
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
* @var bool
|
||||
*/
|
||||
public function getList(): mixed
|
||||
{
|
||||
return self::query()->select($this->fieldsInList)->quickSearch()->get()->toTree();
|
||||
}
|
||||
protected bool $asTree = true;
|
||||
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
protected $casts = [
|
||||
'type' => MenuType::class,
|
||||
|
||||
'status' => MenuStatus::class
|
||||
];
|
||||
|
||||
|
||||
/**
|
||||
* is hidden
|
||||
@@ -63,6 +76,16 @@ class PermissionsModel extends Model
|
||||
*/
|
||||
public function isHidden(): bool
|
||||
{
|
||||
return $this->hidden === 2;
|
||||
return $this->hidden === Status::Disable;
|
||||
}
|
||||
|
||||
/**
|
||||
* action type
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isAction(): bool
|
||||
{
|
||||
return $this->type == MenuType::Action;
|
||||
}
|
||||
}
|
||||
|
@@ -26,13 +26,19 @@ class RolesModel extends Model
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected array $fieldsInList = ['id', 'role_name','identify','parent_id','description','data_range', 'created_at', 'updated_at'];
|
||||
protected array $fields = ['id', 'role_name','identify','parent_id','description','data_range', 'created_at', 'updated_at'];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected array $form = ['role_name','identify','parent_id','description','data_range'];
|
||||
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
protected bool $isPaginate = false;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
@@ -41,11 +47,5 @@ class RolesModel extends Model
|
||||
];
|
||||
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getList(): mixed
|
||||
{
|
||||
return self::query()->select($this->fieldsInList)->quickSearch()->get()->toTree();
|
||||
}
|
||||
protected bool $asTree = true;
|
||||
}
|
||||
|
@@ -4,9 +4,26 @@ namespace Modules\Permissions\Providers;
|
||||
|
||||
use Catch\CatchAdmin;
|
||||
use Catch\Providers\CatchModuleServiceProvider;
|
||||
use Modules\Permissions\Middlewares\PermissionGate;
|
||||
|
||||
class PermissionsServiceProvider extends CatchModuleServiceProvider
|
||||
{
|
||||
/**
|
||||
* register permission gate
|
||||
*
|
||||
* @throws \Psr\Container\ContainerExceptionInterface
|
||||
* @throws \Psr\Container\NotFoundExceptionInterface
|
||||
*/
|
||||
|
||||
protected function registering()
|
||||
{
|
||||
$route = $this->app['config']->get('catch.route');
|
||||
|
||||
$route['middlewares'][] = PermissionGate::class;
|
||||
|
||||
$this->app['config']->set('catch.route', $route);
|
||||
}
|
||||
|
||||
/**
|
||||
* route path
|
||||
*
|
||||
|
@@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
return new class () extends Migration {
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
|
@@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
return new class () extends Migration {
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
|
@@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
return new class () extends Migration {
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
|
@@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
return new class () extends Migration {
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
@@ -14,11 +13,11 @@ return new class extends Migration
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('user_has_roles', function (Blueprint $table) {
|
||||
$table->integer('user_id')->comment('users primary key');
|
||||
$table->integer('user_id')->comment('users primary key');
|
||||
|
||||
$table->integer('role_id')->comment('roles primary key');
|
||||
$table->integer('role_id')->comment('roles primary key');
|
||||
|
||||
$table->comment('user relate roles');
|
||||
$table->comment('user relate roles');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -29,6 +28,5 @@ return new class extends Migration
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
|
@@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
return new class () extends Migration {
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
@@ -29,6 +28,5 @@ return new class extends Migration
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
|
@@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
return new class () extends Migration {
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
@@ -29,6 +28,5 @@ return new class extends Migration
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
|
@@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
return new class () extends Migration {
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
@@ -29,6 +28,5 @@ return new class extends Migration
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
|
@@ -39,7 +39,7 @@
|
||||
<el-cascader :options="permissions" name="parent_id" v-model="formData.parent_id" clearable :props="{ value: 'id', label: 'permission_name', checkStrictly: true }" class="w-full" />
|
||||
</el-form-item>
|
||||
<el-form-item label="权限标识" prop="permission_mark" :rules="[{ required: true, message: '权限标识必须填写' }]" v-if="!isTop">
|
||||
<Select v-model="formData.permission_mark" name="permission_mark" :options="actionMenuNames" allow-create v-if="isAction" />
|
||||
<Select v-model="formData.permission_mark" name="permission_mark" :options="actionMenuMark" allow-create v-if="isAction" />
|
||||
<Select v-model="formData.permission_mark" placeholder="请选择" api="controllers" :query="{ module: formData.module }" v-else />
|
||||
</el-form-item>
|
||||
<el-form-item label="菜单Icon" prop="icon" v-if="!isAction">
|
||||
|
@@ -31,6 +31,19 @@
|
||||
<el-form-item label="角色描述" prop="description">
|
||||
<el-input v-model="formData.description" name="description" clearable type="textarea" />
|
||||
</el-form-item>
|
||||
<el-form-item label="选择权限" prop="permissions">
|
||||
<el-tree
|
||||
v-model="formData.permissions"
|
||||
:default-expanded-keys="formData.permissions"
|
||||
:data="permissions"
|
||||
value-key="id"
|
||||
check-strictly
|
||||
class="w-full"
|
||||
:props="{ label: 'permission_name', value: 'id' }"
|
||||
show-checkbox
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="数据权限" prop="data_range">
|
||||
<Select v-model="formData.data_range" name="data_range" clearable api="dataRange" class="w-full" />
|
||||
</el-form-item>
|
||||
@@ -82,11 +95,22 @@ if (props.primary) {
|
||||
|
||||
const emit = defineEmits(['close'])
|
||||
const roles = ref()
|
||||
const permissions = ref()
|
||||
onMounted(() => {
|
||||
http.get(props.api).then(r => {
|
||||
roles.value = r.data.data
|
||||
})
|
||||
|
||||
close(() => emit('close'))
|
||||
|
||||
http.get('permissions/permissions').then(r => {
|
||||
permissions.value = r.data.data
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-tree .el-tree-node__children:last-child) {
|
||||
@apply flex flex-row;
|
||||
}
|
||||
</style>
|
||||
|
Reference in New Issue
Block a user