zoukankan      html  css  js  c++  java
  • django crm 左侧二级菜单栏

    1.如何生成二级菜单栏

      在 rbca表中生成一张表 menu , 表示可能需要给客户展示的一级菜单栏

      在permission表中 ,创建字段,通过多对一外键关系,关联到menu表,表示哪些permission要在二级菜单栏显示,显示到哪个一级菜单栏下面

      在initial_session 权限注入的时候,注入一个字典 permission_menu_dict  > 格式如下:

        '''目标数据结构
            {
                1:{  # 1--menu_id
                    'title':'..',
                    'icon':'xx',
                    children:[
                        {'title':'二级','url':'xx'},
                        {'title':'二级','url':'xx'},
                    ]
                },
                2:{  # 2--menu_id
                    'title':'..',
                    'icon':'xx',
                    children:[
                        {'title':'二级','url':'xx'},
                        {'title':'二级','url':'xx'},
                    ]
                }
                
            }
            
        '''
    rbac.py

      在自定义标签中循环该字典生成标签

    from django import template
    from django.urls import reverse
    register = template.Library()
    
    from django.conf import settings
    import re
    
    @register.inclusion_tag('rbac/menu.html')
    def menu(request):
        # menu_list = request.session.get('permisson_menu_list')
        menu_dict= request.session.get('permisson_menu_dict')
        for key,item in menu_dict.items():
            item['class'] = 'hide'
    
            for child in item['children']:
                # /customer/add/
                # 'url': '/customer/list/'
                # 'url': '/payment/list/'
                # # if re.match('^{}$'.format(child['url']), request.path):
                if request.show_id == child['pk']:
                    # null == child['pk'] 1
    
                    item['class'] = ''
                    child['class'] = 'active'
                    break
    
    
        return {"menu_dict": menu_dict}
    
    
    
    @register.filter
    def haspermission(base_url,request):
    
    
        for item in request.session['permisson_list']:
            #item = {'url','','title':'','name':''}
            reg = '^%s$' % item['url']  #/customer/edit/(d+)/ --- "/customer/edit/
            # /"
            ret = re.search(reg, base_url)
            # if item['name'] == base_url:
            if ret:
                return True
    
        return False
    rbac.py
    from django.db import models
    
    class Menu(models.Model):
    
        title = models.CharField(max_length=32, verbose_name='一级菜单', null=True, blank=True)
        icon = models.CharField(max_length=32, verbose_name='一级菜单图标', null=True, blank=True)
    
    
    
    class Permission(models.Model):
        """
        权限表
        """
        title = models.CharField(max_length=32, verbose_name='标题')
        url = models.CharField(max_length=32, verbose_name='权限')
    
        # is_menu = models.BooleanField(default=False, verbose_name='是否是菜单')
        menu = models.ForeignKey('Menu',null=True)
    
        pid = models.ForeignKey('self',null=True)
    
        class Meta:
            verbose_name_plural = '权限表'
            verbose_name = '权限表'
        
        def __str__(self):
            return self.title
    
    
    class Role(models.Model):
        name = models.CharField(max_length=32, verbose_name='角色名称')
        permissions = models.ManyToManyField(to='Permission', verbose_name='角色所拥有的权限', blank=True)
        
        def __str__(self):
            return self.name
    
    
    class User(models.Model):
        """
        用户表
        """
        name = models.CharField(max_length=32, verbose_name='用户名')
        password = models.CharField(max_length=32, verbose_name='密码')
        roles = models.ManyToManyField(to='Role', verbose_name='用户所拥有的角色', blank=True)
        
        def __str__(self):
            return self.name
    models.py
    from rbac import models
    
    def initial_session(request,user_obj):
        permission_obj = models.Permission.objects.filter(role__user=user_obj).values('title','url','pk','menu_id','menu__title','menu__icon').distinct()
        # print(permission_obj)
    
        permission_list = []
        permission_menu_dict = {}
        for item in permission_obj:
    
            permission_list.append(item['url'])
            if item['menu_id']:
                if item['menu_id'] not in permission_menu_dict:
                    permission_menu_dict[item['menu_id']] = {'title':item['menu__title'],'icon':item['menu__icon'],'children':[{'title':item['title'],'url':item['url']}]}
                else:
                    permission_menu_dict[item.menu_id]['children'].append({'title':item['title'],'url':item['url']})
    
    
    
        # permission_list = [i.url for i in permission_obj]
        request.session['permission_list'] = permission_list
        request.session['permission_menu_dict'] = permission_menu_dict
        print(permission_menu_dict)
    
    
    
        '''
        1. 循环生成2级菜单
            生成一个字典
              permission_menu_dict  =  { 
                1:{}
              }
        
        
        
        
        '''
    permission_input
    <div class="static-menu">
    
    {#    {% for item in menu_list %}#}
    {#        {% if item.active %}#}
    {#            <a href="{{ item.url }}" class="{{ item.class }} active">#}
    {#            <span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.title }}</a>#}
    {#        {% else %}#}
    {#            <a href="{{ item.url }}" class="{{ item.class }} ">#}
    {#            <span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.title }}</a>#}
    {#        {% endif %}#}
    {##}
    {##}
    {#    {% endfor %}#}
            {% for item in menu_list.values %}
    
            <div class="item">
                <div class="title">
                    <i class="{{ item.icon }}"></i>{{ item.title }}
                </div>
                {% for child in item.children %}
                    <div class="body {{ item.class }}">
                        <a href="{{ child.url }}" class="{{ child.class }}">{{ child.title }}</a>
                    </div>
                {% endfor %}
    
            </div>
    
        {% endfor %}
    </div>
    menu.html
    <script>
        $('.item .title').click(function () {
        $(this).next().toggleClass('hide');
        $(this).parent().siblings().children(".body").addClass("hide")
    });
    </script>
    layout.html
  • 相关阅读:
    JS立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( )) 有区别?
    JS闭包和引用
    数据驱动测试二:使用TestNG和CSV文件进行数据驱动
    在SpringTest中将Mockito的mock对象通过spring注入使用
    Mockito各场景使用介绍
    mockito中两种部分mock的实现,spy、callRealMethod
    Docker学习笔记
    Docker实践(二):容器的管理(创建、查看、启动、终止、删除)
    mac 安装 RabbitMQ
    Mac 隐私与安全没有允许任何来源选项
  • 原文地址:https://www.cnblogs.com/zhangjian0092/p/11046411.html
Copyright © 2011-2022 走看看