laravel权限动态显⽰菜单以及按钮⼀、修改增加节点信息
按照如下表进⾏添加
⼆、基础模型添加数组多层级
/**
* 数组多层级
* @param array $data
* @param int $pid
* @param array
*/
public function subTree(array $data, int $pid = 0) {
$arr = [];
foreach ($data as $val) {
// 给定的pid是当前记录的上级id
if ($pid == $val['pid']) {
// 递归
$val['sub'] = $this -> subTree($data, $val['id']);
$arr[] = $val;
}
}
return $arr;
}
三、权限(节点)模型进⾏菜单层级化
// 获取有层级的数据
public function treeData() {
$menuData = Node::where('is_menu', '1') -> get() -> toArray();
return $this -> subTree($menuData);
}
四、后台⾸页控制器修改
读取菜单控制器
// 后台⾸页显⽰
public function index() {
// 读取菜单
$menuData = (new Node()) -> treeData();
// dump($menuData);
return view('admin.index.index', compact('menuData'));
}
五、修改后台⾸页模版
将读取到的菜单进⾏循环展⽰:
@foreach($menuData as $item)
<dl id="menu-admin">
<dt><i class="Hui-iconfont"></i>{{$item['name']}}<i class="Hui-iconfont menu_dropdown-arrow"></i></dt>
<dd>
<ul>
@foreach($item['sub'] as $subItem)
<li><a data-href="{{route($subItem['route_name'])}}" data-title="{{$subItem['name']}}" href="javascript:void(0)">{{$subItem['name']}}</a></li> @endforeach
</ul>
</dd>
</dl>
@endforeach
六、效果
七、动态读取⽤户菜单
7.1 配置超级管理员
在.env⽂件夹下配置超级管理员账号为admin:
7.2 在⽤户登陆时读取⾓⾊
在LoginController.php登陆控制器中在⽤户登陆成功时读取⽤户权限:
// 判断是否登录成功
if ($bool) {
// 得到⽤户权限
// 判断以下是否是超级管理员
if (env('SUPER') != $post['username']) {
$userModel = auth() -> user();
// dump($userModel);
javascript动态效果$roleModel = $userModel -> role;
$nodeArr = $roleModel -> nodes() -> pluck('name', 'id') -> toArray(); // dump($nodeArr);
/
/ 权限保存到session中
session(['admin.auth' => $nodeArr]);
}
else {
session(['admin.auth' => true]);
}
return redirect(route('admin.index'));
}
7.3 修改权限模型层级⽅法
/**
* 获取有层级的数据
* @param $allow_node ⽤户有的权限
* @return array
*/
public function treeData($allow_node) {
$query = Node::where('is_menu', '1');
if ($allow_node !== true) {
// 不是超级管理员
$query -> whereIn('id',array_keys($allow_node));
}
$menuData = $query -> get() -> toArray();
return $this -> subTree($menuData);
}
7.4 修改后台⾸页显⽰控制器
// 后台⾸页显⽰
public function index() {
// 权限
$auth = session('admin.auth');
// 读取菜单将当前⾓⾊的菜单id传过去
$menuData = (new Node()) -> treeData($auth);
// dump($menuData);
return view('admin.index.index', compact('menuData')); }
7.5 效果
7.6 权限不彻底问题
⼋、权限路由问题
8.1 配置⽂件修改
在config⽂件夹下新建rbac.php⽂件,将权限配置写⼊:<?php
return [
'super' => 'admins', // 超级管理员
'allow_route' => [ // 不验证到路由
'admin.welcome',
'admin.index',
'admin.logout'
],
];
更改LoginController.php中配置:
8.2 登陆中间件
在Middleware⽂件下修改CheckAdminLogin.php中间件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论