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‘]})

原文地址:https://www.cnblogs.com/zaizai1573/p/10569090.html

时间: 2024-10-18 20:43:43

crm 动态一级二级菜单的相关文章

根据权限动态生成二级菜单

数据库models设计: from django.db import models """ 一级菜单 """ class Menu(models.Model): title = models.CharField(max_length=32, unique=True) icon = models.CharField(max_length=32, verbose_name="图标", null=True, blank=True)

动态生成二级菜单

现在越来越多的用到二级甚至多级菜单,前台菜单的显示,手动指定也越来越不能满足要求,所以,动态生成菜单是必须的 思路 + 示例代码(以二级菜单为例) 先取出一级菜单内容值,接下来遍历一级菜单,将其id当做本次检索的parentid,将与之对应的二级菜单值获取到, 并加入到当前数组中(后台) 二层循环,当获取一个值时,检查其对于的二级菜单项是否有数据,有的话,则输出来,没有则跳过(前台) 以PHP后台为例 $res = mysql_query('*** where parentid = 0');  

一级菜单 二级菜单的联动

1.页面代码:单个集合循环生成一级和二级菜单 /* <c:forEach var="m" items="${list}" >                              <c:if test="${m.mb.father eq '-1' }">                                   <input type="checkbox" name="me

html和css实现一级菜单和二级菜单学习笔记

实现一级菜单: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>menu1.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta ht

CSS之实现二级菜单动态出现

一直觉得二级菜单的出现效果仅仅有js才干控制.今天研究了一下阿里巴巴站点的首页,才发现,原来二级菜单的动态显示也能够使用CSS来控制,原来对CSS是静态的东西一直是误解它了,CSS也能够实现动态的效果,现把主要代码展演示样例如以下: HTML代码: <span style="font-size:18px;"><strong><!DOCTYPE html> <html> <link href="1_files/a.css&q

Android学习笔记之Menu一级菜单、二级菜单的使用

(1)布局文件没有做更改 (2)在res--menu目录下的main.xml文件中代码如下: <menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 一级菜单 --> <item android:id="@+id/file" android:title="@string/file"> <!-- 二级菜单 -->

Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色

1 #models.py 2 3 # --------01PerfectCRM基本配置ADMIN-------- 4 5 from django.db import models 6 # Create your models here. 7 8 """ 9 #运行 Terminal 10 # 生成 数据表 11 # python manage.py makemigrations 12 # 数据表 迁移 13 # python manage.py migrate 14 &quo

五表联查、一级、二级菜单的显示

//五表联查 $b=Db::table('user') ->join('userrole','user.uid =userrole.u_id') ->join('role','userrole.r_id = role.rid') ->join('roleaccese','role.rid =roleaccese.role_id') ->join('accese','roleaccese.accese_id =accese.aid') ->where("uname='

CSS制作二级菜单时,二级菜单与一级菜单不对齐

效果如图: 部分代码如图: <li><a href="#" target="_blank">关于我们</a> <ul> <li class="top"><a href="#" target="_blank">关于我们</a></li> <li><a href="#" targ