面试:订单模块技术要点
技术要点:
1、安全漏洞解决方案
2、订单号生成规则
3、强大的常量、枚举设计
一、前台创建订单
Controller层:
//创建订单
@RequestMapping("create.do")
@ResponseBody
public ServerResponse create(HttpSession session, Integer shippingId){
User user = (User)session.getAttribute(Const.CURRENT_USER);
if(user ==null)
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),ResponseCode.NEED_LOGIN.getDesc());
return iOrderService.createOrder(user.getId(),shippingId);
}
Service层:
//创建订单
public ServerResponse createOrder(Integer userId,Integer shippingId){
//从购物车中获取已经被勾选的商品
List<Cart> cartList = cartMapper.selectCheckedCartByUserId(userId);
//校验并封装一下
ServerResponse serverResponse = this.getCartOrderItem(userId,cartList);
if(!serverResponse.isSuccess())
return serverResponse;
List<OrderItem> orderItemList = (List<OrderItem>)serverResponse.getData();
//计算这个订单的总价
BigDecimal payment = this.getOrderTotalPrice(orderItemList);
//生成订单
Order order = this.assembleOrder(userId,shippingId,payment);
if(order == null)
return ServerResponse.createByErrorMessage("生成订单错误");
if(CollectionUtils.isEmpty(orderItemList))
return ServerResponse.createByErrorMessage("购物车为空");
//每一项都生成订单号
for(OrderItem orderItem : orderItemList)
//设置订单号
orderItem.setOrderNo(order.getOrderNo());
//mybatis 批量插入
orderItemMapper.batchInsert(orderItemList);
//生成成功,我们要减少我们产品的库存
this.reduceProductStock(orderItemList);
//清空一下购物车
this.cleanCart(cartList);
//返回给前端数据
OrderVo orderVo = assembleOrderVo(order,orderItemList);
return ServerResponse.createBySuccess(orderVo);
}
//校验并且封装一下
private ServerResponse getCartOrderItem(Integer userId,List<Cart> cartList){
List<OrderItem> orderItemList = Lists.newArrayList();
//购物车中已经勾选的商品是空的
if(CollectionUtils.isEmpty(cartList))
return ServerResponse.createByErrorMessage("购物车为空");
/*********校验购物车的数据,包括产品的状态和数量********/
for(Cart cartItem : cartList){
OrderItem orderItem = new OrderItem();
//查出商品
Product product = productMapper.selectByPrimaryKey(cartItem.getProductId());
//查看产品销售状态
if(Const