乐优商城:笔记(六):商品微服务(下):LyItemApplication

上半部分商品微服务(上)


1 实现商品新增

即点击 新增商品 出现如下弹窗,填写设置参数完毕之后保存
在这里插入图片描述

1.1 controller

在这里插入图片描述
可以看出
请求方式:get
请求路径:/cid
请求参数:cid
返回结果:当前分类下的所有Brand,是一个List集合

@GetMapping("cid/{cid}")
public ResponseEntity<List<Brand>> queryBrandByCid(@PathVariable("cid")Long cid){
    return ResponseEntity.ok(brandService.queryBrandByCid(cid));
}

1.2 service

public List<Brand> queryBrandByCid(Long cid) {
  List<Brand> brands = brandMapper.queryByCategoryId(cid);
     if(CollectionUtils.isEmpty(brands)){
         throw new LyException(ExceptionEnum.BRAND_NOT_FOUND);
     }
     return brands;
 }

1.3 mapper

因为传过来的是cid,但是Brand中没有cid字段,所以无法通过setCid()来查询非空字段,此外品牌和分类有一张中间表,需要自己编写sql语句。

@Select("SELECT b.* FROM tb_brand b LEFT JOIN tb_category_brand cb ON b.id = cb.brand_id WHERE cb.category_id = #{cid}")
List<Brand> queryByCategoryId(@Param("cid")Long cid);

运行代码,实现:
在这里插入图片描述

2 富文本编辑器——用来填写商品描述信息

      上一步填写完品牌类别标题等信息,我们该点击下一页填写下一页的信息了,商品描述信息比较复杂,而且图文并茂,甚至包括视频。

      这样的内容,一般都会使用富文本编辑器

富文本编辑器,内嵌于浏览器,是一种所见即所得的文本编辑器。普通的框只能输入文字,而富文本还能给文字加颜色样式等,功能很丰富。富文本编辑器有很多,例如:KindEditor、Ueditor。

我们采用的是一款支持Vue的富文本编辑器:vue-quill-editor

        原始图片的上传直接上传了整个图片的数据,无法直接上传到后台,因此我们对其进行了封装,支持了图片的上传,并且图片存储方式一个img标签,节省了空间。
在这里插入图片描述

3 添加商品规格参数

      当上传了商品的描述信息以后点击下一步,下一步就需要填充商品的规格参数信息了,但是点击下一步没有出现填写的文本框下拉菜单等选项,这是为什么呢?

      当我们在 “基本信息” 选择了商品分类时会发出两条查询请求,一条是之前已经实现过的根据分类id查询品牌集合,另外一条就是根据分类id查询规格参数,但是我们之前实现过根据组id查询参数的请求,因此我们需要完善一下这条请求——考虑到以后可能还会根据是否搜索、是否为通用属性等条件过滤,我们多添加几个过滤条件。

3.1 controller

如果param中有属性为null,则不会吧属性作为查询条件,因此该方法具备通用性,即可根据gid查询,也可根据cid查询

@GetMapping("/params")
public ResponseEntity<List<SpecParam>> querySpecParams(@RequestParam(value = "gid",required = false)Long gid,
                                                       @RequestParam(value = "cid",required = false)Long cid,
                                                       @RequestParam(value = "searching",required = false)Boolean searching){
    return ResponseEntity.ok(specificationService.querySpecParams(gid,cid,searching));
}

3.2 service

public List<SpecParam> querySpecParams(Long gid, Long cid, Boolean searching) {
    SpecParam param = new SpecParam();
    param.setGroupId(gid);
    param.setCid(cid);
    param.setSearching(searching);
    List<SpecParam> params = paramMapper.select(param);

    if(CollectionUtils.isEmpty(params)){
        throw new LyException(ExceptionEnum.GROUP_PARAM_NOT_FOUND);
    }

    return params;
}

刷新页面之后:
在这里插入图片描述

4 页面表单提交

填写一些属性后,会在页面下方生成一个sku表格在这里插入图片描述
点击保存完成上述功能,接下来我们去实现。

4.1 实体类

spu、spudetail、sku、stock四个实体类,见笔记五。

4.2 controller

@PostMapping("goods")
public ResponseEntity<Void> saveGoods(@RequestBody Spu spu){
    goodsService.saveGoods(spu);
    return ResponseEntity.status(HttpStatus.CREATED).build();//没有返回值
}

4.3 service

@Transactional
public void saveGoods(Spu spu) {
    //新增spu
    spu.setId(null);
    spu.setSaleable(true);
    spu.setValid(false);
    spu.setCreateTime(new Date());
    spu.setLastUpdateTime(spu.getCreateTime());
    int count = spuMapper.insert(spu);
    if (count != 1) {
        throw new LyException(ExceptionEnum.GOODS_SAVE_ERROR);
    }
    //新增spu_detail
    SpuDetail spuDetail = spu.getSpuDetail();
    spuDetail.setSpuId(spu.getId());
    spuDetailMapper.insert(spuDetail);
    //新增sku和库存
    saveSkuAndStock(spu);
    
    //发送mq消息
    //amqpTemplate.convertAndSend("item.insert",spu.getId());
}

private void saveSkuAndStock(Spu spu) {
    int count;//新增sku
    List<Sku> skus = spu.getSkus();
    List<Stock> stockList = new ArrayList<>();
    for (Sku sku : skus) {
        sku.setCreateTime(new Date());
        sku.setLastUpdateTime(sku.getCreateTime());
        sku.setSpuId(spu.getId());

        count = skuMapper.insert(sku);
        if(count!=1)
            throw new LyException(ExceptionEnum.GOODS_SAVE_ERROR);

        //新增库存
        Stock stock = new Stock();
        stock.setSkuId(sku.getId());
        stock.setStock(sku.getStock());
        stockList.add(stock);
    }
    //批量新增库存
    count = stockMapper.insertList(stockList);
    if(count!=stockList.size())
        throw new LyException(ExceptionEnum.GOODS_SAVE_ERROR);
}

5 修改商品信息

修改之前要先查找,除了查找spu信息还要查找sku信息

5.1 controller

@GetMapping("/spu/detail/{id}")
public ResponseEntity<SpuDetail> querySpuDetailById(@PathVariable("id")Long id){
     return ResponseEntity.ok(goodsService.queryDetailById(id));
 }
 
@GetMapping("/sku/list")
public ResponseEntity<List<Sku>> querySkuBySpuId(@RequestParam("id") Long spuId){
    return ResponseEntity.ok(goodsService.querySkuBySpuId(spuId));
}

5.2 service

public SpuDetail queryDetailById(Long spuId) {
    SpuDetail spuDetail = spuDetailMapper.selectByPrimaryKey(spuId);
    if(spuDetail==null)
        throw new LyException(ExceptionEnum.GOODS_SAVE_ERROR);
    return spuDetail;
}

public List<Sku> querySkuBySpuId(Long spuId) {
    //查询sku
    Sku sku = new Sku();
    sku.setSpuId(spuId);
    List<Sku> skuList = skuMapper.select(sku);
    if(CollectionUtils.isEmpty(skuList))
        throw new LyException(ExceptionEnum.SKU_NOT_FOUND);

    //查询库存
    List<Long> ids = skuList.stream().map(Sku::getId).collect(Collectors.toList());
    List<Stock> stockList = stockMapper.selectByIdList(ids);
    if(CollectionUtils.isEmpty(stockList))
        throw new LyException(ExceptionEnum.STOCK_NOT_FOUND);

    //把stock变成一个map,其key:skuId,值:库存值
    Map<Long, Integer> stockMap = stockList.stream().collect(Collectors.toMap(Stock::getSkuId, Stock::getStock));
    skuList.forEach(s ->s.setStock(stockMap.get(s.getId())));
    return skuList;
}

6 修改后商品的提交

保存按钮与新增其实是同一个,因此提交的逻辑也是一样的。但是也有一点区别,spu数据可以修改,但是SKU数据无法修改,因为有可能之前存在的SKU现在已经不存在了,或者以前的sku属性都不存在了。比如以前内存有4G,现在没了,因此这里直接删除以前的SKU,然后新增即可。

6.1 controller

@PutMapping("goods")
public ResponseEntity<Void> updateGoods(@RequestBody Spu spu){
    goodsService.updateGoods(spu);
    return ResponseEntity.status(HttpStatus.NO_CONTENT).build();//没有返回值
}

6.2 service

@Transactional
public void updateGoods(Spu spu) {
    if(spu.getId() == null)
        throw new LyException(ExceptionEnum.GOODS_UPDATE_ERROR);
    Sku sku = new Sku();
    sku.setSpuId(spu.getId());
    //查询sku
    List<Sku> skuList = skuMapper.select(sku);
    if(!CollectionUtils.isEmpty(skuList)){
        //删除sku
        skuMapper.delete(sku);
        //删除库存
        List<Long> ids = skuList.stream().map(Sku::getId).collect(Collectors.toList());
        stockMapper.deleteByIdList(ids);
    }
    //修改spu
    spu.setValid(null);
    spu.setSaleable(null);
    spu.setCreateTime(null);
    spu.setLastUpdateTime(new Date());

    int count = spuMapper.updateByPrimaryKeySelective(spu);
    if(count!=1)
        throw new LyException(ExceptionEnum.GOODS_UPDATE_ERROR);
    //修改detail
    spuDetailMapper.updateByPrimaryKeySelective(spu.getSpuDetail());
    if(count!=1)
        throw new LyException(ExceptionEnum.GOODS_UPDATE_ERROR);
    //新增sku和库存
    saveSkuAndStock(spu);

    //发送mq消息
    //amqpTemplate.convertAndSend("item.update",spu.getId());

}

ok!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值