043 商品详情

[复制链接]
发表于 2025-12-23 17:17:49 | 显示全部楼层 |阅读模式
详情页数据

1.sku根本信息
2.sku图片信息(多个图片)
3.spu的贩卖属性
4.spu的形貌信息
5.sku分组规格参数属性值
表结构


vo

SkuItemVo.java

  1. package com.xd.cubemall.product.vo;
  2. import com.xd.cubemall.product.entity.SkuImagesEntity;
  3. import com.xd.cubemall.product.entity.SkuInfoEntity;
  4. import com.xd.cubemall.product.entity.SpuInfoDescEntity;
  5. import lombok.Data;
  6. import lombok.ToString;
  7. import java.util.List;
  8. @ToString
  9. @Data
  10. public class SkuItemVo {
  11.     //1.sku基本信息
  12.     private SkuInfoEntity info;
  13.     //2.sku图片信息
  14.     private List<SkuImagesEntity> images;
  15.     //3.spu的销售属性组合
  16.     private List<SkuItemSaleAttrVo> attrSales;
  17.     //4.spu描述信息
  18.     private SpuInfoDescEntity desc;
  19.     //5.spu分组(主体,基本信息...)规格属性
  20.     private List<SpuAttrGroupVo> attrGroups;
  21. }
复制代码
SkuItemSaleAttrVo.java

  1. package com.xd.cubemall.product.vo;
  2. import lombok.Data;
  3. import lombok.ToString;
  4. import java.util.List;
  5. @ToString
  6. @Data
  7. public class SkuItemSaleAttrVo {
  8.     private Long attrId;
  9.     private String attrName;
  10.     //属性值
  11.     private List<AttrValueAndSkuIdVo> attrValues;
  12. }
复制代码
AttrValueAndSkuIdVo.java

  1. package com.xd.cubemall.product.vo;
  2. import lombok.Data;
  3. import lombok.ToString;
  4. @ToString
  5. @Data
  6. public class AttrValueAndSkuIdVo {
  7.     // skuids组合id
  8.     private String skuIds;
  9.     // 属性值: 白色,128G
  10.     private String attrValue;
  11. }
复制代码
SpuAttrGroupVo.java

  1. package com.xd.cubemall.product.vo;
  2. import lombok.Data;
  3. import lombok.ToString;
  4. import java.util.List;
  5. @ToString
  6. @Data
  7. public class SpuAttrGroupVo {
  8.     private String groupName;
  9.     // 属性参数
  10.     private List<Attr> attrs;
  11. }
复制代码
GroupAttrParamVo.java

  1. package com.xd.cubemall.product.vo;
  2. import lombok.Data;
  3. import lombok.ToString;
  4. @ToString
  5. @Data
  6. public class GroupAttrParamVo {
  7.     private Long spuId;
  8.     private Long categoryId;
  9. }
复制代码
pom.xml

  1.         <!--添加模板技术渲染页面-->
  2.         <dependency>
  3.             <groupId>org.springframework.boot</groupId>
  4.             <artifactId>spring-boot-starter-thymeleaf</artifactId>
  5.         </dependency>
复制代码
  在MySQL中,当启用了ONLY_FULL_GROUP_BY SQL模式时,假如一个SELECT查询包罗聚合函数(如GROUP_CONCAT),那么全部非聚合的列都必须在GROUP BY子句中明白指定。这是由于ONLY_FULL_GROUP_BY模式要求全部的结果列要么是通过聚合函数处理处罚的,要么是在GROUP BY子句中明白指定的。
  从错误信息来看,查询试图在不使用GROUP BY子句的情况下选择非聚合列v.attr_id、v.attr_name和v.attr_value,同时还使用了聚合函数GROUP_CONCAT(v.sku_id)。这违背了ONLY_FULL_GROUP_BY的规则。
  为相识决这个题目,必要修改查询,添加一个GROUP BY子句,包罗全部非聚合的列。如许,每个组都会有唯一的attr_id、attr_name和attr_value,而GROUP_CONCAT则会将同一组内的sku_id毗连起来。

  SkuSaleAttrValueDao.xml

  1.     <resultMap id="spuSaleAttrMap" type="com.xd.cubemall.product.vo.SkuItemSaleAttrVo">
  2.         <result property="attrId" column="attr_id"></result>
  3.         <result property="attrName" column="attr_name"></result>
  4.         <collection property="attrValues" ofType="com.xd.cubemall.product.vo.AttrValueAndSkuIdVo">
  5.             <result property="skuIds" column="skuIds"></result>
  6.             <result property="attrValue" column="attr_value"></result>
  7.         </collection>
  8.     </resultMap>
  9.     <!--sql: tb_sku_info,tb_sku_sale_attr_value-->
  10.     <select id="getSaleAttrs" resultMap="spuSaleAttrMap" parameterType="java.lang.Long">
  11.         SELECT
  12.             v.attr_id,
  13.             v.attr_name,
  14.             v.attr_value,
  15.             GROUP_CONCAT( v.sku_id ) AS skuIds
  16.         FROM
  17.             tb_sku_info i
  18.                 LEFT JOIN tb_sku_sale_attr_value v ON i.id = v.sku_id
  19.         WHERE
  20.             spu_id = #{spuId}
  21.         GROUP BY
  22.             v.attr_id,
  23.             v.attr_name,
  24.             v.attr_value;
  25.     </select>
复制代码
SkuSaleAttrValueDao.java

  1. package com.xd.cubemall.product.dao;
  2. import com.xd.cubemall.product.entity.SkuSaleAttrValueEntity;
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.xd.cubemall.product.vo.SkuItemSaleAttrVo;
  5. import org.apache.ibatis.annotations.Mapper;
  6. import java.util.List;
  7. /**
  8. * sku销售属性值
  9. *
  10. * @author xuedong
  11. * @email email@gmail.com
  12. * @date 2024-08-13 01:36:04
  13. */
  14. @Mapper
  15. public interface SkuSaleAttrValueDao extends BaseMapper<SkuSaleAttrValueEntity> {
  16.     public List<SkuItemSaleAttrVo> getSaleAttrs(Long spuId);
  17. }
复制代码
AttrGroupDao.xml

  1.     <resultMap id="spuAttrGroupMap" type="com.xd.cubemall.product.vo.SpuAttrGroupVo">
  2.         <result property="groupName" column="groupName"></result>
  3.         <collection property="attrs" ofType="com.xd.cubemall.product.vo.Attr">
  4.             <result property="attrName" column="attrName"></result>
  5.             <result property="attrValue" column="attrValue"></result>
  6.         </collection>
  7.     </resultMap>
  8.     <!--SQL: 根据spuID,categoryId 查询 sku分组规格参数属性值-->
  9.     <select id="getGroupAttr" resultMap="spuAttrGroupMap" parameterType="com.xd.cubemall.product.vo.GroupAttrParamVo">
  10.         SELECT
  11.             g.NAME AS groupName,
  12.             v.attr_name AS attrName,
  13.             v.attr_value AS attrValue
  14.         FROM
  15.             tb_product_attr_value v
  16.                 JOIN tb_attr_attrgroup_relation r ON v.attr_id = r.attr_id
  17.                 JOIN tb_attr_group g ON r.attr_group_id = g.id
  18.         WHERE
  19.             spu_id = #{spuId}
  20.           AND g.category_id = #{categoryId}
  21.     </select>
复制代码
AttrGroupServiceImpl.java

  1.     //根据spuID,categoryId 查询 sku分组规格参数属性值
  2.     @Override
  3.     public List<SpuAttrGroupVo> getGroupAttr(Long spuId, Long categoryId) {
  4.         GroupAttrParamVo paramVo = new GroupAttrParamVo();
  5.         paramVo.setSpuId(spuId);
  6.         paramVo.setCategoryId(categoryId);
  7.         List<SpuAttrGroupVo> attrGroupVos = this.baseMapper.getGroupAttr(paramVo);
  8.         return attrGroupVos;
  9.     }
复制代码
SkuInfoServiceImpl.java

  1.     @Autowired
  2.     private SkuImagesService skuImagesService;
  3.     //注入销售属性组合服务
  4.     @Autowired
  5.     private SkuSaleAttrValueService skuSaleAttrValueService;
  6.     //注入spu描述服务
  7.     @Autowired
  8.     private SpuInfoDescService spuInfoDescService;
  9.     @Autowired
  10.     private AttrGroupService attrGroupService;
  11.     @Override
  12.     public SkuItemVo skuItem(Long skuId) {
  13.         // 新建一个包装类对象
  14.         SkuItemVo itemVo = new SkuItemVo();
  15.         /*
  16.         1.sku基本信息
  17.         2.sku图片信息(多个图片)
  18.         3.spu的销售属性
  19.         4.spu的描述信息
  20.         5.sku分组规格参数属性值
  21.          */
  22.         // 1.根据skuId 查询 sku基本信息
  23.         SkuInfoEntity skuInfoEntity = this.getById(skuId);
  24.         itemVo.setInfo(skuInfoEntity);
  25.         // 获取sku与之对应的spuId
  26.         Long spuId = skuInfoEntity.getSpuId();
  27.         // 获取分类id
  28.         Long categoryId = skuInfoEntity.getCategoryId();
  29.         // 2.根据skuId查询sku图片信息(多个图片),skuId是外键
  30.         List<SkuImagesEntity> imageList = skuImagesService.list(new QueryWrapper<SkuImagesEntity>().eq("sku_id", skuId));
  31.         itemVo.setImages(imageList);
  32.         //3.根据spuID获取spu的销售属性
  33.         List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrs(spuId);
  34.         itemVo.setAttrSales(saleAttrVos);
  35.         //4.根据spuId查询spu的描述信息
  36.         SpuInfoDescEntity spuInfoDescEntity = spuInfoDescService.getOne(new QueryWrapper<SpuInfoDescEntity>().eq("spu_id",spuId));
  37.         itemVo.setDesc(spuInfoDescEntity);
  38.         //5.根据spuID,categoryId查询 sku分组规格参数属性值
  39.         List<SpuAttrGroupVo> attrGroupVos = attrGroupService.getGroupAttr(spuId,categoryId);
  40.         itemVo.setAttrGroups(attrGroupVos);
  41.         return itemVo;
  42.     }
复制代码
SkuSaleAttrValueServiceImpl.java

  1.     /**
  2.      * 根据id查询销售属性组合
  3.      * @param spuId
  4.      * @return
  5.      */
  6.     @Override
  7.     public List<SkuItemSaleAttrVo> getSaleAttrs(Long spuId) {
  8.         //List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrs(spuId);
  9.         List<SkuItemSaleAttrVo> saleAttrVos = this.baseMapper.getSaleAttrs(spuId);
  10.         return saleAttrVos;
  11.     }
复制代码
AttrGroupDao.java

  1. package com.xd.cubemall.product.dao;
  2. import com.xd.cubemall.product.entity.AttrGroupEntity;
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.xd.cubemall.product.vo.GroupAttrParamVo;
  5. import com.xd.cubemall.product.vo.SpuAttrGroupVo;
  6. import org.apache.ibatis.annotations.Mapper;
  7. import java.util.List;
  8. /**
  9. * 属性分组表
  10. *
  11. * @author xuedong
  12. * @email email@gmail.com
  13. * @date 2024-08-13 01:36:04
  14. */
  15. @Mapper
  16. public interface AttrGroupDao extends BaseMapper<AttrGroupEntity> {
  17.     //根据spuID,categoryId 查询 sku分组规格参数属性值
  18.     public List<SpuAttrGroupVo> getGroupAttr(GroupAttrParamVo paramVo);
  19. }
复制代码
SkuSaleAttrValueDao.java

  1. package com.xd.cubemall.product.dao;
  2. import com.xd.cubemall.product.entity.SkuSaleAttrValueEntity;
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.xd.cubemall.product.vo.SkuItemSaleAttrVo;
  5. import org.apache.ibatis.annotations.Mapper;
  6. import java.util.List;
  7. /**
  8. * sku销售属性值
  9. *
  10. * @author xuedong
  11. * @email email@gmail.com
  12. * @date 2024-08-13 01:36:04
  13. */
  14. @Mapper
  15. public interface SkuSaleAttrValueDao extends BaseMapper<SkuSaleAttrValueEntity> {
  16.     public List<SkuItemSaleAttrVo> getSaleAttrs(Long spuId);
  17. }
复制代码
SkuItemController.java

  1. package com.xd.cubemall.product.web;
  2. import com.xd.cubemall.product.service.SkuInfoService;
  3. import com.xd.cubemall.product.vo.SkuItemVo;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.Model;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. import org.springframework.web.bind.annotation.PathVariable;
  10. import org.springframework.web.bind.annotation.RestController;
  11. @Slf4j
  12. @Controller
  13. public class SkuItemController {
  14.     @Autowired
  15.     private SkuInfoService skuInfoService;
  16.     /**
  17.      * 根据skuId查询商品详情信息
  18.      */
  19.     @GetMapping("/{skuId}.html")
  20.     public String skuItem(@PathVariable Long skuId, Model model){
  21.         // 调用服务层商品详情接口
  22.         SkuItemVo itemVo = skuInfoService.skuItem(skuId);
  23.         // 输出日志日志
  24.         log.info("商品详情接口,查询的数据:{}",itemVo);
  25.         // 把数据放入模型驱动
  26.         model.addAttribute("item",itemVo);
  27.         // 返回视图页面,做视图数据渲染
  28.         return "item";
  29.     }
  30. }
复制代码
默认

  1.                                     <a href="javascript:;" th:attr="class=${#lists.contains(#strings.listSplit(attrvalues.skuIds,','),item.info.id.toString())?'sku_attr_value selected':'sku_attr_value'},skus=${attrvalues.skuIds}">
  2.         <!--th:v-bind:class="|{selected:sel('${spec.key}','${arrValue}')}|"-->
  3. <!--                                       th:@click="|selectSpecification('${spec.key}','${arrValue}')|" >-->
  4. <!--                                        <i th:text="${arrValue}"></i>-->[[${attrvalues.attrValue}]]
  5.                                         <span title="点击取消选择">&nbsp;</span>
  6.                                     </a>
复制代码
点击选中

  1.     $(".sku_attr_value").click(function () {
  2.         // 移除选中状态
  3.         $(this).parent().parent().find(".sku_attr_value").removeClass("selected");
  4.         // 给点击元素添加选中状态属性
  5.         $(this).addClass("selected");
  6.         let skus = new Array();
  7.         //选择不同的规格属性后,根据不同的属性id重新加载相应的数据
  8.         $("a[class='sku_attr_value selected']").each(function () {
  9.             skus.push($(this).attr("skus").split(","));
  10.         })
  11.         // 获取第0个元素
  12.         let sku_1 = skus[0];
  13.         // 白色: skuIds  = {1,3}
  14.         // 128GB : skuIds = {3,9}
  15.         // 白色+128GB 规则属性组合的id : 求交集 ,skuId = 3
  16.         for(let i=1;i<skus.length;i++){
  17.             // 遍历每一个属性的skuids,获取交集
  18.             // 比如:白色: skuIds  = {1,3},128GB : skuIds = {3,9} ,此时: {1,3}.filter({3,9}) = 3
  19.             sku_1 = $(sku_1).filter(skus[i])[0];
  20.         }
  21.         // 拼接请求
  22.         location.href = "http://localhost:8081/"+sku_1+".html";
  23.     })
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表