权限系统。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

转载于:https://www.cnblogs.com/llguanli/p/6769538.html

简洁经常使用权限系统的设计与实现(一):构造权限菜单树的N(Ngt;=4)种方法相关推荐

  1. 企业级权限系统架构设计 (v 2.0)

    企业级权限系统架构设计 (v 2.0) Ⅰ. 系统概况 1. 层级关系(权限视角) 1.1 [一级权限]访问权限 功能说明 登录系统的下游,通过身份认证控制访问目标. 建立生态系统:开放平台级的授权访 ...

  2. 通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计

    一.权限系统 这一天将讲述一个基本的基于数据库的权限管理系统的设计,在这一天的课程的最后将讲述"左右值无限分类实现算法"如何来优化"系统菜单"的结构而告终.今天 ...

  3. J2EE开发之(六)之漫谈基于数据库的权限系统的设计

    一,权限系统 这一天将讲述一个基本的基于数据库的权限管理系统的设计,在这一天的课程的最后将讲述"左右值无限分类实现算法"如何来优化"系统菜单"的结构而告终.今天 ...

  4. Android权限系统(三):运行时权限检查和申请,PermissionController

    请求应用权限的最佳实践   Google提供的请求应用权限的说明如下:请求应用权限   官方提供的模板使用了三个条件分支来请求应用权限:   1.checkSelfPermission用来检查应用是否 ...

  5. Android权限系统(一):开机获取权限信息

    一.SystemConfig的整机权限信息   Android在SystemConfig的构造函数中会通过读取相关的文件来加载整机的权限信息.这些文件是{partition}/etc/permissi ...

  6. DAC MAC RBAC ABAC 权限系统的设计

    访问控制Access Control DAC (Discretionary Access Control) 自主访问控制,有权限的人可以给这个权限授权 MAC( Mandatory Access Co ...

  7. Linux系统中删除虚拟机,要删除利用虚拟机安装的linux操作系统,下面哪种方法不能实现删除虚拟系统?...

    _ 下列受法律保护的是(). 双级调节器的高速触点在什么情况时起作用? "曲水流觞"是发生在传统节日()的活动. 女性,64岁,车祸后4小时,临床高度怀疑骨盆粉碎性骨折.查体:血压 ...

  8. php设计鸡兔同笼问题解法,数量关系解题技巧:三种方法巧解鸡兔同笼问题

    [导读] 中公事业单位为帮助各位考生顺利通过事业单位招聘考试!今天为大家带来数量关系解题技巧:三种方法巧解鸡兔同笼问题. 鸡兔同笼问题是事业单位考试中比较常见的一种题型,题干特征非常明显,解题方法多样 ...

  9. ToB产品设计:用户权限系统解析

    ToB产品设计:用户权限系统解析 文章以产品经理的角度思考,对权限系统的核心进行剖析,抽象出权限系统中的核心要素,并结合钉钉的一些做法对权限系统进行介绍. 一.什么是用户权限系统 权限管理系统是任何一 ...

最新文章

  1. JVM 调优 —— 新生代 Survivor 空间不足
  2. 怎么用esc服务器做网站,云服务器esc能做网站
  3. c语言入门教程文库,C语言入门教程(全集)课件
  4. Android应用开发:CardView的使用及兼容
  5. Invoke and BeginInvoke BeginInvoke和EndInvoke方法 (转)3
  6. HashSet 与HashMap底层实现
  7. idea-导入其他项目模块的包爆红
  8. win10环境下MinGW和MSYS的安装与配置
  9. 事记:关于远控软件导致win10屏幕亮度无法调节的解决方案
  10. 汉印全能电子面单打印机-N41
  11. 详解 python 的 切片
  12. PCB碎碎念——贴片封装与标识
  13. android 镜像文件img 介绍
  14. windows下搭建ITS运行环境
  15. vue 中监听document.body.scrollTop 值总为0的解决方法
  16. ViewPage2简单使用
  17. Android 卡顿验证方法1:系统跟踪 Perfetto
  18. 《嵌入式 - Lwip开发指南》第4章 移植LWIP(基于RT-Thead系统-以太网+Wifi)
  19. ggplot2一页多图(组合图)
  20. 上班第一天,大家都在干什么呢?‘Java研发工程师上班‘

热门文章

  1. 代码设置margintop_关于内层DIV设置margin-top不起作用的解决方案
  2. AcWing 4241. 货物运输
  3. oracle自动分区如何创建本地索引吗,创建与管理Oracle分区表和本地索引的实例解析...
  4. ChainerCV︱堪比Opencv--深度学习工具库(Faster R-CNN、SSD 和 SegNet)
  5. [NLP]OpenNLP标记器的使用
  6. sumk 2.0.0 发布,轻量级互联网框架
  7. mongodb远程连接访问
  8. Div层悬浮实现HTML5 Canvas背景动画
  9. Typescript学习笔记(二)枚举
  10. Linux设备驱动简析—PC重启源码分析