2.3 修改购物车

提示:在购物车页面修改购物车使用局部刷新的效果。

2.3.1. 修改购物车接口设计和定义

1.请求方式

选项 方案
请求方法 PUT
请求地址 /carts/

2.请求参数:JSON

参数名 类型 是否必传 说明
sku_id int 商品SKU编号
count int 商品数量
selected bool 是否勾选

3.响应结果:JSON

字段 说明
sku_id 商品SKU编号
count 商品数量
selected 是否勾选

4.后端接口定义

class CartsView(View):"""购物车管理"""def put(self, request):"""修改购物车"""# 接收和校验参数# 判断用户是否登录user = request.userif user.is_authenticated:# 用户已登录,修改redis购物车passelse:# 用户未登录,修改cookie购物车pass

2.3.2. 修改购物车后端逻辑实现

1.接收和校验参数

class CartsView(View):"""购物车管理"""def put(self, request):"""修改购物车"""# 接收参数json_dict = json.loads(request.body.decode())sku_id = json_dict.get('sku_id')count = json_dict.get('count')selected = json_dict.get('selected', True)# 判断参数是否齐全if not all([sku_id, count]):return http.HttpResponseForbidden('缺少必传参数')# 判断sku_id是否存在try:sku = models.SKU.objects.get(id=sku_id)except models.SKU.DoesNotExist:return http.HttpResponseForbidden('商品sku_id不存在')# 判断count是否为数字try:count = int(count)except Exception:return http.HttpResponseForbidden('参数count有误')# 判断selected是否为bool值if selected:if not isinstance(selected, bool):return http.HttpResponseForbidden('参数selected有误')# 判断用户是否登录user = request.userif user.is_authenticated:# 用户已登录,修改redis购物车passelse:# 用户未登录,修改cookie购物车pass

2.修改Redis购物车

class CartsView(View):"""购物车管理"""def put(self, request):"""修改购物车"""# 接收和校验参数......# 判断用户是否登录user = request.userif user.is_authenticated:# 用户已登录,修改redis购物车redis_conn = get_redis_connection('carts')pl = redis_conn.pipeline()# 因为接口设计为幂等的,直接覆盖pl.hset('carts_%s' % user.id, sku_id, count)# 是否选中if selected:pl.sadd('selected_%s' % user.id, sku_id)else:pl.srem('selected_%s' % user.id, sku_id)pl.execute()# 创建响应对象cart_sku = {'id':sku_id,'count':count,'selected':selected,'name': sku.name,'default_image_url': sku.default_image.url,'price': sku.price,'amount': sku.price * count,}return http.JsonResponse({'code':RETCODE.OK, 'errmsg':'修改购物车成功', 'cart_sku':cart_sku})else:# 用户未登录,修改cookie购物车pass

3.修改cookie购物车

class CartsView(View):"""购物车管理"""def put(self, request):"""修改购物车"""# 接收和校验参数......# 判断用户是否登录user = request.userif user.is_authenticated:# 用户已登录,修改redis购物车......else:# 用户未登录,修改cookie购物车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 = {}# 因为接口设计为幂等的,直接覆盖cart_dict[sku_id] = {'count': count,'selected': selected}# 将字典转成bytes,再将bytes转成base64的bytes,最后将bytes转字符串cookie_cart_str = base64.b64encode(pickle.dumps(cart_dict)).decode()# 创建响应对象cart_sku = {'id': sku_id,'count': count,'selected': selected,'name': sku.name,'default_image_url': sku.default_image.url,'price': sku.price,'amount': sku.price * count,}response = http.JsonResponse({'code':RETCODE.OK, 'errmsg':'修改购物车成功', 'cart_sku':cart_sku})# 响应结果并将购物车数据写入到cookieresponse.set_cookie('carts', cookie_cart_str, max_age=constants.CARTS_COOKIE_EXPIRES)return response

2.4 删除购物车

提示:在购物车页面删除购物车使用局部刷新的效果。

2.4.1. 删除购物车接口设计和定义

1.请求方式

选项 方案
请求方法 DELETE
请求地址 /carts/

2.请求参数:JSON

参数名 类型 是否必传 说明
sku_id int 商品SKU编号

3.响应结果:JSON

字段 说明
code 状态码
errmsg 错误信息

4.后端接口定义

class CartsView(View):"""购物车管理"""def delete(self, request):"""删除购物车"""# 接收和校验参数# 判断用户是否登录user = request.userif user.is_authenticated:# 用户已登录,删除redis购物车passelse:# 用户未登录,删除cookie购物车pass

2.4.2. 删除购物车后端逻辑实现

1.接收和校验参数

class CartsView(View):"""购物车管理"""def delete(self, request):"""删除购物车"""# 接收参数json_dict = json.loads(request.body.decode())sku_id = json_dict.get('sku_id')# 判断sku_id是否存在try:models.SKU.objects.get(id=sku_id)except models.SKU.DoesNotExist:return http.HttpResponseForbidden('商品不存在')# 判断用户是否登录user = request.userif user is not None and user.is_authenticated:# 用户已经登录,删除redis购物车passelse:# 用户未登录,删除cookie购物车pass

2.删除Redis购物车

class CartsView(View):"""购物车管理"""def delete(self, request):"""删除购物车"""# 接收和校验参数......# 判断用户是否登录user = request.userif user is not None and user.is_authenticated:# 用户登录,删除redis购物车redis_conn = get_redis_connection('carts')pl = redis_conn.pipeline()# 删除键,就等价于删除了整条记录pl.hdel('carts_%s' % user.id, sku_id)pl.srem('selected_%s' % user.id, sku_id)pl.execute()# 删除结束后,没有响应的数据,只需要响应状态码即可return http.JsonResponse({'code': RETCODE.OK, 'errmsg': '删除购物车成功'})else:# 用户未登录,删除cookie购物车pass

3.删除cookie购物车

class CartsView(View):"""购物车管理"""def delete(self, request):"""删除购物车"""# 接收和校验参数......# 判断用户是否登录user = request.userif user is not None and user.is_authenticated:# 用户未登录,删除redis购物车......else:# 用户未登录,删除cookie购物车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 = {}# 创建响应对象response = http.JsonResponse({'code': RETCODE.OK, 'errmsg': '删除购物车成功'})if sku_id in cart_dict:del cart_dict[sku_id]# 将字典转成bytes,再将bytes转成base64的bytes,最后将bytes转字符串cookie_cart_str = base64.b64encode(pickle.dumps(cart_dict)).decode()# 响应结果并将购物车数据写入到cookieresponse.set_cookie('carts', cookie_cart_str, max_age=constants.CARTS_COOKIE_EXPIRES)return response

美多商城之购物车(购物车管理2)相关推荐

  1. 注册登录鉴权以及购物车常见管理

    这里写自定义目录标题 注册鉴权以及购物车系统相关知识点 对称加密和非对称加密: **jwt**包含三部分: **登录**分为**授权和鉴权** 注册鉴权以及购物车系统相关知识点 ** 对称加密和非对称 ...

  2. 商城-购物车-购物车功能分析

    商城-购物车-购物车功能分析 2.购物车功能分析 2.1.需求 2.2.流程图 2.购物车功能分析 2.1.需求 需求描述: 用户可以在登录状态下将商品添加到购物车 放入数据库 放入redis(采用) ...

  3. 欢迎来到美多商城!-项目准备之项目介绍-项目需求分析-项目架构设计

    欢迎来到美多商城! [前后端不分离的项目] 项目介绍 项目需求分析 需求分析原因: 可以整体的了解项目的业务流程和主要的业务需求. 项目中,需求驱动开发.即开发人员需要以需求为目标来实现业务逻辑. 需 ...

  4. 【美多商城项目01】了解主要需求和架构设计,创建配置工程

    一.美多商城项目介绍 1.1 项目需求分析 需求分析原因 项目中,需求驱动开发,即开发人员需要以需求为目标来实现业务逻辑. 需求分析方式 企业中,借助产品原型图分析需求. 需求分析完后,前端按照产品原 ...

  5. Django3+Vue美多商城项目的总结

    文章目录 项目说明 主要环境搭建 主要技术实现 django 的配置文件 celery的使用(异步发送短信验证码和邮箱验证链接) 容联云通讯短信平台 QQ登录 jwt实现加密解密验证实现数据的安全性 ...

  6. Django框架之美多商城项目

    后续技术类文档更新到微信公众号-------->>喜欢的扫码关注 美多商城 1. 项目的准备 - 分析商业模式:B2C- 开发流程- 项目的架构- 创建工程- 配置 2. 登录模块 2.1 ...

  7. Python项目实战之欢迎来到美多商城!学习目录导航

    1. 项目准备 1.1. 项目介绍 1.1.1. 项目需求分析 1.1.2. 项目架构设计 1.2. 工程创建和配置 1.2.1. 创建工程 1.2.2. 配置开发环境 1.2.3. 配置Jinja2 ...

  8. 零基础也能快速上手的python实战项目----美多商城

    美多商城:课时安排16天 黑马程序员python企业级开发项目-手把手从0到1开发<美多商城>_哔哩哔哩_bilibili 美多商城属于B2C电商平台,商城销售自营商品给顾客.系统前台包括 ...

  9. java基于ssm开发的美妆商城化妆品电商系统有论文

    简介 Java基于ssm(可以转springboot项目哦)开发的美妆商城系统,主要是卖化妆品的系统,用户可以浏览商品,加入购物车,下单,在个人中心管理自己的订单.管理员可以管理自己的商品,发布商品, ...

  10. python美多商城项目百度网盘_美多商城项目(七)

    正文共: 7620字 4图 预计阅读时间: 20分钟 每日分享 If you can change your mind, you can change your life. 如果你愿意改变你的想法,你 ...

最新文章

  1. mysql可以关联视图_Mysql 五: 数据库自关联、视图
  2. python慢在哪里_求大神分析一下我的python脚本慢在哪里?
  3. Java实现Huffman哈夫曼树(数组实现)
  4. 云计算架构设计6大原则,你遵循了吗?| 赠书
  5. docker build -t_在Docker环境构建、打包和运行Spring Boot应用
  6. 暴力推荐2:硬盘分区丢失之DiskGenius
  7. python怎样压缩和解压缩ZIP文件
  8. Project 3 resources reassigned !!!
  9. Pyqt Model/view框架 3.可编辑项
  10. ibook软件java_Ibookv1.11 塞班版下载 - 手机阅读 - 非凡手机软件
  11. 网络打印机怎么扫描到计算机,怎么用打印机扫描文件-富士施乐SC2020复印机设置网络扫描到计算机(SMB)...
  12. 图灵大会 | 新观点:AI盛世,其实我们离得还很远
  13. SAR图像:拟合杂波时常用的分布
  14. 离线安装openOffice
  15. 初始C语言——成绩等级划分
  16. 快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)
  17. es6 符号 双问号
  18. Redis学习笔记(四):配置文件详细说明(redis-3.2)
  19. iOS开源库–最全的整理
  20. Go调用Python by go-python3

热门文章

  1. 程序员千万不要选全栈开发
  2. 华为腾讯百度众安微众360大咖齐聚,2019中国区块链开发者大会首批议程曝光!...
  3. 不甘心只做输入工具,搜狗输入法上线AI助手,提供智能服务
  4. 单v100 GPU,4小时搜索到一个鲁棒的网络结构
  5. AI一分钟 | 特斯拉再融46亿;腾讯AI Lab宣布开源多标签图像数据集
  6. 如何像用MNIST一样来用ImageNet?这里有一份加速TensorFlow分布式训练的梯度压缩指南
  7. 跟风Google Brain,Facebook AI研究机构启动见习项目
  8. 谷歌无人车之父刚推出的“无人驾驶入门”课,到底能学到啥?
  9. 接口优化:Redis预减库存,减少对数据库访问方案
  10. SQL查找是否存在,别再count了!