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
下載下傳完成可以得到如下檔案:
解壓上面的zip檔案:
我們隻需要将dist目錄下的echarts.js檔案引入到頁面上就可以使用了
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>
效果如下:
1.3 檢視ECharts官方執行個體
ECharts提供了很多官方執行個體,我們可以通過這些官方執行個體來檢視展示效果和使用方法。
官方執行個體位址:https://www.echartsjs.com/examples/
可以點選具體的一個圖形會跳轉到編輯頁面,編輯頁面左側展示源碼(js部分源碼),右側展示圖表效果,如下:
要檢視完整代碼可以點選右下角的Download按鈕将完整頁面下載下傳到本地。
通過官方案例我們可以發現,使用ECharts展示圖表效果,關鍵點在于确定此圖表所需的資料格式,然後按照此資料格式提供資料就可以了,我們無須關注效果是如何渲染出來的。
在實際應用中,我們要展示的資料往往存儲在資料庫中,是以我們可以發送ajax請求擷取資料庫中的資料并轉為圖表所需的資料即可。
2. 會員數量折線圖
2.1 需求分析
會員資訊是體檢機構的核心資料,其會員數量和增長數量可以反映出機構的部分營運情況。通過折線圖可以直覺的反映出會員數量的增長趨勢。本章節我們需要展示過去一年時間内每個月的會員總資料量。展示效果如下圖:
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 <= #{value}
</select>
注意
- 最後進行測試頁面出現資料報表則成功
- 這裡使用的SSM架構開發
- 使用dubbo架構,如果使用單體架構請将Controller層的
修改為@Reference
@Autowired
- 項目中實作