苍穹外卖项目笔记(9)— 用户下单

 前言

代码链接:

Echo0701/take-out⁤ (github.com)

1 导入地址簿模块功能代码

产品原型

接口设计

  • 查询当前登录用户的所有地址信息
  • 新增地址
  • 根据id查询地址 
  • 根据id修改地址
  • 根据id删除地址
  • 查询默认地址

数据库设计

2 用户下单

2.1 需求分析和设计

 

【注】当前用户下单的数据存到订单里面去,由于用户可能点了很多商品,每个商品可能含有多份,对于这样的数据我们一般存在另一张表里, 叫做订单明细表,订单表和订单明细表是一对多的关系

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 订单支付

【注】:这部分功能代码个人小程序里面实现不了,所以这部分内容先简单了解流程即可

微信支付时序图

<think>好的,用户想了解苍穹外卖用户下单功能流程和相关的开发文档、API。我需要根据提供的引用内容来整理回答,同时遵守系统级指令,比如正确使用LaTeX格式,生成相关问题等。 首先,我需要确认用户的问题范围。用户提到了“用户下单功能或流程”,可能包括从前端操作到后端处理的整个流程,还可能涉及API调用和开发文档。根据提供的引用,引用[1]提到了苍穹外卖项目的开发流程和环境搭建,引用[2]和[3]涉及微信小程序的支付流程,引用[4]提到了MD5加密用于密码处理。 用户下单流程应该包括几个步骤:登录验证、选择商品、创建订单、支付处理、订单状态更新等。我需要将这些步骤分解,并结合引用中的信息补充细节。例如,用户登录可能用到微信小程序的登录API(引用[3]),支付部分会涉及JSAPI下单和调起支付(引用[2]),密码加密可能用于用户身份验证(引用[4])。 接下来,需要确保回答结构清晰,分步骤说明流程,并引用正确的引用标记。例如,在登录部分提到微信小程序登录API时添加[^3],在支付部分引用微信支付流程时加上[^2],在涉及加密时引用[^4]。同时,开发环境搭建和启动命令可能来自引用[1]。 还需要注意使用中文回答,正确应用LaTeX格式,比如变量或代码中的参数如`prepay_id`可能需要用行内公式格式$...$,但根据示例,代码块中的内容不需要转换,所以可能不需要处理。独立公式暂时可能用不上,但如果有需要的话要用$$...$$。 生成的相关问题需要与用户下单流程相关,可能涉及加密处理、支付集成、性能优化等。例如,如何保证支付安全,如何处理高并发下单,如何集成微信支付等。 检查是否所有引用都正确标注,比如引用[1]是关于项目启动和环境配置,引用[2]和[3]是支付和登录,引用[4]是加密。确保每个引用只在相关部分出现,不要遗漏。 最后,按照用户的要求,回答要结构清晰,分步骤说明,并引用相关文档,同时生成相关问题。需要避免使用Markdown格式,用自然的中文段落,代码块用三个反引号包裹,正确标注引用。</think>### 苍穹外卖用户下单功能流程说明 #### 1. **用户身份验证** - 用户通过微信小程序登录,调用微信开放接口`wx.login`获取临时`code`,后端通过`code`换取用户唯一标识`openid`[^3]。 - 密码或敏感信息使用$MD5$加密传输(如:`DigestUtils.md5DigestAsHex(password.getBytes())`)。 #### 2. **商品选择与订单生成** - 用户在小程序界面选择商品,提交订单请求。 - 后端接收请求后验证库存、价格等信息,生成唯一订单号,并将数据写入数据库。 #### 3. **支付流程集成** - 调用微信支付`JSAPI`接口发起预支付请求,获取`prepay_id`。 - 小程序端通过`wx.requestPayment`调起支付界面,用户完成支付操作。 #### 4. **订单状态更新** - 支付成功后,微信支付回调通知后端更新订单状态为“已支付”。 - 后端通过异步任务处理配送逻辑,并推送消息通知用户。 #### 关键代码示例(订单创建) ```java // 示例:订单创建接口(伪代码) @PostMapping("/create") public Result createOrder(@RequestBody OrderDTO orderDTO) { // 1. 验证用户身份 String openid = getCurrentUserOpenId(); // 通过token解析 // 2. 生成订单号(如:时间戳+随机数) String orderId = generateOrderId(); // 3. 调用支付服务获取prepay_id String prepayId = wechatPayService.createPrepayOrder(orderId, orderDTO.getTotalAmount()); // 4. 返回支付参数给前端 return Result.success(paymentParams); } ``` #### 开发文档与API参考 - **微信登录API**: [微信官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html) - **微信支付集成**: 需实现`统一下单`和`支付结果回调`接口 - **项目启动命令**: `java -jar -Dspring.profiles.active=dev xxx.jar`(激活开发环境配置)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值