Skip to content

1 SKU ​

学习了SPU相关的数据和操作,我们接着学习SKU,相比于SPU而言,SKU表示更为具体的商品,包含了更多的数据。

  • SKU商品具有价格,以及默认的显示图片,以及所属的spu,所属类目,品牌等等
  • 属于SPU的一组确定的销售属性取值(对于一个手机sku来说,比如具体的颜色值幻夜星河,具体的版本值8G+256G)
  • 因为SKU仍然属于某一个商品类目,所以还具有一组平台属性取值
  • 属于一个sku商品的一组图片集合

1.1 数据准备 ​

1.1.1 平台属性及属性值 ​

1.1.2 销售属性及属性值 ​

销售属性是在sale_attr_info表中定义

而销售属性的销售属性值,使我们在添加SPU的时候,给选定的销售属性添加属性值,这些属性和对应的属性值被分别存储到了spu_sale_attr_info 和 spu_sale_attr_value中

1.2 功能实现 ​

1.2.1 商品图片的回显 ​

在添加SPU的时候,我们上传了所有SPU商品对应的多组商品图片,在我们给SPU商品添加SKU的时候,在这些图片中选择属于当前SKU商品的图片作为该SKU展示的图片集合。

所以为了实现商品图片的回显即查询,我们需要实现以下接口

java
@GetMapping("admin/product/spuImageList/{spuId}")
public Result<List<SpuImageDTO>> getSpuImageList(@PathVariable("spuId") Long spuId) {
}
java
    /*
         根据spuId获取指定spu中包含的图片集合
     */
    List<SpuImageDTO> getSpuImageList(Long spuId);

实现该接口仍然只需要一次单表查询即可。

1.2.2 查询销售属性及属性值集合 &#8203;

在给SPU添加SKU的时候,还需要在SPU的销售属性以及属性值集合中,选择当前SKU对应的销售属性以及属性值

所以我们还需要查询SPU中包含的销售属性,以及其对应的属性值。为此我们需要实现以下接口

java
    @GetMapping("admin/product/spuSaleAttrList/{spuId}")
    public Result<List<SpuSaleAttributeInfoDTO>> getSpuSaleAttrList(@PathVariable("spuId") Long spuId) {
    }
java
    /*
         根据SpuId查询SPU中包含的销售属性以及销售属性值集合
     */
    List<SpuSaleAttributeInfoDTO> getSpuSaleAttrList(Long spuId);
java
@Data
public class SpuSaleAttributeInfoDTO {

    private Long id;

    private Long spuId;

    private Long saleAttrId;

    private String saleAttrName;

    // 销售属性值对象集合
    List<SpuSaleAttributeValueDTO> spuSaleAttrValueList;
}

很显然,这里为了查询出销售属性及其对应的属性值,又会涉及到多表查询。查询的SQL语句如下:

xml
    
    <resultMap id="spuSaleAttrMap" type="com.cskaoyan.mall.product.model.SpuSaleAttributeInfo" autoMapping="true">

        <id column="id" property="id"></id>
        <collection property="spuSaleAttrValueList" ofType="com.cskaoyan.mall.product.model.SpuSaleAttributeValue" autoMapping="true">
            <id column="sale_attr_value_id" property="id"></id>
        </collection>
    </resultMap>
    <!-- 根据spuId获取销售属性数据 -->
    <select id="selectSpuSaleAttrList"  resultMap="spuSaleAttrMap">
        select
                ssai.id,
                ssai.spu_id,
                ssai.sale_attr_id,
                ssai.sale_attr_name,
                ssav.id sale_attr_value_id,
                ssav.spu_sale_attr_id,
                ssav.spu_sale_attr_value_name
         from  spu_sale_attr_info ssai inner  join  spu_sale_attr_value ssav
                      on ssai.id=ssav.spu_sale_attr_id
                  where ssai.spu_id=#{spuId}
    </select>

1.2.3 SKU数据的保存 &#8203;

要保存SKU数据,需要实现以下接口方法

java
    @PostMapping("admin/product/saveSkuInfo")
    public Result saveSkuInfo(@RequestBody SkuInfoParam skuInfo) {
        // 调用服务层
        skuService .saveSkuInfo(skuInfo);
        return Result.ok();
    }
java
    /*
         保存SKU
     */
    void saveSkuInfo(SkuInfoParam skuInfo);
java
@Data
public class SkuInfoParam {

    private Long id;
    
    private Long spuId;
    
    private BigDecimal price;
    
    private String skuName;
    
    private String skuDesc;
    
    private String weight;

    private Long tmId;
    /*
        三级分类id
    */
    private Long category3Id;

    private String skuDefaultImg;

    /*
      是否销售
    */
    private Integer isSale;

    /*
         sku商品的图片列表
     */
    List<SkuImageParam> skuImageList;
    /*
         sku商品平台属性集合
     */
    List<SkuPlatformAttributeValueParam> skuAttrValueList;
    /*
         sku商品销售属性集合
     */
    List<SkuSaleAttributeValueParam> skuSaleAttrValueList;
}

接口的实现逻辑如下:

java
      /*
      	 1. 保存SKU基本信息
      	 2. 保存SKU图片
      	 3. 保存销售属性值
      	 4. 保存平台属性值
      */
	
	  // 将sku参数对象,转化为PO对象 
       SkuInfo skuInfo = skuInfoParamConverter.SkuInfoParam2Info(skuInfoParam);

        // 保存sku基本信息保存到sku_info
        skuInfoMapper.insert(skuInfo);

		// 获取sku图片列表
        List<SkuImage> skuImageList = skuInfo.getSkuImageList();
        if (skuImageList != null && skuImageList.size() > 0) {
            // 循环遍历
            for (SkuImage skuImage : skuImageList) {
                skuImage.setSkuId(skuInfo.getId());
                // 保存sku的多张图片信息, 保存到sku_img
                skuImageMapper.insert(skuImage);
            }
        }

        List<SkuSaleAttributeValue> skuSaleAttrValueList = skuInfo.getSkuSaleAttributeValueList();
        // 调用判断集合方法
        if (!CollectionUtils.isEmpty(skuSaleAttrValueList)) {
            for (SkuSaleAttributeValue skuSaleAttrValue : skuSaleAttrValueList) {
                skuSaleAttrValue.setSkuId(skuInfo.getId());
                skuSaleAttrValue.setSpuId(skuInfo.getSpuId());
                // 保存sku销售属性值
                skuSaleAttrValueMapper.insert(skuSaleAttrValue);
            }
        }

        List<SkuPlatformAttributeValue> skuAttrValueList = skuInfo.getSkuPlatformAttributeValueList();
        if (!CollectionUtils.isEmpty(skuAttrValueList)) {
            for (SkuPlatformAttributeValue skuAttrValue : skuAttrValueList) {
                skuAttrValue.setSkuId(skuInfo.getId());
                // 保存sku平台属性值
                skuPlatformAttrValueMapper.insert(skuAttrValue);
            }
        }

1.2.4 SKU基本信息列表查询 &#8203;

实现SKU基本信息列表的查询,需要实现以下接口方法:

java
    @GetMapping("admin/product/list/{page}/{limit}")
    public Result index(
            @PathVariable Long page,
            @PathVariable Long limit) {
    }
java
    /*
         根据分页参数查询SKU分页数据 
     */
    SkuInfoPageDTO getPage(Page<SkuInfo> pageParam);
java
@Data
public class SkuInfoPageDTO {

     /*
        查询到的一页sku数据
     */
    private List<SkuInfoDTO> records;
     /*
        查询到的总条数
     */
    private Integer total;
}

1.2.5 SKU商品的上下架 &#8203;

在我们的后台管理系统中,我们还可以控制商品的上下架,只有上架的商品才能够被用户浏览,添加购物车和购买,下架的商品,用户是浏览不到的。

java
    @GetMapping("admin/product/onSale/{skuId}")
    public Result onSale(@PathVariable("skuId") Long skuId) {
    }

    /*
         SKU商品上架
     */
    void onSale(Long skuId);
java

    @GetMapping("admin/product/cancelSale/{skuId}")
    public Result cancelSale(@PathVariable("skuId") Long skuId) {
    }

    /*
        SKU商品下架
     */
    void offSale(Long skuId);

上架商品我们只需要讲sku商品的is_sale字段值设置为1,下架商品设置为0即可(暂时)

笔记 &#8203;

  • sku/spu Stock Keeping Unit, spu standard product unit