目錄html
- 一. CRM客戶關係管理系統
- 二. 權限
- 1. 使用幾張表來完成權限控制的?每張表中有哪些字段?
- 2. 請簡述實現權限控制的流程
- 3. 初始化權限時, 定義了兩個字典, 分別是什麼數據結構?爲何要把他們存在
session
中? - 4. 權限校驗的中間件都作了什麼事情?
- 5. 如何實現二級菜單默認展開而且是選中狀態的?
- 6. 權限控制到按鈕級別是如何實現的?
- 7. 權限批量操做時, 哪些權限是須要新增的?哪些是須要刪除的?哪些是可更新的?
- 8. 開發過程當中遇到問題,通常都是怎樣解決的?請說一下你印象比較深入的一個問題.
- 9. 請簡述管理權限信息的流程(管理,分配權限是如何操做的)
- 10. 簡述如何將
rbac
組件應用到一個新項目中. - 11.
rbac
組件中有哪些技術點, 用於作什麼?
一. CRM客戶關係管理系統
1. CRM是什麼? 裏面都有哪些功能(業務)?
CRM系統是提供給銷售, 班主任, 財務等人員使用的.python
- 銷售功能:
- 錄入客戶相關信息, 記錄跟進客戶狀況, 添加報名表, 添加繳費記錄及相關內容的展現.
- 班主任功能:
- 建立或編輯班級信息, 建立課程記錄, 批量生成學生學習記錄及相關內容的展現.
- 財務功能:
- 財務審批等
2. 什麼是公戶?什麼是私戶?爲何要作這個區分?
在CRM系統中, 將沒有綁定銷售的客戶稱爲公戶, 綁定銷售的客戶稱爲私戶.git
銷售人員各自維護本身的客戶(私戶), 不能夠查看或者跟進其餘人的客戶, 避免產生糾紛.web
3. 請列舉出CRM系統中的表
4. 經過ORM操做對數據庫的數據作展現時, 不一樣字段類型有不一樣的展現方法, 分別是什麼?
- 普通字段 --
對象.字段名
- choice字段 --
對象.get_字段名_display
- 外鍵 --
對象.外鍵字段.屬性
- 多對多 --
對象.自定義方法
5. 簡述如何使用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)模板中:markdown
{% for field in form_obj %} {{ field }} {% endfor %}
6. 請詳細說說公司銷售是如何使用CRM的
銷售能夠經過我的渠道獲取客戶信息, 本身錄入到系統中, 或者銷售主管或網絡諮詢師將已經錄入系統的客戶分配給銷售.網絡
銷售須要在規定時間間隔內對客戶進行跟進或回訪, 將跟進信息記錄到系統中, 根據不一樣的狀況標記客戶的報名意向.session
當客戶肯定報名時須要讓客戶本人或者銷售幫忙添加報名表.數據結構
當銷售收到客戶繳納的費用時, 須要填寫繳費記錄, 並將費用轉交財務進行審批.
7. 詳細說說班主任是如何使用CRM的
班主任對班級信息進行管理, 對班級信息進行增刪改查.
建立好班級信息後, 能夠對某一班級建立課程記錄, 記錄上課的狀況, 做業要求等信息.
建立好班級信息後, 可根據某節上課記錄來生成學習的上課記錄(學習記錄), 該操做做爲批量操做, 批量生成該課程所對應班級的全部學生的學習記錄. 使用modelformset
來展現和編輯這些學習記錄.
8. CRM項目中哪些地方用到了QueryDict
對象, 詳細說說它的用法
分頁保留搜索條件時: 搜索條件在request.GET
中, request.GET
就是QueryDict
對象, 將該對象複製後可給該字典中添加頁碼的相關參數, 使用QueryDict
的urlencode()
方法, 將結果拼接到生成的URL上.
添加或編輯後跳轉至原頁面: 本身生成一個QueryDict
對象, 將當前訪問的完整路徑添加到該字典中複製給next
, 使用QueryDict
的urlencode()
方法, 將結果拼接到生成的添加或編輯的URL上. 添加或編輯後從request.GET
中獲取到next
的值, 跳轉到該地址便可.
9. CRM中有哪些優勢, 用於作什麼(至少寫5個)
技術點 | 做用 |
---|---|
auth模塊 | 認證 |
modelform | 對錶進行增刪改查 |
分頁 | 對數據進行分頁顯示 |
Q對象 | 查詢條件==或==的關係 |
QueryDict | 保留搜索條件 |
url的命名和反向解析 | ---- |
事務 + 行級鎖 | 加入私戶 |
批量建立對象 | ---- |
modelformset | ---- |
二. 權限
1. 使用幾張表來完成權限控制的?每張表中有哪些字段?
表 | 字段 |
---|---|
菜單表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 |
2. 請簡述實現權限控制的流程
在web應用中, 一個URL
表明一個權限, 能夠訪問某一URL
則說明有該權限. 該權限系統中URL
被分爲兩種, 一種是能夠作二級菜單的父權限, 一種是不能作菜單的子權限. Menu
表中的數據稱之爲一級菜單, 二級菜單被分配給一級菜單. 子權限分配給父權限.
當用戶登陸成功時, 根據用戶全部的角色查詢出所具備的權限, 將權限信息和菜單信息存放在session
中. 登陸成功後跳轉至其餘URL
時, 請求通過中間件時進行權限的校驗, 根據當前訪問的url
和session
中存放的權限信息進行正則匹配. 都匹配不成功, 則拒絕訪問. 匹配成功則繼續走正常的流程獲得相應的響應.
頁面中的可點擊的按鈕也是權限, 在模板渲染時使用自定義filter
判斷該按鈕所表明的權限是否在該用戶所擁有的權限中, 若是是則顯示該按鈕, 不然不顯示.
3. 初始化權限時, 定義了兩個字典, 分別是什麼數據結構?爲何要把他們存在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
中, 讀取速度快.
4. 權限校驗的中間件都作了什麼事情?
(1)獲取當前訪問的URL
, 判斷是否在不須要權限校驗的白名單中, 若是在則再也不進行校驗.
(2)從session
中獲取到該用戶的權限信息.
(3)循環出每個權限進行正則匹配, 匹配成功則改變flag
標誌位爲True
, 而且獲取到須要默認展開菜單的權限id和要展現的路徑導航信息.
(4)循環結束後, flag
還未False
則拒絕訪問.
5. 如何實現二級菜單默認展開而且是選中狀態的?
二級菜單是經過inclusion_tag
實現的, 將request
看成參數傳給menu
函數, 函數中從request
中獲取到menu_dict
. 循環menu_dict
給一級菜單都添加了一個hide
的class
, 默認一級菜單下的二級菜單(父權限)是不是要默認選中的二級菜單, 若是是的話, 給該二級菜單添加一個active
的class
, 給該二級菜單對應的一級菜單的class
從新賦值爲空.
模板中生成二級菜單時添加上對應的class
, 則顯示出相應的狀態. class
爲hide
則是隱藏狀態, class
爲active
則是選中狀態.
6. 權限控制到按鈕級別是如何實現的?
session
中存放着一個有關權限信息的字典, 字典的key
爲權限的URL
別名, value
爲一個權限的具體信息.
自定義了一個filter
, 用來判斷某一個權限是否在該用戶的權限字典中, 在的話返回True
, 不在返回False
.
模板中使用該filter
來對每一個要生成按鈕的部分作判斷, 有權限則會顯示按鈕, 沒有權限則不顯示.
7. 權限批量操做時, 哪些權限是須要新增的?哪些是須要刪除的?哪些是可更新的?
-
新增的: 路由系統中有, 數據庫中沒有的.
-
刪除: 路由系統中沒有, 數據庫中有的
-
可更新: 路由系統和數據庫中都有的
8. 開發過程當中遇到問題,通常都是怎樣解決的?請說一下你印象比較深入的一個問題.
9. 請簡述管理權限信息的流程(管理,分配權限是如何操做的)
- 管理頁面對權限進行增長,刪除,更新等操做
- 角色管理頁面, 分別對角色設置權限並保存
- 分別爲用戶設置角色信息並保存
10. 簡述如何將rbac
組件應用到一個新項目中.
- (1)拷貝
rbac
組件到新的項目中, 註冊app - (2)修改用戶表, 繼承
rbac
中的User
表 - (3)執行數據庫遷移指令
- 1)刪除
rbac
下migrations
中的記錄 - 2)註釋掉
admin
中的User
表 - 3)
roles=models.ManyToManyField(to=Role, verbose_name='用戶擁有的角色', blank=True)
注意: 關聯的字段不要寫成字符串形式
- 1)刪除
-
(4)設置
rbac
的url
- (5)菜單管理
- (6)權限的錄入
- 1)全部的
url
要有name
- 2)不要忽略
rbac
的namespace
- 3)注意
url
和別名的長度 - 4)構建層級結構
- 1)全部的
- (7)角色管理
- (8)分配權限
- 1)注意用新的用戶表替換
rbac
中的User
- 2)給不一樣角色分配權限
- 3)給不一樣用戶分配角色
- 1)注意用新的用戶表替換
- (9)應用權限
- 1)應用中間件 -- 在
settings.py
中寫上權限的配置 - 2)登陸成功後權限信息的初始化
- 1)應用中間件 -- 在
- (10)動態生成二級菜單
- (11)應用路徑導航
-
(12)權限控制到按鈕級別
11. rbac
組件中有哪些技術點, 用於作什麼?
技術點 | 做用 |
---|---|
中間件 | 進行訪問權限校驗 |
inclusion_tag |
動態生成二級菜單和路徑導航 |
filter |
權限控制到按鈕級別 |
modelformset |
權限的批量操做 |
session |
保存權限和菜單的數據結構 |