摘要:<?php /* 权限访问控制 */ //基类 class Base extends Controller { public function __construct(){ parent::__construct(); //admin是一个一维数组 $this->_admin = session(&
<?php
/*
权限访问控制
*/
//基类
class Base extends Controller
{
public function __construct(){
parent::__construct();
//admin是一个一维数组
$this->_admin = session('admin');
if(!$this->_admin){
//数据不合法直接重定向到登录页面
$this->redirect('account/login');
exit;
}
$this->assign('admin',$this->_admin);
// 判断用户是否有权限
$group = Db::table('admin_groups')->where('gid',$this->_admin['gid'])->find();
if(!$group){
$this->request_error('对不起,您没有权限');
}
$rights = json_decode($group['rights']);
// 当前访问的菜单
$controller = request()->controller();
$method = request()->action();
//查找与当前控制器和方法对应的数据组
$res = Db::table('admin_menus')->where('controller',$controller)->where('method',$method)->find();
if(!$res){
$this->request_error('对不起,您访问的功能不存在');
}
if($res['status'] == 1){
$this->request_error('对不起,该功能已禁止使用');
}
if(!in_array($res['mid'],$rights)){
$this->request_error('对不起,您没有权限');
}
}
private function request_error($msg){
if(request()->isAjax()){
exit(json_encode(['code'=>1,'msg'=>$msg]));
}
exit($msg);
}
}
//HOME类
class Home extends Base{
public function index(){
//查询当前用户所拥有的权限信息
$role = Db::table('admin_groups')->where('gid',$this->_admin['gid'])->find();
if($role){
//把当前用户的【rights】json字符串数据强制转换成数组格式
$role['rights'] = $role['rights']?json_decode($role['rights'],true):[];
}
if($role['rights']){
$where = 'mid in('.implode(',', $role['rights']).') and ishidden=0 and status=0';
//自定义索引mid查找出所有符合条件的数据($menus数据是以MID为索引的二维数组)
$menus = $this->db->table('admin_menus')->where($where)->cates('mid');
//把查询的数据树状层级显示
$menus && $menus = $this->gettreeitems($menus);
}
$data['menus'] = $menus;
$data['role'] = $role;
return $this->fetch('',$data);
}
public function welcome(){
return $this->fetch();
}
private function gettreeitems($items){
$tree = [];
foreach ($items as $item) {
//判断有没有以“$item['pid']”为索引的数据(说人话即:索引为$item['pid']的数据是否存在子类)
if(isset($items[$item['pid']])){
//把平级数组中(一级菜单数组)有子类的将对应的子类数组移到自身新添的children字段中,达到有层级的效果
$items[$item['pid']]['children'][] = &$items[$item['mid']];
}else{
//把所有的一级菜单数组【没有子类的】挨个追加到新数组tree中
$tree[] = &$items[$item['mid']];
}
}
return $tree;
}
}权限访问控制中,运用引用传值达到无限分类的方法,多少还是有些不大理解,怎么才能熟练的运用引用传值,老师有啥好的建议,可以做一节课单独讲引用传值在开发中的运用吗
批改老师:韦小宝批改时间:2018-11-16 17:49:41
老师总结:写的很不错!熟练掌握也就是多写!你可以尝试着删除点东西再补上!结果不一样!然后再去想这一步干了些什么!加油吧!