权限系统,Web开发常见标准子系统之一。结合自己的一些思考和实践,从本篇开始权限系统的设计与实现之路。
最近,重构了项目的权限菜单构造过程,向前端返回json格式的权限树。
这一篇,只是大致介绍下这个问题,并给出4种方法的整体思路,后续再分别详细介绍这4种方法,再往后介绍完整的权限系统的设计与实现。
权限表的结构:
acl、parent_acl, 最重要的就是这2个字段,有了这2个字段,就可以构造一棵树了。
前端需要的json格式:
"data":[{
"acl":1,
"children":[{
"acl":11,
"children":[{
"acl":111,
}]
}
方法1:
在数据库再增加1个level字段,最顶层的level就是1,每增加一级level增加1。
先从数据库按照level升序,获得所有的权限节点。
List<Map<String, Object>> rootList = new ArrayList<Map<String, Object>>();
Map<String, Map<String, Object>> rootMap = new HashMap<String, Map<String, Object>>();
for (遍历) {
创建节点,加入到根节点map中
if (顶级节点) {
加入到rootList中
} else {
获得父结点,把自己放到父结点的children中
}
}
遍历结束,rootList即为所求。List<Map<String, Object>> rootList = findRootList(privilegeList);
List<Map<String, Object>> notRootList = findNotRootList(privilegeList);
//先找出根节点,再为这些根节点构造子结点
for (Map<String, Object> root : rootList) {
// 构造子结点
buildChildList(root, notRootList);
finalRootList.add(root);
}
关键代码buildChildList是个递归函数。
buildChildList(){
从所有的非根节点中,找到当前节点的第1级子结点,加入到该节点的children中。
buildChildList();
}
好处是,不用维护level字段,增加和修改权限的时候,既不用维护level,也不用维护parent_acl。
湖北-武汉-循礼门
原文首发:http://fansunion.cn/article/detail/566.html
简洁常用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法
原文地址:http://blog.csdn.net/fansunion/article/details/41986587