动态生成一级菜单

2019-03-21  本文已影响0人  鬼泣_89b6

在 rbac 的基础上继续

权限-路由
我们可以人为的认为 /customer/list 可以作为一个菜单,但是机器不知道,所以我们要告诉机器,这个路由可以做菜单

流程

  1. 告诉机器那些路由可以作为菜单
    1. 修改表结构
  2. 将这些可以作为菜单的路由,单独储存起来
    1. 将菜单信息储存到 session 中
  3. 获取菜单信息并展示

实践

修改表结构

在 rbac 的表结构上给 权限表添加两个字段


添加的两个字段

重点: 储存给 session 的结构

用户登录时要做两件事:

  1. 储存 权限列表
  2. 储存 菜单列表
获取权限/菜单信息
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 类 就可以选中

这有两种方法:

  1. 前端做

用 JS 代码 location.href 可以获取当前路由,
随后进行循环匹配,匹配成功后加类 active
缺点: 有延迟,循环也需要时间

  1. 后端做
    因为我们是用 inclusion_tag 返回的自定义HTML代码片段,
    所以我们可以在返回代码之前进行匹配
    方法
    返回的HTML代码片段
上一篇 下一篇

猜你喜欢

热点阅读