1 ECharts简介
ECharts缩写来自Enterprise Charts,商业级数据图表,是百度的一个开源的使用 JavaScript实现的数据可视化工具,可以流畅的运行在 PC 和移动设备上,兼容当前绝大 部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的矢量图 形库 ZRender,提供直观、交互丰富、可高度个性化定制的数据可视化图表。
官网:https://echarts.baidu.com/
下载地址:https://echarts.baidu.com/download.html
下载完成可以得到如下文件:
解压上面的zip文件:
我们只需要将dist目录下的echarts.js文件引入到页面上就可以使用了
5分钟上手ECharts
我们可以参考官方提供的5分钟上手ECharts文档感受一下ECharts的使用方式,地址如 下:
第一步:
创建html页面并引入echarts.js文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- 引入 ECharts 文件 -->
<script src="echarts.js"></script>
</head>
</html>
第二步:
在页面中准备一个具备宽高的DOM容器。
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="main" style="width: 600px;height:400px;"></div>
第三步:
通过echarts.init方法初始化一个 echarts 实例并通过setOption方法生成一个简 单的柱状图
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
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>
整个页面代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- 引入 ECharts 文件 -->
<script src="echarts.js"></script>
</head>
<body>
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
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>
</body>
</html>
效果如下:
3 查看ECharts官方实例
ECharts提供了很多官方实例,我们可以通过这些官方实例来查看展示效果和使用方法。
官方实例地址:https://www.echartsjs.com/examples/
可以点击具体的一个图形会跳转到编辑页面,编辑页面左侧展示重点部分的源码(js部分源码),右 侧展示图表效果,如下:
要查看完整代码可以点击右下角的Download按钮将完整页面下载到本地。 通过官方案例我们可以发现,使用ECharts展示图表效果,关键点在于确定此图表所需的 数据格式,然后按照此数据格式提供数据就可以了,我们无须关注效果是如何渲染出来 的。
在实际应用中,我们要展示的数据往往存储在数据库中,所以我们可以发送ajax请求获取 数据库中的数据并转为图表所需的数据即可。
以下就是一个折线图案例
会员数量折线图
会员数量折线图对应的页面为report_member.html。
<body class="hold-transition">
<div id="app">
<div class="content-header">
<h1>统计分析<small>会员数量</small></h1>
<el-breadcrumb separator-class="el-icon-arrow-right" class="breadcrumb">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item>统计分析</el-breadcrumb-item>
<el-breadcrumb-item>会员数量</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="app-container">
<div class="box">
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="chart1" style="height:600px;"></div>
</div>
</div>
</div>
</body>
<!-- 引入组件库 -->
<script src="../js/vue.js"></script>
<script src="../js/axios-0.18.0.js"></script>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart1 = echarts.init(document.getElementById('chart1'));
// 使用刚指定的配置项和数据显示图表。
//myChart.setOption(option);
axios.get("/report/getMemberReport.do").then((res)=>{
myChart1.setOption(
{
title: {
text: '会员数量'
},
tooltip: {},
legend: {
data:['会员数量']
},
xAxis: {
data: res.data.data.months
},
yAxis: {
type:'value'
},
series: [{
name: '会员数量',
type: 'line',
data: res.data.data.memberCount
}]
});
});
</script>
根据折线图对数据格式的要求,我们发送ajax请求,页面要求服务端需要返回如下格式的数据:
{
"data":{
"months":["2019.01","2019.02","2019.03","2019.04"],
"memberCount":[3,4,8,10]
},
"flag":true,
"message":"获取会员统计数据成功"
}
res.data.data.memberCount:
res.data:回调函数
res.data.data:拿到回台返回的封装类Result中的data(data属性的类型为Map类型,为了我们可以在返回的数据当中添加给的的类型)
res.data.data.memberCount:map集合中的memberCount数据
我们现在后台controller处模拟返回的数据格式
@RequestMapping("/getMemberReport")
public Result getMemberReport() {
//模拟数据使用map封装数据 String保存属性名,Object保存属性值
Map<String, Object> map = new HashMap<>(); //map保存 "months":["2019.01","2019.02","2019.03","2019.04"]
List<String> months = new ArrayList<>(); //months保存 ["2019.01","2019.02","2019.03","2019.04"]
List<Integer> memberCount = new ArrayList<>(); // memberCount保存 [3,4,8,10]
//将年份存储到List集合当中,再将List集合对象存储在map当中
months.add("2019.01");
months.add("2019.02");
months.add("2019.03");
months.add("2019.04");
map.put("months", months);
//将数量存储到List集合当中,再将List集合对象存储在map当中
memberCount.add(100);
memberCount.add(400);
memberCount.add(300);
memberCount.add(400);
map.put("memberCount", memberCount);
return new Result(true, MessageConstant.GET_MEMBER_NUMBER_REPORT_SUCCESS, map);
}
/**
* 封装返回结果
*/
public class Result implements Serializable{
private boolean flag;//执行结果,true为执行成功 false为执行失败
private String message;//返回结果信息,主要用于页面提示信息
private Object data;//返回数据
public Result(boolean flag, String message) {
super();
this.flag = flag;
this.message = message;
}
public Result(boolean flag, String message, Object data) {
this.flag = flag;
this.message = message;
this.data = data;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
页面效果
我们通过观察数据的响应,查看后台返回的数据是否符合官网要求的数据格式
使用json在线解析工具,就可以更清楚的发现数据正是我们页面要使用的数据格式
后台controller方法
/***
* 统计报表
* */
@RestController
@RequestMapping("/report")
public class ReportController {
@Reference
private MemberService memberService;
@RequestMapping("/getMemberReport")
public Result getMemberReport(){
Map<String,Object> map = new HashMap<>(); //map保存 "months":["2019.01","2019.02","2019.03","2019.04"]
List<String> months = new ArrayList(); //months保存 ["2019.01","2019.02","2019.03","2019.04"]
Calendar calendar = Calendar.getInstance();//获得日历对象,模拟时间就是当前时间
//计算过去一年的12个月
calendar.add(Calendar.MONTH,-12);//获得当前时间往前推12个月的时间
for(int i=0;i<12;i++){
calendar.add(Calendar.MONTH,1);//获得当前时间往后推一个月日期
Date date = calendar.getTime();
months.add(new SimpleDateFormat("yyyy.MM").format(date));
}
map.put("months",months);
List<Integer> memberCount = memberService.findMemberCountByMonths(months);
map.put("memberCount",memberCount);
return new Result(true, MessageConstant.GET_MEMBER_NUMBER_REPORT_SUCCESS,map);
}
}
service接口
//根据月份查询会员数量
public List<Integer> findMemberCountByMonths(List<String> months) {//2018.05
List<Integer> memberCount = new ArrayList<>();
for (String month : months) {
String date = month + ".31";//2018.05.31
Integer count = memberDao.findMemberCountBeforeDate(date);
memberCount.add(count);
}
return memberCount;
}
dao层
public Integer findMemberCountBeforeDate(String date);
xml:
<!--根据日期统计会员数,统计指定日期之前的会员数-->
<select id="findMemberCountBeforeDate" parameterType="string" resultType="int">
select count(id) from t_member where regTime <= #{value}
</select>