苍穹外卖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博客

【编程问题】解决 mapper.xml 文件的 resultType 爆红问题:Cannot resolve symbol ‘xxx‘_result type not match for select id=-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);