商品详情页


实体类分析

首先在商品详情页要获取的数据有如下被框住的部分:
首先是商品详情 分为商品商品名称 商品价格 默认图片
其次是商品图片
在然后是商品规格属性如颜色和版本
最后还有商品是否有货

还有商品介绍图以及规格

最后的实体类如下所示

public class ItemVO {
    // 商品信息
    private PmsSkuInfo skuInfo;
    // 商品图片
    private List skuImages;
    // 商品介绍图
    private PmsSpuInfoDesc spuInfoDesc;
    // 销售属性
    private List saleAttr;
    // 商品规格
    private List spuItemAttrs;

    private Boolean hasStock = true;

    public Boolean getHasStock() {
        return hasStock;
    }

    public void setHasStock(Boolean hasStock) {
        this.hasStock = hasStock;
    }

    public static class SpuItemAttrVO {
        // 属性组名称 如主体
        private String groupName;
        // 组下的不同属性 如品牌 型号等
        private List spuItemBaseAttrs;

        public String getGroupName() {
            return groupName;
        }

        public void setGroupName(String groupName) {
            this.groupName = groupName;
        }

        public List getSpuItemBaseAttrs() {
            return spuItemBaseAttrs;
        }

        public void setSpuItemBaseAttrs(List spuItemBaseAttrs) {
            this.spuItemBaseAttrs = spuItemBaseAttrs;
        }
    }

    public static class SpuItemBaseAttr {
        // 属性名称
        private String attrName;
        // 属性值
        private String attrValue;

        public String getAttrName() {
            return attrName;
        }

        public void setAttrName(String attrName) {
            this.attrName = attrName;
        }

        public String getAttrValue() {
            return attrValue;
        }

        public void setAttrValue(String attrValue) {
            this.attrValue = attrValue;
        }
    }

    public static class skuItemSaleAttrVO {
        //销售属性id
        private Long attrId;
        // 销售属性名称
        private String attrName;
        // 销售属性值 因为销售属性是一对多的 比如一个颜色分类下有多个不同的颜色, 比如销售版本有128GB 64GB
        private List attrValue;

        public Long getAttrId() {
            return attrId;
        }

        public void setAttrId(Long attrId) {
            this.attrId = attrId;
        }

        public String getAttrName() {
            return attrName;
        }

        public void setAttrName(String attrName) {
            this.attrName = attrName;
        }

        public List getAttrValue() {
            return attrValue;
        }

        public void setAttrValue(List attrValue) {
            this.attrValue = attrValue;
        }
    }

    public PmsSkuInfo getSkuInfo() {
        return skuInfo;
    }

    public void setSkuInfo(PmsSkuInfo skuInfo) {
        this.skuInfo = skuInfo;
    }

    public List getSkuImages() {
        return skuImages;
    }

    public void setSkuImages(List skuImages) {
        this.skuImages = skuImages;
    }

    public PmsSpuInfoDesc getSpuInfoDesc() {
        return spuInfoDesc;
    }

    public void setSpuInfoDesc(PmsSpuInfoDesc spuInfoDesc) {
        this.spuInfoDesc = spuInfoDesc;
    }

    public List getSaleAttr() {
        return saleAttr;
    }

    public void setSaleAttr(List saleAttr) {
        this.saleAttr = saleAttr;
    }

    public List getSpuItemAttrs() {
        return spuItemAttrs;
    }

    public void setSpuItemAttrs(List spuItemAttrs) {
        this.spuItemAttrs = spuItemAttrs;
    }
}

业务实现

实现思路: 首先根源skuId查询sku信息 这样就可以将sku价格和sku标题 副标题 以及默认图片查询出来
之后在表pms_sku_images中根据sku将sku图片查询出来, 这样以来商品图片也查询到了
在sku信息中有封装spuId所以根据spuId查询商品详情图

之后两步就有些复杂了
获取销售属性
首先销售属性信息保存在三张表中 分别是pms_sku_info sku信表
pms_sku_sale_attr_value sku中存储商品的skuId和与之对应的attr_id 属性id, 属性名称 属性值
首先根据spuId查询到spu信息 然后做连接pms_sku_sale_attr_value根据sku_id查询销售属性
group_concat()函数可以将分组属性中的多种值显示出来
根据

    

商品属性
首先根据三级分类id查到该分类信息 然后左连接根据组查询查询该三级分类下的所有组, 然后根据上一步查到的属性id 左连接查询属性,
然后根据属性id查询属性下的值, 最后关联spuId查询

    
    public ItemVO item(Long skuId) {
        ItemVO itemVO = new ItemVO();

        PmsSkuInfo pmsSkuInfo = skuInfoMapper.selectById(skuId);
        itemVO.setSkuInfo(pmsSkuInfo);

        List skuImages = skuImagesService.getSkuImagesBySkuId(skuId);
        itemVO.setSkuImages(skuImages);

        Long spuId = pmsSkuInfo.getSpuId();
        PmsSpuInfoDesc spuInfoDesc = spuInfoDescService.getDesc(spuId);
        itemVO.setSpuInfoDesc(spuInfoDesc);


        List spuItemAttrVOS = attrGroupService.getAttrGroupWithAttrsBySpuId(spuId, pmsSkuInfo.getCatalogId());
        itemVO.setSpuItemAttrs(spuItemAttrVOS);

        List skuItemSaleAttrVOS = skuSaleAttrValueService.getSaleAttrsBySpuId(spuId);
        itemVO.setSaleAttr(skuItemSaleAttrVOS);

        return itemVO;
    }