123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- <?php
- declare(strict_types=1);
- namespace Modules\Permissions\Models;
- use Catch\Base\CatchModel as Model;
- use Catch\CatchAdmin;
- use Catch\Enums\Status;
- use Illuminate\Database\Eloquent\Casts\Attribute;
- use Illuminate\Database\Eloquent\Relations\HasMany;
- use Modules\Permissions\Enums\MenuStatus;
- use Modules\Permissions\Enums\MenuType;
- /**
- * @property $id
- * @property $parent_id
- * @property $permission_name
- * @property $route
- * @property $icon
- * @property $module
- * @property $permission_mark
- * @property $component
- * @property $redirect
- * @property $keepalive
- * @property $type
- * @property $hidden
- * @property $sort
- * @property $active_menu
- * @property $creator_id
- * @property $created_at
- * @property $updated_at
- * @property $deleted_at
- */
- class Permissions extends Model
- {
- protected $table = 'permissions';
- protected $fillable = ['id', 'parent_id', 'permission_name', 'route', 'icon', 'module', 'permission_mark', 'component', 'redirect', 'keepalive', 'type', 'hidden', 'active_menu', 'sort', 'creator_id', 'created_at', 'updated_at', 'deleted_at'];
- /**
- * @var array
- */
- protected array $fields = ['id','parent_id','permission_name','route','icon','module','permission_mark','component','redirect','keepalive','type','hidden','active_menu','sort','created_at','updated_at'];
- protected bool $isPaginate = false;
- /**
- * @var array
- */
- protected array $form = ['parent_id','permission_name','route','icon','module','permission_mark','component','redirect','keepalive','type','active_menu', 'hidden','sort'];
- /**
- * @var array
- */
- public array $searchable = [
- 'permission_name' => 'like',
- 'role_id' => '='
- ];
- protected $hidden = ['pivot'];
- /**
- * default permission actions
- *
- * @var array|string[]
- */
- protected array $defaultActions = [
- 'index' => '列表',
- 'store' => '新增',
- 'show' => '读取',
- 'update' => '更新',
- 'destroy' => '删除',
- 'enable' => '禁用/启用',
- 'import' => '导入',
- 'export' => '导出',
- ];
- /**
- * @var bool
- */
- protected bool $asTree = true;
- /**
- * @var string[]
- */
- protected $casts = [
- 'type' => MenuType::class,
- 'status' => MenuStatus::class
- ];
- /**
- * is inner
- *
- * @return Attribute
- */
- public function isInner(): Attribute
- {
- return Attribute::make(
- get: fn($value) => $value == 1
- );
- }
- /**
- * is hidden
- *
- * @return bool
- */
- public function isHidden(): bool
- {
- return $this->hidden === Status::Disable;
- }
- /**
- * action type
- *
- * @return bool
- */
- public function isAction(): bool
- {
- return $this->type == MenuType::Action;
- }
- /**
- * is top menu
- *
- * @return bool
- */
- public function isTopMenu(): bool
- {
- return $this->type == MenuType::Top;
- }
- /**
- * is menu
- *
- * @return bool
- */
- public function isMenu(): bool
- {
- return $this->type == MenuType::Menu;
- }
- /**
- * actions
- *
- * @return HasMany
- */
- public function actions(): HasMany
- {
- return $this->hasMany(self::class, 'parent_id', 'id')->where('type', MenuType::Action);
- }
- /**
- *
- * @param array $data
- * @return bool
- * @throws \ReflectionException
- */
- public function storeBy(array $data): bool
- {
- if ($data['actions'] ?? false) {
- /* @var static $parentMenu */
- $parentMenu = $this->firstBy(value: $data['parent_id'], field: 'id');
- if (! $parentMenu->isMenu()) {
- return false;
- }
- $actions = CatchAdmin::getControllerActions($parentMenu->module, $parentMenu->permission_mark);
- foreach ($actions as $k => $action) {
- if (! isset($this->defaultActions[$action])) {
- continue;
- }
- $this->addAction($this->newInstance([
- 'type' => MenuType::Action->value(),
- 'parent_id' => $data['parent_id'],
- 'permission_name' => $this->defaultActions[$action],
- 'permission_mark' => $action,
- 'sort' => $k + 1
- ]), $parentMenu);
- }
- return true;
- }
- $model = $this->fill($data);
- if ($model->isAction()) {
- $parentMenu = $this->firstBy($model->parent_id, 'id');
- return $this->addAction($model, $parentMenu);
- }
- if ($model->isTopMenu()) {
- $data['route'] = '/'.trim($data['route'], '/');
- }
- if (parent::storeBy($data)) {
- return true;
- }
- return false;
- }
- /**
- * add action
- *
- * @param $model
- * @param Permissions $parent
- * @return mixed
- */
- protected function addAction($model, mixed $parent): mixed
- {
- $model->setAttribute('module', $parent->module);
- $model->setAttribute('permission_mark', $parent->permission_mark. '@'. $model->permission_mark);
- $model->setAttribute('route', '');
- $model->setAttribute('icon', '');
- $model->setAttribute('component', '');
- $model->setAttribute('redirect', '');
- if ($this->where('module', $model->getAttribute('module'))->where('permission_mark', $model->getAttribute('permission_mark'))->first()) {
- return false;
- }
- return $model->setCreatorId()->save();
- }
- /**
- * update data
- *
- * @param $id
- * @param array $data
- * @return mixed
- */
- public function updateBy($id, array $data): mixed
- {
- $model = $this->fill($data);
- if ($model->isAction()) {
- /* @var Permissions $parentMenu */
- $parentMenu = $this->firstBy($model->parent_id, 'id');
- $data['permission_mark'] = $parentMenu->permission_mark.'@'.$data['permission_mark'];
- }
- return parent::updateBy($id, $data);
- }
- }
|