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     }
  • 相关阅读:
    Nutch是个不错的选择
    Ext分页之php中,真分页显示
    php上传zip文件在线解压文件在指定目录下,CI框架版本
    php中使用mysql_fetch_array输出数组至页面中展示
    php中使用mysql_fetch_object向页面输出结果,总结!
    function $(id){ return document.getElementById(id); }导致所有的js不能用解决办法。。。。
    Html标签中Alt和Title都是提示性语言标签
    hdu3948(后缀数组)
    poj1743(后缀数组)
    spoj687(后缀数组)
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/13571521.html
Copyright © 2011-2022 走看看