文章目录
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);
}
}