在图表统计展示方面,笔者目前使用过的两种开源,分别是 Echats 和 G2Plot 组件,从个人使用上来讲前者应用更广、自定义开发更灵活,后者使用上更简单尤其是在数据绑的格式和方式上更友好,其中在我们使用 Element vue admin 集成分支项目中有关图表的例子基础就是Echats,比如其中的混合图表(柱形+折线) 对应源代码中代码位置依据可从 /views/chats 看到导入的是 echats 也就是说此组件的的使用方式同样通过添加依赖和导入即可使用。 结合提测平台的后台数据,接下来就实战下 Echarts 的图表的基础使用。微信搜索【大奇测试开】,关注这个坚持分享测试开发干货的家伙。
npm install echarts --save
执行完成后可以在 package.json 的 dependencies 配置有出现 "echarts": "^5.2.2"
步骤二:页面添加组件引用和定义一个容器<template> <div class="app-container"> <div ref="pieChartDemo" style="width: 600px;height:400px;"></div> </div> </template> <script> import * as echarts from 'echarts' ... </script>步骤三: 使用 echarts.init 方法初始化一个 echarts 实例并通过 setOption 方法生成一个简单饼图,余下配置代码如下(注意查看几处注解说明):
export default { name: 'EchartsDemo', // 使用mounted在页面控件加载在完成后mounted方法进行echart初始化非created mounted() { this.initPieChart() }, methods: { initPieChart() { // 采用的是vue ref的方式获取容器 var chartDom = this.$refs['pieChartDemo'] var myChart = echarts.init(chartDom) var option = { title: { text: '大奇测试开发', subtext: '文章类型分布', left: 'center' }, tooltip: { trigger: 'item' }, legend: { orient: 'vertical', left: 'left' }, series: [ { name: 'Access From', type: 'pie', radius: '50%', data: [ { value: 20, name: '提测平台' }, { value: 2, name: '性能测试' }, { value: 1, name: '流量回放' }, { value: 3, name: '好文分享' }, { value: 5, name: '杂谈' } ] } ] } option && myChart.setOption(option); } } }还可以定义div id 通过 getElementById 获取容器的方式替代this.$refs方式。
<div id="pieChartDemo" style="width: 600px;height:400px;"></div> ...略... var chartDom = document.getElementById('pieChartDemo')
最终添加项目演示菜单启动查看实现效果如图
# dashboard.py @test_dashboard.route("/api/dashboard/stacked", methods=['POST']) def get_request_stacked(): # body = json.loads(request.get_data()) connection = pool.connection() with connection.cursor() as cursor: sql_select = 'SELECT DATE_FORMAT(request.createDate,"%Y%u") weeks, apps.note, COUNT(apps.id) counts FROM request LEFT JOIN apps ON request.appId = apps.id GROUP BY weeks, apps.note;' cursor.execute(sql_select) table_data = cursor.fetchall() # 第一次循环过滤生成week和notes,并生成做临时关键词储备数据, # 用户第二次循环生成 series 需要数据 weeks = [] notes = [] key_value = {} for row in table_data: week = row['weeks'] note = row['note'] if not week in weeks: weeks.append(week) if not note in notes: notes.append(note) key_value[week+note] = row['counts'] # 做一个排序 小到大 weeks.sort() # 做对应日期下应用数据列表生成,没有数据的week用0填充,保证顺序长度一致 series = {} for note in notes: series[note] = [] for week in weeks: if week+note in key_value: series[note].append(key_value[week+note]) else: series[note].append(0) resp_data = { 'weeks': weeks, 'note': notes, 'series': series } resp = format.resp_format_success resp['data'] = resp_data return resp
用了两个for循环完成这个逻辑,其实也算是个小小算法题目,不知道你是否还有解法,欢迎留言探讨。 另外关于报告接口的实现是新增了一个dashboard.py类实现,所以不要忘记之前课程中反复做一些必要代码(完整代码参考github),启动运行后端服务,做个stacked接口请求测试。
<template> <div class="dashboard-container"> <div ref="LineChartBoard" style="width: 95%;height:500px;"></div> </div> </template> <script> import * as echarts from 'echarts' import { requestStacked } from '@/api/board' export default { name: 'Dashboard', mounted() { this.getApList() }, methods: { getApList() { requestStacked().then(resp => { this.initStackedChart(resp.data) }) }, initStackedChart(data) { const chartDom = this.$refs['LineChartBoard'] const myChart = echarts.init(chartDom) const series = [] // 唯一处理需要额外逻辑处理的地方,根据接口数据动态生成series数据 for (var key in data.series) { series.push( { name: key, type: 'line', stack: 'Total', areaStyle: {}, emphasis: { focus: 'series' }, data: data.series[key] } ) } var option = { title: { text: '周需求提测趋势' }, tooltip: { trigger: 'axis', axisPointer: { type: 'cross', label: { backgroundColor: '#6a7985' } } }, legend: { // 数据标题展示 data: data.note }, toolbox: { feature: { saveAsImage: {} } }, grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, xAxis: [ { type: 'category', boundaryGap: false, data: data.weeks } ], yAxis: [ { type: 'value' } ], series: series } option && myChart.setOption(option) } } } </script>
来吧万事俱备 $ npm run dev 看下实现效果吧。 本篇内容就这些,来回顾下学习内容,主要是以下知识点:
关于后续更多进展和分享欢迎持续关注公众号或博客。