苍穹外卖项目(黑马)学习笔记DAY8

目录

地址簿功能

新增地址

查询登录用户所有地址

查询默认地址

根据id查询地址

修改地址

根据id删除地址

设置默认地址

用户下单功能

用户下单

微信支付


地址簿功能

        由产品原型来设计接口,我们需要设计7个接口(修改操作多一个回显的接口)分别用于:查询地址列表、新增地址、修改地址、删除地址、设置默认地址、查询默认地址。

  • 新增地址

        用什么方法请求?传入什么参数?返回什么数据?

        使用post的方式。需要传入地址相关信息使用AddressBook来接收。无额外需要返回的信息。

  • 查询登录用户所有地址

        用什么方法请求?传入什么参数?返回什么数据?

        使用get方式请求。由于用户id存储在服务器中因此不需要传入参数。需要返回对应用户的所有地址信息封装在List中。

  • 查询默认地址

        用什么方法请求?传入什么参数?返回什么数据?

         使用get方式请求。也不需要传入参数。需要返回一条AddressBook。

  • 根据id查询地址

        用什么方法请求?传入什么参数?返回什么数据?

        使用get方式请求。需要传给后端一个id。查到后返回给前端一个AddressBook对象。

  • 修改地址

        用什么方法请求?传入什么参数?返回什么数据?

        使用put的请求方法。需要传入addressBook相关信息。无额外需要的数据返回给前端。

  • 根据id删除地址

        用什么方法请求?传入什么参数?返回什么数据?

        使用delete的请求方法。需要传入地址id。无额外的数据返回前端。

  • 设置默认地址

        用什么方法请求?传入什么参数?返回什么数据?

        使用put的请求方法。需要传入一个地址id。无额外需要的返回结果。

        设置默认地址本质上是更新操作,整体的思路是:先让所有地址都变成非默认,然后在设置一个默认地址。

        //1、将当前用户的所有地址修改为非默认地址 update address_book set is_default = ? where user_id = ?
        addressBook.setIsDefault(0);
        addressBook.setUserId(BaseContext.getCurrentId());
        addressBookMapper.updateIsDefaultByUserId(addressBook);

        //2、将当前地址改为默认地址 update address_book set is_default = ? where id = ?
        addressBook.setIsDefault(1);
        addressBookMapper.update(addressBook);

用户下单功能

        下单后,产生订单相关数据如:买了哪些商品?每个商品数量是多少?订单总金额是多少?收货地址是哪?哪个用户下的单?收货地址是哪?用户手机号是多少?

        用户点餐的整体流程如下

苍穹外卖项目(黑马)学习笔记DAY8_第1张图片

  • 用户下单

        用什么方法请求?传入什么参数?返回什么数据?

        使用post方式请求。需要传入地址簿id、配送状态、打包费、总金额、备注和餐具数量封装成OrdersSubmitDTO后给服务器。需要返回下单时间、总金额和订单号封装成OrderSubmitVO返回给前端。

        先处理异常情况,如果说收货地址和购物车是空的则抛出异常。如果都正常我们就构造订单数据,需要在前端传过来的信息基础上添加手机号、地址、下单时间、设置订单的状态等,之后插入数据库中订单表中。之后插入订单详细表的数据。操作完之后删除购物车中的所有菜品。然后就是分装返回结果给前端。

  • 微信支付

        由于没有商户,我们做不了微信支付。不过我们可以修改代码,模拟我们已经支付成功。这里给出微信支付的解决方案。

        首先,将微信支付的代码注释掉,我们不调用。在支付成功这个函数中,我们直接将订单状态改成带派送,支付状态改成支付成功就行。

 public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {
        // 当前登录用户id
        Long userId = BaseContext.getCurrentId();
        User user = userMapper.getById(userId);

//        //调用微信支付接口,生成预支付交易单
//        JSONObject jsonObject = weChatPayUtil.pay(
//                ordersPaymentDTO.getOrderNumber(), //商户订单号
//                new BigDecimal(0.01), //支付金额,单位 元
//                "苍穹外卖订单", //商品描述
//                user.getOpenid() //微信用户的openid
//        );
        JSONObject jsonObject=new JSONObject();
        if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) {
            throw new OrderBusinessException("该订单已支付");
        }

        OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
        vo.setPackageStr(jsonObject.getString("package"));
        paySuccess(ordersPaymentDTO.getOrderNumber());
        return vo;
    }


    //在支付成功这个函数中,我们直接将订单状态改成带派送,支付状态改成支付成功就行
    public void paySuccess(String outTradeNo) {

        // 根据订单号查询订单
        Orders ordersDB = orderMapper.getByNumber(outTradeNo);

        // 根据订单id更新订单的状态、支付方式、支付状态、结账时间
        Orders orders = Orders.builder()
                .id(ordersDB.getId())
                .status(Orders.TO_BE_CONFIRMED)
                .payStatus(Orders.PAID)
                .checkoutTime(LocalDateTime.now())
                .build();
    //以下是后边的关于订单通知的,可以先不写。
        orderMapper.update(orders);
        Map map=new HashMap<>();
        map.put("type",1);
        map.put("orderId",ordersDB.getId());
        map.put("content","订单号:"+outTradeNo);
        String json= JSON.toJSONString(map);
        websocketserve.sendToAllClient(json);

    }

        效果就是支付剩余时间停止,也可以看到payment方法返回的状态是200,我们只需要手动返回到前一页。

苍穹外卖项目(黑马)学习笔记DAY8_第2张图片

如果有帮助到你,希望可以点赞收藏转发~

你可能感兴趣的:(苍穹外卖学习笔记,学习,笔记,spring,maven,spring,boot,mybatis)