目錄html
session
中?rbac
組件應用到一個新項目中.rbac
組件中有哪些技術點, 用於作什麼?CRM系統是提供給銷售, 班主任, 財務等人員使用的.python
在CRM系統中, 將沒有綁定銷售的客戶稱爲公戶, 綁定銷售的客戶稱爲私戶.git
銷售人員各自維護本身的客戶(私戶), 不能夠查看或者跟進其餘人的客戶, 避免產生糾紛.web
對象.字段名
對象.get_字段名_display
對象.外鍵字段.屬性
對象.自定義方法
modelform
(1)定義一個modelform
:數據庫
class CustomerForm(forms.ModelForm): """這裏能夠重寫某些字段""" class Meta: model = models.Customer fields = "__all__" exclude = wegits =
(2)視圖中:json
form_obj = CustomerForm() form_obj = CustomerForm(request.POST) from_obj.is_valid()
(3)模板中:網絡
{% for field in form_obj %} {{ field }} {% endfor %}
銷售能夠經過我的渠道獲取客戶信息, 本身錄入到系統中, 或者銷售主管或網絡諮詢師將已經錄入系統的客戶分配給銷售.session
銷售須要在規定時間間隔內對客戶進行跟進或回訪, 將跟進信息記錄到系統中, 根據不一樣的狀況標記客戶的報名意向.數據結構
當客戶肯定報名時須要讓客戶本人或者銷售幫忙添加報名表.app
當銷售收到客戶繳納的費用時, 須要填寫繳費記錄, 並將費用轉交財務進行審批.
班主任對班級信息進行管理, 對班級信息進行增刪改查.
建立好班級信息後, 能夠對某一班級建立課程記錄, 記錄上課的狀況, 做業要求等信息.
建立好班級信息後, 可根據某節上課記錄來生成學習的上課記錄(學習記錄), 該操做做爲批量操做, 批量生成該課程所對應班級的全部學生的學習記錄. 使用modelformset
來展現和編輯這些學習記錄.
QueryDict
對象, 詳細說說它的用法分頁保留搜索條件時: 搜索條件在request.GET
中, request.GET
就是QueryDict
對象, 將該對象複製後可給該字典中添加頁碼的相關參數, 使用QueryDict
的urlencode()
方法, 將結果拼接到生成的URL上.
添加或編輯後跳轉至原頁面: 本身生成一個QueryDict
對象, 將當前訪問的完整路徑添加到該字典中複製給next
, 使用QueryDict
的urlencode()
方法, 將結果拼接到生成的添加或編輯的URL上. 添加或編輯後從request.GET
中獲取到next
的值, 跳轉到該地址便可.
技術點 | 做用 |
---|---|
auth模塊 | 認證 |
modelform | 對錶進行增刪改查 |
分頁 | 對數據進行分頁顯示 |
Q對象 | 查詢條件==或==的關係 |
QueryDict | 保留搜索條件 |
url的命名和反向解析 | ---- |
事務 + 行級鎖 | 加入私戶 |
批量建立對象 | ---- |
modelformset | ---- |
表 | 字段 |
---|---|
菜單表Menu |
id 、 name |
權限表Permission |
id 、 title 、 url 、 name 、 parent_id 、 menu_id |
角色表Role |
id 、 name |
用戶表User |
id 、 username 、 password |
角色和權限關係表 | id 、 role_id 、 permission_id |
用戶和角色關係表 | id 、 user_id 、 role_id |
在web應用中, 一個URL
表明一個權限, 能夠訪問某一URL
則說明有該權限. 該權限系統中URL
被分爲兩種, 一種是能夠作二級菜單的父權限, 一種是不能作菜單的子權限. Menu
表中的數據稱之爲一級菜單, 二級菜單被分配給一級菜單. 子權限分配給父權限.
當用戶登陸成功時, 根據用戶全部的角色查詢出所具備的權限, 將權限信息和菜單信息存放在session
中. 登陸成功後跳轉至其餘URL
時, 請求通過中間件時進行權限的校驗, 根據當前訪問的url
和session
中存放的權限信息進行正則匹配. 都匹配不成功, 則拒絕訪問. 匹配成功則繼續走正常的流程獲得相應的響應.
頁面中的可點擊的按鈕也是權限, 在模板渲染時使用自定義filter
判斷該按鈕所表明的權限是否在該用戶所擁有的權限中, 若是是則顯示該按鈕, 不然不顯示.
session
中?permission_dict = { '權限的URL別名':{ 'url': 'url路徑', 'id': '權限的id', 'pid': '父權限的id', 'title': '權限的標題', 'pname': '父權限的URL別名', } }
menu_dict = { 'title': '客戶管理', 'icon': 'fa-address-book-o', 'weight': 10, 'children': [{ 'title': '客戶列表', 'url': '/customer/list/', 'id': 1, },] }
將權限和菜單的字典存放在session
中是爲了給不一樣用戶存放不一樣的權限和菜單, 而且session
能夠存放在Redis
中, 讀取速度快.
(1)獲取當前訪問的URL
, 判斷是否在不須要權限校驗的白名單中, 若是在則再也不進行校驗.
(2)從session
中獲取到該用戶的權限信息.
(3)循環出每個權限進行正則匹配, 匹配成功則改變flag
標誌位爲True
, 而且獲取到須要默認展開菜單的權限id和要展現的路徑導航信息.
(4)循環結束後, flag
還未False
則拒絕訪問.
二級菜單是經過inclusion_tag
實現的, 將request
看成參數傳給menu
函數, 函數中從request
中獲取到menu_dict
. 循環menu_dict
給一級菜單都添加了一個hide
的class
, 默認一級菜單下的二級菜單(父權限)是不是要默認選中的二級菜單, 若是是的話, 給該二級菜單添加一個active
的class
, 給該二級菜單對應的一級菜單的class
從新賦值爲空.
模板中生成二級菜單時添加上對應的class
, 則顯示出相應的狀態. class
爲hide
則是隱藏狀態, class
爲active
則是選中狀態.
session
中存放着一個有關權限信息的字典, 字典的key
爲權限的URL
別名, value
爲一個權限的具體信息.
自定義了一個filter
, 用來判斷某一個權限是否在該用戶的權限字典中, 在的話返回True
, 不在返回False
.
模板中使用該filter
來對每一個要生成按鈕的部分作判斷, 有權限則會顯示按鈕, 沒有權限則不顯示.
新增的: 路由系統中有, 數據庫中沒有的.
刪除: 路由系統中沒有, 數據庫中有的
可更新: 路由系統和數據庫中都有的
rbac
組件應用到一個新項目中.rbac
組件到新的項目中, 註冊apprbac
中的User
表rbac
下migrations
中的記錄admin
中的User
表roles=models.ManyToManyField(to=Role, verbose_name='用戶擁有的角色', blank=True)
注意: 關聯的字段不要寫成字符串形式(4)設置rbac
的url
url
要有name
rbac
的namespace
url
和別名的長度rbac
中的User
settings.py
中寫上權限的配置(12)權限控制到按鈕級別
rbac
組件中有哪些技術點, 用於作什麼?技術點 | 做用 |
---|---|
中間件 | 進行訪問權限校驗 |
inclusion_tag |
動態生成二級菜單和路徑導航 |
filter |
權限控制到按鈕級別 |
modelformset |
權限的批量操做 |
session |
保存權限和菜單的數據結構 |