京东购物车的 Java 架构实现及原理

转载自 京东购物车的 Java 架构实现及原理

今天来写一下关于购物车的东西, 这里首先抛出四个问题:

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中  (不用数据库)

整体的思路图解:

接下来就是代码实例来实现 购物车的功能了:

首先我们看下购物车和购物项两个JavaBean的设计:

购物车: buyerCart.java

这里使用了@JsonIgonre注解是因为下面需要将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)当购物车中午商品时, 刷新当前页面.

购物车就这么多东西, 可能有讲解不到或者错误的地方, 欢迎大家指出来.如果对你有帮助的话也请点个赞支持一下,谢谢~

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员求职面试三部曲之三:快速适应新的工作环境

新进一家公司总有各种的不适应&#xff0c;或兴奋&#xff0c; 或紧张&#xff0c;或不安&#xff0c;或迷茫各种情绪兼而有之。曾经有个家伙好不容易进了A公司&#xff0c;本来是要替代另一位即将离职的小伙伴的&#xff0c;结果&#xff0c;走得比那位兄弟还快&#xff0c;只…

问的书写规则是什么意思_化学式的定义及其书写规则

化学式的定义及其书写规则化学式是用元素符号表示纯净物组成及原子个数的式子。分子晶体的化学式叫做分子式&#xff0c;可以表示这种物质的分子构成。下面是百分网小编给大家整理的化学式的简介&#xff0c;希望能帮到大家!化学式的定义用元素符号表示纯净物组成及原子个数的式…

微软企业应用开发三大方向:跨平台、开放/开源与DevOps

软件和互联网正在改变传统企业&#xff0c;软件的职能逐渐从管理内部员工变成核心的商业竞争能力&#xff0c;在今天这种大环境下&#xff0c;我们应该用的新开发技术和方法。微软公司全球资深副总裁、开发平台事业部潘正磊&#xff08;Julia&#xff09;认为&#xff0c;把IT托…

Java程序员最常犯的 10 个错误

转载自 Java程序员最常犯的 10 个错误 这个列表总结了Java开发人员经常犯的10个错误。一 、把数组转成ArrayList 为了将数组转换为ArrayList&#xff0c;开发者经常会这样做&#xff1a; List list Arrays.asList(arr); 使用Arrays.asList()方法可以得到一个ArrayList&…

mysql5.1升级5.5_mysql数据库迁移,由版本5.1升级至5.5.29,需要注意哪些

caching_sha2_password认证插件提供更多的密码加密方式&#xff0c;并62616964757a686964616fe59b9ee7ad9431333433636131且在加密方面具有更好的表现&#xff0c;目前MySQL 8.0选用caching_sha2_password作为默认的认证插件&#xff0c;MySQL 5.7的认证插件是MySQL_native_pas…

dotnetConf 2016 线上虚拟大会

为期三天&#xff08;6月7日-9日&#xff09;的Channel9 免费.NET线上虚拟大会&#xff0c;微软产品团队及.NET社区精英一起徜徉在.NET的世界&#xff01; 与大咖Scott Hunter, Miguel de Icaza (Xamarin CTO) , ScottHanselman及其他.NET大牛一起学习如何利用.NET开发跨…

mysql的on和in用法_数据库中in、on、with的用法及示例。

with用法&#xff1a;创建一个表&#xff1a;create table regr (pid integer,id integer, name char(20))alter table regr alter id set not null add primary key(id)insert into regr values(-1,1,library),(1,2,news),(2,3,world news),(2,4,politics),(2,5,bussiness)(2,…

文档数据库RavenDB-介绍与初体验

不知不觉&#xff0c;“.NET平台开源项目速览“系列文章已经15篇了&#xff0c;每一篇都非常受欢迎&#xff0c;可能技术水平不高&#xff0c;但足够入门了。虽然工作很忙&#xff0c;但还是会抽空把自己知道的&#xff0c;已经平时遇到的好的开源项目分享出来。今天就给大家介…

双机热备的原理

转载自 双机热备的原理夜半惊魂 上次的文章《负载均衡的原理》中讲到&#xff0c;张大胖在Bill的指导下&#xff0c;成功地开发了一个四层的负载均衡软件&#xff0c; 把流量“均匀地”分发到了后面的几个服务器中&#xff0c; 获得了老板的1000块钱奖励。但是张大胖心中隐隐不…

c# 向mysql插入数据_C#连接mysql数据库 及向表中插入数据的方法

mysql 语句操作&#xff1a;创建数据库&#xff1a;create database hotelATMDb;use hotelATMDb;C#连接mysql1、引用 dll MySql.Data.dll 下载地址&#xff1a;http://download.csdn.net/detail/chen504390172/67461312、引用 using MySql.Data.MySqlClient;连接语句&#xff1…

微软CEO纳德拉开讲,2016微软开发者峰会在京召开

6月1日&#xff0c;2016微软开发者峰会在京召开。 来自微软总部的高层、技术大拿&#xff0c; 以及来自微软亚洲研究院、微软亚太研发集团、Xamarin 总部团队、微软中国开发体验及平台合作事业部的技术专家对各平台的开发进行技术探讨&#xff0c;向开发者展示了一系列引人入胜…

Linux下如何避免误操作执行 rm

转载自 Linux下如何避免误操作执行 rm最近IT圈子流行着一个段子&#xff1a;某个蠢萌的程序员&#xff0c;不小心在公司的服务器上输入了 rm -rf/ 指令&#xff0c;结果......现在还没出狱呢。当然&#xff0c;绝大部分程序员不可能犯下如此低级的错误&#xff0c;更何况也没有…

Consul入门

简介 为什么要用consul&#xff0c;这里就不详细介绍了&#xff0c;本文重点是Consul的搭建和使用过程。 Consul搭建 参考文献&#xff1a;http://tonybai.com/2015/07/06/implement-distributed-services-registery-and-discovery-by-consul/ 下载consul和consul UI 官方地址&…

Java Socket编程----通信是这样炼成的

转载自 Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的&#xff0c;其对网络提供了高度的支持&#xff0c;使得客户端和服务器的沟通变成了现实&#xff0c;而在网络编程中&#xff0c;使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的…

mysql级联复制转换成一主两从_一主两从转级联复制

一主两从 转 级联复制 示意图如下M ---> S1\ > M ---> S1 ---> S2\ --> S2如果有开启GTID操作起来方便多&#xff0c;GTID是唯一的&#xff0c;直接操作即可。如果使用file_name、position可以使用如下办法(现在还没开启gtid真的是无力吐槽)# 步骤1、# 现将S2的…

细说ASP.NET Core与OWIN的关系

前言 最近这段时间除了工作&#xff0c;所有的时间都是在移植我以前实现的一个Owin框架&#xff0c;相当移植到到Core的话肯定会有很多坑&#xff0c;这个大家都懂&#xff0c;以后几篇文章可能会围绕这个说下&#xff0c;暂时就叫《Dotnet Core踩坑记》吧&#xff0c;呵呵。 接…

mysql 外键和事务_Mysql (五)事务和外键

一、 什么是事务&#xff1a;简单说&#xff0c;所谓事务就是一组操作&#xff0c;这组操作要么都成功执行&#xff0c;要么都不执行。二、 事务的使用流程1. 第一步&#xff1a;开启事务&#xff0c;start transaction&#xff1b;2. 第二步&#xff1a;正常操作SQL语句&#…

微软发布正式版SQL Server 2016

微软于6.2 在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本&#xff08;GA&#xff09;&#xff0c;历时一年多&#xff0c;微软为该软件发布了多个公共预览版和候选版本&#xff0c;而今天最终版本终于上线了。在博客中&#xff0c;微软数据集团的企业副总裁 Josep…

怎样用bootsrapcol-md来实现四分屏_用会议平板提升会议效率,做好这两点

图片&#xff1a;皓丽编辑&#xff1a;好哩据相关科学研究显示&#xff0c;百分之 90% 的会议&#xff0c;完全可以在低于 30 分钟的时间内完成&#xff0c;而人的注意力集中的时间差不多也是在 40-45 分钟&#xff0c;所以提升会议效率&#xff0c;保持会议节奏的连续性和抓住…

JAVA 通过 Socket 实现 TCP 编程

转载自 JAVA 通过 Socket 实现 TCP 编程简介 TCP简介 TCP&#xff08;Transmission Control Protocol 传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793定义。在简化的计算机网络OSI模型中&#xff0c;它完成第四层…