电商第六天:
回顾:
- spu,sku 保存! 注意事务!
2. 商品详情业务介绍!
3. 商品详情中需要开发的功能,以及扩展功能介绍!
4. 模板渲染Thymeleaf !
必须要完成的是 : 后台得有商品!
重点:
- 完成商品详情数据获取!
a. 商品详情页面URL 分析!
首页:https://www.jd.com/
检索:https://list.jd.com/list.html?cat=9987,653,655
详情:https://item.jd.com/100014348492.html
https://item.jd.com/100014348492.html skuId 如何传递进来的? 商品检索列表中获取!
https://item.jd.com/{skuId}.html
item.jd.com : 域名
{skuId}.html:控制器
@GetMapping("{skuId}.html")
public String item(@Pathvariable Long skuId){
SkuInfo skuInfo = getSkuInfo(skuId);
// skuInfo 存储!
// 返回视图名称:
return "item";
}
b. 商品详情相关模块划分
c. 功能开发:
创建一个service-item 微服务! 主要的作用?
d. 在 service-prduct 中 数据提供!
1. 分类信息数据
分析:
数据获取过程:
a. 商品详情页面中只有一个 skuId !
b. 分类名称 分别在 category1 category2 category3;
select category3_id from sku_info where id = 21; # category3_id = 61
select name,category2_id from base_category3 where id = 61; #
select name,category1_id from base_category2 where id = 13; #
select name from base_category1 where id = 2; #
view 视图 在电商中结合使用! 虚拟表!
create view v_name as sql;
2. 商品的基本信息 skuInfo + skuImageList
3. 价格需要单独查询:保证数据是实时价格!
4. 回显销售属性 + 销售属性值 + 锁定!
a. 根据 spuId 获取到销售属性 + 销售属性值!
select ssa.id,
ssa.spu_id,
ssa.base_sale_attr_id,
ssa.sale_attr_name,
ssav.id sale_attr_value_id,
ssav.sale_attr_value_name
from spu_sale_attr ssa
inner join spu_sale_attr_value ssav on
ssa.spu_id = ssav.spu_id and ssa.base_sale_attr_id = ssav.base_sale_attr_id
where ssa.spu_id = 9;
b. 根据skuId 找到对应的销售属性值Id !
select * from sku_sale_attr_value where sku_id = 21;
c. 将以上两条sql 语句进行整合!
select ssa.id,
ssa.spu_id,
ssa.base_sale_attr_id,
ssa.sale_attr_name,
ssav.id sale_attr_value_id,
ssav.sale_attr_value_name,
sav.sku_id,
if(sav.sku_id is null, 0 ,1) is_checked
from spu_sale_attr ssa
inner join spu_sale_attr_value ssav on
ssa.spu_id = ssav.spu_id and ssa.base_sale_attr_id = ssav.base_sale_attr_id
left join sku_sale_attr_value sav on ssav.id = sav.sale_attr_value_id and sav.sku_id = 21
where ssa.spu_id = 9
order by ssav.base_sale_attr_id,ssav.id;
is_checked = 0 ; 不选中, is_checked = 1 选中!
5. 切换功能:用户通过点击不同的销售属性值Id,来切换skuId!
分析:
a. 获取到前端点击的销售属性值Id!
skuId = 21
用户点击:valueId = 3729|3731 组成skuId = 21
http://item.gmall.com/21.html
用户点击:valueId = 3729|3730 组成skuId = 22
http://item.gmall.com/22.html
用户点击:valueId = 3728|3730 组成skuId = null
http://item.gmall.com/22.html 不动!
b. 在后台将某个spuId 组成的valueId 与 skuId 生成一个Json 字符串!
spuId = 9 ; skuId = 21 ,22
Json 字符串:{"3729|3730":"22","3729|3731":"21"}
此时,用户如果点电击了 “3729|3731”
功能开发:
数据来源:
销售属性值Id ,skuId!
spu_sale_attr_value 销售属性值Id!
sku_sale_attr_value 销售属性值Id ,skuId!
关键点:
select group_concat(sale_attr_value_id order by base_sale_attr_id separator '|') value_ids, sku_id
from sku_sale_attr_value sav
inner join spu_sale_attr_value ssav
on sav.sale_attr_value_id = ssav.id and sav.spu_id = 9
group by sav.sku_id;
获取数据:
// 第一种方式:
class ParamDTO{
String valueIds = "";
Long skuId = "";
}
List<ParamDTO> dtoList = xxx();
// 第二种方式:
从前有个实体类 ,承载数据的!
Map 可以 代替实体类 KEY VALUE
KEY -- valueIds
KEY -- skuId
VALUE -- value
VALUE -- value
结论:map 可以代替实体类!
6. 海报
7. 规格参数
SQL:
select * from base_attr_info bai
inner join base_attr_value bav on bai.id = bav.attr_id
inner join sku_attr_value sav on bav.id = sav.value_id
where sav.sku_id = 21;