品优购-秒杀下单
4.1 需求分析
商品详细页点击立即抢购实现秒杀下单,下单时扣减库存。当库存为 0 或不在活动期 范围内时无法秒杀。
4.2 后端代码
4.2.1 服务接口层
修改 pinyougou-seckill-interface 的 SeckillOrderService.java
/**
* 提交订单
* @param seckillId
* @param userId
*/
public void submitOrder(Long seckillId,String userId);
服务实现层
Spring 配置文件配置 IdWorker
pinyougou-seckill-service 的 SeckillOrderServiceImpl.java 实现方法
@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
@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, "提交失败");
}
}
转载于:https://blog.51cto.com/13517854/2312224