我们从接口调用开始理解思路
@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,转载请注明。