day 06 三、商品详情业务需求分析
商品详情页,简单说就是以购物者的角度展现一个sku的详情信息。
用户点击不同的销售属性值切换不同的商品
点击添加购物车,将商品放入购物车列表中
另外一个特点就是该页面的高访问量,虽然只是一个查询操作,但是由于频繁的访问所以我们必须对其性能进行最大程度的优化。
分析用到那几张表
SQL语句
控制层
业务层Dao层
难点
3.2 详情模块规划
模块规划思路:
1,service-item微服务模块封装详情页面所需数据接口;
2,service-item通过feign client调用其他微服务数据接口进行数据汇总;
3,Pc端前台页面通过web-all调用service-item数据接口渲染页面;
4,service-item可以为ps端、H5、安卓与ios等前端应用提供数据接口,web-all为ps端页面渲染形式
5,service-item获取商品信息需要调用service-product服务sku信息等;
6,由于service各微服务可能会相互调用,调用方式都是通过feign client调用,所以我们把feign client api接口单独封装出来,需要时直接引用feign client api模块接口即可,即需创建service-client父模块,管理各service微服务feign client api接口。
4.1.3 service-item服务接口封装
商品详情所需构建的数据如下:
1,Sku基本信息
2,Sku图片信息
3,Sku分类信息
4,Sku销售属性相关信息
5,Sku价格信息(平台可以单独修改价格,sku后续会放入缓存,为了回显最新价格,所以单独获取)
四、商品详情功能开发
4.1.3 service-item服务接口封装
总结
item 模块 ItemService
/**
*将sku详情信息查出来
//调用productFeignClient来获取
* 获取sku详情信息
* sku是什么类型 由于item做汇总 把查到的数据汇总到map中来
* 这样前端也可以或取到 就用map来做返回类型
* 那么 参数是什么 skuid
*/
Map<String,Object> getBySkuId(Long skuId);
ItemApiController
/**
* 获取sku详情信息 返回值是一个组合的map用Result
* @param skuId
* @return
*/
//返回值要注意 Result
@GetMapping("{skuId}")
public Result getBySkuId(@PathVariable Long skuId){
Map<String, Object> bySkuId = itemService.getBySkuId(skuId);
return Result.ok(bySkuId);
}
说明:商品详情相关信息在service-product微服务都可以获取,所以我们在service-product模块编写所需要的接口
4.2 转到service-product模块在service-product微服务提供api接口
4.2.1 获取sku基本信息与图片信息
分析用到那几张表
spu_info(商品表) category3_id(三级分类Id) tm_id(品牌Id)
SQL语句
控制层
业务层Dao层
难点
总结
返回值SkuInfo
接口
/**
* 根据skuId 查询skuInfo 返回值是SkuInfo
* @param skuId
* @return
*/
SkuInfo getSkuInfo(Long skuId);
实现类 **问题为什么没有直接 连同把这两个属性查出来 **
@TableField(exist = false)
List<SkuAttrValue> skuAttrValueList;
skuAttrValue是这个样子 sku_attr_value(平台属性值关联表) 不需要显示在详情页面
@TableField(exist = false)
List<SkuSaleAttrValue> skuSaleAttrValueList;
SkuSaleAttrValue 同样是一个关联表 sku_sale_attr_value(sku销售属性值表)
记得要在返回skuInfo前判断,解决空指针异常!
// 解决空指针异常!
if (skuInfo!=null){
skuInfo.setSkuImageList(imageList);
}
@Override
public SkuInfo getSkuInfo(Long skuId) {
//实现类怎默写呢 有id直接用
SkuInfo skuInfo = skuInfoMapper.selectById(skuId);
QueryWrapper<SkuImage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("sku_id",skuId);
List<SkuImage> imageList = skuImageMapper.selectList(queryWrapper);
//如何返回呢? 看实体类
skuInfo.setSkuImageList(imageList);
if (skuInfo!=null){
skuInfo.setSkuImageList(imageList);
}
return skuInfo;