5-4 秒杀静态化

Get:幂等的  无论调用多少次,从服务端返回的结果都是一样的,并且不会对服务端的数据产生影响。

Post:不是幂等的,向服务端提交数据,对服务端的数据造成影响 


@RequestParam("goodsId")long goodsId) 

对应:

function doMiaosha(){//秒杀的时候,需要向服务端传递参数
$.ajax({
url: '/miaosha/do_miaosha',
data: {//post提交表单的时候,url参数可以放在data中
goodsId: $("#goodsId").val();

},

也对应:

<input type="hidden" name="goodsId" id="goodsId"/>

要么是POST传递,要么是表单传递。

产生url的两种方式:

①是页面中的url,如:

<a href.....></a>。

②在javascript中构造的url, 如:

function doMiaosha(){//秒杀的时候,需要向服务端传递参数
$.ajax({
url: '/miaosha/do_miaosha',
type: "POST",
data: {//post提交表单的时候,url参数可以放在data中
goodsId: $("#goodsId").val()
},

一、MiaoshaController中

@RequestMapping(value="/do_miaosha", method=RequestMethod.POST)
@ResponseBody
    public Result<OrderInfo> miaosha(MiaoshaUser user, @RequestParam("goodsId")long goodsId) {
//RequestParam可以把保单隐含提交的input标签对应name属性的元素取出
if(user == null){
return Result.error(CodeMsg.SESSION_ERROR);
}
GoodsVo goodsVo = goodsService.getOneGoodsVoById(goodsId);
int stockCount = goodsVo.getStockCount();
if(stockCount <= 0){
return Result.error(CodeMsg.MIAO_SHA_OVER);
}
//防止一个人秒杀多个商品,判断是否已经秒杀到了  ==> 到OrderService中去查找(查找生成的秒杀类型的订单,这种订单必须是一个用户和一个特价商品关联产生的,且每个用户只能产生一个)
MiaoshaOrder miaoshaOrder = orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(),goodsId);
if(miaoshaOrder != null){
return Result.error(CodeMsg.REPEAT_MIAOSHA);
}
//减库存,下(写)订单,写入秒杀订单(需要在一个事物当中去做,搞一个service,做一个MiaoshaService,然后进行一个Transaction操作)
OrderInfo orderInfo = miaoshaService.miaosha(user, goodsVo);//为什么成功了以后要返回订单呢?因为我们想秒杀成功之后直接进入到订单详情页
//把订单的详细信息写入到我们的页面上
return Result.success(orderInfo);

}

 二、goods_detail.htm中

<button class="btn btn-primary btn-block" type="button" id="buyButton" onClick="doMiaosha()">立即秒杀</button>
<input type="hidden" name="goodsId" id="goodsId"/>

function doMiaosha(){//秒杀的时候,需要向服务端传递参数
$.ajax({
url: '/miaosha/do_miaosha',
type: "POST",
data: {//post提交表单的时候,url参数可以放在data中
goodsId: $("#goodsId").val()  //充当url中的参数
},
success:function(data){//成功的时候会有一个回调,data是返回的数据,该数据应该是一个对象类型,或字典类型
if(data.code == 0){
/* render(data.data);//这里需要一个渲染页面的函数 render */
window.location.href="/order_detail.htm?orderId=" + data.data.id;
}else{
layer.msg(data.msg);
}
},
error:function(){
layer.msg("客户端请求有误");
}
});
}

三、order_detail.htm:

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"></meta>
<title>订单详情</title>
<!-- jquery -->
<!-- 这里 / 代表 的是static文件夹,这是thymeleaf引入静态文件的方式。 -->
<script type="text/javascript" src="/js/jquery.min.js"></script>
<!-- bootstrap -->
<link rel="stylesheet" type="text/css" href="/bootstrap/css/bootstrap.min.css"></link>
<script type="text/javascript" src="/bootstrap/js/bootstrap.min.js"></script>
<!-- jquery-validation -->
<script type="text/javascript" src="/jquery-validation/jquery.validate.min.js"></script>
<script type="text/javascript" src="/jquery-validation/localization/messages_zh.js"></script>
<!-- layer -->
<script type="text/javascript" src="/layer/layer.js"></script>
<!-- common.js -->
<script type="text/javascript" src="/js/common.js"></script>
</head>
<body>
<div class="panel panel-default">
<div class="panel-heading">秒杀订单详情</div>
<table class="table" id="goodslist">
<tr>
<td>商品名称</td>
<td id="goodsName" colspan="3"></td>
</tr>
<tr>
<td>商品图片</td>
<td colspan="2"><img id="goodsImg" width="200" height="200"/></td>
</tr>
<tr>
<td>订单价格</td>
<td colspan="2" id="orderPrice"></td>
</tr>
<tr>
<td>下单时间</td>
<td colspan="2" id="createDate"></td>
</tr>
<tr>
<td>订单状态</td>
<td id="orderStatus"></td>
<!-- <td th:if="${orderInfo.status eq 0}">未支付</td>
<td th:if="${orderInfo.status eq 1}">已支付</td>
<td th:if="${orderInfo.status eq 2}">已发货</td>
<td th:if="${orderInfo.status eq 3}">已收货</td>
<td th:if="${orderInfo.status eq 4}">已退款</td>
<td th:if="${orderInfo.status eq 5}">已完成</td> -->
<td>
<button class="btn btn-primary btn-block" type="submit" id="payButton">立即支付</button>
</td>
</tr>
<tr>
<td>收货人</td>
<td>XXX 13812341234</td>
</tr>
<tr>
<td>收货地址</td>
<td>北京市昌平区回龙观龙博一区</td>
</tr>
</table>
<p ></p>
</div>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/jiuweideqixu/article/details/80464365