/miaoshagoods/do_miaosha
function checkPath() {
var goodsid = $("#goodsId2").text()
$.ajax({
url: "/miaoshavo/path",
type: "get",
data: {
"goodsId": goodsid
},
success: function (data) {
if (data.code == 200) {
var path = data.data
domiaosha(path)
}
}
})
}
/**
* 获取路径
*/
@AccessLimit(seconds = 5, maxCount = 5)
@GetMapping("path")
@ResponseBody
public ResultBean getMiaoShaPath(User user, @RequestParam("goodsId") Long goodsId, HttpServletRequest request) {
if (user == null) {
return ResultBean.error(AbnoNum.USERNAME_IS_ENIST);
}
// //查询访问次数 5秒 5次
// String url= request.getRequestURI();
// String key=url+user.getId();
//
// Integer count=redisService.get(AccessKey.getUserUrlcount, key,Integer.class);
// if(count==null){
// redisService.set(AccessKey.getUserUrlcount,key,1);
// }else if(count<5){
// redisService.incr(AccessKey.getUserUrlcount,key);
// }else {
// return ResultBean.error(AbnoNum.ACCESS_LIMIT_FREQUENTLY);
// }
return ResultBean.success(miaoshaOrderService.creatMiaoShaPath(user.getId(), goodsId));
}
/**
* 生成秒杀地址
* @param userId
* @param goodsId
* @return
*/
@Override
public String creatMiaoShaPath(long userId, long goodsId) {
//生成加密的路径
String path = UUID.randomUUID().toString().replace("-", "");
//写缓存
redisService.set(MiaoShaOrderKey.getMiaoShaPath,userId+"_"+goodsId,path);
return path;
}
function domiaosha(path) {
var goodsId = g_getQueryString("goodsId");
// var goodsId = $("#goodsId").val();
var addresss = $("#addresssId").val();
//获取商品id
$.ajax({
type: "POST",
url: "/miaoshavo/" + path + "/domiaosha",
dataType: "json",
data: {
"goodsId": goodsId,
"addresssId": addresss
},
success: function (data) {
console.log(data.message)
if (data.data == 0) {
getMiaoShaResult(goodsId);
} else {
alert(data.message);
}
}
});
}
@ResponseBody
@RequestMapping("/{path}/domiaosha")
public ResultBean findall(@RequestParam("goodsId") Long goodsId, @PathVariable String path, User user, long addresssId) throws Exception {
if (user == null) {
return ResultBean.error(AbnoNum.USERNAME_IS_ENIST);
}
try {
//验证path是否通过
boolean b = miaoshaOrderService.checkPath(user.getId(), goodsId, path);
if (!b) {
return ResultBean.error(AbnoNum.REQUEST);
}
//内存标记 减少redis访问
Boolean boo = localmap.get(goodsId);
if (boo) {
return ResultBean.error(AbnoNum.MIAOSHAGOODS_IS_ENIST);
}
//预减库存
Long stock = stringRedisTemplate.opsForValue().decrement(MiaoShaGoodKey.MiaoshaGoodskucun.getPrefix() + goodsId, 1);
if (stock < 0) {
localmap.put(goodsId, true);
return ResultBean.error(AbnoNum.MIAOSHAGOODS_IS_ENIST);
}
//判断是否秒杀到了
MiaoshaOrder miaoshaOrder = miaoshaOrderService.getMiaoShaUserByUserIdAndGoodsId(user.getId(), goodsId);
if (miaoshaOrder != null) {
stringRedisTemplate.opsForValue().increment(MiaoShaGoodKey.MiaoshaGoodskucun.getPrefix() + goodsId, 1);
return ResultBean.error(AbnoNum.ORDER_REPEAT);
}
} catch (Exception e) {
//最后一个商品下单出现错误 数据库减少库存失败了 redis 减少成功
stringRedisTemplate.opsForValue().increment(MiaoShaGoodKey.MiaoshaGoodskucun.getPrefix() + goodsId, 1);
return ResultBean.error(AbnoNum.order_error);
}
Future<?> future = executors.submit(new Runnable() {
@Override
public void run() {
MiaoShaMessage miaoShaMessage = new MiaoShaMessage();
miaoShaMessage.setGoodsId(goodsId);
miaoShaMessage.setUser(user);
miaoShaMessage.setAddresssId(addresssId);
sendMessage.sendDirectMessage(miaoShaMessage);
}
});
return ResultBean.success(0);
//获取是否秒杀到 前端实现结果轮询机制
function getMiaoShaResult(goodsId) {
var addresss = $("#addresssId").val();
$.ajax({
url: '/miaoshavo/result',
type: 'get',
data: {
"goodsId": goodsId,
"addresssId": addresss
},
success: function (res) {
var result = res.data
if (resut < 0) {
layer.msg("对不起,秒杀失败")
} else if (result == 0) {
//继续轮巡
setTimeout(function () {
getMiaoShaResult(goodsId)
}, 50);
} else {
layer.confirm("恭喜你,秒杀成功!查看订单? ", {btn: ["确定", "取消"]},
function () {
window.location.href = "/goodorder.htm?orderId=" + result;
},
function () {
layer.closeAll();
});
}
}
})
}
/**
* 大验证订单是否秒杀成功
* 0排队中
* -1秒杀失败
* orderid 秒杀成功
*/
@GetMapping("result")
@ResponseBody
public ResultBean miaoshaResult(User user, @RequestParam("goodsId") Long goodsId) {
if (user == null) {
return ResultBean.error(AbnoNum.USERNAME_IS_ENIST);
}
return ResultBean.success(miaoshaOrderService.getMiaoShaResult(user, goodsId));
}
/**
* 用户id和订单id查找订单
* @param user
* @param goodId
* @return
*/
@Override
public long getMiaoShaResult(User user, long goodId) {
MiaoshaOrder miaoShaOrder = getMiaoShaUserByUserIdAndGoodsId(user.getId(), goodId);
if(miaoShaOrder!=null){
return miaoShaOrder.getId();
}else {
boolean goodsOver = getGoodsOver(goodId);
if(goodsOver){
return -1;
}else {
return 0;
}
}
}