1. 购物车的实现
1.1. 功能分析
1、购物车是一个独立的表现层工程。
2、添加购物车不要求登录。可以指定购买商品的数量。
3、展示购物车列表页面
4、修改购物车商品数量
5、删除购物车商品
模块划分结构
1.1. 添加购物车
1.1.1. 功能分析
在不登陆的情况下也可以添加购物车。把购物车信息写入cookie。
优点:
1、不占用服务端存储空间
2、用户体验好。
3、代码实现简单。
缺点:
1、cookie中保存的容量有限。最大4k
2、把购物车信息保存在cookie中,更换设备购物车信息不能同步。
请求的url:/cart/add/{itemId}
参数:
1)商品id: Long itemId
2)商品数量: int num
业务逻辑:
1、从cookie中查询商品列表。
2、判断商品在商品列表中是否存在。
3、如果存在,商品数量相加。
4、不存在,根据商品id查询商品信息。
5、把商品添加到购车列表。
6、把购车商品列表写入cookie。
返回值:逻辑视图
Controller
/** * 购物车Controller * @Auther: jun * @Date: 2018/5/31 0031 19:44 * @Description: */ @Controller public class CartController { @Autowired private ItemService itemService; @Autowired private CartService cartService; @Value("${COOKIE_CART_EXIPERE}") private Integer COOKIE_CART_EXIPERE; /** *添加购物车商品 * @auther: jun * @date: 2018/5/31 0031 22:16 * @param itemId,num,request,response * @return: java.lang.String * @Description: */ @RequestMapping("/cart/add/{itemId}") public String addCart(@PathVariable Long itemId, @RequestParam(defaultValue = "1") Integer num, HttpServletRequest request, HttpServletResponse response){ //判断用户是否登录 //从request中获取到用户信息 TbUser user = (TbUser) request.getAttribute("user"); //判断是否有值有就是登陆状态把购物车写入redis中 if (user !=null){ //保存到服务端(redis) cartService.addCart(user.getId(),itemId,num); //返回逻辑视图 return "cartSuccess"; } //从cookie中获取到购物车列表 List<TbItem> cartList = getCartListFromCookie(request); //用于判断购物车中是否有添加的商品信息 boolean flag=false; //遍历购物车商品列表 for (TbItem item:cartList) { //判断添加的商品是否在购物册列表中使用商品id判断 if (itemId.equals(item.getId())){ //如果在flag为true flag=true; //并且购物车中商品数量加上添加商品的的数量 item.setNum(item.getNum()+num); //跳出循环 break; } } //如果不存在 if(!flag){ //根据商品id查询得到一个TbItem对象 TbItem item = itemService.getItemById(itemId); //设置商品数量 item.setNum(num); //取一张图片 String image = item.getImage(); if (StringUtils.isNoneBlank(image)){ //设置第一张图片 item.setImage(image.split(",")[0]); } //添加商品到购物车商品列表中 cartList.add(item); } //写入cookie中需要数据需要转换成json数据还有过期时间1个小时,还要编码实现 CookieUtils.setCookie(request,response,"cart",JsonUtils.objectToJson(cartList),COOKIE_CART_EXIPERE,true); //返回逻辑视图页面 return "cartSuccess"; }
/** *从cookie中取购物车列表的处理 * @auther: jun * @date: 2018/5/31 0031 19:47 * @param request * @return: java.util.List<com.e3mall.pojo.TbItem> * @Description: */ private List<TbItem> getCartListFromCookie(HttpServletRequest request){ //从cookie中取出数据时需要转码 String json = CookieUtils.getCookieValue(request, "cart", true); //判断json是否为空 if (StringUtils.isBlank(json)){ //避免空值 return new ArrayList<>(); } //返回List的商品列表 return JsonUtils.jsonToList(json