展示购物车

1. 展示购物车接口设计和定义
1.请求方式
| 选项 | 方案 |
|---|---|
| 请求方法 | GET |
| 请求地址 | /carts/ |
2.请求参数:
无
3.响应结果:JSON
{
"code": 0,
"errmsg": "OK",
"cart_skus": [
{
"id": 1,
"name": "Apple MacBook Pro 13.3英寸笔记本 银色",
"count": 1,
"selected": "True",
"default_image_url": "http://192.168.19.128:8888/group1/M00/00/02/CtM3BVrPB4GAWkTlAAGuN6wB9fU4220429",
"price": "11388.00",
"amount": "11388.00"
}
]
}
4.后端接口定义
class CartsView(View):
"""购物车管理"""
def get(self, request):
"""展示购物车"""
user = request.user
if user.is_authenticated:
# 用户已登录,查询redis购物车
pass
else:
# 用户未登录,查询cookies购物车
pass
2. 展示购物车后端逻辑实现
1.查询Redis购物车
class CartsView(View):
"""购物车管理"""
def get(self, request):
"""展示购物车"""
user = request.user
if user.is_authenticated:
# 用户已登录,查询redis购物车
redis_conn = get_redis_connection('carts')
# 获取redis中的购物车数据
redis_cart = redis_conn.hgetall('carts_%s' % user.id)
# 获取redis中的选中状态
cart_selected = redis_conn.smembers('selected_%s' % user.id)
# 将redis中的数据构造成跟cookie中的格式一致,方便统一查询
cart_dict = {}
for sku_id, count in redis_cart.items():
cart_dict[int(sku_id)] = {
'count': int(count),
'selected': sku_id in cart_selected
}
else:
# 用户未登录,查询cookies购物车
pass
2.查询cookie购物车
class CartsView(View):
"""购物车管理"""
def get(self, request):
"""展示购物车"""
user = request.user
if user.is_authenticated:
# 用户已登录,查询redis购物车
......
else:
# 用户未登录,查询cookies购物车
cart_str = request.COOKIES.get('carts')
if cart_str:
# 将cart_str转成bytes,再将bytes转成base64的bytes,最后将bytes转字典
cart_dict = pickle.loads(base64.b64decode(cart_str.encode()))
else:
cart_dict = {}
3.查询购物车SKU信息
class CartsView(View):
"""购物车管理"""
def get(self, request):
"""展示购物车"""
user = request.user
if user.is_authenticated:
# 用户已登录,查询redis购物车
......
else:
# 用户未登录,查询cookies购物车
......
# 构造购物车渲染数据
sku_ids = cart_dict.keys()
skus = SKU.objects.filter(id__in=sku_ids)
cart_skus = []
for sku in skus:
cart_skus.append({
'id':sku.id,
'name':sku.name,
'count': cart_dict.get(sku.id).get('count'),
'selected': str(cart_dict.get(sku.id).get('selected')), # 将True,转'True',方便json解析
'default_image_url':sku.default_image.url,
'price':str(sku.price), # 从Decimal('10.2')中取出'10.2',方便json解析
'amount':str(sku.price * cart_dict.get(sku.id).get('count')),
})
return JsonResponse({'code': 0, 'errmsg': 'OK', 'cart_skus': cart_skus})