电商后台 2020.01.25~2020.01.31

电商商城后台

一、 项目搭建

1.1准备好前端页面

1.2后台准备环境

  • 1.安装django-resetful框架
  • 2.安装django-cors-headers实现跨区
  • 3.安装djangorestframework-jwt 实现状态保持

1.3.建立项目

  • 建立子应用后台,并注册

二、用户登陆

2.1接口分析

  • 接口路径

    • meiduo_admin/authorizations/
  • 请求方法

    • post
  • 请求参数

    • username,userpassword

      • json格式
  • 返回参数

    • username,userpasword token

      • json

2.2业务逻辑

  • 1.使用Django模块自带验证方法,需要改下成可以验证用户名和手机

  • 2.视图可以直接使用Django REST framework JWT 提供的方法obtain_jwt_token

  • 3.需要改写视图返回值

    • 1.修改返回值

      def jwt_response_payload_handler(token, user=None, request=None):
          """
          自定义jwt认证成功返回数据
          """
          return {
              'token': token,
              'id': user.id,
              'username': user.username
          }
    • 2.在配置中配置新的返回值方法

      JWT配置

      JWT_AUTH = {
          'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
          'JWT_RESPONSE_PAYLOAD_HANDLER': 'meiduo_admin.utils.jwt_response.jwt_response_payload_handler',
      }

      三、数据统计

3.1用户总数

  • 接口分析

    • 路径

      • /meiduo_admin/statistical/total_count/
    • 方法

      • GET
    • 参数

      • 通过请求头传递jwt token数据
    • 返回值json

      {

          "count": "总用户量",
          "date": "日期"

      }

  • 业务逻辑

    • 1.获取当前日期 datetime

    • 2.获取用户总数

    • 3.返回数据

    • 4.视图继承APIview

    • 5.后端实现

      class UserTotalCountView(APIView):
          # 指定管理员权限
          permission_classes = [IsAdminUser]
      
          def get(self,request):
              # 获取当前日期
              now_date=date.today()
              # 获取所有用户总数
              count= User.objects.all().count()
              return Response({
                  'count':count,
                  'date':now_date
              })

      3.2日增用户总数

  • 接口分析

    • 路径

      • /meiduo_admin/statistical/day_increment/
    • 方法

      • get
    • 参数

      • 通过请求头传递jwt token数据
    • 返回值

      {

          "count": "新增用户量",
          "date": "日期"

      }

  • 业务逻辑

    • 1.获取当前日期 datetime

    • 2.获取日增用户总数

    • 3.返回数据

    • 4.视图继承APIview

    • 5.后台实现

      class UserDayCountView(APIView):
           # 指定管理员权限
          permission_classes = [IsAdminUser]
      
          def get(self,request):
              # 获取当前日期
              now_date=date.today()
              # 获取当日注册用户数量 date_joined 记录创建账户时间
              count=User.objects.filter(date_joined__gte=now_date).count()
              return Response({
                  "count":count,
                  "date" : now_date
              })

      3.3日活跃用户总数

  • 接口分析

    • 路径

      • /meiduo_admin/statistical/day_active/
    • 方法

      • get
    • 参数

      • 通过请求头传递jwt token数据
    • 返回值

      {

          "count": "活跃用户量",
          "date": "日期"

      }

  • 业务逻辑

    • 1.获取当前日期 datetime

    • 2.获取日活跃用户总数

    • 3.返回数据

    • 4.视图继承APIview

    • 5.后台实现

      class UserActiveCountView(APIView):
           # 指定管理员权限
          permission_classes = [IsAdminUser]
      
          def get(self,request):
              # 获取当前日期
              now_date=date.today()
              # 获取当日登录用户数量  last_login记录最后登录时间
              count=User.objects.filter(last_login__gte=now_date).count()
              return Response({
                  "count":count,
                  "date" : now_date
              })

      3.4日下单总数

  • 接口分析

    • 路径

      • /meiduo_admin/statistical/day_orders/
    • 方法

      • get
    • 参数

      • token
    • 返回值

      {

          "count": "下单用户量",
          "date": "日期"

      }

  • 业务逻辑

    • 1.获取当前日期 datetime

    • 2.获取日下单用户总数

    • 3.返回数据

    • 4.视图继承APIview

    • 5.后台实现

      class UserOrderCountView(APIView):
           # 指定管理员权限
          permission_classes = [IsAdminUser]
      
          def get(self,request):
              # 获取当前日期
              now_date=date.today()
              # 获取当日下单用户数量  orders__create_time 订单创建时间
              count=User.objects.filter(orders__create_time__gte=now_date).count()
              return Response({
                  "count":count,
                  "date" : now_date
              })

      3.5月增用户统计

  • 接口分析

    • 路径

      • /meiduo_admin/statistical/month_increment/
    • 方法

      • get
    • 参数

      • token
    • 返回值

      [

          {
              "count": "用户量",
              "date": "日期"
          },
          {
              "count": "用户量",
              "date": "日期"
          },
          ...
      ]
  • 业务逻辑

    • 1.获取当前日期 datetime

    • 2.获取一个月之前日期 datetime

    • 2.获取每天日增用户的总数

    • 3.返回数据

    • 4.视图继承APIview

    • 5.后台实现

      class UserMonthCountView(APIView):
          # 指定管理员权限
          permission_classes = [IsAdminUser]
      
          def get(self, request):
              # 获取当前日期
              now_date = date.today()
              # 获取一个月前日期
              start_date = now_date - timedelta(29)
              # 创建空列表保存每天的用户量
              date_list = []
      
              for i in range(30):
                  # 循环遍历获取当天日期
                  index_date = start_date + timedelta(days=i)
                  # 指定下一天日期
                  cur_date = start_date + timedelta(days=i + 1)
                  # 查询条件是大于当前日期index_date,小于明天日期的用户cur_date,得到当天用户量
                  count = User.objects.filter(date_joined__gte=index_date, date_joined__lt=cur_date).count()
      
                  date_list.append({
                      'count': count,
                      'date': index_date
                  })
      
                  return Response(date_list)

      3.6商品分类访问日访问统计

  • 接口分析

    • 路径

      • /meiduo_admin/statistical/goods_day_views/
    • 方法

      • get
    • 参数

      • token
    • 返回值

      [

          {
              "category": "分类名称",
              "count": "访问量"
          },
          {
              "category": "分类名称",
              "count": "访问量"
          },
          ...
      ]
  • 业务逻辑

    • 1.获取当前日期 datetime

    • 2.构造使用商品访问统计表建立序列化器

      class GoodsSerializer(serializers.ModelSerializer):

      # 指定返回分类名称
      category=serializers.StringRelatedField(read_only=True)
      class Meta:
          model=GoodsVisitCount
          fields=('count','category')
    • 3.序列化数据

    • 3.返回数据

    • 4.视图继承APIview

    • 5.后台实现

      class GoodsDayView(APIView):
      
          def get(self,request):
              # 获取当天日期
              now_date=date.today()
              # 获取当天访问的商品分类数量信息
              data=GoodsVisitCount.objects.filter(date=now_date)
              # 序列化返回分类数量
              ser=GoodsSerializer(data,many=True)
      
              return Response(ser.data)

      四、用户管理

4.1获取查询用户

  • 接口分析

    • 路径

      • /meiduo_admin/users/?keyword=<搜索内容>&page=<页码>&pagesize=<页容量>
    • 方法

      • get
    • 参数

      • token
    • 返回值

      {
              "counts": "用户总量",
              "lists": [
                  {
                      "id": "用户id",
                      "username": "用户名",
                      "mobile": "手机号",
                      "email": "邮箱"
                  },
                  ...
              ],
              "page": "页码",
              "pages": "总页数",
              "pagesize": "页容量"
            }
  • 业务逻辑

    • 1.获取关键词获取所有用户数据

      # 重写get_queryset方法,根据前端是否传递keyword值返回不同查询结果
      
          def get_queryset(self):
              # 获取前端传递的keyword值
              keyword = self.request.query_params.get('keyword')
              # 如果keyword是空字符,则说明要获取所有用户数据
              if keyword is '' or keyword is None:
                  return User.objects.all()
              else:
                  return User.objects.filter(username=keyword)
    • 2.进行分页处理

      class UserPageNum(PageNumberPagination):
      
          page_size = 5  # 后端指定每页显示数量
          page_size_query_param = 'pagesize'
          max_page_size = 10
      
          # 重写分页返回方法,按照指定的字段进行分页数据返回
          def get_paginated_response(self, data):
      
              return Response({
                  'count': self.page.paginator.count, # 总数量
                  'lists': data,  # 用户数据
                  'page' : self.page.number, # 当前页数
                  'pages' : self.page.paginator.num_pages, # 总页数
                  'pagesize':self.page_size  # 后端指定的页容量
      
              })
    • 3.建立序列化器

      class UserSerializer(serializers.ModelSerializer):
      
          class Meta:
              model=User
              fields=('id','username','mobile','email')
    • 4.返回数据

    • 5.后台实现

      class UserView(ListAPIView):
          # 指定使用的序列化器
          serializer_class = UserSerializer
          # 指定分页器
          pagination_class = PageNum
      
          # 重写get_queryset方法,根据前端是否传递keyword值返回不同查询结果
          def get_queryset(self):
              # 获取前端传递的keyword值
              keyword = self.request.query_params.get('keyword')
              # 如果keyword是空字符,则说明要获取所有用户数据
              if keyword is '' or keyword is None:
                  return User.objects.all()
              else:
                  return User.objects.filter(username=keyword)

      4.2新增用户

  • 接口分析

    • 路径

      • /meiduo_admin/users/
    • 方法

      • post
    • 参数

      {
      
              "username": "用户名",
              "mobile": "手机号",#可选
              "email": "邮箱"# 可选
              "password":"密码"
          }
      • token
    • 返回值

      {
              "counts": "用户总量",
              "lists": [
                  {
                      "id": "用户id",
                      "username": "用户名",
                      "mobile": "手机号",
                      "email": "邮箱"
                  },
                  ...
              ],
              "page": "页码",
              "pages": "总页数",
              "pagesize": "页容量"
            }
  • 业务逻辑

    • 1.建立序列化器

      class UserAddSerializer(serializers.ModelSerializer):
          class Meta:
              model = User
              fields = ('id', 'username', 'mobile', 'email', 'password')
              # username字段增加长度限制,password字段只参与保存,不在返回给前端,增加write_only选项参数
              extra_kwargs = {
                  'username': {
                      'max_length': 20,
                      'min_length': 5
                  },
                  'password': {
                      'max_length': 20,
                      'min_length': 8,
                      'write_only': True
      
                  },
              }
          # 重写create方法
          def create(self, validated_data):
              # 保存用户数据并对密码加密
              user = User.objects.create_user(**validated_data)
              return user
    • 2.重写create方法

    • 3.重写获得序列化器方法

    • 3.后台实现

      class UserView(ListCreateAPIView):
          pagination_class = PageNum
          # 根据不同的请求方式返回不同序列化器
          def get_serializer_class(self):
              # 请求方式是GET,则是获取用户数据返回UserSerializer
              if self.request.method == 'GET':
                  return UserSerializer
              else:
                  # POST请求,完成保存用户,返回UserAddSerializer
                  return UserAddSerializer
      
          def get_queryset(self):
              keyword = self.request.query_params.get('keyword')
              if keyword is '':
                  return User.objects.all()
              else:
                  return User.objects.filter(username=keyword)

      五、商品管理

5.1规格表管理

  • 获取

    • 1.把数据组织成前端需要的格式,使用序列化器
      {
              "counts": "SPU商品规格总数量",
              "lists": [
                  {
                      "id": "规格id",
                      "name": "规格名称",
                      "spu": "SPU商品名称",
                      "spu_id": "SPU商品id"
                  },
                  ...
                ],
                "page": "页码",
                "pages": "总页数",
                "pagesize": "页容量"
            }
  • 新增

    • 1.需要获取spu商品简单信息,ID和name
    • 2.视图集中多增加一个simple方法
    • 3.路由指定一个新路径,对应simple方法
  • 修改

    • 使用ModelViewSet实现
  • 删除

    • 使用ModelViewSet实现

5.2商品图片管理

  • 获取

    • 1.把数据组织成前端需要的格式,使用嵌套序列化器
  • 新增

    • 1.需要获取sku商品简单信息,ID和name
    • 2.视图集中多增加一个simple方法
    • 3.路由指定一个新路径,对应simple方法
    • 4.重写序列化器create方法,把图片保存到数据储存系统FDFs
    • 5.异步更新静态页面
  • 修改

    • 1.重写序列化器update方法,把图片保存到数据储存系统FDFs
    • 2.异步更新静态页面
  • 删除

    • 使用ModelViewSet实现

5.3sku管理

  • 获取

    • 1.把数据组织成前端需要的格式,使用嵌套序列化器,重写get_queryset方法,判断是否传递keyword查询参数
  • 新增

    • 1.获取三级分类信息,指定新路由
    • 2.获取spu表名称数据,指定新路由
    • 3.获取SPU商品规格信息,指定新路由
    • 4.重写序列化器create方法,设计两张表操作,使用原子事务操作,保证数据无误
    • 5.异步更新静态页面
  • 修改

    • 1.重写序列化器update方法,设计两张表操作,使用原子事务操作,保证数据无误
    • 2.异步更新静态页面
  • 删除

    • 使用ModelViewSet实现

5.4其他表略,逻辑都不差多

六、订单管理

6.1获取

  • 1.重写get_queryset方法,判断是否传递keyword查询参数
  • 2.重写get_serializer_class,判断获取单个还是多个数据,使用不同序列化器,把数据组织成前端需要的格式,使用嵌套序列化器

6.2修改

  • 1.订单只能修改状态
  • 2.建立一个新路由来专门处理

七、系统管理

7.1权限管理

  • 获取

    • 1.使用Django内置模型类来生成序列化器,并返回前端数据
  • 新增

    • 1.获取权限类型列表数据,新键路由处理
  • 修改

    • 使用ModelViewSet实现
  • 删除

    • 使用ModelViewSet实现

7.2用户组管理

  • 获取

    • 1.使用Django内置模型类来生成序列化器,并返回前端数据
  • 新增

    • 1.获取权限表数据,新键路由处理
  • 修改

    • 使用ModelViewSet实现
  • 删除

    • 使用ModelViewSet实现

7.3管理员管理

  • 获取

    • 1.user模型类来生成序列化器(密码设置只写),并返回前端数据
  • 新增

    • 1、获取分组表数据,新键路由处理
    • 2.改写序列化器create方法,并编码密码格式储存
  • 修改

    • 1.改写序列化器update方法,并编码密码格式储存
  • 删除

    • 使用ModelViewSet实现
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!