目录
地址簿功能
由产品原型来设计接口,我们需要设计7个接口(修改操作多一个回显的接口)分别用于:查询地址列表、新增地址、修改地址、删除地址、设置默认地址、查询默认地址。
-
新增地址
用什么方法请求?传入什么参数?返回什么数据?
使用post的方式。需要传入地址相关信息使用AddressBook来接收。无额外需要返回的信息。
-
查询登录用户所有地址
用什么方法请求?传入什么参数?返回什么数据?
使用get方式请求。由于用户id存储在服务器中因此不需要传入参数。需要返回对应用户的所有地址信息封装在List<AddressBook>中。
-
查询默认地址
用什么方法请求?传入什么参数?返回什么数据?
使用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);
用户下单功能
下单后,产生订单相关数据如:买了哪些商品?每个商品数量是多少?订单总金额是多少?收货地址是哪?哪个用户下的单?收货地址是哪?用户手机号是多少?
用户点餐的整体流程如下
-
用户下单
用什么方法请求?传入什么参数?返回什么数据?
使用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,我们只需要手动返回到前一页。
如果有帮助到你,希望可以点赞收藏转发~