zoukankan      html  css  js  c++  java
  • 双层菜单

    一. Django数据库使用顺序

     

    如果在settingsDATABASES中为某一app配置的数据库,则该app使用这个数据库,如果app没有配置专门的数据库,则使用default中配置的数据库

    二. orm,为关联表的主表查询字表时起别名:related_name

     

    三. 主表与子表的级联删除

    1.主表与字表

     

    1. 级联删除

     

    删除主表中某条记录,子表中的关联内容也会删除,删除子表中木条记录,主表中的关联内容不会被删除

    .db_constraint属性

    该属性可以实现不建立约束关系,但能应用建立约束所使用的查询接口

    用于某些项目中的数据实际上具有一对多或多对多或一对一的关系,但是并不能够建立约束,此时如果不适用该属性,无法应用orm提供的查询接口,操作起来非常麻烦.

    .创建二级菜单

      实现效果:

        信息管理

          客户列表

        财务管理

          缴费列表

    1. 表结构更改(背景灰色为新增部分):
     1 class Menu(models.Model):
     2     title = models.CharField(max_length=32, verbose_name='菜单')
     3     icon = models.CharField(max_length=32, verbose_name='图标', null=True, blank=True)
     4 
     5 class Permission(models.Model):
     6     title = models.CharField(max_length=32, verbose_name='标题')
     7     url = models.CharField(max_length=32, verbose_name='权限')
     8     menu=models.ForeignKey("Menu",on_delete=models.CASCADE,null=True)
     9  
    10     class Meta:
    11         verbose_name_plural = '权限表'
    12         verbose_name = '权限表'
    13     
    14     def __str__(self):
    15         return self.title
    1. 注入二级菜单所有信息

     

    3.注入信息

     1 from rbac.models import Role
     2 def initial_sesson(user,request):
     3     """
     4     功能:将当前登录人的所有权限录入session中
     5     :param user: 当前登录人
     6     """
     7     # 查询当前登录人的所有权限列表
     8     # 查看当前登录人的所有角色
     9     # ret=Role.objects.filter(user=user)
    10     permissions = Role.objects.filter(user=user).values("permissions__url",
    11                                              "permissions__title",
    12                                              "permissions__menu__title",
    13                                              "permissions__menu__icon",                                                                                                                                               " permissions__menu__pk").distinct()
    14     permission_list = []  
    15     permission_menu_dict ={}
    16     for item in permissions:
    17         # 构建权限列表
    18         permission_list.append(item["permissions__url"])
    19         # 菜单权限
    20         menu_pk=item["permissions__menu__pk"]
    21         if menu_pk:
    22             if menu_pk not in permission_menu_dict:
    23                 permission_menu_dict[menu_pk]={
    24                      "menu_title":item["permissions__menu__title"],
    25                      "menu_icon":item["permissions__menu__icon"],
    26                      "children":[
    27                          {
    28                              "title":item["permissions__title"],
    29                              "url":item["permissions__url"],
    30                          }
    31                      ],
    32 
    33                 }
    34             else:
    35                 permission_menu_dict[menu_pk]["children"].append({
    36                     "title": item["permissions__title"],
    37                     "url": item["permissions__url"],
    38                 })
    39     print("permission_menu_dict",permission_menu_dict)
    40     # 将当前登录人的权限列表注入session中
    41     request.session["permission_list"] = permission_list
    42     # 将当前登录人的菜单权限字典注入session中
    43     request.session["permission_menu_dict"] = permission_menu_dict

    3.1信息格式:(bejson在线转换格式工具)

    元数据:

    [  {
            'permissions__url': '/customer/list/',
            'permissions__title': '客户列表',
            'permissions__menu__title': '信息管理',
            'permissions__menu__icon': 'fa fa-connectdevelop',
            'permissions__menu__pk': 1
        },  
        
        {
            'permissions__url': '/mycustomer/',
            'permissions__title': '我的私户',
            'permissions__menu__title': '信息管理',
            'permissions__menu__icon': 'fa fa-connectdevelop',
            'permissions__menu__pk': 1
        },  
        
        {
            'permissions__url': '/payment/list/',
            'permissions__title': '缴费列表',
            'permissions__menu__title': '财务管理',
            'permissions__menu__icon': 'fa fa-code-fork',
            'permissions__menu__pk': 2
        }, ]

    目标数据:

    {
       1:{
            "title":"信息管理",
            "icon":"",
            "children":[
                {
                  "title":"客户列表",
                  "url":"",
                }
            ]
            
          },
          
       2:{
            "title":"财务管理",
            "icon":"",
            "children":[
                {
                  "title":"缴费列表",
                  "url":"",
                },
            ]
            
          }, 
      
    
    }

    4.注入之后要清浏览器的session

    5.获取信息,渲染到页面上

    在过滤器中:

    1 @register.inclusion_tag("rbac/menu.html")
    2 def get_menu_styles(request):
    3     permission_menu_dict = request.session.get("permission_menu_dict")
    4     print("permission_menu_dict",permission_menu_dict)
    5     return {"permission_menu_dict":permission_menu_dict}

    menu.HTML

     1 <div class="multi-menu">
     2     {% for item in permission_menu_dict.values %}
     3        <div class="item">
     4         <div class="title"><i class="{{ item.menu_icon }}"></i>{{ item.menu_title }}</div>
     5         <div class="body">
     6               {% for foo in item.children %}
     7                   <a href="{{ foo.url }}">{{ foo.title }}</a>
     8               {% endfor %}
     9         </div>
    10        </div>
    11     {% endfor %}
    12 </div>

    前端调用:

    1 <div class="menu-body">
    2        {% load web %}
    3        {% get_menu_styles request %}
    4 </div>

    获得样式的css:

     1 .multi-menu .item > .body {
     2     border-bottom: 1px solid #dddddd;
     3 }
     4 
     5 .multi-menu .item > .body a {
     6     display: block;
     7     padding: 5px 20px;
     8     text-decoration: none;
     9     border-left: 2px solid transparent;
    10     font-size: 13px;
    11 
    12 }
    13 
    14 .multi-menu .item > .body a:hover {
    15     border-left: 2px solid #2F72AB;
    16 }
    17 
    18 .multi-menu .item > .body a.active {
    19     border-left: 2px solid #2F72AB;
    20 }

    6.二级菜单隐藏效果,获得事件的js

    1 $('.item .title').click(function () {
    2     $(this).next().toggleClass('hide');
    3     $(this).parent().siblings().children(".body").addClass("hide")
    4 });

     

  • 相关阅读:
    ElasticSearch「1」本地安裝Elasticsearch 6.0.1 + Elasticsearch-head插件
    HDFS Erasure Coding介绍
    Cassandra VS HBase
    Hadoop入门 【1】 下载源码,构建
    HBase ProcedureV2 分析
    github创建maven项目过程
    ruby, gem install 出现网络错误
    Ketama Consisent Hash
    [转]产品经理 书目录
    [算法]动态规划之最长公共子序列
  • 原文地址:https://www.cnblogs.com/shanghongyun/p/9977245.html
Copyright © 2011-2022 走看看