django項目(CRM項目繼續,作到權限粒度劃分到按鈕)

內容回顧:html

1.使用別人源碼,啓動:解釋器+工做目錄

2. django請求生命週期

3. 配置文件
- key必須大寫
- 導入配置
from django.conf import settings

3. 在模板中定義函數
- sample_tag
- inclusion_tag

4. 尋找模板的順序(靜態文件)
- 最外層templates目錄 (static)
- 去註冊的app下的templates目錄中找(按照app註冊順序)(static)

5. auto示例:全部用戶登陸後看到的菜單都同樣。python


今日內容:
1. 菜單+權限信息=> 數據庫

2. 權限組件的應用(含菜單)

3. crm業務

內容詳細:
1. 菜單+權限信息=> 數據庫
a. 數據庫設計
from django.db import modelsweb

class Menu(models.Model):
"""
菜單表
"""
title = models.CharField(verbose_name='標題',max_length=32)
icon = models.CharField(verbose_name='圖標',max_length=32)數據庫


class Permission(models.Model):
"""
權限表
"""
url = models.CharField(verbose_name='URL(含正則)', max_length=128)
title = models.CharField(verbose_name='名稱',max_length=32)
name = models.CharField(verbose_name='別名',max_length=32,unique=True)django

menu = models.ForeignKey(verbose_name='管理菜單',to='Menu',to_field='id',null=True,blank=True)
parent = models.ForeignKey(verbose_name='父菜單',to='Permission',null=True,blank=True)


class Role(models.Model):
"""
角色表
"""
title = models.CharField(verbose_name='名稱', max_length=32)
permissions = models.ManyToManyField(verbose_name='關聯權限',to='Permission')


class UserInfo(models.Model):
"""
用戶表
"""
username = models.CharField(verbose_name='用戶名',max_length=32)
password = models.CharField(verbose_name='密碼',max_length=64)
roles = models.ManyToManyField(verbose_name='關聯角色',to='Role')

b. 數據填充


c. 上一節功能去掉
- 去掉web app
- url.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^web/', include('web.urls')),
]
- settings.py
去掉 MENU_LIST
去掉註冊的app: 'web.apps.WebConfig',


d. 獲取權限和菜單信息
用戶登陸:馬帥,UserInfo表中作查詢,登陸成功後獲取兩部分數據:
權限 = {
"user": {"url":'/app01/user/'},
"user_add": {"url":'/app01/user/add/'},
"user_edit": {"url":'/app01/user/edit/(\d+)'},
"order": {"url":'/app01/order/'},
}

菜單信息 = {
1:{
'title':'用戶管理',
'icon':'fa-clipboard',
'children':[
{'title':'用戶列表','url':'/app01/user/'},
]
},
2:{
'title':'商品管理',
'icon':'fa-clipboard',
'children':[
{'title':'訂單列表','url':'/app01/order/'},
]
}

}


e. 權限控制


f. 動態生成二級菜單



g. 粒度控制到按鈕級別
- 權限別名
- filter


2. 使用權限系統
1. 拷貝rbac應用

2. 刪除rbac/migrations目錄中除 __init__.py 之外的全部文件

3. 配置文件中註冊 rbac的app
INSTALLED_APPS = [
...
'rbac.apps.RbacConfig',
]

4. 數據庫遷移
python manage.py makemigrations
python manage.py migrate


5. 編寫測試系統的業務邏輯
若是使用rbac中的模板的話,須要先刪除layout.html中的:
<!-- 導入xxxxxxx模塊 -->
{% load rbac %}
<!-- 執行get_menu函數並傳遞了一個參數 -->
{% get_menu request %}

業務邏輯開發完畢....

6. 設置權限相關的配置文件
# ############################ 權限+菜單相關配置 #############################
RBAC_PERMISSION_SESSION_KEY = "ijksdufwesdfs"
RBAC_MENU_SESSION_KEY = "rtwsdfgwerffsd"api

VALID_LIST = [
'/api/login/',
'/admin/.*'
]

7. 基於django admin 錄入權限數據
- 菜單
- 權限
- 權限角色關係表
- 角色
- 用戶角色關係表
- 用戶

8. 權限和菜單信息的應用
- 用戶登陸:初始化權限和菜單信息
def login(request):
"""
用戶登陸
:param request:
:return:
"""
if request.method == "GET":
return render(request, 'api/login.html')

user = request.POST.get('user')
pwd = request.POST.get('pwd')

user = rbac_model.UserInfo.objects.filter(username=user, password=pwd).first()
if not user:
return render(request, 'api/login.html', {'msg': '用戶名或密碼錯誤'})
# ############ 看這裏 ############
init_permission(user, request)

return redirect('/api/app/list/')
- 中間件:權限判斷
settings.py
MIDDLEWARE = [
...
'rbac.middlewares.rbac.RBACMiddleware',
]
- inclusion_tag:動態生成菜單
layout.html
<div class="menu-body">
{% load rbac %}數據結構

{% get_menu request %}
</div>


9. 控制頁面按鈕

{% extends 'layout.html' %}

{% load rbac %} app

{% block content %}
<h1>應用列表</h1>

{% if 'app_add'|permission:request %}
<a class="btn btn-primary" href="{% url 'app_add' %}">添加</a>
{% endif %}

<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
{% if "app_edit"|permission:request or "app_del"|permission:request %}
<th>操做</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for row in app_queryset %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.title }}</td>
{% if "app_edit"|permission:request or "app_del"|permission:request %}
<td>
{% if "app_edit"|permission:request %}
<a href="{% url 'app_edit' row.id %}">編輯</a>
{% endif %}
{% if "app_del"|permission:request %}
<a href="{% url 'app_del' row.id %}/">刪除</a>
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>數據庫設計


{% endblock %}





總結:
1. 保存的代碼:
- 上一節示例:auto - 7 - 靜態的菜單示例(最終版).zip
- 本節示例:nb_test.zip

2. 權限相關

1. 權限系統是如何實現的?
基於角色的權限控制(rbac)

2. 權限系統中用了哪些表?表中都有哪些字段?


3. 你用中間件實現過什麼?爲何使用中間件?
rbac對權限的控制。

4. 你認爲哪裏最難搞?
- 動態二級菜單+默認選中
- 構建菜單和權限的數據結構時。

5. 其餘
...


做業:補充 nb_test 應用。
- 8個api操做(使用ModelForm實現增刪改查)
url(r'^app/list/$', views.app_list,name='app_list'),
url(r'^app/add/$', views.app_add,name='app_add'),
url(r'^app/edit/(\d+)/$', views.app_edit,name='app_edit'),
url(r'^app/del/(\d+)/$', views.app_del,name='app_del'),

url(r'^api/list/$', views.api_list,name='api_list'),
url(r'^api/add/$', views.api_add,name='api_add'),
url(r'^api/edit/(\d+)/$', views.api_edit,name='api_edit'),
url(r'^api/del/(\d+)/$', views.api_del,name='api_del'),
- 9 + api
在api列表中設置一個按鈕,點擊測試。


"""
pip3 install requests
"""
import requests
response = requests.get(url='http://www.baidu.com')
print(response.status_code)
print(response.text)



總結:
一、layout.html在外層,項目會先找外層的,外層沒有會按照app的註冊順序找裏層的。
函數

相關文章
相關標籤/搜索