生活随笔
收集整理的這篇文章主要介紹了
Java之品优购课程讲义_day19(6)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
品優(yōu)購(gòu)-秒殺下單
4.1 需求分析
商品詳細(xì)頁(yè)點(diǎn)擊立即搶購(gòu)實(shí)現(xiàn)秒殺下單,下單時(shí)扣減庫(kù)存。當(dāng)庫(kù)存為 0 或不在活動(dòng)期 范圍內(nèi)時(shí)無法秒殺。
4.2 后端代碼
4.2.1 服務(wù)接口層
修改 pinyougou-seckill-interface 的 SeckillOrderService.java
/*** 提交訂單 * @param seckillId * @param userId */
public void submitOrder(Long seckillId,String userId);服務(wù)實(shí)現(xiàn)層
Spring 配置文件配置 IdWorker
pinyougou-seckill-service 的 SeckillOrderServiceImpl.java 實(shí)現(xiàn)方法 @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("商品已搶購(gòu)一空"); } //扣減(redis)庫(kù)存 seckillGoods.setStockCount(seckillGoods.getStockCount()-1);
redisTemplate.boundHashOps("seckillGoods").put(seckillId, seckillGoods);//放
回緩存 if(seckillGoods.getStockCount()==0){//如果已經(jīng)被秒光 seckillGoodsMapper.updateByPrimaryKey(seckillGoods);//同步到數(shù)據(jù)庫(kù)
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());//秒殺價(jià)格 seckillOrder.setSeckillId(seckillId); seckillOrder.setSellerId(seckillGoods.getSellerId());
seckillOrder.setUserId(userId);//設(shè)置用戶 ID seckillOrder.setStatus("0");//狀態(tài) 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, "提交失敗"); }
}
轉(zhuǎn)載于:https://blog.51cto.com/13517854/2312224
總結(jié)
以上是生活随笔為你收集整理的Java之品优购课程讲义_day19(6)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。