一、购物车存储方案

  • 用户登录与未登录状态下,都可以保存购物车数据。
  • 用户对购物车数据的操作包括:全选等等
  • 每个用户的购物车数据都要做唯一性的标识。

1.1. 登录用户购物车存储方案

1.1.1.存储数据说明

  • 如何描述一条完整的购物车记录?

    • 用户itcast,选择了两个 iPhone8 添加到了购物车中,状态为勾选
  • 一条完整的购物车记录包括:用户商品数量勾选状态
  • 存储数据:user_idsku_idcountselected

1.1.2.存储位置说明

  • 购物车数据量小,结构简单,更新频繁,所以我们选择内存型数据库Redis进行存储。
  • 存储位置:Redis数据库 4号库
"carts": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/4","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}
},

1.1.3.存储类型说明

  • 提示:我们很难将用户、商品、数量、勾选状态存放到一条Redis记录中。所以我们要把购物车数据合理的分开存储。
  • 用户、商品、数量:hash
    • carts_user_id: {sku_id1: count, sku_id3: count, sku_id5: count, ...}
  • 勾选状态:set  【包括去重,也没有顺序要求】
    • 只将已勾选商品的sku_id存储到set中,比如,1号和3号商品是被勾选的。
    • selected_user_id: [sku_id1, sku_id3, ...]

1.1.4.存储逻辑说明

  • 当要添加到购物车的商品已存在时,对商品数量进行累加计算。
  • 当要添加到购物车的商品不存在时,向hash中新增field和value即可。

1.2. 未登录用户购物车存储方案

1.2.1.存储数据说明

  • 存储数据:user_idsku_idcountselected

1.2.2.存储位置说明    【不会存储在redis中】

  • 由于用户未登录,服务端无法拿到用户的ID,所以服务端在生成购物车记录时很难唯一标识该记录。
  • 我们可以将未登录用户的购物车数据缓存到用户浏览器的cookie中,每个用户自己浏览器的cookie中存储属于自己的购物车数据。
  • 存储位置:用户浏览器的cookie

1.2.3.存储类型说明

  • 提示:浏览器的cookie中存储的数据类型是字符串。  【cookie中只能存储字符串】
  • 思考:如何在字符串中描述一条购物车记录?
  • 结论:JSON字符串可以描述复杂结构的字符串数据,可以保证一条购物车记录不用分开存储。
{"sku_id1":{"count":"1","selected":"True"},"sku_id3":{"count":"3","selected":"True"},"sku_id5":{"count":"3","selected":"False"}
}

1.2.4.存储逻辑说明

  • 当要添加到购物车的商品已存在时,对商品数量进行累加计算。
  • 当要添加到购物车的商品不存在时,向JSON中新增field和value即可。

提示:

  • 浏览器cookie中存储的是字符串明文数据。

    • 我们需要对购物车这类隐私数据进行密文存储。
  • 解决方案:pickle模块 和 base64模块

1.2.5.pickle模块介绍

  • pickle模块是Python的标准模块,提供了对Python数据的序列化操作,可以将数据转换为bytes类型,且序列化速度快。
  • pickle模块使用:
    • pickle.dumps()将Python数据序列化为bytes类型数据。
    • pickle.loads()将bytes类型数据反序列化为python数据。
import pickledict = {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
ret = pickle.dumps(dict)
print(ret)dict_data = pickle.loads(ret)
print(dict_data)

运行结果:

pickle模块的详细使用方法,参考博文:https://blog.csdn.net/weixin_44799217/article/details/115187970

1.2.6.base64模块介绍

  • 提示:pickle模块序列化转换后的数据是bytes类型,浏览器cookie无法存储。
  • base64模块是Python的标准模块,可以对bytes类型数据进行编码,并得到bytes类型的密文数据。
  • base64模块使用:
    • base64.b64encode()将bytes类型数据进行base64编码,返回编码后的bytes类型数据。
    • base64.b64deocde()将base64编码后的bytes类型数据进行解码,返回解码后的bytes类型数据。
import pickle
import base64dict = {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
ret = pickle.dumps(dict)
print(ret)
b = base64.b64encode(ret)
print(b)
print('*' * 100)
ret_1 = base64.b64decode(b)
print(ret_1)
dict_data = pickle.loads(ret_1)
print(dict_data)

运行结果:

美多商城之购物车(购物车存储方案)相关推荐

  1. 阿语python美多商城-商品-购物车之第7.1节购物车存储方案

    购物车存储方案 用户登录与未登录状态下,都可以保存购物车数据. 用户对购物车数据的操作包括:增.删.改.查.全选等等 每个用户的购物车数据都要做唯一性的标识. 1. 登录用户购物车存储方案 1.存储数 ...

  2. 美多商城之验证码(异步方案)

    三.异步方案RabbitMQ和Celery 3.1 生产者消费者设计模式  [替换之前重写的send_flag代码] 思考: 下面两行代码存在什么问题? 问题: 我们的代码是自上而下同步执行的. 发送 ...

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

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

  4. 美多商城之商品(准备商品数据 )、Dockers容器和FastDFS存储

    二.准备商品数据    [这些数据一般保存在第三方云存储服务] 提示: 数据库表有了以后,我们现在需要准备商品信息数据和商品图片数据,以便查询和展示. 商品信息数据:比如商品编号等都是字符串类型的,可 ...

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

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

  6. 美多商城之商品(2)

    美多商城之商品(2) 1.商品搜索 1.1.全文检索方案Elasticsearch 1.2.Haystack扩展建立索引 1.3.渲染商品搜索结果 2.商品详情页 2.1.商品详情页分析和准备 2.2 ...

  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_美多商城(商品)_6

    商品数据库表设计 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍 SPU = Standard Product Unit (标准产品单位) SPU是商品信息聚合的 ...

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

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

最新文章

  1. 如何 SQL Server 2005 实例之间传输登录和密码
  2. 区块链以及区块链技术总结
  3. Centos 7 安装 Haproxy
  4. git cherry-pick改写提交
  5. 阿里巴巴技术专家三画:如何画好架构图
  6. BC:带你温习并解读《中国区块链技术和应用发展白皮书》—区块链发展生态
  7. JFinal问题整理
  8. 靠刷算法题,真的可以刷进大厂吗?
  9. 嵩天python笔记_嵩天Python学习笔记-05
  10. Leetcode--5274. 停在原地的方案数
  11. 1024节日快乐~~~~
  12. C#LeetCode刷题之#34-在排序数组中查找元素的第一个和最后一个位置(Find First and Last Position of Element in Sorted Array)
  13. 孪生网络Dataset
  14. linux 驱动器发送信号,Linux设备驱动并发控制详解(自旋锁,信号量)
  15. 如何使用Java逐行读取大文本文件?
  16. c语言 如何调用void函数,在C中从main调用void*函数
  17. 论文笔记-LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping
  18. 微信小程序input只允许输入数字
  19. too few variables specified 怎么解决
  20. for循环如果先--_JavaSE第04篇:Java基础语法之循环结构

热门文章

  1. 百度盯上媒体生意?百度CTO王海峰详解智能媒体中台
  2. 《评人工智能如何走向新阶段》后记(再续8)
  3. 2018最后一个月的Python热文Top10!赶紧学起来~
  4. 百度大脑发布企业服务解决方案,将 AI 技术落实到细分领域
  5. IntelliJ IDEA 居然支持音视频聊天!
  6. SpringBoot 部署 Jar 文件,瘦身优化指南 !
  7. 工作几年了,API 网关还不懂?
  8. 为什么 HashMap 加载因子一定是0.75?而不是0.8,0.6?
  9. 跟我学Springboot开发后端管理系统6:缓存框架Caffeine
  10. MySql 之 left join 避坑指南