前端秒杀结果轮询实现

  rabbitmq:
    host: 192.168.0.108
    port: 5672
    username: admin
    password: admin
package com.java1234.miaosha.controller;

import com.java1234.miaosha.constant.Constant;
import com.java1234.miaosha.entity.MiaoShaMessage;
import com.java1234.miaosha.entity.Order;
import com.java1234.miaosha.entity.R;
import com.java1234.miaosha.entity.User;
import com.java1234.miaosha.rabbitmq.MQSender;
import com.java1234.miaosha.service.IMiaoShaGoodsService;
import com.java1234.miaosha.service.IMiaoShaService;
import com.java1234.miaosha.service.IOrderService;
import com.java1234.miaosha.util.RedisUtil;
import com.java1234.miaosha.util.StringUtil;
import com.java1234.miaosha.vo.MiaoShaGoodsVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 秒杀控制器
 */
@RestController
@RequestMapping("/miaoSha")
public class MiaoShaController {

    @Autowired
    private RedisUtil redisUtil;

    @Autowired
    private IMiaoShaGoodsService miaoShaGoodsService;

    @Autowired
    private IMiaoShaService miaoShaService;

    @Autowired
    private IOrderService orderService;


    @Autowired
    private MQSender mqSender;

    /**
     * 执行秒杀
     * @param request
     * @param miaoShaGoodsId
     * @return
     */
    @RequestMapping("/exec")
    public R exec(HttpServletRequest request, Integer miaoShaGoodsId,String verifyCode){
        if(StringUtil.isEmpty(verifyCode)){
            return R.error("验证码不能为空!");
        }
        //第一步:根据token得到用户user对象
        String token = request.getHeader("token");
        System.out.println("token:"+token);
        User user = (User)redisUtil.get(Constant.REDIS_TOKEN_PREFIX, token);
        System.out.println(user);

        Object rnd=redisUtil.get(Constant.REDIS_VERIFYCODE_PREFIX, user.getId() + "," + miaoShaGoodsId);
        if(rnd==null){
            return R.error("验证码过期,请重新点击刷新验证码!");
        }
        if(!verifyCode.equals(String.valueOf(rnd))){
            return R.error("验证码结果错误!");
        }

        MiaoShaMessage mm=new MiaoShaMessage();
        mm.setUser(user);
        mm.setMiaoShaGoodsId(miaoShaGoodsId);
        mqSender.sendMiaoShaMessage(mm);

        return R.ok("排队中");
//        //第二步:判断库存是否足够
//        MiaoShaGoodsVo miaoShaGoods = miaoShaGoodsService.findById(miaoShaGoodsId);
//        Integer stock = miaoShaGoods.getStock();
//        if(stock<=0){
//            return R.error("库存不足!");
//        }
//
//        //第三步:判断用户是否重复秒杀
//        HashMap map = new HashMap();
//        map.put("user_id",user.getId());
//        map.put("miaosha_goods_id",miaoShaGoodsId);
//        Order orderE = orderService.findByUserIdAndMiaoShaGoodsId(map);
//        if(orderE!=null){
//            return R.error("您已经秒杀过此商品,不能重复秒杀");
//        }
//
//        //第四步:减库存,下订单,必须同一个事务
//        String orderId = miaoShaService.miaoSha(user, miaoShaGoods);
//        if(orderId!=null){
//            Map<String,Object> resultMap=new HashMap<>();
//            resultMap.put("orderId",orderId);
//            return R.ok(resultMap);
//        }else{
//            return R.error("系统异常,请稍后重试!");
//        }
    }

    /**
     * 秒杀结果查询
     * @param request
     * @param miaoShaGoodsId
     * @return  >0 返回orderId 订单ID -1 秒杀失败 0  排队中
     */
    @RequestMapping("/result")
    public R result(HttpServletRequest request,Integer miaoShaGoodsId){
        String token = request.getHeader("token");
        System.out.println("token:"+token);
        User user = (User)redisUtil.get(Constant.REDIS_TOKEN_PREFIX, token);
        System.out.println(user);
        String result=miaoShaService.getMiaoShaResult(user.getId(),miaoShaGoodsId);
        Map<String,Object> resultMap=new HashMap<>();
        resultMap.put("result",result);
        return R.ok(resultMap);
    }
}

getMiaoShaResult(miaoShaGoodsId){
      let url = getServerUrl("miaoSha/result");
      let token = window.sessionStorage.getItem("token");
      axios.defaults.headers.common['token'] = token;
      axios.get(url,{
        params:{
          miaoShaGoodsId:this.$route.params.id,
          verifyCode:this.verifyCode
        }
      }).then(response=>{
        let data = response.data;
        if(data.code!=0){
          alert(data.msg);
        }else{
          let result=data.result;
          if(result=="0"){  // 排队中,继续轮询
              setTimeout(function (){
                  this.getMiaoShaResult(miaoShaGoodsId)
              },50);
          }else if(result=="-1"){
              this.miaoShaResult="秒杀失败";
          }else{
            alert("秒杀成功! ");
            alert(result);
          }
        }
      }).catch(error=>{
        alert(error+"-请联系管理员");
      })
    },
    <input id="verifyCode" type="text" style="width: 60px;height: 23px;padding: 4px;border: 1px solid gray;" v-model="verifyCode" v-show="miaoShaGoods.miaoShaStatus==1"/>
        <el-button v-show="miaoShaGoods.miaoShaStatus==1" type="primary" size="small" @click="exec_miaosha">立即秒杀</el-button>
        <p style="color: red">{{miaoShaResult}}</p>
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值