1.订单系统
(1)完成订单系统。
(2)实现订单提交功能。
1.1.系统架构
说明:将订单服务抽取出来,创建单独的订单系统。
好处:提供代码的复用性,增强系统的拓展能力。
1.2.订单系统表结构
表结构说明:
(1)订单表跟用户表示多对一的关系。
(2)订单表跟收件人表示一对一的关系。
(3)订单表跟订单商品表示一对多的关系。
(4)订单商品表跟商品表示一对一的关系。
1.3.实现思路
(1)搭建订单系统
(2)在订单系统中发布保存订单接口
(3)在门户系统中调用该接口
2.保存订单功能实现
2.1.第一部分:搭建订单系统
步骤说明:(1)创建一个Maven项目。
(2)导入相关依赖
(3)实现框架整合
2.1.1.第一步:创建项目
--说明:使用Maven Module创建,war模型
2.1.2.第二步:导入pom依赖
--修改pom.xml文件,添加如下依赖
4.0.0
cn.gzsxt.ego
ego-project
1.0
ego-order
war
cn.gzsxt.ego
ego-base
1.0
org.springframework
spring-context
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-webmvc
com.baomidou
mybatis-plus
mysql
mysql-connector-java
com.alibaba
druid
com.fasterxml.jackson.core
jackson-databind
org.apache.tomcat.maven
tomcat7-maven-plugin
8085
/
utf-8
2.1.3.第三步:创建web.xml文件
--说明:从ego-rest工程中拷贝,修改url-partten属性即可。
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
characterEncodingFilter
/*
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-*.xml
1
dispatcherServlet
/order/*
2.1.4.第四步:Spring整合SpringMVC
--创建spring-mvc.xml文件
2.1.5.第五步:MybatisPlus整合Spring
(1)创建resourse.properties文件
#配置数据源
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/ego
db.username=root
db.password=gzsxt
(2)创建spring-data.xml文件
2.2.第二部分:发布保存订单接口
2.2.1.第一步:创建pojo、mapper
(1)创建Order、OrderItem、OrderShipping这三个类
--创建Order类
package cn.gzsxt.base.pojo;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
/**
*
*
*
*
* @author yq.luan
* @since 2019-02-23
*/
@TableName("tb_order")
public class Order{
/**
* 订单id
*/
@TableId(value="order_id",type=INPUT)
private String orderId;
/**
* 实付金额。精确到2位小数;单位:元。如:200.07,表示:200元7分
*/
private String payment;
/**
* 支付类型,1、在线支付,2、货到付款
*/
@TableField("payment_type")
private Integer paymentType;
/**
* 邮费。精确到2位小数;单位:元。如:200.07,表示:200元7分
*/
@TableField("post_fee")
private String postFee;
/**
* 状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭
*/
private Integer status;
/**
* 订单创建时间
*/
@TableField("create_time")
private Date createTime;
/**
* 订单更新时间
*/
@TableField("update_time")
private Date updateTime;
/**
* 付款时间
*/
@TableField("payment_time")
private Date paymentTime;
/**
* 发货时间
*/
@TableField("consign_time")
private Date consignTime;
/**
* 交易完成时间
*/
@TableField("end_time")
private Date endTime;
/**
* 交易关闭时间
*/
@TableField("close_time")
private Date closeTime;
/**
* 物流名称
*/
@TableField("shipping_name")
private String shippingName;
/**
* 物流单号
*/
@TableField("shipping_code")
private String shippingCode;
/**
* 用户id
*/
@TableField("user_id")
private Long userId;
/**
* 买家留言
*/
@TableField("buyer_message")
private String buyerMessage;
/**
* 买家昵称
*/
@TableField("buyer_nick")
private String buyerNick;
/**
* 买家是否已经评价
*/
@TableField("buyer_rate")
private Integer buyerRate;
//补全get、set方法
}
--创建OrderItem类
package cn.gzsxt.base.pojo;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
/**
*
*
*
*
* @author yq.luan
* @since 2019-02-23
*/
@TableName("tb_order_item")
public class OrderItem{
@TableId(value="id",type=IdType.INPUT)
private String id;
/**
* 商品id
*/
@TableField("item_id")
private String itemId;
/**
* 订单id
*/
@TableField("order_id")
private String orderId;
/**
* 商品购买数量
*/
private Integer num;
/**
* 商品标题
*/
private String title;
/**
* 商品单价
*/
private Long price;
/**
* 商品总金额
*/
@TableField("total_fee")
private Long totalFee;
/**
* 商品图片地址
*/
@TableField("pic_path")
private String picPath;
//补全get、set方法
}
--创建OrderShipping类
package cn.gzsxt.base.pojo;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
/**
*
*
*
*
* @author yq.luan
* @since 2019-02-23
*/
@TableName("tb_order_shipping")
public class OrderShipping{
/**
* 订单ID
*/
@TableId(value="order_id",type=IdType.INPUT)
private String orderId;
/**
* 收货人全名
*/
@TableField("receiver_name")
private String receiverName;
/**
* 固定电话
*/
@TableField("receiver_phone")
private String receiverPhone;
/**
* 移动电话
*/
@TableField("receiver_mobile")
private String receiverMobile;
/**
* 省份
*/
@TableField("receiver_state")
private String receiverState;
/**
* 城市
*/
@TableField("receiver_city")
private String receiverCity;
/**
* 区/县
*/
@TableField("receiver_district")
private String receiverDistrict;
/**
* 收货地址,如:xx路xx号
*/
@TableField("receiver_address")
private String receiverAddress;
/**
* 邮政编码,如:310001
*/
@TableField("receiver_zip")
private String receiverZip;
private Date created;
private Date updated;
//补全get、set方法
}
(2)创建OrderMapper、OrderItemMapper、OrderShippingMapper
--创建OrderMapper
package cn.gzsxt.base.mapper;
import cn.gzsxt.base.pojo.Order;
import com.baomidou.mybatisplus.mapper.BaseMapper;
/**
*
* Mapper 接口
*
*
* @author yq.luan
* @since 2019-02-23
*/
public interface OrderMapper extends BaseMapper {
}
--创建OrderItemMapper接口
package cn.gzsxt.base.mapper;
import cn.gzsxt.base.pojo.OrderItem;
import com.baomidou.mybatisplus.mapper.BaseMapper;
/**
*
* Mapper 接口
*
*
* @author yq.luan
* @since 2019-02-23
*/
public interface OrderItemMapper extends BaseMapper {
}
--创建OrderShippingMapper接口
package cn.gzsxt.base.mapper;
import cn.gzsxt.base.pojo.OrderShipping;
import com.baomidou.mybatisplus.mapper.BaseMapper;
/**
*
* Mapper 接口
*
* @author yq.luan
* @since 2019-02-23
*/
public interface OrderShippingMapper extends BaseMapper {
}
2.2.2.第二步:创建OrderDetail类
说明:我们是通过OrderDetail类来接收订单页面提交的参数。
订单页面提交的参数如下:
分析:
(1)订单商品需要使用List
(2)收件人信息需要使用对象.属性的方式来接收。
问题1:SpringMVC如何绑定List集合类型的参数?
答:需要将List集合定义到一个javabean对象中。
问题2:SpringMVC如何绑定对象.属性类型的参数?
答:将对象定义成javabean的一个属性。
结论:
(1)我们定义一个OrderDetail类,继承Order这个类。
目的:接收跟订单有关的参数。
(2)将List
(3)将OrderShipping orderShipping定义另外一个属性。
--OrderDetail类结构如下:
package cn.gzsxt.base.vo;
import java.util.List;
import cn.gzsxt.base.pojo.Order;
import cn.gzsxt.base.pojo.OrderItem;
import cn.gzsxt.base.pojo.OrderShipping;
/**
* 自定义订单详情类
* @author ccnulyq
*
*/
public class OrderDetail extends Order{
private List orderItems;
private OrderShipping orderShipping;
public OrderDetail() {
super();
// TODO Auto-generated constructor stub
}
public List getOrderItems() {
return orderItems;
}
public void setOrderItems(List orderItems) {
this.orderItems = orderItems;
}
public OrderShipping getOrderShipping() {
return orderShipping;
}
public void setOrderShipping(OrderShipping orderShipping) {
this.orderShipping = orderShipping;
}
}
2.2.3.第三步:创建OrderService接口及其实现类
package cn.gzsxt.order.service.impl;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.gzsxt.base.mapper.OrderItemMapper;
import cn.gzsxt.base.mapper.OrderMapper;
import cn.gzsxt.base.mapper.OrderShippingMapper;
import cn.gzsxt.base.pojo.OrderItem;
import cn.gzsxt.base.pojo.OrderShipping;
import cn.gzsxt.base.utils.IDUtils;
import cn.gzsxt.base.vo.OrderDetail;
import cn.gzsxt.order.service.OrderService;
@Service
public class OrderServiceImpl implements OrderService{
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper itemMapper;
@Autowired
private OrderShippingMapper shippingMapper;
@Override
public String save(OrderDetail order) {
try {
//1、保存订单数据
long orderId = IDUtils.genItemId();
order.setOrderId(orderId+"");
order.setStatus(1);
order.setCreateTime(new Date());
order.setUpdateTime(order.getCreateTime());
orderMapper.insert(order);
//2、保存订单项
List items = order.getOrderItems();
for (OrderItem t : items) {
t.setId(IDUtils.genItemId()+"");
t.setOrderId(orderId+"");
itemMapper.insert(t);
}
//3、保存收件人信息
OrderShipping orderShipping = order.getOrderShipping();
orderShipping.setOrderId(orderId+"");
shippingMapper.insert(orderShipping);
return orderId+"";
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
2.2.4.第四步:创建OrderController类
package cn.gzsxt.order.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.gzsxt.base.vo.OrderDetail;
import cn.gzsxt.order.service.OrderService;
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping(value = "/create")
public String save(String order){
OrderDetail jsonToPojo = JsonUtils.jsonToPojo(order, OrderDetail.class);
String orderId = orderService.save(jsonToPojo);
return orderId;
}
}
2.3.第三部分:在门户系统中调用保存订单接口
2.3.1.第一步:修改OrderService接口及其实现类
--新增保存订单方法
@Override
public String save(OrderDetail order) {
Map params = new HashMap<>();
params.put("order", JsonUtils.objectToJson(order));
String doPost = HttpClientUtils.doGet("http://localhost:8085/order/create", params);
return doPost;
}
2.3.2.第二步:修改OrderController类
--新增保存订单方法
@RequestMapping(value="/create", method=RequestMethod.POST)
public String save(OrderDetail order,ModelMap map){
String orderid = orderService.save(order);
if(null!=orderid && !"".equals(orderid)){
map.addAttribute("orderId", orderid);
map.addAttribute("payment", order.getPayment());
//默认送到时间,在3天后
Calendar c=Calendar.getInstance();
SimpleDateFormat df=new SimpleDateFormat("yyyy/MM/dd/E");
c.add(Calendar.DATE, 3);
System.out.println(df.format(c.getTime()));
map.addAttribute("date", df.format(c.getTime()));
return "success";
}else{
//订单创建失败
map.addAttribute("message", orderid);
return "error/exception";
}
}
2.3.3.第三步:测试
(1)重新编译ego-project工程。
(2)在浏览器访问门户首页,并提交订单。
--保存订单成功!!!