苍穹外卖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+ /
使用 Ctrl+Shift+ /, 添加块注释,再次使用,去掉块注释;
注意:如果已经写好代码块,使用块注释需要先选中要注释的块;
去除注释的时候,不需要全部选中这块代码,只用光标在注释内容上按Ctrl+Shift+/即可。
day3-5
category_id 为逻辑外键。
逻辑外键是数据库里没有设置,只是我们编程使用的时候逻辑上把他当作外键
day3-6
新增菜品业务用到阿里云oss,免费试用3月。黑马javaweb中介绍了如何使用。
Day11-04. 案例-文件上传-阿里云OSS-准备_哔哩哔哩_bilibili
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 SetmealController批量删除套餐这少写了@RequestParam导致删除接口测不通。
delete(@RequestParam List<Long> ids){
4.2.1 SetmealController根据id查询套餐GetMapping里少写大括号导致修改套餐时看不到回显。
@GetMapping("/{id}")
day5-2
redis启动命令
redis-server.exe redis.windows.conf
day5-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的时候因为没下小程序ide,所以没配yml。day6结束才发现,我是sb。
会导致小程序调试时登录后白屏,不显示任何信息。登录请求200,但后端会报异常:登录失败。
day7-11
调试时忘记启动类添加注解了。导致redis中无cache。
@EnableCaching //开发缓存注解功能
day7有作业,减少购物车。
发现xml里有些parameterType和resultType爆红。两篇文章给了解决方案。大概是说不要紧,不管咯。
IDEA mapper下面的xml 关于parameterType爆红的爆红的原因,以及理解?_parametertype后面参数为什么爆红-CSDN博客
day8跳过微信支付,视频的“订单支付”内容都能跳过。因为配置文件个人身份弄不了,不必浪费时间。
整个微信支付的流程讲的还是蛮好的,有时间可以听听。
day8-10代码需调整。解决方案见此处引用文章,本文中称其引文1。
苍穹外卖学习-day08-day10(跳过微信支付,订单取消,来电提醒问题解决)_学习_跳动的梦想家h-2048 AI社区
引文1提到修改小程序代码。我文件中是在245行左右。直接ctrl+f搜就行。
uni.redirectTo({url: '/pages/success/index?orderId=' + _this.orderId });
还是转载一下吧。。
day08-跳过微信支付
由于微信支付需要商家认证才能开通,个人开发者只能模拟支付的流程,完成后续项目的学习。
方法:
1.修改 orderServiceImpl下的payment方法
注释原有调用微信支付接口的代码,生成空JSON替换原接口生成预支付交易单
直接替换下面代码:
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 // ); //生成空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")); /* // 模拟支付成功,更新数据库订单状态 // 根据订单id更新订单的状态、支付方式、支付状态、结账时间 // 根据订单号查询订单 Orders ordersDB = orderMapper.getByNumberAndUserId(ordersPaymentDTO.getOrderNumber(), userId); Orders orders = Orders.builder() .id(ordersDB.getId()) .status(Orders.TO_BE_CONFIRMED) .payStatus(Orders.PAID) .checkoutTime(LocalDateTime.now()) .build(); orderMapper.update(orders);*/ return vo; }
2.修改OrderController
调用orderService.paySuccess方法,传入订单号ordersPaymentDTO.getOrderNumber(),直接更新数据库订单状态,模拟支付成功
直接替换下面代码:
@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); }
3.修改微信小程序代码
修改 pages.pay.index.js 文件
打开index.js文件,在大概245行左右地方修改,把这句代码打开。
uni.redirectTo({url: '/pages/success/index?orderId=' + _this.orderId });
day9-取消订单
注释掉微信支付退款接口即可。
订单搜索代码得看明白!百度地址没做。
1.用户端
订单处于待接单状态下取消,需要进行退款,由于前面模拟微信支付,直接调用了支付成功的接口,实际上并未支付,此时用户端取消订单,需要跳过微信支付退款接口,直接修改数据库订单状态,直接替换下面代码(OrderControllerImpl中):
/**
* 用户取消订单
* @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)) {
//调用微信支付退款接口
// weChatPayUtil.refund(
// ordersDB.getNumber(), //商户订单号
// ordersDB.getNumber(), //商户退款单号
// new BigDecimal(0.01),//退款金额,单位 元
// new BigDecimal(0.01));//原订单金额
//支付状态修改为 退款
orders.setPayStatus(Orders.REFUND);
}
// 更新订单状态、取消原因、取消时间
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("用户取消");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
day10-5
生成cron表达式,演示用的网站没了,跟ai描述生成更方便。
day10-12
引文1中关于day10的部分需要修改。他使用了orderMapper.getByNumberAndUserId这个方法,视频中似乎有,但我的代码中没有。
还是用getByNumber方法查询订单就可以。
由于前面模拟微信支付,直接调用了支付成功的接口,所以可以直接跳过内网穿透工具配置和微信支付回调的相关配置:在yml文件中仅配置appid和secret即可,其余均可注释掉。
直接修改OrderServiceImpl中的paySuccess代码:
//UFUN调整后代码
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);
}
day10-12
最终测试时,若第一次确认支付后,无语音播报,则重新登录前端页面。我用的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);