电商后台 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": "日期"
}
业务逻辑
接口分析
路径
- /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 协议》,转载必须注明作者和本文链接