订单系统的实现——淘淘商城(二十七)

订单工程

  • 订单系统作为一个独立的工程,在服务层中提供服务,供门户系统等使用http调用。
  • 加入订单系统之后的架构。
    12.artc.png

订单工程搭建

  • 类型taotao-rest,taotao-sso,taotao-search。
  • 工程结构。
    12.package.png
  • tomcat的端口号为8085。

创建订单的接口

需求

  • 请求url:localhost:8085/order/create
  • 请求方法:POST
  • 请求参数:订单的json,如下
{
    "payment": 5288,
    "postFee": 0,
    "userId": "3",
    "buyerMessage": null,
    "buyerNick": "zhang123",
    "orderItems": [
        {
            "itemId": "9",
            "num": 1,
            "title": "苹果(Apple)iPhone 6 (A1586) 16GB 金色 移动联通电信4G手机3",
            "price": 5288,
            "totalFee": 5288,
            "picPath": "http://image.taotao.com/images/2015/03/06/2015030610045320609720.jpg"
        }
    ],
    "orderShipping": {
        "receiverName": "张三",
        "receiverPhone": "",
        "receiverMobile": "15800000000",
        "receiverState": "上海",
        "receiverCity": "上海",
        "receiverDistrict": "闵行区",
        "receiverAddress": "三鲁公路3279号 明浦广场 3号楼 205室",
        "receiverZip": "200000"
    }
}
  • 响应信息:包含订单号的TaoTaoResult。
{
    status: 200 //200 成功
    msg: "OK" // 返回信息消息
    data: 100544// 返回订单号
}
  • 在taotao-order中开发。

数据库

  • 需要涉及三张表:订单表,订单详情表,订单物流表。
    12.db.png

Service层

  • redis.properties中添加订单id的键和初始值,订单详情的键。
#订单自增id的key
ORDER_GEN_KEY=ORDER_GEN_KEY
#订单初始id
ORDER_INIT_ID=10000
#订单详情的自增主键
ORDER_DETAIL_GEN_KEY=ORDER_DETAIL_GEN_KEY
  • 创建订单状态和评价状态的枚举类OrderState和BuyerRate。
public enum OrderState {
    NOT_PAID(1, "未付款"), PAID(2, "已付款"), NOT_DELIVER(3, "未发货"),
    DELIVER(4, "已发货"), DEAL_SUCCESSFUL(5, "交易成功"), DEAL_CLOSE(6, "交易关闭");

    private int status;
    private String stateInfo;

    OrderState(int status, String stateInfo) {
        this.status = status;
        this.stateInfo = stateInfo;
    }

    public int getStatus() {
        return status;
    }

    public String getStateInfo() {
        return stateInfo;
    }

    public static OrderState stateOf(int state) {
        for (OrderState orderState : values()) {
            if (orderState.getStatus() == state) {
                return orderState;
            }
        }
        return null;
    }
}
public enum BuyerRate {
    NOT_RATED(0, "未评价"), RATED(1, "已评价");

    private int status;
    private String stateInfo;

    BuyerRate(int status, String stateInfo) {
        this.status = status;
        this.stateInfo = stateInfo;
    }

    public int getStatus() {
        return status;
    }

    public String getStateInfo() {
        return stateInfo;
    }
}
  • 创建OrderService和对应实现类,接收订单、订单详情、订单物流,从redis中获取订单id(全局唯一id的获取方法),补全三个对象并且返回包括订单号的TaoTaoResult。
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private TbOrderMapper orderMapper;
    @Autowired
    private TbOrderItemMapper orderItemMapper;
    @Autowired
    private TbOrderShippingMapper orderShippingMapper;
    @Autowired
    private RedisDao redisDao;

    @Value("${ORDER_GEN_KEY}")
    private String ORDER_GEN_KEY;
    @Value("${ORDER_INIT_ID}")
    private String ORDER_INIT_ID;
    @Value("${ORDER_DETAIL_GEN_KEY}")
    private String ORDER_DETAIL_GEN_KEY;


    @Override
    public TaotaoResult createOrder(TbOrder order, List<TbOrderItem> itemList, TbOrderShipping orderShipping) {
        //获得订单号
        long orderId = getOrderId();

        //补全订单信息并插入数据库
        order.setOrderId(String.valueOf(orderId));
        order.setStatus(OrderState.NOT_PAID.getStatus());
        order.setCreateTime(new Date());
        order.setUpdateTime(new Date());
        order.setBuyerRate(BuyerRate.NOT_RATED.getStatus());
        orderMapper.insert(order);

        //补全并插入订单详情
        for (TbOrderItem tbOrderItem : itemList) {
            long orderDetailId = redisDao.incr(ORDER_DETAIL_GEN_KEY);
            tbOrderItem.setId(String.valueOf(orderDetailId));
            tbOrderItem.setOrderId(String.valueOf(orderId));
            orderItemMapper.insert(tbOrderItem);
        }

        //补全并插入物流信息
        orderShipping.setOrderId(String.valueOf(orderId));
        orderShipping.setCreated(new Date());
        orderShipping.setUpdated(new Date());
        orderShippingMapper.insert(orderShipping);

        return TaotaoResult.ok(orderId);

    }

    private long getOrderId() {
        String string = redisDao.get(ORDER_GEN_KEY);
        if (StringUtils.isBlank(string)) {
            redisDao.set(ORDER_GEN_KEY, ORDER_INIT_ID);
        }
        return redisDao.incr(ORDER_GEN_KEY);
    }
}

Controller层

  • 创建接收post参数的pojo。
public class Order extends TbOrder {

    private List<TbOrderItem> orderItems;
    private TbOrderShipping orderShipping;

    public List<TbOrderItem> getOrderItems() {
        return orderItems;
    }
}
  • 创建OrderController,接收post实体中的订单信息,调用service层方法,返回TaoTaoResult。
@Controller
public class OrderController {

    @Autowired
    private OrderService orderService;

    @RequestMapping("/create")
    @ResponseBody
    public TaotaoResult createOrder(@RequestBody Order order) {
        try {
            TaotaoResult result = orderService.createOrder(order, order.getOrderItems(), order.getOrderShipping());
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
        }
    }
}

订单确认页面展示

需求

分析
  • 购物车页面点击去结算跳转到订单确认页面。
    12.ordercart.png
  • 订单确认页面展示购物车中的信息。
    12.ordercart2.png
总结
  • 确认订单前要求用户登录。
  • 根据用户id查询收货地址列表。
  • 展示购物车列表。
    • 请求url:/order/order-cart
    • 响应:order-cart视图,包含购物车商品列表模型。
  • 在taotao-portal中开发。

配置

  • 在springmvc-config.xml中修改拦截器的url前缀,确认订单前强制登录。
  <!-- 拦截器配置 -->
  <mvc:interceptors>
    <mvc:interceptor>
      <!-- 拦截订单类请求 -->
      <mvc:mapping path="/order/**"/>
      <bean class="com.taotao.portal.interceptor.LoginInterceptor"/>
    </mvc:interceptor>
  </mvc:interceptors>
  • 收货地址列表应由服务层提供服务,根据用户id查询收货地址列表,再将地址显示在视图上。这里直接使用静态数据模拟。

Controller层

  • 创建OrderController,查询调用service层,查询购物车商品列表,加入order-cart视图并返回。
@Controller
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private CartService cartService;
    @Autowired
    private OrderService orderService;

    @RequestMapping("/order-cart")
    public String showOrderCart(HttpServletRequest request, HttpServletResponse response, Model model) {
        List<CartItem> list = cartService.getCartItemList(request, response);
        model.addAttribute("cartList", list);

        return "order-cart";
    }
}

提交订单

需求

  • 订单确认页面提交表单,包含订单商品和地址等信息。
    12.ordersupmit.png
  • 请求url:/order/create.html
  • 请求参数:表单,包括订单信息,同taotao-order中的Order。
  • 响应:success视图,包含订单id、总价、时间。
  • 在taotao-portal中开发。

Interceptor

  • LoginInterceptor在跳转到提交订单的url之前,需要获取用户信息,写入request,用以在Controller中填充Order。
    12.setusr.png

Service层

  • 创建Order接收提交的表单,同taotao-order。
  • 在order.properties中添加订单系统的url。
ORDER_BASE_URL=http://localhost:8085/order
ORDER_CREATE_URL=/create
  • 创建OrderService和对应的实现类,调用taotao-order的服务创建订单,返回订单id。
@Service
public class OrderServiceImpl implements OrderService {

    @Value("${ORDER_BASE_URL}")
    private String ORDER_BASE_URL;
    @Value("${ORDER_CREATE_URL}")
    private String ORDER_CREATE_URL;

    @Override
    public String createOrder(Order order) {
        //调用服务层的服务
        String json = HttpClientUtil.doPostJson(ORDER_BASE_URL + ORDER_CREATE_URL, JsonUtils.objectToJson(order));
        if (!StringUtils.isBlank(json)) {
            //获取订单号
            TaotaoResult taotaoResult = TaotaoResult.format(json);
            if (taotaoResult.getStatus() == 200) {
                //jackson根据数据的大小转换为Integer或者Long类型
                Object orderId = taotaoResult.getData();
                return orderId.toString();
            }
        }

        return "";
    }
}

Controller层

  • OrderController中获取request,提取用户信息补充提交的Order信息,调用service层,返回success视图。
    @RequestMapping("/create")
    public String createOrder(Order order, Model model, HttpServletRequest request) {
        //从request中获取用户信息
        TbUser user = (TbUser) request.getAttribute("user");
        //填充order
        order.setUserId(user.getId());
        order.setBuyerNick(user.getUsername());

        //创建订单
        String orderId = orderService.createOrder(order);
        //设置模型
        model.addAttribute("orderId", orderId);
        model.addAttribute("payment", order.getPayment());
        model.addAttribute("date", new DateTime().plusDays(3).toString("yyyy-MM-dd"));
        return "success";
    }

运行工程

  • 订单确认页面。
    12.ordercart11.png
  • 订单成功提交。
    12.success.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值