一、订单逻辑
- 在购物车页面点击“去结算”按钮跳转到订单确认页面。
- 展示商品列表
- 配送地址列表
- 选择支付方式
- 展示订单确认页面之前,应该确认用户身份。
- 使用拦截器实现。
- Cookie中取token
- 取不到token跳转到登录页面
- 取到token,根据token查询用户信息。
- 如果没有用户信息,登录过期跳转到登录页面
- 取到用户信息,放行。
- 提交订单
- 生成订单
- 展示订单提交成功页面。
订单系统系统:订单确认页面、订单提交成功页面。
订单服务系统
二、工程搭建
1. 搭建taotao-order工程,参考taotao-content工程
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>com.taotao</groupId>
<artifactId>taotao-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>taotao-order</artifactId>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.taotao</groupId>
<artifactId>taotao-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.taotao</groupId>
<artifactId>taotao-manager-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<!-- 配置插件 -->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8090</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
<modules>
<module>taotao-order-interface</module>
<module>taotao-order-service</module>
</modules>
</project>
2. 创建taotao-order-interface工程
pom.xml
不做修改 ,需要时再添加
3. 创建taotao-order-service
3.1 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>com.taotao</groupId>
<artifactId>taotao-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>taotao-order-service</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.taotao</groupId>
<artifactId>taotao-order-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>netty</artifactId>
<groupId>org.jboss.netty</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- activeMQ -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
</dependency>
</dependencies>
</project>
3.2 配置文件
3.2.1 applicationContext-dao.xml 不做修改
3.2.2 applicationContext-jedis.xml
3.2.3 applicationContext-service.xml
3.2.4 applicationContext-tranc.xml
3.2.5 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="taotao" version="2.5">
<display-name>taotao-order</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 初始化spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
4. 创建taotao-order-web工程 参考taotao-portal工程
4.1 配置文件
4.2 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>com.taotao</groupId>
<artifactId>taotao-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>taotao-order-web</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.taotao</groupId>
<artifactId>taotao-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.taotao</groupId>
<artifactId>taotao-manager-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.taotao</groupId>
<artifactId>taotao-order-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>netty</artifactId>
<groupId>org.jboss.netty</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!-- 配置插件 -->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8091</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.3 springmvc.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 配置注解驱动 -->
<mvc:annotation-driven />
<!-- 视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 配置包扫描器,扫描@Controller注解的类 -->
<context:component-scan base-package="com.taotao.order.controller"/>
<!-- 配置静态资源 -->
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
<!-- 引用dubbo服务 -->
<dubbo:application name="taotao-order"/>
<dubbo:registry protocol="zookeeper" address="172.18.34.94:2181"/>
<!-- 发布dubbo服务 -->
<!-- <dubbo:reference interface="com.taotao.content.service.ItemCatService" id="itemCatService"" timeout = "300000" /> -->
</beans>
4.4 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>taotao-order</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<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>
<servlet>
<servlet-name>taotao-order</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>taotao-order</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>taotao-order</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
三、功能实现
1. 逻辑分析
在购物车页面点击“去结算”按钮时,会判断用户是否登录,若未登陆,会跳转到登录页面,若登录成功后,页面会跳转到订单结算页面。如下图所示:
里面会显示:
收货人信息:收货地址、联系方式
支付方式:货到付款、在线支付、公司转账
送货清单:配送方式
发票信息等
这选择完成以后,会有一个“提交订单”的按钮,点击,就会跳转到支付页面
2. 代码实现
2.1 代码逻辑
1.从cookie中取数据
2.获取到用户的收货信息列表,展示到页面(要求用户必须登录.拦截器)
3.取出购物车中的信息展示到页面
2.2 resource.properties
#购物车取商品的key
TT_CART=TT_CART
#cookie生命周期,通常是7天,604800秒
COOKIE_CART_EXPIRE=604800
2.3Controller
package com.taotao.order.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.taotao.pojo.TbItem;
import com.taotao.utils.CookieUtils;
import com.taotao.utils.JsonUtils;
@Controller
public class OrderController {
@Value("${TT_CART}")
private String TT_CART;
@Value("${COOKIE_CART_EXPIRE}")
private Integer COOKIE_CART_EXPIRE;
/**
* 展示订单信息
* url:在cart.jsp的去结算
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping("/order/order-cart")
public String showOrderCart(HttpServletRequest request, HttpServletResponse response, Model model){
//1.从cookie中取出购物车信息
List<TbItem> list = getCartList(request, response);
//2.在页面展示
model.addAttribute("cartList", list);
return "order-cart";
}
/**
* 从cookie中获取购物车信息
* @return
*/
private List<TbItem> getCartList(HttpServletRequest request, HttpServletResponse response){
String jsonData = CookieUtils.getCookieValue(request, TT_CART, true);
if (StringUtils.isNotEmpty(jsonData)) {
List<TbItem> list = JsonUtils.jsonToList(jsonData, TbItem.class);
return list;
}
return new ArrayList<>();
}
}
3. 配置拦截器
3.1 LoginInterceptor.java
package com.taotao.order.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.HttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.taotao.pojo.TbUser;
import com.taotao.utils.CookieUtils;
import com.taotao.utils.HttpClientUtil;
import com.taotao.utils.JsonUtils;
public class LoginInterceptor implements HandlerInterceptor {
@Value("${TT_TOKEN}")
private String TT_TOKEN;
@Value("${LOGIN_BASIC_URL}")
private String LOGIN_BASIC_URL;
@Value("${LOGIN_PAGE}")
private String LOGIN_PAGE;
@Value("${USER_TOKEN}")
private String USER_TOKEN;
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// 之后拦截
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// 之前拦截
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
//1. 从cookie中取出token码令牌
//2. 如果取到,则查询用户信息
//3. 若果没取到,则返回登录页面
String token = CookieUtils.getCookieValue(request, TT_TOKEN, true);
String url = request.getRequestURL().toString();//获取用户请求的url
if (StringUtils.isEmpty(token)) {
//跳转到登录页面,登录成功后自动跳转到购物车去结算页面
response.sendRedirect(LOGIN_BASIC_URL+LOGIN_PAGE+"?redirect="+url);
return false;
}
//获取用户信息
String jsonData = HttpClientUtil.doGet(LOGIN_BASIC_URL+USER_TOKEN+token);
//格式转换
TaotaoResult result = TaotaoResult.formatToPojo(jsonData, TbUser.class);
TbUser user = (TbUser) result.getData();
//将user保存到request
request.setAttribute("user", user);
return true;
}
}
3.2 resource.properties
#购物车取商品的key
TT_CART=TT_CART
#cookie生命周期,通常是7天,604800秒
COOKIE_CART_EXPIRE=604800
#cookie中的token码
TT_TOKEN=TT_TOKEN
#登录基础url
LOGIN_BASIC_URL=http://localhost:8088/
#登录页面
LOGIN_PAGE=page/login
#token路径,在sso-web工程中根据token查询用户信息,/token/{token}
USER_TOKEN=/token/
3.3 springmvc.xml
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/order/**"/>
<bean class="com.taotao.order.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
四、提交订单
1. 分析
1.1 订单号的生成:
解决方案一(不能使用):
使用mysql的自增长。
优点:不需要我们自己生成订单号,mysql会自动生成。
缺点:如果订单表数量太大时需要分库分表,此时订单号会重复。如果数据备份后再恢复,订单号会变。
方案二:日期+随机数
采用毫秒+随机数。
缺点:仍然有重复的可能。不建议采用此方案。在没有更好的解决方案之前可以使用。
方案三:使用UUID
优点:不会重复。
缺点:长。可读性查。不建议使用。
方案四:可读性好,不能太长。一般订单都是全数字的。可以使用redis的incr命令生成订单号。
优点:可读性好,不会重复
缺点:需要搭建redis服务器。
1.2 订单需要的表
- 在订单确认页面点击“提交订单”按钮生成订单。
- 请求的url:/order/create
- 参数:提交的是表单的数据。保存的数据:订单、订单明细、配送地址。
a) 向tb_order订单表中插入记录。
i 订单号需要手动生成。
要求订单号不能重复。
订单号可读性号。
可以使用redis的incr命令生成订单号。订单号需要一个初始值。
ii Payment:表单数据
iii ayment_type:表单数据
iv user_id:用户信息
v buyer_nick:用户名
vi 其他字段null
b) 向tb_order_item订单明细表插入数据(一个订单里面包含多个订单明细)
i Id:使用incr生成
ii order_id:生成的订单号
iii 其他的都是表单中的数据
c) tb_order_shipping收货信息表。订单配送信息
i order_id:生成的订单号
ii 其他字段都是表单中的数据
d) 使用pojo接收表单的数据。
可以扩展TbOrder,在子类中添加两个属性一个是商品明细列表,一个是配送信息。
把pojo放到taotao-order-interface工程中。
2、代码编写
2.1 封装一个类OrderInfo,继承TbOrder.java
package com.taotao.order.pojo;
import java.io.Serializable;
import java.util.List;
import com.taotao.pojo.TbOrder;
import com.taotao.pojo.TbOrderItem;
import com.taotao.pojo.TbOrderShipping;
/**
* 封装一个pojo类,继承TbOrder
* @author fengjinzhu
*
*/
public class OrderInfo extends TbOrder implements Serializable{
//与页面order-cart.jsp中的保持一致
private List<TbOrderItem> orderItems;
private TbOrderShipping orderShipping;
public List<TbOrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(List<TbOrderItem> orderItems) {
this.orderItems = orderItems;
}
public TbOrderShipping getOrderShipping() {
return orderShipping;
}
public void setOrderShipping(TbOrderShipping orderShipping) {
this.orderShipping = orderShipping;
}
}
2.2 resource.properties
#订单主键递增的key
REDIS_ORDER_ID_KEY=REDIS_ORDER_ID
#初始值,随便定义
REDIS_ORDER_ID_INDEX=10086
#订单明细主键递增的key
REDIS_ORDER_ITEM_ID_KEY=REDIS_ORDER_ITEM_ID
#初始值,随便定义
REDIS_ORDER_ITEM_ID_INDEX=1
2.4 JedisClient.java
2.5 JedisClientSingle.java
2.6 service
package com.taotao.order.service;
import com.taotao.order.pojo.OrderInfo;
import com.taotao.utils.TaotaoResult;
public interface OrderService {
//保存订单
public TaotaoResult saveOrder(OrderInfo orderInfo);
}
2.7 ServiceImpl
package com.taotao.order.service.impl;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.taotao.mapper.OrderItemMapper;
import com.taotao.mapper.OrderMapper;
import com.taotao.mapper.OrderShippingMapper;
import com.taotao.order.dao.JedisClient;
import com.taotao.order.pojo.OrderInfo;
import com.taotao.order.service.OrderService;
import com.taotao.pojo.TbOrderItem;
import com.taotao.pojo.TbOrderShipping;
import com.taotao.utils.TaotaoResult;
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private OrderShippingMapper orderShippingMapper;
@Autowired
private JedisClient jedisClient;
//订单id
@Value("${REDIS_ORDER_ID_KEY}")
private String REDIS_ORDER_ID_KEY;
//订单id初始值
@Value("${REDIS_ORDER_ID_INDEX}")
private String REDIS_ORDER_ID_INDEX;
//订单明细id
@Value("${REDIS_ORDER_ITEM_ID_KEY}")
private String REDIS_ORDER_ITEM_ID_KEY;
//订单明细id初始值
@Value("${REDIS_ORDER_ITEM_ID_INDEX}")
private String REDIS_ORDER_ITEM_ID_INDEX;
/**
* 提交订单
* 1.判断redis中是否有这个key
2.若不存在,则设置一个初始值
3.若存在,则让这个key递增
4.保存订单信息
*/
@Override
public TaotaoResult saveOrder(OrderInfo orderInfo) {
//1.向订单表中插入数据
if (! jedisClient.exists(REDIS_ORDER_ID_KEY)) {
jedisClient.set(REDIS_ORDER_ID_KEY, REDIS_ORDER_ID_INDEX);//设置初始值
}
String orderId = jedisClient.incr(REDIS_ORDER_ID_KEY)+"";//递增
orderInfo.setOrderId(orderId);
orderInfo.setCreateTime(new Date());
orderInfo.setUpdateTime(new Date());
//支付状态1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭
orderInfo.setStatus(1);
// 向订单表插入数据。
orderMapper.addOrder(orderInfo);
//2.向订单明细表插入数据
List<TbOrderItem> itemList = orderInfo.getOrderItems();//查询订单明细信息
for (TbOrderItem tbOrderItem : itemList) {
String itemId = jedisClient.incr(REDIS_ORDER_ITEM_ID_KEY)+"";//订单明细递增
tbOrderItem.setItemId(itemId);
tbOrderItem.setId(orderId);
//插入数据
orderItemMapper.addOrderItem(tbOrderItem);
}
//3.向收货信息表插入数据
TbOrderShipping orderShipping = orderInfo.getOrderShipping();
orderShipping.setOrderId(orderId);
orderShipping.setCreated(new Date());
orderShipping.setUpdated(new Date());
//插入数据
orderShippingMapper.addOrderShipping(orderShipping);
return TaotaoResult.ok(orderId);
}
}
2.8 Mapper
不再写,简单
2.9 Dubbo 发布服务
applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- 配置service扫描包 -->
<context:component-scan base-package="com.taotao.order.service"/>
<!-- 生产者,在这发布一个dubbo服务,相当于把service发布到注册中心去. -->
<!-- 使用dubbo发布服务 -->
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="taotao-order" />
<dubbo:registry protocol="zookeeper" address="172.18.34.94:2181" />
<!-- 用dubbo协议在20881端口暴露服务 -->
<!-- 这里需要改变一下,要不然就和taotao-manager-service冲突 -->
<dubbo:protocol name="dubbo" port="20884" />
<!-- 订单接口 -->
<dubbo:service interface="com.taotao.order.service.OrderService" ref="orderServiceImpl" />
</beans>
springmvc.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:resource/*.properties" />
<!-- 配置注解驱动 -->
<mvc:annotation-driven />
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/order/**"/>
<bean class="com.taotao.order.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 配置包扫描器,扫描@Controller注解的类 -->
<context:component-scan base-package="com.taotao.order.controller"/>
<!-- 配置静态资源 -->
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
<!-- 引用dubbo服务 -->
<dubbo:application name="taotao-order"/>
<dubbo:registry protocol="zookeeper" address="172.18.34.94:2181"/>
<!-- 订单信息服务 -->
<dubbo:reference interface="com.taotao.order.service.OrderService" id="orderService" timeout = "300000" />
</beans>
2.10 Controller
/**
* 提交订单
* @param orderInfo
* @param request
* @return
*/
@RequestMapping("/order/create")
public String saveOrder(OrderInfo orderInfo, HttpServletRequest request, HttpServletResponse response, Model model){
//从request中取出保存的user
TbUser user = (TbUser) request.getAttribute("user");
//数据补全
orderInfo.setUserId(user.getId());
orderInfo.setBuyerNick(user.getUsername());
TaotaoResult result = orderService.saveOrder(orderInfo);
//实现成功页面信息的展示
//从TaotaoResult中拿出orderId
String orderId = (String) result.getData();
model.addAttribute("orderId", orderId);
model.addAttribute("payment", orderInfo.getPayment());//总价格
//送货时间\
DateTime datetime = new DateTime();
datetime.plusDays(3);//增加3天
//datetime.plusYears(3);//增加3年
request.setAttribute("date", datetime.toString("yyyy-MM-dd"));
//清空cookie,将购物车中已经买单的商品清空
CookieUtils.setCookie(request, response, TT_CART, null);
return "success";
}
测试: