day08一、购物车业务简介
功能要求:
- 要持久化,保存到数据库中。Mysql – cartInfo
- 利用缓存提高性能。Redis
- 未登录状态也可以存入购物车,一旦用户登录要进行合并操作。
- 同步保存Redis,异步更新Mysql
三、功能—添加入购物车
3.1 功能解析:
1、 商品详情页添加购物车
2、 添加购物车,用户可以不需要登录,如果用户没有登录,则生成临时用户id,购物车商品与临时用户id关联,当用户登录后,将临时用户id的购物车商品与登录用户id的商品合并
3、 商品详情添加购物车时,先判断用户是否登录,如果没登录,再判断是否存在临时用户,如果cookie中也没有临时用户,则生成临时用户
分析用到那几张表
cart_info(购物车表) user_id sku_id
SQL语句
控制层
业务层Dao层
无返回值 参数 Long skuId, String userId, Integer skuNum
难点
添加购物车的逻辑
/*
1. 添加商品之前,先看一下购物车中是否有该商品
true:
商品数量相加
false:
直接加入购物车
2. 将数据同步到redis!
*/
// 1 获取到购物车key
// 2购物车的key 在缓存中不存在!
// 3 加载数据库中的数据到缓存!
4缓存中有商品 数量相加
// 5赋值商品的实时价格
// 6从新设置修改时间
// 7再次选中
// 8执行更新语句
/// 8缓存中没有商品 插入
//9先远程调用getSkuInfo 得到SkuInfo
//10购物车设置的属性由SkuInfo.get获取
// 11 执行数据库操作
// 放入缓存
思路:既然userId是从服务网关统一传递过来的,那么临时用户id我们也可以从网关传递过来,改造网关
网关中获取临时用户id
在server-gateway 项目中添加
网关中获取临时用户id
在server-gateway 项目中添加
/**
* 获取当前用户临时用户id
* @param request
* @return
*/
private String getUserTempId(ServerHttpRequest request) {
String userTempId = "";
List<String> tokenList = request.getHeaders().get("userTempId");
if(null != tokenList) {
userTempId = tokenList.get(0);
} else {
MultiValueMap<String, HttpCookie> cookieMultiValueMap = request.getCookies();
HttpCookie cookie = cookieMultiValueMap.getFirst("userTempId");
if(cookie != null){
userTempId = URLDecoder.decode(cookie.getValue());
}
}
return userTempId;
}
将userTempId 添加header请求头
//设置网关请求头
String userTempId = this.getUserTempId(request);
if(!StringUtils.isEmpty(userId) || !StringUtils.isEmpty(userTempId)) {
if(!StringUtils.isEmpty(userId)) {
request.mutate().header("userId", userId).build();
}
if(!StringUtils.isEmpty(userTempId)) {
request.mutate().header("userTempId", userTempId).build();
}
//将现在的request 变成 exchange对象
return chain.filter(exchange