现在开始实现其中关于节点部分的实现吧,尽量整理到细节。
添加节点
节点的话,有区分一级节点和子节点。一级节点有icon,且pid=0。
递归遍历节点
将数据库node表中的节点全部取出,并根据其id和pid关系使用递归方法遍历成树形的数组结构。
先看下演示的node数据吧!
为了演示,特意将用户管理的pid改为3,其实应该是1的。
分享我递归遍历node的方法,代码是放在系统管理的模型model中的:
/**
* 将节点数组递归遍历成树
* @param array $node_list 所有节点数组
* @param integer $pid 父节点id
* @return array $nodes 节点树
*/
public function nodeToTree($node_list,$pid=0){
$nodes = $tmp_arr = [];
foreach ($node_list as $k => $v) {
if($v['pid']==$pid){
$tmp_arr = $this->nodeToTree($node_list, $v['id']);
if($tmp_arr) $v['son'] = $tmp_arr;
$nodes[] = $v;
unset($node_list[$k]);
}
}
return $nodes;
}
核心还是找出规律,这里以pid为核心,注意理解函数开始时创建的两个空数组吧。关于递归,更多需要自己后续学习。。
遍历结果:
显示并添加节点增删改功能
访问系统管理下的节点管理,显示节点树。
这里添加的每一个节点,就是权限设置的单元。
至于左侧的导航栏也会从节点表里取is_nav=1的数据根据当前角色的权限生成导航栏,中间考虑加入缓存或者使用iframe,避免多次查询数据库和构造导航栏。
导航栏的状态也是一个问题,思路是给导航栏上的节点li加标识,通过当前act和op,使用js改变状态。
节点树的样式和js参考这里: bootstrap tree , 自己改改吧,然后就是点击节点,在其后跟上增删改的操作按钮。
我的方法:
对节点$nodes 进行一层foreach循环,循环调用 createNodeHtml 方法,当然整个字符串变量html是引用传递,就好比很多小树排队一样。
节点树缓存
上面的一顿操作,针对使用整张节点表取数据,递归,循环等生成的节点树,如果每次请求都要生成的话,感觉很浪费性能。而且不单单节点管理的时候要用到,在给角色附加权限的时候,也要可视化的选择节点,也要用到节点树。所以我的做法是给节点树加缓存。
然后对应的在节点增删改成功后,都要跟上 Cache::del('nodeTree');//删除节点树缓存 nodeTree
最后
未完待续。。。下一篇 角色篇