一.订单系统工程搭建
》目录结构参考其他工程
二.订单确认页面功能分析
三.订单确认页面展示
》订单确认页面准备提交给服务端的数据有三类:订单信息,订单商品明细,订单物流信息
》点击“去结算”,会调用展示“订单确认页面”的controller方法
四.订单系统拦截器实现
》代码:
public class LoginInterceptor implements HandlerInterceptor { @Value("${SSO_URL}") private String SSO_URL; @Autowired private TokenService tokenService; @Autowired private CartService cartService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //从cookie中取token String token = CookieUtils.getCookieValue(request, "token"); //判断token是否存在 if (StringUtils.isBlank(token)) { //如果token不存在,未登录状态,跳转到sso系统的登录页面。用户登录成功后,跳转到当前请求的url response.sendRedirect(SSO_URL + "/page/login?redirect=" + request.getRequestURL()); //拦截 return false; } //如果token存在,需要调用sso系统的服务,根据token取用户信息 E3Result e3Result = tokenService.getUserByToken(token); //如果取不到,用户登录已经过期,需要登录。 if (e3Result.getStatus() != 200) { //如果token不存在,未登录状态,跳转到sso系统的登录页面。用户登录成功后,跳转到当前请求的url response.sendRedirect(SSO_URL + "/page/login?redirect=" + request.getRequestURL()); //拦截 return false; } //如果取到用户信息,是登录状态,需要把用户信息写入request。 TbUser user = (TbUser) e3Result.getData(); request.setAttribute("user", user); //判断cookie中是否有购物车数据,如果有就合并到服务端。 String jsonCartList = CookieUtils.getCookieValue(request, "cart", true); if (StringUtils.isNoneBlank(jsonCartList)) { //合并购物车 cartService.mergeCart(user.getId(), JsonUtils.jsonToList(jsonCartList, TbItem.class)); } //放行 return true; } @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub } }
》当未登录状态点击“去结算”跳转到登录页面,在登录成功后也能回到结算展示页面
五.生成订单-数据库分析
》订单相关的三张表:订单表,订单明细表,订单物流表
六.生成订单-页面分析
》点击“提交订单”时,页面应该传给服务器三类信息:订单,订单明细,订单物流,我们统一把这个信息封装成一个pojo,这个pojo放在comon不太好,它的用途比较特殊,放在oreder-interface比较好
七.订单提交-Service
@Service public class OrderServiceImpl implements OrderService { @Autowired private TbOrderMapper orderMapper; @Autowired private TbOrderItemMapper orderItemMapper; @Autowired private TbOrderShippingMapper orderShippingMapper; @Autowired private JedisClient jedisClient; @Value("${ORDER_ID_GEN_KEY}") private String ORDER_ID_GEN_KEY; @Value("${ORDER_ID_START}") private String ORDER_ID_START; @Value("${ORDER_DETAIL_ID_GEN_KEY}") private String ORDER_DETAIL_ID_GEN_KEY; @Override public E3Result createOrder(OrderInfo orderInfo) { //生成订单号。使用redis的incr生成。 if (!jedisClient.exists(ORDER_ID_GEN_KEY)) { jedisClient.set(ORDER_ID_GEN_KEY, ORDER_ID_START); } String orderId = jedisClient.incr(ORDER_ID_GEN_KEY).toString(); //补全orderInfo的属性 orderInfo.setOrderId(orderId); //1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭 orderInfo.setStatus(1); orderInfo.setCreateTime(new Date()); orderInfo.setUpdateTime(new Date()); //插入订单表 orderMapper.insert(orderInfo); //向订单明细表插入数据。 List<TbOrderItem> orderItems = orderInfo.getOrderItems(); for (TbOrderItem tbOrderItem : orderItems) { //生成明细id String odId = jedisClient.incr(ORDER_DETAIL_ID_GEN_KEY).toString(); //补全pojo的属性 tbOrderItem.setId(odId); tbOrderItem.setOrderId(orderId); //向明细表插入数据 orderItemMapper.insert(tbOrderItem); } //向订单物流表插入数据 TbOrderShipping orderShipping = orderInfo.getOrderShipping(); orderShipping.setOrderId(orderId); orderShipping.setCreated(new Date()); orderShipping.setUpdated(new Date()); orderShippingMapper.insert(orderShipping); //返回E3Result,包含订单号 return E3Result.ok(orderId); } }
》有事务的service方法不要try-catch,若出现异常try-catch解决,事务默认是不会回滚的
八.订单提交-表现层
1 @RequestMapping(value="/order/create", method=RequestMethod.POST) 2 public String createOrder(OrderInfo orderInfo, HttpServletRequest request) { 3 //取用户信息 4 TbUser user = (TbUser) request.getAttribute("user"); 5 //把用户信息添加到orderInfo中。 6 orderInfo.setUserId(user.getId()); 7 orderInfo.setBuyerNick(user.getUsername()); 8 //调用服务生成订单 9 E3Result e3Result = orderService.createOrder(orderInfo); 10 //如果订单生成成功,需要删除购物车 11 if (e3Result.getStatus() == 200) { 12 //清空购物车 13 cartService.clearCartItem(user.getId()); 14 } 15 //把订单号传递给页面 16 request.setAttribute("orderId", e3Result.getData()); 17 request.setAttribute("payment", orderInfo.getPayment()); 18 //返回逻辑视图 19 return "success"; 20 }