一、实现逻辑
前端通过向Controller层发出请求到后端,后端接收到请求后调用Service层的方法,实现对应的单个商品上下架或者多个商品批量上下架。
二、具体实现之基础准备
1、商品上下架操作请求模型 ProductUpOrDownReq.java
@Getter
@Setter
public class ProductUpOrDownReq {
@NotNull(message = "主键不能为空")
private Long id;
/**
* 商家id
*/
@NotNull(message = "商家id不能为空")
private Long merchantId;
/**
* 是否上架 1:上架 ,0:没上架
*/
@NotBlank(message = "是否上架不能为空")
private String isgrounding;
}
2、商品上下架批量操作请求模型 BatchUpOrDownReq.java
@Getter
@Setter
public class BatchUpOrDownReq {
@NotBlank(message = "状态不能为空")
private String isgrounding;
@NotNull(message = "商品id的值不能为空")
private Long[] ids;
}
三、具体实现
1、Controller层 ProductController.java
1)单个商品上下架
@SaMerchandiserCheckLogin
@ApiOperation(value = "单个商品上下架")
@PostMapping(value = "/upordown")
public R upOrDown(@RequestBody @Valid ProductUpOrDownReq req){
boolean result=this.productService.upOrDown(req);
return result?R.ok():R.build(AckCode.DATABASE_ERROR);
}
2)批量上下架商品
@SaMerchandiserCheckLogin
@ApiOperation(value = "上下架批量操作")
@PostMapping(value = "/batchUpOrDown")
public R batchUporDown(@RequestBody @Valid BatchUpOrDownReq req){
boolean result=this.productService.batchUpOrDown(req);
return result?R.ok():R.build(AckCode.DATABASE_ERROR);
}
2、Service层
1)单个商品上下架 ProductService.java
/**
* 单个商品上下架
* @param req
* @return
*/
boolean upOrDown(ProductUpOrDownReq req);
具体实现ProductServiceImpl.java:
实现逻辑主要是判断选中的数据是否是该商家的数据,判断商家是否有权限,然后再进行更新操作。单个商品上下架只需要更新一列数据,通过获取请求数据的id对其状态进行更改,从而减少数据库的操作。
@Override
public boolean upOrDown(ProductUpOrDownReq req) {
//先判断是否是该商家的数据
if (StpMerchandiserUtil.getLoginIdAsLong()!=req.getMerchantId().longValue()){
throw new ServiceException(AckCode.PERMISSION_NOT_ACCESS_CATEGORY);
}
Product db = this.getById(req.getId());
if (Objects.isNull(db)){
throw new ServiceException(AckCode.NOT_FOUND_DATA);
}
//只更新某一列 Isgrounding
Product entity = new Product();
entity.setId(req.getId());
entity.setIsgrounding(req.getIsgrounding());
entity.setUpdateTime(new Date());
entity.setUpdateBy(this.currentNameRedisCacheUtil.getMerchandiserCurrentName());
return this.updateById(entity);
}
2)批量上下架商品 ProductService.java
/**
* 批量上下架
* @param req
* @return
*/
boolean batchUpOrDown(BatchUpOrDownReq req);
具体实现ProductServiceImpl.java:
实现逻辑主要是判断选中的数据是否是该商家的数据,也就是判断该商家是否有权利对数据进行操作,再构建一个专门的集合,存放修改的商品集合,从而实现商品的批量上下架操作。
@Override
public boolean batchUpOrDown(BatchUpOrDownReq req) {
//先判断是不是该商家的数据
long currentId = StpMerchandiserUtil.getLoginIdAsLong();
LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(Product::getId,req.getIds());
queryWrapper.eq(Product::getMerchantId,currentId);
long count = this.count(queryWrapper);
//有些商品不是这个商家的
if (count!=req.getIds().length){
throw new ServiceException(AckCode.PERMISSION_NOT_ACCESS_CATEGORY);
}
//构建一个集合
List<Product> list=new ArrayList<>();
for (Long id : req.getIds()) {
Product product = new Product();
product.setId(id);
product.setIsgrounding(req.getIsgrounding());
product.setUpdateTime(new Date());
product.setUpdateBy(currentNameRedisCacheUtil.getMerchandiserCurrentName());
list.add(product);
}
return this.saveOrUpdateBatch(list);
}
四、总结
该文章主要介绍了通过前端向Controller层发送请求,Controller接收请求并调用方法,从而实现的对商品的简单操作---单个商品的上下架和多个商品的批量上下架。其中要主要的是权限的设置,操作只能由商家进行,同时注意区别单个和多个商品上下架操作的不同之处,以及如何思考设计批量上下架的问题。