大型电商项目订单功能实现

1.展示订单确认页面

1.1.1. 功能分析


   
   
  1. 1、在购物车页面点击“去结算”按钮跳转到订单确认页面。
  2. 2、请求的url:/order/order-cart
  3. 3、参数:没有参数。
  4. 4、购物车商品数据从cookie中取出来的。可以在订单系统中取到cookie中的购物车数据。
  5. 5、配送地址列表,需要用户登录。需要根据用户id查询收货地址列表。静态数据。
  6. 6、支付方式。静态数据。
  7. 6、返回值:逻辑视图String,展示订单确认页面。

1.1.2. Interface层


   
   
  1. package cn.e3mall.order.service;
  2. import cn.e3mall.common.utils.E3Result;
  3. import cn.e3mall.order.pojo.OrderInfo;
  4. public interface OrderService {
  5. //创建订单
  6. E3Result createOrder(OrderInfo orderInfo);
  7. }

1.1.3. Service层


    
    
  1. package cn.e3mall.order.service.impl;
  2. import java.util.Date;
  3. import java.util.List;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.stereotype.Service;
  7. import cn.e3mall.common.jedis.JedisClient;
  8. import cn.e3mall.common.utils.E3Result;
  9. import cn.e3mall.mapper.TbOrderItemMapper;
  10. import cn.e3mall.mapper.TbOrderMapper;
  11. import cn.e3mall.mapper.TbOrderShippingMapper;
  12. import cn.e3mall.order.pojo.OrderInfo;
  13. import cn.e3mall.order.service.OrderService;
  14. import cn.e3mall.pojo.TbOrderItem;
  15. import cn.e3mall.pojo.TbOrderShipping;
  16. /**
  17. * 订单处理服务
  18. * @author cxx
  19. *
  20. */
  21. @Service
  22. public class OrderServiceImpl implements OrderService {
  23. @Autowired
  24. private TbOrderMapper orderMapper;
  25. @Autowired
  26. private TbOrderItemMapper orderItemMapper;
  27. @Autowired
  28. private TbOrderShippingMapper orderShippingMapper;
  29. @Autowired
  30. private JedisClient jedisClient;
  31. @Value( "${ORDER_ID_GEN_KEY}")
  32. private String ORDER_ID_GEN_KEY;
  33. @Value( "${ORDER_ID_START}")
  34. private String ORDER_ID_START;
  35. @Value( "${ORDER_DETAIL_ID_GEN_KEY}")
  36. private String ORDER_DETAIL_ID_GEN_KEY;
  37. @Override
  38. public E3Result createOrder(OrderInfo orderInfo) {
  39. //生成订单号。使用redis的incr生成。
  40. if (!jedisClient.exists(ORDER_ID_GEN_KEY)) {
  41. jedisClient.set(ORDER_ID_GEN_KEY, ORDER_ID_START);
  42. }
  43. String orderId = jedisClient.incr(ORDER_ID_GEN_KEY).toString();
  44. //补全orderInfo的属性
  45. orderInfo.setOrderId(orderId);
  46. //1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭
  47. orderInfo.setStatus( 1);
  48. orderInfo.setCreateTime( new Date());
  49. orderInfo.setUpdateTime( new Date());
  50. //插入订单表
  51. orderMapper.insert(orderInfo);
  52. //向订单明细表插入数据。
  53. List<TbOrderItem> orderItems = orderInfo.getOrderItems();
  54. for (TbOrderItem tbOrderItem : orderItems) {
  55. //生成明细id
  56. String odId = jedisClient.incr(ORDER_DETAIL_ID_GEN_KEY).toString();
  57. //补全pojo的属性
  58. tbOrderItem.setId(odId);
  59. tbOrderItem.setOrderId(orderId);
  60. //向明细表插入数据
  61. orderItemMapper.insert(tbOrderItem);
  62. }
  63. //向订单物流表插入数据
  64. TbOrderShipping orderShipping = orderInfo.getOrderShipping();
  65. orderShipping.setOrderId(orderId);
  66. orderShipping.setCreated( new Date());
  67. orderShipping.setUpdated( new Date());
  68. orderShippingMapper.insert(orderShipping);
  69. //返回E3Result,包含订单号
  70. return E3Result.ok(orderId);
  71. }
  72. }

1.1.4.表现层


     
     
  1. package cn.e3mall.order.controller;
  2. import java.util.List;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.Model;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestMethod;
  10. import cn.e3mall.cart.service.CartService;
  11. import cn.e3mall.common.utils.E3Result;
  12. import cn.e3mall.order.pojo.OrderInfo;
  13. import cn.e3mall.order.service.OrderService;
  14. import cn.e3mall.pojo.TbItem;
  15. import cn.e3mall.pojo.TbUser;
  16. /**
  17. * 订单管理Controller
  18. * <p>Title: OrderController</p>
  19. * <p>Description: </p>
  20. * <p>Company: www.itcast.cn</p>
  21. * @version 1.0
  22. */
  23. @Controller
  24. public class OrderController {
  25. @Autowired
  26. private CartService cartService;
  27. @Autowired
  28. private OrderService orderService;
  29. @RequestMapping( "/order/order-cart")
  30. public String showOrderCart(HttpServletRequest request) {
  31. //取用户id
  32. TbUser user= (TbUser) request.getAttribute( "user");
  33. //根据用户id取收货地址列表
  34. //使用静态数据。。。
  35. //取支付方式列表
  36. //静态数据
  37. //根据用户id取购物车列表
  38. List<TbItem> cartList = cartService.getCartList(user.getId());
  39. //把购物车列表传递给jsp
  40. request.setAttribute( "cartList", cartList);
  41. //返回页面
  42. return "order-cart";
  43. }
  44. @RequestMapping(value= "/order/create", method=RequestMethod.POST)
  45. public String createOrder(OrderInfo orderInfo, HttpServletRequest request) {
  46. //取用户信息
  47. TbUser user = (TbUser) request.getAttribute( "user");
  48. //把用户信息添加到orderInfo中。
  49. orderInfo.setUserId(user.getId());
  50. orderInfo.setBuyerNick(user.getUsername());
  51. //调用服务生成订单
  52. E3Result e3Result = orderService.createOrder(orderInfo);
  53. //如果订单生成成功,需要删除购物车
  54. if (e3Result.getStatus() == 200) {
  55. //清空购物车
  56. cartService.clearCartItem(user.getId());
  57. }
  58. //把订单号传递给页面
  59. request.setAttribute( "orderId", e3Result.getData());
  60. request.setAttribute( "payment", orderInfo.getPayment());
  61. //返回逻辑视图
  62. return "success";
  63. }
  64. }


2.用户身份认证

在展示订单确认页面之前,需要对用户身份进行认证,要求用户必须登录。

2.1.1. 功能分析

1、使用springmvc的拦截器实现。需要实现一个接口HandlerInterceptor接口。

2、业务逻辑


    
    
  1. a) 从cookie中取token。
  2. b) 没有token,需要跳转到登录页面。
  3. c) 有token。调用sso系统的服务,根据token查询用户信息。
  4. d) 如果查不到用户信息。用户登录已经过期。需要跳转到登录页面。
  5. e) 查询到用户信息。放行。

3、在springmvc.xml中配置拦截器。

**在展示订单页面前,我们Redis有用户原理购物车数据,需要将Cookie数据与它进行合并


2.1.2. 拦截器实现


    
    
  1. package cn.e3mall.order.interceptor;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.apache.commons.lang3.StringUtils;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.web.servlet.HandlerInterceptor;
  8. import org.springframework.web.servlet.ModelAndView;
  9. import cn.e3mall.cart.service.CartService;
  10. import cn.e3mall.common.utils.CookieUtils;
  11. import cn.e3mall.common.utils.E3Result;
  12. import cn.e3mall.common.utils.JsonUtils;
  13. import cn.e3mall.pojo.TbItem;
  14. import cn.e3mall.pojo.TbUser;
  15. import cn.e3mall.sso.service.TokenService;
  16. /**
  17. * 用户登录拦截器
  18. * @author cxx
  19. *
  20. */
  21. public class LoginInterceptor implements HandlerInterceptor{
  22. @Value( "${SSO_URL}")
  23. private String SSO_URL;
  24. @Autowired
  25. private TokenService tokenService;
  26. @Autowired
  27. private CartService cartService;
  28. @Override
  29. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  30. throws Exception {
  31. //从cookie中获取token
  32. String token = CookieUtils.getCookieValue(request, "token");
  33. //判断token是否存在
  34. if(StringUtils.isBlank(token)) {
  35. //跳到登录页面,登录成功后跳到该页面
  36. response.sendRedirect(SSO_URL+ "/page/login?redirect="+request.getRequestURI());
  37. return false;
  38. }
  39. E3Result e3Result = tokenService.getUserByToken(token);
  40. //判断用户是否身份过期
  41. if(e3Result.getStatus() != 200) {
  42. //如果token不存在,未登录状态,跳转到sso系统的登录页面。用户登录成功后,跳转到当前请求的url
  43. response.sendRedirect(SSO_URL + "/page/login?redirect=" + request.getRequestURL());
  44. //拦截
  45. return false;
  46. }
  47. //把用户信息放入到request中
  48. TbUser user = (TbUser)e3Result.getData();
  49. request.setAttribute( "user",user);
  50. //判断cookie中是否有数据,合并到服务器
  51. String jsonCartList = CookieUtils.getCookieValue(request, "cart", true);
  52. if(StringUtils.isNoneBlank(jsonCartList)) {
  53. //合并购物车
  54. cartService.mergeCart(user.getId(), JsonUtils.jsonToList(jsonCartList, TbItem.class));
  55. }
  56. //放行
  57. return true;
  58. }
  59. @Override
  60. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  61. ModelAndView modelAndView) throws Exception {
  62. // TODO Auto-generated method stub
  63. }
  64. @Override
  65. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  66. throws Exception {
  67. // TODO Auto-generated method stub
  68. }
  69. }

2.1.3. 配置拦截器

springmvc.xml中配置拦截器。


    
    
  1. <!-- 拦截器配置 -->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <mvc:mapping path= "/**"/>
  5. <bean class= "cn.e3mall.order.interceptor.LoginInterceptor"/>
  6. </mvc:interceptor>
  7. </mvc:interceptors>

2.1.4. 实现sso系统的回调


    
    
  1. @RequestMapping( "/page/login")
  2. public String showLogin(String redirectUrl,Model model) {
  3. model.addAttribute( "redirect",redirectUrl);
  4. return "login";
  5. }


项目展示:






一个问题:订单编号怎么生成

Redis Incr 命令将 key 中储存的数字值增一。


    
    
  1. #订单号生成key
  2. ORDER_ID_GEN_KEY=ORDER_ID_GEN
  3. #订单号初始值
  4. ORDER_ID_START= 100544
  5. #订单明细id生成key
  6. ORDER_DETAIL_ID_GEN_KEY=ORDER_DETAIL_ID_GEN




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值