如今网上购物已经成了人们生活中不可缺乏的一部分,今天咱们来看下当咱们从商城里面浏览搜索了商品,看到了本身喜欢的商品准备加入到购物车的这个功能实现。java
购物车功能实现:redis
购物车功能流程:数据库
功能分析:json
(1)咱们平时购物的时候,有时候点击商品页面的加入购物车,而后商品就直接加入到购物车列表中,无论用户是否登陆。而后咱们换了一台设备,发现该网站咱们以前在另外一台设备上加入购物车的商品不存在。由此咱们能够推断出:购物车列表的内容不是存放在数据库,而是在cookie中。,因此购物车功能实现是在客户端实现的。服务器
(2)购物车咱们须要实现的功能有哪些呢?cookie
展现购物车列表、向购物车列表中添加商品(add)、修改购物车列表中商品的数量、删除列表中的商品。ide
逻辑实现:网站
1、展现购物车列表:编码
由于购物车的商品列表是保存在cookie中的,因此咱们获取购物车列表就是从cookie中获取商品列表。spa
首先cookie中保存形式也是key-value的形式,key指的是保存的名称,好比TT_CART,是一个标志而已。value是保存的商品的具体信息,是以字符串的形式保存的,咱们一般将列表的形式转换成json格式的数据,由于json格式的就是一个字符串的形式保存的。
cookie属于会话跟踪技术,写入cookie是服务器的response写入的,即服务器给客户端颁发一个名词cookie。因此咱们咱们获取cookie就须要使用request来获取。
cookie是客户端的,若是直接将对象显示很危险,因此咱们须要对商品进行编码。
service层实现:
获取到商品的列表后,咱们能够展现该列表:controller层实现:
2、向购物车添加商品信息
咱们首先判断购物车列表中是否存在该商品,若是存在则将该商品的数量加1,若是不存在则将商品加入购物车,从新将商品列表写入cookie。
分析:传入参数:id,num,request,response;返回值:能够采用咱们的TaotaoResult,
dao层:无。
service层实现:由于以前显示了购物车列表,因此咱们遍历购物车列表,对吧购物车中商品的id和加入的商品的id是否一致,若是一致则数量加1,若是不一致则须要从商品信息表中获取该上商品的信息。这里须要调用服务层的根据id获取商品信息的接口,即用httpclient。
这里还有一个问题:商品信息表中的字段是很是多的,咱们难道都须要吗,此时咱们就要考虑一个新的接收对象pojo了,只须要购物车里面所须要的字段便可。因此从新创建一个pojo来承接商品信息的部分信息。
其中:这里须要注意cookie中和cookie外的数据的形式,是json仍是java对象。
具体实现以下:controller:
service层:
@Value("${SHANG_PIN_BASE_INFORMATION_URL}") private String SHANG_PIN_BASE_INFORMATION_URL; @Override public TaotaoResult getCartList(long id, Integer num, HttpServletRequest request, HttpServletResponse response) { /*添加购物车商品,首先购物车商品是保存在cookie中的,由于咱们只要不付款是没有什么做用的。 * 如何从cookie中读取购物车列表呢,是利用request来实现的。 * 第一步:首先判断cookie中是否存在该商品,若是存在,则商品数量加1, * 若是没有则根据商品id从rest工程中获取该商品,将商品写入cookie。 * 由于咱们不须要获取商品的所有信息,只有一部分id,title,price,image,num。因此独立创建一个pojo才存放这些字段。 */ CartItem cartItem=null; //从cookie中获取商品列表的方法 List<CartItem> itemList=getItemListByCookie(request); //遍历cookie的商品列表, for (CartItem cItem : itemList) { if (cItem.getId()==id) { cItem.setNum(cItem.getNum()+num); cartItem=cItem; break; } } if (itemList==null) { cartItem=new CartItem(); String itemjson = HttpClientUtil.doGet(SHANG_PIN_BASE_INFORMATION_URL+id); //从http协议获取的返回值是json格式的 TaotaoResult taotaoResult= TaotaoResult.formatToPojo(itemjson, TbItem.class); //返回结果是taotaoresult,若是想获取pojo对象,就利用它的getData方法 if (taotaoResult.getStatus()==200) { TbItem item=(TbItem) taotaoResult.getData(); cartItem.setId(item.getId()); cartItem.setTitle(item.getTitle()); cartItem.setPrice(item.getPrice()); cartItem.setNum(item.getNum()); cartItem.setImage(item.getImage()==null?"":item.getImage().split(",")[0]); } //将商品添加到购物车列表 itemList.add(cartItem); } //将商品添加到cookie中,由于cookie中的存值方式是key-value的形式,value是一个字符串,因此须要将转换的商品列表转成json的形式再保存到cookie中 CookieUtils.setCookie(request, response,"TT_CART", JsonUtils.objectToJson(itemList), true); return TaotaoResult.ok(); } //从cookie中获取购物车列表 private List<CartItem> getItemListByCookie(HttpServletRequest request) { String cookiejson = CookieUtils.getCookieValue(request, "TT_CART",true); //转换成商品列表 if (cookiejson==null) { return new ArrayList<>(); } //cookie 中保存的也是key -value的值,value是字符串,即json格式的数据 List<CartItem> list = JsonUtils.jsonToList(cookiejson, CartItem.class); return list; }
3、修改购物车商品的数量,这里利用了js来实现,调用咱们的add商品的功能,num设置成1或者-1
四:删除购物车的商品
逻辑实现:传入要删除商品的id,读取购物车的商品列表,遍历列表,比较id,若是id同样,则从cookie中remove该商品,而后从新将商品列表写入cookie。
返回购物车列表的页面。
实现:controller:
service层实现:
购物车功能还有一些问题:
一、更换设备购物车商品不能同步
a) 不能把购物车商品保存到数据库
b) 要求用户登陆才能同步信息
c) 能够把购物车信息保存到redis中,key就是用户,value就是购物车列表
d) 购物车商品合并的问题。
二、提交订单后购物车商品须要清空。