SKU
1181 字
6 分钟
SKU
基本介绍

学习了SPU相关的数据和操作,我们接着学习SKU,相比于SPU而言,SKU表示更为具体的商品,包含了更多的数据。
- SKU商品具有价格,以及默认的显示图片,以及所属的spu,所属类目,品牌等等
- 属于SPU的一组确定的销售属性取值(对于一个手机sku来说,比如具体的颜色值幻夜星河,具体的版本值8G+256G)
- 因为SKU仍然属于某一个商品类目,所以还具有一组平台属性取值
- 属于一个sku商品的一组图片集合

数据准备
平台属性及属性值

销售属性及属性值
销售属性是在sale_attr_info表中定义

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

功能实现
商品图片的回显
在添加SPU的时候,我们上传了所有SPU商品对应的多组商品图片,在我们给SPU商品添加SKU的时候,在这些图片中选择属于当前SKU商品的图片作为该SKU展示的图片集合。
所以为了实现商品图片的回显即查询,我们需要实现以下接口
@GetMapping("admin/product/spuImageList/{spuId}")public Result<List<SpuImageDTO>> getSpuImageList(@PathVariable("spuId") Long spuId) {} /* 根据spuId获取指定spu中包含的图片集合 */ List<SpuImageDTO> getSpuImageList(Long spuId);实现该接口仍然只需要一次单表查询即可。
查询销售属性及属性值集合
在给SPU添加SKU的时候,还需要在SPU的销售属性以及属性值集合中,选择当前SKU对应的销售属性以及属性值

所以我们还需要查询SPU中包含的销售属性,以及其对应的属性值。为此我们需要实现以下接口
@GetMapping("admin/product/spuSaleAttrList/{spuId}") public Result<List<SpuSaleAttributeInfoDTO>> getSpuSaleAttrList(@PathVariable("spuId") Long spuId) { } /* 根据SpuId查询SPU中包含的销售属性以及销售属性值集合 */ List<SpuSaleAttributeInfoDTO> getSpuSaleAttrList(Long spuId);@Datapublic class SpuSaleAttributeInfoDTO {
private Long id;
private Long spuId;
private Long saleAttrId;
private String saleAttrName;
// 销售属性值对象集合 List<SpuSaleAttributeValueDTO> spuSaleAttrValueList;}很显然,这里为了查询出销售属性及其对应的属性值,又会涉及到多表查询。查询的SQL语句如下:
<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>SKU数据的保存

要保存SKU数据,需要实现以下接口方法
@PostMapping("admin/product/saveSkuInfo") public Result saveSkuInfo(@RequestBody SkuInfoParam skuInfo) { // 调用服务层 skuService .saveSkuInfo(skuInfo); return Result.ok(); } /* 保存SKU */ void saveSkuInfo(SkuInfoParam skuInfo);@Datapublic 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;}接口的实现逻辑如下:
/* 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); } }SKU基本信息列表查询

实现SKU基本信息列表的查询,需要实现以下接口方法:
@GetMapping("admin/product/list/{page}/{limit}") public Result index( @PathVariable Long page, @PathVariable Long limit) { } /* 根据分页参数查询SKU分页数据 */ SkuInfoPageDTO getPage(Page<SkuInfo> pageParam);@Datapublic class SkuInfoPageDTO {
/* 查询到的一页sku数据 */ private List<SkuInfoDTO> records; /* 查询到的总条数 */ private Integer total;}SKU商品的上下架
在我们的后台管理系统中,我们还可以控制商品的上下架,只有上架的商品才能够被用户浏览,添加购物车和购买,下架的商品,用户是浏览不到的。
@GetMapping("admin/product/onSale/{skuId}") public Result onSale(@PathVariable("skuId") Long skuId) { }
/* SKU商品上架 */ void onSale(Long skuId); @GetMapping("admin/product/cancelSale/{skuId}") public Result cancelSale(@PathVariable("skuId") Long skuId) { }
/* SKU商品下架 */ void offSale(Long skuId);上架商品我们只需要讲sku商品的is_sale字段值设置为1,下架商品设置为0即可(暂时)
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!