后台首页
-
因为meiduo_admin后台项目只是一个子应用,创建views包和serializers包来存放视图类和序列化器类
-
views包内创建home主页py文件写主页的视图类
用户日活跃数量
-
分析前端请求:
-
代码
# /statistical/day_active/ 继承一级视图 class UserDailyActiveCountView(APIView): # 设置权限只可以管理员访问 防止爬虫 permission_classes = [IsAdminUser] def get(self, request): """ 日活人数数量统计 :param request: :return: """ # 获取当前时间 today = date.today() # 如果用户最后登录的时间大于今天的0:00就说明今日登录了 计算今日所有登录过的用户的数量 count = User.objects.filter(last_login__gte=today).count() # 返回数据 return Response({'count': count})
-
测试
今日所有用户下单量
-
分析前端请求:
-
代码:
class UserDailyOrderCountView(APIView): permission_classes = [IsAdminUser] def get(self, request): """ 返回今日创建的订单数量 :param request: :return: """ # 获取今日时间 today = date.today() # 查询订单表 把所有创建时间大于今日0:00的订单数量查询出来 count = OrderInfo.objects.filter(create_time__gte=today).count() # 返回数据 return Response({'count': count})
-
测试:
今日新增用户数量
一个道理
class UserDailyIncrementCountView(APIView):
permission_classes = [IsAdminUser]
def get(self, request):
"""
今日新增用户数量
:param request:
:return:
"""
# 获取今日时间
today = date.today()
# 查询date_joined字段大于等于今日0:00所有用户数量
count = User.objects.filter(date_joined__gte=today).count()
return Response({'count': count})
一个月内每天的新增用户
-
分析前端需要返沪的数据:
-
代码:
class UserDailyMonthIncrementCountView(APIView): permission_classes = [IsAdminUser] def get(self, request): """ 本月新增用户数量 :param request: :return: """ # 定义三十天前的时间 今日时间减去30天 start_date = date.today() - timedelta(days=31) # 组织前端需要的列表数据 aList_all = [] # 循环31次 for i in range(32): # 当前时间为三十天前加上i天 current_date = start_date + timedelta(days=i) # 当前时间的下一天 next_date = start_date + timedelta(days=i + 1) # 每一次查询出大于等于今天时间创建的用户和小于明天时间创建的用户 count = User.objects.filter(date_joined__gte=current_date, date_joined__lt=next_date).count() # 组织数据 数量和日期 aList_all.append({ 'count': count, 'date': current_date }) # 返回数据 return Response(aList_all)
用户管理页显示所有用户
-
分析前端需要返回的数据:
-
用户相关,创建user.py文件存放用户相关的视图类
-
创建用户序列化器:
只设置需要的字段
from rest_framework.serializers import ModelSerializer from apps.users.models import User class UserModelSerializer(ModelSerializer): class Meta: # 指定模型类 model = User # 指定需要生成的字段 fields = ['id', 'username', 'mobile', 'email']
-
创建分页器,因为前端需要的数据需要自定义:
# 继承PageNumberPagination分页类
class PageNum(PageNumberPagination):
# 重写一页返回多少数据
page_size = 2
# 重写前端传来的pagesize变量名
page_size_query_param = 'pagesize'
# 一页最多返回多少数据
max_page_size = 20
# 重写get_paginated_response方法来自定义返回数据,自动返回的数据不是我们前端想要的
# data为数据
def get_paginated_response(self, data):
# 返回前端需要的数据
return Response(OrderedDict([
('pages', self.page.paginator.count),
('page', self.page.number),
('lists', data)
]))
-
视图类代码:
class UserListView(ListAPIView): # 只允许管理员用户访问 permission_classes = [IsAdminUser] # queryset查询集 返回所有用户 queryset = User.objects.all() # 指定序列化器 serializer_class = UserModelSerializer # 指定分页器 pagination_class = PageNum
-
测试: