商品详情页
实体类分析
首先在商品详情页要获取的数据有如下被框住的部分:
首先是商品详情 分为商品商品名称 商品价格 默认图片
其次是商品图片
在然后是商品规格属性如颜色和版本
最后还有商品是否有货
还有商品介绍图以及规格
最后的实体类如下所示
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;
}
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律