model = plugin()->webman->config('database.role_model'); } /** * 系统角色 * @auth true * @return Grid */ public function index(): Grid { return Grid::create(new $this->model(), function (Grid $grid) { $grid->title(admin_trans('auth.title')); $grid->autoHeight(); $grid->column('name', admin_trans('auth.fields.name')); $grid->column('type', admin_trans('auth.fields.type')) ->display(function ($value) { $tag = ''; switch ($value) { case AdminDepartment::TYPE_DEPARTMENT: $tag = Tag::create(admin_trans('auth.type.' . AdminDepartment::TYPE_DEPARTMENT))->color('#108ee9'); break; case AdminDepartment::TYPE_CHANNEL: $tag = Tag::create(admin_trans('auth.type.' . AdminDepartment::TYPE_CHANNEL))->color('#f50'); break; } return Html::create()->content([ $tag ]); })->sortable(); $grid->hideSelection(); $grid->column('desc', admin_trans('auth.fields.desc')); $grid->column('data_type', admin_trans('auth.fields.data_type')) ->display(function ($value, AdminRole $data) { $tag = ''; switch ($value) { case AdminRole::DATA_TYPE_ALL: $tag = Tag::create(admin_trans('auth.options.data_type.full_data_rights'))->color('#f50'); break; case AdminRole::DATA_TYPE_CUSTOM: $tag = Tag::create(admin_trans('auth.options.data_type.custom_data_permissions'))->color('#2db7f5'); break; case AdminRole::DATA_TYPE_DEPARTMENT_BELOW: $tag = Tag::create(admin_trans('auth.options.data_type.this_department_and_the_following_data_permissions'))->color('#87d068'); if ($data->type == AdminDepartment::TYPE_CHANNEL) { $tag = Tag::create(admin_trans('auth.options.data_type.channel_and_the_following_data_permissions'))->color('#87d068'); } break; case AdminRole::DATA_TYPE_DEPARTMENT: $tag = Tag::create(admin_trans('auth.options.data_type.data_permissions_for_this_department'))->color('#108ee9'); break; case AdminRole::DATA_TYPE_SELF: $tag = Tag::create(admin_trans('auth.options.data_type.personal_data_rights'))->color('#108ee9'); break; } return Html::create()->content([ $tag ]); })->sortable(); $grid->setForm()->modal($this->form()); $grid->quickSearch(); $grid->actions(function (Actions $actions, AdminRole $data) { $dropdown = $actions->dropdown(); $dropdown->prepend(admin_trans('auth.auth_grant'), 'safety-certificate-filled') ->modal($this->auth($data['id'], $data['type'])); $dropdown->prepend(admin_trans('auth.menu_grant'), 'appstore-filled') ->modal($this->menu($data['id'], $data['type'])); $dropdown->prepend(admin_trans('auth.data_grant'), 'fas fa-database') ->modal($this->data($data['id'], $data['type'])); if ($data->id == AdminRole::ROLE_CHANNEL) { $actions->hideDel(); } }); }); } /** * 系统角色 * @auth true * @return Form */ public function form(): Form { return Form::create(new $this->model(), function (Form $form) { $form->title(admin_trans('auth.title')); $form->text('name', admin_trans('auth.fields.name'))->required(); $form->textarea('desc', admin_trans('auth.fields.desc'))->rows(5)->required(); $form->radio('type', admin_trans('auth.fields.type')) ->default(AdminDepartment::TYPE_DEPARTMENT) ->options([ AdminDepartment::TYPE_DEPARTMENT => admin_trans('auth.type.' . AdminDepartment::TYPE_DEPARTMENT), AdminDepartment::TYPE_CHANNEL => admin_trans('auth.type.' . AdminDepartment::TYPE_CHANNEL), ])->disabled($form->isEdit()); $form->number('sort', admin_trans('auth.fields.sort'))->default($this->model::max('sort') + 1); $form->saving(function (Form $form) { if (!$form->isEdit()) { $type = $form->input('type'); switch ($type) { case AdminDepartment::TYPE_DEPARTMENT: $form->input('data_type', AdminRole::DATA_TYPE_ALL); break; case AdminDepartment::TYPE_CHANNEL: $form->input('data_type', AdminRole::DATA_TYPE_DEPARTMENT_BELOW); break; default: return message_error(admin_trans('auth.role_type_error')); } } }); }); } /** * 数据权限 * @auth true * @return Form */ public function data($id, $type) { return Form::create(new $this->model(), function (Form $form) use ($type) { switch ($type) { case AdminDepartment::TYPE_DEPARTMENT: $options = [ 0 => admin_trans('auth.options.data_type.full_data_rights'), 1 => admin_trans('auth.options.data_type.custom_data_permissions'), 2 => admin_trans('auth.options.data_type.this_department_and_the_following_data_permissions'), 3 => admin_trans('auth.options.data_type.data_permissions_for_this_department'), 4 => admin_trans('auth.options.data_type.personal_data_rights'), ]; break; case AdminDepartment::TYPE_CHANNEL: $options = [ 2 => admin_trans('auth.options.data_type.channel_and_the_following_data_permissions'), 3 => admin_trans('auth.options.data_type.data_permissions_for_this_department'), 4 => admin_trans('auth.options.data_type.personal_data_rights'), ]; break; default: $options = []; } $form->title(admin_trans('auth.title')); $form->desc('name', admin_trans('auth.fields.name')); $form->desc('desc', admin_trans('auth.fields.desc')); $form->select('data_type', admin_trans('auth.fields.data_type')) ->required() ->options($options) ->when(1, function (Form $form) { $department = plugin()->webman->config('database.department_model'); $options = $department::where('status', 1) ->where('type', AdminDepartment::TYPE_DEPARTMENT) ->get()->toArray(); $tree = $form->tree('department') ->showIcon() ->content(Icon::create('FolderOutlined'), 'groupIcon') ->multiple() ->checkable() ->bindAttr('checkStrictly', $form->getModel() . '.check_strictly') ->options($options); $form->popItem(); $form->switch('check_strictly', admin_trans('auth.fields.department')) ->default(false) ->checkedChildren(admin_trans('auth.father_son_linkage')) ->unCheckedChildren(admin_trans('auth.father_son_linkage')) ->checkedValue(false) ->unCheckedValue(true) ->getFormItem()->content($tree); }); }); } /** * 菜单权限 * @auth true * @param $id * @param $type * @return Form */ public function menu($id, $type): Form { $menuModel = plugin()->webman->config('database.menu_model'); $tree = $menuModel::select('id', 'pid', 'name')->where('type', $type)->get()->toArray(); $model = plugin()->webman->config('database.role_menu_model'); $field = 'menu_id'; $label = 'name'; $nodeTypeList = []; foreach ($tree as $value) { if (!empty($value['group'])) { /** 全部菜单 */ if ($value['group'] == 'all') { $nodeTypeList[] = $value; } /** 渠道菜单,总站菜单 */ if ($value['group'] == ($type == AdminDepartment::TYPE_CHANNEL ? 'channel' : 'department')) { $nodeTypeList[] = $value; } } else { $nodeTypeList[] = $value; } } array_unshift($nodeTypeList, ['id' => 0, $label => admin_trans('auth.all'), 'pid' => -1]); $auths = $model::where('role_id', $id)->pluck($field); return Form::create(new $this->model(), function (Form $form) use ($id, $model, $nodeTypeList, $field, $auths, $label) { $form->tree('auth') ->options($nodeTypeList, $label) ->default($auths) ->checkable(); $form->saving(function (Form $form) use ($id, $model, $field) { $auths = $form->input('auth'); $form->removeInput('auth'); $auths = array_filter($auths); $auths = array_map(function ($item) use ($id, $field) { return ['role_id' => $id, $field => $item]; }, $auths); $model::where('role_id', $id)->delete(); if ($auths) { $authsArr = array_chunk($auths, 10, true); foreach ($authsArr as $value) { $model::insert($value); } } }); }); } /** * 功能权限 * @auth true * @param $id * @param string $type * @return Form */ public function auth($id, string $type = ''): Form { $tree = Admin::node()->all(); $model = plugin()->webman->config('database.role_permission_model'); $field = 'node_id'; $label = 'title'; $nodeTypeList = []; foreach ($tree as $value) { if (!empty($value['group'])) { /** 全部菜单 */ if ($value['group'] == 'all') { $nodeTypeList[] = $value; } /** 渠道菜单,总站菜单 */ if ($value['group'] == ($type == AdminDepartment::TYPE_CHANNEL ? 'channel' : 'department')) { $nodeTypeList[] = $value; } } else { $nodeTypeList[] = $value; } } array_unshift($nodeTypeList, ['id' => 0, $label => admin_trans('auth.all'), 'pid' => -1]); $auths = $model::where('role_id', $id)->pluck($field); return Form::create(new $this->model(), function (Form $form) use ($id, $model, $nodeTypeList, $field, $auths, $label) { $form->tree('auth') ->options($nodeTypeList, $label) ->default($auths) ->checkable(); $form->saving(function (Form $form) use ($id, $model, $field) { $auths = $form->input('auth'); $form->removeInput('auth'); $auths = array_filter($auths); $auths = array_map(function ($item) use ($id, $field) { return ['role_id' => $id, $field => $item]; }, $auths); $model::where('role_id', $id)->delete(); if ($auths) { $authsArr = array_chunk($auths, 10, true); foreach ($authsArr as $value) { $model::insert($value); } } }); }); } public function commonAuthForm($id, $model, $tree, $type, $field, $label): Form { $nodeTypeList = []; foreach ($tree as $value) { if (!empty($value['group'])) { /** 全部菜单 */ if ($value['group'] == 'all') { $nodeTypeList[] = $value; } /** 渠道菜单,总站菜单 */ if ($value['group'] == ($type == AdminDepartment::TYPE_CHANNEL ? 'channel' : 'department')) { $nodeTypeList[] = $value; } } else { $nodeTypeList[] = $value; } } array_unshift($nodeTypeList, ['id' => 0, $label => admin_trans('auth.all'), 'pid' => -1]); $auths = $model::where('role_id', $id)->pluck($field); return Form::create(new $this->model(), function (Form $form) use ($id, $model, $nodeTypeList, $field, $auths, $label) { $form->tree('auth') ->options($nodeTypeList, $label) ->default($auths) ->checkable(); $form->saving(function (Form $form) use ($id, $model, $field) { $auths = $form->input('auth'); $form->removeInput('auth'); $auths = array_filter($auths); $auths = array_map(function ($item) use ($id, $field) { return ['role_id' => $id, $field => $item]; }, $auths); $model::where('role_id', $id)->delete(); if ($auths) { $authsArr = array_chunk($auths,10,true); foreach ($authsArr as $value) { $model::insert($value); } } }); }); } }