项目中集成ECharts图表(通过定时任务SpringTask统计每天的订单金额)

项目应用Echarts

①、前端终端安装Echarts

npm install echarts --save
在这里插入图片描述

②、src/views创建order目录,在order目录下创建orderStatistics.vue
在这里插入图片描述

③、src/router/modules目录下创建order.js,配置路由

const layout = ()=>import('@/layout/index.vue')
const orderStatistics = ()=>import('@/views/order/orderStatistics.vue')export default[{path:'/order',component:Layout,name:'order',meta:{title:'订单管理',},icon:'Operation',children:[{path:'orderStatistics',name:'orderStatistics',component:orderStatistics,meta:{title:'订单统计',}}],},]

④、src/router/index.js中添加订单管理路由

import order from './mudules/order'//动态菜单
export const asyncRoutes = [...system,...product,...order]

在这里插入图片描述

⑤、页面

api/orderInfo.js

import request from '@/utils/request'const api_name = '/admin/order/orderInfo'//订单统计
export const GetOrderStatisticsData = searchObj => {return request({url:`${api_name}/getOrerStatisticsData`,method:'get',params:searchObj,})
}
<template><div ref="orderTotalAmountDiv" style="width:100%;height:100%"></div>
</template><script setup>import {ref,onMounted} from 'vue'import * as echarts from 'echarts'//导入Echart的图形报表组件//定义chart数据模型,用来选中div组件const orderTotalAmountDiv = ref()//需要在onMounted钩子函数对div区域使用echarts进行初始化onMounted(()=>{//基于准备好的dom,初始化echarts实例var orderTotalAmountChart = echarts.init(orderTotalAmountDiv.value);//绘制图表orderTotalAmountChart.setOption({title:{text:'订单数据统计'},tooltip:{},xAxis:{//data:['','','','','','']data:dateList},yAxis:{},series:[{name:'订单总金额(万元)',type:'bar',//data:[20,40,30,100,50,25]data:amountList,}]});})
</script>

⑥、统计每天的订单总金额

SELECT o.create_time,SUM(o.total_amount) AS totalAmount 
FROM order_info o 
GROUP BY DATA_FORMAT(o.o.create_time,'%Y-%m-%d')
ORDER BY DATA_FORMAT(o.o.create_time,'%Y-%m-%d')

在这里插入图片描述

每一次展示数据的时候都从订单数据库进行一次统计查询,如果数据量过大,分组查询受到性能影响
所以通过分组结果计算好,写入到一张统计结果表中进行优化
在这里插入图片描述

项目启动类添加注解@EnableScheduling开启定时任务

@Component
public class OrderStatisticsTask{@Autowiredprivate OrderInfoMapper orderInfoMapper;@Autowriedprivate OrderStatisticsMapper orderStatisticsMapper;//每天凌晨2点,查询前一天统计数据,把统计之后数据添加到统计结果表中@Scheduled(cron="0 0 2 * * ? ")public void orderToTalAmountStatistics(){//获取前一天的日期String createTime = DateUtil.offsetDay(new Date(),-1).toString(new SimpleDateFormat("yyyy-MM-dd"));//根据前一天的日期统计前一天的交易金额OrderStatistics orderStatistics = orderInfoMapper.selectOrderStatistics(createTime);if(orderStatistics!=null){orderStatisticsMapper.insert(orderStatistics);}}}
<select id="selectStatisticsByDate" resultType="com.xxx.order.OrderStatistics">SELECT DATE_FORMAT(o.create_time,'%Y-%m-%d'),SUM(o.total_amount) AS totalAmount,COUNT(o.id) AS totalNumFROM order_info oWHERE DATE_FORMAT(o.create_time,'%Y-m%-d%')=#{createDate}GROUP BY DATE_FORMAT(o.create_time,'%Y-m%-d%')
</select>

⑦、用ECharts图标展示

json数组格式——>对应java中的list集合
在这里插入图片描述

@RestController
@RequestMapping(value="/admin/order/orderInfo")
public class OrderInfoController{@Autowiredprivate OrderInfoService orderInfoService;@GetMapping("/getOrderStatisticsData")public Result<OrderStatisticsVo> getOrderStatisticsData(OrderStatisticsDto orderStatisticsDto){OrderStatisticsVo orderStatisticsVo = orderInfoService.getOrderStatisticsData(orderStatisticsDto);return Result.build(orderStatisticsVo,ResultCodeEnum.SUCCESS);}
}
@Service
public class OrderInfoServiceImpl implements OrderInfoService{@Autowiredprivate OrderStatisticsMapper orderStatisticsMapper;@Overridepublic OrderStatisticsVo getOrderStatisticsData(OrderStatisticsDto orderStatisticsDto){//根据dto条件查询统计结果数据,返回list集合List<OrderStatistics> orderStatisticsList = orderStatisticsMapper.selectList(orderStatisticsDto);//遍历list集合,得到所有日期,把所有日期封装list新集合里面(X轴)List<String> dateList = orderStatisticsList.stream().map(orderStatistics->DateUtil.format(orderStatistics.getOrderDate(),"yyyy-MM-dd")).collect(Collectors.toList());//遍历list集合,得到所有日期对应总金额,把所有日期封装list新集合里面List<BigDecimal> decimalList = orderStatisticsList.stream().map(OrderStatistics::getTotalAmount).collect(Collectors.toList());//将两个list集合封装到OrderStatisticsVo中OrderStatisticsVo orderStatisticsVo = new OrderStatisticsVo();orderStatisticsVo.setDateList(dateList);orderStatisticsVo.setAmountList(decimalList);return orderStatisticsVo;}
}
<select id="selectList" resultMap="orderStatisticsMap">select <include refid="columns">from order_statistics<where><if test="createTimeBegin != null and createTimeBegin=''">and order_date>=#{createTimeBegin}</if><if test="createTimeEnd != null and createTimeEnd != ''">and order_date &lt;= #{createTimeEnd}</if></where>order by order_date
</select>

=====================================================================

点击每个图表可以进入代码显示
在这里插入图片描述

引入echarts.min.js文件
在这里插入图片描述

<script>var myChart = echarts.init(document.getElementById("main"));var option = {//x轴是类目轴(离散数据),必须通过data设置类目数据xAxis:{type:'category',data:['Mon','Tue','Wed','Thu','Fri','Sat','Sun']},//y轴是数据轴(连续数据)yAxis:{type:'value'},//系列列表。每个系列通过type决定自己的图表类型series:[{//细娥中的数据内容数组data:[820,932,901,934,1290,1330,1320],//折线图type:'line'}]};myChart.setOption(option);
</script>

在这里插入图片描述

<script>var myChart = echarts.init(document.getElementById('main'));//指定图表的配置项和数据var option = {title:{text:'ECharts入门示例'},tooltip:{},legend:{data:['销量']},xAxis:{data:["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]},yAxis:{},series:[{name:'销量',type:'bar',data:[5,20,36,10,10,20]}]};myChart.setOption(option);
</script>

在这里插入图片描述

项目中集成ECharts

一、前端:npm install --save echarts@4.1.0

二、后端获取数据接口,每天的数量

SQL

select count(*) as count,reserve_date as reserveDate
from order_info
group by reserve_Date
order by reserve_date

mapper

public interface OrderMapper extends BaseMapper<OrderInfo>{//查询预约统计数据的方法List<OrderCountVo> selectOrderCount(@Param("vo") OrderCountQueryVo orderCountQueryVo);
}
<mapper namespace="com.michael.yygh.order.mapper.OrderMapper"><select id="selectOrderCount" resultType="com.michael.yygh.vo.order.OrderCountVo">SELECT COUNT(*) AS count,reserve_date AS reserveDate FROM order_info<where><if test="vo.hostname!=null and vo.hosname!=''">and hosname like CONCAT('%',#{vo.hosname},'%')</if><if test="vo.reserveDateBegin!=nul and vo.reserveDateBegin!=''">and reserve_date >= #{vo.reserveDateBegin}</if><if test="vo.reserveDateEnd != null and vo.reserveDateEnd!=''">and reserve_date &lt:=#{vo.reserveDateEnd}</if>and is_deleted=0</where>GROUP BY reserve_dateORDER BY reserve_date</select>
</mapper>

模块配置文件application.properties必须添加

mybatis-plus.mapper-locations=classpath:com/michael/yygh/order/mapper/xml/*.xml

依赖文件pom.xml中项目构建打包中必须包含xml

<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources>
</build>

Service接口以及实现类

//预约统计
@Override
public Map<String,Object> getCountMap(OrderCountQueryVo orderCountQueryVo){List<OrderCountVo> orderCountVoList = baseMapper.selectOrderCount(orderCountQueryVo);//获取X轴需要的日期List<String> dateList = orderCountVoList.stream().map(OrderCountVo::getReserveDate).collect(Collectors.toList());//获取y轴需要的数量List<Integer> countList = orderountVoList.stream().map(OrderCountVo::getCount).collect(Collectors.toList());Map<String,Object> map = new HashMap<>();map.put("dateList",dateList);map.put("countList",countList);return map;
}

Controller

@ApiOperation(value="获取订单统计数据")
@PostMapping("inner/getCountMap")
public Map<String,Object> getCountMap(@RequestBody OrderCountQueryVo orderCountQueryVo){return orderService.getCountMap(orderCountQueryVo);
}

远程模块的接口

@FeignClient(value="service-order")
@Repository
public interface OrderFeignClient{@PostMapping("inner/getCountMap")public Map<String,Object> getCountMap(@RequestBody OrderCountQueryVo orderCountVo);
}

统计模块对远程调用模块进行调用

@RestController
@RequestMapping("/admin/statistics")
public class StatisticsController{@Autowiredprivate OrderFeignClient orderFeignClient;//获取预约统计数据@GetMapping("getCountMap")public Result getCountMap(OrderCountQueryVo orderCountQueryVo){Map<String,Object> countMap = orderFeignClient.getCountMap(orderCountQueryVo);return Result.ok(countMap);}
}

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

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

相关文章

2022第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(题解解析)

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、九进制转十进制-&#xff08;解析&#xff09;-简单的进制转化问题&#x1f604; 2、顺子日期-&#xff08;解析&#xff09;-考察日期 3…

python应用之使用pdfplumber 解析pdf文件内容

目录标题 一. 通过 pdfplumber.open() 解析复杂PDF&#xff1a;1-2. 报错&#xff1a;V2 &#xff1a; 1-3. v3 使用tk 库&#xff0c;弹框选择文件运行环境准备完整代码保存运行测试步骤方式二&#xff1a;命令行方式&#xff08;适用于自动化&#xff09; 测试用例示例常见问…

力扣热题100刷题day61|234.回文链表(两种方法)

一、回文链表 234.回文链表 两种解法 解法1&#xff1a;时间复杂度O(n) 空间复杂度O(n) 遍历链表&#xff0c;计算链表长度&#xff0c;创建同样长度大小的数组&#xff0c;用数组存储链表中所有元素&#xff0c;之后双指针遍历链表&#xff0c;一个从头开始&#xff0c;一…

vue3+element-plus动态与静态表格数据渲染

一、表格组件&#xff1a; <template> <el-table ref"myTable" :data"tableData" :header-cell-style"headerCellStyle" header-row-class-name"my-table-header" cell-class-name"my-td-cell" :row-style"r…

Kafka 中的生产者分区策略

Kafka 中的 生产者分区策略 是决定消息如何分配到不同分区的机制。这个策略对 Kafka 的性能、负载均衡、消息顺序性等有重要影响。了解它对于高效地使用 Kafka 进行消息生产和消费至关重要。 让我们一起来看 Kafka 中 生产者的分区策略&#xff0c;它如何工作&#xff0c;以及…

《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第二篇:项目创建和初始化

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 《从零搭建Vue3项目实战》&#xff08;AI辅助…

全国产FMC子卡-16bit 8通道2.4G

国产化FMC DA子卡&#xff0c;16bit 8通道2.4GS/s 全国产FMC子卡是一款高分辨率、高采样率的全国产多通道标准双宽DAC FMC子板。其接口电气和结构设计均依据FMC标准(ANSI/VITA 57.1)&#xff0c;通过两个高密度FMC连接器&#xff08;HPC&#xff09;连接至FPGA载板。它提供8路A…

linux-添加开机自启动指定脚本

一、systemd 服务&#xff08;主流方法&#xff09; 适用于使用systemd的现代发行版&#xff08;Ubuntu 16.04/CentOS 7&#xff09; 创建服务文件 sudo nano /etc/systemd/system/your_script.service写入服务配置&#xff08;示例&#xff09;&#xff1a; [Unit] Descri…

Spring MVC 返回 JSON 视图的方式及对比(6种)

Spring MVC 返回 JSON 视图的方式及对比&#xff08;新增 MappingJackson2JsonView&#xff09; 1. 方式一&#xff1a;ResponseBody 注解 作用&#xff1a;直接返回对象&#xff0c;由消息转换器&#xff08;如 Jackson&#xff09;序列化为 JSON。 适用场景&#xff1a;简单…

瑞芯微RK3568嵌入式AI项目实战:智能家居项目(二)

RK3568智能家居项目实战指南&#xff1a;从入门到精通的完整制作流程 瑞芯微RK3568作为一款高性能嵌入式处理器&#xff0c;凭借其四核Cortex-A55架构、1T算力NPU和丰富的外设接口&#xff0c;成为智能家居项目开发的理想平台。下面我将推荐几个典型的RK3568智能家居项目&…

GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147049923 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…

Spring Boot 3.4.3 和 Spring Security 6.4.2 实现基于内存和 MySQL 的用户认证

在 Web 应用开发中&#xff0c;用户认证是保障系统安全的基础需求。Spring Boot 3.4.3 结合 Spring Security 6.4.2 提供了强大的安全框架支持&#xff0c;可以轻松实现基于内存或数据库的用户认证功能。本文将详细介绍如何在 Spring Boot 3.4.3 中集成 Spring Security 6.4.2&…

HOW - Axios 拦截器特性

目录 Axios 介绍拦截器特性1. 统一添加 Token&#xff08;请求拦截器&#xff09;2. 处理 401 未授权&#xff08;响应拦截器&#xff09;3. 统一处理错误信息&#xff08;响应拦截器&#xff09;4. 请求 Loading 状态管理5. 自动重试请求&#xff08;如 429 过载&#xff09;6…

JVM核心机制:类加载×字节码引擎×垃圾回收机制

&#x1f680;前言 “为什么你的Spring应用启动慢&#xff1f;为什么GC总是突然卡顿&#xff1f;答案藏在JVM的核心机制里&#xff01; 本文将用全流程图解字节码案例&#xff0c;带你穿透三大核心机制&#xff1a; 类加载&#xff1a;双亲委派如何防止恶意代码入侵&#xff…

coze生成流程图和思维导图工作流

需求&#xff1a;通过coze平台实现生成流程图和思维导图&#xff0c;要求支持文档上传 最终工作流如下&#xff1a; 入参&#xff1a; 整合用户需求文件内容的工作流&#xff1a;https://blog.csdn.net/YXWik/article/details/147040071 选择器分发&#xff0c;不同的类型走…

网络安全应急响应-文件痕迹排查

在Windows系统的网络安全应急响应中&#xff0c;文件痕迹排查是识别攻击行为的关键步骤。以下是针对敏感目录的详细排查指南及扩展建议&#xff1a; 1. 临时目录排查&#xff08;Temp/Tmp&#xff09; 路径示例&#xff1a; C:\Windows\TempC:\Users\<用户名>\AppData\L…

SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作

以下是 Spring Boot 集成 Redis 中 TypedTuple 和 DefaultTypedTuple 的详细使用说明&#xff0c;包含代码示例和场景说明&#xff1a; 1. 什么是 TypedTuple 和 DefaultTypedTuple&#xff1f; TypedTuple<T> 接口&#xff1a; 定义了 Redis 中有序集合&#xff08;ZSet…

递归实现组合型枚举(DFS)

从 1∼n 这 n 个整数中随机选出 m 个&#xff0c;输出所有可能的选择方案。 输入格式 两个整数 n,m,在同一行用空格隔开。 输出格式 按照从小到大的顺序输出所有方案&#xff0c;每行 1 个。 首先&#xff0c;同一行内的数升序排列&#xff0c;相邻两个数用一个空格隔开。…

CentOS 7 镜像源失效解决方案(2025年)

执行 yum update 报错&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirror…

vue3 脚手架初始化项目生成文件的介绍

文章目录 一、介绍二、举例说明1.src/http/index.js2.src/router/index.js3.src/router/routes.js4.src/stores/index.js5.src/App.vue6.src/main.js7.babel.config.js8.jsconfig.json9.vue.config.js10. .env11.src/mock/index.js12.src/mock/mock-i18n.js13.src/locales/en.j…