京东购物车实现原理

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

public class BuyerCart implements Serializable{ 3     /** 4      * 购物车 5      */ 6     private static final long serialVersionUID = 1L; 7      8     //商品结果集 9     private List<BuyerItem> items = new ArrayList<BuyerItem>(); 10      11     //添加购物项到购物车 12     public void addItem(BuyerItem item){ 13         //判断是否包含同款 14         if (items.contains(item)) { 15             //追加数量 16             for (BuyerItem buyerItem : items) { 17                 if (buyerItem.equals(item)) { 18                     buyerItem.setAmount(item.getAmount() + buyerItem.getAmount()); 19                 } 20             } 21         }else { 22             items.add(item); 23         } 24          25     } 26  27     public List<BuyerItem> getItems() { 28         return items; 29     } 30  31     public void setItems(List<BuyerItem> items) { 32         this.items = items; 33     } 34      35      36     //小计 37     //商品数量 38     @JsonIgnore 39     public Integer getProductAmount(){ 40         Integer result = 0; 41         //计算 42         for (BuyerItem buyerItem : items) { 43             result += buyerItem.getAmount(); 44         } 45         return result; 46     } 47      48     //商品金额 49     @JsonIgnore 50     public Float getProductPrice(){ 51         Float result = 0f; 52         //计算 53         for (BuyerItem buyerItem : items) { 54             result += buyerItem.getAmount()*buyerItem.getSku().getPrice(); 55         } 56         return result; 57     } 58      59     //运费 60     @JsonIgnore 61     public Float getFee(){ 62         Float result = 0f; 63         //计算 64         if (getProductPrice() < 79) { 65             result = 5f; 66         } 67          68         return result; 69     } 70      71     //总价 72     @JsonIgnore 73     public Float getTotalPrice(){ 74         return getProductPrice() + getFee(); 75     } 76      77 }

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

下面是购物项: buyerItem.java

public class BuyerItem implements Serializable{ 3     private static final long serialVersionUID = 1L; 5     //SKu对象 6     private Sku sku; 7      8     //是否有货 9     private Boolean isHave = true; 10      11     //购买的数量 12     private Integer amount = 1; 13  14     public Sku getSku() { 15         return sku; 16     } 17  18     public void setSku(Sku sku) { 19         this.sku = sku; 20     } 21  22     public Boolean getIsHave() { 23         return isHave; 24     } 25  26     public void setIsHave(Boolean isHave) { 27         this.isHave = isHave; 28     } 29  30     public Integer getAmount() { 31         return amount; 32     } 33  34     public void setAmount(Integer amount) { 35         this.amount = amount; 36     } 37  38     @Override 39     public int hashCode() { 40         final int prime = 31; 41         int result = 1; 42         result = prime * result + ((sku == null) ? 0 : sku.hashCode()); 43         return result; 44     } 45  46     @Override 47     public boolean equals(Object obj) { 48         if (this == obj) //比较地址 49             return true; 50         if (obj == null) 51             return false; 52         if (getClass() != obj.getClass()) 53             return false; 54         BuyerItem other = (BuyerItem) obj; 55         if (sku == null) { 56             if (other.sku != null) 57                 return false; 58         } else if (!sku.getId().equals(other.sku.getId())) 59             return false; 60         

转载于:https://www.cnblogs.com/Gdragon123/p/9056949.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值