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>