zoukankan      html  css  js  c++  java
  • 商城系统购物车功能分析实现

    现在网上购物已经成了人们生活中不可缺少的一部分,今天我们来看下当我们从商城里面浏览搜索了商品,看到了自己喜欢的商品准备加入到购物车的这个功能实现。

    购物车功能实现:

    购物车功能流程:

    功能分析:

    (1)我们平时购物的时候,有时候点击商品页面的加入购物车,然后商品就直接加入到购物车列表中,不管用户是否登录。然后我们换了一台设备,发现该网站我们之前在另一台设备上加入购物车的商品不存在。由此我们可以推断出:购物车列表的内容不是存放在数据库,而是在cookie中。,所以购物车功能实现是在客户端实现的。

    (2)购物车我们需要实现的功能有哪些呢?

    展示购物车列表、向购物车列表中添加商品(add)、修改购物车列表中商品的数量、删除列表中的商品。

    逻辑实现:

    一、展示购物车列表:

    因为购物车的商品列表是保存在cookie中的,所以我们获取购物车列表就是从cookie中获取商品列表。

    首先cookie中保存形式也是key-value的形式,key指的是保存的名称,比如TT_CART,是一个标志而已。value是保存的商品的具体信息,是以字符串的形式保存的,我们通常将列表的形式转换成json格式的数据,因为json格式的就是一个字符串的形式保存的。

    cookie属于会话跟踪技术,写入cookie是服务器的response写入的,即服务器给客户端颁发一个名词cookie。所以我们我们获取cookie就需要使用request来获取。

    cookie是客户端的,如果直接将对象显示很危险,所以我们需要对商品进行编码。

    service层实现:

    获取到商品的列表后,我们可以展示该列表:controller层实现:

    二、向购物车添加商品信息

    我们首先判断购物车列表中是否存在该商品,如果存在则将该商品的数量加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;
    	}
    

      

     三、修改购物车商品的数量,这里利用了js来实现,调用我们的add商品的功能,num设置成1或者-1

    四:删除购物车的商品

    逻辑实现:传入要删除商品的id,读取购物车的商品列表,遍历列表,比较id,如果id一样,则从cookie中remove该商品,然后重新将商品列表写入cookie。

    返回购物车列表的页面。

    实现:controller:

    service层实现:

    购物车功能还有一些问题:

    1、更换设备购物车商品不能同步

    a)         不能把购物车商品保存到数据库

    b)        要求用户登录才能同步信息

    c)         可以把购物车信息保存到redis中,key就是用户,value就是购物车列表

    d)        购物车商品合并的问题。

    2、提交订单后购物车商品需要清空。

             

  • 相关阅读:
    Linux 开发之线程条件锁那些事
    Linux 开发之线程条件锁那些事
    Linux 开发之线程条件锁那些事
    洛谷3919:可持久化数组——题解
    洛谷3919:可持久化数组——题解
    洛谷3919:可持久化数组——题解
    洛谷3919:可持久化数组——题解
    长篇干货|以太坊智能合约 —— 最佳安全开发指南(附代码)
    长篇干货|以太坊智能合约 —— 最佳安全开发指南(附代码)
    长篇干货|以太坊智能合约 —— 最佳安全开发指南(附代码)
  • 原文地址:https://www.cnblogs.com/fengli9998/p/6414182.html
Copyright © 2011-2022 走看看