购物车功能开发-查看我的购物车接口

DBC 1.6K 0
我们从接口调用开始理解思路
    @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;
    }
由于之前的对象中都已经进行了各种加法操作返回,所以这里代码看起来会非常的简洁!

发表评论 取消回复
表情 图片 链接 代码

分享