Skip to content

目录品牌管理 ​

在实际生活中,我们知道品牌往往是和商品类目联系起来的,比如,手机品牌,电脑品牌,汽车品牌等等,不同的商品类目包含不同的品牌,所以用户在查询商品类目的时候,我们同时也应该展示,该类目下的商品品牌。

关于目录品牌管理,我们需要实现查询商品类目品牌,添加商品类目品牌,删除商品类目品牌的功能。

添加商品类目品牌 ​

java

@PostMapping("admin/product//baseCategoryTrademark/save")
public Result save(@RequestBody CategoryTrademarkParam categoryTrademarkVo){
}
java
    /**
     * 保存分类与品牌关联
     */
    void save(CategoryTrademarkParam categoryTrademarkParam);
java
@Data
public class CategoryTrademarkParam {
	
	private Long category3Id;

	private List<Long> trademarkIdList;

}

查询商品类目品牌 &#8203;

java
@GetMapping("admin/product/baseCategoryTrademark/findTrademarkList/{thirdLevelCategoryId}")
public Result findTrademarkList(@PathVariable Long thirdLevelCategoryId){
}
java
    /**
     * 根据三级分类获取品牌
     */
    List<TrademarkDTO> findTrademarkList(Long category3Id);
  • 先根据三级类目id,在类目品牌关联表category_trademark中,找到属于该类目的所有品牌的id即trademark_id集合
  • 然后,在根据trademark_id集合,在trademark表中查询出每个品牌的详细信息

查询未关联商品类目的品牌 &#8203;

在给一个商品类目添加品牌的时候,添加的一定是没有关联到当前商品类目的品牌,所以需要先查出未关联到该类目的品牌,然后选择一个或多个品牌关联的类目。

java
    @GetMapping("admin/product/baseCategoryTrademark/findCurrentTrademarkList/{thirdLevelCategoryId}")
    public Result findCurrentTrademarkList(@PathVariable Long thirdLevelCategoryId){
    }
java
    /**
     * 获取当前未被三级分类关联的所有品牌
     */
    List<TrademarkDTO> findUnLinkedTrademarkList(Long thirdLevelCategoryId);

这里的实现思路其实也并不困难:

  • 首先查询出当前类目已经关联的品牌列表(在trademark_category中)
  • 查询所有品牌的品牌列表,过滤掉已经关联到当前类目的品牌即可

删除目录品牌关联 &#8203;

java
    @DeleteMapping("admin/product/baseCategoryTrademark/remove/{thirdLevelCategoryId}/{trademarkId}")
    public Result remove(@PathVariable Long thirdLevelCategoryId, @PathVariable Long trademarkId){

    }
java
    /**
     * 删除关联
     */
    void remove(Long thirdLevelCategoryId, Long trademarkId);

SPU &#8203;

SPU数据 &#8203;

之前我们已经讲解过SPU,它表示具有相同特征和属性值的一组商品。如果要完整的描述一个SPU他应该包含那些数据呢?简单总结一下:

  • 类目信息:一个SPU中所包含的商品,都应该是具有所属类目的
  • 品牌信息: 一个SPU中所包含的商品,都应该是具有品牌的
  • 图片信息: 一个SPU中所包含的每一个商品,都应该具有一组图片
  • 海报信息: 一个SPU中的所有商品,具有统一的展示海报
  • 销售属性:一个SPU中的所有商品,具有相同的销售属性,但是具有不同的销售属性取值集合

![](SPU.assets/spu data final.png)

SPU操作 &#8203;

查询销售属性 &#8203;

所有的销售属性定义在sale_attr_info表中的,所以要给SPU选择销售属性,就必须查询出所有的销售属性。

java
@GetMapping("admin/product/baseSaleAttrList")
public Result SaleAttrList(){
}
java
    /*
          查询所有的销售属性
     */
    List<SaleAttributeInfoDTO> getSaleAttrInfoList();

本质还是一个单表查询,很简单。

SPU列表的查询 &#8203;

java
    @GetMapping("admin/product/{page}/{size}")
    public Result getSpuInfoPage(@PathVariable Long page,
                                 @PathVariable Long size,
                                 Long category3Id){
    }
    /*
         根据分页参数查询spu分页数据
     */
    SpuInfoPageDTO getSpuInfoPage(Page<SpuInfo> pageParam, Long category3Id);

这里要注意,我们查询的SPU列表,其实是某一个三级类目下的Spu列表,我们主要使用三级类目id,作为查询条件来查询。

SPU保存 &#8203;

从页面上来看,我们需要保存的数据比较多,主要分成了如下几个部分:

  • SPU所属类目,名称,SPU的品牌,以及SPU的文字描述
  • SPU中所包含的不同商品的图片集合
  • SPU中所包含的多个属性和属性值集合
  • SPU商品的海报集合

所以,接下来我们就需要实现以下接口方法,实现SPU的保存

    @PostMapping("admin/product/saveSpuInfo")
    public Result saveSpuInfo(@RequestBody SpuInfoParam spuInfoParam){
    }
java
    /*
        保存完整的SPU信息
     */
    void saveSpuInfo(SpuInfoParam spuInfo);
java
@Data
public class SpuInfoParam {

    private Long id;

    private String spuName;

    private String description;

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

    private Long tmId;
    /*
    	销售属性集合
    */
    private List<SpuSaleAttributeInfoParam> spuSaleAttrList;
    /*
    	商品的图片集合
    */
    private List<SpuImageParam> SpuImageList;
	/*
    	商品的海报图片集合
    */
    private List<SpuPosterParam> SpuPosterList;
}
java
@Data
public class SpuSaleAttributeInfoParam {

    private Long id;

    private Long spuId;
    /*
    	销售属性id
    */
    private Long baseSaleAttrId;

    /*
    	销售属性名称
    */
    private String saleAttrName;

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

实现代码如下:

java
	   // 现将参数对象转化为PO对象
        SpuInfo spuInfo = spuInfoParamConverter.spuInfoParam2Info(spuInfoParam);
        // 插入基本的spu信息
        spuInfoMapper.insert(spuInfo);

        //  获取到spuImage 集合数据
        List<SpuImage> spuImageList = spuInfo.getSpuImageList();

		/*
		   循环遍历spuImageList
		   1. 给spuImage的spuId属性赋值因为只有将spu基本信息插入数据库spuInfo的id才有值
		   2. 保存spuImge
          */

        //  获取销售属性集合
        List<SpuSaleAttributeInfo> spuSaleAttributeInfoList = spuInfo.getSpuSaleAttributeInfoList();

        //  判断
        if (!CollectionUtils.isEmpty(spuSaleAttributeInfoList)) {
            //  循环遍历
            for (SpuSaleAttributeInfo spuSaleAttrInfo : spuSaleAttributeInfoList) {
                /*
                    给spuSaleAttrInfo的spuId赋值,并保存spuSaleAttrInfo到数据库
                    SpuSaleAttrInfoMapper
                */

                //  再此获取销售属性值集合
                List<SpuSaleAttributeValue> spuSaleAttributeValueList = spuSaleAttrInfo.getSpuSaleAttrValueList();
                
                /*
                	遍历销售属性值集合spuSaleAttributeValueList
                	1. 给spuSaleAttrValue的spuId赋值
                	2. 给spuSaleAttrValue的spuSaleAttrId赋值
                	3. 保存spuSaleAttrValue到数据库
                */
            }
        }

        //  获取到posterList 集合数据
        List<SpuPoster> spuPosterList = spuInfo.getSpuPosterList();
        /*
           遍历销售属性值集合spuPosterList
           1. 给spuPoster的spuId赋值
            3. 保存spuPoster到数据库
         */

笔记 &#8203;

  • 品牌trademark和类目category是多对多的关系