版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27695659/article/details/88559169
1.加入购物车,保存到redis:
a. 临时状态
b. 修改购物信息
结构:
redis->{
shopping_car:{
用户ID:{
业务1:{
title:'法务',
img:'/xx/xx/xx.png',
policy:{
10: {'name':'有效期1个月','price':123},
11: {'name':'有效期3个月','price':234},
13: {'name':'有效期6个月','price':2222},
},
default_policy:10
},
业务2:{
title:'法务中级',
img:'/xx/xx/xx.png',
policy:{
10: {'name':'有效期1个月','price':345},
11: {'name':'有效期3个月','price':1129},
13: {'name':'有效期6个月','price':35432},
},
default_policy:10
}
},
用户ID:{...},
}
}
POST请求:购物车中添加一条数据
请求体:
{
workid:1,
policy_id:10
}
后台:
检验当前课程是否有此价格策略,合法:将数据构造字典,再添加到redis
GET请求:查看自己购物车中的所有数据
获取当前登录用户ID,根据用户ID去redis的购物车中获取数据。
DELETE请求:删除购物车中的数据
请求体:
{
course_ids:[1,2]
}
PUT/PATCH请求:更新价格策略
请求体:
{
courseid:1,
policy_id:13
}
方案二:
{ #后面两个数字代表:第一个是用户id,第二个是课程id
shopping_car_6_11:{
'title':'法务',
'src':'xxx.png',
'policy':{
1:{id:'xx'.....},
2:{id:'xx'.....},
3:{id:'xx'.....},
4:{id:'xx'.....},
},
'default_policy':3
},
shopping_car_6_13:{
...
}
}
代码实现:
urls:
url(r'^shoppingcar/$', shoppingcar.ShoppingCarViewSet.as_view()),
shoppingcar.py中:
class ShoppingCarViewSet(APIView):
authentication_classes = [ApiAuth] #用户登录设置,可以注释
conn = get_redis_connection("default") # 类下面的全局下面加self
# post
def post(self, request, *args, **kwargs):
"""
将课程添加到购物车
:param request:
:param args:
:param kwargs:
:return:
"""
ret = BaseResponse()
try:
# 获取用户提交的课程和价格策略
course_id = int(request.data.get("courseid"))
policy_id = int(request.data.get("policyid"))
course = models.Course.objects.get(id=course_id)
# 获取该课程相关的所有价格策略
price_policy_list = course.price_policy.all()
price_policy_dict = {}
for item in price_policy_list:
price_policy_dict[item.id] = {
"period": item.valid_period,
"period_display": item.get_valid_period_display(),
"price": item.price,
}
# 4. 判断用户提交的价格策略是否合法
if policy_id not in price_policy_dict:
# 价格策略不合法
raise PricePolicyInvalid('价格策略不合法')
car_key = settings.SHOPPING_CAR_KEY %(request.auth.user_id,course_id)
car_dict = {
'title':course.name,
'img':course.course_img,
'default_policy':policy_id,
'policy':json.dumps(price_policy_dict)
}
self.conn.hmset(car_key,car_dict)
ret.data = '添加成功'
except PricePolicyInvalid as e:
ret.code = 2001
ret.error = e.msg
except ObjectDoesNotExist as e:
ret.code = 2001
ret.error = '课程不存在'
except Exception as e:
ret.code = 1001
ret.error = '获取购物车失败'
return Response(ret.dict)
# delete
def delete(self, request, *args, **kwargs):
"""
购物车中删除课程
:param request:
:param args:
:param kwargs:
:return:
"""
ret = BaseResponse()
try:
course_id_list = request.data.get('courseids')
key_list = [settings.SHOPPING_CAR_KEY % (request.auth.user_id, course_id,) for course_id in course_id_list]
print(key_list)
self.conn.delete(*key_list)
except Exception as e:
ret.code = 1002
ret.error = "删除失败"
return Response(ret.dict)
# put
def patch(self, request, *args, **kwargs):
"""
修改课程的价格策略
:param request:
:param args:
:param kwargs:
:return:
"""
ret = BaseResponse()
try:
# 1. 获取价格策略ID和课程ID
course_id = int(request.data.get('courseid'))
policy_id = str(request.data.get('policyid'))
# 2. 拼接课程的key
key = settings.SHOPPING_CAR_KEY % (request.auth.user_id, course_id,)
if not self.conn.exists(key):
ret.code = 1002
ret.error = "购物车中不存在此课程"
return Response(ret.dict)
# 3. redis中获取所有的价格策略
policy_dict = json.loads(str(self.conn.hget(key, 'policy'), encoding='utf-8'))
if policy_id not in policy_dict:
ret.code = 1003
ret.error = "价格策略不合法"
return Response(ret.dict)
# 4. 在购物车中修改该课程的默认价格策略
self.conn.hset(key, 'default_policy', policy_id)
ret.data = "修改成功"
except Exception as e:
ret.code = 1004
ret.error = "修改失败"
return Response(ret.dict)
# get
def get(self,request,*args,**kwargs):
"""
查看购物车中所有的商品
:param request:
:param args:
:param kwargs:
:return:
"""
ret = BaseResponse()
try:
key_match = settings.SHOPPING_CAR_KEY % (request.auth.user_id, "*")
course_list = []
for key in self.conn.scan_iter(key_match,count=10):
info = {
"title":self.conn.hget(key,'title').decode('utf-8'),
"img":self.conn.hget(key,'img').decode('utf-8'),
"policy":json.loads(self.conn.hget(key,'policy').decode('utf-8')),
"default_policy":self.conn.hget(key,'default_policy').decode('utf-8')
}
course_list.append(info)
ret.data = course_list
except Exception as e:
ret.code = 1002
ret.error = "获取购物车失败"
return Response(ret.dict)
2. 商品是否有个数?
- 价格策略(用事件来类比个数)
- 购买之后就开始计时
3. 购物车在redis的结构?
{ #后面两个数字代表:第一个是用户id,第二个是课程id
shopping_car_6_11:{
'title':'法务',
'src':'xxx.png',
'policy':{
1:{id:'xx'.....},
2:{id:'xx'.....},
3:{id:'xx'.....},
4:{id:'xx'.....},
},
'default_policy':3
},
shopping_car_6_13:{
...
}
}
4. 购物车购买数量有限制吗?
.keys('xxxxx')
5. 购物车是否设置超时时间?
.conn.expire("shopping_car_1_1" ,60*30)
方案:购买课程个数限制(200个)