赞
踩
任务十 VUE侧边菜单栏导航 中我们留了一个home.vue页面一直没有做,它还是这样的
一般情况home就是对整个系统的一些核心数据的图表展示。这次任务,我们将使用echarts图表工具,简单实现用户统计数据展示。通过本次任务,大家能够:
(1)了解Echart图表工具的使用方法;
(2)掌握前后端数据传递及图表获取数据;
(3)基本了解Home页面。
ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。
官网地址:https://echarts.apache.org/examples/zh/index.html#chart-type-line
ECharts 安装
npm i echarts -s
我们先简单的做一个demo,让页面出现图表,然后再在这个基础上加上动态数据,这样更容易理解和使用。
在Home.vue组件中,添加两个div容器,存放图表,这里放了两个,准备main中放折线图和柱状图,pie中放饼图,并且采用栅格系统,左右排列。
<template>
<div>
<el-row>
<el-col :span="12">
<div id="main" style="width:500px; height:400px"></div>
</el-col>
<el-col :span="12">
<div id="pie" style="width:500px; height:400px"></div>
</el-col>
</el-row>
</div>
</template>
(1)打开官网,找到需要的折线图,点击“JS”,打开JS代码。
(2)复制代码
找到“完整代码”,相应的代码复制,然后放到Home.vue中。
<script> import * as echarts from 'echarts'; export default { name:"Home", data(){ return{ } }, mounted(){ //使用mounted的目的是为了等页面元素渲染之后再触发 var chartDom = document.getElementById('main');//main 中放了一个折线图和柱状图 var myChart = echarts.init(chartDom); var charOption; charOption = { xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { data: [150, 230, 224, 218, 135, 147, 260], type: 'line' }, { data: [150, 230, 224, 218, 135, 147, 260], type: 'bar' } ] }; myChart.setOption(charOption); var pieDom = document.getElementById('pie');//pie中放了饼图 var pieChart = echarts.init(pieDom); var pieOption; pieOption = { title: { text: 'Referer of a Website', subtext: 'Fake Data', left: 'center' }, tooltip: { trigger: 'item' }, legend: { orient: 'vertical', left: 'left' }, series: [ { name: 'Access From', type: 'pie', radius: '50%', data: [ { value: 1048, name: 'Search Engine' }, { value: 735, name: 'Direct' }, { value: 580, name: 'Email' }, { value: 484, name: 'Union Ads' }, { value: 300, name: 'Video Ads' } ], emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] }; pieChart.setOption(pieOption); } } </script>
说明: 这里放了两个容器,chartDom和pieDom,分别渲染折线图(柱状图)和饼图。
这时候运行项目,折线图、柱状图、饼图就都出来了。
在基本图表能够正常显示的情况下,一方面保障了Echart引入环境正常,另一方面,基本学会使用官网JS代码。
观察上面的图表就会发现,使用Echart做图表非常方便。比如折线像图或者柱状图,只要提供X、Y轴数据即可。
这里做一个根据用户生成的日期进行一个季度统计,比如第三季度,有多少用户,第四季度有多少用户等。
在定义members路由及members映射方法。使用Hutool工具中的DateUtil.quarterEnum可以实现对日期进行季度提取。然后根据季度进行Switch判断,并计数。
新建EchartsController,添加members接口,使用Hutool工具中的DateUtil.quarterEnum可以实现对日期进行季度提取。然后根据季度进行Switch判断,并计数。
package com.example.demo.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.Quarter; import com.example.demo.common.Result; import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/echarts") public class EchartsController { @Autowired private UserService userService; //统计每个季度的会员人数 @GetMapping("/members") public Result members(){ List<User> list=userService.list(); int q1=0;//分别定义四个季度 int q2=0; int q3=0; int q4=0; for(User user:list){ Date createTime=user.getCreatedTime(); Quarter quarter= DateUtil.quarterEnum(createTime); switch (quarter){ case Q1:q1+=1;break; case Q2:q2+=1;break; case Q3:q3+=1;break; case Q4:q4+=1;break; default:break; } } return Result.success(CollUtil.newArrayList(q1,q2,q3,q4)); } }
xAxis: {
type: 'category',
data: ["第一季度","第二季度","第三季度","第四季度"]
},
this.request("http://localhost:8084/echarts/members").then(res=>{
console.log(res);
option.series[0].data=res.data;
option.series[1].data=res.data;
myChart.setOption(option);
})
title: {
text: '各季度会员统计',
subtext: '趋势图',
left: 'center'
},
清空原demo中data的值。从后端获取数据,填充到data中。
<template> <div> <el-row :gutter="10" style="margin-bottom:60px"> <el-col :span="6"> <el-card style="color:#409EFF"> <div><i class="el-icon-user-solid"/>用户总量</div> <div style="padding:10px 0;text-align:center;font-weight:bold">100</div> </el-card> </el-col> <el-col :span="6"> <el-card style="color:#F56C6C"> <div><i class="el-icon-money"/>销售总量</div> <div style="padding:10px 0;text-align:center;font-weight:bold">¥1000000</div> </el-card> </el-col> <el-col :span="6"> <el-card style="color:#67C23A"> <div><i class="el-icon-bank-card"/>收益总额</div> <div style="padding:10px 0;text-align:center;font-weight:bold">¥30003</div> </el-card> </el-col> <el-col :span="6"> <el-card style="color:#409EFF"> <div style="color:#409EFF"><i class="el-icon-s-shop"/>门店总数</div> <div style="padding:10px 0;text-align:center;font-weight:bold">100</div> </el-card> </el-col> </el-row> <el-row> <el-col :span="12"> <div id="main" style="width:500px; height:400px"></div> </el-col> <el-col :span="12"> <div id="pie" style="width:500px; height:400px"></div> </el-col> </el-row> </div> </template> <script> import * as echarts from 'echarts'; export default { name:"Home", data(){ return{ } }, mounted(){ //使用mounted的目的是为了等页面元素渲染之后再触发 var chartDom = document.getElementById('main'); var myChart = echarts.init(chartDom); var charOption; charOption = { title: { text: '各季度会员统计', subtext: '趋势图', left: 'center' }, xAxis: { type: 'category', data: ["第一季度","第二季度","第三季度","第四季度"] }, yAxis: { type: 'value' }, series: [ { data: [], type: 'line' }, { data: [], type: 'bar' } ] }; var pieDom = document.getElementById('pie'); var pieChart = echarts.init(pieDom); var pieOption; pieOption = { title: { text: '各季度会员统计', subtext: '比例图', left: 'center' }, tooltip: { trigger: 'item' }, legend: { orient: 'vertical', left: 'left' }, series: [ { type: 'pie', radius: '70%', label: { normal: { show: true, position: 'inner', textStyle:{ fontWeight:300, fontSize:16, color:"#fff" }, formatter: '{d}%' //自定义显示格式(b:name, c:value, d:百分比) } }, data: [], emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] }; this.request("http://localhost:8084/echarts/members").then(res=>{ charOption.series[0].data=res.data; charOption.series[1].data=res.data; myChart.setOption(charOption); pieOption.series[0].data=[ {name:"第一季度",value:res.data[0]}, {name:"第二季度",value:res.data[1]}, {name:"第三季度",value:res.data[2]}, {name:"第四季度",value:res.data[3]} ]; pieChart.setOption(pieOption); }) } } </script> <style scoped> </style>
还可以为home页添加一些统计汇总数据,统计数据当然可以从后端获取,比如做一个统计用户总量。其余三个中做了一些模拟数据。
前端Home.vue再加一个<el-row>
:放4个栅格。第一个使用插值方式取值{{total}}
<el-row :gutter="10" style="margin-bottom:60px"> <el-col :span="6"> <el-card style="color:#409EFF"> <div><i class="el-icon-user-solid"/>用户总量</div> <div style="padding:10px 0;text-align:center;font-weight:bold">{{total}}</div> </el-card> </el-col> <el-col :span="6"> <el-card style="color:#F56C6C"> <div><i class="el-icon-money"/>销售总量</div> <div style="padding:10px 0;text-align:center;font-weight:bold">¥1000000</div> </el-card> </el-col> <el-col :span="6"> <el-card style="color:#67C23A"> <div><i class="el-icon-bank-card"/>收益总额</div> <div style="padding:10px 0;text-align:center;font-weight:bold">¥30003</div> </el-card> </el-col> <el-col :span="6"> <el-card style="color:#409EFF"> <div style="color:#409EFF"><i class="el-icon-s-shop"/>门店总数</div> <div style="padding:10px 0;text-align:center;font-weight:bold">100</div> </el-card> </el-col> </el-row>
<template> <div> <el-row :gutter="10" style="margin-bottom:60px"> <el-col :span="6"> <el-card style="color:#409EFF"> <div><i class="el-icon-user-solid"/>用户总量</div> <div style="padding:10px 0;text-align:center;font-weight:bold">{{total}}</div> </el-card> </el-col> <el-col :span="6"> <el-card style="color:#F56C6C"> <div><i class="el-icon-money"/>销售总量</div> <div style="padding:10px 0;text-align:center;font-weight:bold">¥1000000</div> </el-card> </el-col> <el-col :span="6"> <el-card style="color:#67C23A"> <div><i class="el-icon-bank-card"/>收益总额</div> <div style="padding:10px 0;text-align:center;font-weight:bold">¥30003</div> </el-card> </el-col> <el-col :span="6"> <el-card style="color:#409EFF"> <div style="color:#409EFF"><i class="el-icon-s-shop"/>门店总数</div> <div style="padding:10px 0;text-align:center;font-weight:bold">100</div> </el-card> </el-col> </el-row> <el-row> <el-col :span="12"> <div id="main" style="width:500px; height:400px"></div> </el-col> <el-col :span="12"> <div id="pie" style="width:500px; height:400px"></div> </el-col> </el-row> </div> </template> <script> import * as echarts from 'echarts'; export default { name:"Home", data(){ return{ total:0 } }, mounted(){ //使用mounted的目的是为了等页面元素渲染之后再触发 var chartDom = document.getElementById('main'); var myChart = echarts.init(chartDom); var charOption; charOption = { title: { text: '各季度会员统计', subtext: '趋势图', left: 'center' }, xAxis: { type: 'category', data: ["第一季度","第二季度","第三季度","第四季度"] }, yAxis: { type: 'value' }, series: [ { data: [], type: 'line' }, { data: [], type: 'bar' } ] }; var pieDom = document.getElementById('pie'); var pieChart = echarts.init(pieDom); var pieOption; pieOption = { title: { text: '各季度会员统计', subtext: '比例图', left: 'center' }, tooltip: { trigger: 'item' }, legend: { orient: 'vertical', left: 'left' }, series: [ { type: 'pie', radius: '70%', label: { normal: { show: true, position: 'inner', textStyle:{ fontWeight:300, fontSize:16, color:"#fff" }, formatter: '{d}%' //自定义显示格式(b:name, c:value, d:百分比) } }, data: [], emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] }; this.request("http://localhost:8084/echarts/members").then(res=>{ console.log(res.data); charOption.series[0].data=res.data; charOption.series[1].data=res.data; this.total=res.data[4]; myChart.setOption(charOption); pieOption.series[0].data=[ {name:"第一季度",value:res.data[0]}, {name:"第二季度",value:res.data[1]}, {name:"第三季度",value:res.data[2]}, {name:"第四季度",value:res.data[3]} ]; pieChart.setOption(pieOption); }) } } </script> <style scoped> </style>
通过本次任务,大家能够:
(1)学会Echart图表工具的使用方法;
(2)学会前后端数据传递及图表获取数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。