苍穹外卖--开发记录day09-10

news2024/11/23 16:53:06

目录

  • 苍穹外卖day09-10
    • 一:springtask
    • 二:订单状态定时处理
    • 三:websocket
    • 四:来单提醒
    • 五:客户催单
  • 总结

苍穹外卖day09-10

首先第九天是实战日,要完成以下内容的开发:

用户端历史订单模块:

  • 查询历史订单
  • 查询订单详情
  • 取消订单
  • 再来一单

商家端订单管理模块:

  • 订单搜索
  • 各个状态的订单数量统计
  • 查询订单详情
  • 接单
  • 拒单
  • 取消订单
  • 派送订单
  • 完成订单

这里面基本上是增删改查,而且资料里有答案;我就不过多赘述了

直接进入第十天:

一:springtask

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以去网站生成cron表达式Cron - 在线Cron表达式生成器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义任务类:在项目中再建一个软件包,然后定义一个类,类上要加上compont注解将类交给容器管理,然后定义一个方法。里面完成定时任务的逻辑,方法上要加上@Scheduled注解,里面指定cron表达式;

@Component
@Slf4j
public class Mytask {
    @Scheduled(cron = "0/5 * * * * ?")
    public void task(){
        log.info("定时任务已触发:{}",new Date());
    }
}

二:订单状态定时处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:超时未支付:

@Scheduled(cron = "0 0/1 * * * ?")
public void PENDING_PAYMENTtask(){
    log.info("定时任务已触发:{}",new Date());
    LocalDateTime localDateTime = LocalDateTime.now().plusMinutes(-15);

    List<Orders>orders= orderMapper.select(Long.valueOf(Orders.PENDING_PAYMENT),localDateTime);
    for (Orders order : orders) {
        order.setStatus(Orders.CANCELLED);
        order.setCancelReason("超时未支付");
        order.setCancelTime(LocalDateTime.now());
        orderMapper.update(order);
    }
}

我们每分钟去检查有没有超时的,具体的超时时间就是:下单时间超过15分钟,也就是当前时间-下单时间》15分钟:

我们sql是这么写的:

@Select("select * from orders where status=#{status} and order_time<#{orderTime}")
List<Orders> select(Long status, LocalDateTime orderTime);

所以我们要传入的是当前时间减去谁5分钟,而localDateTime有方法可以直接减去,那么我们获取到了超时订单,就要遍历然后修改状态让超时订单取消,取消的话另外还要给取消原因和取消时间赋值;最后调用update修改就行了

2:派送中处理:

@Scheduled(cron = "0 0 1 * * ?")
public void  DELIVERY_IN_PROGRESStask(){
    LocalDateTime localDateTime = LocalDateTime.now().plusHours(-1);
    List<Orders> orders = orderMapper.select(Long.valueOf(Orders.DELIVERY_IN_PROGRESS), localDateTime);
    for (Orders order : orders) {
        order.setStatus(Orders.COMPLETED);
        orderMapper.update(order);
    }

我们每天的凌晨一点去检查有没有派送中的订单,这里我们还是用我们定义的那个mapper方法:查询的状态是配送中,并且下单时间是昨天,也就是当前时间减一小时;然后遍历集合修改状态就行了;

三:websocket

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同于http,http只能由客户端主动发送消息,不能由服务器发送,被称为请求响应;而websocket是双向传输,只要建立链接只会,双方可以互发消息;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具体步骤:1:导入websocket依赖坐标:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

然后要导入服务端组件:

@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

    //存放会话对象
    private static Map<String, Session> sessionMap = new HashMap();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        System.out.println("客户端:" + sid + "建立连接");
        sessionMap.put(sid, session);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
        System.out.println("收到来自客户端:" + sid + "的信息:" + message);
    }

    /**
     * 连接关闭调用的方法
     *
     * @param sid
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        System.out.println("连接断开:" + sid);
        sessionMap.remove(sid);
    }

    /**
     * 群发
     *
     * @param message
     */
    public void sendToAllClient(String message) {
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                //服务器向客户端发送消息
                session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

@Component
@ServerEndpoint(“/ws/{sid}”)要有这两个注解,ServerEndpoint里是指定了建立连接的地址

还要导入一个配置类,用于注册websocket的组件

/**
 * WebSocket配置类,用于注册WebSocket的Bean
 */
@Configuration
public class WebSocketConfiguration {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

四:来单提醒

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们直接再用户支付成功后想管理端的前端发送消息,我们约定的消息是json格式的包含上述内容:

Map map=new HashMap<>();
map.put("type",1);
map.put("orderId",orders.getId());
map.put("content","订单号"+outTradeNo);
String jsonString = JSON.toJSONString(map);
webSocketServer.sendToAllClient(jsonString);

这里就是将我们要传入给前端的值存放在map中,然后将map转换为json格式;

五:客户催单

这里我们单独设置一个接口,因为是用户在点击催单后发送的请求,所以我们要单独设置接口:

controller:

@GetMapping("/reminder/{id}")
public Result reminder(@PathVariable Long id){
   Orders orders= orderService.reminder(id);
    return Result.success();
}

因为我们需要订单号所有我们还要去调用service

service:

@Override
public Orders reminder(Long id) {
    Orders orders = orderMapper.selectById(id);
    Map map=new HashMap<>();
    map.put("type",2);
    map.put("orderId",id);
    map.put("content","订单号"+orders.getNumber());
    String jsonString = JSON.toJSONString(map);
    webSocketServer.sendToAllClient(jsonString);
    return orders;
}

这里就是先查询信息,然后放入map中,再将map转成一个json字符串,然后再通过ws发送给前端;

总结

“orderId”,id);
map.put(“content”,“订单号”+orders.getNumber());
String jsonString = JSON.toJSONString(map);
webSocketServer.sendToAllClient(jsonString);
return orders;
}


> 这里就是先查询信息,然后放入map中,再将map转成一个json字符串,然后再通过ws发送给前端;



# 总结

今天学习了springtask的简单使用,用springtask来定义定时任务,然后学习了websocket的双向传输,了解了通过ws由服务器端向前端发送数据;完成了来单提醒,催单的功能;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python小游戏13——植物大战僵尸

代码 import random import time # 植物类 class Plant: def __init__(self, name, health): self.name name self.health health def is_alive(self): return self.health > 0 # 僵尸类 class Zombie: def __init__(self, name, health): self.name name self.health h…

eks节点的网络策略配置机制解析

参考链接 vpc-cni网络策略最佳实践&#xff0c;https://aws.github.io/aws-eks-best-practices/security/docs/network/#additional-resourcesvpc cni网络策略faq&#xff0c;https://github.com/aws/amazon-vpc-cni-k8s/blob/0703d03dec8afb8f83a7ff0c9d5eb5cc3363026e/docs/…

一致角色的视频且唇形同步中文配音和免费音效添加

现在AI可以免费生成不带水印、不限时长的视频了&#xff0c;并且视频里的角色可以进行唇形同步配音。最重要的是&#xff0c;我还会分享给大家&#xff0c;怎么生成角色一致的动画场景&#xff0c;怎么使用场景图片生成完整的视频&#xff0c;并且我还会介绍一款&#xff0c;我…

COSCon'24 志愿者招募令:共创开源新生活!

亲爱的开源爱好者们&#xff0c; 第九届中国开源年会&#xff08;COSCon24&#xff09;即将在北京中关村国家自主创新示范区会议中心于2024年11月2日至3日隆重举行。今年的主题是“Open Source, Open Life&#xff5c;开源新生活”&#xff0c;旨在探索开源技术如何在各个领域推…

高级 SQL 技巧全面教程:提升你的数据库操作能力

高级 SQL 技巧全面教程&#xff1a;提升你的数据库操作能力 引言 在数据驱动的时代&#xff0c;SQL&#xff08;结构化查询语言&#xff09;是与数据库交互的核心工具。虽然基础 SQL 语法足以满足日常需求&#xff0c;但掌握一些高级技巧能够显著提高你的工作效率和数据处理能…

C++基础:三个字符串也能搞大小?

上一篇说了三个整数比较大小&#xff0c;按照顺序输入的&#xff0c;这次我们看看字符串的&#xff0c;顺便把那个简化以下&#xff1a; 题目:这次输入三个字符串。如果用户输入“Stenbeck", “Hemingway”,“Fitzgerald”,输出将是“Fitzgerald&#xff0c;Hemingway&…

分页列表缓存

写这篇文章&#xff0c;我们聊聊分页列表缓存&#xff0c;希望能帮助大家提升缓存技术认知。 1 直接缓存分页列表结果 这是最简单易懂的方案&#xff0c;我们按照不同的分页条件查询出结果后&#xff0c;直接缓存分页结果 。 伪代码如下&#xff1a; public List<Product&…

Linux的makefile与进度条小程序实践

makefile make命令主要功能使用方法常用选项 makefile文件基本结构使用案例变量定义内置变量(即系统定义的确定变量)伪目标模式规则条件语句注释makefile中的常用函数 进度条小程序创建文件编辑.h文件编辑.c文件创建main函数makefile文件执行效果 make命令 在linux中&#xff…

如何用mmclassification训练多标签多分类数据

这里使用的源码版本是 mmclassification-0.25.0 训练数据标签文件格式如下&#xff0c;每行的空格前面是路径&#xff08;图像文件所在的绝对路径&#xff09;&#xff0c;后面是标签名&#xff0c;因为特殊要求这里我的每张图像都记录了三个标签每个标签用“,”分开&#xff0…

WORFBENCH:一个创新的评估基准,目的是全面测试大型语言模型在生成复杂工作流 方面的性能。

2024-10-10,由浙江大学和阿里巴巴集团联合创建的WORFBENCH&#xff0c;一个用于评估大型语言模型&#xff08;LLMs&#xff09;生成工作流能力的基准测试。它包含了一系列的测试和评估协议&#xff0c;用于量化和分析LLMs在处理复杂任务时分解问题和规划执行步骤的能力。WORFBE…

【Super-resolved q-space learning of diffusion MRI】

扩散MRI的超分辨q-空间学习 摘要&#xff1a; 背景&#xff1a;扩散磁共振成像 (dMRI) 提供了一种强大的工具&#xff0c;可以无创地研究活人大脑中的神经结构。然而&#xff0c;它对神经结构的重建性能依赖于 q 空间中扩散梯度的数量。高角度&#xff08;HA&#xff09;dMRI…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十七章 Trusted Firmware-A 移植

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

(二十三)Java反射

1.反射概念 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问&#xff0c;通俗理解就是允许从类里面拿东西&#xff0c;用途有提示词等&#xff0c;如下所示都是通过反射实现的 所以&#xff0c;学习反射就是学习从字节码class文件中获取成员信息并且对其…

流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(一)

闲着没事做&#xff0c;记录一下开发项目用过的协议&#xff0c;项目中&#xff0c;大多是是实时显示播放的&#xff0c;通过私有协议&#xff0c;传输到上位机&#xff0c;实时播放&#xff0c;延时小于200ms&#xff0c;仿照这些协议&#xff0c;定义的数据格式。如果用这些协…

C语言实现Go的defer功能

之前笔者写了一篇博文C实现Go的defer功能&#xff0c;介绍了如何在C语言中实现Go的defer功能&#xff0c;那在C语言中是否也可以实现这样的功能呢&#xff1f;本文就将介绍一下如何在C语言中实现Go的defer功能。 我们还是使用C实现Go的defer功能中的示例&#xff1a; void te…

一文彻底理解 JavaScript 解构赋值

一、基本概念 为什么需要解构呢&#xff0c;先来看一个例子&#xff1a; const student {name: ZhangSan,age: 18,scores: {math: 19,english: 85,chinese: 100} };function displayInfo(student) {console.log(name:, student.name);console.log(math:, student.scores.mat…

排序(二)快速排序的多种实现方法

目录 一.快速排序 1.左右指针法 2.挖坑法 3.前后指针法 4.非递归实现 5.快速排序特性总结 二.整体代码 1.Sort.h 2.Sort.c 3.Stack.h 4.Stack.c 5.test.c 一.快速排序 1.左右指针法 我们找到一个key,begin去找比key大的值,end去找比key小的值,找到了就将begin和end…

从头学PHP之运算符

关于运算符的图片均来自网络&#xff0c;主要是自己写太麻烦了&#xff0c;程序是个简化自己工作量的方式&#xff0c;能复制粘贴就不要手写了&#xff08;建议初期还是多写写&#xff0c;加深下记忆&#xff09;在这里我就偷个懒&#xff0c;图片涉及到侵权及时&#xff0c;请…

阻塞队列——Java

一、前言 阻塞队列也是队列的一种&#xff0c;但是带有阻塞性质。但是这种阻塞情况是极端情况&#xff0c;在生产、消费者模型中&#xff0c;当生产者与消费者不协调时&#xff0c;就会出现阻塞情况。 二、特性 线程安全 阻塞特性 若队列为空&#xff0c;当尝试出队列时&am…

深度解析跨境支付之跨境支付与国内支付对比

跨境支付和国内支付的不同点主要体现在5个方面&#xff1a; 1.交易币种不同 这一点其实有两层含义 第一层含义是二者的支付行为的交易币种不同&#xff0c;国内支付基本是人民币但是跨境支付可以是人民币也可以是外币&#xff0c;具体交易币种要取决于收款方要求的交易币种。…