左侧菜单栏的二级标签设计

一 、后台管理系统中的左侧菜单栏设计

  设计理念:通过Django中的自定义标签设计 ,可以实现一级菜单,例如home的主页。可以实现二级菜单,例如客户列表中包含:公有客户信息菜单+私有客户信息菜单

  1.1 设计数据结构:

# 数据结构:init_perssion初始化文件,在登录成功后在数据结构设计
        
# 菜单字典数据类型
# 存放菜单信息
  menu_dict = {}

  for item in permission_query: # 这里permission_query是个字典数据类型
        if item["menu_id"]:
            if item["menu_id"] in menu_dict:
                menu_dict[item["menu_id"]]["children"].append({
                    "menu_id": item.get("menu_id", None),
                    "title": item.get("title"),  # 面包屑
                    "url": item.get("url"),
                    "pk": item["pk"]
                })
            else:
                menu_dict[item["menu_id"]] = {
                    "title": item["menu__title"],
                    "icon": item["menu__icon"],
                    "masterurl": item.get("menu__masterurl", None),
                    "children": [{
                        "menu_id": item.get("menu_id", None),
                        "title": item.get("title", None),
                        "url": item.get("url", None),
                        "pk": item["pk"]
                    }]

                }


# 把设计的数据结构存放在session的
# 将菜单信息写入到session
request.session[settings.MENU_SESSION_KEY] = menu_dict
 

  1.2 自定表标签:inclusion_tag使用

  注意:1.在项目中创建一个templatetags文件夹,在里面在创建一个py文件用于标签的设计

# rbac.py文件

from
django import template # 创建一个注册器 register = template.Library() from django.conf import settings# 返回menu_list到rbac/menu.html进行渲染标签 @register.inclusion_tag('rbac/menu.html') def menu(request): # 获取session中的字典数据 menu_dict = request.session.get(settings.MENU_SESSION_KEY) for key, item in menu_dict.items(): # 这里item这个每个字典中增加一个键值对,如果当前二级菜单有其他操作,不能关闭当前二级展开的标签 item["class"] = "" # url = item['url'] # if re.match('^{}$'.format(url), request.path_info): # 二级标签中列表中存放多个字典,每个字典则为一个二级标签 for child in item["children"]: # 每个二级标签中其他操作附属于当前二级标签,则权限表中的当前字段的pid等于二级标签操作的pk值 if request.show_id == child["pk"]: # 点击当前标签或者二级标签的操作时,菜单栏则不关闭,active:bootstrap自定义属性 item['class'] = 'active' child["class"] = "active" break # 返回到inclusion_tag指定的模板中渲染 return {"menu_dict": menu_dict}

  1.3 在inclusion_tag中指定模板渲染:

# menu.html文件

{% for menu in menu_dict.values %}

    {% if menu.masterurl %}
        <li>
            <a href="{{ menu.masterurl }}">
                <i class="fa {{ menu.icon }}"></i>
                <span>{{ menu.title }}</span>
            </a>
        </li>

    {% else %}
        <li class="treeview {{ menu.class }}">

        <a href="" class="">
            <i class="fa {{ menu.icon }}"></i>
            <span>{{ menu.title }}</span>
            <span class="pull-right-container">
                    <span class="fa fa-angle-left pull-right"></span>
                </span>
        </a>

    {% endif %}

{# 二级标签 #}
<ul class="treeview-menu">
    {% for child_menu in menu.children %}
        {% if child_menu.menu_id != 1 %}
            <li class="">
                <a href="{{ child_menu.url }}">
                    <i class="fa fa-circle-o"></i> {{ child_menu.title }}
                </a>
            </li>
        {% endif %}
    {% endfor %}
</ul>

</li>

{% endfor %}

  1.4 自定义标签在模板文件中引用:

# base.html文件


{% load 'rbac' %}
{% menu request %}

  1.5 数据库的图例

  1.菜单Menu表图例:

  

  2.权限Permission表图例

   

 

posted @ 2019-06-24 18:02  Amorphous  阅读(1112)  评论(0编辑  收藏  举报