zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    _bzoj1061 [Noi2008]志愿者招募【最小费用最大流】
    _bzoj2243 [SDOI2011]染色【树链剖分】
    _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】
    _bzoj1002 [FJOI2007]轮状病毒【瞎搞】
    leetcode 273 Integer to English Words
    leetcode 12 Integer to Roman
    leetcode 1071 Greatest Common Divisor of Strings
    lc6 ZigZag Conversion
    lc13 Roman to Integer
    leetcode 171 Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/13571521.html
Copyright © 2011-2022 走看看