前言
代码链接:https://gitee.com/niesir04/sky-take-out.git
1 导入地址簿模块功能代码
产品原型
接口设计
- 查询当前登录用户的所有地址信息
- 新增地址
- 根据id查询地址
- 根据id修改地址
- 根据id删除地址
- 查询默认地址
数据库设计
2 用户下单
2.1 需求分析和设计![](https://img-blog.csdnimg.cn/direct/311a99ef2e444b88992ae4d67549ca90.png)
![](https://img-blog.csdnimg.cn/direct/b9e5568897024d74a41e6772632b38dc.png)
![](https://img-blog.csdnimg.cn/direct/0e14ef80eb9f48c3867c7959b59dc870.png)
![](https://img-blog.csdnimg.cn/direct/4bf828f55341482781d57e94f6d05d26.png)
【注】当前用户下单的数据存到订单里面去,由于用户可能点了很多商品,每个商品可能含有多份,对于这样的数据我们一般存在另一张表里, 叫做订单明细表,订单表和订单明细表是一对多的关系
2.2 代码开发
OrderServiceImpl.java
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderMapper orderMapper; //订单表
@Autowired
private OrderDetailMapper orderDetailMapper; //订单明细表
@Autowired
private AddressBookMapper addressBookMapper; //地址簿
@Autowired
private ShoppingCartMapper shoppingCartMapper; //购物车表格
/**
* 用户下单
* @param ordersSubmitDTO
* @return
*/
public OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) {
//1、处理各种业务异常问题(地址簿为空、购物车数据为空)
AddressBook addressBook = addressBookMapper.getById(ordersSubmitDTO.getAddressBookId());
if (addressBook.getId() == null) {
//抛出业务异常
throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL);
}
//查询当前用户的购物车数据
Long userId = BaseContext.getCurrentId();
ShoppingCart shoppingCart = new ShoppingCart();
shoppingCart.setUserId(userId);
List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart);
if (shoppingCartList == null || shoppingCartList.size() == 0) {
//抛出业务异常
throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL);
}
//2、向订单表插入1条数据
//构造需要提交的参数orders
Orders orders = new Orders();
//因为订单表里面有很多属性,先把DTO里面的属性拷贝一部分进来,
BeanUtils.copyProperties(ordersSubmitDTO, orders);
orders.setOrderTime(LocalDateTime.now());
orders.setPayStatus(Orders.UN_PAID); //支付状态,未支付
orders.setDeliveryStatus(Orders.PENDING_PAYMENT); //订单状态:待付款
orders.setNumber(String.valueOf(System.currentTimeMillis())); //使用当前系统时间戳作为订单号
orders.setPhone(addressBook.getPhone());
orders.setConsignee(addressBook.getConsignee()); //收货人
orders.setUserId(userId); //用户人id
//插入数据
orderMapper.insert(orders);
//3、向订单明细表插入n条数据,真正下单购买商品的数据是由购物车里面的数据决定,所以遍历购物车,将每个对象封装为订单明细表
//对于遍历以后进行插入,可以放在for循环里面进行遍历,这样就是单条插入,也可以放在for外面,进行批量插入
List<OrderDetail> orderDetailList = new ArrayList<>();
for (ShoppingCart cart : shoppingCartList) {
OrderDetail orderDetail = new OrderDetail(); //订单明细
BeanUtils.copyProperties(cart, orderDetail);
orderDetail.setOrderId(orders.getId()); //设置当前订单明细关联的订单id
orderDetailList.add(orderDetail);
}
orderDetailMapper.insertBatch(orderDetailList);
//4、如果下单成功,清空当前用户的购物车数据
shoppingCartMapper.deleteByUserId(userId);
//5、封装VO返回结果
OrderSubmitVO orderSubmitVO = OrderSubmitVO.builder()
.id(orders.getId())
.orderTime(orders.getOrderTime())
.orderNumber(orders.getNumber())
.orderAmount(orders.getAmount())
.build();
return orderSubmitVO;
}
}
3 订单支付
【注】:这部分功能代码个人小程序里面实现不了,所以这部分内容先简单了解流程即可
微信支付时序图