淘淘商城28_订单处理

一、订单逻辑

  1. 在购物车页面点击“去结算”按钮跳转到订单确认页面。
    1. 展示商品列表
    2. 配送地址列表
    3. 选择支付方式
  2. 展示订单确认页面之前,应该确认用户身份。
    1. 使用拦截器实现。
    2. Cookie中取token
    3. 取不到token跳转到登录页面
    4. 取到token,根据token查询用户信息。
    5. 如果没有用户信息,登录过期跳转到登录页面
    6. 取到用户信息,放行。
  3. 提交订单
    1. 生成订单
    2. 展示订单提交成功页面。

 

订单系统系统:订单确认页面、订单提交成功页面。

订单服务系统

 

二、工程搭建

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 订单需要的表

  1. 在订单确认页面点击“提交订单”按钮生成订单。
  2. 请求的url:/order/create
  3. 参数:提交的是表单的数据。保存的数据:订单、订单明细、配送地址。  

           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";
	}

测试:

 

 

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值