主要记录一下收获
spu 一类物品
sku 具体什么物品(由销售属性组合定义)
写保存接口步骤
- 对比前端拿到的VO和实际的POJO属性有哪些差异
- 将差异属性通过其他方式拿到,其余属性直接
BeanUtils.copyProperties
- 保存,保存时还有其他关联表,这些应该交给保存serviceImp来处理
例如spu保存sku,保存sku还要再保存图片、会员等表,这些应该交给skuService,spu只需要保存sku即可
远程调用
TO
TO是两个微服务传输时使用,如果是服务和前端传输则是VO,声明在common中
- 减少冗余数据的传输,可以挑选需要的属性封装成TO
- 利于两边数据的传输,发送方声明的类,接收方不能使用,TO解决了这个问题
具体操作
- 发送方新建feign接口
- 接收方controller声明feign接口对应的方法
- 发送方使用feign接口
下面是一个远程调用的例子,sku (product服务) 和 bounds(coupon服务)
- to
- feign
- counpon 服务中的接收方,对数据的处理也交给了service
- 注意点
双方入口@EnableDiscoveryClient
(注册发现)
调用方入口@EnableFeignClients
(扫描feign接口)
feign接口@FeignClient(name = "服务名")
(告诉注册中心,调用的服务名) - 易错点
地址前面加/
查操作
条件封装
- 目前感觉这样写很清楚,参数一般可以强转为String,然后判断这个参数是否需要作为条件
- POJO 转 VO 可以使用stream中的map()
@Override
public PageUtils queryPageByCondition(Map<String, Object> params) {
QueryWrapper<SkuInfoEntity> wrapper = new QueryWrapper<>();
// JudgeParamInMap.ContainAndNotZeroAndNotEmpty 是单独封装作为工具类的
if(JudgeParamInMap.ContainAndNotZeroAndNotEmpty(params,"catelogId")){
wrapper.and(w->w.eq("catalog_id",params.get("catelogId")));
}
if(JudgeParamInMap.ContainAndNotZeroAndNotEmpty(params,"brandId")){
wrapper.and(w->w.eq("brand_id",params.get("brandId")));
}
if(JudgeParamInMap.ContainAndNotZeroAndNotEmpty(params,"key")){
wrapper.and(w->w.eq("sku_id",params.get("key")).or().eq("sku_name",params.get("key")));
}
if(JudgeParamInMap.ContainAndNotZeroAndNotEmpty(params,"min")){
wrapper.and(w->w.ge("price",params.get("min")));
}
if(JudgeParamInMap.ContainAndNotZeroAndNotEmpty(params,"max")){
wrapper.and(w->w.le("price",params.get("max")));
}
IPage<SkuInfoEntity> page = this.page(new Query<SkuInfoEntity>().getPage(params),wrapper);
return new PageUtils(page);
}