電商後臺 2020.01.25~2020.01.31

tomcatdog發表於2021-02-03

一、 專案搭建

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_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 協議》,轉載必須註明作者和本文連結

相關文章