苍穹外卖 6.12-6.23
注意:day4 和 day9 需自己手敲。
day1-12 导入接口文档
工具:yapi
Apifox 创建项目后,在 项目设置 -> 数据管理 -> 导入数据 中选择 yapi,然后选择需要导入的文件。
不需要用 Postman。
day2-4
新增员工接口发送重复数据,期望 500。若 401,重新调登录接口,生成新 token,设置全局参数。
信息提示常量类添加,后重新编译。源文件没有。
public static final String ALREADY_EXISTS = "已存在";代码中避免出现字符串,使用常量类更规范。
SQLIntegrityConstraintViolationException 若爆红,导 sql 包。
重新调试,若非预期输出,检查 GlobalExceptionHandler 第 40 行代码。
String[] split = message.split(" ");预期输出:响应码 200。
day2-8
员工分页查询功能测试,若报 500,则查看 EmployeeMapper.xml 文件。
可能为生成的 sql 语句出错,注意分行,分号。
IDEA 快捷键:
- 选中一行:
Shift + Alt + 方向键 - 选中一块:
Shift + Ctrl + 方向键
day3-3
公共字段自动填充
Signature.class中对接口Signature向下转型快捷键:Ctrl + Alt + B- 查看子接口:
Ctrl + H - 若爆红,则导包。
- 删除选中的一行:
Ctrl + Y
IDEA 块注释:
- 快捷键:
Ctrl + Shift + / - 说明: 添加块注释;再次使用,去掉块注释。
- 注意: 如果已经写好代码块,使用块注释需要先选中要注释的块;去除注释的时候,不需要全部选中这块代码,只用光标在注释内容上按快捷键即可。
day3-5
category_id 为逻辑外键。
逻辑外键是数据库里没有设置,只是我们编程使用的时候逻辑上把它当作外键。
day3-6
新增菜品业务用到阿里云 OSS,免费试用 3 月。
day3-11
菜品分页查询,pageQuery 的动态 sql 在 MySQL Workbench 中写。
select d.* , c.name from dish d left outer join category c on d.category_id=c.id执行这句左外连接时,需选中左侧 sky_take_out。
day4
从“根据分类 id 查询菜品”开始写。参考答案以及 day3 写的代码。
易错点(SetmealController):
- 3.2.1 批量删除套餐:少写了
@RequestParam导致删除接口测不通。
delete(@RequestParam List<Long> ids){}- 4.2.1 根据 id 查询套餐:
GetMapping里少写大括号导致修改套餐时看不到回显。
@GetMapping("/{id}")day5-2
Redis 启动命令:
redis-server.exe redis.windows.confday5-17
更新 docket 配置后,接口文档若直接刷新会报接口异常。关闭后重新打开网址。
day6-3
单元测试若返回 500,启动 Redis 重新执行。
查询接口的实现类,选中单词,Ctrl + Alt + B。
day6-8
微信开发者工具调试 getUserProfile,若点击第一个 button 后不弹“获取你的昵称,头像”框。
- 解决:右上角点“详情-本地设置”修改调试基础库为 2.27.0 版本及以下(我选择的 2.26.2)。
day6-12
小程序 IDE 优化空间不小。导入代码时,勾选不使用云服务。
选了微信云服务后进去会白屏或者其他 bug,重新导入就好了。
day6-13
视频里用的 Postman,我用的 Apifox 的用户端接口,效果一样。传的四个参数,前两个自己保存过,后两个文档有说明。
day6-18
调试刚开始,若 code 为 null,注意 UserController Login 方法中添加 @RequestBody 注解。
发现拦截器里校验令牌代码处的问题,输出当前员工/用户 id 语句后少了 {}。补上即可。
day6-20
视频 7:27 左右出现的 SetmealMapper 文件中 70 行的 getByIdWithDish 函数,是我们定义过的 getById。
因为 Mapper 中我们直接使用了 @Select(),所以此处找不到小鸟从而进映射文件。从上面找个图标进映射文件 SetmealMapper.xml 粘贴就行。
注意:Day6-15 时若没配 yml(因为没下小程序 IDE),会导致小程序调试时登录后白屏,不显示任何信息。登录请求 200,但后端会报异常:登录失败。
day7-11
调试时忘记启动类添加注解了,导致 Redis 中无 cache。
@EnableCaching //开发缓存注解功能XML 爆红问题: 发现 xml 里有些 parameterType 和 resultType 爆红。解决方案:忽略即可,不影响运行。
day8 (跳过微信支付)
跳过微信支付,订单支付内容可跳过(因个人身份无法配置)。
代码调整(参考引文 1):
1. 修改小程序代码 修改 pages/pay/index.js 文件(约 245 行):
uni.redirectTo({ url: '/pages/success/index?orderId=' + _this.orderId })2. 修改 OrderServiceImpl 下的 payment 方法 生成空 JSON 替换原接口生成预支付交易单。
public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {
// 当前登录用户id
Long userId = BaseContext.getCurrentId();
User user = userMapper.getById(userId);
//生成空JSON,跳过微信支付流程
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"));
return vo;
}**3. 修改 OrderController**调用orderService.paySuccess 方法,传入订单号,直接更新数据库订单状态。
@PutMapping("/payment")
@ApiOperation("订单支付")
public Result<OrderPaymentVO> payment(@RequestBody OrdersPaymentDTO ordersPaymentDTO) throws Exception {
log.info("订单支付:{}", ordersPaymentDTO);
OrderPaymentVO orderPaymentVO = orderService.payment(ordersPaymentDTO);
log.info("生成预支付交易单:{}", orderPaymentVO);
// 模拟支付成功,更新数据库订单状态 -此时没有回调
orderService.paySuccess(ordersPaymentDTO.getOrderNumber());
return Result.success(orderPaymentVO);
}day9
取消订单
注释掉微信支付退款接口即可。
用户端取消订单逻辑修改(OrderServiceImpl 中): 订单处于待接单状态下取消,需要进行退款。由于前面模拟微信支付,实际上并未支付,此时用户端取消订单,需要跳过微信支付退款接口,直接修改数据库订单状态。
/**
* 用户取消订单
* @param id
*/
public void userCancelById(Long id) throws Exception {
// 根据id查询订单
Orders ordersDB = orderMapper.getById(id);
// 校验订单是否存在
if (ordersDB == null) {
throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
}
//订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
if (ordersDB.getStatus() > 2) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Orders orders = new Orders();
orders.setId(ordersDB.getId());
// 订单处于待接单状态下取消,需要进行退款
if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
// 跳过调用微信支付退款接口逻辑
// 支付状态修改为 退款
orders.setPayStatus(Orders.REFUND);
}
// 更新订单状态、取消原因、取消时间
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("用户取消");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}day10-5
生成 Cron 表达式,推荐直接使用 AI 生成。
day10-12
关于 day10 的部分需要修改。使用 getByNumber 方法查询订单。
跳过配置: 直接跳过内网穿透工具配置和微信支付回调的相关配置:在 yml 文件中仅配置 appid 和 secret 即可,其余均可注释掉。
修改 OrderServiceImpl 中的 paySuccess 代码:
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);
//通过WebSocket实现来单提醒 type orderId content
Map map = new HashMap<>();
map.put("type", 1);//消息类型,1表示来单提醒 2表示客户催单
map.put("orderID", ordersDB.getId());//订单id
map.put("content", "订单号:" + outTradeNo);
//通过websocket向客户端浏览器推送消息
String json = JSON.toJSONString(map);
webSocketServer.sendToAllClient(json);
}测试注意:
- 若第一次确认支付后无语音播报,则重新登录前端页面(建议用 Edge 默认设置)。
- 若语音播报一直响,则注释掉定时任务每五秒发送消息给客户端的代码。
- 若 Message 为空,则小程序 IDE 重新编译。
day11
存放营业额时 put 方法里写成 ("beginTime", beginTime) 了(自动填充导致),会导致图表中所有日期均为同一数据。
Map map=new HashMap();
map.put("begin",beginTime);
map.put("end",endTime);day11-21
若销量排名统计测试时,Top10 只有“昨日”有数据,则检查 ReportServiceImpl 文件中,getSalesTop10Statistics 方法中。
错误点: 第一个参数误写为 begin(视频或自动补全错误)。
修正:
LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX);