一、ECharts

1、简介

ECharts是百度的一个项目,后来百度把Echart捐给apache,用于图表展示,提供了常规的折线图柱状图散点图饼图K线图,用于统计的盒形图,用于地理数据可视化的地图热力图线图,用于关系数据可视化的关系图treemap旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图仪表盘,并且支持图与图之间的混搭。
官方网站:https://echarts.baidu.com/

2、基本使用

入门参考:官网->文档->教程->5分钟上手ECharts

(1)创建html页面:柱图.html
(2)引入ECharts

  1. <!-- 引入 ECharts 文件 -->
  2. <script src="echarts.min.js"></script>

(3)定义图表区域

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

(4)渲染图表

  1. <script type="text/javascript">
  2. // 基于准备好的dom,初始化echarts实例
  3. var myChart = echarts.init(document.getElementById('main'));
  4. // 指定图表的配置项和数据
  5. var option = {
  6. title: {
  7. text: 'ECharts 入门示例'
  8. },
  9. tooltip: {},
  10. legend: {
  11. data:['销量']
  12. },
  13. xAxis: {
  14. data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
  15. },
  16. yAxis: {},
  17. series: [{
  18. name: '销量',
  19. type: 'bar',
  20. data: [5, 20, 36, 10, 10, 20]
  21. }]
  22. };
  23. // 使用刚指定的配置项和数据显示图表。
  24. myChart.setOption(option);
  25. </script>

3、折线图

实例参考:官网->实例->官方实例 https://echarts.baidu.com/examples/
折线图.html

  1. <script>
  2. var myChart = echarts.init(document.getElementById('main'));
  3. var option = {
  4. //x轴是类目轴(离散数据),必须通过data设置类目数据
  5. xAxis: {
  6. type: 'category',
  7. data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  8. },
  9. //y轴是数据轴(连续数据)
  10. yAxis: {
  11. type: 'value'
  12. },
  13. //系列列表。每个系列通过 type 决定自己的图表类型
  14. series: [{
  15. //系列中的数据内容数组
  16. data: [820, 932, 901, 934, 1290, 1330, 1320],
  17. //折线图
  18. type: 'line'
  19. }]
  20. };
  21. myChart.setOption(option);
  22. </script>

二、项目中集成ECharts

1、安装ECharts

npm install —save echarts vuex-persistedstate

2、增加路由

src/router/index.js
在统计分析路由中增加子路由

  1. {
  2. path: 'chart',
  3. name: 'StatisticsDayChart',
  4. component: () => import('@/views/statistics/daily/chart'),
  5. meta: { title: '统计图表' }
  6. }

3、创建组件

src/views/statistics/daily/chart.vue
模板

  1. <template>
  2. <div class="app-container">
  3. <!--表单-->
  4. <el-form :inline="true" class="demo-form-inline">
  5. <el-form-item>
  6. <el-select v-model="searchObj.type" clearable placeholder="请选择">
  7. <el-option label="学员登录数统计" value="login_num"/>
  8. <el-option label="学员注册数统计" value="register_num"/>
  9. <el-option label="课程播放数统计" value="video_view_num"/>
  10. <el-option label="每日课程数统计" value="course_num"/>
  11. </el-select>
  12. </el-form-item>
  13. <el-form-item>
  14. <el-date-picker
  15. v-model="searchObj.begin"
  16. type="date"
  17. placeholder="选择开始日期"
  18. value-format="yyyy-MM-dd" />
  19. </el-form-item>
  20. <el-form-item>
  21. <el-date-picker
  22. v-model="searchObj.end"
  23. type="date"
  24. placeholder="选择截止日期"
  25. value-format="yyyy-MM-dd" />
  26. </el-form-item>
  27. <el-button
  28. :disabled="btnDisabled"
  29. type="primary"
  30. icon="el-icon-search"
  31. @click="showChart()">查询</el-button>
  32. </el-form>
  33. <div class="chart-container">
  34. <div id="chart" class="chart" style="height:500px;width:100%" />
  35. </div>
  36. </div>
  37. </template>

js:暂时显示临时数据

  1. <script>
  2. import echarts from 'echarts'
  3. export default {
  4. data() {
  5. return {
  6. searchObj: {
  7. type: '',
  8. begin: '',
  9. end: ''
  10. },
  11. btnDisabled: false,
  12. chart: null,
  13. title: '',
  14. xData: [],
  15. yData: []
  16. }
  17. },
  18. methods: {
  19. showChart() {
  20. this.initChartData()
  21. this.setChart()
  22. },
  23. // 准备图表数据
  24. initChartData() {
  25. },
  26. // 设置图标参数
  27. setChart() {
  28. // 基于准备好的dom,初始化echarts实例
  29. this.chart = echarts.init(document.getElementById('chart'))
  30. // console.log(this.chart)
  31. // 指定图表的配置项和数据
  32. var option = {
  33. // x轴是类目轴(离散数据),必须通过data设置类目数据
  34. xAxis: {
  35. type: 'category',
  36. data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  37. },
  38. // y轴是数据轴(连续数据)
  39. yAxis: {
  40. type: 'value'
  41. },
  42. // 系列列表。每个系列通过 type 决定自己的图表类型
  43. series: [{
  44. // 系列中的数据内容数组
  45. data: [820, 932, 901, 934, 1290, 1330, 1320],
  46. // 折线图
  47. type: 'line'
  48. }]
  49. }
  50. this.chart.setOption(option)
  51. }
  52. }
  53. }
  54. </script>

三、完成后端业务

1、controller

  1. @GetMapping("show-chart/{begin}/{end}/{type}")
  2. public R showChart(@PathVariable String begin,@PathVariable String end,@PathVariable String type){
  3. Map<String, Object> map = dailyService.getChartData(begin, end, type);
  4. return R.ok().data(map);
  5. }

2、service

接口

  1. Map<String, Object> getChartData(String begin, String end, String type);

实现

  1. @Override
  2. public Map<String, Object> getChartData(String begin, String end, String type) {
  3. QueryWrapper<Daily> dayQueryWrapper = new QueryWrapper<>();
  4. dayQueryWrapper.select(type, "date_calculated");
  5. dayQueryWrapper.between("date_calculated", begin, end);
  6. List<Daily> dayList = baseMapper.selectList(dayQueryWrapper);
  7. Map<String, Object> map = new HashMap<>();
  8. List<Integer> dataList = new ArrayList<Integer>();
  9. List<String> dateList = new ArrayList<String>();
  10. map.put("dataList", dataList);
  11. map.put("dateList", dateList);
  12. for (int i = 0; i < dayList.size(); i++) {
  13. Daily daily = dayList.get(i);
  14. dateList.add(daily.getDateCalculated());
  15. switch (type) {
  16. case "register_num":
  17. dataList.add(daily.getRegisterNum());
  18. break;
  19. case "login_num":
  20. dataList.add(daily.getLoginNum());
  21. break;
  22. case "video_view_num":
  23. dataList.add(daily.getVideoViewNum());
  24. break;
  25. case "course_num":
  26. dataList.add(daily.getCourseNum());
  27. break;
  28. default:
  29. break;
  30. }
  31. }
  32. return map;
  33. }

四、前后端整合

1、创建api

src/api/statistics/daily.js中添加方法

  1. showChart(searchObj) {
  2. return request({
  3. url: `${api_name}/show-chart/${searchObj.begin}/${searchObj.end}/${searchObj.type}`,
  4. method: 'get'
  5. })
  6. }

2、chart.vue中引入api模块

  1. import daily from '@/api/statistics/daily'
  2. ......

3、修改initChartData方法

  1. showChart() {
  2. this.initChartData()
  3. // this.setChart()//放在initChartData回调中执行
  4. },
  5. // 准备图表数据
  6. initChartData() {
  7. daily.showChart(this.searchObj).then(response => {
  8. // 数据
  9. this.yData = response.data.dataList
  10. // 横轴时间
  11. this.xData = response.data.dateList
  12. // 当前统计类别
  13. switch (this.searchObj.type) {
  14. case 'register_num':
  15. this.title = '学员注册数统计'
  16. break
  17. case 'login_num':
  18. this.title = '学员登录数统计'
  19. break
  20. case 'video_view_num':
  21. this.title = '课程播放数统计'
  22. break
  23. case 'course_num':
  24. this.title = '每日课程数统计'
  25. break
  26. }
  27. this.setChart()
  28. })
  29. },

4、修改options中的数据

  1. xAxis: {
  2. type: 'category',
  3. data: this.xData//-------绑定数据
  4. },
  5. // y轴是数据轴(连续数据)
  6. yAxis: {
  7. type: 'value'
  8. },
  9. // 系列列表。每个系列通过 type 决定自己的图表类型
  10. series: [{
  11. // 系列中的数据内容数组
  12. data: this.yData,//-------绑定数据
  13. // 折线图
  14. type: 'line'
  15. }],

五、样式调整

参考配置手册:https://echarts.baidu.com/option.html#title

1、显示标题

  1. title: {
  2. text: this.title
  3. },

2、x坐标轴触发提示

  1. tooltip: {
  2. trigger: 'axis'
  3. },

3、区域缩放

  1. dataZoom: [{
  2. show: true,
  3. height: 30,
  4. xAxisIndex: [
  5. 0
  6. ],
  7. bottom: 30,
  8. start: 10,
  9. end: 80,
  10. handleIcon: 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
  11. handleSize: '110%',
  12. handleStyle: {
  13. color: '#d3dee5'
  14. },
  15. textStyle: {
  16. color: '#fff'
  17. },
  18. borderColor: '#90979c'
  19. },
  20. {
  21. type: 'inside',
  22. show: true,
  23. height: 15,
  24. start: 1,
  25. end: 35
  26. }]