订单展示
1. 功能要点
秒杀,进入排队,等待秒杀结果 getResult
秒杀成功,跳转订单页面 跳转
订单页面
1./seckill/getResult
商品秒杀后,成功预减库存后,发送下单消息到队列,这个时候先返回前端用户“正在排队中”,只有真正下单,把数据写入到数据库,同时会把订单信息放在redis中,(oredr:userId:goodsId),这个时候才会返回秒杀成功,提示跳转到订单详情页面
如果查询到商品已经没有库存,同时又没有下单成功,这个时候前端就不需要返回调用getResult,直接提示商品已经全部秒杀完成
跳转订单详情页面
window.location.href="/orderDetail.htm?orderId="+result;
2. 代码实现
orderDetail.htm
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>商品列表</title>
<script type="text/javascript" src="/js/jquery.min.js" ></script>
<script type="text/javascript" src="/js/common.js"></script>
</head>
<body>
<table>
<tr>
<td>订单号</td>
<td id="id" ></td>
</tr>
<tr>
<td>商品名称</td>
<td id="goodsName"></td>
</tr>
<tr>
<td>商品图片</td>
<td>
<img id ="goodsImg" width="200px" height="200px" />
</td>
</tr>
<tr>
<td>商品单价</td>
<td id="goodsPrice"></td>
</tr>
<tr>
<td>创建时间</td>
<td id="createDate"></td>
</tr>
<tr>
<td>商品状态</td>
<td id="status">
</td>
</tr>
</table>
</body>
<script>
var orderId= g_getQueryString("orderId");
//orderDetail.htm?orderId=123
$(function (){
init();
})
function init(){
console.log("init...");
$.ajax({
url:"/order/detail",
type:"post",
data:{orderId:orderId},
success:function (data){
if(data.code==200){
//alert("登录成功");
//console.log(data.obj);
render(data.obj);
//window.location.href="/goods/toList"
}else{
alert(data.message);
}
},
error:function (data){
alert("商品详情出现问题");
}
})
}
function render(obj) {
var status = ["已提交未付款", "其他状态"]
var order = obj.order;
var goodsVo=obj.goodsVo;
$("#id").text(order.id);
$("#goodsName").text(order.goodsName);
$("#goodsImg").attr("src",goodsVo.goodsImg);
$("#goodsPrice").text(order.goodsPrice);
$("#status").text(status[order.status]);
$("#createDate").text(new Date(order.createDate).format('yyyy-MM-dd HH:mm:ss'));
}
</script>
</html>
OrderController detail
package com.example.miaosha.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.miaosha.mapper.OrderMapper;
import com.example.miaosha.pojo.Order;
import com.example.miaosha.pojo.User;
import com.example.miaosha.service.IGoodsService;
import com.example.miaosha.service.IOrderService;
import com.example.miaosha.vo.GoodsVo;
import com.example.miaosha.vo.OrderDetailVo;
import com.example.miaosha.vo.RespBean;
import com.example.miaosha.vo.RespBeanEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 前端控制器
* </p>
*
* @author cch
* @since 2021-11-17
*/
@Controller
@Slf4j
@RequestMapping("/order")
public class OrderController {
@Autowired
private IOrderService orderService;
@Autowired
private IGoodsService goodsService;
@RequestMapping("/detail")
@ResponseBody
public RespBean detail(Model model, User user, @RequestParam Long orderId){
if(null==user){
return RespBean.error(RespBeanEnum.SESSION_ERROR);
}
//判断秒杀库存 判断是否重复秒杀 秒杀(减库存 添加订单信息,添加秒杀订单信息)
Order order = orderService.getOne(new QueryWrapper<Order>().eq("id", orderId));
if(order==null){
return RespBean.error(RespBeanEnum.ORDER_NOT_EXIST);
}
GoodsVo goodsVo=goodsService.findGoodsVoById(order.getGoodsId());
OrderDetailVo orderDetailVo = new OrderDetailVo(order, goodsVo);
return RespBean.success(orderDetailVo);
}
}
OrderDetailVo
package com.example.miaosha.vo;
import com.example.miaosha.pojo.Order;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderDetailVo {
private Order order;
private GoodsVo goodsVo;
}