一、 專案搭建
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": "日期"
}
業務邏輯
介面分析
路徑
- /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.把資料組織成前端需要的格式,使用序列化器
新增
- 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 協議》,轉載必須註明作者和本文連結