购物车实现逻辑:
购物车实现的功能:
1、将商品添加到购物车中
2、改变购物车商品数量
3、显示购物车的信息
将商品添加到购物车中功能分析如下:
1. 接收到商品ID
2. 根据商品ID查询商品信息
3. 将商品信息加入到购物车中
需要做的逻辑判断
1. 判断购物车是否已有对应商品
2. 如果购物车中没有对应的商品,直接加入
3. 如果购物车中有对应的商品,只要修改商品数量
我的实现步骤:
1. 首先判断当前用户是否登录,如果未登录采用Cookie存储
2. 如果登录则采用Redis存储。
3. 登录后要进行Cookie购物车与Redis购物车的合并操作,并清除Cookie购物车。
为什么未登录状态下不使用Session缓存:
1. session存在时间限制,会定期清空的,而cookie如果不主动清或者设置定期清除则他是不会清除的
2. session是存在服务器的(服务器端),而cookie是本地的(客户端浏览器),如果多人访问服务器要求可想而知。session很吃内存
3. 购物车存放的都是临时的物品,购买之后才产生真正的交易记录
所以这部分数据一般不会放到session中。Cookie是最优的解决方案。
Cookie的优点:
1. 不占用服务端存储空间
2. 用户体验好。
3. 代码实现简单。
如何判断是否登录?
1.从cookie中取token方法 aop思想的拦截器
如何判断是否登录?取不到未登录。如果取到token,到redis中查询token是否过期。如果过期未登录状态,没过期登录状态。
2.通过登录时存入session的唯一标识
用户登录成功之后把用户的唯一标识存入session
一旦用户发送过来请求先去拿着这个唯一标识去查找有没有这个用户,有的话证明已经登陆过了,没有证明没有登陆。
未登录状态下购物车功能实现:
分析:1.页面传来的是商品id跟商品数量
(1) 从cookie中获取商品列表信息(单独提出来写成个通用的方法)
(2) 遍历购物车列表,判断需要添加的商品在购物车列表是否存在
(3) 商品存在的话,那么取出该商品原来的数量+添加的数量作为该商品现在的数量
(4) 如果商品不存在,那么调用服务,根据传来的商品id查询商品数量,设置商品的数量为页面传来的数量
取商品的第一张图片(购物车列表只展示一张图片)。 image.split(",")[0]
(5) 把修改后的购物车列表重新存入到cookie中
setcookie(name,value,expire,path,domain,secure)
CookieUtils.setCookie(request, response, "cart1", JsonUtils.objectToJson(cartList), COOKIE_MAX_TIME, true);
未登录状态下删除购物车商品:
实现:
(1)从cookie中获取购物车列表
(2)遍历,查找到要删除的商品
(3)通过remove方法将该商品从购物车列表移除
(4)更新后的购物车列表重新写入cookie
(5)重定向到购物车列表页面
登录状态下购物车功能的实现
功能分析:
1.未登录状态下,把购物车数据保存到cookie中。
登录状态下,需要把购物车数据保存到服务端。需要永久保存,可以保存到数据库中。可以把购物车数据保存到redis中。
2.redis的存取
删除 newArrayList 数组 然后通过delete方法删除指定key。
重新赋值
@Autowired
private StringRedisTemplate stringRedisTemplate;
List<Cart> cartList = findCartList();
//存
stringRedisTemplate.opsForValue().set(key:用户ID, value:JSON.toJSON(cartList).toString());
//取
String JsonArray = stringRedisTemplate.opsForValue().get(用户ID);
List<Cart> carIdList = JSONObject.parseArray(JsonArray, Cart.class);
合并:
这个就需要使用到消息了,我们可以发送一个消息给后台系统
将未登录状态下的outerKey传递给后台系统,后台系统到Redis中查询到未登录状态下的购物车
将购物车中的数据插入到数据库中,和之前登录状态下的购车数据合并
重新缓存到Redis中,此时缓存到Redis中的购物车是和未登录状态不同的,因为这个缓存的购物车是有主人的,未登录状态下缓存的临时购物车是没有主人的。