美文网首页
权限个人逐级关系解析

权限个人逐级关系解析

作者: 两点半的杂货铺 | 来源:发表于2018-03-20 14:43 被阅读4次

一、思路

通过上一篇文章,我们知道了如何获取个人url和url对应的增删改查,

(一)、获取个人的url和对应的url所在的目录

  • 现在我们要做的是获取个人的url和对应的url所在的目录名,和url的名字
 menu_leaf_list = list(
                models.Url2Action.objects.filter(url2action2role__r__in=role_list) \
                    .exclude(url__menu__isnull=True).
                    values('url__menu', 'url__caption', 'url_id','url__url').distinct()
            )

上面返回的样式是[{'url__menu':'对应菜单id','url__caption':'对应url的标题','url_id':'对应url的id','url__url':'对应url的地址'}]

(二)、重新编辑获取的目录格式

  • 要考虑几点,第一点我们要展示的目录应该是,该用户所具备的才展示,第二点当用户通过url输入网址时能够打开对应的菜单显示
  • 分析上面两点后我们需要对我们的叶子菜单做处理,思路是从底部找到根部
  • 循环该用户的通过上面查询到的menu_leaf_list,我们重新设置一个字典k,v方便以后的使用
  • 分别额外加了status,child,opend,一次用来找到自己上级目录作为标记,???,默认Flase当判断的当前url和现在一直找到自己上级目录标记
  • 我们创建了个字典menu_leaf_dict ,用来重新格式化,格式化的格式

{'当前url标签id':[{.....},{.......}]}

  • 在数据库的url用正则表示,和用户的url做对比,一样就给自己所在的opend标记为true
 open_leaf_parent_id = None
        menu_leaf_dict = {}
        for item in self.menu_leaf_list:
            item = {
                'id': item['url_id'],
                'url': item['url__url'],
                'caption': item['url__caption'],
                'parent_id': item['url__menu'],
                'status': True,
                'child': [],
                # 判断菜单是否打开
                'opend': False
            }
            if item['parent_id'] in self.menu_leaf_list:
                menu_leaf_dict[item['parent_id']].append(item)
            else:
                menu_leaf_dict[item['parent_id']] = [item,]

            # 在数据库的url用正则表示,和用户的url做对比
            if re.match(item['url'],self.current_url):
                item['opend'] = True
                open_leaf_parent_id = item['parent_id']
        # {1: {'id': 1, 'caption': '菜单1', 'child': [], 'parent_id': None},}

(三)、获取数据库目录表

获取整个目录结构,通过查目录表
 menu_list = list(models.Menu.objects.values('id', 'caption', 'parent_id'))

(四)、把目录和个人权限统一格式

把目标也转换成个人权限的字典模式,所以要创建一个child,status,opend的k
# {1: {'id': 1, 'caption': '菜单1', 'child': [], 'parent_id': None},}
        # 创建一个字典在里面加一个child key
        menu_dict = {}
        for item in self.menu_list:
            item['child'] = []
            item['status'] = False
            item['opend'] = False
            menu_dict[item['id']] = item

(五)、整合我们把个人目录和整体目录做合并

  • 循环所有的个人目录列表,也就是menu_leaf_dict,因为现在和menu_dict格式是一致的,我么要做的是看当前个人url,目录id和主目录id是否一致,如果一致我们把个v保存在主目录的child中
  • 我们' parent_id = k'第一次k 等于当前个人url对应目录,我们找他的上级菜单的并吧status转换为true,然后再给'parent_id '重新赋值,获取这个目录的id,并吧他的上级目录stats转化为True,直到根目录,因为根目录'parent_id '是None
  • 循环标记打开菜单 同理
        for k, v in menu_leaf_dict.items():
            menu_dict[k]['child'] = v

            # 循环每一层的parent_id
            parent_id = k
            while parent_id:
                menu_dict[parent_id]['status'] = True
                parent_id = menu_dict[parent_id]['parent_id']

        # 循环标记打开菜单
        while open_leaf_parent_id:
            menu_dict[open_leaf_parent_id]['opend'] = True
            open_leaf_parent_id = menu_dict[open_leaf_parent_id]['parent_id']

(六)、把所有的根菜单放到主菜单下

  • 循环刚才整理过的主菜单menu_dict.values
  • 除了主目录没有关联的parent_id其余目录都存在,我们找到每个菜单对应的父目录id,并且放入他们的url中
  • 直到最后根目录是None,也就证明全部放完了,我们在吧这些放完的依次放到列表中存放
result = []
        for row in menu_dict.values():
            # 找到主菜单,主菜单自关联是None
            if not row['parent_id']:
                result.append(row)
            else:
                menu_dict[row['parent_id']]['child'].append(row)

        return result

相关文章

  • 权限个人逐级关系解析

    一、思路 通过上一篇文章,我们知道了如何获取个人url和url对应的增删改查, (一)、获取个人的url和对应的u...

  • JS不知道的那些事

    编译语言源码执行之前三个步骤 分词/词法分析(拆分成词法单元) 解析/词法解析(逐级潜逃生成“抽象语法树”) 代码...

  • 认证,权限,节流,版本,解析器的基本使用

    认证 权限 节流 版本 解析器

  • 从输入url到页面展现的过程

    1.在浏览器里输入URL 2.域名解析 浏览器通过DNS查找这个域名对应的IP地址,域名解析流程,逐级寻找直到找到...

  • 2019-07-06

    解析yaml配置文件,找到相关文件,进行权限更改

  • 【目录】Linux命令集合

    1、Linux常用20个命令(for me)2、Linux 文件权限含义解析3、Linux 文件/目录权限命令:c...

  • 后端篇 - 管理后台的权限规则

    管理后台的验证规则包涵权限和操作组的设计。 后台添加流程: 流程解析: 权限分配: 上文已解释清楚了权限分配的具体...

  • 经验总结(二):数据库

    数据库 设计简易关系型数据库 RDBMS程序实例存储管理:每个块/页存储多行数据缓存机制SQL解析日志管理权限划分...

  • Java类访问权限

    1 类访问权限 1.1 四种访问权限解析 Java有四种访问权限, 其中三种有访问权限修饰符,分别为private...

  • DRF

    一 认证 二 权限 三 节流 四 版本 五 解析器

网友评论

      本文标题:权限个人逐级关系解析

      本文链接:https://www.haomeiwen.com/subject/xvsqqftx.html