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);
@Data
public 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);
@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;
}

接口的实现逻辑如下:

/*
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);
@Data
public 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即可(暂时)

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

SKU
https://firefly-mu-weld.vercel.app/posts/microservice-12-sku/
作者
Daisy
发布于
2026-06-14
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Daisy
Hello, I'm Daisy.
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签

文章目录