权限系统。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即为所求。

这样的方法是一个同事的思路,关键就是2点,一是维护level(添加和改动的时候都须要)。2是要依照level升序排序。

方法2:数据库不须要level字段。用递归来实现。

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

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。

方法3:全然依照方法1的思路,唯一不同的是,数据库不维护level字段,而是在查询数据出来之后。手动计算每个节点的level字段,进行排序。

后面的步骤,和方法1基本一样。

因此。这样的方法的唯一难点就是,怎样计算一颗N叉树每个节点的深度。

方法4: 计算一颗N叉树每个节点的深度,经过实践。至少有2种方法。

a.依照方法2的递归思路,再维护一个level,向child深入一层,level++,返回level--。及时保存当前节点的level,递归结束。level就都计算完毕。

b. 參照网上的一种思路。把“无序的Tree格式的List。转化打印出标准格式Treelist”。

作者也是依照递归思路实现的,在这个代码的基础上。再维护1个level。就能够了。

a和b的思路类似的地方是。都在递归过程中维护1个level,不同的地方是。a的方法仅仅单纯地计算level,而b不但计算了level,还把节点排序了。

当然,a方法也是能够的。

方法5:这样的方法不可行,问题是。存在着反复计算的可能。
 全部节点初始level额外i1.
 找到全部的根节点。

遍历每个节点,假设发现自己有父结点,就把自己的level和全部父节点的level+1。

问题:无法保证多个子结点,都有子结点的时候,他们的父结点,反复添加了level,而反复计算的次数非常难去统计。

小雷FansUnion-博学的互联网技术工作者,提供付费的IT咨询服务
2014年11月17日

湖北-武汉-循礼门

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

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

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

    权限系统,Web开发常见标准子系统之一.结合自己的一些思考和实践,从本篇开始权限系统的设计与实现之路. 最近,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇,只是大致介绍下这个 ...

  2. 基于资源的权限系统-API设计

    概述 权限系统需要和别的系统集成,因此,良好的API是易用性的保证. 这里只设计一些权限相关的核心 API,关于用户,组织,导入导出之类的后续再逐步补充 API 设计 围绕权限有以下 4 类 API: ...

  3. python 全栈开发,Day107(CRM初始,权限组件之权限控制,权限系统表设计)

    一.CRM初始 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ...

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

    第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树.  本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰 ...

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

    如果在节点的属性中,增加一个level属性,即树的深度,构造树会非常容易.前提是,增加和修改节点的时候,要维护level. 根节点的level为1,下一级为2,以此类推. 构造树的方法,主要有2个: ...

  6. 简洁常用权限系统的设计与实现(六):不维护节点的深度level,手动计算level,构造树 (把一颗无序的树,变成有序的)

     本篇介绍的方法,参考了网上的代码.在递归过程中,计算level,是受到了这种方法的启发. CSDN上有篇关于树的算法,目标是把一个无序的树,变成有序的. 我看了下代码,并运行了下,感觉是可行的. 我 ...

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

     这种方式,与第三篇中介绍的类似.不同的是,数据库中不存储节点的深度level,增加和修改时,也不用维护.而是,在程序中,实时去计算的. 至于后面的,按照level升序排序,再迭代所有的节点构造树,与 ...

  8. YbSoftwareFactory 代码生成插件【十七】:先进的权限模型体系设计

    目前权限管理系统不少,但通用.灵活.符合现代企事业单位实际工作需要的不多.现有的权限系统绝大多数都是以模块为核心,而本权限模型将摒弃此类普遍的做法,将以组织机构为核心来进行权限系统的设计,因为这更符合 ...

  9. 权限系统(RBAC)的数据模型设计

    前言: RBAC是Role-Based Access Control的缩写, 它几乎成为权限系统的数据模型的选择标配. 之前写个两篇关于权限系统的文章, 主要涉及如何在应用中实现权限控制, 对权限系统 ...

随机推荐

  1. windows服务器提权前请先执行systeminfo命令

    pr.巴西烤肉 对应补丁 好多朋友见到Windows服务器就祭出pr.巴西烤肉一气搞,忙完免杀又忙找可写目录,最后发现服务器打上了对应的补丁.笔者在提权前都会执行systeminfo命令,查看对应补丁 ...

  2. go语言基础之break和continue的区别

    1.break和continue的区别 在循环里面有两个关键操作break和continue,break操作是跳出当前循环,continue是跳过本次循环. 2.break 备注:break可⽤于fo ...

  3. c# 滚动字幕的实现

    在c#中其实滚动屏幕的实现很简单,只需要用到Graphics.DrawString方法. Graphics.DrawString (String s, Font font, Brush brush, ...

  4. Spring定时器多定时任务配置

    spring-task.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...

  5. 【crontab】“bad minute”及“errors in crontab file, can't install”错误处理

    今天有朋友提到,在使用crontab定制后台定时备份任务时报出“bad minute”及“errors in crontab file, can't install”错误.经确认,根本原因是cront ...

  6. 怎样获取shell函数的返回值及shell命令的返回值?

    1.获取shell函数调用的返回值: #!/bin/sh info() { cat jlb.sh } res=`info` echo "state: "$? echo " ...

  7. Android倒计时案例展示

    1. Handler 与Message方法实现倒计时功能 关于Handler与Message消息机制的原理可查看:Android--Handler使用应运及消息机制处理原理分析 这个设计思路也是最经常 ...

  8. [Algorithm] Reverse array of Chars by word

    For example we have: ["p", "r", "e", "f", "e", &qu ...

  9. phpnow 在win7下遇到“安装服务[apache_pn]失败”问题的一种解决办法

    安装PHPnow时如果遇到下列问题: 安装服务[apache_pn]失败.可能原因如下: 1. 服务名已存在,请卸载或使用不同的服务名. 2. 非管理员权限,不能操作 Windows NT 服务. 将 ...

  10. HTML5 Canvas(画布)实战编程初级篇:基本介绍和基础画布元素

    欢迎大家阅读HTML5 Canvas(画布)实战编程初级篇系列,在这个系列中,我们将介绍最简单的HTML5画布编程.包括: 画布元素 绘制直线 绘制曲线 绘制路径 绘制图形 绘制颜色,渐变和图案 绘制 ...