zoukankan      html  css  js  c++  java
  • 【Vue+DRF 生鲜电商】用户个人中心(六)

    1. docs 文档

    drf 的 api 文档优点:

    • 自动生成
    • 支持交互
    • 支持多语言片段(js、Python、shell

    1、MxShop/urls.py

    # drf 文档,title:文档标题
    path('docs', include_docs_urls(title='hubery')),
    

    2、文档注释:

    class UserAddressViewSet(viewsets.GenericViewSet, mixins.CreateModelMixin, mixins.ListModelMixin,
                             mixins.DestroyModelMixin, mixins.UpdateModelMixin):
        """
        文档注释:
        用户收件地址:新增地址(CreateModelMixin)、删除地址(DestroyModelMixin)
        、所有地址(ListModelMixin)、更新地址(UpdateModelMixin)
        """
    

    访问地址:http://127.0.0.1:8000/docs(最后不要加 /

    踩坑:docs 文档访问出现:AttributeError: 'AutoSchema' object has no attribute 'get_link'

    配置 settings

    REST_FRAMEWORK = {
        # docs 文档相关
        "DEFAULT_SCHEMA_CLASS": "rest_framework.schemas.AutoSchema"
    }
    

    2. 用户信息

    接口地址:

    # 获取用户详情:get
    http://127.0.0.1:8000/users/1/
    
    # 提交:post
    http://127.0.0.1:8000/users/1/
    
    # 修改:update(patch)
    http://127.0.0.1:8000/users/1/
    

    需求:

    • 获取单个用户信息(只能获取当前登录用户的信息,所以必须登录)
    • 修改用户信息

    1、users/serializers.py

    class UserDetailSerializer(serializers.ModelSerializer):
        """用户详情:用于用户个人中心"""
        class Meta:
            model = User
            fields = ("name", "birthday", "gender", "email", "mobile")
    

    2、users/views.py

    class UserCreateViewSet(CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, viewsets.GenericViewSet):
        """
        创建用户、注册用户、修改用户信息、获取用户详情
        """
        serializer_class = UserSerializer
        queryset = User.objects.all()
        authentication_classes = (JSONWebTokenAuthentication, authentication.SessionAuthentication)
    
        def create(self, request, *args, **kwargs):
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            user = self.perform_create(serializer)
            re_dict = serializer.data
            payload = jwt_payload_handler(user)
            re_dict["token"] = jwt_encode_handler(payload)
            re_dict["name"] = user.name if user.name else user.username
    
            headers = self.get_success_headers(serializer.data)
    
            return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)
    
        def get_permissions(self):
            """
            设置动态权限:用户注册时没有权限限制,获取用户详情必须登录才可以
            :return:
            """
            if self.action == "retrieve":
                return [permissions.IsAuthenticated()]
            elif self.action == "create":
                return []
    
            return []
    
        def get_serializer_class(self):
            """
            动态选择使用哪个序列化方式
            UserSerializer:用于用户注册,UserDetailSerializer:用于返回用户详情
            :return:
            """
            if self.action == 'retrieve':
                return UserDetailSerializer
            elif self.action == 'create':
                return UserSerializer
            return UserDetailSerializer
    
        def get_object(self):
            """
            获取登录用户
            用于返回用户对象,判断当前是哪个用户,配合 UserDetailSerializer 获取用户详情
            :return:
            """
            return self.request.user  # 即当前登录用户
    
        def perform_create(self, serializer):
            return serializer.save()
    

    与注册使用的同一视图函数 UserCreateViewSet,只是在原有基础上多继承了 RetrieveModelMixin,用于获取用户详情。

    另外需要注意的是视图函数要动态设置权限认证、序列化方法:

    • 用户注册:不需要 jwt 验证,序列化类 UserSerializer
    • 用户详情:需要 jwt 验证,序列化类 UserDetailSerializer

    因此需要重写 get_permissions()、get_serializers_class() 方法,根据动作动态选择。

    3. 用户收藏

    接口地址:

    # 获取所有收藏:get,ListModelMixin
    http://127.0.0.1:8000/userfavs/
    
    # 取消收藏:delete,需要指定商品 id ,DestroyModelMixin
    http://127.0.0.1:8000/userfavs/1/
    

    1、user_operation/serializers.py

    class UserFavDetailSerializer(serializers.ModelSerializer):
        """
        收藏详情
        """
        # 通过商品 id 获取收藏的商品,需要嵌套商品的序列化
        goods = GoodsSerializer()
    
        class Meta:
            model = UserFav
            fields = ('goods', 'id')
    

    2、user_operation/views.py

    class UserFavViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin):
        """
        用户商品收藏
        ListModelMixin:收藏列表
        CreateModelMixin:收藏
        DestroyModelMixin:取消(删除)收藏,相应地要删除数据库中数据
        """
        serializer_class = UserFavSerializer
        queryset = UserFav.objects.all()
    
        # IsAuthenticated:必须登录用户;IsOwnerOrReadOnly:必须是当前登录的用户
        permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    
        # 用户认证
        authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    
        # 搜索的字段
        lookup_field = 'goods_id'
    
        def get_serializer_class(self):
            """
            动态设置 serializer,get 时获取用户收藏详情
            :return:
            """
            if self.action == 'list':
                # 收藏列表
                return UserFavDetailSerializer
            elif self.action == 'create':
                return UserFavSerializer
    
            return UserFavSerializer
    
        def get_queryset(self):
            # 只能查看当前登录用户的收藏,禁止获取其他用户的收藏
            return UserFav.objects.filter(user=self.request.user)
    

    4. 用户留言

    接口地址:

    # 获取所有留言:get
    http://127.0.0.1:8000/messages/
    
    # 添加留言:post 参数
    http://127.0.0.1:8000/messages/
    
    # 删除留言:delete
    http://127.0.0.1:8000/messages/messageId
    

    需求:

    • 获取当前登录用户所有留言:ListModelMixin
    • 新建留言:CreateModelMixin
    • 删除留言:DestroyModelMixin

    1、user_operation/serializers.py

    class UserLeavingMessageSerializer(serializers.ModelSerializer):
        """用户留言"""
        # 获取当前登录用户
        user = serializers.HiddenField(
            default=serializers.CurrentUserDefault()
        )
        # read_only:只返回,post时候可以不用提交,format:格式化输出
        add_time = serializers.DateTimeField(read_only=True, format="%Y-%m-%d %H:%M")
    
        class Meta:
            model = UserLeavingMessage
            fields = ('user', 'message_type', 'subject', 'message', 'file', 'id', 'add_time')
    

    2、user_operation/views.py

    class UserLeavingMessageViewSet(viewsets.GenericViewSet, mixins.CreateModelMixin, mixins.ListModelMixin,
                                    mixins.DestroyModelMixin):
        """
        用户留言:添加留言、删除留言、留言列表
        """
        serializer_class = UserLeavingMessageSerializer
        permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
        authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    
        def get_queryset(self):
            """用户只能看自己的留言"""
            return UserLeavingMessage.objects.filter(user=self.request.user)
    

    3、MxShop/urls.py

    router.register(r'messages', UserLeavingMessageViewSet, basename='message')  # 用户留言
    

    注意:这里没有处理文件相关,所以必须上传文件

    5. 用户收藏地址

    接口地址:

    # 获取所有地址:get
    http://127.0.0.1:8000/address/
    
    # 添加地址:post 参数
    http://127.0.0.1:8000/address/
    
    # 删除地址:delete
    http://127.0.0.1:8000/address/addressID
    
    # 修改地址:update
    http://127.0.0.1:8000/address/addressID
    

    需求:

    • 获取当前登录用户所有收件地址:ListModelMixin
    • 新建地址:CreateModelMixin
    • 删除地址:DestroyModelMixin
    • 更新地址:updateModelMixin

    1、user_operation/serializers.py

    class UserAddressSerializer(serializers.ModelSerializer):
        """用户地址"""
        # 获取当前用户
        user = serializers.HiddenField(
            default=serializers.CurrentUserDefault()
        )
        add_time = serializers.DateTimeField(read_only=True, format="%Y-%m-%d %H:%M")
    
        class Meta:
            model = UserAddress
            fields = ('user', 'province', 'city', 'district', 'address', 'signer_name', 'signer_mobile', 'add_time', 'id')
    

    2、user_operation/views.py

    class UserAddressViewSet(viewsets.GenericViewSet, mixins.CreateModelMixin, mixins.ListModelMixin,
                             mixins.DestroyModelMixin, mixins.UpdateModelMixin):
        """
        用户收件地址:新增地址(CreateModelMixin)、删除地址(DestroyModelMixin)
        、所有地址(ListModelMixin)、更新地址(UpdateModelMixin)
        """
        serializer_class = UserAddressSerializer
        authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
        permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    
        def get_queryset(self):
            """用户只能查看自己的收藏地址"""
            return UserAddress.objects.filter(user=self.request.user)
    

    3、MxShop/urls.py

    router.register(r'address', UserAddressViewSet, basename='address')  # 收藏地址
    

  • 相关阅读:
    .net Remoting学习笔记(一) 中庸
    培训是一种乐趣(2)
    ExtJS实战(10)项目总结
    ExtJS实战(4)struts
    ExtJS实战(7)登陆
    ExtJS实战(5)dwr
    让老师崩溃的回答-程序员的经典笑话
    ExtJS实战(9)疑难杂症分析
    ExtJS实战(6)extjs+json
    ExtJS实战(8)CRUD+分页+复杂查询+排序
  • 原文地址:https://www.cnblogs.com/midworld/p/13629727.html
Copyright © 2011-2022 走看看