设计菜单管理问题:
图片.png
1.如何生成菜菜单
2.怎么让这些菜单分级显示并且如果当前访问的url权限默认
展开如果是组内菜单就加粗或者变红
3.非菜单url,默认选中原菜单。(如果你是点击用户列表进来的
那么你看到页面了,如果你点击添加的时候,你的那个用户列看不见了
这就不好了。所以要设计当你点击添加按钮的时候,那个用户列表被默认选中)
菜单管理
菜单一:
用户管理
权限管理
菜单二:
订单管理
角色管理
分级做了菜单。这些菜单该显示什么菜单?是当前用户登录之后从数据库拿到用户拥有的权限,然后把权限搞成菜单
在表里面设计了一个组内菜单(自关联),当menu_gp_id为NULL就代表可以作为菜单
图片.png
1.在models中添加Menu对象(表)以及和group建立起一对多的关系
from django.db import models
class Menu(models.Model):
"""
菜单组
"""
title = models.CharField(max_length=32)
class Group(models.Model):
"""
权限组
"""
caption = models.CharField(verbose_name='组名称',max_length=16)
menu = models.ForeignKey(verbose_name='所属菜单',to='Menu')
class Permission(models.Model):
"""
权限表
"""
title = models.CharField(verbose_name='标题',max_length=32)
url = models.CharField(verbose_name="含正则URL",max_length=64)
is_menu = models.BooleanField(verbose_name="是否是菜单")
code = models.CharField(verbose_name="代码",max_length=16)
group = models.ForeignKey(verbose_name='所属组',to="Group")
class Meta:
verbose_name_plural = "权限表"
def __str__(self):
return self.title
class User(models.Model):
"""
用户表
"""
username = models.CharField(verbose_name='用户名',max_length=32)
password = models.CharField(verbose_name='密码',max_length=64)
email = models.CharField(verbose_name='邮箱',max_length=32)
roles = models.ManyToManyField(verbose_name='具有的所有角色',to="Role",blank=True)
class Meta:
verbose_name_plural = "用户表"
def __str__(self):
return self.username
class Role(models.Model):
"""
角色表
"""
title = models.CharField(max_length=32)
permissions = models.ManyToManyField(verbose_name='具有的所有权限',to='Permission',blank=True)
class Meta:
verbose_name_plural = "角色表"
def __str__(self):
return self.title
models
2.初始化获取菜单信息+权限信息
from django.conf import settings
def init_permission(user,request):
"""
初始化权限信息,获取权限信息并放置到session中。
:param user:
:param request:
:return:
"""
permission_list = user.roles.values('permissions__title', # 用户列表
'permissions__url',
'permissions__code',
'permissions__is_menu', # 是否是菜单
'permissions__group_id',
'permissions__group__menu_id', # 菜单ID
'permissions__group__menu__title',# 菜单名称
).distinct()
menu_list = []
# 去掉不是菜单的URL
for item in permission_list:
if not item['permissions__is_menu']:
continue
tpl = {
'menu_id':item