购物车如何实现

购物车的功能包括:
把商品添加到购物车
删除购物车中的商品
修改购物车中某一商品的订购数量
清空购物车
显示购物车中商品清单及数量、价格

如何实现
前端功能:对用户的操作实时响应,在未登录的情况下也能添加到购物车,登录之后数据跟已有的购物车数据进行合并展示。
后端功能:数据存储、数据合并(登录后跟前端存储的cookie数据进行合并)、统计商品总价、价格优惠计算、商品下架处理、商品降价提醒.....

查询购物车消息:点击购物车就将商品的 ID 等相关的数据发送给后端,同时更新购物车中的 DOM 显示已经添加的商品,后端接收用户id,用此id去表里查数据,然后返回一个储存购物车对象的list给前端。是否将购物车的数量写入浏览器的缓存。淘宝的实现是在提交数据的同时也将数据写入 cookie,方便用户下次打开淘宝时,可以直接从缓存中读取数据,以减少不必要的请求。饿了么的任务模式不用将数据提交给程序处理,直接将数据写入 localStorage 即可,订单则是在用户提交订单的时候生成的。用相对简单的redis(hash类型)进行存储,大key为CacheKey.CART_LIST ,这是一个枚举,当前登录名username作为小key,value是list用于存储多条商品信息,list中用map进行存储,map的有两个属性,一个是 item,表示购物车明细数据,商品图片,单价,商品详细信息等等;另一个是checked,用于存储购物车是否被选中,实现价格的总计以及批量删除等功能。
新增商品到购物车:若这个商品之前添加到过购物车,所以这一次实际上是对一个数量的修改,属于update操作,更新表中对应商品的num值即可;此商品在购物车中没有,这个操作属于insert操作。我们需要对表进行一次插入操作。
删除商品在购物车中的信息:就是删除数据库一条记录,如果再redis中做了缓存,把缓存也一起删了。

数据存储:数据库承担着存储购物信息的作用,session或cookie用来跟踪用户。
当用户处于未登录状态时,可以浏览商品,查看详细商品信息,也可以添加购物车。此时数据不能存在redis中,因为redis存储数据需要以用户的身份做标识,用户不登录就没有身份标识。所以此时的数据应该存储在本地的数据存储位置,即cookie当中。数据临时保存到Redis中,并不插入数据库中,Redis生成一个唯一的outerKey,保存到cookie中,每次添加商品带上这个cookie,这样就保证每次加入同一个购物车,这个数据会被保存一段时间,当用户登录的时需要使用到消息,我们发送一个消息给后台系统,将未登录状态下的outerKey传递给后台系统,后台系统到Redis中查询到未登录状态下的购物车,将购物车中的数据插入到数据库中,并且和之前登录状态下的购车数据合并,重新缓存到Redis中,此时缓存到Redis中的购物车是和未登录状态不同的,因为此时已经有了身份标识。
用户登录后添加商品, 此时会将Cookie中和用户选择的商品都添加到购物车中, 然后删除Cookie中的商品。此时商品被添加到数据库做了持久化存储,用户登录后的数据都是和数据库打交道。此时购物车是对应一个用户,需要做的就是将商品的数据插入数据库中,但是如果读写频繁的时候,就存在压力问题,此时我们使用Redis担任读的部分功能(在大量访问情况下,采用Redis集群),且Redis的处理效率比数据库的读写分离要高。向数据库中插入数据时,使用RabbitMQ发送消息,然后有一个消息系统监听消息,将RabbitMQ中消息内容保存到Redis中,此时Redis中使用hash存储结构,外部键可以标记一个唯一的购物车,内部键就可以标记购物车上的一个商品,一个外部键可以对应多个内部键,这个和一个购物车里有多个商品是相符合的,在用户查询自己的购物车数据的时候,就不用到数据库中查询,而是直接从redis中将数据拿出来,这样数据库的读压力就被Redis分担出去了。
登录状态下的实现步骤:客户端在详情页发送商品信息,商品信息经由vue封装成json,向服务器发送ajax请求。视图函数接收到ajax请求,以request.body.decode()方式接收数据并且解码。将获取的数据封装成字典,加密后存入cookie中。方式为:response.set_cookie(‘cart‘, cart_str, max_age=60 * 60 * 24 * 14),返回response,页面显示添加成功。客户端请求购物车,请求发送至服务器。视图函数从cookie中读取数据,将数据解码,封装成前台需要的数据格式。前台模板变量接收到数据,vue对其进行处理,最终渲染页面,显示购物车数据。

 

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值