ECharts异步加载数据

前言

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

编码实战

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

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

public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {

    @Query(value = "SELECT POSITION AS name,COUNT(POSITION) AS value FROM USERINFO GROUP BY POSITION",nativeQuery = true)
    List<Map<String,Object>> findUserByPositionGroup();
}

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

/**
 * @ClassName: MapTransFormUtil
 * @Author: 清风一阵吹我心
 * @Description: TODO  map中 key 的大小写转换
 * @Date: 2019/11/14 15:44
 * @Version 1.0
 **/
public class MapTransFormUtil {
    /**
     * 将map值全部转换为大写
     */
    public static Map<String, Object> transformUpperCase(Map<String, Object> orgMap) {
        Map<String, Object> resultMap = new HashMap<>();
        if (orgMap == null || orgMap.isEmpty()) {
            return resultMap;
        }
        Set<String> keySet = orgMap.keySet();
        for (String key : keySet) {
            String newKey = key.toUpperCase();
            resultMap.put(newKey, orgMap.get(key));
        }
        return resultMap;
    }

    /**
     * 将map值全部转换为小写
     */
    public static Map<String, Object> transformLowerCase(Map<String, Object> orgMap) {
        Map<String, Object> resultMap = new HashMap<>();
        if (orgMap == null || orgMap.isEmpty()) {
            return resultMap;
        }
        Set<String> keySet = orgMap.keySet();
        for (String key : keySet) {
            String newKey = key.toLowerCase();
            resultMap.put(newKey, orgMap.get(key));
        }
        return resultMap;
    }
}

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

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="main" style="width: 800px;height:500px;"></div>
</body>
<!-- 引入 jquery 文件 -->
<script src="../static/incubator-echarts-4.5.0-rc.2/benchmark/dep/jquery/jquery-2.2.4.js"></script>
<!-- 引入 ECharts 文件 -->
<script src="../static/incubator-echarts-4.5.0-rc.2/dist/echarts.min.js"></script>
<!-- 引入 vintage 主题 -->
<script src="../static/incubator-echarts-4.5.0-rc.2/theme/dark.js" type="text/javascript"></script>

</html>

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

    var myChart = echarts.init(document.getElementById('main'), 'dark');
    //显示标题,图例和空的坐标轴
    myChart.setOption({
        title: {
            text: '用户分类',
            subtext: '纯属虚构',
            x: 'center'
        }, tooltip: {
            trigger: 'item',
            formatter: "{a} <br/>{b} : {c} ({d}%)"
        }, legend: {
            orient: 'vertical',
            left: 'left',
            data: []
        }, series: [
            {
                name: '分类',
                type: 'pie',
                radius: '55%',
                center: ['50%', '60%'],
                data: [],
                itemStyle: {
                    emphasis: {
                        shadowBlur: 10,
                        shadowOffsetX: 0,
                        shadowColor: 'rgba(0, 0, 0, 0.5)'
                    }
                }
            }
        ]
    });

    // 加载
    myChart.showLoading();

    var names = [];
    // 发送ajax请求
    $.ajax({
        type: 'GET',
        async: true,
        url: '/api/user/position',
        dataType: 'JSON',
        success: function (result) {
            if (result.code === 200) {
                let data = result.data;
                for (var index in data) {
                    names.push(data[index].name);
                }
                console.info(names);
                myChart.hideLoading(); //隐藏加载动画
                myChart.setOption({
                    legend: {
                        data: names
                    }, series: [
                        {
                            data: result.data
                        }
                    ]
                });
            } else {
                alert("后台获取数据失败!");
            }
        },
        error: function (errorMsg) {
            //请求失败时执行该函数
            alert("图表请求数据失败!");
            myChart.hideLoading();
        }
    });

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

{
  "code": 200,
  "flag": true,
  "data": [
    {
      "name": "实施工程师",
      "value": 6
    },
    {
      "name": "架构师",
      "value": 1
    },
    {
      "name": "数据分析师",
      "value": 2
    },
    {
      "name": "Java开发工程师",
      "value": 2
    },
    {
      "name": "测试工程师",
      "value": 1
    }
  ],
  "message": "返回成功"
}

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

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

勿谓言之不预也

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值