272 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			272 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | namespace app\model; | |||
|  | 
 | |||
|  | class AuthRule extends Base | |||
|  | { | |||
|  |     //根据权限IDs获取权限列表
 | |||
|  |     public static function getListByRuleIDs($ruleIds) | |||
|  |     { | |||
|  |         $items = self::wherein('id',$ruleIds) | |||
|  |         //->where('status', 1)
 | |||
|  |         ->order('sort', 'asc') | |||
|  |         ->select() | |||
|  |         ->toArray(); | |||
|  |         return self::getChildren($items); | |||
|  |     } | |||
|  | 
 | |||
|  |     //角色权限 + 基本权限
 | |||
|  |     public static function getAuthListByRuleIDs($groupId) | |||
|  |     {    | |||
|  |         $order = ['sort'=>'asc']; | |||
|  |         if ($groupId == 1) { | |||
|  |             $items = self::order($order)->select()->toArray(); | |||
|  |         } else { | |||
|  |             $group = AuthGroup::getById($groupId); | |||
|  |             $rulesArr = []; | |||
|  |             if ($group && !empty($group['rules'])) { | |||
|  |                 $rulesArr = array_filter(explode(',', $group['rules'])); | |||
|  |             } | |||
|  |             if (count($rulesArr) >0) { | |||
|  |                 $items = self::wherein('id', $rulesArr)->whereOr('is_base', 1)->order($order)->select()->toArray(); | |||
|  |             } else { | |||
|  |                 $items = self::where('is_base', 1)->order($order)->select()->toArray(); | |||
|  |             } | |||
|  |         } | |||
|  |         $levelItems = self::getChildren($items); | |||
|  |         $levelIds = self::getChildrenIds($items); | |||
|  |         // 独立写入不在连续分层中的权限,连续分层权限可用于菜单显示
 | |||
|  |         foreach ($items as $item) { | |||
|  |             if(!in_array($item['id'], $levelIds)) { | |||
|  |                 $levelItems[] = $item; | |||
|  |             } | |||
|  |         } | |||
|  |         return $levelItems; | |||
|  |     } | |||
|  | 
 | |||
|  |     //根据上级ID获取下级权限列表
 | |||
|  |     public static function getListTree($forMenu = 0) | |||
|  |     { | |||
|  |         $items = self::getList($forMenu); | |||
|  |         return self::getChildren($items); | |||
|  |     } | |||
|  | 
 | |||
|  |     //根据上级ID获取下级权限列表
 | |||
|  |     public static function getListByParentId($parentId) | |||
|  |     { | |||
|  |         return self::where('parent_id', $parentId) | |||
|  |         ->order('sort', 'asc') | |||
|  |         ->select() | |||
|  |         ->toArray(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @param array $items | |||
|  |      * @param integer $parent_id | |||
|  |      * @return array | |||
|  |      */ | |||
|  |     public static function getChildren($items, $parentId = 0) | |||
|  |     { | |||
|  |         $data = []; | |||
|  |         foreach($items as $item){ | |||
|  |             if($item['parent_id'] == $parentId){ | |||
|  |                 $childern = self::getChildren($items, $item['id']); | |||
|  |                 if(!empty($childern)){ | |||
|  |                     $item['hasChildren'] = true; | |||
|  |                     $item['children'] = $childern; | |||
|  |                 } | |||
|  |                 $data[] = $item; | |||
|  |             } | |||
|  |         } | |||
|  |         return $data; | |||
|  |     }  | |||
|  |      | |||
|  |     public static function getChildrenIds($items, $parentId = 0) | |||
|  |     { | |||
|  |         $data = []; | |||
|  |         foreach($items as $item){ | |||
|  |             if($item['parent_id'] == $parentId){ | |||
|  |                 $childrenIds = self::getChildrenIds($items, $item['id']); | |||
|  |                 if(!empty($childrenIds)){ | |||
|  |                     $data = array_merge($data, $childrenIds); | |||
|  |                 } | |||
|  |                 $data[] = $item['id']; | |||
|  |             } | |||
|  |         } | |||
|  |         return $data; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @param integer $forMenu 大于0表示获取可显示的权限 | |||
|  |      * @return void | |||
|  |      */ | |||
|  |     private static function getList($forMenu = 0) | |||
|  |     { | |||
|  |         if($forMenu){ | |||
|  |             return self::where('status', 1)->order('sort', 'asc')->select()->toArray(); | |||
|  |         }else{ | |||
|  |             return self::order('sort', 'asc')->select()->toArray(); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     //获取可显示权限
 | |||
|  |     public static function getTopListForDisplay() | |||
|  |     { | |||
|  |         return self::where('status', 1) | |||
|  |         ->where('parent_id', 0) | |||
|  |         ->order('sort', 'asc') | |||
|  |         ->select() | |||
|  |         ->toArray(); | |||
|  |     } | |||
|  | 
 | |||
|  |     //根据两个名字获取权限
 | |||
|  |     public static function getByTwoName($name, $otherName) | |||
|  |     { | |||
|  |         return self::whereOr('name',$name) | |||
|  |         ->whereOr('name',$otherName) | |||
|  |         ->findOrEmpty() | |||
|  |         ->toArray(); | |||
|  |     } | |||
|  | 
 | |||
|  |     //根据name获取权限
 | |||
|  |     public static function getByName($name) | |||
|  |     { | |||
|  |         return self::where('name', $name) | |||
|  |         ->findOrEmpty() | |||
|  |         ->toArray(); | |||
|  |     } | |||
|  |      | |||
|  |     public static function onAfterInsert($rule) | |||
|  |     { | |||
|  |         $rule->sort = $rule->id; | |||
|  |         $rule->save(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 该情况适合无限级菜单分组显示 (当前系统仅支持2级权限,因此推荐使用getListTree 方法) | |||
|  |      * @param int $forMenu 是否只获取可显示菜单权限 | |||
|  |      */ | |||
|  |     public static function getListTreeSort($forMenu = 0) | |||
|  |     { | |||
|  |         $items = self::getList($forMenu); | |||
|  |         return self::groupSort($items, 0, 1, true, true); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 分组排序(不拆分为子集) | |||
|  |      * | |||
|  |      * @param  $items 数据源 | |||
|  |      * @param integer $pid | |||
|  |      * @param integer $level | |||
|  |      * @param bool $clear 是否释放局部变量(外部调用时必须先释放,避免数据被累加;内部不用,需要累加) | |||
|  |      * @param bool $isArr 传入的$items是否为数组,默认否(数据集) | |||
|  |      * @param string $levelSpare 分层符 | |||
|  |      * @return void | |||
|  |      */ | |||
|  |     public static function groupSort($items,$pid = 0, $level = 1, $clear = true, $isArr = false, $levelSpare = '_') | |||
|  |     { | |||
|  |         static $data = []; | |||
|  |         if ($clear) { | |||
|  |             $data = []; | |||
|  |             static $data = []; | |||
|  |         } | |||
|  |         if(!empty($levelSpare) && $level > 1) { | |||
|  |             $levelSpare = str_repeat($levelSpare, $level-1); | |||
|  |         } | |||
|  |         if (count($items) > 0) { | |||
|  |             if ($isArr) { | |||
|  |                 foreach ($items as $key => $item) { | |||
|  |                     if ($item['parent_id'] == $pid) { | |||
|  |                         $item['level'] = $level; | |||
|  |                         $item['title'] = $levelSpare.$item['title']; | |||
|  |                         $data[] = $item; | |||
|  |                         self::groupSort($items, $item['id'], $level+1, false, $isArr); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } else { | |||
|  |                 foreach ($items as $key => $item) { | |||
|  |                     if ($item->parent_id == $pid) { | |||
|  |                         $item->level = $level; | |||
|  |                         $item->title = $levelSpare.$item->title; | |||
|  |                         $data[] = $item; | |||
|  |                         self::groupSort($items, $item->id, $level+1, false, $isArr); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  |         return $data; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 树形排序 (拆分子集) | |||
|  |      * | |||
|  |      * @param Collection $items 数据集(非数组) | |||
|  |      * @param integer $pid | |||
|  |      * @param integer $level | |||
|  |      * @return void | |||
|  |      */ | |||
|  |     public static function treeSort($items,$pid = 0, $level = 1) | |||
|  |     { | |||
|  |         $data = []; | |||
|  |         if (count($items) > 0) { | |||
|  |             foreach ($items as $key => $item) { | |||
|  |                if ($item->parent_id == $pid) { | |||
|  |                 $item->level = $level; | |||
|  |                 $children = self::treeSort($items, $item->id, $level+1); | |||
|  |                 $item->children = $children; | |||
|  |                 $data[] = $item; | |||
|  |                } | |||
|  |             } | |||
|  |         } | |||
|  |         return $data; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 查询用户权限(登陆时更具角色更新为最新权限) | |||
|  |      * 可显示权限和所有权限 角色权限 + 基本权限 | |||
|  |      * | |||
|  |      * @param boolean $groupId 角色ID,超级管理员(对应group_id = 1) | |||
|  |      * @return void | |||
|  |      */ | |||
|  |     public static function userRolesList($groupId = 1) | |||
|  |     { | |||
|  |         $userRoles = []; | |||
|  |         $items = null; | |||
|  |         $order = ['sort'=>'asc']; | |||
|  |         if ($groupId == 1) { | |||
|  |             $items = self::order($order)->select(); | |||
|  |         } else { | |||
|  |             $group = AuthGroup::getById($groupId); | |||
|  |             $rulesArr = []; | |||
|  |             if ($group && !empty($group['rules'])) { | |||
|  |                 $rulesArr = array_filter(explode(',', $group['rules'])); | |||
|  |             } | |||
|  |             if (count($rulesArr) >0) { | |||
|  |                 $items = self::wherein('id', $rulesArr)->whereOr('is_base', 1)->order($order)->select(); | |||
|  |             } else { | |||
|  |                 $items = self::where('is_base', 1)->order($order)->select(); | |||
|  |             } | |||
|  |         } | |||
|  |         if (empty($items) || $items->isEmpty()) { | |||
|  |             return $userRoles; | |||
|  |         } | |||
|  | 
 | |||
|  |         $allRulesId = []; | |||
|  |         $displayRules = []; | |||
|  |         $displayRulesId = []; | |||
|  |         foreach ($items as $key => $item) { | |||
|  |             $allRulesId[] = $item->id; | |||
|  |             if ($item->status > 0) { | |||
|  |                 $displayRules[] = $item; | |||
|  |                 $displayRulesId[] = $item->id; | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         $userRoles['allRules'] = $items; | |||
|  |         $userRoles['allRulesId'] = $allRulesId; | |||
|  |         $userRoles['displayRules'] = $displayRules; | |||
|  |         $userRoles['displayRulesId'] = $displayRulesId; | |||
|  |         return $userRoles; | |||
|  |     }  | |||
|  | 
 | |||
|  | } |