1.数据库

  1.1 订单数据库

USE `store`
DROP TABLE IF EXISTS `t_order`
CREATE TABLE t_order (
oid INT AUTO_INCREMENT COMMENT '订单id',
uid INT NOT NULL COMMENT '用户id',
recv_name VARCHAR(20) NOT NULL COMMENT '收货人姓名',
recv_phone VARCHAR(20) COMMENT '收货人电话',
recv_province VARCHAR(15) COMMENT '收货人所在省',
recv_city VARCHAR(15) COMMENT '收货人所在市',
recv_area VARCHAR(15) COMMENT '收货人所在区',
recv_address VARCHAR(50) COMMENT '收货详细地址',
total_price BIGINT COMMENT '总价',
STATUS INT COMMENT '状态:0-未支付,1-已支付,2-已取消,3-已关闭,4-已完成',
order_time DATETIME COMMENT '下单时间',
pay_time DATETIME COMMENT '支付时间',
created_user VARCHAR(20) COMMENT '创建人',
created_time DATETIME COMMENT '创建时间',
modified_user VARCHAR(20) COMMENT '修改人',
modified_time DATETIME COMMENT '修改时间',
PRIMARY KEY (oid)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

t_order

  1.2 订单商品数据库

DROP TABLE IF EXISTS `t_order_item`
CREATE TABLE t_order_item (
id INT AUTO_INCREMENT COMMENT '订单中的商品记录的id',
oid INT NOT NULL COMMENT '所归属的订单的id',
pid INT NOT NULL COMMENT '商品的id',
title VARCHAR(100) NOT NULL COMMENT '商品标题',
image VARCHAR(500) COMMENT '商品图片',
price BIGINT COMMENT '商品价格',
num INT COMMENT '购买数量',
created_user VARCHAR(20) COMMENT '创建人',
created_time DATETIME COMMENT '创建时间',
modified_user VARCHAR(20) COMMENT '修改人',
modified_time DATETIME COMMENT '修改时间',
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
```

t_order_item

2.实体类

  2.1 订单实体类

@Data
public class Order extends BaseEntity{
private Integer oid;
private Integer uid;
private String recvName;
private String recvPhone;
private String recvProvince;
private String recvCity;
private String recvArea;
private String recvAddress;
private Long totalPrice;
private Integer status;
private Date orderTime;
private Date PayTime;
}

Order实体类

  2.2 订单商品实体类

@Data
public class OrderItem extends BaseEntity {
private Integer id;
private Integer oid;
private Integer pid;
private String title;
private String image;
private Long price;
private Integer num;
}

OrderItem实体类

3.mapper层

  3.1 增加订单

    3.1.1 OrderMapper接口

/**
* 插入订单数据
* @param order 订单数据
* @return 受影响行数
*/
Integer insertOrder(Order order);

/**
* 插入订单商品数据
* @param orderItem 订单商品数据
* @return
*/
Integer insertOrderItem(OrderItem orderItem);

    3.1.2 OrderMapper.xml

<!--插入订单数据-->
<insert id="insertOrder" useGeneratedKeys="true" keyProperty="oid">
insert into store.t_order
(uid, recv_name, recv_phone, recv_province, recv_city, recv_area, recv_address, total_price, status, order_time, pay_time, created_user, created_time, modified_user, modified_time)
values(
#{uid}, #{recvName}, #{recvPhone}, #{recvProvince}, #{recvCity}, #{recvArea},
#{recvAddress}, #{totalPrice}, #{status}, #{orderTime}, #{payTime}, #{createdUser},
#{createdTime}, #{modifiedUser}, #{modifiedTime}
)
</insert>
<!--插入订单商品数据-->
<insert id="insertOrderItem" useGeneratedKeys="true" keyProperty="id">
insert into store.t_order_item(oid, pid, title, image, price, num, created_user, created_time, modified_user, modified_time)
values (
#{oid}, #{pid}, #{title}, #{image}, #{price}, #{num}, #{createdUser},
#{createdTime}, #{modifiedUser}, #{modifiedTime}
)
</insert>

接口方法对应SQL语句

    3.1.3 OrderMapperTests

@Test
public void insertOrder(){
Order order = new Order();
order.setUid(6);
order.setRecvName("小库");
Integer rows = orderMapper.insertOrder(order);
System.out.println("rows:" + rows);
}

@Test
public void insertOrderItem(){
OrderItem orderItem = new OrderItem();
orderItem.setOid(1);
orderItem.setPid(2);
orderItem.setTitle("高档铅笔");
Integer rows = orderMapper.insertOrderItem(orderItem);
System.out.println("rows:" + rows);
}

Order和OrderItem

    3.1.1 测试结果

10.订单_实体类

10.订单_数据库_02

4.service层

  4.1 增加订单

    4.1.1 IOrderService

/**
* 创建订单
* @param aid 收货地址id
* @param cids 即将购买的商品数据在购物车列表中的id
* @param uid 当前登录的用户id
* @param username 当前登录的用户名
* @return 成功创建的订单数据
*/
Order create(Integer aid, Integer[] cids, Integer uid, String username);

    4.1.2 OrderServiceImpl

@Autowired
private OrderMapper orderMapper;
@Autowired
private IAddressService addressService;
@Autowired
ICartService cartService;

@Transactional
@Override
public Order create(Integer aid, Integer[] cids, Integer uid, String username) {
List<CartVO> cartVOList = cartService.getVOByCids(uid, cids);
long totalPrice = 0 ;//也可以Long sumPrice = 0;
for (CartVO cartVO : cartVOList) {//商品总价
totalPrice += cartVO.getPrice() * cartVO.getNum();
}

Order order = new Order();
order.setUid(uid);
//禅熏收货地址数据
Address address = addressService.getByAid(aid, uid);
order.setRecvName(username);
order.setRecvPhone(address.getPhone());
order.setRecvProvince(address.getProvinceName());
order.setRecvCity(address.getCityName());
order.setRecvArea(address.getAreaName());
order.setRecvAddress(address.getAddress());
order.setTotalPrice(totalPrice);//补全totalPrice
order.setStatus(0);
order.setOrderTime(new Date());//下单时间
//补全数据:日志
order.setCreatedUser(username);
order.setCreatedTime(new Date());
//插入订单数据
Integer insertOrder = orderMapper.insertOrder(order);
if(insertOrder == null){
throw new InsertException("订单插入异常!");
}

for (CartVO cartVO : cartVOList) {
//创建订单商品数据
OrderItem orderItem = new OrderItem();
orderItem.setOid(order.getOid());
orderItem.setPid(cartVO.getPid());
orderItem.setTitle(cartVO.getTitle());
orderItem.setImage(cartVO.getImage());
orderItem.setPrice(cartVO.getRealPrice());//真实价格
orderItem.setNum(cartVO.getNum());
orderItem.setCreatedUser(username);
orderItem.setCreatedTime(new Date());
orderItem.setModifiedUser(username);
orderItem.setModifiedTime(new Date());
Integer insertOrderItem = orderMapper.insertOrderItem(orderItem);
if (insertOrderItem != 1){
throw new InsertException("插入订单商品数据异常!");
}
}
return order;
}

OrderServiceImpl

    4.1.3 OrderServiceTests

@Test
public void create(){
try{
Integer aid = 1;
Integer[] cids = {2, 3};
Integer uid = 9;
String username = "订单管理员";
Order order = orderService.create(aid, cids, uid, username);
System.out.println(order);
}catch(ServiceException e){
System.out.println(e.getClass().getSimpleName());
System.out.println(e.getMessage());
}
}

createTest

    4.1.4 测试结果

10.订单_数据库_03

5.controller层

  5.1 增加订单

    5.1.1 BaseController

    5.1.2 OrderController

@RestController
@RequestMapping("/orders")
public class OrderController extends BaseController{
@Autowired
private IOrderService orderService;

@PostMapping("/create")
public JsonResult<Order> create(Integer aid, Integer[] cids, HttpSession session){
Integer uid = getUidFromSession(session);
String username = getUsernameFromSession(session);
Order data = orderService.create(aid, cids, uid, username);
return new JsonResult<Order>(OK, data);
}
}

    5.1.3 测试结果

10.订单_数据_04

10.订单_数据_05

 

6.小结

  6.1 订单类和订单商品类

  订单类主要是存储订单的一些收货信息以及日志,订单商品类中包含订单id,以及商品的信息以及日志

  6.1 订单serviceImpl

   该类主要是实现订单的创建业务逻辑,其中业务中使用到了IOrderService,IAddressService以及ICartService三个接口,根据IOrderService插入Order实体类

   和OrderItem实体类,再通过IAddressService设置收货信息,接着使用ICartService获取商品信息插入到订单商品对象中,最后返回订单