一 . 菜单排序

  1.我们想把菜单排序.首先给菜单加上权重,权重大的排在上面, 这就要在菜单表上加上一个权重字段.

  

  2. 我们在菜单表里面把权重改一下

  

  3. 需要把权重字段的信息拿出来放到session中去

  4. 在自定义过滤器里面进行排序  然后其他的不用改就会显示成排序后的菜单

from django import template
from django.conf import settings
from collections import OrderedDict register = template.Library() @register.inclusion_tag('menu.html')
def my_menu(request):
url = request.path
# 二级菜单
menu_dict = request.session[settings.MENU_SESSION_KEY] # 不能在这循环,需要模板里面循环
# 按照添加的顺序进行展示 有序字典
ordered_dict = OrderedDict()
# ret是按照权重排完序的key
ret = sorted(menu_dict, key=lambda x: menu_dict[x]['weight'], reverse=True)
for i in ret:
ordered_dict[i] = menu_dict[i]
return {'menu_list': ordered_dict.values()}

二 . 二级菜单选中并且展开

  

# 实现思路
1. 当我们点击二级菜单的时候, 让他显示被选中的状态,需要class="active"
2. 进入菜单页面的时候,除了输入的二级菜单对应的一级菜单外,其他的一级菜单都应该收起来
3. 当我们点击另一个一级菜单的时候, 其他的一级菜单全部都收起来

  

  

  

  来看一下效果

     

三. 非菜单权限的归属

  上面的操作有点瑕疵:

   

  造成上面的原因是添加和编辑等和二级菜单没啥关系,影响不了二级菜单的展开与隐藏, 解决这个问题,需要把他们添加一对多的关系

  

  看一下权限表

  

  

1 . 由上图可知, 如果点击的是编辑增加等标签,他的parent_id就是二级菜单的id, 这样我们就可以通过点击添加或者编辑找到二级标签的id,
    那么我们就可以在自定义过滤器中判断,如果拿到的是二级id,那么就让这个菜单添加被选中并且展开的状态
2 . 我们需要把parent_id 和 二级菜单的id放到session中去

  

  然后我们需要在权限验证的中间件中拿到二级菜单的id

 from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect
from django.conf import settings
import re class RbacMiddleWare(MiddlewareMixin):
def process_request(self, request):
# 获取当前访问的页面
url = request.path
# print('>>>>>', url)
# 为了让index页面正常不报错
request.current_menu_id = None
# 在中间件中那 用反射
# setattr(request, settings.CURRENT_MENU_ID, None) # 白名单
for i in settings.WHITE_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return
# 获取登录状态
is_login = request.session['is_login']
# 没有登录跳转登录页面
if not is_login:
return redirect('login') # 免认证
for i in settings.NO_PERMISSION_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return # 获取当前用户的权限, 要用get去拿,没有显示None,[]就会报错
permission_list = request.session.get(settings.PERMISSION_SESSION_KEY)
# print(permission_list)
# 权限的校验
for permission in permission_list:
# print('>>>>',permission)
if re.match(f'^{permission.get("url")}$', url): pid = permission.get('pid')
id = permission.get('id')
if pid:
# 当前访问的是添加编辑的功能
request.current_menu_id = pid # 用request才能传过去
# 用反射
# setattr(request, settings.CURRENT_MENU_ID, pid)
else:
# 访问的是二级菜单
request.current_menu_id = id
# 用反射
# setattr(request, settings.CURRENT_MENU_ID, id)
return
# 没有匹配成功
return HttpResponse('你的level不够!!')

权限验证中获取二级菜单的id

 

  当然,可以以配置到settings中去, 操作方法在上面写了,注释的那个就是

  

四 . 路径导航

  

  

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect
from django.conf import settings
import re class RbacMiddleWare(MiddlewareMixin):
def process_request(self, request):
# 获取当前访问的页面
url = request.path
# 当前访问的路径id
request.current_menu_id = None # 路径导航(面包线导航)的列表
request.breadcrumb_list = [{'title': '首页', 'url': '/index/'}] # 白名单
for i in settings.WHITE_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return
# 获取登录状态
is_login = request.session['is_login']
# 没有登录跳转登录页面
if not is_login:
return redirect('login') # 免认证
for i in settings.NO_PERMISSION_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return # 获取当前用户的权限, 要用get去拿,没有显示None,[]就会报错
permission_dict = request.session.get(settings.PERMISSION_SESSION_KEY) # 权限的校验
for permission in permission_dict.values(): if re.match(f'^{permission.get("url")}$', url): pid = permission.get('pid')
id = permission.get('id')
if pid:
# 当前访问的是添加编辑的功能
request.current_menu_id = pid # 用request才能传过去 # 当点击添加或者编辑的时候就走的这里
parent = permission_dict[str(pid)]
request.breadcrumb_list.append({'url': parent['url'], 'title': parent['title']}) else:
# 访问的是二级菜单
request.current_menu_id = id # 如果没有pid就证明是二级菜单
request.breadcrumb_list.append({'url': permission['url'], 'title': permission['title']})
return
# 没有匹配成功
return HttpResponse('你的level不够!!')

权限验证中间件中的路径导航

  

  

五 . 权限粒度控制按钮级别

    权限粒度控制按钮级别意思就是你有这个权限给你展示这个按钮,你没有这个权限就不给你展示

    思路:

      1. 把用户的所有权限放到一个列表里面

      2. 如果前端展示的按钮在用户的权限列表了,那么就显示

      3. 由于url的别名不会总该,所以这里我们用别名来表示权限的url

      4. 用url的别名, 要把别名写到数据库

      5. 在权限表里面加一个别名字段,并且这个name要是唯一的, 要注意的是, 这个字段是后添加的, 需要先设置default, 但是不能直接填unique=True

      6. 迁移完之后,把别名一一对应手动填写到权限表的name字段

        

      7. 再到name字段中添加unique=True, 然后在进行数据库迁移

      

      8. 我们需要获得数据库中的name字段的数据,这样我们可以把permission_dict[i['permissions__id']] 改为 permission_dict[i['permissions__name']] 因为都是唯一的

          由于key 从id 改为 name了,所以我们的路径导航里面的用到的permissions__id也要做出相应的改变,之前用的是二级菜单的id, 由于存在关系,所以可以通过pid找到

            二级菜单的name,然后中间件中的引用的str(pid)也要改成name

  

 from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect
from django.conf import settings
import re class RbacMiddleWare(MiddlewareMixin):
def process_request(self, request):
# 获取当前访问的页面
url = request.path # 当前访问的路径id
request.current_menu_id = None # 路径导航(面包线导航)的列表
request.breadcrumb_list = [{'title': '首页', 'url': '/index/'}] # 白名单
for i in settings.WHITE_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return
# 获取登录状态
is_login = request.session['is_login']
# 没有登录跳转登录页面
if not is_login:
return redirect('login') # 免认证
for i in settings.NO_PERMISSION_LIST:
# match 匹配上得到一个对象,匹配不上返回None
if re.match(i, url):
return # 获取当前用户的权限, 要用get去拿,没有显示None,[]就会报错
permission_dict = request.session.get(settings.PERMISSION_SESSION_KEY)
# print(permission_list)
# 权限的校验
for permission in permission_dict.values():
# print('>>>>',permission)
if re.match(f'^{permission.get("url")}$', url): pid = permission.get('pid')
id = permission.get('id')
pname = permission.get('pname') # 路径导航改成pname
if pid:
# 当前访问的是添加编辑的功能
request.current_menu_id = pid # 用request才能传过去 # 当点击添加或者编辑的时候就走的这里
parent = permission_dict[pname]
request.breadcrumb_list.append({'url': parent['url'], 'title': parent['title']}) else:
# 访问的是二级菜单
request.current_menu_id = id # 如果没有pid就证明是二级菜单
request.breadcrumb_list.append({'url': permission['url'], 'title': permission['title']})
return
# 没有匹配成功
return HttpResponse('你的level不够!!')

改成name后的权限验证中间件

      9 . 自定义过滤器

  

  

  

 

Django--CRM--菜单排序等的更多相关文章

  1. Django CRM系统

    本节内容 业务痛点分析 项目需求讨论 使用场景分析 表结构设计 业务痛点分析 我2013年刚加入老男孩教育的时候,学校就一间教室,2个招生老师,招了学生后,招生老师就在自己的excel表里记录一下,每 ...

  2. vue项目简单菜单排序

    功能:拖拉后,数据重组,然后返回数组给后台处理 代码如下: <template> <el-dialog title="菜单排序" :close-on-click- ...

  3. crm 一级菜单排序,二级菜单选中并且展开,非菜单权限的归属,权限粒度控制到按钮级别

    排序 /rbac/templatetags/rbac.py from django import template from django.conf import settings import re ...

  4. Django CRM客户关系管理系统

    CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现 ...

  5. Django CRM学员系统项目

    项目需求: 1.分讲师\学员\课程顾问角色,2.学员可以属于多个班级,学员成绩按课程分别统计3.每个班级至少包含一个或多个讲师4.一个学员要有状态转化的过程 ,比如未报名前,报名后,毕业老学员5.客户 ...

  6. django——CRM项目

    1.引言 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销售循环 ...

  7. Django - CRM项目(2)Q查询(模糊查询)

    一.CRM项目(2) 利用Q查询中的q对象完成条件筛选功能. 批量删除.公户转私户功能. 新增一张跟进记录表ConsultRecord,迁移数据库并添加测试数据,实现跟进记录列表页面. 客户列表新增跟 ...

  8. Django - CRM项目(3)

    一.CRM项目的业务逻辑与表结构梳理 1.分析业务逻辑 (1) 引流(sem) (2) 网络咨询师(客服):添加客户信息和查看客户,分配销售 (3) 销售:查看私户 添加跟进记录 失败:加入公户 成功 ...

  9. django中非菜单权限的归属

    非菜单权限的归属 :         1.设置表结构 : 在权限表中添加自连接的外键patent,parent_id连接permission表的id,可为空,当有parent_id时,说明它是一个普通 ...

  10. Django CRM __contains与__icontains区别

    http://www.yihaomen.com/article/python/199.htm operators = { 'exact': '= %s', 'iexact': 'LIKE %s', ' ...

随机推荐

  1. [Git] Git操作命令

    基础操作 git配置 git config --global user.name "Your Name" git config --global user.email " ...

  2. Spring Boot web API接口设计之token、timestamp、sign

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/vbirdbest/article/details/80789817一:token 简介Token:访 ...

  3. [CQOI2018]九连环

    嘟嘟嘟 对于这种找规律的题,我向来是不会的. 通过大佬们的各种打表找规律.神奇dp等方法,我们得到了答案就是\(\lfloor \frac{2 ^ {n + 1}}{3} \rfloor\). 高精是 ...

  4. jquery懒加载插件 jquery_lazyload 下载

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code https://pan.baidu.com/s/1UbOeyL_AaSNN_KMA4M ...

  5. 【css3】nth-child

    nth-child含义 :nth-child(an+b) 这个 CSS 伪类匹配文档树中在其之前具有 an+b-1 个兄弟节点的元素,其中 n 为正值或零值. 简单点说就是,这个选择器匹配那些在同系列 ...

  6. 关于box-shadow和drop-shadow的显著区别

    一.box-shadow box-shadow是css3中新增的属性,用于增加边框阴影,让原有的元素变得更多样性,它名下有四位小弟,老大控制水平方向偏移,老二控制垂直方向偏移,老三控制模糊度,最小的老 ...

  7. 使用 ctypes 进行 Python 和 C 的混合编程

    Python 和 C 的混合编程工具有很多,这里介绍 Python 标准库自带的 ctypes 模块的使用方法. 初识 Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库 ...

  8. 变量的值与判断的结果有关,使用Set Variable If

    1.有时候变量的值在赋值时,会依据情况来赋值.这个时候就要用到:Set Variable If ${result} BuiltIn.Set Variable 10 ${my_result}= Buil ...

  9. a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换

    package com.Summer_0424.cn; /** * @author Summer * a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换? */ publi ...

  10. WPF Binding学习(四) 绑定各种数据源

    转自:http://blog.csdn.net/lisenyang/article/details/18312199 1.集合作为数据源 首先我们先创建一个模型类 public class Stude ...