動態生成一級菜單:css
model裏修改字段爲html
在登陸查詢用戶時,將四個字段的信息都查詢出來前端
並根據用戶可以訪問的網頁權限和顯示的菜單 blank表示頁面輸入能夠爲空 null=true 表示數據表能夠爲空python
分爲權限列表和菜單列表web
permission_list數據庫
menu_listsession
權限信息用來驗證用戶可以訪問的頁面數據結構
菜單列表用來顯示用戶能夠訪問的頁面app
頁面能夠接受requestide
request.session.menu來獲得ur,title,icon顯示在頁面上能夠用for循環實現
一級菜單優化
在頁面request.session.menu是寫死了
建立templatetags包
裏面my_tags.py
經過sample.inclusion.tags方法
寫一個menu函數,再建立一個menu頁面menu.html
裏面講request.session.menu內容複製進去
再在原頁面寫{%load my_tags%}
{%menu request%}導入
給訪問的菜單加active屬性
在menu函數裏
由於知道要訪問的頁面url request.path_info
循環菜單列表時
若是這個菜單的url和訪問頁面相同時 用正則進行判斷 re.match(item[url],request.path_info):
裏面 item['class']=active加入active屬性
在頁面用menu.class顯示
rbac功能整合
功能整合就是將rbac的全部函數,頁面,css都拖到本身的rbac的app裏,使rbac獨立起來能夠隨時調用
應用rbac組件的流程
1.將rbac app直接拷貝進來
在settings裏註冊rbac app
2 數據庫的遷移
1刪除rbac下migrations下除init外的其餘py文件
2執行命令
3 錄入權限信息 ,經過Django自帶的admin頁面
1.首先建立超級用戶
python manage.py createsuperuser
2.登陸admin
1.經過rbac裏已經寫完的角色,權限,用戶信息
錄入權限信息 角色信息 用戶信息
2.分配對應的關係
4.登錄成功後調用權限初始化的函數permission
經過permission將用的權限信息放入權限列表 菜單信息放入菜單列表
from rbac.service.permission import init_permission
init_permission(request,obj) # 傳入request和obj
5.在settings裏註冊權限的中間件
MIDDLEWARE = [
'rbac.middlewares.rbac.RbacMidlleware'
]
經過rbac的request進行權限的驗證
並將權限相關的配置寫入settings裏
# 權限存放在session中的KEY
PERMISSION_SESSION_KEY = 'permission'
# 菜單存放在session中的KEY
MENU_SESSION_KEY = 'menu'
# 白名單
WHITE_LIST = [ r'^/login/$',
r'^/reg/$',
r'^/admin/.*', ]
6.將動態菜單加入到頁面中應用到inclusion_tag
{% load rbac %}
{% menu request %}
在頁面裏要導入菜單的靜態文件
1.menu.css
有一個母版頁面,經過這個母版進行加入
二級菜單
如何創建一個二級菜單
首先須要先創建菜單表
菜單表只放入一級菜單的信息 name icon圖標
權限表添加menu字段用於關聯菜單表
並將菜單信息表的數據結構進行修改
自定義inclusion.tag須要修改
實現點擊一級菜單隱藏顯示二級菜單功能
使用js功能
二級菜單默認展開並選中+一次菜單排序
經過js方法能夠實現給二級菜單加active屬性
但爲了實現訪問的頁面所屬的菜單可以展開,其餘菜單閉合
在permssion裏
利用建立一個querydict,菜單列表循環給全部一級菜單加入hide屬性
當訪問的二級菜單屬於一級菜單時,將一級菜單的hide屬性去掉,並給訪問的二級菜單加active屬性
實現一次菜單排序,須要給model裏的menu表加入一個weight屬性
每次登錄時查詢用戶的weight屬性
並經過sort函數根據weight屬性進行排序
將排序完的列表在根據上面的二級菜單加屬性的流程走
經過inclusion.tag並在頁面中展現
路徑導航
首先創建麪包屑列表 request.breadcrumb_list =[
{'title': '首頁', 'url': '/index/'}
]
在權限的校驗中,若是是子權限訪問的是三級菜單
先將二級菜單加入麪包屑列表
request.breadcrumb_list.append( {'title': permission_dict[str(pid)]['title'], 'url': permission_dict[str(pid)]['url']})
再將訪問的頁面加入麪包屑列表
request.breadcrumb_list.append({'title': item['title'], 'url': item['url']})
建立inclusion_tag
@register.inclusion_tag('breadcrumb.html')
def breadcrumb(request):
return {'breadcrumb_list': request.breadcrumb_list}
breadcrumb.html
<div> <ol class="breadcrumb no-radius no-margin" style="border-bottom: 1px solid #ddd;"> {% for breadcrumb in breadcrumb_list %} {% if forloop.last %} <li class="active">{{ breadcrumb.title }}</li> {% else %} <li><a href="{{ breadcrumb.url }}">{{ breadcrumb.title }}</a></li> {% endif %} {% endfor %} </ol> </div>
權限控制到按鈕級別
將權限信息表的鍵改成permissions__name
建立過濾器register.filter
@register.filter def has_permission(request, name): if name in request.session[settings.PERMISSION_SESSION_KEY]: return True
在前端頁面
{% if request|has_permission:'customer_add' %} <a class="btn btn-default" href="{% url 'customer_add' %} }"> <i class="fa fa-plus-square" aria-hidden="true"></i> 添加客戶</a> {% endif %}