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文件,添加如下依赖
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.gzsxt.ego</groupId>
<artifactId>ego-project</artifactId>
<version>1.0</version>
</parent>
<artifactId>ego-order</artifactId>
<packaging>war</packaging>
<dependencies>
<!-- 添加ego-base公共系统依赖 -->
<dependency>
<groupId>cn.gzsxt.ego</groupId>
<artifactId>ego-base</artifactId>
<version>1.0</version>
</dependency>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!-- 导入spring-jdbc包+事物 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<!-- 导入切面依赖包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<!-- 导入springmvc依赖包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<!-- mybatis-plus依赖包 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
</dependency>
<!-- 导入jdbc驱动+连接池 -->
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8085</port>
<path>/</path>
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.1.3.第三步:创建web.xml文件
--说明:从ego-rest工程中拷贝,修改url-partten属性即可。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd ">
<!-- 配置编码过滤器,防止post乱码 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置springmvc核心控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 所有order项目中的接口路径,都以/order开头,方便维护接口 -->
<url-pattern>/order/*</url-pattern>
</servlet-mapping>
</web-app>
2.1.4.第四步:Spring整合SpringMVC
--创建spring-mvc.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
<!-- 1、开启注解扫描 -->
<context:component-scan base-package="cn.gzsxt.order"/>
<!-- 2、开启springmvc注解驱动 -->
<mvc:annotation-driven/>
</beans>
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文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<context:property-placeholder file-encoding="utf-8" location="classpath:resource.properties"/>
<!-- 1、创建数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="maxActive" value="20"/>
<property name="minIdle" value="5"/>
</bean>
<!-- 2、mybatis-plus整合Spring
任何的数据库的框架,要使用spring的事物代理,必须使用spring提供的数据源,必须整合spring才可以使用
-->
<bean name="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 加载数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 指定pojo目录 -->
<property name="typeAliasesPackage" value="cn.gzsxt.base.pojo"/>
<!-- 配置mybatis-plus插件 -->
<property name="plugins">
<list>
<!-- 配置分页插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"/>
<!-- 配置拦截器属性 -->
<bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor">
<!-- 配置sql响应时间,开发阶段方便做调优 -->
<property name="maxTime" value="1000"/>
<property name="format" value="true"/>
</bean>
</list>
</property>
<!-- 配置mybatis-plus全局策略 -->
<property name="globalConfig" ref="globalConfiguration"></property>
</bean>
<!-- 3、配置mybatis的动态代理 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
<property name="basePackage" value="cn.gzsxt.base.mapper"></property>
</bean>
<!-- 配置mybatis-plus全局属性 -->
<!-- 定义 MybatisPlus 的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在 2.3 版本以后,dbColumnUnderline 默认值是 true,即pojo属性开启驼峰标识 -->
<property name="dbColumnUnderline" value="true"></property>
<!-- 全局的主键策略 -->
<!--
AUTO->`0`("数据库ID自增")
INPUT->`1`(用户输入ID")
ID_WORKER->`2`("全局唯一ID")
UUID->`3`("全局唯一ID")
-->
<property name="idType" value="0"></property>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tb_"></property>
</bean>
<!-- 4、配置事物管理器 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 5、开启注解声明式事物 -->
<tx:annotation-driven/>
</beans>
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;
/**
* <p>
*
* </p>
*
* @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;
/**
* <p>
*
* </p>
*
* @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;
/**
* <p>
*
* </p>
*
* @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;
/**
* <p>
* Mapper 接口
* </p>
*
* @author yq.luan
* @since 2019-02-23
*/
public interface OrderMapper extends BaseMapper<Order> {
}
--创建OrderItemMapper接口
package cn.gzsxt.base.mapper;
import cn.gzsxt.base.pojo.OrderItem;
import com.baomidou.mybatisplus.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author yq.luan
* @since 2019-02-23
*/
public interface OrderItemMapper extends BaseMapper<OrderItem> {
}
--创建OrderShippingMapper接口
package cn.gzsxt.base.mapper;
import cn.gzsxt.base.pojo.OrderShipping;
import com.baomidou.mybatisplus.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
* @author yq.luan
* @since 2019-02-23
*/
public interface OrderShippingMapper extends BaseMapper<OrderShipping> {
}
2.2.2.第二步:创建OrderDetail类
说明:我们是通过OrderDetail类来接收订单页面提交的参数。
订单页面提交的参数如下:
分析:
(1)订单商品需要使用List<OrderItem>集合来接收。
(2)收件人信息需要使用对象.属性的方式来接收。
问题1:SpringMVC如何绑定List集合类型的参数?
答:需要将List集合定义到一个javabean对象中。
问题2:SpringMVC如何绑定对象.属性类型的参数?
答:将对象定义成javabean的一个属性。
结论:
(1)我们定义一个OrderDetail类,继承Order这个类。
目的:接收跟订单有关的参数。
(2)将List<OrderItem> orderItems定义成其中一个属性。
(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<OrderItem> orderItems;
private OrderShipping orderShipping;
public OrderDetail() {
super();
// TODO Auto-generated constructor stub
}
public List<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(List<OrderItem> 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<OrderItem> 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<String, String> 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)在浏览器访问门户首页,并提交订单。
--保存订单成功!!!