如何做一个电商系统(七)

1.订单系统

(1)完成订单系统。

(2)实现订单提交功能。

1.1.系统架构

说明:将订单服务抽取出来,创建单独的订单系统。

好处:提供代码的复用性,增强系统的拓展能力。

image.png
image.png

1.2.订单系统表结构

image.png

表结构说明:
(1)订单表跟用户表示多对一的关系。

(2)订单表跟收件人表示一对一的关系。

(3)订单表跟订单商品表示一对多的关系。

(4)订单商品表跟商品表示一对一的关系。

1.3.实现思路

(1)搭建订单系统

(2)在订单系统中发布保存订单接口

(3)在门户系统中调用该接口

2.保存订单功能实现

2.1.第一部分:搭建订单系统

步骤说明:(1)创建一个Maven项目。

(2)导入相关依赖

(3)实现框架整合

2.1.1.第一步:创建项目

--说明:使用Maven Module创建,war模型

image.png

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类来接收订单页面提交的参数。

订单页面提交的参数如下:

image.png

分析:
(1)订单商品需要使用List集合来接收。

(2)收件人信息需要使用对象.属性的方式来接收。

问题1:SpringMVC如何绑定List集合类型的参数?

答:需要将List集合定义到一个javabean对象中。

问题2:SpringMVC如何绑定对象.属性类型的参数?

答:将对象定义成javabean的一个属性。

结论:
(1)我们定义一个OrderDetail类,继承Order这个类。

目的:接收跟订单有关的参数。

(2)将List 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 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)在浏览器访问门户首页,并提交订单。

image.png

--保存订单成功!!!

你可能感兴趣的:(如何做一个电商系统(七))