黑马程序员技术交流社区

标题: 【郑州校区】Java之品优购课程讲义_day19(6) [打印本页]

作者: 谷粒姐姐    时间: 2018-11-2 14:32
标题: 【郑州校区】Java之品优购课程讲义_day19(6)
品优购-秒杀下单
4.1 需求分析
商品详细页点击立即抢购实现秒杀下单,下单时扣减库存。当库存为 0 或不在活动期 范围内时无法秒杀。
4.2 后端代码
4.2.1 服务接口层
修改 pinyougou-seckill-interface 的 SeckillOrderService.java
[AppleScript] 纯文本查看 复制代码
/** 
  * 提交订单
  * @param seckillId
  * @param userId
  */
public void submitOrder(Long seckillId,String userId);

服务实现层
Spring 配置文件配置 IdWorker
pinyougou-seckill-service 的 SeckillOrderServiceImpl.java 实现方法
[AppleScript] 纯文本查看 复制代码
@Autowired 
private RedisTemplate redisTemplate;
  
@Autowired
private IdWorker idWorker;
   
@Override
public void submitOrder(Long seckillId, String userId) {
  //从缓存中查询秒杀商品   
  TbSeckillGoods seckillGoods =(TbSeckillGoods)
redisTemplate.boundHashOps("seckillGoods").get(seckillId);
  if(seckillGoods==null){
   throw new RuntimeException("商品不存在");
  }
  if(seckillGoods.getStockCount()<=0){
   throw new RuntimeException("商品已抢购一空");
  }  
  //扣减(redis)库存   
  seckillGoods.setStockCount(seckillGoods.getStockCount()-1);
redisTemplate.boundHashOps("seckillGoods").put(seckillId, seckillGoods);//放
回缓存
  if(seckillGoods.getStockCount()==0){//如果已经被秒光
   seckillGoodsMapper.updateByPrimaryKey(seckillGoods);//同步到数据库  
redisTemplate.boundHashOps("seckillGoods").delete(seckillId);   
  }
  //保存(redis)订单
  long orderId = idWorker.nextId();
  TbSeckillOrder seckillOrder=new TbSeckillOrder();
  seckillOrder.setId(orderId);
  seckillOrder.setCreateTime(new Date());
  seckillOrder.setMoney(seckillGoods.getCostPrice());//秒杀价格
  seckillOrder.setSeckillId(seckillId);
  seckillOrder.setSellerId(seckillGoods.getSellerId());
seckillOrder.setUserId(userId);//设置用户 ID
  seckillOrder.setStatus("0");//状态
  redisTemplate.boundHashOps("seckillOrder").put(userId, seckillOrder);
}

控制层
修改 pinyougou-seckill-web 的 SeckillOrderController.java
[AppleScript] 纯文本查看 复制代码
@RequestMapping("/submitOrder") 
public Result submitOrder(Long seckillId){
  String userId =
SecurityContextHolder.getContext().getAuthentication().getName();
  if("anonymousUser".equals(userId)){//如果未登录
   return new Result(false, "用户未登录");
  }
  try {
   seckillOrderService.submitOrder(seckillId, userId);
   return new Result(true, "提交成功");
  }catch (RuntimeException e) {
   e.printStackTrace();
   return new Result(false, e.getMessage());
  } catch (Exception e) {
   e.printStackTrace();
   return new Result(false, "提交失败");
  }
}








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2