ECharts异步加载数据

痛定思痛。 2023-06-16 14:58 239阅读 0赞

前言

现在做报表的工具和产品很多。之前用过美林数据的 ‘Tempo BI’,一款需要付费的产品,功能还是很强大的。最近,朋友需要做一个简单的报表Demo,想让我帮忙实现。为了给领导展示,如果效果不错就能提薪。所以,为了纯洁的革命友谊,我便答应了他。之所以选择使用ECharts,是因为它的兼容性好,操作方便,最重要的是开源。

编码实战

本篇博文是基于《SpringBoot整合Oracle数据库》这篇文章进行修改的,所以数据也是从Oracle中提取的。后端采用Java语言,不做太多后端代码的说明,重点在ECharts的使用上。

博主以ECharts官网提供的一个“饼图”的例子进行修改,讲解ECharts如何异步加载数据。
首先,例子中所需要的数据是{value: ‘’,name: ‘’}。所以博主在后台操作的时候就构建了一个这样的数据。操作Oracle使用的是JPA。

  1. public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {
  2. @Query(value = "SELECT POSITION AS name,COUNT(POSITION) AS value FROM USERINFO GROUP BY POSITION",nativeQuery = true)
  3. List<Map<String,Object>> findUserByPositionGroup();
  4. }

这里写了一个sql,按照人员的岗位来进行分组。然后返回值以Map来接收,这样才能返回kay-value的形式。
通过Debug发现,查询出来的Map中的key都是大写。所以,这里需要将Map中的所有键变为小写。提取了一个工具类。

  1. /** * @ClassName: MapTransFormUtil * @Author: 清风一阵吹我心 * @Description: TODO map中 key 的大小写转换 * @Date: 2019/11/14 15:44 * @Version 1.0 **/
  2. public class MapTransFormUtil {
  3. /** * 将map值全部转换为大写 */
  4. public static Map<String, Object> transformUpperCase(Map<String, Object> orgMap) {
  5. Map<String, Object> resultMap = new HashMap<>();
  6. if (orgMap == null || orgMap.isEmpty()) {
  7. return resultMap;
  8. }
  9. Set<String> keySet = orgMap.keySet();
  10. for (String key : keySet) {
  11. String newKey = key.toUpperCase();
  12. resultMap.put(newKey, orgMap.get(key));
  13. }
  14. return resultMap;
  15. }
  16. /** * 将map值全部转换为小写 */
  17. public static Map<String, Object> transformLowerCase(Map<String, Object> orgMap) {
  18. Map<String, Object> resultMap = new HashMap<>();
  19. if (orgMap == null || orgMap.isEmpty()) {
  20. return resultMap;
  21. }
  22. Set<String> keySet = orgMap.keySet();
  23. for (String key : keySet) {
  24. String newKey = key.toLowerCase();
  25. resultMap.put(newKey, orgMap.get(key));
  26. }
  27. return resultMap;
  28. }
  29. }

这样就构建出了我们想要的数据,下面就要将ECharts整合进页面中了。
创建html页面

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
  9. <div id="main" style="width: 800px;height:500px;"></div>
  10. </body>
  11. <!-- 引入 jquery 文件 -->
  12. <script src="../static/incubator-echarts-4.5.0-rc.2/benchmark/dep/jquery/jquery-2.2.4.js"></script>
  13. <!-- 引入 ECharts 文件 -->
  14. <script src="../static/incubator-echarts-4.5.0-rc.2/dist/echarts.min.js"></script>
  15. <!-- 引入 vintage 主题 -->
  16. <script src="../static/incubator-echarts-4.5.0-rc.2/theme/dark.js" type="text/javascript"></script>
  17. </html>

页面就是这么简单,然后需要发送ajax请求来请求后台的数据。
官网提供了两种异步加载的方法。
一、数据和图表样式一起加载。
二、先加载图表样式,然后再异步获取数据填充数据。
博主这里使用第二种方法。

  1. var myChart = echarts.init(document.getElementById('main'), 'dark');
  2. //显示标题,图例和空的坐标轴
  3. myChart.setOption({
  4. title: {
  5. text: '用户分类',
  6. subtext: '纯属虚构',
  7. x: 'center'
  8. }, tooltip: {
  9. trigger: 'item',
  10. formatter: "{a} <br/>{b} : {c} ({d}%)"
  11. }, legend: {
  12. orient: 'vertical',
  13. left: 'left',
  14. data: []
  15. }, series: [
  16. {
  17. name: '分类',
  18. type: 'pie',
  19. radius: '55%',
  20. center: ['50%', '60%'],
  21. data: [],
  22. itemStyle: {
  23. emphasis: {
  24. shadowBlur: 10,
  25. shadowOffsetX: 0,
  26. shadowColor: 'rgba(0, 0, 0, 0.5)'
  27. }
  28. }
  29. }
  30. ]
  31. });
  32. // 加载
  33. myChart.showLoading();
  34. var names = [];
  35. // 发送ajax请求
  36. $.ajax({
  37. type: 'GET',
  38. async: true,
  39. url: '/api/user/position',
  40. dataType: 'JSON',
  41. success: function (result) {
  42. if (result.code === 200) {
  43. let data = result.data;
  44. for (var index in data) {
  45. names.push(data[index].name);
  46. }
  47. console.info(names);
  48. myChart.hideLoading(); //隐藏加载动画
  49. myChart.setOption({
  50. legend: {
  51. data: names
  52. }, series: [
  53. {
  54. data: result.data
  55. }
  56. ]
  57. });
  58. } else {
  59. alert("后台获取数据失败!");
  60. }
  61. },
  62. error: function (errorMsg) {
  63. //请求失败时执行该函数
  64. alert("图表请求数据失败!");
  65. myChart.hideLoading();
  66. }
  67. });

可以看到第一段代码就是样式的加载,data数据为空数组。后面才发送ajax请求后台加载数据。
请求地址:http://localhost:9000/api/user/position

  1. {
  2. "code": 200,
  3. "flag": true,
  4. "data": [
  5. {
  6. "name": "实施工程师",
  7. "value": 6
  8. },
  9. {
  10. "name": "架构师",
  11. "value": 1
  12. },
  13. {
  14. "name": "数据分析师",
  15. "value": 2
  16. },
  17. {
  18. "name": "Java开发工程师",
  19. "value": 2
  20. },
  21. {
  22. "name": "测试工程师",
  23. "value": 1
  24. }
  25. ],
  26. "message": "返回成功"
  27. }

最后进行数据的填充。展示效果如下图:
format_png

关于ECharts的异步加载数据就讲完了,不同的图表所需的数据不一样。这些是需要自己去构建的。

勿谓言之不预也

发表评论

表情:
评论列表 (有 0 条评论,239人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ECharts异步数据

    前言 现在做报表的工具和产品很多。之前用过美林数据的 ‘Tempo BI’,一款需要付费的产品,功能还是很强大的。最近,朋友需要做一个简单的报表Demo,想让我帮忙实现。