• rbac


    动态生成一级菜单:

    model里修改字段为

    在登录查询用户时,将四个字段的信息都查询出来

    并根据用户能够访问的网页权限和显示的菜单 blank表示页面输入可以为空 null=true 表示数据表可以为空

    分为权限列表和菜单列表

    permission_list

    menu_list

    权限信息用来验证用户能够访问的页面

    菜单列表用来显示用户可以访问的页面

    页面可以接受request

    request.session.menu来得到ur,title,icon显示在页面上可以用for循环实现

    一级菜单优化

    在页面request.session.menu是写死了

    创建templatetags包

    里面my_tags.py

    通过sample.inclusion.tags方法

    写一个menu函数,再创建一个menu页面menu.html

    里面讲request.session.menu内容复制进去

    再在原页面写{%load my_tags%}

    {%menu request%}导入

    给访问的菜单加active属性

    在menu函数里

    因为知道要访问的页面url request.path_info

    循环菜单列表时

    如果这个菜单的url和访问页面相同时 用正则进行判断 re.match(item[url],request.path_info):

    里面 item['class']=active加入active属性

    在页面用menu.class显示

    rbac功能整合

    功能整合就是将rbac的所有函数,页面,css都拖到自己的rbac的app里,使rbac独立起来可以随时调用

    应用rbac组件的流程

    1.将rbac app直接拷贝进来

      在settings里注册rbac app

    2 数据库的迁移

      1删除rbac下migrations下除init外的其他py文件

      2执行命令

    3 录入权限信息 ,通过Django自带的admin页面

      1.首先创建超级用户

        python manage.py createsuperuser

      2.登录admin

        1.通过rbac里已经写完的角色,权限,用户信息

          录入权限信息 角色信息 用户信息

        2.分配对应的关系

    4.登陆成功后调用权限初始化的函数permission

      通过permission将用的权限信息放入权限列表 菜单信息放入菜单列表

      from rbac.service.permission import init_permission

      init_permission(request,obj)  # 传入request和obj

    5.在settings里注册权限的中间件

      MIDDLEWARE = [
            'rbac.middlewares.rbac.RbacMidlleware'   
    ]

      通过rbac的request进行权限的验证

    并将权限相关的配置写入settings里

    # 权限存放在session中的KEY

    PERMISSION_SESSION_KEY = 'permission'

    # 菜单存放在session中的KEY

    MENU_SESSION_KEY = 'menu'

    # 白名单

    WHITE_LIST = [     r'^/login/$',    

    r'^/reg/$',    

    r'^/admin/.*', ]

    6.将动态菜单加入到页面中应用到inclusion_tag

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

      在页面里要导入菜单的静态文件

      1.menu.css

    有一个母版页面,通过这个母版进行加入

     二级菜单

      如何建立一个二级菜单

      首先需要先建立菜单表

      菜单表只放入一级菜单的信息 name icon图标

      权限表添加menu字段用于关联菜单表

      并将菜单信息表的数据结构进行修改

      自定义inclusion.tag需要修改

      实现点击一级菜单隐藏显示二级菜单功能

      使用js功能

    二级菜单默认展开并选中+一次菜单排序

    通过js方法可以实现给二级菜单加active属性

    但为了实现访问的页面所属的菜单能够展开,其他菜单闭合

    在permssion里

    利用创建一个querydict,菜单列表循环给所有一级菜单加入hide属性

    当访问的二级菜单属于一级菜单时,将一级菜单的hide属性去掉,并给访问的二级菜单加active属性

    实现一次菜单排序,需要给model里的menu表加入一个weight属性

    每次登陆时查询用户的weight属性

    并通过sort函数根据weight属性进行排序

    将排序完的列表在根据上面的二级菜单加属性的流程走

    通过inclusion.tag并在页面中展示

    路径导航 

    首先建立面包屑列表 request.breadcrumb_list =[

    {'title': '首页', 'url': '/index/'}

    ]

    在权限的校验中,如果是子权限访问的是三级菜单

    先将二级菜单加入面包屑列表

    request.breadcrumb_list.append( {'title': permission_dict[str(pid)]['title'], 'url': permission_dict[str(pid)]['url']})

     再将访问的页面加入面包屑列表

    request.breadcrumb_list.append({'title': item['title'], 'url': item['url']})

    创建inclusion_tag

    @register.inclusion_tag('breadcrumb.html')

    def breadcrumb(request):

      return {'breadcrumb_list': request.breadcrumb_list}

    breadcrumb.html

    <div>
        <ol class="breadcrumb no-radius no-margin" style="border-bottom: 1px solid #ddd;">
    
            {% for breadcrumb in breadcrumb_list %}
                {% if forloop.last %}
                    <li class="active">{{ breadcrumb.title }}</li>
                {% else %}
                    <li><a href="{{ breadcrumb.url }}">{{ breadcrumb.title }}</a></li>
                {% endif %}
            {% endfor %}
    
        </ol>
    </div>

    权限控制到按钮级别

    将权限信息表的键改为permissions__name

    创建过滤器register.filter

    @register.filter
    def has_permission(request, name):
        if name in request.session[settings.PERMISSION_SESSION_KEY]:
            return True

    在前端页面

    {% if request|has_permission:'customer_add' %}
             <a class="btn btn-default" href="{% url 'customer_add' %} }">
             <i class="fa fa-plus-square" aria-hidden="true"></i> 添加客户</a>
    {% endif %}
  • 相关阅读:
    @RequestBody, @ResponseBody 注解详解(转)
    Maven之pom.xml配置文件详解
    搭建SpringCloud-Eureka 注册中心以及服务提供与调用 快速了解 SpringCloud-Eureka
    Springboot 之 多配置文件
    Spring Boot配置文件放在jar外部
    Spring Data JPA使用getOne方法报错:Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate
    Java内省机制
    RestTemplate发送请求并携带header信息 RestTemplate post json格式带header信息
    matlab练习程序(螺线拟合)
    mathematica练习程序(曲线的曲率与挠率)
  • 原文地址:https://www.cnblogs.com/pythonz/p/10508070.html
Copyright © 2020-2023  润新知