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);}
    @Overridepublic 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;}

控制层

    /*** 根据skuId获取sku信息  返回值是有这个实体类 直接返回** @param skuId* @return*/@GetMapping("inner/getSkuInfo/{skuId}")public SkuInfo  getSkuInfo(@PathVariable Long skuId){SkuInfo skuInfo = manageService.getSkuInfo(skuId);//什么时候用 Result?  特殊的map ,json格式,要确认消息
//        return Result.ok(skuInfo);return skuInfo;}

这是return skuInfo;发现只有skuInfo的信息

{"id": 43,"spuId": 26,"price": 1588,"skuName": "小米 CC9e 美颜自拍 游戏手机 蓝色(深蓝星球) 全网通6G+64G","skuDesc": "有点蓝","weight": "0.47","tmId": 4,"category3Id": 61,"skuDefaultImg": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2ELjJNAAAAAETiDa8413.png","isSale": 0,"skuImageList": [{"id": 229,"skuId": 43,"imgName": "1.png","imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2EaM-0AAAAACcuFyA491.png","spuImgId": 261,"isDefault": "0"},{"id": 230,"skuId": 43,"imgName": "2.png","imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2EXBghAAAAAHJhDj4566.png","spuImgId": 262,"isDefault": "0"},{"id": 231,"skuId": 43,"imgName": "3.png","imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2ELjJNAAAAAETiDa8413.png","spuImgId": 263,"isDefault": "1"},{"id": 232,"skuId": 43,"imgName": "4.png","imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2EffZnAAAAAKpkihY000.png","spuImgId": 264,"isDefault": "0"},{"id": 233,"skuId": 43,"imgName": "5.png","imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2Efo5UAAAAAFgXhW8588.png","spuImgId": 265,"isDefault": "0"}],"skuAttrValueList": null,"skuSaleAttrValueList": null
}

这是 return Result.ok(skuInfo); 还有状态码,消息 等包装信息

/**
//         * {
//         *   "code": 200,
//         *   "message": "成功",
//         *   "data": {
//         *     "id": 43,
//         *     "spuId": 26,
//         *     "price": 1588,
//         *     "skuName": "小米 CC9e 美颜自拍 游戏手机 蓝色(深蓝星球) 全网通6G+64G",
//         *     "skuDesc": "有点蓝",
//         *     "weight": "0.47",
//         *     "tmId": 4,
//         *     "category3Id": 61,
//         *     "skuDefaultImg": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2ELjJNAAAAAETiDa8413.png",
//         *     "isSale": 0,
//         *     "skuImageList": [
//         *       {
//         *         "id": 229,
//         *         "skuId": 43,
//         *         "imgName": "1.png",
//         *         "imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2EaM-0AAAAACcuFyA491.png",
//         *         "spuImgId": 261,
//         *         "isDefault": "0"
//         *       },
//         *       {
//         *         "id": 230,
//         *         "skuId": 43,
//         *         "imgName": "2.png",
//         *         "imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2EXBghAAAAAHJhDj4566.png",
//         *         "spuImgId": 262,
//         *         "isDefault": "0"
//         *       },
//         *       {
//         *         "id": 231,
//         *         "skuId": 43,
//         *         "imgName": "3.png",
//         *         "imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2ELjJNAAAAAETiDa8413.png",
//         *         "spuImgId": 263,
//         *         "isDefault": "1"
//         *       },
//         *       {
//         *         "id": 232,
//         *         "skuId": 43,
//         *         "imgName": "4.png",
//         *         "imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2EffZnAAAAAKpkihY000.png",
//         *         "spuImgId": 264,
//         *         "isDefault": "0"
//         *       },
//         *       {
//         *         "id": 233,
//         *         "skuId": 43,
//         *         "imgName": "5.png",
//         *         "imgUrl": "http://192.168.200.128:8080/group1/M00/00/03/wKjIgGH0RH2Efo5UAAAAAFgXhW8588.png",
//         *         "spuImgId": 265,
//         *         "isDefault": "0"
//         *       }
//         *     ],
//         *     "skuAttrValueList": null,
//         *     "skuSaleAttrValueList": null
//         *   },
//         *   "ok": true
//         * }
//         */

4.2.2 获取分类信息

分析用到那几张表

base_category1(一级分类Id)
base_category2(二级分类Id) category1_id(一级分类编号)
base_category3(三级分类Id) category2_id(二级分类编号)

SQL语句
创建视图
控制层
返回 BaseCategoryView
业务层Dao层
返回 BaseCategoryView
难点
sku是挂在三级分类下面的,我们的分类信息分别在base_category1、base_category2、base_category3这三张表里面,目前需要通过sku表的三级分类id获取一级分类名称、二级分类名称和三级分类名称
解决方案:
我们可以建立一个视图(view),把三张表关联起来,视图id就是三级分类id,这样通过三级分类id就可以查询到相应数据,效果如下:

那么category3_id从哪来?是从SkuInfo获得后.get获取skuInfo的id后,从sku_info表中查出来的
这样就可以连锁查询
**category3_id不是传进来的吗?**看了看视频确实是 @GetMapping(“inner/getCategoryView/{category3Id}”)

创建视图
CREATE VIEW base_category_view AS
select
c3.id as id,
c1.id as category1_id, c1.name as category1_name,
c2.id as category2_id, c2.name as category2_name,
c3.id as category3_id, c3.name as category3_name
from base_category1 c1
inner join base_category2 c2 on c2.category1_id = c1.id
inner join base_category3 c3 on c3.category2_id = c2.id

第一个问题 返回值是什么 返回值是view视图 这个表对应的实体类,因为必要查询的字段都在这个视图中

 /*** 通过三级分类id查询分类信息* @param category3Id* @return*/BaseCategoryView getCategoryViewByCategory3Id(Long category3Id);

控制层也返回的是 BaseCategoryView 一般能从某张表查询出来的数据都可以返回实体类

   /*** 通过三级分类id查询分类信息* @param category3Id* @return*/@GetMapping("inner/getCategoryView/{category3Id}")public BaseCategoryView getCategoryView(@PathVariable("category3Id")Long category3Id){return manageService.getCategoryViewByCategory3Id(category3Id);}

4.2.3 获取价格信息

分析用到那几张表
sku_info(库存单元表) spu_id(商品Id) tm_id(品牌Id) category3_id(三级分类Id)

返回值类型 由于实体类中价格别BigDecimal 所以返回这个

/*** 获取sku价格* @param skuId* @return*/
BigDecimal getSkuPrice(Long skuId);

价格在skuInfo中所以通过

/*** 获取sku价格* @param skuId* @return*/
@Override
public BigDecimal getSkuPrice(Long skuId) {SkuInfo skuInfo = skuInfoMapper.selectById(skuId);if(null != skuInfo) {return skuInfo.getPrice();}return new BigDecimal("0");
}

分清SkuInfo和SpuInfo

SkuInfo

SpuInfo

一个spu对应多个sku

4.2.4 获取销售信息 难点

4.2.4.1 查询出sku对应spu的销售属性(查询所有的销售属性 并且sku要默认选中)

分析用到那几张表

这两张内连接
spu_sale_attr(商品销售属性表) spu_id(商品Id) base_sale_attr_id(销售属性Id)
spu_sale_attr_value(商品销售属性值) spu_id(商品Id) base_sale_attr_id(销售属性Id)
接着左连接  通过sku_id
sku_sale_attr_value(sku销售属性值表) sku_id(库存单元Id) spu_id() sale_attr_value_id(销售属性值Id)这两张表没用
base_sale_attr(平台属性销售字典表  基本销售属性表)
sku_attr_value(平台属性值关联表) attr_id(属性Id)value_id(属性值Id)sku_id()

难点

思路:
1、查出该商品的spu的所有销售属性和属性值
2、标识出本商品对应的销售属性
找到skuid和销售属性值的关联表 用于回显销售属性值
查询skuid对应的销售属性和销售属性值
查询所有销售属性和销售属性值 两条语句关联起来就行了

IF(skv.sku_id IS NULL,0,1) is_checked这句SQL就可以赋值

为什么左连接//因为 不可能同时选中所有的颜色 型号 一个SPU中有多个SKU ID 而你要展示的只是自己选中的sku id

SELECT sa.id ,sa.spu_id, sa.sale_attr_name,sa.base_sale_attr_id,sv.id sale_attr_value_id,sv.sale_attr_value_name,skv.sku_id,IF(skv.sku_id IS NULL,0,1)  is_checkedFROM spu_sale_attr saINNER JOIN spu_sale_attr_value  sv ON  sa.spu_id=sv.spu_id AND sa.base_sale_attr_id=sv.base_sale_attr_id//因为sku_id会出现空的情况 不可能同时选中所有的颜色 型号 要选出对应的颜色版本 所以要穿skuIdLEFT JOIN sku_sale_attr_value skv ON skv.sale_attr_value_id= sv.id AND skv.sku_id=#{skuId}WHERE  sa.spu_id=#{spuId}//要知道是哪个品牌ORDER BY sv.base_sale_attr_id,sv.id

注意字段的顺序,
SELECT
IF
FROM
INNER JOIN
ON sa.spu_id=sv.spu_id AND sa.base_sale_attr_id=sv.base_sale_attr_id
LEFT JOIN
ON …
WHERE sa.spu_id=#{spuId}
ORDER BY

实体类中添加字段

 /*@TableField(exist = false) 注解加载bean属性上,表示当前属性不是数据库的字段,但在项目中必须使用,这样在新增等使用bean的时候,mybatis-plus就会忽略这个,不会报错*/@TableField(exist = false)String isChecked;

返回值是什么? 参数为什么是skuid 和spuid 应该是 spuId负责查询所有 skuId 负责筛选回显
分析返回的数据中 有什么信息 颜色和版本 所以要找有颜色和版本的类 ,因为一个skuid对应一种商品,要查出该商品所有的销售属性和属性值。而且要标识出本商品对应的销售属性 。
后半截

如果不加skuId 条件 是所有的sku 43 44

确定返回值 要看实体类 实体类的属性要比数据库全 可能会增加数据库没有的必要字段
属性类里有属性值

看到销售属性类中确实有 // 销售属性值对象集合

@Data
@ApiModel(description = "销售属性")
@TableName("spu_sale_attr")
public class SpuSaleAttr extends BaseEntity {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "商品id")@TableField("spu_id")private Long spuId;@ApiModelProperty(value = "销售属性id")@TableField("base_sale_attr_id")private Long baseSaleAttrId;@ApiModelProperty(value = "销售属性名称(冗余)")@TableField("sale_attr_name")private String saleAttrName;// 销售属性值对象集合@TableField(exist = false)List<SpuSaleAttrValue> spuSaleAttrValueList;}

持久层

    /*** mapper层 多个参数要用@Param("skuId") Long skuId,* @param skuId* @param spuId* @return*/List<SpuSaleAttr> selectSpuSaleAttrListCheckBySku(@Param("skuId") Long skuId,@Param("spuId")Long spuId);

控制层 的返回值List 有这个类就直接返回 多个{skuId}/{spuId}用@PathVariable(“skuId”) Long skuId,

    /*** 根据spuId,skuId 查询销售属性集合* @param skuId* @param spuId* @return*/@GetMapping("inner/getSpuSaleAttrListCheckBySku/{skuId}/{spuId}")public List<SpuSaleAttr> getSpuSaleAttrListCheckBySku(@PathVariable("skuId") Long skuId,@PathVariable("spuId") Long spuId){return manageService.getSpuSaleAttrListCheckBySku(skuId, spuId);}

4.2.5 实现商品切换 spuid

问题:不内连接行吗?

#貌似不连接也没问题
SELECT sku_id  , GROUP_CONCAT(sale_attr_value_id  ORDER BY sku_id ASC SEPARATOR '|') value_ids
FROM  `sku_sale_attr_value` sv
WHERE sv.spu_id=26
GROUP BY sku_id;

3、点击其他销售属性值的组合,跳转到另外的sku页面

需要同时有skuId spuId 和 sale_attr_value_id

分析用到那几张表
spu_sale_attr_value(商品销售属性值) spu_id(商品Id) base_sale_attr_id(销售属性Id)
sku_sale_attr_value(sku销售属性值表) sku_id(库存单元Id) spu_id() sale_attr_value_id(销售属性值Id)
SQL语句
skuId : sale_attr_value_id
控制层

业务层Dao层

难点
1 、从页面中获得得所有选中的销售属性进行组合比如:
“属性值1|属性值2” 用这个字符串匹配一个对照表,来获得skuId。并进行跳转,或者告知无货。
2、后台要生成一个“属性值1|属性值2:skuId”的一个json串以提供页面进行匹配。如

3、需要从后台数据库查询出该spu(26小米手机)下的所有skuId和属性值关联关系(43 44 两种小米手机
)。然后加工成如上的Json串,用该json串,跟前台匹配。

使用sql 语句来解决:
GROUP_CONCAT:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )

从数据库查询出来的是map
所以返回值应该是map集合
xml文件怎默写呢 返回类型是map

 <!--定义Map的resultMap--><resultMap id="spuValueIdsMap" type="java.util.Map" autoMapping="true"></resultMap><select id="selectSaleAttrValuesBySpu" resultMap="spuValueIdsMap">SELECT sku_id  , GROUP_CONCAT(sale_attr_value_id  ORDER BY sp.base_sale_attr_id ASC SEPARATOR '|')      value_idsFROM  `sku_sale_attr_value` svINNER JOIN `spu_sale_attr_value` sp on sp.id = sv.sale_attr_value_idWHERE sv.spu_id=#{spuId}GROUP BY sku_id
</select>

spu_id代表26小米手机
sku_id代表的是不同价格 不同颜色的小米手机 43 44 两种小米手机

每一种小米手机又有不同的颜色 内存等销售属性
注意是两个 43 44 所以是一个sku_id对应多个销售属性id 对应到商品上就是 一个小米手机是魅海星蓝 + 6+64 的

GROUP BY sku_id 必须加否则 报错…

返回值是一个map “属性值1|属性值2:skuId”的一个json串

/*** 根据spuId 查询map 集合属性* @param spuId* @return*/
Map getSkuValueIdsMap(Long spuId);

参数是spuId

@Override
public Map getSkuValueIdsMap(Long spuId) {Map<Object, Object> map = new HashMap<>();// key = 125|123 ,value = 37List<Map> mapList = skuSaleAttrValueMapper.selectSaleAttrValuesBySpu(spuId);if (mapList != null && mapList.size() > 0) {// 循环遍历for (Map skuMap : mapList) {// key = 125|123 ,value = 37map.put(skuMap.get("value_ids"), skuMap.get("sku_id"));}}return map;
}

如何把map转换为json字符串

// 保存 json字符串  map转换为json字符串String valuesSkuJson = JSON.toJSONString(skuValueIdsMap);

说明:目前我们在service-product里面把数据模型已经封装好了,接下封装feign client api接口,提供给service-item微服务调用汇总数据模型

商城电商day 06 三、商品详情业务需求分析相关推荐

  1. 电商平台关键词、商品详情API、品牌维护、价格监控、竞价比价

    以下是行业内了解到的一些情况,本帖只展示部分代码,需要更多API调试请移步注册API账号 http://console.open.onebound.cn/console/?i=Turbo 通过商品ID ...

  2. 软件架构-解密电商系统-互联网BAT商品详情缓存架构

    上几节说了中小型电商公司,项目详情页的优化方案,一般是使用freemark模板生成了html静态页面,放到nginx或者tomcat中,但是肯定选择nginx的并发是tomcat的100倍,通过mq的 ...

  3. 电商API接口获取商品详情数据

    item_get-获得淘宝商品详情 注册地址 请求参数 请求参数:num_iid=679894879441&is_promotion=1 参数说明:num_iid:淘宝商品ID is_prom ...

  4. 电商平台淘宝商品详情接口调用展示

    以下是行业内了解到的一些情况,本帖只展示部分代码,需要更多API调试请移步注册API账号 ​​​​​​​登录 - 跨境电商平台接口提供商 数据采集公司 数据接口定制服务 企业级数据服务商{     & ...

  5. 各大电商平台关键词、商品详情API、品牌情报与品牌保护、价格监控、竞价比价

    以下是行业内了解到的一些情况,本帖只展示部分代码,需要全部参数以及更多API调试请移步注册API账号 http://console.open.onebound.cn/console/?i=Rookie ...

  6. vue3,电商项目中的商品详情-图片预览组件

    目的:完成商品图片预览功能和切换 分享一个vueuse的插件useMouseInElement useMouseInElement的官方文档 // 监听DOM元素 target 绑定的DOM元素中鼠标 ...

  7. 电商项目实战之商品秒杀

    电商项目实战之商品秒杀 定时任务 corn表达式 实现方式 基于注解 基于接口 实战 秒杀系统 秒杀系统关注问题 秒杀架构设计 商品上架 获取当前秒杀商品 获取当前商品的秒杀信息 秒杀最终处理 参考链 ...

  8. 从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(三)

    这篇文章中,我们将讲解 Vue 实例的 Props 和 Methods,接着我们又讲解了最常见的 Vue 模板语法,并通过实例的方式将这些模板语法都实践了一番,最后我们讲解了 Vue 组件的组合,并完 ...

  9. 电子证书管理系统前台_电商平台后台之商品管理系统组成模块

    "前端用户的一小步,后台系统的一大步",平时常见的功能如购物车.优惠券等,看似简单,实则在后台要经过很多条件的校验.多系统间的信息流转.下面小猪电商介绍下电商平台后台之商品管理系统 ...

最新文章

  1. SAP EWM - 物料主数据 - EWM系统包装视图属性
  2. 数据结构——栈——中缀表达式和后缀表达式
  3. Linux基础之grep攻坚
  4. Android中使用Thread线程出现的问题
  5. hybird之web动态换肤实现
  6. Flume-监控之Ganglia
  7. 【原】iOS触摸事件深度解析
  8. BMCBIOS全擦升级
  9. 内网连接服务器时没有获取凭证页面怎么办?
  10. 关于ResNet50的解读
  11. 【nowcoder 219035】春游
  12. 开源 – “这是最好的时代,这是最坏的时代”
  13. sql查询语句,在表中的一个字段的部分数据中查看其他字段
  14. 图像分割评价指标模型总结
  15. 熹妃传服务器维护10.16,熹妃传2016最新版厨艺大赛攻略全解
  16. 如何将乐家桌面替换成当贝纯净桌面 ,一个步骤轻松解决
  17. JEESNS V1.2.0-RC3 发布,Java 开源 SNS 社区系统
  18. java 16进制比较_java – 比较带符号的十六进制数
  19. 用Java构建股指期货交易系统
  20. mysql统计出每个姓氏的人数_SQL统计实例——mysql实现

热门文章

  1. 爬虫ip在使用中被封了如何解决 ?
  2. 网页劫持防御方法,网页被劫持怎么办?
  3. 本体(Ontology)综述
  4. iOS 蓝牙扫描枪扫描内容不正确
  5. 多益网络2015校园招聘第二次笔试题
  6. 电子书搜索引擎,快速寻找和下载电子书,搞定99.9%的电子书资源!
  7. extjs给panel添加滚动条_ExtJs Panel 滚动条设置
  8. 【软考系统架构设计师】2009年下系统架构师综合知识历年真题
  9. 程序员拒绝春节带电脑回家被开除;小米国行不再支持安装Google框架;Excel具备图灵完备性,成第一大编程语言 | 架构视点...
  10. 曾做erp开发工程师,谈下自己的经验