商品详情页

实体类分析

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

public class ItemVO {
    // 商品信息
    private PmsSkuInfo skuInfo;
    // 商品图片
    private List<PmsSkuImages> skuImages;
    // 商品介绍图
    private PmsSpuInfoDesc spuInfoDesc;
    // 销售属性
    private List<skuItemSaleAttrVO> saleAttr;
    // 商品规格
    private List<SpuItemAttrVO> 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<SpuItemBaseAttr> spuItemBaseAttrs;

        public String getGroupName() {
            return groupName;
        }

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

        public List<SpuItemBaseAttr> getSpuItemBaseAttrs() {
            return spuItemBaseAttrs;
        }

        public void setSpuItemBaseAttrs(List<SpuItemBaseAttr> 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<String> 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<String> getAttrValue() {
            return attrValue;
        }

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

    public PmsSkuInfo getSkuInfo() {
        return skuInfo;
    }

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

    public List<PmsSkuImages> getSkuImages() {
        return skuImages;
    }

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

    public PmsSpuInfoDesc getSpuInfoDesc() {
        return spuInfoDesc;
    }

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

    public List<skuItemSaleAttrVO> getSaleAttr() {
        return saleAttr;
    }

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

    public List<SpuItemAttrVO> getSpuItemAttrs() {
        return spuItemAttrs;
    }

    public void setSpuItemAttrs(List<SpuItemAttrVO> 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()函数可以将分组属性中的多种值显示出来
根据

    <select id="getSaleAttrsBySpuId" resultType="com.lyra.mail.product.entity.vo.skuItemSaleAttrVO">
        select t2.attr_id as attrId, t2.attr_name as attrName, group_concat(distinct t2.attr_value) as attrValue
        from pms_sku_info t1
                 left join pms_sku_sale_attr_value t2 on t2.sku_id = t1.sku_id
        where t1.spu_id = #{spuId}
        group by t2.attr_id
    </select>

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

    <select id="selectAttrGroupWithAttrsBySpuId"
            resultMap="SpuItemAttrVoResultMap">
        select t4.spu_id, t1.attr_group_name as group_ame, t1.attr_group_id, t3.attr_id, t3.attr_name as attr_name, t4.attr_value
        from pms_attr_group t1
                 left join pms_attr_attrgroup_relation t2 on t2.attr_group_id = t1.attr_group_id
                 left join pms_attr t3 on t3.attr_id = t2.attr_id
                 left join pms_product_attr_value t4 on t4.attr_id = t3.attr_id
        where t1.catelog_id = #{categoryId}
          and t4.spu_id = #{spuId}
    </select>
    public ItemVO item(Long skuId) {
        ItemVO itemVO = new ItemVO();

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

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

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


        List<ItemVO.SpuItemAttrVO> spuItemAttrVOS = attrGroupService.getAttrGroupWithAttrsBySpuId(spuId, pmsSkuInfo.getCatalogId());
        itemVO.setSpuItemAttrs(spuItemAttrVOS);

        List<ItemVO.skuItemSaleAttrVO> skuItemSaleAttrVOS = skuSaleAttrValueService.getSaleAttrsBySpuId(spuId);
        itemVO.setSaleAttr(skuItemSaleAttrVOS);

        return itemVO;
    }
posted @   RainbowMagic  阅读(247)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示