在 rbac 的基础上继续
我们可以人为的认为 /customer/list 可以作为一个菜单,但是机器不知道,所以我们要告诉机器,这个路由可以做菜单
流程
- 告诉机器那些路由可以作为菜单
- 修改表结构
- 将这些可以作为菜单的路由,单独储存起来
- 将菜单信息储存到 session 中
- 获取菜单信息并展示
实践
修改表结构
在 rbac 的表结构上给 权限表添加两个字段
添加的两个字段
重点: 储存给 session 的结构
用户登录时要做两件事:
- 储存 权限列表
- 储存 菜单列表
获取权限/菜单信息
ret = obj.roles.filter(permissions__url__isnull=False).values( xxx ).distinct()
# 权限列表
permission_list = []
# 菜单列表
menu_list = []
for i in ret:
# 仅记录 权限路由,标题....就不记录了
permission_list.append({'url':i['permission__url']})
if i['is_menu']:
menu_list.append(
{
'url':i['permission__url'],
'title':i['permission__title'],
'icon':i['permission__icon'],
}
)
request.session['储存在settings中的常量'] = permission_list
request.session['储存在settings中的常量'] = menu_list
还是利用 inclusion_tag 返回自定义HTML片段
补充:
选中菜单的状态
加 active 类 就可以选中
这有两种方法:
- 前端做
用 JS 代码 location.href 可以获取当前路由,
随后进行循环匹配,匹配成功后加类 active
缺点: 有延迟,循环也需要时间
- 后端做
因为我们是用 inclusion_tag 返回的自定义HTML代码片段,
所以我们可以在返回代码之前进行匹配
方法
返回的HTML代码片段
网友评论