系統管理


1.用戶權限控制說明

在產品運營平台中,是需要對用戶進行權限控制的。Django實現了用戶權限的控制

  • 消費者用戶與公司內部運營用戶使用一個用戶數據庫來存儲
  • 通過is_staff 來區分是運營用戶還是消費者用戶
  • 對於運營用戶通過is_superuser 來區分是運營平台的管理員還是運營平台的普通用戶
  • 對於運營平台的普通用戶,通過權限、組和組外權限來控制這個用戶在平台上可以操作的數據。
  • 對於權限,Django會為每個數據庫表提供增、刪、改、查四種權限
  • 用戶最終的權限為 組權限 + 用戶特有權限

 

 

 

 

1.權限表管理

在權限表中我們需要對權限表數據進行增刪改查操作,這時候我們可以借助於視圖集中的ModelViewset來完成相應的操作

 

 

1.獲取用戶權限表列表數據

接口分析

請求方式: GET /meiduo_admin/permission/perms/

請求參數: 通過請求頭傳遞jwt token數據。

返回數據: JSON

  {
        "counts": "權限總數量",
        "list": [
            {
                "id": "權限id",
                "name": "權限名稱",
                "codename": "權限識別名",
                "content_type": "權限類型"
            },
            ...
        ],
        "page": "當前頁碼",
        "pages": "總頁碼",
        "pagesize": "頁容量"
    }

 

返回值 類型 是否必須 說明
counts int 權限總數量
lists 數組 權限表信息
page int 頁碼
pages int 總頁數
pagesize int 頁容量

后端實現

from django.contrib.auth.models import Permission, ContentType

class PermissionView(ModelViewSet):
    serializer_class = PermissionSerialzier
    queryset = Permission.objects.all()
    pagination_class = PageNum

 

序列化器的定義

from django.contrib.auth.models import Permission, ContentType
class PermissionSerialzier(serializers.ModelSerializer):
        """
            用戶權限表序列化器
        """
    class Meta:
        model=Permission
        fields="__all__"

 

2.保存權限表數據

在保存數據之前我們需要權限類表數據內容

 

 

1、獲取權限類型列表數據

接口分析

請求方式: GET /meiduo_admin/permission/content_types/

請求參數: 通過請求頭傳遞jwt token數據。

返回數據: JSON

  [
        {
            "id": "權限類型id",
            "name": "權限類型名稱"
        },
        ...
    ]

 

返回值 類型 是否必須 說明
Id int 權限類型id
name 數組 權限類型名稱

后端實現

from django.contrib.auth.models import Permission, ContentType

class PermissionView(ModelViewSet):
    serializer_class = PermissionSerialzier
    queryset = Permission.objects.all()
    pagination_class = PageNum

        # 獲取權限類型數據
    def content_types(self,request):
        # 查詢全選分類
        content=ContentType.objects.all()
        # 返回結果
        ser=ContentTypeSerialzier(content,many=True)
        return Response(ser.data)

 

序列化器的定義

from django.contrib.auth.models import Permission, ContentType

class ContentTypeSerialzier(serializers.ModelSerializer):
        """
            權限類型序列化器
        """
    class Meta:
        model=ContentType
        fields=('id','name')

 

2、保存權限表數據

接口分析

請求方式:POST /meiduo_admin/permission/perms/

請求參數: 通過請求頭傳遞jwt token數據。

參數 類型 是否必須 說明
name str 權限名稱
codename str 權限識別名
content_type str 權限類型

返回數據: JSON

{
        "id": "權限id",
        "name": "權限名稱",
        "codename": "權限識別名",
        "content_type": "權限類型"
    }

 

參數 類型 是否必須 說明
id Int 權限id
name Str 權限名稱
codename str 限識別名
content_type int 權限類型

后端實現

from django.contrib.auth.models import Permission, ContentType

# PermissionView繼承的是ModelViewSet 所以保存邏輯還是使用同一個類視圖
class PermissionView(ModelViewSet):
    serializer_class = PermissionSerialzier
    queryset = Permission.objects.all()
    pagination_class = PageNum

    def content_types(self,request):
        # 查詢全選分類
        content=ContentType.objects.all()
        # 返回結果
        ser=ContentTypeSerialzier(content,many=True)

        return Response(ser.data)

 

3.更新權限表數據

1、 獲取修改權限表的詳情信息

點就修改按鈕時,我們需要先獲取要修改的商品詳情信息

接口分析

請求方式: GET /meiduo_admin/permission/perms/(?P<pk>\d+)/

請求參數: 通過請求頭傳遞jwt token數據。

在頭部中攜帶要獲取的權限商品ID

返回數據: JSON

  {
        "id": "權限id",
        "name": "權限名稱",
        "codename": "權限識別名",
        "content_type": "權限類型"
    }

 

參數 類型 是否必須 說明
id Int 權限id
name Str 權限名稱
codename str 限識別名
content_type int 權限類型

后端實現

from django.contrib.auth.models import Permission, ContentType
# PermissionView繼承的是ModelViewSet 所以獲取詳情邏輯還是使用同一個類視圖
class PermissionView(ModelViewSet):
    serializer_class = PermissionSerialzier
    queryset = Permission.objects.all()
    pagination_class = PageNum

    def content_types(self,request):
        # 查詢全選分類
        content=ContentType.objects.all()
        # 返回結果
        ser=ContentTypeSerialzier(content,many=True)

        return Response(ser.data)

 

2、修改權限表

接口分析

請求方式: PUT /meiduo_admin/goods/(?P<pk>\d+)/

請求參數: 通過請求頭傳遞jwt token數據。

參數 類型 是否必須 說明
name str 權限名稱
codename str 權限識別名
content_type str 權限類型

返回數據: JSON

  {
        "id": "權限id",
        "name": "權限名稱",
        "codename": "權限識別名",
        "content_type": "權限類型"
    }
參數 類型 是否必須 說明
id Int 權限id
name Str 權限名稱
codename str 限識別名
content_type int 權限類型

后端實現

from django.contrib.auth.models import Permission, ContentType
# PermissionView繼承的是ModelViewSet 所以更新邏輯還是使用同一個類視圖
class PermissionView(ModelViewSet):
    serializer_class = PermissionSerialzier
    queryset = Permission.objects.all()
    pagination_class = PageNum

    def content_types(self,request):
        # 查詢全選分類
        content=ContentType.objects.all()
        # 返回結果
        ser=ContentTypeSerialzier(content,many=True)

        return Response(ser.data)

 

4.刪除權限表數據

接口分析

請求方式: Delte /meiduo_admin/permission/perms/(?P<pk>\d+)/

請求參數: 通過請求頭傳遞jwt token數據。

在路徑中攜帶刪除的權限表的id值

返回數據: JSON

返回空

后端實現

from django.contrib.auth.models import Permission, ContentType
# PermissionView繼承的是ModelViewSet 所以刪除邏輯還是使用同一個類視圖
class PermissionView(ModelViewSet):
    serializer_class = PermissionSerialzier
    queryset = Permission.objects.all()
    pagination_class = PageNum

    def content_types(self,request):
        # 查詢全選分類
        content=ContentType.objects.all()
        # 返回結果
        ser=ContentTypeSerialzier(content,many=True)

        return Response(ser.data)

 

3.分組表管理

在系統管理中我們需要完成用戶組表的增刪改查,這時候我們可以借助於視圖集中的ModelViewset來完成相應的操作

 

 

獲取用戶組表列表數據

接口分析

請求方式: GET /meiduo_admin/permission/groups/

請求參數: 通過請求頭傳遞jwt token數據。

返回數據: JSON

  {
        "counts": "用戶組總數量",
        "list": [
            {
                "id": "組id",
                "name": "組名稱",
            },
            ...
        ],
        "page": "當前頁碼",
        "pages": "總頁碼",
        "pagesize": "頁容量"
    }

 

返回值 類型 是否必須 說明
counts int 用戶組總數量
lists 數組 用戶組表信息
page int 頁碼
pages int 總頁數
pagesize int 頁容量

后端實現

from django.contrib.auth.models import Permission, ContentType, Group
class GroupView(ModelViewSet):
    serializer_class = GroupSerialzier
    queryset = Group.objects.all()
    pagination_class = PageNum

 

序列化器的定義

class GroupSerialzier(serializers.ModelSerializer):

    class Meta:
        model=Group
        fields="__all__"

 

2.保存分組表數據

在保存數據之前我們需要權限表的數據內容展示在權限中

 

 

1、獲取權限表數據

接口分析

請求方式: GET /meiduo_admin/permission/simple/

請求參數: 通過請求頭傳遞jwt token數據。

返回數據: JSON

  [
        {
            "id": "權限類型id",
            "name": "權限類型名稱"
        },
        ...
    ]

 

返回值 類型 是否必須 說明
Id int 權限類型id
name 數組 權限類型名稱

后端實現

from django.contrib.auth.models import Permission, ContentType, Group

class GroupView(ModelViewSet):
    serializer_class = GroupSerialzier
    queryset = Group.objects.all()
    pagination_class = PageNum
        # 獲取權限表數據
    def simple(self, reqeust):
        pers = Permission.objects.all()
        ser = PermissionSerialzier(pers, many=True) # 使用以前定義的全選序列化器
        return Response(ser.data)

 

2、保存權限表數據

接口分析

請求方式:POST /meiduo_admin/permission/groups/

請求參數: 通過請求頭傳遞jwt token數據。

參數 類型 是否必須 說明
name str 組名稱
permissions str ["權限id", ...]

返回數據: JSON

 {
        "id": "組id",
        "name": "組名稱"
    }
參數 類型 是否必須 說明
id Int 組id
name Str 組名稱

后端實現

from django.contrib.auth.models import Permission, ContentType, Group
# GroupView繼承的是ModelViewSet 所以保存邏輯還是使用同一個類視圖
class GroupView(ModelViewSet):
    serializer_class = GroupSerialzier
    queryset = Group.objects.all()
    pagination_class = PageNum
        # 獲取權限表數據
    def simple(self, reqeust):
        pers = Permission.objects.all()
        ser = PermissionSerialzier(pers, many=True) # 使用以前定義的全選序列化器
        return Response(ser.data)

 

3.更新分組表數據

1、 獲取修改分組表的詳情信息

點就修改按鈕時,我們需要先獲取要修改的分組表詳情信息

接口分析

請求方式: GET /meiduo_admin/permission/groups/(?P<pk>\d+)/

請求參數: 通過請求頭傳遞jwt token數據。

在頭部中攜帶要獲取的分組ID

返回數據: JSON

 {
           "id": "組id",
           "name": "組名稱",
           "permissions": [
            "權限id",
            "權限id",
            ...
           ]
    }

 

參數 類型 是否必須 說明
id Int 組id
name Str 組名稱
permissions str 限識id

后端實現

from django.contrib.auth.models import Permission, ContentType, Group
# GroupView繼承的是ModelViewSet 所以獲取詳情邏輯還是使用同一個類視圖
class GroupView(ModelViewSet):
    serializer_class = GroupSerialzier
    queryset = Group.objects.all()
    pagination_class = PageNum
        # 獲取權限表數據
    def simple(self, reqeust):
        pers = Permission.objects.all()
        ser = PermissionSerialzier(pers, many=True) # 使用以前定義的全選序列化器
        return Response(ser.data)

 

2、修改權限表

接口分析

請求方式: PUT /meiduo_admin/permission/groups/(?P<pk>\d+)/

請求參數: 通過請求頭傳遞jwt token數據。

參數 類型 是否必須 說明
name str 組名稱
permissions str 權限id

返回數據: JSON

 {
           "id": "組id",
           "name": "組名稱",
           "permissions": [
            "權限id",
            "權限id",
            ...
           ]
    }

 

參數 類型 是否必須 說明
id Int 組id
name Str 組名稱
permissions str 限識id

后端實現

from django.contrib.auth.models import Permission, ContentType, Group
# GroupView繼承的是ModelViewSet 所以修改邏輯還是使用同一個類視圖
class GroupView(ModelViewSet):
    serializer_class = GroupSerialzier
    queryset = Group.objects.all()
    pagination_class = PageNum
        # 獲取權限表數據
    def simple(self, reqeust):
        pers = Permission.objects.all()
        ser = PermissionSerialzier(pers, many=True) # 使用以前定義的全選序列化器
        return Response(ser.data)

 

4.刪除分組表數據

接口分析

請求方式: Delte /meiduo_admin/permission/groups/(?P<pk>\d+)/

請求參數: 通過請求頭傳遞jwt token數據。

在路徑中攜帶刪除的分組表的id值

返回數據: JSON

返回空

后端實現

from django.contrib.auth.models import Permission, ContentType, Group
# GroupView繼承的是ModelViewSet 所以刪除邏輯還是使用同一個類視圖
class GroupView(ModelViewSet):
    serializer_class = GroupSerialzier
    queryset = Group.objects.all()
    pagination_class = PageNum
        # 獲取權限表數據
    def simple(self, reqeust):
        pers = Permission.objects.all()
        ser = PermissionSerialzier(pers, many=True) # 使用以前定義的全選序列化器
        return Response(ser.data)

 

4.管理員信息管理

在系統管理中我們需要完成管理員表的增刪改查,這時候我們可以借助於視圖集中的ModelViewset來完成相應的操作

 

 

1.獲取管理員用戶列表數據

接口分析

請求方式: GET /meiduo_admin/permission/admins/

請求參數: 通過請求頭傳遞jwt token數據。

返回數據: JSON

  {
        "id": "用戶id",
        "username": "用戶名",
        "email": "郵箱",
        "mobile": "手機號"
    }

 

返回值 類型 是否必須 說明
id int 用戶id
username str 用戶名
Email str 頁碼
mobile str 總頁數

后端實現

class AdminView(ModelViewSet):
    serializer_class = AdminSerializer
    # 獲取管理員用戶
    queryset = User.objects.filter(is_staff=True)
    pagination_class = PageNum

 

序列化器的定義

class AdminSerializer(serializers.ModelSerializer):
    class Meta:
        model=User
        fields="__all__"
        extra_kwargs={
            'password':{
                'write_only': True
            }
        }

 

保存管理員數據

在保存數據之前我們需要獲取權限表數據和分組表數據展示,權限表數據的獲取接口已經完成,我們只需要獲取分組表數據

 

 

1、獲取分組表數據

接口分析

請求方式: GET /meiduo_admin/permission/groups/simple/

請求參數: 通過請求頭傳遞jwt token數據。

返回數據: JSON

 [
        {
            "id": 1,
            "name": "廣告組"
        },
        {
            "id": 2,
            "name": "商品SKU組"
        },
        ......
    ]

 

返回值 類型 是否必須 說明
Id int 分組id
name 數組 分組名稱

后端實現

# AdminView繼承的是ModelViewSet 所以獲取分組邏輯還是使用同一個類視圖
class AdminView(ModelViewSet):
    serializer_class = AdminSerializer
    queryset = User.objects.filter(is_staff=True)
    pagination_class = PageNum

        # 獲取分組數據
    def simple(self, reqeust):
        pers = Group.objects.all()
        ser = GroupSerialzier(pers, many=True)
        return Response(ser.data)

 

2、保存管理員數據

接口分析

請求方式:POST /meiduo_admin/permission/admins/

請求參數: 通過請求頭傳遞jwt token數據。

參數 類型 是否必須 說明
username str 用戶名
mobile str 手機號
password int 密碼
email str 郵箱
groups list 用戶組id
user_permissions list 權限id

返回數據: JSON

  {
        "id": "用戶id",
        "username": "用戶名",
        "password": "密碼",
        "mobile": "手機號",
        "email": "郵箱",
        "groups": ['用戶組id', ...],
        "user_permissions": ['權限id', ...]
    }

 

參數 類型 是否必須 說明
username str 用戶名
mobile str 手機號
email str 郵箱
groups list 用戶組id
user_permissions list 權限id

后端實現

# AdminView繼承的是ModelViewSet 所以保存分組邏輯還是使用同一個類視圖
class AdminView(ModelViewSet):
    serializer_class = AdminSerializer
    queryset = User.objects.filter(is_staff=True)
    pagination_class = PageNum

        # 獲取分組數據
    def simple(self, reqeust):
        pers = Group.objects.all()
        ser = GroupSerialzier(pers, many=True)
        return Response(ser.data)

 

序列化器

class AdminSerializer(serializers.ModelSerializer):
    class Meta:
        model=User
        fields="__all__"
        extra_kwargs={
            'password':{
                'write_only': True
            }
        }

       # 重寫父類方法,增加管理員權限屬性
      def create(self, validated_data):
        # 添加管理員字段
        validated_data['is_staff'] = True
        # 調用父類方法創建管理員用戶
        admin = super().create(validated_data)
        # 用戶密碼加密
        password = validated_data['password']
        admin.set_password(password)
        admin.save()

        return admin

 

更新管理員數據

1、 獲取修改管理員的詳情信息

點就修改按鈕時,我們需要先獲取要修改的分組表詳情信息

接口分析

請求方式: GET /meiduo_admin/permission/admins/(?P<pk>\d+)/

請求參數: 通過請求頭傳遞jwt token數據。

返回數據: JSON

 {
        "id": "用戶id",
        "username": "用戶名",
        "mobile": "手機號",
        "email": "郵箱",
        "groups": ['用戶組id', ...],
        "user_permissions": ['權限id', ...]
    }

 

參數 類型 是否必須 說明
username str 用戶名
mobile str 手機號
email str 郵箱
groups list 用戶組id
user_permissions list 權限id

后端實現

# AdminView繼承的是ModelViewSet 所以管理員詳情邏輯還是使用同一個類視圖
class AdminView(ModelViewSet):
    serializer_class = AdminSerializer
    queryset = User.objects.filter(is_staff=True)
    pagination_class = PageNum

        # 獲取分組數據
    def simple(self, reqeust):
        pers = Group.objects.all()
        ser = GroupSerialzier(pers, many=True)
        return Response(ser.data)

 

2、修改管理員

接口分析

請求方式: PUT /meiduo_admin/permission/admins/(?P<pk>\d+)/

請求參數: 通過請求頭傳遞jwt token數據。

參數 類型 是否必須 說明
username str 用戶名
mobile str 手機號
password int 密碼
email str 郵箱
groups list 用戶組id
user_permissions list 權限id

返回數據: JSON

 {
        "id": "用戶id",
        "username": "用戶名",
        "password": "密碼",
        "mobile": "手機號",
        "email": "郵箱",
        "groups": ['用戶組id', ...],
        "user_permissions": ['權限id', ...]
    }

 

參數 類型 是否必須 說明
username str 用戶名
mobile str 手機號
password int 密碼
email str 郵箱
groups list 用戶組id
user_permissions list 權限id

后端實現

# AdminView繼承的是ModelViewSet 所以管理員信息修改邏輯還是使用同一個類視圖
class AdminView(ModelViewSet):
    serializer_class = AdminSerializer
    queryset = User.objects.filter(is_staff=True)
    pagination_class = PageNum

        # 獲取分組數據
    def simple(self, reqeust):
        pers = Group.objects.all()
        ser = GroupSerialzier(pers, many=True)
        return Response(ser.data)

 

刪除管理員信息數據

接口分析

請求方式: Delte /meiduo_admin/permission/admins/(?P<pk>\d+)/

請求參數: 通過請求頭傳遞jwt token數據。

在路徑中攜帶刪除的用戶id值

返回數據: JSON

返回空

后端實現

# AdminView繼承的是ModelViewSet 所以刪除邏輯還是使用同一個類視圖
class AdminView(ModelViewSet):
    serializer_class = AdminSerializer
    queryset = User.objects.filter(is_staff=True)
    pagination_class = PageNum

        # 獲取分組數據
    def simple(self, reqeust):
        pers = Group.objects.all()
        ser = GroupSerialzier(pers, many=True)
        return Response(ser.data)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM