存储形式:
购物车存储形式——Cookie
无需登录、无需查库、保存在浏览器端g
优点:
性能好、访问快、没有和数据库交互
缺点
1、换电脑购物车数据会丢失
2、电脑被其他人登录,隐私安全
购物车存储形式——Session
用户登录后,购物车数据放入用户会话
优点:
初期用户量少,访问快
缺点:
1、session基于内容,用户量庞大影响服务器性能
2、只能存在于当前会话,不适用集群与分布式系统
购物车存储形式——数据库
用户登录后,购物车数据存入数据库
优点:
数据持久化,可在任何地点任何时间访问
缺点:
频繁读写数据库,造成数据库压力
购物车存储形式——Redis
用户登录后,购物车数据存入redis缓存
优点:
1、数据持久化,可在任何地点任何时间访问
2、频繁读写基于缓存,不会造成数据库压力
3、适用于集群与分布式系统,可扩展性强
项目选型:
未登录采用Cookie
登录采用Cookie+Redis
//TODO ⛔有关Redis的操作会在之后搭建集器环境时完善
购物车前端流程
购物车页面渲染
购物车页面数据可以直接从Cookie中获取并渲染吗?
不行,因为用户在添加购物车后,可能不是立刻结算,那么商品的数据(价格)可能会发生变化,所以我们在打开购物车页面时,应该进行数据的重新获取,更新一些信息(价格、名称、规格等)
编写SQL
根据商品规格的id查询对应商品的有关信息
SELECT
t_items.id AS itemId,
t_items.item_name AS itemName,
t_items_img.url AS itemImgUrl,
t_items_spec.id AS specId,
t_items_spec.`name` AS specName,
t_items_spec.price_discount AS priceDiscount,
t_items_spec.price_normal AS priceNormal
FROM
items_spec t_items_spec
LEFT JOIN
items t_items
ON
t_items.id = t_items_spec.item_id
LEFT JOIN
items_img t_items_img
ON
t_items_img.item_id = t_items.id
WHERE
t_items_img.is_main = 1
AND
t_items_spec.id IN
('1','3','5')
创建VO
package com.shiers.pojo.vo;
/**
* Demo class
*
* @author shierS
* @date 2021/6/1
*/
public class ShopcartVO {
private String itemId;
private String itemImgUrl;
private String itemName;
private String specId;
private String specName;
private String priceDiscount;
private String priceNormal;
//get\set...
}
编写mapper
<select id="queryItemsBySpecIds" parameterType="List" resultType="com.shiers.pojo.vo.ShopcartVO">
SELECT
t_items.id AS itemId,
t_items.item_name AS itemName,
t_items_img.url AS itemImgUrl,
t_items_spec.id AS specId,
t_items_spec.`name` AS specName,
t_items_spec.price_discount AS priceDiscount,
t_items_spec.price_normal AS priceNormal
FROM
items_spec t_items_spec
LEFT JOIN
items t_items
ON
t_items.id = t_items_spec.item_id
LEFT JOIN
items_img t_items_img
ON
t_items_img.item_id = t_items.id
WHERE
t_items_img.is_main = 1
AND
t_items_spec.id IN
<foreach collection="paramsList" index="index" item="specId" open="(" separator="," close=")">
#{specId}
</foreach>
</select>
编写service
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<ShopcartVO> queryItemsBySpecIds(String specIds) {
//对前端传入的规格id就行分隔
String ids[] = specIds.split(",");
List<String> specIdsList = new ArrayList<>();
//将数组中的元素全部添加到集合中
Collections.addAll(specIdsList,ids);
return itemsMapperCustom.queryItemsBySpecIds(specIdsList);
}
编写Controller
// 用于用户长时间未登录网站,刷新购物车中的数据(主要是价格),类似京东淘宝
@ApiOperation(value = "根据商品规格ids查询最新的商品数据", notes = "根据商品规格ids查询最新的商品数据", httpMethod = "GET")
@GetMapping("/refresh")
public MyJSONResult refresh(
@ApiParam(name = "itemSpecIds", value = "拼接的规格ids", required = true,example = "1001,1003,1005")
@RequestParam String itemSpecIds) {
if(StringUtils.isBlank(itemSpecIds)){
return MyJSONResult.ok();
}
List<ShopcartVO> list = itemService.queryItemsBySpecIds(itemSpecIds);
return MyJSONResult.ok(list);
}