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

权限个人逐级关系解析

作者: 两点半的杂货铺 | 来源:发表于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
    

    相关文章

      网友评论

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

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