苍穹外卖--sky-take-out(四)10-12

苍穹外卖--sky-take-out(一)

苍穹外卖--sky-take-out(一)-CSDN博客​编辑https://blog.csdn.net/kussm_/article/details/138614737?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/kussm_/article/details/138614737?spm=1001.2014.3001.5501

苍穹外卖--sky-take-out(二)

苍穹外卖--sky-take-out(二)3-5-CSDN博客​编辑https://blog.csdn.net/kussm_/article/details/139378730?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/kussm_/article/details/139378730?spm=1001.2014.3001.5501

苍穹外卖--sky-take-out(三) 

苍穹外卖--sky-take-out(三)6-9_@value("${sky.baidu.ak}")-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/kussm_/article/details/139396187?spm=1001.2014.3001.5501


Spring Task

是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。

定位:定时任务框架

作用:定时自动执行某段Java代码

cron表达式

cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间

构成规则:分为6或7个域,由空格分隔开,每个域代表一个含义

每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)

这些具体的细节,我们就不用自己去手写,因为这个cron表达式,它其实有在线生成器。

cron表达式在线生成器:在线Cron表达式生成器

入门案例

启动类添加注解 @EnableScheduling 开启任务调度

@Scheduled(cron = "0/5 * * * * ?")

订单状态定时处理

 


WebSocket

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。

HTTP协议和WebSocket协议对比:

  • HTTP是短连接
  • WebSocket是长连接
  • HTTP通信是单向的,基于请求响应模式
  • WebSocket支持双向通信
  • HTTP和WebSocket底层都是TCP连接

实现步骤

1). 直接使用websocket.html页面作为WebSocket客户端

2). 导入WebSocket的maven坐标

3). 导入WebSocket服务端组件WebSocketServer,用于和客户端通信

4). 导入配置类WebSocketConfiguration,注册WebSocket的服务端组件

5). 导入定时任务类WebSocketTask,定时向客户端推送数据

来单提醒

设计

通过WebSocket实现管理端页面和服务端保持长连接

调用WebSocket相关API实现服务端向客户端发送消息

判断消息类型选择消息提示播报音

约定发送给客户端的数据格式JSON

代码

解决跳过支付后的方法来单提醒

苍穹外卖-day10:Spring Task、订单状态定时处理、来单提醒(WebSocket的应用)、客户催单(WebSocket的应用)_java 订单消息提醒-CSDN博客

客户催单

设计

催单按钮


ApacheECharts

图表技术

营业统计

需求设计

  • 已完成的订单金额合计
  • 可视化报表,x轴日期,y轴营业额
  • 根据时间选择时间区间

接口设计

get

请求参数:开始和结束日期

返回数据:日期列表和营业额列表 //前端来定

代码开发

vo对象返回

用户统计

日期和用户总量

返会数据:日期列表,新增用户列表,总用户列表

代码开发

vo对象封装返回数据

controller

@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate bing

使用LocalDate类来接收,用@DateTimeFormat来定义日期的格式

调用service层的函数来统计

serviceimpl

//因为返回的是vo封端对象,所以依据vo对象来处理

//datelist

存放从bing到end之间的每天对应的日期

先定义list集合对象

list.add(begin)

使用while死循环来添加后一天,一直到==end

begin = begin.plusDays(1)//表示退后一天

list.add(begin)//加入这退后的一天

//newUserList存放每天的新增用户数量

查询用户表UserMapper

sql:select count(id) from user where createtime< ? 和 > ?

//totalUserList存放每天的总用户数量

sql:select count(id) from user where createtime < ?

遍历datelist来取到每一天的用户数量

对date进行处理,因为date是LocalTime类的对象,要变成LocalDateTime类才行

LocalDateTime.of(date,localTime.MIN)//min就是00.00,作为起始时间

LocalDateTime.of(date,localTime.max)//min就是23.59,作为结束时间

构建一个Map集合来传递给mapper层

Map map = new HashMap();

map.put(end,endTime)//传入截至时间

然后调用mapper层即可查询总用户数量

totalUser = userMapper.countByMap(map);

再传入开始时间,查询新增用户对象

最后对list的对象们转成String对象,封装进vo对象

利用StringUtils.join(list对象,",")//用逗号分割转换为String字符串

封装vo

使用.builder().build();

mapper(xml)

查询即可

订单统计

有效订单:状态为已完成的订单

三个数字:订单总数,有效订单,订单完成率

接口设计

返回结果:日期list,三个数字,总订单list,有效订单list

代码开发

vo封装接口返回数据

controller

请求路径:ordersStatistics

请求开始日期和结束日期

调用service层

serviceImpl

准备日期list

遍历日期list查询每天的有效订单数和订单总数

订单总数

select count(id) from orders where order_time > ? and order_time<?

获取开始时刻:将LocalDate对象转为LocalDateTime对象

LocalDateTime.of(date,localTime.MIN)

订单有效数

select count(id) from orders where order_time > ? and order_time<? and status =5;

创建新的方法来进行统计订单数量

创建map集合,传入开始时间,结束时间和状态封装进map,然后将map对象传给mapper层

创建list集合来存放订单数和有效订单数

计算时间区间内的订单总数

可以使用stream流来简化写法

//时间区间内的总订单数

Integer totalOrderCount = orderCountList.stream().reduce(Integer::sum).get();

计算完成率时:判断订单总数是否为0;

传数据给vo类封装;

mapperxml

动态查询

 


Apache POI

一般情况POI是处理操作Excel文件

读写操作

使用

写操作

  1. 导入maven坐标
  2. 创建Excel文件并且写入文件内容

//内存中创建

XSSFWorkbook excel = new XSSFWorkbook();

  1. 创建Sheet页

XSSFSheet sheet = excel.createSheet("Sheet1");

  1. 创建行,0代表第一行

XSSFRow row1 = sheet.createRow(0);

  1. 创建单元格并在单元格中设置值,单元格编号也是从0开始,1表示第2个单元格

row1.createCell(1).setCellValue("姓名");

  1. 内存写入到磁盘中去

需要用到字节流

FileOutputStream out = new FileOutputStream(new File("D:\\test.xlsx"));

//通过输出流将内存中的Excel文件写入到磁盘上

excel.write(out);

  1. 关闭资源

//关闭资源

out.flush();

out.close();

excel.close();

读操作

  1. 读取磁盘指定文件

FileInputStream in = new FileInputStream(new File("D:\\itcast.xlsx"));

//通过输入流读取指定的Excel文件

XSSFWorkbook excel = new XSSFWorkbook(in);

  1. 获取Excel表中的Sheet页

//获取Excel文件的第1个Sheet页

XSSFSheet sheet = excel.getSheetAt(0);

  1. 获取Sheet页中的最后一行的行号

int lastRowNum = sheet.getLastRowNum();

  1. 从0行开始遍历读取到最后一行

for (int i = 0; i <= lastRowNum; i++) {}

  1. 获取Sheet页中的行

XSSFRow titleRow = sheet.getRow(i);

  1. 获取行的第2个单元格

XSSFCell cell1 = titleRow.getCell(1);

  1. 获取单元格中的文本内容

String cellValue1 = cell1.getStringCellValue();

  1. 关闭资源

//关闭资源

in.close();

excel.close();

导出运营数据Excel表

需求分析

导出excel表

导出最近30天运营数据

GET

代码开发

  1. 设计Excel模板文件
  2. 查询近30天的运营数据
  3. 将查询到的运营数据写入模板文件
  4. 通过输入流将Excel文件下载到客户端浏览器

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

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

相关文章

Unity动画系统(2)

6.1 动画系统基础2-3_哔哩哔哩_bilibili p316 模型添加Animator组件 动画控制器 AnimatorController AnimatorController 可以通过代码控制动画速度 建立动画间的联系 bool值的设定 trigger p318 trigger点击的时候触发&#xff0c;如喊叫&#xff0c;开枪及换子弹等&#x…

错误 [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 python ping

报错提示&#xff1a;错误 [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 用python做了一个批量ping脚本&#xff0c;在windows专业版上没问题&#xff0c;但是到了windows服务器就出现这个报错 解决方法&#xff1a;右键 管理员身份运行 这个脚本 …

sql拉链表

1、定义&#xff1a;维护历史状态以及最新数据的一种表 2、使用场景 1、有一些表的数据量很大&#xff0c;比如一张用户表&#xff0c;大约1亿条记录&#xff0c;50个字段&#xff0c;这种表 2.表中的部分字段会被update更新操作&#xff0c;如用户联系方式&#xff0c;产品的…

在 WebGPU 与 Vulkan 之间做出正确的选择(Making the Right Choice between WebGPU vs Vulkan)

在 WebGPU 与 Vulkan 之间做出正确的选择&#xff08;Making the Right Choice between WebGPU vs Vulkan&#xff09; WebGPU 和 Vulkan 之间的主要区别WebGPU 是什么&#xff1f;它适合谁使用&#xff1f;Vulkan 是什么&#xff1f;它适合谁使用&#xff1f;WebGPU 和 Vulkan…

修改CentOS7 yum源

修改CentOS默认yum源为阿里镜像源 备份系统自带yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载ailiyun的yum源配置文件 CentOS7 yum源如下&#xff1a; wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun…

[OC]萝卜圈Python手动机器人脚本

这是给机器人设置的端口&#xff0c;对照用 代码 # #作者:溥哥’ ##机器人驱动主程序 #请在main中编写您自己的机器人驱动代码 import msvcrt def main():a"none"while True:key_input msvcrt.getch()akey_inputif abw:print(a)robot_drv.set_motors(1,40,2,40,3,…

uniapp学习笔记

uniapp官网地址&#xff1a;https://uniapp.dcloud.net.cn/ 学习源码&#xff1a;https://gitee.com/qingnian8/uniapp-ling_project.git 颜色网址&#xff1a;https://colordrop.io/ uniapp中如何获取导航中的路由信息&#xff1f; onLoad(e){console.log(e)console.log(e.w…

2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互

2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互 1 界面效果 在设定模式下&#xff0c;可以进行ROI 框的拖动&#xff0c;这里以Rect1举例说明 2 增加ROI类定义 /// <summary> /// ROI_single /// 用于描述图片感兴趣区域 /// type: 0:Rect1;1:Rect2;2:Circle ;3:…

工业路由器与家用路由器的区别

在现代网络环境中&#xff0c;路由器扮演着至关重要的角色。无论是在家庭网络还是在工业网络&#xff0c;选择合适的路由器都至关重要。本文将从多个角度&#xff0c;对工业路由器与家用路由器进行详细比较&#xff0c;帮助您更好地理解二者的区别。 1、安全性 工业路由器&…

大模型应用开发实战基础

大模型应用开发实战基础 1. 背景 大模型如日中天&#xff0c;各行各业都受它影响&#xff0c;但是作为程序员&#xff0c;除了让它翻译代码不知道用它干什么&#xff0c;就像是拿着锤子的木匠&#xff0c;找不到钉子在哪。一边听着别人说2024是AI元年&#xff0c;一边又不知所…

中控室监控台在水处理行业的作用

随着工业化和城市化的快速推进&#xff0c;水处理行业的重要性日益凸显。作为确保水质安全、提高水资源利用效率的关键环节&#xff0c;水处理厂需要高效、稳定地运行。在这个过程中&#xff0c;中控室监控台发挥着不可或缺的作用。本文将从以下几个方面&#xff0c;详细阐述中…

fyne的MultiLineEntry设置大小

MultiLineEntry设置大小 在另一篇文章讲过&#xff0c;放入border布局中&#xff0c;可以最大化MultiLineEntry。 这里再介绍另一种方法:SetMinRowsVisible() func (e *Entry) SetMinRowsVisible(count int) {e.multiLineRows counte.Refresh() }SetMinRowsVisible强制mult…

九浅一深Jemalloc5.3.0 -- ④浅*配置

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但最新版本5.3.0却少之又少。而且5.3.0的架构与5之前的版本有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析最新release版本Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是…

ShareSDK iOS端如何实现小红书分享

下载SDK 请登陆官网 &#xff0c;找到SDK下载&#xff0c;勾选需要的平台下载 导入SDK &#xff08;1&#xff09;离线导入将上述下载到的SDK&#xff0c;直接将整个SDK资源文件拖进项目里&#xff0c;如下图&#xff1a; 并且勾选以下3个选项 在点击Finish&#xff0c;…

JavaSE简易版扫雷小游戏

描述&#xff1a;用户输入二维雷区的高和宽&#xff0c;输入确定地雷数&#xff0c;随机在地雷区生成地雷。用户输入横竖坐标进行挖雷&#xff0c;挖到地雷游戏以失败结束&#xff0c;并让用户选择是否再次游戏&#xff1b;没挖到雷&#xff0c;显示该区域8个方向地雷数。如果8…

uniapp + vue3 + Script Setup 写法变动 (持续更新)

一、uniapp 应用生命周期&#xff1a; https://uniapp.dcloud.net.cn/tutorial/vue3-composition-api.html 注意&#xff1a; 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 二 、uniapp页面生命周期&#xff1a; https://uniapp.dcloud.net.cn/tutori…

Golang | Leetcode Golang题解之第212题单词搜索II

题目&#xff1a; 题解&#xff1a; type Trie struct {children map[byte]*Trieword string }func (t *Trie) Insert(word string) {node : tfor i : range word {ch : word[i]if node.children[ch] nil {node.children[ch] &Trie{children: map[byte]*Trie{}}}nod…

Zynq系列FPGA实现SDI视频编解码,基于GTX高速接口,提供5套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB图像缓存视频读取控制HDMI输出RGB转BT1120Gv8500 驱…

vuepress使用简介及个人博客搭建

目录 一、介绍二、环境准备三、安装运行vuepress四、目录结构五、配置文件六、导航栏配置七、导航栏logo八、浏览器图标九、侧边栏配置十、添加 Git 仓库和编辑链接十一、部署到GitHub十二、搭建成功 一、介绍 VuePress 是 Vuejs 官方提供的一个是Vue驱动的静态网站生成器&…

Qt 配置ASan

Qt 配置ASan 文章目录 Qt 配置ASan摘要关于ASan&#xff08;AddressSanitizer&#xff09;在Qt中配置 ASan1. 安装必要的工具2. 修改项目的 .pro 文件3. 重新构建项目4. 运行应用程序5. 分析错误报告示例注意事项 关键字&#xff1a; Qt、 ASan、 AddressSanitizer 、 GCC …