This commit is contained in:
walkor 2022-12-06 11:24:47 +08:00
parent 868c8d3298
commit f9957ff935
4 changed files with 70 additions and 11 deletions

View File

@ -19,7 +19,7 @@ class AdminRuleController extends Crud
* *
* @var string[] * @var string[]
*/ */
public $noNeedAuth = ['get']; public $noNeedAuth = ['get', 'controller'];
/** /**
* @var AdminRule * @var AdminRule
@ -62,7 +62,8 @@ class AdminRuleController extends Crud
*/ */
function get(Request $request): Response function get(Request $request): Response
{ {
[$rules, $items] = $this->getRulesAndItems(); $rules = $this->getRules(admin('roles'));
$items = AdminRule::orderBy('weight', 'desc')->get()->toArray();
$types = $request->get('type', '0,1'); $types = $request->get('type', '0,1');
$types = is_string($types) ? explode(',', $types) : [0, 1]; $types = is_string($types) ? explode(',', $types) : [0, 1];
$items_map = []; $items_map = [];
@ -98,6 +99,38 @@ class AdminRuleController extends Crud
return $this->json(0, 'ok', $formatted_items); return $this->json(0, 'ok', $formatted_items);
} }
/**
* 获取控制器详细权限
* @param Request $request
* @return Response
*/
public function controller(Request $request): Response
{
$controller = $request->get('controller');
if (!$controller) {
return $this->json(0, 'ok', []);
}
$rules = $this->getRules(admin('roles'));
// 超级管理员
if (in_array('*', $rules)) {
return $this->json(0, 'ok', ['*']);
}
// 获取详细权限
$controller_search = str_replace('\\', '\\\\', $controller);
$keys = AdminRule::where('key', 'like', "$controller_search%")
->whereIn('id', $rules)->pluck('key');
$permissions = [];
$prefix_length = strlen($controller);
foreach ($keys as $key) {
if ($key === $controller) {
$permissions = ['*'];
break;
}
$permissions[] = substr($key, $prefix_length);
}
return $this->json(0, 'ok', $permissions);
}
/** /**
* 根据类同步规则到数据库 * 根据类同步规则到数据库
* @return void * @return void
@ -307,11 +340,11 @@ class AdminRuleController extends Crud
/** /**
* 获取权限规则 * 获取权限规则
* @param $roles
* @return array * @return array
*/ */
protected function getRulesAndItems(): array protected function getRules($roles): array
{ {
$roles = admin('roles');
$rules_strings = $roles ? AdminRole::whereIn('id', $roles)->pluck('rules') : []; $rules_strings = $roles ? AdminRole::whereIn('id', $roles)->pluck('rules') : [];
$rules = []; $rules = [];
foreach ($rules_strings as $rule_string) { foreach ($rules_strings as $rule_string) {
@ -320,9 +353,7 @@ class AdminRuleController extends Crud
} }
$rules = array_merge($rules, explode(',', $rule_string)); $rules = array_merge($rules, explode(',', $rule_string));
} }
return $rules;
$items = AdminRule::orderBy('weight', 'desc')->get()->toArray();
return [$rules, $items];
} }
/** /**

View File

@ -150,27 +150,29 @@
<!-- 表格顶部工具栏 --> <!-- 表格顶部工具栏 -->
<script type="text/html" id="table-toolbar"> <script type="text/html" id="table-toolbar">
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add"> <button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add" permission="insert">
<i class="layui-icon layui-icon-add-1"></i>新增 <i class="layui-icon layui-icon-add-1"></i>新增
</button> </button>
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove"> <button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove" permission="delete">
<i class="layui-icon layui-icon-delete"></i>删除 <i class="layui-icon layui-icon-delete"></i>删除
</button> </button>
</script> </script>
<!-- 表格行工具栏 --> <!-- 表格行工具栏 -->
<script type="text/html" id="table-bar"> <script type="text/html" id="table-bar">
<button class="pear-btn pear-btn-xs tool-btn" lay-event="edit">编辑</button> <button class="pear-btn pear-btn-xs tool-btn" lay-event="edit" permission="update">编辑</button>
<button class="pear-btn pear-btn-xs tool-btn" lay-event="remove">删除</button> <button class="pear-btn pear-btn-xs tool-btn" lay-event="remove" permission="delete">删除</button>
</script> </script>
<script src="/app/admin/component/layui/layui.js"></script> <script src="/app/admin/component/layui/layui.js"></script>
<script src="/app/admin/component/pear/pear.js"></script> <script src="/app/admin/component/pear/pear.js"></script>
<script src="/app/admin/admin/js/index.js"></script> <script src="/app/admin/admin/js/index.js"></script>
<script src="/app/admin/admin/js/permission.js"></script>
<script> <script>
// 相关接口 // 相关接口
const PRIMARY_KEY = 'id'; const PRIMARY_KEY = 'id';
const CONTROLLER = 'plugin\\admin\\app\\controller\\UserController';
const SELECT_API = "/app/admin/user/select"; const SELECT_API = "/app/admin/user/select";
const UPDATE_API = "/app/admin/user/update"; const UPDATE_API = "/app/admin/user/update";
const DELETE_API = "/app/admin/user/delete"; const DELETE_API = "/app/admin/user/delete";

View File

@ -97,6 +97,10 @@ a {
cursor: pointer; cursor: pointer;
} }
*[permission] {
display: none;
}
/** 左侧菜单 Start **/ /** 左侧菜单 Start **/
.pear-nav-tree .layui-nav-item a span { .pear-nav-tree .layui-nav-item a span {

View File

@ -0,0 +1,22 @@
/**
* 获取控制器详细权限并决定展示哪些按钮或dom元素
*/
layui.$(function () {
let $ = layui.$;
$.ajax({
url: "/app/admin/admin-rule/controller",
dataType: "json",
data: {controller: CONTROLLER},
success: function (res) {
let style = '';
layui.each(res.data || [], function (k, action) {
if (action === '*') {
style = '*[permission]{display: initial}';
return;
}
style += '*[permission="'+action+'"]{display: initial}';
});
$("head").append("<style>"+style+"</style>");
}
});
});