当前位置: 首页 > news >正文

简述企业网站的建设过程手机免制作app软件下载

简述企业网站的建设过程,手机免制作app软件下载,济南最好的网站制作公司,wordpress 谷歌插件文章目录 1、确认下单:购物车页面点击去结算1.1、在OrderController类中创建 trade 方法1.2、在CartController类中创建 checkedCartInfos1.3、CartServiceImpl 实现 checkedCartInfos的业务功能1.4、在service-cart-client模块下定义远程openFeign接口1.5、在SpzxO…

文章目录

  • 1、确认下单:购物车页面点击去结算
    • 1.1、在OrderController类中创建 trade 方法
    • 1.2、在CartController类中创建 checkedCartInfos
    • 1.3、CartServiceImpl 实现 checkedCartInfos的业务功能
    • 1.4、在service-cart-client模块下定义远程openFeign接口
    • 1.5、在SpzxOrderApplication类上加上@EnableFeignClients
    • 1.6、OrderServiceImpl 实现 trade的业务逻辑
    • 1.7、此时启动 SpzxOrderApplication
  • 2、 openFeign拦截器使用
    • 2.1、使用feign拦截器拦截请求,获取token,重新传递token
      • 2.1.1、CartClientInterceptor
      • 2.1.2、@EnableCartClientConfig
      • 2.1.3、SpzxOrderApplication

1、确认下单:购物车页面点击去结算

  • 点击去结算这个按钮,会发起一个请求,这个请求是trade,然后展示我们要购买的商品商品的总金额
    在这里插入图片描述

1.1、在OrderController类中创建 trade 方法

@RestController
@Tag(name = "订单管理模块", description = "订单管理模块")
@RequestMapping("/api/order/orderInfo")
public class OrderController {@Resourceprivate OrderService orderService;//查询购物车中选中的购物项列表 转为 orderItem 列表交给前端展示@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 {//只要请求头中携带token,不需要再传用户id@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 {@Resourceprivate RedisTemplate redisTemplate;private BoundHashOperations getUserCart() {UserInfo userInfo = SpzxServiceAuthInterceptor.THREAD_LOCAL.get();BoundHashOperations ops = redisTemplate.boundHashOps("spzx:cart:" + userInfo.getId());return ops;}@Overridepublic List<CartInfo> checkedCartInfos() {//泛型1:redis键类型,泛型2:hash的key类型, 泛型3:hash的value的类型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 {@Resourceprivate CartClient cartClient;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic TradeVo trade() {//1、查询 当前用户 的购物车中已选中的购物项列表(cart服务管理购物车数据)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();//将token存到redis:redis的大key问题stringRedisTemplate.opsForValue().set("spzx:order:"+token.toString(), "1",  30, TimeUnit.MINUTES);//2、将购物项列表转为 OrderItem列表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

-点击 购物车页面的 去结算按钮 发现报错NullPointerException

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 nullat com.atguigu.spzx.cart.service.impl.CartServiceImpl.getAllCkecked(CartServiceImpl.java:147)

2、 openFeign拦截器使用

在这里插入图片描述

2.1、使用feign拦截器拦截请求,获取token,重新传递token

针对service-cart微服务是获取不到当前登录用户的信息。原因:service-order微服务调用service-cart微服务的时候,是通过openFeign进行调用,openFeign在调用的时候会丢失请求头

2.1.1、CartClientInterceptor

@Component
public class CartClientInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {//1、获取引入cartClient模块的 项目 在使用cartClient时  请求报文中的tokenServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();String token = request.getHeader("token");//2、将token设置到feign客户端的请求报文中requestTemplate.header("token", token);}
}

现在订单服务无法使用feign拦截器,因为这个组件类放到了com.atguigu.spzx.cart.interceptor下面,订单服务扫描不到,如果我们想启用它,可以创建注解,然后把注解加到订单服务的启动类上面

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);}
}
http://www.yayakq.cn/news/237744/

相关文章:

  • 门户网站建设自查wordpress图片外链转内链
  • myapp wordpress优化网站价格
  • 做十个网站网站建设论文标题
  • dede大气企业网站模板(一屏展示)平面设计网站知乎
  • 临沂网网站建设网站建设文献综述
  • 长沙知名网站wordpress 表单留言
  • 大连做网站建设无锡微信网站建设
  • 福州企业网站建站模板代运营电商机构
  • 企业网站维护是指网站建设网站多少钱
  • 那个网站教做菜做的好溧阳市建设工程质量监督站网站
  • 产品网站建设公司大连建站公司
  • 做产品网站营销推广南京市网站开发
  • 江阴网站设计哪家好域名查询是否被注册
  • 百度网站验证是腾讯网站谁做的
  • 加强门户网站建设方案盐城网站建设24gx
  • wordpress全屏动画昆明seo关键词
  • 菏泽郓城网站建设深圳做网站设计公司
  • 创建网站怎么收费上海网站建设公司 珍岛
  • 郑州网站建设学习保定网站建设培训班
  • 徐州网站关键词推广北京市工程建设信息交易网站
  • 查询网138网站域名装修电话
  • 万户网络建一个网站虽要多少钱北京搜索排名优化
  • 如何为一个网站做短连接申请注册网站
  • 网站优化内链怎么做百度竞价推广是什么意思
  • 东莞网站建设哪家公司好h5网站开发培训机构
  • 能浏览的海外网站wordpress密码设置不
  • 网站高速下载如何做手机版传奇网站
  • 仿糗事百科网站源码惠州网络推广领头
  • 怎样做网站内链建设网站报告书
  • 宿迁建站网商城软件下载