菜单权限作为父权限

Posted xuqidong

tags:

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

技术图片
 1 from django.db import models
 2 
 3 # Create your models here.
 4 class User(models.Model):
 5     name=models.CharField(max_length=11)
 6     pwd=models.CharField(max_length=11)
 7     roles=models.ManyToManyField(Role)
 8     def __str__(self):
 9         return self.name
10 
11 class Role(models.Model):
12     title=models.CharField(max_length=11)
13     permissions=models.ManyToManyField(Permission)
14     def __str__(self):
15         return self.title
16 
17 class Menu(models.Model):
18     title=models.CharField(max_length=32,verbose_name="菜单")
19     icon=models.CharField(max_length=32,verbose_name="图标",null=True,blank=True)
20 
21 class Permission(models.Model):
22     title=models.CharField(max_length=32)
23     url=models.CharField(max_length=32)
24     menu=models.ForeignKey(Menu,on_delete=models.CASCADE,null=True)
25     name=models.CharField("url别名",max_length=32,default="")
26     pid=models.ForeignKey(self,on_delete=models.CASCADE,null=True,verbose_name="父权限")
27 
28     def __str__(self):
29         return self.title
models.py
技术图片
 1 from app01.models import Role
 2 
 3 def initial_session(user,request):
 4     permissions = Role.objects.filter(user=user).values(permissions__url,
 5                                                         permissions__title,
 6                                                         permissions__name,
 7                                                         permissions__pk,
 8                                                         permissions__pid,
 9                                                         permissions__menu__title,
10                                                         permissions__menu__icon,
11                                                         permissions__menu__pk,
12                                                         ).distinct()
13     permission_list = []
14     permission_names = []
15     permission_menu_dict = {}
16     for item in permissions:
17         permission_list.append({
18             "url":item["permissions__url"],
19             "id":item["permissions__pk"],
20             "pid":item["permissions__pid"],
21             "title":item["permissions__title"],
22         })
23         permission_names.append(item[permissions__name])
24         menu_pk = item[permissions__menu__pk]
25         if menu_pk:
26             if menu_pk not in permission_menu_dict:
27                 permission_menu_dict[menu_pk] = {
28                     "menu_title": item[permissions__menu__title],
29                     "menu_icon": item[permissions__menu__icon],
30                     "children": [
31                         {
32                             "title": item[permissions__title],
33                             "url": item[permissions__url],
34                             "pk": item[permissions__pk],
35                         }
36                     ],
37                 }
38             else:
39                 permission_menu_dict[menu_pk]["children"].append({
40                     "title": item[permissions__title],
41                     "url": item[permissions__url],
42                 })
43     print(permission_menu_dict)
44     request.session[permission_list] = permission_list
45     request.session[permission_names] = permission_names
46     request.session[permission_menu_dict] = permission_menu_dict
service/rbac.py
技术图片
 1 import re
 2 
 3 from django.template import Library
 4 
 5 register=Library()
 6 @register.inclusion_tag("rbac/menu.html")
 7 def get_menu_style(request):
 8     permission_menu_dict = request.session.get(permission_menu_dict)
 9     for val in permission_menu_dict.values():
10         for item in val["children"]:
11             val["class"] = "active"
12             if request.show_id==item["pk"]:
13                 val["class"] = ""
14     return {permission_menu_dict:permission_menu_dict}
15 
16 @register.filter
17 def has_permission(btn_url, request):
18     permission_names=request.session.get("permission_names")
19     return btn_url in permission_names
templatetags/rbac.py
技术图片
 1 import re
 2 
 3 from django.utils.deprecation import MiddlewareMixin
 4 from django.shortcuts import HttpResponse,redirect
 5 
 6 class PermissionMiddleWare(MiddlewareMixin):
 7     def process_request(self,request):
 8         current_path = request.path
 9         for reg in [/login/,/admin/]:
10             ret=re.search(reg,current_path)
11             if ret:
12                 return None
13         user_id=request.session.get(user_id)
14         if not user_id:
15             return redirect(/login/)
16 
17 
18         permission_list=request.session.get(permission_list)
19         for item in permission_list:
20             reg=^%s$%item["url"]
21             ret=re.search(reg,current_path)
22             if ret:
23                 show_id=item["pid"] or item["id"]
24                 request.show_id = show_id
25                 return None
26         return HttpResponse(无权限访问)
middleware.py

 

以上是关于菜单权限作为父权限的主要内容,如果未能解决你的问题,请参考以下文章

zTree怎样让其只能选择一个,就像单选框一样,如下图

ant-design-pro 实现二级权限表格

使用 C# 以编程方式删除“包括来自此对象父级的可继承权限”复选框

菜单项可见性不会部分改变

权限菜单设计

选择导航菜单项时不会替换上一个片段