e3mall-day13

一.订单系统工程搭建

   》目录结构参考其他工程

二.订单确认页面功能分析

三.订单确认页面展示

  》订单确认页面准备提交给服务端的数据有三类:订单信息,订单商品明细,订单物流信息

  》点击“去结算”,会调用展示“订单确认页面”的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     }
原文地址:https://www.cnblogs.com/ibcdwx/p/13571521.html