商城业务:商品详情

简介: 商城业务:商品详情

商品详情SkuItemVo

1. @Data
2. public class SkuItemVo {
3. 
4. /*** 1 sku基本信息的获取:如标题*/
5.     SkuInfoEntity info;
6. 
7. boolean hasStock = true;
8. 
9. /*** 2 sku的图片信息*/
10.     List<SkuImagesEntity> images;
11. 
12. /*** 3 获取spu的销售属性组合。每个attrName对应一个value-list*/
13.     List<SkuItemSaleAttrVo> saleAttr;
14. 
15. /*** 4 获取spu的介绍*/
16.     SpuInfoDescEntity desc;
17. 
18. /*** 5 获取spu的规格参数信息,每个分组的包含list*/
19.     List<SpuItemAttrGroupVo> groupAttrs;
20. 
21. 
22. }

SkuItemSaleAttrVo

1. @Data
2. public    class  SkuItemSaleAttrVo{
3. private  Long attrId;
4. private  String attrName;
5. private List<AttrValueWithSkuIdVo> attrValues;
6. }

SpuItemAttrGroupVo

1. @Data
2. public  class  SpuItemAttrGroupVo{
3. private  String groupName;
4. private List<SpuBaseAttrVo> attrs;
5. }

SpuBaseAttrVo

1. @Data
2. public   class  SpuBaseAttrVo{
3. private  String attrName;
4. private  String attrValue;
5. }

控制层Controller

1. @Controller
2. public class itemController {
3. 
4. 
5. @Autowired
6.     SkuInfoService skuInfoService;
7. 
8. /**
9.      * 展示当前sku的详情
10.      * @param skuId
11.      * @return
12.      */
13. @GetMapping("/{skuId}.html")
14. public String skuItem(@PathVariable("skuId") Long skuId, Model model){
15. 
16.         System.out.println("准备查询"+skuId+"详情");
17.          SkuItemVo vo= skuInfoService.item(skuId);
18.          model.addAttribute("item",vo);
19. return "item";
20.     }
21. }

配置类

ThreadPoolConfigProperties

1. @ConfigurationProperties(prefix = "gulimall.thread")
2. @Component
3. @Data
4. public class ThreadPoolConfigProperties {
5. private  Integer coreSize;
6. private Integer maxSize;
7. private  Integer keepAliveTime;
8. }

MyThreadConfig

1. @Configuration
2. public class MyThreadConfig {
3. 
4. @Bean
5. public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool){
6. return    new ThreadPoolExecutor(pool.getCoreSize(),pool.getMaxSize(),pool.getKeepAliveTime(),
7.                 TimeUnit.SECONDS,
8. new LinkedBlockingDeque<>(1000),
9.                 Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
10.     }
11. }

 

skuInfoService.item实现

1. @Override
2. public SkuItemVo item(Long skuId) {
3. SkuItemVo skuItemVo = new SkuItemVo();
4. //1.sku基本属性的获取 pms_sku_info
5.         CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {
6. SkuInfoEntity info = getById(skuId);
7.             skuItemVo.setInfo(info);
8. return info;
9.         }, executor);
10. //2.sku的图片信息 pms_sku_images
11. 
12.         CompletableFuture<Void> imgeFuture = CompletableFuture.runAsync(() -> {
13.             List<SkuImagesEntity> images = imagesService.getImagesBySKuId(skuId);
14.             skuItemVo.setImages(images);
15.         }, executor);
16. 
17. //3.获取spu的销售属性组合
18.         CompletableFuture<Void> attrFuture = infoFuture.thenAcceptAsync((res) -> {
19.             List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrsBySpuId(res.getSpuId());
20.             skuItemVo.setSaleAttr(saleAttrVos);
21.         }, executor);
22. 
23. //4.获取spu的介绍 pms_spu_info_desc
24.         CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync((res) -> {
25. SpuInfoDescEntity spuInfo = spuInfoDescService.getById(res.getSpuId());
26.             skuItemVo.setDesc(spuInfo);
27.         }, executor);
28. 
29. 
30. //5.获取spu的规格参数信息
31.         CompletableFuture<Void> spuFuture = infoFuture.thenAcceptAsync((res) -> {
32.             List<SpuItemAttrGroupVo> attrGroupVos = attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(), res.getCatalogId());
33.             skuItemVo.setGroupAttrs(attrGroupVos);
34.         }, executor);
35. 
36. try {
37.             CompletableFuture.allOf(infoFuture,imgeFuture,descFuture,spuFuture,attrFuture).get();
38.         } catch (InterruptedException e) {
39.             e.printStackTrace();
40.         } catch (ExecutionException e) {
41.             e.printStackTrace();
42.         }
43. return  skuItemVo;
44.     }

imagesService.getImagesBySKuId

1. @Override
2. public List<SkuImagesEntity> getImagesBySKuId(Long skuId) {
3. SkuImagesDao imagesDao = this.baseMapper;
4.         List<SkuImagesEntity> imagesEntities = imagesDao.selectList(new QueryWrapper<SkuImagesEntity>().eq("sku_id", skuId));
5. 
6. return imagesEntities;
7.     }

skuSaleAttrValueService.getSaleAttrsBySpuId

1. @Override
2. public List<SkuItemSaleAttrVo> getSaleAttrsBySpuId(Long spuId) {
3. SkuSaleAttrValueDao dao = this.baseMapper;
4.         List<SkuItemSaleAttrVo> saleAttrVos= dao.getSaleAttrsBySpuId(spuId);
5. return saleAttrVos;
6.     }

dao.getSaleAttrsBySpuId

 

<resultMap id="SkuItemSaleAttrVo" type="com.atguigu.gulimall.product.vo.SkuItemSaleAttrVo">
    <result column="attr_id" property="attrId"></result>
    <result column="attr_name" property="attrName"></result>
    <collection property="attrValues" ofType="com.atguigu.gulimall.product.vo.AttrValueWithSkuIdVo">
        <result column="attr_value" property="attrValue"></result>
        <result column="sku_ids" property="skuIds"></result>
    </collection>
</resultMap>
<select id="getSaleAttrsBySpuId" resultMap="SkuItemSaleAttrVo">
    SELECT ssav.`attr_id`,ssav.`attr_name`,ssav.`attr_value`,
           GROUP_CONCAT(DISTINCT info.`sku_id`) sku_ids
    FROM `pms_sku_info` info LEFT JOIN `pms_sku_sale_attr_value` ssav
                                       ON ssav.`sku_id` = info.`sku_id`
    WHERE info.`spu_id` = #{spuId}
    GROUP BY ssav.`attr_id`,ssav.`attr_name`,ssav.`attr_value`
</select>

attrGroupService.getAttrGroupWithAttrsBySpuId

 

1. @Override
2. public List<SpuItemAttrGroupVo> getAttrGroupWithAttrsBySpuId(Long spuId, Long catalogId) {
3. //1.查出当前spu对应的所有属性的分组信息以及当前分组下所有属性对应的值
4. 
5. AttrGroupDao baseMapper = this.getBaseMapper();
6.         List<SpuItemAttrGroupVo> vos =   baseMapper.getAttrGroupWithAttrsBySpuId(spuId,catalogId);
7. return  vos;
8.     }

baseMapper.getAttrGroupWithAttrsBySpuId(spuId,catalogId)

  • pms_product_attr_value 根据spu_id获得spu相关属性
  • pms_attr_attrgroup_relation根据catelog_id获得属性的分组

 

<resultMap id="SpuItemAttrGroupVo" type="com.atguigu.gulimall.product.vo.SpuItemAttrGroupVo">
    <result column="attr_group_name" property="groupName" javaType="string"></result>
    <collection property="attrs" ofType="com.atguigu.gulimall.product.vo.SpuBaseAttrVo">
        <result column="attr_name" property="attrName" javaType="string"></result>
        <result column="attr_value" property="attrValue" javaType="string"></result>
    </collection>
</resultMap>

 

<select id="getAttrGroupWithAttrsBySpuId"
        resultMap="SpuItemAttrGroupVo">
    SELECT pav.`spu_id`, ag.`attr_group_name`, ag.`attr_group_id`, 
           aar.`attr_id`, attr.`attr_name`,pav.`attr_value`
    FROM `pms_attr_group` ag
             LEFT JOIN `pms_attr_attrgroup_relation` aar 
                 ON aar.`attr_group_id` = ag.`attr_group_id`
             LEFT JOIN `pms_attr` attr 
                 ON attr.`attr_id` = aar.`attr_id`
             LEFT JOIN `pms_product_attr_value` pav 
                 ON pav.`attr_id` = attr.`attr_id`
    WHERE ag.catelog_id = #{catalogId} AND pav.`spu_id` = #{spuId}
</select>

前端js代码

1.         $(".sku_attr_value").click(function () {
2. // 1、点击的元素添加上自定义的属性
3. let skus = new Array();
4. let curr = $(this).attr("skus").split(",");
5. //去掉同一行的所有的check标签
6.             $(this).parent().parent().find(".sku_attr_value").removeClass("checked");
7.             $(this).addClass("checked");
8.             changeCheckedStyle();
9. 
10.             $("a[class='sku_attr_value checked']").each(function () {
11.                 skus.push($(this).attr("skus").split(","));
12.             });
13. //取出交集得到skuId
14. let filterEle = skus[0];
15. for (let i = 1; i < skus.length; i++) {
16.                 filterEle = $(filterEle).filter(skus[i])[0];
17.             }
18. 
19.             location.href = "http://item.gulimall.com/" + filterEle + ".html";
20. 
21. return false;
22.         });
23.         $(function () {
24.             changeCheckedStyle();
25.         });
26. 
27.         function changeCheckedStyle() {
28.             $(".sku_attr_value").parent().css({"border": "solid 1px #ccc"});
29.             $("a[class='sku_attr_value checked']").parent().css({"border": "solid 1px red"});
30.         };


相关文章
|
XML JSON API
淘宝天猫API接入说明(淘宝天猫商品详情+关键词搜索商品列表)商品详情数据,商品sku数据,商品优惠券数据
业务场景:作为全球最大的 B2C 电子商务平台之一,淘宝天猫平台提供了丰富的商品资源,吸引了大量的全球买家和卖家。为了方便开发者接入淘宝天猫平台,淘宝天猫平台提供了丰富的 API 接口,其中历史价格接口是非常重要的一部分。大家有探讨稳定采集淘宝(天猫)京东阿里拼多多等平台整站实时商品详情历史价格数据接口,通过该接口开发者可以更好地了解商品的情况,商品详情数据详细信息查询,数据参数包括:商品链接,商品列表主图、价格、标题,sku,库存,销量,店铺昵称,店铺等级,商品详情SKU属性,商品视频,商品优惠券,促销信息,详情属性描述,宝贝ID,区域ID,发货地,发货至,快递费用,物流费用等页面上有的数据
|
2天前
|
JSON API 数据处理
如何运用获得京东商品详情API接口搬运商品到自己的电商平台?(一篇文章全搞定)
本文介绍如何利用京东商品详情API接口,将商品信息高效搬运至第三方电商平台。主要内容包括:前期准备(注册账号、申请权限、阅读文档、技术准备),API接口调用(构造请求URL、发送请求、解析返回数据、调用频率限制),数据处理与上架(清洗整理、分类设置、信息上传、商品审核),定时更新与维护(更新商品信息、信息维护、错误处理与日志记录),以及案例分析和优化建议。通过合理使用该接口,可提高运营效率,丰富商品种类,增强平台竞争力。
27 13
|
5天前
|
监控 搜索推荐 API
京东商品详情API接口的开发、应用与收益探索
在数字化和互联网高速发展的时代,京东通过开放商品详情API接口,为开发者、企业和商家提供了丰富的数据源和创新空间。本文将探讨该API接口的开发背景、流程、应用场景及带来的多重收益,包括促进生态系统建设、提升数据利用效率和推动数字化转型等。
19 3
|
1月前
|
监控 供应链 API
淘宝京东商品详情页接口
淘宝和京东提供API接口,让开发者能获取商品详情,包括标题、价格、库存等,用于数据分析、价格监控等。淘宝通过开放平台注册获取API密钥,调用如taobao.item.get接口;京东则有item_get接口,获取基础信息、价格等。第三方服务商如鼎点数据也提供多平台API服务,具备高效、稳定、合规等优点,但需注意数据安全和技术支持。
|
3月前
|
XML JSON API
淘宝商品详情API接口:获取商品信息的指南
淘宝详情API接口是淘宝开放平台提供的一种API接口,它允许开发者通过编程方式获取淘宝商品的详细信息。这些信息包括商品的基本属性、价格、库存状态、销售策略、卖家信息等,对于电商分析、市场研究或者商品信息管理等场景非常有用。
210 1
|
5月前
|
数据采集 供应链 API
电商商品详情数据和店铺所有商品数据
电商商品详情数据和店铺所有商品数据是电商运营中至关重要的两部分数据,它们对于商家来说具有极高的商业价值。以下是对这两部分数据的详细解析:
|
4月前
|
JSON 数据挖掘 API
Lazada商品详情接口详解
Lazada是东南亚领先的电商平台,其API让开发者能自动化获取商品信息及分析数据。开发者需先注册获取API密钥,并阅读API文档了解接口使用方法。通过类似`item_get`的接口,可按商品ID请求详细信息。示例展示了使用Python和requests库获取商品详情的过程,包括设置参数和解析响应数据。注意API使用限制、数据安全及适时更新程序以应对API变动。
|
6月前
|
XML 监控 API
淘宝商品详情数据接口全攻略:如何高效获取与分析商品信息
【淘宝商品详情数据接口全攻略】:注册开发者账号,申请API权限,构建HTTP请求获取商品信息,包括基础属性、价格等。遵循规则,处理并分析数据,用于竞品分析、价格监控和用户行为洞察。利用接口高效获取数据,助力电商决策。#淘宝API #数据分析
|
6月前
|
API 开发者
淘宝商品详情接口如何实现竞品分析
使用淘宝商品详情接口,你可以获取到竞品的多项数据,包括商品的标题、价格、库存、销量、评价等。 特别注意竞品的详情页、评价、主图、SKU逻辑、入店词和成交词等关键信息,这些都是竞品分析的重要数据点。
|
7月前
|
监控 数据挖掘 API
淘宝商品详情数据(商品分析,竞品分析,代购商城建站与跨境电商,ERP系统商品数据选品)
淘宝商品详情数据在多个业务场景中发挥着关键作用,以下是一些主要的应用场景
下一篇
DataWorks