内容回顾
1.路飞学成的购物车如何实现?
前面文章
2.商品是否有个数?
-价格策略【用周期时间来类比个数,7天,15天,一个月】
-购买多个无意义,因为都是从同一天开始往后累加。
3.购物车在redis中的结构。
shopping_car_[user_id]_[commodity_id]为键,然后商品详细为值。

{ "code": 1000, "data": [ { "title": "语文阅读", "img": "25852585.jpg", "policy": { "1": { "period": 3, "period_display": "3天", "price": 111 }, "4": { "period": 30, "period_display": "1个月", "price": 399 } }, "default_policy": "4" }, { "title": "数学算数", "img": "451646", "policy": { "2": { "period": 3, "period_display": "3天", "price": 222 } }, "default_policy": "2" } ], "error": null }
4.购物车购买数量有限制吗
可以对购买个数进行限制,通过计算长度,看买了多少
print(len(conn.keys("luffy_shopping_car_1_1")))
5.购物车是否设置超时时间?
conn.expire("luffy_shopping_car_1_1",60*30) #30min后过期也可以
使用方案:对购买课程个数进行限制
6.为什么把购物车信息放到redis中。
1.操作频繁,对数据库压力大,可以使用redis
2.操作速度快
3.购物车只是一个临时状态,而不是永久保存的
临时补充:
Django Rest Framework 接口书写规范
原则:
- 简单逻辑先处理
- try
- 细粒度异常+自定义异常
-内置
-框架
自定义
- 注释
- 文件注释【README.md】
- 类注释
- 函数注释
- 文件名,类,函数,project
- 对内容功能进行分类【views文件夹下可以创建多个views,每个views的功能是类似的】
- 减少代码层级 不用一直if-else,直接return即可。
- BaseResponse
开始真正的支付结算
1.首先还是在URL中添加一条路径
url(r'payment/$',payment.PaymentViewSet.as_view())
2.创建payment.py文件【未完】
# Author:Jesi # Time : 2018/11/22 15:33 from rest_framework.views import APIView from ..auth.auth import LuffyAuth from rest_framework.response import Response from django.conf import settings from django_redis import get_redis_connection import json from utils.response import BaseResponse from api import models import datetime class PaymentViewSet(APIView): authentication_classes = [LuffyAuth,] #首先肯定还是进行认证 conn=get_redis_connection("default") #链接到redis def post(self,request,*args,**kwargs): ret=BaseResponse() try: payment_dict={} # 1.1获取用户要结算课程ID course_id_list=request.data.get("courseids") for course_id in course_id_list: payment_course_dict={} car_key=settings.SHOPPING_CAR_KEY%(request.auth.user_id,course_id) #1.2监测用户要结算的课程是否已加入到购物车 if not self.conn.exists(car_key): ret.code=1001 ret.error="课程需要先加入购物车才能结算" # 1.3根据key去购物车中获取信息,放入到结算中心。 policy=json.loads(self.conn.hget(car_key,'policy').decode('utf-8')) default_policy=self.conn.hget(car_key,'default_policy').decode('utf-8') policy_info=policy[default_policy] payment_course_dict={ "title" :self.conn.hget(car_key,'title').decode('utf-8'), "img":self.conn.hget(car_key,'img').decode('utf-8'), "policy_id":str(course_id), "coupon":{}, "default_coupon":0 } payment_course_dict.update(policy_info) payment_dict[str(course_id)]=payment_course_dict ret.data=payment_dict
#从这儿开始往下是优惠券的逻辑,还没写完【半成品】
#主要展示的是拿到购物车商品展示的逻辑
# 2.获取优惠券 ctime=datetime.date.today() from django.db.models import Q #a.通过表达式进行构造 Q(Q(account=request.auth.user)&Q(status=0))|Q(coupon__valid_begin_date__lte=ctime) #b.通过方法进行构造 q=Q() q1=Q() q1.connector="AND" q1.children.append(('account',request.auth.user)) q1.children.append(('status',0)) q1.children.append(('coupon__valid_begin_date__lte',ctime)) q2=Q() q2.connector = "AND" q2.children.append(('coupon__valid_end_date__lte',ctime)) q.add(q1,'OR') q.add(q2,'OR') coupon_list=models.CouponRecord.objects.filter( account=request.auth.user, status=0, coupon__valid_begin_date__lte=ctime, coupon__valid_end_date__gte=ctime, ) for coupon in coupon_list: print(coupon) #到此处结束购物车【半成品】
except Exception as e: pass return Response(ret.dict)
既然要结算,那么我们需要把拿到购物车中的物品,以课程号为键,以课程详细信息为值进行结构的构造,最后获取到后,才可以进行优惠券的获取然后对价格进行减免。
我们传入的值是一个课程ID,可为列表因为可能会出现购买多个课程
{"courseids":[1,2]}