苍穹外卖项目---------收获以及改进(9-12)

①Spring Task-------实现系统定时任务

概念: 

 应用场景:

使用步骤:

实现订单超时和前一天派送中的订单的自动任务处理:

@Component
@Slf4j
public class Mytask {

    @Autowired
    private OrderServiceimpl orderServiceimpl;

    /**
     * 处理订单超时的任务
     */
    @Scheduled(cron = "0 * * * * ?")//每分钟触发一次
    public void processTimeoutOrder(){
        log.info("定时处理超时订单,{}", LocalDateTime.now());

        //先去数据库中查是否有超时的订单
        List<Orders> ordersList = orderServiceimpl.query()
                .eq("status", 1)
                .lt("order_time", LocalDateTime.now().plusMinutes(-15))
                .list();

        //如果有
        if(ordersList != null && ordersList.size() > 0){
            for (Orders orders : ordersList) {
                //设置订单的取消
                orders.setStatus(6);
                orders.setCancelReason("订单超时取消");
                orders.setCancelTime(LocalDateTime.now());
                //更新数据库
                orderServiceimpl.updateById(orders);
            }
        }
    }


    /**
     * 处理一直处于派送中状态的订单
     */
    @Scheduled(cron = "0 0 1 * * ?")//每天凌晨1点执行一次
    public void processDeliveryOrder(){
        log.info("处理一直处于派送中状态的订单,{}", LocalDateTime.now());

        //先去数据库中查是否有前一天还在派送的订单
        List<Orders> ordersList = orderServiceimpl.query()
                .eq("status", 4)
                .lt("order_time", LocalDateTime.now().plusMinutes(-60))
                .list();

        //如果有
        if(ordersList != null && ordersList.size() > 0){
            for (Orders orders : ordersList) {
                //设置订单的取消
                orders.setStatus(5);
                //更新数据库
                orderServiceimpl.updateById(orders);
            }
        }
    }
}

②WebSocket-------实现前后端无请求的数据交互

概念:

 应用场景:

使用步骤:

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

实现前后端之间长连接的消息互传:

WebSocketServer类:
/**
 * WebSocket服务
 */
@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();
            }
        }
    }

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

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

}
 前端的实例代码:
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Demo</title>
</head>
<body>
    <input id="text" type="text" />
    <button onclick="send()">发送消息</button>
    <button onclick="closeWebSocket()">关闭连接</button>
    <div id="message">
    </div>
</body>
<script type="text/javascript">
    var websocket = null;
    var clientId = Math.random().toString(36).substr(2);

    //判断当前浏览器是否支持WebSocket
    if('WebSocket' in window){
        //连接WebSocket节点
        websocket = new WebSocket("ws://localhost:8080/ws/"+clientId);
    }
    else{
        alert('Not support websocket')
    }

    //连接发生错误的回调方法
    websocket.onerror = function(){
        setMessageInnerHTML("error");
    };

    //连接成功建立的回调方法
    websocket.onopen = function(){
        setMessageInnerHTML("连接成功");
    }

    //接收到消息的回调方法
    websocket.onmessage = function(event){
        setMessageInnerHTML(event.data);
    }

    //连接关闭的回调方法
    websocket.onclose = function(){
        setMessageInnerHTML("close");
    }

    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function(){
        websocket.close();
    }

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML){
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    //发送消息
    function send(){
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
	
	//关闭连接
    function closeWebSocket() {
        websocket.close();
    }
</script>
</html>

③Apache POI

第一步:引入依赖

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>

第二步:创建并且写入数据

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Springtest {

    public static void write() throws Exception {
        //在内存中创建一个Excel文件
        XSSFWorkbook excel = new XSSFWorkbook();

        //在Excel中创建一个sheet页
        XSSFSheet sheet = excel.createSheet("info");

        //在sheet页中创建行对象
        XSSFRow row = sheet.createRow(1);

        //在行上创建单元格,并且写入内容
        row.createCell(1).setCellValue("姓名");
        row.createCell(2).setCellValue("城市");


        List<String> name = new ArrayList<>();
        name.add("张三");name.add("李四");name.add("王五");
        List<String> city = new ArrayList<>();
        city.add("长沙");city.add("武汉");city.add("广州");
        for(int i=2;i<5;i++){
            row = sheet.createRow(i);
            row.createCell(1).setCellValue(name.get(i - 2));
            row.createCell(2).setCellValue(city.get(i - 2));
        }

        //输出流将内存中的Excel文件写入磁盘
        FileOutputStream fileOutputStream = new FileOutputStream(new File("F:\\info.xlsx"));
        excel.write(fileOutputStream);

        //关闭资源
        fileOutputStream.close();
        excel.close();
    }


    @Test
    public void test() throws Exception {
        write();
    }
}

第三步:读取Excel文件并且读入

public static void read() throws Exception {
        //读取磁盘上已经存在的Excel文件
        FileInputStream fileInputStream = new FileInputStream(new File("F:\\info.xlsx"));
        XSSFWorkbook excel = new XSSFWorkbook(fileInputStream);

        //获取Excel中的sheet页
        XSSFSheet sheet = excel.getSheet("info");

        //获取Sheet中的数据的最后一行的行号
        int lastRowNum = sheet.getLastRowNum();

        for(int i=1;i<=lastRowNum;i++){
            XSSFRow row = sheet.getRow(i);
            String stringCellValue1 = row.getCell(1).getStringCellValue();
            String stringCellValue2 = row.getCell(2).getStringCellValue();
            System.out.print("stringCellValue1 = " + stringCellValue1+"  ");
            System.out.println("stringCellValue2 = " + stringCellValue2);
        }

        //关闭资源
        fileInputStream.close();
        excel.close();

    }

    @Test
    public void test01() throws Exception {
        read();
    }

OK!到此苍穹外面项目终于结束!!,学到了很多,继续加油!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

05-11 周六 一键完成FastBuild镜像部署功能的开发

05-11 周六 一键完成FastBuild镜像部署功能的开发 时间版本修改人描述2024年5月11日21:50:15V0.1宋全恒新建文档 简介 注&#xff0c;需要提前完成从DockerService到FastBuild主机的免密&#xff0c;因为脚本使用了ssh命令。 博客描述04-22 周日 阿里云-瑶光上部署FastBuild过…

最大子序列的分数

题目链接 最大子序列的分数 题目描述 注意点 n nums1.length nums2.length从nums1和nums2中选一个长度为k的子序列对应的下标对nums1中下标对应元素求和&#xff0c;乘以nums2中下标对应元素的最小值得到子序列的分数0 < nums1[i], nums2[j] < 1000001 < k < …

MVCC 详解

介绍 MVCC&#xff0c;全称 Multi-Version Concurrency Control&#xff0c;即多版本并发控制 MVCC的目的主要是为了提高数据库并发性能&#xff0c;用更好的方式去处理读-写冲突&#xff0c;做到即使有读写冲突时&#xff0c;也能做到不加锁。 这里的多版本指的是数据库中同时…

Django项目运行报错:ModuleNotFoundError: No module named ‘MySQLdb‘

解决方法&#xff1a; 在__init__.py文件下&#xff0c;新增下面这段代码 import pymysql pymysql.install_as_MySQLdb() 注意&#xff1a;确保你的 python 有下载 pymysql 库&#xff0c;没有的话可以使用 pip install pymysql安装 原理&#xff1a;用pymysql来代替mysqlL…

Mysql数据库的基础学习

为什么使用数据库&#xff1f; 1.持久化&#xff1a;将数据保存到可掉电式存储设备中以供使用。 数据库相关概念&#xff1a; DB:数据库&#xff08;Databass&#xff09;即存储数据的仓库&#xff0c;本质是一个文件系统&#xff0c;保存了一系列有组织的数据DBMS:数据库管…

【简单介绍下Sass】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

怎么使用远程桌面传输文件?

微软提供的远程桌面功能是一项强大的工具&#xff0c;可让您在同一网络下远程访问和管理其他计算机。除了远程控制&#xff0c;它还支持文件传输功能&#xff0c;为Windows用户提供了极大的便利。在接下来的内容中&#xff0c;我们将介绍如何使用远程桌面传输文件。 如何从远程…

求正方形中一角四边形的面积

求绿色四边形的面积&#xff1f; 假设大正方形的边长为2a 通过中间的点做十字的辅助线&#xff0c;假设两条辅助线的长度为xy,uv 所以 1/2ay1/2au42① 1/2ay1/2av38② 1/2ax1/2av28③ ①③ 1/2ay1/2au1/2ax1/2av4228 &#xff08;1/2ay1/2av&#xff09;1/2au1/2ax4228 代入…

SeetaFace6人脸特征提取与对比C++代码实现Demo

SeetaFace6包含人脸识别的基本能力&#xff1a;人脸检测、关键点定位、人脸识别&#xff0c;同时增加了活体检测、质量评估、年龄性别估计&#xff0c;并且顺应实际应用需求&#xff0c;开放口罩检测以及口罩佩戴场景下的人脸识别模型。 官网地址&#xff1a;https://github.co…

Hive Transaction事务表(含实现原理)

Hive Transaction事务表 在Hive中&#xff0c;事务表&#xff08;Transactional Tables&#xff09;允许用户执行事务性操作&#xff0c;包括ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性。事务表是在Hive 0.14版本引入的&#xff0c;并且在后续版本中不断…

conan2 基础入门(05)-(静态库动态库)(DebugRelease)

conan2 基础入门(05)-(静态库&动态库)(Debug&Release) 文章目录 conan2 基础入门(05)-(静态库&动态库)(Debug&Release)⭐准备预备文件和Code ⭐静态库&动态库静态库动态库 ⭐Debug&ReleaseReleaseDebug END视频教学settings.yml ⭐准备 本文均在windo…

以太ETH链市值机器人

在数字资产交易市场的浪潮中&#xff0c;如何高效地管理市值、提升交易流动性并保障资金安全&#xff0c;一直是交易所和项目方关注的焦点。市值管理机器人飞机//aishutuyu以太ETH链市值机器人凭借其卓越的功能和强大的安全保障&#xff0c;为数字资产交易市场带来了革命性的变…

GeoServer安装以及部署

GeoServer介绍 GeoServer是一个开源的服务器软件&#xff0c;用于共享和编辑地理空间数据。它支持多种地理空间数据格式&#xff0c;并且可以发布为多种服务格式&#xff0c;如Web Feature Service (WFS)、Web Map Service (WMS)、Web Coverage Service (WCS)&#xff0c;以及…

十天学会单片机可能吗?单片机入门需要多久?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 十天学“会”单片机&#xf…

前后端完全开源!功能丰富的在线教室项目:Agora Flat

Agora Flat&#xff1a;高效集成的在线教室解决方案&#xff0c;重塑互动学习新体验。- 精选真开源&#xff0c;释放新价值。 概览 Agora Flat是在GitHub平台上公开分享的一个全面开源项目&#xff0c;它精心设计为一个高性能的在线教室解决方案&#xff0c;旨在便捷地搭建支持…

Python装饰器带括号和不带括号的理解

装饰器是 Python 中一个强大且灵活的特性&#xff0c;允许用户在不修改原有函数或类定义的基础上&#xff0c;为其增加额外功能。 今天在尝试自定义 Python 装饰器的时候遇到了一个问题&#xff0c;因为以前一直是使用装饰器&#xff0c;基本没有自定义过装饰器&#xff0c;所…

KEIL declaration may not appear after executable statement in block

KEIL declaration may not appear after executable statement in block 这个问题也是比较经典&#xff0c;就是不允许你的变量定义位置不允许在下边的代码区域&#xff0c;只允许在最上方 ‍ 修改编码模式为C99解决 ‍ ​​

机器学习周报第41周

目录 摘要Abstract一、文献阅读1.1 摘要1.2 背景1.3 论文方法1.3.1 局部特征提取1.3.2 局部特征转换器 (LoFTR) 模块1.3.4 建立粗粒度匹配1.3.5 精细匹配 1.4 损失1.5 实现细节1.6 实验1.6.1 单应性估计1.6.2 相对位姿估计 二、论文代码总结 摘要 本周阅读了一篇特征匹配领域的…

Git团队协作机制

Git 团队协作机制 1.团队内协作 小故事&#xff1a;岳不群手里有华山剑法但是不完整&#xff0c;需要弟子令狐冲进行完善&#xff0c;岳不群将华山剑法推送&#xff08;push&#xff09;到代码托管中心&#xff0c;这样岳不群就有属于自己的远程库&#xff0c;令狐冲从远程库…

思通数科大模型在智能数据查询系统中的深度应用:销售数据分析的革新

在企业决策支持系统中&#xff0c;销售数据分析占据着举足轻重的地位。思通数科的大模型技术&#xff0c;结合自然语言处理&#xff08;NLP&#xff09;和机器学习&#xff0c;为智能数据查询系统提供了强大的分析能力。本文将详细描述思通数科大模型在销售数据分析中的应用&am…