首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《苍穹外卖Day9:大一菜鸟的代码升空纪实》

《苍穹外卖Day9:大一菜鸟的代码升空纪实》

作者头像
张哈大
发布2025-05-31 08:42:18
发布2025-05-31 08:42:18
2170
举报
文章被收录于专栏:RedisRedis

前言

昨天和前天分别完成了订单状态定时处理和来单提醒和催单提醒,用户端和管理端对于订单的增删改查的接口

1.任务报告

1.自己手写Day9老师布置的作业(订单的增删改查接口)

2.学习了Spring Task

3.利用Spring Task 来实现订单状态定时处理

4.学习了WebSocket

5.利用WebSocket完成了来单提醒和催单提醒

2.任务中的收获

2.1独立完成时出现的问题

1.订单传过来(前端传订单的id),那么我们是不是应该判断订单是否为空(是否存在),但是我没有判断,我认为既然都已经传id过来了那肯定订单是存在的确实是这样,因为只有购物车有东西才能下单,那么订单就不会为空,但是不排除数据库没有存值得情况),所以这里我没有考虑充分

2.用户取消订单时,我没有考虑订单的状态,就直接将订单设置为已取消状态,但是这个实现是要分情况考虑的,用户未付款可以直接取消,付款后必须让用户联系一下商家,并进行退款操作

3.用户再来一单时,我是将原来的订单复制一份然后修改其状态(待付款),下单时间,然后直接下单(存入数据库),但是我去美团上点击再来一单并不是这样的,而是会将原来的订单内商品重新加入购物车(只做了添加到购物车,没有直接下单),然后存入数据库

4.总结:一些细节还是没有考虑充分,一定要记得考虑为空的情况

2.2订单状态定时处理

1.思考:

1.用户下单但一直未付款,订单超时 2.一直处于派送中的订单,但是用户已经收到货(用户一直不点收到货)(这里注意:商家不能确保是否真派送成功,所以可以选择在打烊时/用户一般不点餐时来实现) 以上情况如果要我们手动完成这个,是不是过于麻烦,哪天不记得该怎么办,所以我们可以使用Spring Task来自动帮我们完成这个处理逻辑

2.分析:

1.对应用户超时订单,我们可以选择每分钟检查一次,有超时订单就修改 2.对应一直处于派送中的订单,我们可以选择每天凌晨一点来检查,有就修改

3.实现:

通过订单状态与下单时间为条件从数据库中读取数据 ==》通过数据循环获取单一的订单对象 ==》设置其状态和取消时间和原因 ==》重新存入数据库中

4.总结:对于一些我们需要定时处理某个代码逻辑时,我们可以使用Spring Task(在扩展中详细说明)

2.3来单提醒和催单提醒

1.思考

提醒我们需要怎么做,我们是不是需要保持商家和用户的持久性联系,而我们之前使用的是http协议,是短连接,不适合实现该功能,那么我们可以使用WebSocket来实现,它就是持久性连接

2.实现:

使用WebSocket来建立长连接 ==》用户支付完订单后调用后端接口 ==》后端调用方法实现服务端向客户端推送消息 ==》客户端解析(判断是来单还是催单) ==》进行对应的语音播报

3.注意:我们约定传输的数据格式为JSON,老师那里完成了支付功能的实现,而我们无法完成,所以后端调用方法时是与老师不相同的,老师是在支付实现代码中调用了web Socket,而我们可以在用户付款那里进行调用(之前我们设置了用户点击付款就直接完成了付款(跳过了付款这个步骤)),web Socket如何使用在扩展中详细说明

3.知识点的扩展

3.1Spring Task

1.介绍:Spring Task是由Spring提供的,可以用来定时去执行某些代码的逻辑

2.应用场景:信用卡还款,售票系统处理未支付订单

3.使用步骤:

1.导入坐标(由于是Spring提供,它已经在Spring依赖中) 2.启动类添加注解@EnableScheduling开启任务调度 3.自定义定时任务类中添加注解@Component(注入Spring容器中) 4.类中的方法来具体实现代码逻辑 5.类中的方法返回值必须为void ,方法名任意,并且在方法上加入注解@Scheduled,实现注解里面的属性

4.@Scheduled

具有写法 : @Scheduled(cron="填入cron表达式")

5.cron表达式:

1.简单来说就是你指定什么时候来执行这个代码的逻辑(每分钟执行一次这个代码) 2.它有6/7个域(秒,分,时,日,月,周,年),为什么是6或7?==》因为年是可以选的,可以选择不写 3.注意:日和周只能定义一个(一个存在,一个就必须不存在,用?表示),表达式中不同的符号表示不同的含义,而我们不需要掌握如何书写该表达式(问Ai),我们只需要会指定我们的需求就行

6.明确两个点:指定什么时候执行,具体执行的代码

3.2WebSocket

1.介绍:它是基于TCP的一种网络协议

2.WebSocket与HTTP协议的区别:

1.web Socket只需要一次握手就可以建立持久性的连接,并且支持双向传输数据 2.HTTP需要三次握手,四次挥手来建立短连接,它是请求响应模式(前端请求后端响应)(单向的) 3.它们都是基于TCP的一种网络协议

3.实现:

1.导入坐标

2.导入组件用于通信

3.在配置类中注册组件

4.实现自己的需求(向客户端发送消息)

4.怎么写组件:

1.定义一个类,添加注解@Component,@ServerEndpoint(和@RequestMapping一样写前端请求地址) 2.定义多个方法,添加注解@OnOpen,@OnMessage,@OnClose

5.注解的解释:

1.@OnOpen:添加了这个注解的方法会在客户端和服务端建立连接后调用 2.@OnMessage:添加了这个注解的方法是在服务端收到客户端消息后调用该方法(类似于Controller中的方法) 3.@OnClose:添加了这个注解的方法是在连接关闭后调用的方法

6.群发功能:

原理:在连接成功后调用一个方法存入客户端传来的标识

那么等我们需要群发时可以直接调用sendToAllClient实现群发

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1.任务报告
  • 2.任务中的收获
    • 2.1独立完成时出现的问题
    • 2.2订单状态定时处理
    • 2.3来单提醒和催单提醒
  • 3.知识点的扩展
    • 3.1Spring Task
    • 3.2WebSocket
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档