文章目录
 
  
 
 
1、确认下单:购物车页面点击去结算
 
 
1.1、在OrderController类中创建 trade 方法
 
@RestController
@Tag(name = "订单管理模块", description = "订单管理模块")
@RequestMapping("/api/order/orderInfo")
public class OrderController {
	@Resource
    private OrderService orderService;
    
	
    @Operation(summary = "确认下单:购物车页面点击去结算")
    @GetMapping("/auth/trade")
    public Result trade() {
        TradeVo tradeVo = orderService.trade();
        return Result.ok(tradeVo);
    }
}
 
1.2、在CartController类中创建 checkedCartInfos
 
@RestController
@RequestMapping("/api/order/cart")
@Tag(name = "购物车模块")
public class CartController {
	    
    @Operation(summary = "查询用户购物车已选中购物项列表")
    @GetMapping("/auth/checkedCartInfos")
    public Result checkedCartInfos()
    {
        List<CartInfo> cartInfos = cartService.checkedCartInfos();
        return Result.ok(cartInfos);
    }
}
 
1.3、CartServiceImpl 实现 checkedCartInfos的业务功能
 
@Service
public class CartServiceImpl implements CartService {
    @Resource
    private RedisTemplate redisTemplate;
   
    private BoundHashOperations getUserCart() {
        UserInfo userInfo = SpzxServiceAuthInterceptor.THREAD_LOCAL.get();
        BoundHashOperations ops = redisTemplate.boundHashOps("spzx:cart:" + userInfo.getId());
        return ops;
    }
    @Override
    public List<CartInfo> checkedCartInfos() {
        
        BoundHashOperations<String,String,CartInfo> userCart = getUserCart();
        return userCart.values().stream().filter(cartInfo -> cartInfo.getIsChecked()==1).toList();
    }
}
 
1.4、在service-cart-client模块下定义远程openFeign接口
 
@FeignClient(value = "service-cart")
public interface CartClient {
    @GetMapping("/api/order/cart/auth/checkedCartInfos")
    public Result<List<CartInfo>> checkedCartInfos();
    @DeleteMapping("/api/order/cart/auth/delCheckedCartInfos")
    public Result<Void> delCheckedCartInfos();
}
 
1.5、在SpzxOrderApplication类上加上@EnableFeignClients
 
@SpringBootApplication
@EnableSpzxServiceAuth
@EnableFeignClients(basePackages = "com.atguigu.spzx")
@EnableCartClientConfig
@MapperScan(basePackages = "com.atguigu.spzx.order.mapper")
@EnableTransactionManagement
public class SpzxOrderApplication {
    public static void main(String[] args)
    {
        SpringApplication.run(SpzxOrderApplication.class,args);
    }
}
 
1.6、OrderServiceImpl 实现 trade的业务逻辑
 
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implements OrderService {
    @Resource
    private CartClient cartClient;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
	@Override
    public TradeVo trade() {
        
        Result<List<CartInfo>> cartInfos = cartClient.checkedCartInfos();
        if (cartInfos.getCode() != 200) {
            throw new SpzxException(ResultCodeEnum.FAIL,null);
        }
        List<CartInfo> cartInfoList = cartInfos.getData();
        if (CollectionUtils.isEmpty(cartInfoList)) {
            
            throw new SpzxException(ResultCodeEnum.FAIL,null);
        }
        Long token = IdUtil.getSnowflake(1,1).nextId();
        
        stringRedisTemplate.opsForValue().set("spzx:order:"+token.toString(), "1",  30, TimeUnit.MINUTES);
        
        List<OrderItem> orderItemList = cartInfoList.stream().map(cartInfo -> {
            OrderItem orderItem = new OrderItem();
            orderItem.setOrderId(token);
            orderItem.setSkuId(cartInfo.getSkuId());
            orderItem.setSkuName(cartInfo.getSkuName());
            orderItem.setSkuNum(cartInfo.getSkuNum());
            orderItem.setSkuPrice(cartInfo.getCartPrice());
            orderItem.setThumbImg(cartInfo.getImgUrl());
            return orderItem;
        }).toList();
        TradeVo tradeVo = new TradeVo();
        tradeVo.setOrderItemList(orderItemList);
        
        
        tradeVo.setTotalAmount(orderItemList.stream().map(orderItem -> {
            return orderItem.getSkuPrice().multiply(new java.math.BigDecimal(orderItem.getSkuNum()));
        }).reduce(BigDecimal::add).get());
        return tradeVo;
    }
}
 
1.7、此时启动 SpzxOrderApplication
 
 
java.lang.NullPointerException: Cannot invoke "com.atguigu.spzx.model.entity.user.UserInfo.getId()" 
because the return value of "com.atguigu.spzx.common.util.AuthContextUtil.getUserInfo()" is null
	at com.atguigu.spzx.cart.service.impl.CartServiceImpl.getAllCkecked(CartServiceImpl.java:147)
 
2、 openFeign拦截器使用
 

 
2.1、使用feign拦截器拦截请求,获取token,重新传递token
 
 
2.1.1、CartClientInterceptor
 
@Component
public class CartClientInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        String token = request.getHeader("token");
        
        requestTemplate.header("token", token);
    }
}
 
 
2.1.2、@EnableCartClientConfig
 
@Target({ElementType.TYPE})
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Documented
@Import(value = {CartClientInterceptor.class})
public @interface EnableCartClientConfig {
}
 
2.1.3、SpzxOrderApplication
 
@SpringBootApplication
@EnableSpzxServiceAuth
@EnableFeignClients(basePackages = "com.atguigu.spzx")
@EnableCartClientConfig
@MapperScan(basePackages = "com.atguigu.spzx.order.mapper")
@EnableTransactionManagement
public class SpzxOrderApplication {
    public static void main(String[] args)
    {
        SpringApplication.run(SpzxOrderApplication.class,args);
    }
}