crm 动态一级二级菜单

Posted zaizai1573

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了crm 动态一级二级菜单相关的知识,希望对你有一定的参考价值。

之前代码菜单是写是的

技术图片

如何 让他 动态 生成了  首先 添加 2个字段

技术图片

admin.py 更改 显示

from django.contrib import admin
from rbac import models

# Register your models here.

class PermissionAdmin(admin.ModelAdmin):
    list_display = [url, title,is_menu,icon]#列表显示
    list_editable = [title,is_menu,icon]#可编辑
admin.site.register(models.Permission, PermissionAdmin)
admin.site.register(models.Role)
admin.site.register(models.User)

技术图片

然后进入 admin 把设为 一级菜单的 图标设置上去

auth.py 进行 mode筛选

def login(request):
    if request.method == POST:
        # 获取用户名和密码
        user = request.POST.get(user)
        pwd = request.POST.get(pwd)
        # 去数剧库进行筛选
        obj = models.User.objects.filter(name=user, pwd=pwd).first()
        if not obj:
            return render(request, login.html)
        permission_query = obj.roles.filter(permissions__url__isnull=False).values(permissions__url,
         permissions__title,permissions__is_menu,permissions__icon).distinct()
        #通过查询到的用户的obj反查角色表,values 正向查询当前用户的权限表的url信息 title

        permission_list=[]#存放权限信息
        menu_list=[]#存放菜单信息
        for item in permission_query:
            permission_list.append({url:item[permissions__url]})
            if item.get(permissions__is_menu):
                menu_list.append({url:item[permissions__url],icon:item[permissions__icon],title:item[permissions__title]})

        # print(‘1111‘,permission_query)  # <QuerySet [{‘permissions__url‘: ‘/index/‘, ‘permissions__title‘: ‘首页‘}]>
        #将权限信息写入到session
        request.session[settings.PERMISSION_SESSION_KEY]=permission_list
        #将菜单 信息 写入session
        request.session[settings.MENU_SESSION_KEY]=menu_list
        request.session[is_login] = True
        return redirect(reverse(index))
    return render(request, login.html)

settings.py中定义

# 白名单
WHITE_LIST = [
    r^/login/$,
    r^/reg/$,
    r^/admin/.*,
]
# 免认证的地址  需要登录 不行权限校验
NO_PERMISSION_LIST = [
    /index/
]
#权限信息url key
PERMISSION_SESSION_KEY=permissions
#存放菜单信息
MENU_SESSION_KEY=menus

更改一下 rbacapp中  更改 中间件中 middlewares/rbac.py 相应的值

        # 获取当前用户的权限
        permission_list = request.session[settings.PERMISSION_SESSION_KEY]
        print(permission_list)
        # 权限的校验
        for i in permission_list:
            if re.match(^{}$.format(i[url]), url):
                return
        # 没匹配成功  没有权限
        return HttpResponse(没有访问的权限)

layout.html中 跟改显示   这样虽然成功了 但是还是写死了menus

            <div class="static-menu">
{#                <a href="/customer/list/" class="active">#}
{#                    <span class="icon-wrap"><i class="fa fa-connectdevelop"></i></span> 客户管理</a>#}
{#                <a href="/payment/list/">#}
{#                    <span class="icon-wrap"><i class="fa fa-code-fork"></i></span> 账单管理</a>#}
                {% for item in request.session.menus %}
                    <a href="{{ item.url }}">
                    <span class="icon-wrap"><i class="fa fa-code-fork"></i></span> {{ item.title }}</a>
                {% endfor %}
            </div>

如何解决?

自定义 inclusion_tag

创建 templatetags目录   rbac.py

from django import  template
from django.conf import  settings
register=template.Library()
import re
@register.inclusion_tag(menu.html)
def menu(request):
    menu_list=request.session.get(settings.MENU_SESSION_KEY)
    for item in menu_list:
        url=item[url]
        if re.match(^{}$.format(url),request.path_info):
            item[class]=active
    return  {menu_list:menu_list}

menu.html

            <div class="static-menu">
                {% for item in menu_list%}
                    <a href="{{ item.url }}" class="{{ item.class }}">
                    <span class="icon-wrap"><i class="fa fa-code-fork"></i></span> {{ item.title }}</a>
                {% endfor %}
            </div>

技术图片

为了 下次 直接调用rbac 整合

把之前的判断 web views中的auth.py中的 查询写入session部分 移动到rbac/server/init_permission.py

把 web下的 templatetags 移动到rbac app下

把menu.html  移动到新建templates/rbac/中

把 css部分 移动到 static/css/menu.css

二级菜单调用自动生成

更改modes中的表字段 添加 menu表

技术图片

进入 admin 进行 权限 划分

技术图片

 

技术图片技术图片

 更改 server permission.py

    # 权限的列表
    permission_list = []

    # 菜单的字典
    menu_dict ={}

    for i in permission_query:
        # 把权限的信息放入permission_list
        permission_list.append({url: i[permissions__url]})

        menu_id = i.get(permissions__menu_id)

        if not menu_id:
            continue

        menu_dict.setdefault(menu_id, {
            title: i[permissions__menu__title],
            icon: i[permissions__menu__icon],
            children: [

            ]
        })

        menu_dict[menu_id][children].append({title: i[permissions__title], url: i[permissions__url]})

技术图片

 

技术图片

 

技术图片

 技术图片

技术图片

 

以上是关于crm 动态一级二级菜单的主要内容,如果未能解决你的问题,请参考以下文章

请教个安卓动画效果,就是点击一级菜单动态显示二级菜单的问题?请教大神

java如何实现二级树形菜单动态显示。要求加载页面时显示一级,点击一级菜单再去数据库查找出二级菜单

ExpandableListView 动态加载 点击一级菜单时再加载二级菜单的内容实现

js+数据库生成三级动态tree导航菜单

css+div布局,鼠标放在一级菜单上显示二级菜单

contextmenustrip 通过二级菜单的点击 怎么获取当前关联控件,是二级菜单,不是一级菜单。