初始化

This commit is contained in:
2026-03-02 13:44:38 +08:00
commit 05b785083c
677 changed files with 58662 additions and 0 deletions

View File

@@ -0,0 +1,344 @@
<?php
namespace addons\webman\controller;
use addons\webman\Admin;
use addons\webman\model\AdminDepartment;
use addons\webman\model\AdminRole;
use ExAdmin\ui\component\common\Html;
use ExAdmin\ui\component\common\Icon;
use ExAdmin\ui\component\form\Form;
use ExAdmin\ui\component\grid\grid\Actions;
use ExAdmin\ui\component\grid\grid\Grid;
use ExAdmin\ui\component\grid\tag\Tag;
/**
* 系统角色
*/
class RoleController
{
public function __construct()
{
$this->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);
}
}
});
});
}
}