8.商品详情

该博客主要介绍了如何在后端通过CompletableFuture实现商品详情页面的异步加载,提升前端展示效率。首先,前端点击商品携带skuid跳转,后端接收到请求后,利用异步任务分别查询sku的基础信息、销售属性、规格参数、图片信息,并通过Model传递给前端item.html页面。整个过程优化了查询流程,提高了系统性能。
摘要由CSDN通过智能技术生成

前端点击商品,携带skuid跳转到商品详情页
后端接收

    /**
     * 展示当前sku的详情
     * @param skuId
     * @return
     */
    @GetMapping("/{skuId}.html")
    public String skuItem(@PathVariable("skuId") Long skuId, Model model) throws ExecutionException, InterruptedException {

        System.out.println("准备查询" + skuId + "详情");

        SkuItemVo vos = skuInfoService.item(skuId);

        model.addAttribute("item",vos);

        return "item";
    }

调用item方法查询,数据封装到SkuItemVo ,存到model传给前端页面item.html。
item方法

    //查询商品详情,采用异步
    @Override
    public SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException {
        SkuItemVo skuItemVo = new SkuItemVo();
        //第一个异步任务,先查询基础sku属性
        CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {
            //1、sku基本信息的获取  pms_sku_info
            SkuInfoEntity skuInfoEntity = this.getById(skuId);
            skuItemVo.setInfo(skuInfoEntity);
            return skuInfoEntity;
        }, threadPoolExecutor);
        //通过查到的sku信息获取到spuid,进行下一步查询,这里用到异步,要先查出sku信息,再进行下一步查询
        CompletableFuture<Void> saleFuture = infoFuture.thenAcceptAsync((res) -> {
            //3、获取spu的销售属性组合  就是 4+128G这种 数据库表pms_sku_sale_attr_value
            List<SkuItemSaleAttrVo> saleAttrVos =
                    skuSaleAttrValueService.getSaleAttrBySpuId(res.getSpuId());
            skuItemVo.setSaleAttr(saleAttrVos);
        }, threadPoolExecutor);
        //通过查到的sku信息获取到spuid,进行下一步查询,这里用到异步,要先查出sku信息,再进行下一步查询
        CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync((res) -> {
            //4、通过spuid获取spu的介绍    pms_spu_info_desc
            SpuInfoDescEntity spuInfoDescEntity = spuInfoDescService.getById(res.getSpuId());
            skuItemVo.setDesc(spuInfoDescEntity);
        }, threadPoolExecutor);
        //通过查到的sku信息获取到spuid,进行下一步查询,这里用到异步,要先查出sku信息,再进行下一步查询
        CompletableFuture<Void> baseAttrFuture = infoFuture.thenAcceptAsync((res) -> {
            //5、获取spu的规格参数信息
            List<SpuItemAttrGroupVo> attrGroupVos =
                    attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(),
                            res.getCatalogId());
            skuItemVo.setGroupAttrs(attrGroupVos);
        }, threadPoolExecutor);

        //这里图片信息和前面的查询无关,所以直接运行就行。
        CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> {
            //2、获取图片信息
            List<SkuImagesEntity> skuImagesEntities = skuImagesService.getImagesBySkuId(skuId);
            skuItemVo.setImages(skuImagesEntities);
        }, threadPoolExecutor);

        //allof 等待所有任务都完成,然后返回skuItemVo
        CompletableFuture.allOf(saleFuture,descFuture,baseAttrFuture,imageFuture).get();

        return skuItemVo;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值