在Ruoyi中采用Ajax动态生成Echarts图表实践
前言
在之前博文中,我们讲解了如何使用java在后台进行Echarts的图表生成组件,博文如下:
| 序号 | 博客连接 |
| 1 | 一款基于JAVA开发的Echarts后台生成框架 |
| 2 | Ruoyi单体项目与Echarts4.2.1地图集成时的思路及解决办法 |
| 3 | 解决Ruoyi单体版本集成Echarts多图表时在Tab模式下不展示问题 |
在之前的博客中,比较分散的介绍了Echarts图表的生成。但是在生成图表时,数据源信息基本上都是提前设定好的,相当与静态数据。针对于动态数据接入的场景,比如需要通过ajax动态获取后台的数据,然后将数据设置到前端的图表组件中。本文将以Ruoyi框架为例,深入讲解基于Ajax技术,实现数据的动态接入,让读者了解如何进行数据的动态接入代码实战开发。
一、Maven依赖定义
演示项目采用Maven依赖的方式定义,在这里需要引入Echarts的Java后台生成组件和Gson包,Gson是用于生成echarts组件的依赖包,请确保添加。
<!-- 增加Echarts java统一处理类 -->
<dependency><groupId>com.github.abel533</groupId><artifactId>ECharts</artifactId><version>3.0.0</version>
</dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.6.2</version>
</dependency>
二、数据模拟生成
为了演示简单,这里仅使用Java模拟数据查询的方式进行数据构造。实际情况下,需要根据到数据库中查询实际的数据。本例子中演示的场景为查询上个月某部门的短信发送量信息。
这里分两个函数实现,第一个函数是生成上个月每一天的时间戳,方便在Echarts图表中进行展示。方法如下,这里需要注意的是上个月采用日历类-1获得:
private List<String> getEveryDayOfMonth() {List<String> result = new ArrayList<String>();//获取CalendarCalendar calendar=Calendar.getInstance();calendar.set(Calendar.DAY_OF_MONTH, 1);calendar.add(Calendar.MONTH, -1);//获取上个月Date startDate = calendar.getTime();//设置日期为本月最大日期calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));Date endDate = calendar.getTime();while(startDate.getTime() <= endDate.getTime()){String dayStr = DateUtils.parseDateToStr("yyyy-MM-dd", startDate);result.add(dayStr);calendar.setTime(startDate);calendar.add(Calendar.DATE,1);Date tempDate = calendar.getTime();startDate = tempDate;}return result;}
在此基础上,我们进行月份内,每天的信息发送数据模拟,生成Echarts对象。
public String buildOrgzSendSmsCount(String orgzName) {String result = "";List<String> dateList = this.getEveryDayOfMonth();GsonOption option = new GsonOption();option.title().text("【" + orgzName + "】上月短信统计(单位:条)");option.tooltip().trigger(Trigger.axis);option.legend("短信发送量");option.legend().y(Y.bottom).padding(0);option.toolbox().show(true).feature(new MagicType(Magic.line, Magic.bar).show(true), Tool.saveAsImage);option.calculable(true);List<String> months = new ArrayList<String>();List<Integer> sendCounts = new ArrayList<Integer>();Random random = new Random();for (String date : dateList) {months.add(date);sendCounts.add(random.nextInt(100));}CategoryAxis categoreAxis = new CategoryAxis();categoreAxis.data(months.toArray()).axisLabel().interval(0).rotate(30);option.xAxis(categoreAxis);option.yAxis(new ValueAxis());Bar bar = new Bar("短信发送量");bar.data(sendCounts.toArray());bar.markPoint().data(new PointData().type(MarkType.max).name("最大值"), new PointData().type(MarkType.min).name("最小值"));bar.markLine().data(new PointData().type(MarkType.average).name("平均值"));option.series(bar);result = option.toString();return result;}
三、后台接口调用
后台采用开放接口形式对外提供调用,为了演示方便,不加入过多的参数,实际情况根据需要传递相关参数即可,这里需要注意的是,在使用AjaxResult对象进行输出的时候,返回的json参数使用data进行携带。
@PostMapping("/echarts/getmsgsendchart")
@ResponseBody
public AjaxResult msgSendChart(){String charts = echartService.buildOrgzSendSmsCount("信息技术部");AjaxResult result = AjaxResult.success();result.put("data", charts);return result;
}
四、Html5网页定义
在html页面中采用如下的代码进行短信发送量图表对象的定义,关键代码如下,注意这里的图表高度直接设定为200px:
<div id="tab-4" class="tab-pane"><div class="panel-body"><div class="row"><div class="col-sm-12"><div class="ibox float-e-margins"><div class="ibox-title"><h5>短信发送量</h5><div class="ibox-tools"><a class="collapse-link"><i class="fa fa-chevron-up"></i></a><a class="dropdown-toggle" data-toggle="dropdown" href="#"><i class="fa fa-wrench"></i></a><ul class="dropdown-menu dropdown-user"><li><a href="#">选项1</a></li><li><a href="#">选项2</a></li></ul><a class="close-link"><i class="fa fa-times"></i></a></div></div><div class="ibox-content"><div style="height:200px" id="echarts-msgsend-chart"></div></div></div></div></div></div></div>
五、Ajax数据初始化
采用Jquery+bootstrap进行图表初始化,
msgsendChart = echarts.init(document.getElementById("echarts-msgsend-chart"));
$(window).resize(msgsendChart.resize);
charts.push(msgsendChart);
initMsgSendChart();
function initMsgSendChart(){$.ajax({type: "POST",url: ctx + "/demo/report/echarts/getmsgsendchart",data: {},dataType : "json",success: function(serverdata){if(serverdata != ""){var serverJsonData = eval('('+serverdata.data+')');msgsendChart.setOption(serverJsonData,true);$(window).resize(msgsendChart.resize);}},error:function(data){parent.layer.alert('系统发生错误!', {icon: 5});}});
}
以上代码需要注意的是,var serverJsonData = eval('('+serverdata.data+')');这里使用eval函数进行参数转换,同时需要注意的是,serverdata.data;后面的data即是之前提到过的后台返回AjaxResult中的key。
六、图表展示及过程分析

模拟短信发送量统计柱状图页面展示效果。

来看下具体的接口请求情况:

{"msg":"操作成功","code":0,"data":"{\"calculable\": true,\"title\": {\"text\": \"【信息技术部】上月短信统计(单位:条)\"},\"toolbox\": {\"feature\": {\"magicType\": {\"show\": true,\"title\": {\"bar\": \"柱形图切换\",\"stack\": \"堆积\",\"tiled\": \"平铺\",\"line\": \"折线图切换\"},\"type\": [\"line\",\"bar\"]},\"saveAsImage\": {\"show\": true,\"title\": \"保存为图片\",\"type\": \"png\",\"lang\": [\"点击保存\"]}},\"show\": true},\"tooltip\": {\"trigger\": \"axis\"},\"legend\": {\"data\": [\"短信发送量\"],\"y\": \"bottom\",\"padding\": 0},\"xAxis\": [{\"type\": \"category\",\"axisLabel\": {\"interval\": 0,\"rotate\": 30},\"data\": [\"2023-07-01\",\"2023-07-02\",\"2023-07-03\",\"2023-07-04\",\"2023-07-05\",\"2023-07-06\",\"2023-07-07\",\"2023-07-08\",\"2023-07-09\",\"2023-07-10\",\"2023-07-11\",\"2023-07-12\",\"2023-07-13\",\"2023-07-14\",\"2023-07-15\",\"2023-07-16\",\"2023-07-17\",\"2023-07-18\",\"2023-07-19\",\"2023-07-20\",\"2023-07-21\",\"2023-07-22\",\"2023-07-23\",\"2023-07-24\",\"2023-07-25\",\"2023-07-26\",\"2023-07-27\",\"2023-07-28\",\"2023-07-29\",\"2023-07-30\",\"2023-07-31\"]}],\"yAxis\": [{\"type\": \"value\"}],\"series\": [{\"name\": \"短信发送量\",\"type\": \"bar\",\"markPoint\": {\"data\": [{\"name\": \"最大值\",\"type\": \"max\"},{\"name\": \"最小值\",\"type\": \"min\"}]},\"markLine\": {\"data\": [{\"name\": \"平均值\",\"type\": \"average\"}]},\"data\": [60,87,89,81,69,65,89,45,1,29,25,27,24,79,50,23,20,8,60,72,31,61,7,10,57,5,65,74,64,29,4]}]}"}
总结
以上就是本文的主要内容,本文将以Ruoyi框架为例,深入讲解基于Ajax技术,实现数据的动态接入,让读者了解如何进行数据的动态接入代码实战开发。行文仓促,难免有许多问题,欢迎朋友们批评指正。
相关文章:
在Ruoyi中采用Ajax动态生成Echarts图表实践
前言 在之前博文中,我们讲解了如何使用java在后台进行Echarts的图表生成组件,博文如下: 序号 博客连接1一款基于JAVA开发的Echarts后台生成框架2Ruoyi单体项目与Echarts4.2.1地图集成时的思路及解决办法3解决Ruoyi单体版本集成Echarts多图表时…...
资讯速递 | ArkUI-X 预览版已正式开源!
OpenHarmony项目群技术指导委员会(以下简称“TSC”)-跨平台应用开发框架TSG所孵化项目 —— ArkUI-X,近期已正式开源 ,开发者基于一套主代码,就可以将在OpenHarmony上开发的精美、高性能应用同时运行在Android、iOS等其…...
HTML <select> 标签
实例 创建带有 4 个选项的选择列表: <select><option value ="volvo">Volvo</option><option value ="saab">Saab</option><option value="opel">Opel</option><option value="audi"…...
Flutter:文件上传与下载(下载后预览)
Dio dio是一个强大的Dart Http请求库,提供了丰富的功能和易于使用的API,支持文件上传和下载。 这个就不介绍了,网上有很多的封装案例。 background_downloader 简介 适用于iOS,Android,MacOS,Windows和L…...
[前端系列第6弹]Ajax简明教程:轻松实现Web页面的异步交互
在这篇文章中,我将介绍Ajax的基本概念、原理、优缺点、实现方法和应用场景,以及如何使用它来实现Web页面的异步交互。还将给一些简单而实用的例子,让你可以跟着我一步一步地编写自己的Ajax代码。 目录 一、什么是Ajax 二、如何使用Ajax &a…...
ssh-keygen 做好免密登录后不生效
免密说明 通常情况下,我们ssh到其他服务器需要知道服务器的用户名和密码。对于需要经常登录的服务器每次都输入密码比较麻烦,因此我们可以在两台服务器上做免密登录,即在A服务器可以免密登录B服务器。 在A服务器上登录B服务器时,…...
【Java可执行命令】(十八)可视化监控和管理工具 jconsole:获取 JVM的内存使用情况、线程活动、GC 行为等重要指标的可视化工具 ~
Java可执行命令之jconsole 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 注意事项 4️⃣ 应用场景🌾 总结 1️⃣ 概念 jconsole 是 Java Development Kit (JDK) 自带的一款图形化监控和管理工具。它旨在提供一个简单而强大的界面,用于监视和管…...
leetcode做题笔记66
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 思路一:模拟题意 int* plusOne(i…...
【docker】设置 docker 国内镜像报错,解决方案
一、报错: [rootlocalhost ~]# systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.二、原因…...
mac安装nvm管理工具遇到的问题和解决方法
nvm 是一款可以管理多版本node的工具,因为是刚买没多久的电脑之前用的都是windows,昨天折腾了一下午终于倒腾好了 第一步: 卸载电脑已有的node;访问nvm脚本网址,另存为到电脑上任何目录,我是放在桌面上的…...
DocX 生成Word
当然,这里是一个使用DocX库在.NET Core中操作Word文档的简单示例: 首先,确保你在项目中安装了DocX库。你可以在NuGet包管理器中搜索并安装DocX。 然后,使用以下代码来创建一个简单的Word文档并添加一些内容: using …...
数据库新闻速递 -- POSTGRESQL 正在蚕食数据库市场 (翻译)
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加 liuaustin3微信号 ,在新加的朋友会分到3群ÿ…...
PAT 1085 Perfect Sequence
个人学习记录,代码难免不尽人意 Sample Input: 10 8 2 3 20 4 5 1 6 7 8 9 Sample Output: 8 #include<cstdio> #include<iostream> #include<vector> #include<algorithm> #include<string> #include<map> #include<cmath&…...
软件测试面试夺命连环十七问,你答得上来么?这都不会建议多学!
1. 给你一个网站,该如何测试?(探究需求制订计划) 首先,查找需求说明、网站设计等相关文档,分析测试需求。 制定测试计划,确定测试范围和测试策略,一般包括以下几个部分:…...
【学习FreeRTOS】第5章——FreeRTOS任务挂起与恢复
1.任务的挂起与恢复的API函数 vTaskSuspend() ——挂起任务(类似暂停,可恢复,但删除任务,无法恢复)vTaskResume() ——恢复被挂起的任务xTaskResumeFromISR()—— 在中断中恢复被挂起的任务 1.1.任务挂起函数vTaskSu…...
gitblit-使用
1.登入GitBlit服务器 默认用户和密码: admin/admin 2.创建一个新的版本库 点击图中的“版本库”,然后点击图中“创建版本库” 填写名称和描述,注意名称最后一定要加 .git选择限制查看、克隆和推送勾选“加入README”和“加入.gitignore文件”在图中的1处…...
整数中1出现的次数(从1到n整数中1出现的次数)
解题思路1: 设定整数点(如1、10、100等等)作为位置点i(对应n的各位、十位、百位等等),分别对每个数位上有多少包含1的点进行分析。 第一步:对n进行分割,分为两部分:高位…...
Vue2:路由
Vue2:路由 Date: May 28, 2023 Sum: vue-router基本使用、高级用法 单页面应用程序 概念:SPA【Single Page Application】是指所有的功能都在一个html页面上实现 案例: 单页应用网站: 网易云音乐 https://music.163.com/ 多页…...
【Docker】Docker的应用场景,Docker 的优点,Ubuntu Docker 安装,使用 Shell 脚本进行安装
作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖…...
CentOS7 启动谷歌浏览器 java+Selenium+chrome+chromedriver
前言:自己想使用该技术实现自动化抓取音乐,目前在window上运行成功,需要在Linux Centos服务上跑,配置上出现了许多问题,特此记录。 参考文档:CentOS7 安装Seleniumchromechromedriverjava_远方丿的博客-CSD…...
医疗影像分析入门:用Python+OpenCV给X光片做CLAHE增强,提升病灶可见度
医疗影像分析入门:用PythonOpenCV实现X光片CLAHE增强的实战指南 当医生面对一张对比度不足的胸部X光片时,那些隐藏在灰暗区域的细微病灶可能成为诊断的关键。传统的人工调窗方法依赖经验且效率低下,而计算机视觉中的CLAHE技术正逐渐成为医学影…...
Flink 1.18.0 新手避坑指南:从第一个WordCount程序到独立部署(附常见报错解决)
Flink 1.18.0 新手避坑指南:从第一个WordCount程序到独立部署 第一次接触Flink时,那种既兴奋又忐忑的心情我至今记忆犹新。作为一款强大的分布式流处理框架,Flink 1.18.0版本带来了诸多改进,但对于新手来说,从编写第一…...
【紧急避坑】AI开发者必看:Docker Sandbox 4类致命报错正在 silently 毁掉你的模型实验结果!
更多请点击: https://intelliparadigm.com 第一章:Docker Sandbox 运行 AI 代码隔离技术报错解决方法总览 在基于 Docker 构建的 AI 代码沙箱环境中,常见报错多源于资源限制、权限配置、依赖冲突及挂载路径不一致。以下为高频问题的系统性排…...
lvgl_v8.1版本之自定义bar绘画事件修复官方demo代码示例
static void set_value(void* bar, int32_t v) {lv_bar_set_value(bar, v, LV_ANIM_OFF)</...
Kubernetes 中的 Flannel网络【20260427-001篇】
文章目录 ✅ 一、设计目标与定位 ✅ 二、核心特性(Why Choose Flannel?) ✅ 三、工作原理(以默认 VXLAN 模式为例) 🌐 1. 子网分配(Subnet Allocation) 📦 2. 跨节点通信(VXLAN 封装) 🧩 3. 本节点通信(零开销) ✅ 四、主流后端模式对比(2026 年推荐) ✅ 五…...
告别霍尔传感器:用STM32的ADC实现BLDC无感控制(附代码与分压电路设计)
低成本BLDC无感控制实战:STM32 ADC方案设计与代码实现 在工业自动化、消费电子和机器人领域,无刷直流电机(BLDC)因其高效率、长寿命和低噪音特性广受欢迎。传统霍尔传感器方案虽然简单可靠,但增加了15%-30%的硬件成本,且在高温、高…...
如何在单页中初始化多个 Jodit 富文本编辑器实例
本文详解如何在同一个 HTML 页面中为多个 <textarea> 元素独立、正确地初始化 Jodit 编辑器,避免因复用单一实例导致的冲突或失效问题,并提供可直接运行的代码示例与关键注意事项。 本文详解如何在同一个 html 页面中为多个 元素独立、正确地…...
物理AI推动人机协作迈向新阶段研究报告凯捷 2026_01
这份凯捷 2026 年《物理 AI:推动人机协作迈向新阶段》报告核心结论:物理 AI 正让机器人从预编程工具变成可感知、自适应、能学习的现实世界智能合作者,已到规模化拐点,将重构各行业生产力与人机协作模式。一、核心定义:…...
【Python】面向对象之三大特性
目录 1.封装 1.1私有化 1.2私有属性 1.3私有方法 1.4property 2.继承 2.1单继承 2.2多继承 2.3复用父类方法 2.4方法解析顺序 2.5MRO顺序说明 2.6方法重写 3.多态 1.封装 将变量和函数写入类中的操作即为封装,即类中封装了属性和方法。 通过封装&…...
Python处理中文文件报错?别慌,教你用chardet库自动检测编码,告别UnicodeDecodeError
Python编码侦探指南:用chardet智能破解中文文件乱码困局 每次打开来源不明的文本文件时,那个令人头疼的UnicodeDecodeError就像个不速之客。作为Python开发者,你可能已经厌倦了反复猜测文件编码的游戏——GBK、UTF-8还是BIG5?今天…...
