6.购物车的实现

购物车分为临时购物车和登录购物车,使用了redis的hash结构

整个存放结构:登录购物车key=gulimall:cart:userId field:skuId value:skuId对应的商品id

临时购物车key=gulimall:cart:uuid field:skuId value:skuId对应的商品id

添加商品到购物车都需要判断用户的登录状态,通过拦截器将用户的登录信息放到Threadlocal中,如果第一次使用购物车默认会为用户添加一个uuid

获取购物车:首先判断用户有没有登录,没有登录展示临时购物车,登录了首先要看临时购物车有没有数据,如果有数据就要合并到登录购物中去,合并完成删除临时购物车

7.feign的相关问题

 解决方案:添加一个feign的请求拦截器,在调用之前设置一下请求头信息

 代码: 
/** * feign配置类 **/ @Configuration public class GulimallFeignConfig { /** *
注入拦截器 * feign调用时根据拦截器构造请求头,封装cookie解决远程调用时无法获取springsession */
@Bean("requestInterceptor") public RequestInterceptor requestInterceptor() { //
创建拦截器 return new RequestInterceptor() { @Override public void
apply(RequestTemplate template) {
System.out.println("feign远程调用,拦截器封装请求头...RequestInterceptor.apply"); //
1、使用RequestContextHolder拿到原生请求的请求头信(上下文环境保持器) //
从ThreadLocal中获取请求头(要保证feign调用与controller请求处在同一线程环境) ServletRequestAttributes
requestAttributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes(); if (requestAttributes != null) {
HttpServletRequest request = requestAttributes.getRequest();// 获取controller请求对象
if (request != null) { //2、同步请求头的数据(cookie) String cookie =
request.getHeader("Cookie");// 获取Cookie template.header("Cookie", cookie);//
同步Cookie } } } }; } }

 解决方案:将原来共享的ThreadLocal中的信息放到自己的Threadlocal中

 代码:
// 获取当前线程上下文环境器 ServletRequestAttributes requestAttributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> { //
1.查询封装当前用户收货列表 // 同步上下文环境器,解决异步无法从ThreadLocal获取RequestAttributes
RequestContextHolder.setRequestAttributes(requestAttributes);
List<MemberAddressVO> address = memberFeignService.getAddress(member.getId());
result.setMemberAddressVos(address); }, executor);
8.下单流程

选中商品添加到购物车,点击去结算,来到结算详情页,需要查询会员的收货地址列表、所有选中的购物项、优惠信息(会员的积分),查询库存信息(有货无货),商品总金额,应付金额,商品总数,最重要的就是防重令牌,确认号商品信息就可以点击去支付,这样的话库存就会锁定,订单如果出现异常或者不支付就会通过消息队列进行通知,让库存解锁

9.幂等性的解决方案

1.使用令牌机制(token)

2.各种锁机制(乐观锁,悲观锁,分布式锁)

3.唯一约束(数据库唯一约束,set nx)

4.防重表

5.全局请求唯一id

10.支付功能

使用的是支付宝的沙箱功能

涉及到了内网穿透

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信