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

订单工程搭建
- 类型taotao-rest,taotao-sso,taotao-search。
- 工程结构。

- 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"
}
}
{
status: 200 //200 成功
msg: "OK" // 返回信息消息
data: 100544// 返回订单号
}
数据库
- 需要涉及三张表:订单表,订单详情表,订单物流表。

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层
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));
}
}
}
订单确认页面展示
需求
分析
- 购物车页面点击去结算跳转到订单确认页面。

- 订单确认页面展示购物车中的信息。

总结
- 确认订单前要求用户登录。
- 根据用户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";
}
}
提交订单
需求
- 订单确认页面提交表单,包含订单商品和地址等信息。

- 请求url:/order/create.html
- 请求参数:表单,包括订单信息,同taotao-order中的Order。
- 响应:success视图,包含订单id、总价、时间。
- 在taotao-portal中开发。
Interceptor
- LoginInterceptor在跳转到提交订单的url之前,需要获取用户信息,写入request,用以在Controller中填充Order。

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) {
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) {
TbUser user = (TbUser) request.getAttribute("user");
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";
}
运行工程
- 订单确认页面。

- 订单成功提交。
