公众号【 传智播客 博学谷】回复关键词:前端 PS Java Python 大数据 区块链 测试 PPT JS HTML 简历 领取相关学习资料!
今天来写一下关于购物车的东西, 这里首先抛出四个问题:
1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码
问:购物车商品还在吗?
2)用户登陆了用户名密码,添加商品,关闭浏览器再打开后 不登录用户名和密码
问:购物车商品还在吗?
3)用户登陆了用户名密码,添加商品, 关闭浏览器,然后再打开,登陆用户名和密码
问:购物车商品还在吗?
4)用户登陆了用户名密码,添加商品, 关闭浏览器 外地老家打开浏览器 登陆用户名和密码
问:购物车商品还在吗?
上面四个问题都是以 京东 为模板, 那么大家猜猜结果是什么呢?
1)在
2)不在了
3)在
4)在
如果你能够猜到答案, 那么说明你真的很棒, 那么关于这四点是怎么实现的呢? (如果有不认可的小伙伴可以用京东实验一下)
下面我们就来讲解下购物车的原理,最后再来说下具体的code实现.
1)用户没有登录, 添加商品, 此时的商品是被添加到了浏览器的 Cookie 中, 所以当再次访问时(不登录),商品仍然在Cookie中, 所以购物车中的商品还是存在的.
2)用户登录了,添加商品, 此时会将Cookie中和用户选择的商品都添加到购物车中, 然后删除Cookie中的商品. 所以当用户再次访问(不登录),此时Cookie中的购物车商品已经被删除了, 所以此时购物车中的商品不在了.
3)用户登录, 添加商品,此时商品被添加到数据库做了 持久化 存储, 再次打开登录用户名和密码, 该用户选择的商品肯定还是存在的, 所以购物车中的商品还是存在的.
4)理由3)这里再说下 没登录 保存商品到Cookie的优点以及保存到 Session 和数据库的对比:
1:Cookie: 优点: 保存用户浏览器(不用浪费我们公司的服务器) 缺点:Cookie禁用,不提供保存
2:Session:( Redis : 浪费大量服务器内存:实现、禁用Cookie) 速度很快
3:数据库( Mysql 、Redis、SOlr) 能持久化的就数据库 速度太慢
那么我今天要讲的就是:
用户没登陆:购物车添加到Cookie中
用户登陆: 保存购物车到Redis中 (不用数据库)
公众号【传智播客博学谷】回复关键词:前端 PS Java Python 大数据 区块链 测试 PPT JS HTML 简历 领取相关学习资料!
整体的思路图解:

接下来就是代码实例来实现 购物车的功能了:
首先我们看下购物车和购物项两个 JavaBean 的设计:
购物车: buyerCart.java



这里使用了@ json Igonre注解是因为下面需要将BuyerCart 转换成Json格式, 而这几个字段只有get 方法, 所以不能转换, 需要使用忽略Json.
下面是购物项: buyerItem.java


1、将商品加入购物车中


这里传入的参数是skuId(库存表的主键, 库存表保存的商品id,颜色,尺码,库存等信息), 购买数量amount.
接着我们来看Controller是如何来处理的:



这里涉及一个知识点: 将对象转换成json字符串/json字符串转成对象
我们在这里先写一个小的Demo来演示json和对象之间的互转, 这里使用到了springmvc中的ObjectMapper类.

执行结果:

这里我们使用了Include.NON_NULL, 如果TestTb 中属性为null 的就不给转换成Json, 从对象–>Json字符串 用的是 objectMapper.writeValue(). 从Json字符串–>对象使用的是objectMapper.readValue().
回归上面我们项目中的代码, 只有未登录 添加商品时才会将此商品添加到Cookie中.

我们debug 可以看到:

这里已经将对象购物车对象buyerCart转换成了Json格式.
将商品添加到购物车, 不管是登录还是未登录, 都要先取出Cookie中的购物车, 然后将当前选择的商品追加到购物车中.
然后登录的话 就把Cookie中的购物车清空, 并将购物车的内容添加到Redis中做持久化保存.
如果未登录, 将选择的商品追加到Cookie中.
将购物车追加到Redis中的代码:insertBuyerCartToRedis(这里面包含了判断添加的是否是同款)

判断用户是否登录: String username =
sessionProviderService.getAttributterForUsername(RequestUtils.getCSessionId(request, response));


2、购物车展示页面
最后 重定向到购物车展示页: return “redirect:/shopping/toCart”; 这里进入结算页有两种方式:
1) 在商品详情页 点击加入购物车.
2) 直接点击购物车按钮 进入购物车结算页.
下面来看下结算页的代码:


这里 就是 购物车详情展示页面, 这里需要注意, 如果是同一件商品连续添加, 是需要合并的.
购物车详情展示页面就包括两大块, 1) 商品详情 2)总计(商品总额,运费)
其中1)商品详情又包括 商品尺码,商品颜色, 商品购买数量, 是否有货.

取出Redis中的购物车:
buyerCart = cartService.selectBuyerCartFromRedis(username);

将购物车装满, 前面只是将skuId装进购物车, 这里还需要查出sku详情: List<BuyerItem> items = buyerCart.getItems();
buyerItem.setSku(cartService.selectSkuById(buyerItem.getSku().getId()));

接着就返回”cart.jsp”, 这个就是购物车详情展示页面了.
3、去结算页面
到了这里就说明用户必须要 登录, 而且购物车中必须要有商品.
所以这里我么你需要利用springmvc的过滤功能, 用户点击结算的时候必须要先登录, 如果没有登录的话就提示用户需要登录.


取出 所指定的购物车, 因为我们结算之前在购物车详情页面会勾选 我们 需要购买的商品, 所以这里是根据所勾选的商品去结算的.
BuyerCart buyerCart = cartService.selectBuyerCartFromRedisBySkuIds(skuIds, username);
从购物车中取出指定商品:

1) 当我们购买的商品只要有一件是无货的状态, 那么刷新购物车详情页面, 回显无货的商品状态.
2)当购物车中午商品时, 刷新当前页面.
购物车就这么多东西, 可能有讲解不到或者错误的地方, 欢迎大家指出来,如果对你有帮助的话欢迎转发~
公众号【传智播客博学谷】回复关键词:前端 PS Java Python 大数据 区块链 测试 PPT JS HTML 简历 领取相关学习资料!