二级菜单优化功能

二级菜单的功能优化---渐入佳境

功能1:点击其中之一的一级菜单展示其二级菜单,同时其他一级菜单的二级菜单都处于闭合状态

思路:使用jsDOM操作进行实现

HTML示例代码
<div class="multi-menu">
    {% for menu in menu_list %}
        <div class="item">
            <div class="title"><i class="fa {{ menu.icon }}"></i>
                {{ menu.name }}</div>
            <div class="body">
                {% for child in menu.children %}
                    <a href="{{ child.url }}">{{ child.title }}</a>
                {% endfor %}

            </div>
        </div>
    {% endfor %}
</div>

js代码实现

$(‘.item .title‘).click(function () {
    $(this).next().removeClass(‘hide‘).parent().siblings().find(‘.body‘).addClass(‘hide‘)
})

//1.先命中一级菜单title,触发点击事件
//2.保证自己没有被隐藏
//3.找到其他body使其隐藏,通过自己先找到父级parent,再找到所有的兄弟siblings的儿子,也就是body,命中后添加hide属性

//如此便实现了这个只显示当前菜单下的二级菜单功能

功能2:访问当前页面,默认选中对应页面展示菜单

思路:在访问的二级菜单url对应a标签中添加 class=‘active‘

1.django中 templatetags文件下使用inclusion_tag进行自定义模板

#从二级菜单的数据结构中获取到需要使用的url,title进行模板渲染
"""
{
    1: {
        ‘name‘: ‘信息管理‘,
        ‘icon‘: ‘fa-email‘,
        ‘children‘: [{
            ‘title‘: ‘客户管理‘,
            ‘url‘: ‘/customer/list/‘
        }]
    },
}
"""
from django import template
import re
from permission import settings
register = template.Library()
#自定义模板
@register.inclusion_tag(‘menu.html‘)
def menu(request):
    menu_dic = request.session.get(settings.MENU_SESSION_KEY)
    url = request.path_info #获取访问的url

    #获取到url和title进行模板渲染
    for item in menu_dic.values(): #首先循环拿到item表示一级菜单id对应的所有内容

        for i in item[‘children‘]: #循环item[‘children‘] 要拿到i 表示二级菜单内的所有内容
            if re.match("^{}$".format(i[‘url‘]),url): #将获取到url与session中的url进行正则匹配
                i[‘class‘] = ‘active‘ #匹配成功后给二级菜单字典内添加一组键值对 class=‘active‘
                break
    return {‘menu_list‘:menu_dic.values()}

2.在对应的模板中直接渲染即可,参照功能1中的HTML代码

  <a class="{{ child.class }}" href="{{ child.url }}">{{ child.title }}</a>

根据上面的HTML代码来看,在class=body 下的a标签中添加class=‘active‘进行渲染即可.***如此便实现了访问某个页面,默认选中对应页面的展示菜单***


功能3访问某个页面,页面对应菜单的二级菜单展示,其他菜单的二级菜单默认关闭

思路:首先先隐藏所有的二级菜单,再根据访问的url展示对应的一级菜单下的二级菜单

#示例代码from django import template
import re
from luffy_permission import settings

register = template.Library()
#自定义模板
@register.inclusion_tag(‘menu.html‘)
def menu(request):
    menu_dic = request.session.get(settings.MENU_SESSION_KEY)
    url = request.path_info 

    for item in menu_dic.values():
        item[‘class‘] = ‘hide‘  #将所有的二级菜单隐藏
        for i in item[‘children‘]:
            if re.match("^{}$".format(i[‘url‘]),url):
                i[‘class‘] = ‘active‘
                item[‘class‘] = ‘‘  #将匹配成功的二级菜单取消隐藏
                break
    return {‘menu_list‘:menu_dic.values()}
<div class="multi-menu">
    {% for menu in menu_list %}
        <div class="item">
            <div class="title"><i class="fa {{ menu.icon }}"></i>
                {{ menu.name }}</div>
            <div class="body {{ menu.class }}">
                {% for child in menu.children %}
                    <a class="{{ child.class }}" href="{{ child.url }}">{{ child.title }}</a>
                {% endfor %}

            </div>
        </div>
    {% endfor %}
</div>

注:先在body中添加class=‘hide‘属性,令所有的二级菜单隐藏,当访问的url页面匹配与session中的url匹配成功后在将 class=‘‘ 从而取消隐藏

功能4固定菜单栏展示顺序,因为数据结构是字典(无序的)

思路:将menu表结构改变,添加一个字段weight = model.IntegerField(default=1),导入有序字典(from collections import OrderedDict),根据数值大小进行排序即可

models.pyclass Menu(models.Model):
    """
    一级菜单
    """
    name = models.CharField(max_length=30,verbose_name=‘一级菜单名称‘)
    icon = models.CharField(max_length=56, verbose_name=‘图标‘, blank=True, null=True)
    weight = models.IntegerField(default=1)

    def __str__(self):
        return self.name

#添加一个字段weight
rbac.py
from django import template
import re
from permission import settings
from collections import OrderedDict

register = template.Library()
#自定义模板
@register.inclusion_tag(‘menu.html‘)
def menu(request):
    menu_dic = request.session.get(settings.MENU_SESSION_KEY)   url = request.path_info
    order_dic = OrderedDict()   #实例化一个有序字典
    for key in sorted(menu_dic,key=lambda n:menu_dic[n][‘weight‘],reverse=True):
        order_dic[key] = item = menu_dic[key] #将根据weight字段排序后的menu_dic 赋值给order_dic
        item[‘class‘] = ‘hide‘
        for i in item[‘children‘]:
            if re.match("^{}$".format(i[‘url‘]),url):
                i[‘class‘] = ‘active‘
                item[‘class‘] = ‘‘
                break
    return {‘menu_list‘:order_dic.values()} #再返回有序字典在模板上顺序渲染

功能5:非菜单权限归属问题 (二级菜单内各种时操作 默认选中并处于显示对应二级菜单)

思路:二级菜单下需要有操作的层级关系,也就是你伪三级菜单 ,更改表结构也就是 权限表(Permission)

步骤1:表结构设计 models.py

#参照上图所示class Permission(models.Model):
    """
    权限表 menu_id
              有的话 表示当前的权限是二级菜单 父权限
              没有  是一个普通权限
          parent_id
              有的话 表示当前就是子权限
              没有的话就是一个父权限
    """
    url = models.CharField(max_length=255,verbose_name=‘地址‘)
    title = models.CharField(max_length=25,verbose_name=‘标题‘)
    menu = models.ForeignKey(‘Menu‘,blank=True,null=True)
    parent = models.ForeignKey(‘self‘)  #自关联 获取到层级结构

步骤2:查询和存放在session中的权限信息处理 service/permission.py

 1 from django.conf import settings
 2
 3
 4 def init_permission(request,obj):
 5     # 先查到需要的权限信息,
 6
 7     permission_query = obj.roles.all().filter(permissions__url__isnull=False).values(‘permissions__url‘,
 8                                                                                      ‘permissions__title‘,
 9                                                                                      ‘permissions__menu__name‘,
10                                                                                      ‘permissions__menu__icon‘,
11                                                                                      ‘permissions__menu__id‘,
12                                                                                      ‘permissions__menu__weight‘,
13                                                                                      ‘permissions__id‘,
14                                                                                      ‘permissions__parent_id‘,
15                                                                                      ).distinct()
16     # 存放权限信息列表
17     permission_list = []
18     # 存放菜单信息的字典
19     menu_dic = {}
20     for item in permission_query:
21         # 将权限信息放到permission_list
22         permission_list.append({‘url‘: item[‘permissions__url‘],
23                                 ‘pid‘: item[‘permissions__parent_id‘],
24                                 ‘id‘: item[‘permissions__id‘] })
25
26         #放入菜单信息
27         menu_id = item[‘permissions__menu__id‘]
28         if not menu_id:
29             continue
30         if menu_id not in menu_dic:
31             menu_dic[menu_id] = {
32                 ‘name‘: item[‘permissions__menu__name‘],
33                 ‘icon‘: item[‘permissions__menu__icon‘],
34                 ‘weight‘: item[‘permissions__menu__weight‘],
35                 ‘children‘: [{
36                     ‘title‘: item[‘permissions__title‘],
37                     ‘url‘: item[‘permissions__url‘],
38                     ‘id‘: item[‘permissions__id‘],
39                 }]
40             }
41         else:
42             menu_dic[menu_id][‘children‘].append({
43                 ‘title‘: item[‘permissions__title‘],
44                 ‘url‘: item[‘permissions__url‘],
45                 ‘id‘: item[‘permissions__id‘],
46             })
47
48     request.session[settings.PERMISSION_SESSION_KEY] = permission_list
49     request.session[settings.MENU_SESSION_KEY] = menu_dic

权限信息查询和session中保存

步骤3.中间件权限校验,处理访问url归属问题 middlewares/rbac.py

 1 from django.utils.deprecation import MiddlewareMixin
 2 import re
 3 from django.conf import settings
 4 from django.shortcuts import HttpResponse,redirect,reverse
 5
 6 class RbacMiddleware(MiddlewareMixin):
 7
 8     def process_request(self,request):
 9         #获取当前的url
10         url = request.path_info
11
12         #白名单
13         for i in settings.WHITE_LIST:
14             if re.match(i,url):
15                 return
16
17         #获取权限信息
18         permission_list = request.session.get(settings.PERMISSION_SESSION_KEY)
19         if not permission_list:
20             return redirect(reverse(‘login‘))
21         #权限校验
22
23         for item in permission_list:
24             # i 里面有{url pid  id}
25             if re.match("^{}$".format(item[‘url‘]),url):
26                 #要显示的二级菜单的id
27                 pid = item.get(‘pid‘)
28                 id = item.get(‘id‘)
29                 #此步操作就是表示不管是pid还是id都是显示的二级菜单的id
30                 if pid:
31                     #当前访问的是子权限,找父权限显示
32                     request.current_menu_id = pid
33                 else:
34                     #当前访问的是父权限,也就是二级菜单,找自己显示
35                     request.current_menu_id = id
36                 return
37         return HttpResponse(‘您没有访问的权限‘)

中间件处理访问的权限url归属问题

步骤4.自定义模板中二级菜单id和session中存的匹配成功

from django import template
import re
from luffy_permission import settings
from collections import OrderedDict

register = template.Library()
#自定义模板
@register.inclusion_tag(‘menu.html‘)
def menu(request):
    menu_dic = request.session.get(settings.MENU_SESSION_KEY)
    url = request.path_info
    order_dic = OrderedDict()
    for i in sorted(menu_dic,key=lambda n:menu_dic[n][‘weight‘],reverse=True):
        order_dic[i] = item = menu_dic[i]
    # for item in order_dic.values():
        item[‘class‘] = ‘hide‘
        for i in item[‘children‘]:
            if i[‘id‘] == request.current_menu_id:#session中的id和访问的二级菜单id匹配
                i[‘class‘] = ‘active‘
                item[‘class‘] = ‘‘
                break
    return {‘menu_list‘:order_dic.values()}

自定义模板

原文地址:https://www.cnblogs.com/CrazySheldon1/p/10447685.html

时间: 2024-08-25 22:52:57

二级菜单优化功能的相关文章

QT之二级菜单(二级菜单的箭头可以使用QSS设置图片)

QT之二级菜单 QT之二级菜单 开场白 效果图 上代码 可参考文章 下代码 结尾 开场白 今天我们一起来了解下,在我们QT中,二级菜单是如何实现的,在上篇我们学习了QT之系统托盘,QT之自定义菜单, QT之样式styleSheet.今天我们在这基础上,增加二级菜单的功能. 效果图 大家注意下这里箭头,不是用的默认效果哦,还是自定义的好看哈!O(∩_∩)下面这张图示是默认的.  上代码 void SysTray::addSysTrayMenu() { CustomMenu* customMenu

jquery实现后台系统左侧菜单的点击展开/收缩二级菜单效果

html: <div class="col-sm-3 col-md-2 sidebar"> <div class="totalt"><a>系统管理系统</a></div> <ul class="menu"> <li class="title"> <a class="item item1"><span cla

联动二级菜单实现

参照美团app下拉式的二级列表菜单,公司项目中也有这种菜单的需求                    1,结构分析 首先,我们给出这个下来菜单需要的组建.我们用线框图来分析. 1)如上图所示,最外围的是一个Activity,顶部包含了一个View的容器,这个容器主要是装载ToggleButton来实现诸如美团里面的“美食,全城,理我最近,刷选”这一行.这一行一点就会弹出对应的下来菜单. 2)下拉菜单是如何实现的呢?,这里我们利用了PopupWindow来实现这一弹出式窗口.然后我们在弹出式窗口

iOS 二级菜单(UITableView实现)

作为iOS 新手 这个东西我捣鼓了一天,主要是没耐心.静下心来其实一会就能摆平. 我总结的经验,宁可精心学一个小时,也别浮躁学1天. 对新手来说主要是各种函数不熟,查询还不好查: 二级菜单网上说得不多,wo 下面来说一下这个二级菜单: 需求是这样的: 1 菜单只有二级. 2 如果有子菜单点一下打开,如果没有,则实现相应的操作: 我们来实现他(界面有点丑,但主要是功能,界面很简单自己设计一下就行): 个人想法是这样的: 首先建立一个cell的类,用于存放cell中的内容 ,继承自uitablevi

Jquery垂直下拉二级菜单

自己做了一个基于Jquery 的垂直下拉二级菜单功能,直接看图: Html的代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>垂直下拉菜单</title> <meta name="viewport" content="width=device-width, initial-scale=1"

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

数据库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)

Django--CRM--一级, 二级 菜单表

一. 一级菜单表 1. 首先要修改权限表的字段, 在权限表下面加上icon和 is_menu 的字段 2. 展示结果 # 我们既然想要动态生成一级菜单,那么就需要从数据库中拿出当前登录的用户的菜单表是哪个,那么我们就要在验证的部分拿出is_menu的字段,看是否为True, 然后把这些数据存到session中去,这里我们最好把request.session[key]中的可以写到settings中去,这样以后修改也方便些 其他的地方要用到session的时候也直接导入settings就行 3. 

RABC权限控制(二级菜单实现)

目前大部分系统由于用户体验,基本上菜单不会做的很深,以二级菜单为例,做了一个简单的权限控制实现,可精确到按钮级别(基于django),下面具体看看实现 1.表结构的设计 无论开发什么都需要先梳理清楚需求,然后再考虑表结构,这里先来说说大致的表结构组成,注意,我的权限控制是通过url做的,所以控制的核心就在于控制url 表字段介绍设计如下: 权限表 url # 权限 title #权限的标题,左侧展示,代表的功能(因为不可能展示url吧) menu # 所属的一级菜单,外键关联一级菜单 paren

input 联动效果灵活运用 二级菜单 同类型筛选(电影排名) 纯CSS3

input 联动效果 input舍弃了输入框,感觉好“好玩”! 二级菜单 贴个我以前做的效果图,一般PC端多用鼠标移入:hover出现二级菜单,input通过鼠标点击出现,PC端和移动端(移动端木有鼠标...)都适用 HTML代码如下: 1 <header> 2 <nav> 3 <input type="checkbox" id="area" class="first"> 4 <p>成都</p