我们从接口调用开始理解思路
@ApiOperation("查看我的购物车") @GetMapping("/mycart") public JsonData findMyCart(){ CartVO cartVO = cartService.getMyCart(); return JsonData.buildSuccess(cartVO); }
我们来看看这个总方法
@Override public CartVO getMyCart() { //获取全部购物项 List<CartItemVO> cartItemVOList = buildCartItem(false); //封装成cartvo CartVO cartVO = new CartVO(); cartVO.setCartItems(cartItemVOList); return cartVO; }
注释很完全
/** * 获取最新的购物项, * @param latestPrice 是否获取最新价格 * @return */ private List<CartItemVO> buildCartItem(boolean latestPrice) { //这个很明显 是抽取当前的我的购物车 BoundHashOperations<String,Object,Object> myCart = getMyCartOps(); //获取到全部的购物项 List<Object> itemList = myCart.values(); List<CartItemVO> cartItemVOList = new ArrayList<>(); //拼接id列表查询最新价格 List<Long> productIdList = new ArrayList<>(); //此操作是将在Redis上的json格式的购物车转成对象模式 for(Object item: itemList){ CartItemVO cartItemVO = JSON.parseObject((String)item,CartItemVO.class); cartItemVOList.add(cartItemVO); //这个位置较有操作:因为在购物车上的数据是从Redis拉取下来的缓存,所以可能后台数据库的商品金额发生了改变 //所以这里进行下面的这个操作 productIdList.add(cartItemVO.getProductId()); } //判断是否需要——查询最新的商品价格 if(latestPrice){ //这个查询购物车,可以不用到这个操作 setProductLatestPrice(cartItemVOList,productIdList); } return cartItemVOList; }
获取最新价格——setProductLatestPrice()这个方法操作较为优雅,需要仔细看!
/** * 设置商品最新价格 * @param cartItemVOList * @param productIdList */ private void setProductLatestPrice(List<CartItemVO> cartItemVOList, List<Long> productIdList) { //批量查询 List<ProductVO> productVOList = productService.findProductsByIdBatch(productIdList); //分组 此操作优雅酷炫,直接将productVOList变成了一个根据ProductVO.getId作为标识的map,通过操作map的标识操作其中的对象 Map<Long,ProductVO> maps = productVOList.stream().collect(Collectors.toMap(ProductVO::getId, Function.identity())); //这里就是对cartItemVOList之前传进来的老对象(老商品)进行修改名字、图片、价格,也是较优雅的操作 cartItemVOList.stream().forEach(item->{ ProductVO productVO = maps.get(item.getProductId()); item.setProductTitle(productVO.getTitle()); item.setProductImg(productVO.getCoverImg()); item.setAmount(productVO.getAmount()); }); }
还有一个批量查询的小方法,看了前面的,这个应该很简单了
/** * 批量查询 * @param productIdList * @return */ @Override public List<ProductVO> findProductsByIdBatch(List<Long> productIdList) { List<ProductDO> productDOList = productMapper.selectList(new QueryWrapper<ProductDO>().in("id",productIdList)); List<ProductVO> productVOList = productDOList.stream().map(obj->beanProcess(obj)).collect(Collectors.toList()); return productVOList; }
由于之前的对象中都已经进行了各种加法操作返回,所以这里代码看起来会非常的简洁!
本文作者为DBC,转载请注明。