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

时间:2024-07-06 21:46:35

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

苍穹外卖--sky-take-out(一)-****博客​编辑https://blog.****.net/kussm_/article/details/138614737?spm=1001.2014.3001.5501https://blog.****.net/kussm_/article/details/138614737?spm=1001.2014.3001.5501

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

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

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

苍穹外卖--sky-take-out(三)6-9_@value("${sky.baidu.ak}")-****博客https://blog.****.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 订单消息提醒-****博客

客户催单

设计

催单按钮


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文件下载到客户端浏览器