菜单系统__随不同权限管理员登陆而不同
管理员权限可能各不相同,菜单系统应只显示其有权限的菜单。
1、通过权限中间件获得权限数据
//权限校验中间件
class Rightvalidate
{
public function handle($request, Closure $next)
{
//取出用户信息
$admin=Auth::user();
$gid=$admin->gid;//获取当前用户的角色gid;
$group=DB::table('admin_group')->where('gid',$gid)->item();
if(!$group){
return response('不存在该角色',200);
}
$rights=[];
if ($group['rights']){
//获取用户权限数组
$rights=json_decode($group['rights'],true);
}
//当前用户访问的是哪个菜单
$namespace=$request->route()->action['namespace'];
$res=$request->route()->action['controller'];
//获得控制器和方法
$res=str_replace($namespace.'\\','',$res);
//获得表示控制器和方法的数组
$res=explode('@',$res);
//查询当前url对应的菜单
$cur_menu=DB::table('admin_menu')->where('controller',$res[0])->where('action',$res[1])->item();
if(!$cur_menu){
return response('该功能不存在',200);
}
//判断该mid是否在$rights数组中
if(!in_array($cur_menu['mid'],$rights)){
//使用助手函数response()响应,第一个参数为信息,第二个参数为状态码;
return response('权限不足',200);
}
$admin->rights=$rights;
$admin->right_title=$group['title'];
$request->admin=$admin;
return $next($request);
}
}
- 2、筛选登陆管理员有权限的菜单数据
效果图// 框架主页
class Home extends Controller
{
public function index(Request $res){
$data['admin']=$res->admin;
$data['menus']=DB::table('admin_menu')->where('pid',0)->whereIn('mid',$data['admin']['rights'])->where('ishidden',0)->where('status',0)->get()->all();
foreach ($data['menus'] as $key=>$val){
$childs=DB::table('admin_menu')->whereIn('mid',$data['admin']['rights'])->where('pid',$val->mid)->where('ishidden',0)->where('status',0)->get()->all();
$val->child=$childs;
}
return view('admins/home/index',$data);
}
}
总结:
1、充分利用Auth::user()提供的数据。
2、已经在权限中间件中编码获得权限数据,要充分利用。
3、对多维数组加强学习。在循环中使用率很高,对键名、值的读取、添加要熟练掌握。