new feature

This commit is contained in:
JaguarJack
2022-12-14 19:25:52 +08:00
parent b63cd5d01c
commit 098463f4e1
35 changed files with 391 additions and 146 deletions

View 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 => '隐藏',
};
}
}

View 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 => '按钮类型',
};
}
}

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

View File

@@ -46,6 +46,6 @@ class DepartmentsController extends Controller
public function enable($id)
{
return $this->model->disOrEnable($id);
return $this->model->toggleBy($id);
}
}

View File

@@ -46,6 +46,6 @@ class JobsController extends Controller
public function enable($id)
{
return $this->model->disOrEnable($id);
return $this->model->toggleBy($id);
}
}

View File

@@ -52,6 +52,6 @@ class PermissionsController extends Controller
*/
public function enable($id)
{
return $this->model->disOrEnable($id, 'hidden');
return $this->model->toggleBy($id, 'hidden');
}
}

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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.
*

View File

@@ -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.
*

View File

@@ -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.
*

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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