天天看点

五分钟上手ECharts图形报表2. 会员数量折线图

1. 图形报表ECharts

1.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

五分钟上手ECharts图形报表2. 会员数量折线图

下载完成可以得到如下文件:

五分钟上手ECharts图形报表2. 会员数量折线图

解压上面的zip文件:

五分钟上手ECharts图形报表2. 会员数量折线图

我们只需要将dist目录下的echarts.js文件引入到页面上就可以使用了

五分钟上手ECharts图形报表2. 会员数量折线图

1.2 五分钟上手ECharts

我们可以参考官方提供的5分钟上手ECharts文档感受一下ECharts的使用方式,地址如下:

https://www.echartsjs.com/zh/tutorial.html

第一步:创建html页面并引入echarts.js文件

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
	<!-- 引入 ECharts 文件 -->
	<script src="echarts.js"></script>
</head>
</html>
           

第二步:在页面中准备一个具备宽高的DOM容器。

<body>
	<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
	<div id="main" style="width: 600px;height:400px;"></div> 
</body>
           

第三步:通过echarts.init方法初始化一个 echarts 实例并通过setOption方法生成一个简单的柱状图

<script src="echarts.js"></script>
<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>

           

效果如下:

五分钟上手ECharts图形报表2. 会员数量折线图

1.3 查看ECharts官方实例

ECharts提供了很多官方实例,我们可以通过这些官方实例来查看展示效果和使用方法。

官方实例地址:https://www.echartsjs.com/examples/

五分钟上手ECharts图形报表2. 会员数量折线图

可以点击具体的一个图形会跳转到编辑页面,编辑页面左侧展示源码(js部分源码),右侧展示图表效果,如下:

五分钟上手ECharts图形报表2. 会员数量折线图

要查看完整代码可以点击右下角的Download按钮将完整页面下载到本地。

通过官方案例我们可以发现,使用ECharts展示图表效果,关键点在于确定此图表所需的数据格式,然后按照此数据格式提供数据就可以了,我们无须关注效果是如何渲染出来的。

在实际应用中,我们要展示的数据往往存储在数据库中,所以我们可以发送ajax请求获取数据库中的数据并转为图表所需的数据即可。

2. 会员数量折线图

2.1 需求分析

会员信息是体检机构的核心数据,其会员数量和增长数量可以反映出机构的部分运营情况。通过折线图可以直观的反映出会员数量的增长趋势。本章节我们需要展示过去一年时间内每个月的会员总数据量。展示效果如下图:

五分钟上手ECharts图形报表2. 会员数量折线图

2.2 完善页面

会员数量折线图对应的页面为

/pages/report_member.html

(自定义)。

2.2.1 导入ECharts库

第一步:将echarts.js文件复制到health_backend工程的plugins目录下(根据自己目录即可)

第二步:在report_member.html页面引入

echarts.js

文件

2.2.2 参照官方实例导入折线图

<div class="box">
	<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --> 
	<div id="chart1" style="height:600px;"></div>
</div>
 
<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":"获取会员统计数据成功"
}
           

2.3 后台代码

2.3.1 Controller

在health_backend工程中创建ReportController并提供getMemberReport方法(创建Controller层)

package com.heihiehei.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.constant.MessageConstant;
import com.itheima.entity.Result;
import com.itheima.service.MemberService;
import com.itheima.utils.DateUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 图表操作
 *
 * @author 嘿嘿嘿1212
 * @version 1.0
 * @date 2019/10/25 21:55
 */
@RestController
@RequestMapping("/report")
public class ReportController {

    @Reference
    private MemberService memberService;

    @RequestMapping("/getMemberReport")
    public Result getMemberReport() {
        //显示多少个月份之前
        int month = 12;
        Map<String, Object> map = new HashMap<>();
        List<String> months = new ArrayList<>();
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, -month);
        for (int i = 0; i < month; i++) {
            calendar.add(Calendar.MONTH, 1);
            Date time = calendar.getTime();
            months.add(new SimpleDateFormat("yyyy.MM").format(time));
        }
        map.put("months", months);
        List<Integer> memberCount = memberService.findMemberByMonths(months);
        map.put("memberCount", memberCount);
        return new Result(true, MessageConstant.GET_MEMBER_NUMBER_REPORT_SUCCESS, map);

    }


}
           

2.3.2 服务接口

MemberService

服务接口中扩展方法findMemberCountByMonth(Servlce层)

2.2.3 服务实现类

MemberServiceImpl

服务实现类中实现

findMemberCountByMonth

方法

//根据月份统计会员数量

@Autowired
private MemberDao memberDao;
/**
 * 根据月份统计用户数量
 * @param months
 * @return
 */
@Override
public List<Integer> findMemberByMonths(List<String> months) {
    List<Integer> memberCount = new ArrayList<>();
    for (String month : months) {
        month = month + ".31";//格式:2019.10.31
        memberCount.add(memberDao.findMemberCountBeforeDate(month));
    }
    return memberCount;
}
           

2.3.4 Dao接口

MemberDao

接口中扩展方法

findMemberCountBeforeDate

2.3.5 Mapper映射文件

MemberDao.xml

映射文件中提供SQL语句

<!--根据日期统计会员数,统计指定日期之前的会员数-->
<select id="findMemberCountBeforeDate" parameterType="string" resultType="int">
select count(id) from t_member where regTime &lt;= #{value} 
</select>
           

注意

  • 最后进行测试页面出现数据报表则成功
  • 这里使用的SSM框架开发
  • 使用dubbo架构,如果使用单体架构请将Controller层的

    @Reference

    修改为

    @Autowired

  • 项目中实现

继续阅读