idKey = $idKey; if ($fidKey) $this->fidKey = $fidKey; if ($root) $this->root = $root; if ($data) { //var_dump($data); $this->data = $data; $this->getChildren($this->root, $closed); } //去掉键名 //var_dump($this->treeArray); return array_values($this->treeArray); } /** * @param int $root 父id值 * @return null or array */ private function getChildren($root, $closed) { $children = ''; foreach ($this->data as &$node) { if ($root == $node[$this->fidKey]) { $node['children'] = $this->getChildren($node[$this->idKey], $closed); $children[] = $node; } //只要一级节点 if ($this->root == $node[$this->fidKey]) { //$s=array('state'=>'close'); //array_push($node,'close'); if ($closed) { $node['state'] = $this->state; } $this->treeArray[$node[$this->idKey]] = $node; } } return $children; } /** * 根据 $token , 权限类型 获取该 token->userid->role 对应的所有权限 * @parms,$type 根据$perm_type = 'menu'时,判断是否菜单带有功能控件 * return array */ function getPermission($token, $perm_type, $menuCtrl = true) { $CI = &get_instance(); $CI->load->model('Base_model'); $BasetblArr = $CI->Base_model->getBaseTable($perm_type); if (empty($BasetblArr)) { var_dump($this->uri->uri_string . '$this->Base_model->getBaseTable 获取基础表失败...'); return; } $tblname = $BasetblArr[0]['r_table']; $PermArr = $CI->Base_model->getPerm($tblname, $token, $perm_type, $menuCtrl); return $PermArr; } /** * @parms, 根据$token获取拥有的菜单功能按钮控件权限 与vue前台perm.js 配合判断按钮隐藏与否 * return array */ function getMenuCtrlPerm($token) { $CI = &get_instance(); $CI->load->model('Base_model'); $PermArr = $CI->Base_model->getCtrlPerm($token); // 返回样例 // array(2) { // [0]=> // array(1) { // ["path"]=> // string(13) "/sys/menu/add" // } // [1]=> // array(1) { // ["path"]=> // string(14) "/sys/menu/edit" // } // } return $PermArr; } /** * 后端根据 $token,$uri 判断是否该用户是否过期及拥有的功能按钮控件操作权限 * 增/删/改/查 控制器引用 * @parms $token,$uri * return Array * return ['code' => 50008, 'message' => "非法的token"]; * return ['code' => 50014, 'message' => "Token 过期了"]; * return ['code' => 50016, 'message' => "无操作权限"]; * return ['code' => 50000, 'message' => "有操作权限"]; */ function HasPermit($token, $uri) { $CI = &get_instance(); $CI->load->model('Base_model'); // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; $tokenArr = $CI->Base_model->TokenExpired($token); if ($tokenArr['code'] != 20000) { return $tokenArr; } $PermArr = $CI->Base_model->getCtrlPerm($token); // getCtrlPerm 返回样例 // array(2) { // [0]=> // array(1) { // ["path"]=> // string(13) "/sys/menu/add" // } // [1]=> // array(1) { // ["path"]=> // string(14) "/sys/menu/edit" // } // } if (empty($PermArr)) { return ['code' => 50016, 'message' => "无操作权限 " . $uri, 'data' => $PermArr]; } // var_dump($this->uri->uri_string); // string(19) "api/v2/sys/menu/add" foreach ($PermArr as $k => $v) { if (strpos($uri, $v['path'])) { return ['code' => 50000, 'message' => "有操作权限 " . $uri, 'data' => $PermArr]; } } return ['code' => 50016, 'message' => "无操作权限 " . $uri, 'data' => $PermArr]; } /** * 将数据格式化成树形结构路由菜单 */ function genVueRouter($data, $idKey, $fidKey, $pId) { $tree = array(); foreach ($data as $k => $v) { // 找到父节点为$pId的节点,然后进行递归查找其子节点, if ($v[$fidKey] == $pId) { // 数据库取出为string类型,强制类型转换成整形,方便前端使用 isset($v['id']) ? $v['id'] = intval($v['id']) : ''; isset($v['pid']) ? $v['pid'] = intval($v['pid']) : ''; isset($v['type']) ? $v['type'] = intval($v['type']) : ''; isset($v['hidden']) ? $v['hidden'] = intval($v['hidden']) : ''; isset($v['listorder']) ? $v['listorder'] = intval($v['listorder']) : ''; // 构造 vue-admin 路由结构 meta $v['meta'] = [ 'title' => $v['title'], 'icon' => $v['icon'] ]; unset($v['title']); unset($v['icon']); $v['children'] = $this->genVueRouter($data, $idKey, $fidKey, $v[$idKey]); $tree[] = $v; // 循环数组添加元素 属于同一层级 } } // print_r($tree); return $tree; } // 菜单管理 -> 菜单列表 function genVueMenuTree($data, $idKey, $fidKey, $pId) { $tree = array(); foreach ($data as $k => $v) { // 找到父节点为$pId的节点,然后进行递归查找其子节点, if ($v[$fidKey] == $pId) { // 数据库取出为string类型,强制类型转换成整形,方便前端使用 isset($v['id']) ? $v['id'] = intval($v['id']) : ''; isset($v['pid']) ? $v['pid'] = intval($v['pid']) : ''; isset($v['type']) ? $v['type'] = intval($v['type']) : ''; isset($v['hidden']) ? $v['hidden'] = intval($v['hidden']) : ''; isset($v['listorder']) ? $v['listorder'] = intval($v['listorder']) : ''; $v['children'] = $this->genVueMenuTree($data, $idKey, $fidKey, $v[$idKey]); // vue treeselect 组件子节点为空时会列出,将空的子节点删除 children key. if (empty($v['children'])) { unset($v['children']); } $tree[] = $v; // 循环数组添加元素 属于同一层级 // print_r($tree); } } return $tree; } /** * 指定格式两个二维数组比较差集 * @param $array1 * @param $array2 * @return array */ // $arr1 = [ // ['role_id'=>1,'perm_id'=>1], // ['role_id'=>1,'perm_id'=>2] // ]; function array_diff_assoc2($array1, $array2) { $ret = array(); foreach ($array1 as $k => $v) { # var_dump($v); $isExist = false; foreach ($array2 as $k2 => $v2) { if (empty(array_diff_assoc($v, $v2))) { $isExist = true; break; } } if (!$isExist) array_push($ret, $v); } return $ret; } /** * 将数据格式化成树形结构 */ function genTree($data, $idKey, $fidKey, $pId) { // $tree = ''; $tree = array(); foreach ($data as $k => $v) { // 找到父节点为$pId的节点,然后进行递归查找其子节点, // 同时将子节点赋值至该节点的'children'元素,同时判断是否叶子节点 if ($v[$fidKey] == $pId) { $v['children'] = $this->genTree($data, $idKey, $fidKey, $v[$idKey]); // print_r($pId); // $v['isLeaf']=$v['children']?0:1; // $v['state']=$v['children']?'closed':'open'; $tree[] = $v; // 循环数组添加元素 属于同一层级 // print_r($v); // print_r($tree); } } return $tree; } /** * 将数据格式化成树形结构 ___非递归方式,使用了数组指针,与前面json方式一样,array 必须以1开头___ * @author Xuefen.Tong * @param array $items * @return array */ function genTree9($items) { $tree = array(); //格式化好的树 foreach ($items as $item) if (isset($items[$item['pid']])) $items[$item['pid']]['son'][] = &$items[$item['id']]; else $tree[] = &$items[$item['id']]; return $tree; } /** * 获取全部机构 * TODO:根据当前USERID 获取用户最高级机构所有下属机构 */ function getDept() { $CI = &get_instance(); $CI->load->model('Dept_model', 'Dept'); $array = $CI->Dept->getDeptids(); // var_dump($array); $max = 10000; $j = 0; for ($i = 0; $i < count($array); $i++) { // var_dump($array[$i]->DeptId); $arr = $CI->Dept->getDeptFatherId($array[$i]->DeptId); // var_dump($arr[0]->FatherLst); // var_dump(explode(",",$arr[0]->FatherLst)); // var_dump(count(explode(",",$arr[0]->FatherLst))); $fid_length = count(explode(",", $arr[0]->FatherLst)); if ($fid_length < $max) { $max = $fid_length; $j = $i; // 指针父机构最小长度 } } $fdeptid = $array[$j]->DeptId; // 最高机构ID $data = $CI->Dept->getOptDept($fdeptid); //获取下属所有机构树 $ret = $CI->Dept->getFahterId($fdeptid); //获取最高机构直属父ID作为终止节点 $root = $ret[0]->FatherId; // treelib 需要终止节点 // $root 最顶层fid // $b=$this->treelib->getTreeArray($data,'Id','FatherId',$root,1); // $b=$this->treelib->getTreeArray($data,'Id','FatherId',$root,1); // $b=str_replace(',"state":"closed","children":""',',"state":"open","children":""',json_encode($b)); // echo json_encode($b); // $b=$this->genTree($data,'Id','FatherId',$root); $b = $this->genTree($data, 'id', 'FatherId', $root); echo json_encode($b); } }