简洁常用权限系统的设计与实现(七):一种错误的不可行的构造树的方法

前面介绍了4种方法(实质是3种),构造树。

在此,需要特别说明的是,那些都是成功的、漂亮的方法和案例 ,但实际上在解决问题的过程中,有很多其它的尝试。
比如本篇介绍的方法,就是不可行的。
  想说明一个道理,在走向成功的道路上,会经历很多不算太成功的事情。

我们在前面的例子中,用递归计算子结点的深度level。但实际上,我最开始想到的一种方法正好反过来了。

思路:最底层的节点level为1,如果当前节点有父结点,就把自己的level+1,递归把自己的父结点的level+1.

// 计算所有节点的level

public static List<Map<String, Object>> caculateLevelWrong(

List<Map<String, Object>> privilegeList) {

List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();

resultList.addAll(privilegeList);

//默认所有的节点level为1

for (Map<String, Object> p : resultList) {

p.put("level", 1);

}

List<Map<String, Object>> topLevelList =  TreeMenuUtil.findTopLevelNodeList(privilegeList);

for (Map<String, Object> p : topLevelList) {

child(privilegeList, p);

}

return privilegeList;

}

private static void child(List<Map<String, Object>> list,

Map<String, Object> p) {

List<Map<String, Object>> childList = TreeMenuUtil.findAllChild(p,

list);

if (childList != null && childList.size() > 0) {

levelPlus(p);

parentPlusOne(p, list);

}

// 无法保证多个子结点,都有子结点的时候,他们的父结点,重复增加了level,而重复计算的次数很难去统计

for (Map<String, Object> child : childList) {

child(list, child);

}

}

这种方法,计算所有节点的level,可能会存在重复计算的情况。最下级的节点的level为1,与其它地方的定义不同。
为了解决重复计算的问题,我想到了把计算过的节点,维护下,防止重复计算,但是没有找到好的方法。

刚刚突然想到,既然从顶层到底层,计算level,是可行的。按说,从下至上计算level也是可以的。
这种方法,就不去尝试了,有兴趣的可以去试试。

方法已经有3种以上了,各有利弊,暂时就写到这吧。

等过段时间,权限系统有了新的进展之后,再继续...

To be continued...

原文首发:http://fansunion.cn/article/detail/575.html

时间: 2024-12-06 10:11:03

简洁常用权限系统的设计与实现(七):一种错误的不可行的构造树的方法的相关文章

简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树

第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树.  本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰.  坏处是:节点较多的时候,性能可能不够好.不能直接查询到节点的深度level.当然,如果需要level字段,在递归过程中,是可以计算得到的.关于在递归过程中,计算level,后面有介绍这种方法. 关于树的遍历和查找,大家都有基础,上面描述了一些总体思路,代码中有注释,基本就不用再详细介绍了. /

简洁常用权限系统的设计与实现(一):构造权限菜单树的N(N&gt;=4)种方法

权限系统,Web开发常见标准子系统之一.结合自己的一些思考和实践,从本篇开始权限系统的设计与实现之路. 最近,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇,只是大致介绍下这个问题,并给出4种方法的整体思路,后续再分别详细介绍这4种方法,再往后介绍完整的权限系统的设计与实现. 权限表的结构: acl.parent_acl, 最重要的就是这2个字段,有了这2个字段,就可以构造一棵树了. 前端需要的json格式: "data":[{ "acl":

简洁常用权限系统的设计与实现(三):维护和利用节点的深度level,迭代实现树的构造

如果在节点的属性中,增加一个level属性,即树的深度,构造树会非常容易.前提是,增加和修改节点的时候,要维护level. 根节点的level为1,下一级为2,以此类推. 构造树的方法,主要有2个: // 按照level排序,根节点在上,子结点在下 public static List<Map<String, Object>> buildTree(List<TreeNode> list) { List<Map<String, Object>> r

简洁常用权限系统的设计与实现(五):不维护节点的深度level,手动计算level,构造树

这种方式,与第三篇中介绍的类似.不同的是,数据库中不存储节点的深度level,增加和修改时,也不用维护.而是,在程序中,实时去计算的. 至于后面的,按照level升序排序,再迭代所有的节点构造树,与第三篇中的方法,完全一样.因此,本篇和下一篇,只介绍如何计算level,不再介绍后面的具体实现了. 计算level,采用递归方式. // 计算所有节点的level public static List<Map<String, Object>> caculateLevel( List<

电子商务系统的设计与实现(七):前后端系统UI设计的一些思考

对于大部分开发者来说,写界面是最烦人的事.我想,开发者最初诞生,以及我们在大学学习的时候,更加侧重的是程序设计和逻辑思维,而不是界面.界面更象是艺术,艺术和程序设计是两回事. 我个人还是想成为全栈式开发工程师,所以基本的UI还是必须能够搞定的. 就目前正在做的电子商务malling系统, 主要有2个系统需要做界面,前端商城和后端管理系统. 前端系统UI 在京东.淘宝.当当等购物网站中,我更偏好京东的设计,红色字体,用户体验也很好.商品分类和搜索框,选择商品,加入购物车.核心购物业务之外,就是个人

重装系统时启动失败,引导信息有错误,修复磁盘的主引导记录MBR方法

如果要修复这个磁盘的主引导记录MBR,必须在PE下才能进行,下面以通用PE工具箱来制作PE启动U盘. 先从网上把这个工具下载下来,安装到电脑上,先打开安装包,启动后,点"安装"即可. 步骤阅读 2 安装后,从桌面启动该软件,在软件界面, 先选择U盘,这时把U盘插上,会自动识别到U盘,然后设置U盘模式为"USB-HDD":U盘格式为"NTFS":U盘大小为"400MB". 步骤阅读 3 上面这些设置好后,检查一次,因为制作启动U

权限系统组织管理—具体设计说明书

前言: 上次聚哥让写具体设计文档.自己也写了自己模块的,认为写的挺好的.可是后来娥接手权限.我跟她说权限逻辑的时候,才发现非常多东西在具体设计文档中都没有写出来,所下面一个人接手的话,又要跑来问好多逻辑的问题.每一次都要做非常多反复性的工作.还有上次.做PB中期验收的毕业设计的时候,我没有下载到直接带着数据库的,可是材料中有数据库说明书,写的特别具体.所以我就依照别人的数据库说明书,搭建起来了,系统也成功跑起来了.这个时候认为这些文档特别的实用.所以,我想,别人看了我的具体设计说明书,是不是也可

通用权限系统框架功能实现设计

1  开发环境技术:B/S(.NET C# ) 1.Windows 7及以上 (支援最新Win 8) 2.Microsoft Visual Studio 2013 C#.NET 3..NET Framework 4.0及以上 (支援最新4.5版本) 4.SQL Server 2008 R2及以上 (支援2012/2014)框架特点 2  系统简介 1.帮企业快速地实现各种通用功能,结合系统现有的通用权限管理功能. 2.快速地开发出各种项目应用系统.让企业开发一个系统变得非常轻松. 3.符合RBA

架构设计分享之权限系统(看图说话)

前面一篇文章<最近架构随想>,我提到架构设计的一些构想,其实也是对之前项目经验的一些归纳及总结.今天我们就以权限系统作为切入点,谈一谈怎么设计权限系统以及怎么做到系统具有以下特性: Organized:如果系统组织比较好,可以起到事半功倍的效果. Encapsulated:对功能,结构,数据进行有效的封装,会使系统维护变得更加容易. Reusable:对常用功能以及组件进行有效的封装,可以使系统变得结构清晰且方便维护. Extensible:在设计系统的时候,如果很好的遵守OO的设计理念(OO