在购物车页面修改购物车使用局部刷新的效果。
全选购物车接口设计和定义

后端接口定义
class CartsSelectAllView(View):
"""全选购物车"""
def put(self, request):
# 接收和校验参数
# 判断用户是否登录
user = request.user
if user.is_authenticated:
# 用户已登录,操作redis购物车
pass
else:
# 用户未登录,操作cookie购物车
pass
全选购物车后端逻辑实现
接收和校验参数
class CartsSelectAllView(View):
"""全选购物车"""
def put(self, request):
# 接收参数
json_dict = json.loads(request.body.decode())
selected = json_dict.get('selected', True)
# 校验参数
if selected:
if not isinstance(selected, bool):
return http.HttpResponseForbidden('参数selected有误')
# 判断用户是否登录
user = request.user
if user is not None and user.is_authenticated:
# 用户已登录,操作redis购物车
pass
else:
# 用户已登录,操作cookie购物车
pass
全选Redis购物车
class CartsSelectAllView(View):
"""全选购物车"""
def put(self, request):
# 接收和校验参数
......
# 判断用户是否登录
user = request.user
if user is not None and user.is_authenticated:
# 用户已登录,操作redis购物车
redis_conn = get_redis_connection('carts')
cart = redis_conn.hgetall('carts_%s' % user.id)
sku_id_list = cart.keys()
if selected:
# 全选
redis_conn.sadd('selected_%s' % user.id, *sku_id_list)
else:
# 取消全选
redis_conn.srem('selected_%s' % user.id, *sku_id_list)
return http.JsonResponse({'code': RETCODE.OK, 'errmsg': '全选购物车成功'})
else:
# 用户已登录,操作cookie购物车
pass
全选cookie购物车
class CartsSelectAllView(View):
"""全选购物车"""
def put(self, request):
# 接收和校验参数
......
# 判断用户是否登录
user = request.user
if user is not None and user.is_authenticated:
# 用户已登录,操作redis购物车
......
else:
# 用户已登录,操作cookie购物车
cart = request.COOKIES.get('carts')
response = http.JsonResponse({'code': RETCODE.OK, 'errmsg': '全选购物车成功'})
if cart is not None:
cart = pickle.loads(base64.b64decode(cart.encode()))
for sku_id in cart:
cart[sku_id]['selected'] = selected
cookie_cart = base64.b64encode(pickle.dumps(cart)).decode()
response.set_cookie('carts', cookie_cart, max_age=constants.CARTS_COOKIE_EXPIRES)
return response
全选购物车:
carts/ views.py
class CartsSelectAllView(View):
"""购物车全选"""
def put(self, request):
# 接收参数
json_dict = json.loads(request.body.decode())
selected = json_dict.get('selected')
# 校验参数
if selected:
if not isinstance(selected, bool):
return http.HttpResponseForbidden('参数selected有误')
user = request.user
if user.is_authenticated:
redis_conn = get_redis_connection('carts')
# 思路:点击了selected 全选就把所有的sku_id添加到set中,反之全部删除
# 获取购物车所有的sku_id记录 {b'3': b'1',b'5': b'2'}
redis_cart = redis_conn.hgetall('cart_%s' % user.id)
redis_sku_ids = redis_cart.keys()
if selected:
for redis_sku_id in redis_sku_ids:
redis_conn.sadd('selected_%s' % user.id, redis_sku_id)
else:
for redis_sku_id in redis_sku_ids:
redis_conn.srem('selected_%s' % user.id, redis_sku_id)
return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK'})
else:
# 用户未登录
cart_str = request.COOKIES.get('carts')
response = http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'ok'})
if cart_str and cart_str != 'gAN9cQAu':
# 转成bytes类型字符串
cart_str_bytes = cart_str.encode()
# 转成bytes类型的字典
cart_dict_bytes = base64.b64decode(cart_str_bytes)
# 转成真正的字典
cart_dict = pickle.loads(cart_dict_bytes)
# cart_dict = {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
# 思路:根据上面验证selected的状态来修改cart_dict里的数据,如果传的是True,全都是True,反之为False 这又是一个循环操作
for sku_id in cart_dict:
cart_dict[sku_id]['selected'] = selected
cart_dict_bytes = pickle.dumps(cart_dict)
cart_str_bytes = base64.b64encode(cart_dict_bytes)
cookie_cart_str = cart_str_bytes.decode()
# 将新的购物车记录写入到购物车
response.set_cookie('carts', cookie_cart_str)
return response
urls.py
# @Time:2021/3/30 19:51
# @Author:Ellen
# @File:urls.py
from django.urls import path, re_path
from . import views
app_name = 'carts'
urlpatterns = [
# 购物车
path('carts/', views.CartsView.as_view(), name='info'),
# 购物车全选
path('carts/selection/', views.CartsSelectAllView.as_view())
]
版权声明:本文为weixin_45905671原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。