系统管理

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)

 

posted @ 2020-08-15 04:08  sewen  Views(1782)  Comments(0Edit  收藏  举报