大数据BI可视化(Echarts组件)项目开发-熟悉结合Vue开发图表组件7.0附带1/6商家销售统计(横向柱状图)

一.创建项目

创建

1.npm install  -g @vue/cli

   vue  create  vision

2.

3.

4.版本

5.是否使用历史路由

6.CSS预处理

7.ES标准配置

8.啥时候es标准提示-保存文件后

9.将配置文件放入单独文件中处理

10.需要保留新建项目以上设置

11.选择“Use PNPM”或者“Use NPM”

12.创建

13访问

删除无用项目代码

1.App.vue

2.

静态资源引入

项目的基本配置

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true
})
module.exports = {devServer: {port: 8888,open: true}
}

 

全局Echarts对象挂载

1.   

    <!-- 一旦通过script标签引入的echarts.js文件后,window.echarts -->

<script src="static/lib/echarts.min.js"></script>

2.

// 将全局的echarts对象挂载到vue的原型对象上

// 别的组件使用 this.$echarts

Vue.prototype.$echarts = window.echarts

axios的封装与挂载

1.npm install axios

2.调用

// eslint-disable-next-line no-unused-vars
import axios from 'axios'
// 请求基准路径的配置
axios.defaults.baseURL = 'http://127.0.0.1:8888/api'
// 将axios挂载到vue的原型对象上
// 在别的组件 this.$http
Vue.prototype.$http = axios

二.单独图表组件开发

模板

V1

 <template><div ></div>
</template><script>
export default {data () {return {}},methods: {},components: {}
}
</script><style lang=less scoped>
</style>

商家销售统计(横向柱状图)

1.组件结构的设计

1.1创建SellerPage.vue


 

<!--针对 /sellerpage  这条路径而显示出来的在这个组件中,通过子组件注册方式,显示出seller.vue这个组件--><template><div ></div>
</template><script>
export default {data () {return {}},methods: {},components: {}
}
</script><style lang=less scoped>
</style>
1.2Seller.vue 呈现图表组件

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {}},mounted () {},// 生命周期destroyed () {},methods: {}
}
</script><style lang=less scoped></style>
1.3router 注入SellerPage文件,路由设置;

import Vue from 'vue'
import VueRouter from 'vue-router'
import SellerPage from '@/views/SellerPage.vue'Vue.use(VueRouter)const routes = [{path: '/sellerpage',component: SellerPage}
]const router = new VueRouter({routes
})export default router
1.4app.vue 声明路由占位符

<template><div id="app"><!-- 路由占位符 --><router-view></router-view></div>
</template><style lang="less">
</style>
1.5访问sellerpage.vue内容

1.6通过sellerpage文件访问seller文件

<!--针对 /sellerpage  这条路径而显示出来的在这个组件中,通过子组件注册方式,显示出seller.vue这个组件--><template><div><seller></seller></div>
</template><script>
// eslint-disable-next-line no-unused-vars
import Seller from '@/components/Seller.vue'
export default {data () {return {}},methods: {},components: {// eslint-disable-next-line vue/no-unused-componentsseller: Seller}
}
</script><style lang=less scoped>
</style>

2.布局结构的设计

2.1seller文件设置样式

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {}},mounted () {},// 生命周期destroyed () {},methods: {}
}
</script><style lang=less scoped></style>
2.2sellerpage文件设置样式

<!--针对 /sellerpage  这条路径而显示出来的在这个组件中,通过子组件注册方式,显示出seller.vue这个组件--><template><div class="com-page"><seller></seller></div>
</template><script>
// eslint-disable-next-line no-unused-vars
import Seller from '@/components/Seller.vue'
export default {data () {return {}},methods: {},components: {// eslint-disable-next-line vue/no-unused-componentsseller: Seller}
}
</script><style lang=less scoped>
</style>
2.3在asset中编写css文件

html,body,#app {width: 100%;height: 100%;padding: 0;margin: 0;overflow: hidden;
}.com-page{width: 100%;height: 100%;overflow: hidden;
}.com-container{width: 100%;height: 100%;overflow: hidden;
}.com-chart{width: 100%;height: 100%;overflow: hidden;
}
3.4在main.js引入全局样式
// 引入全局的样式文件
import './assets/css/global.less'
 3.5查看

3.图表基本功能的实现

3.1initChart 初始化echartsinstance对象

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null}},mounted () {this.initChart()},// 生命周期destroyed () {},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref)},// 获取数据getData () {},// 更新图表updatechart () {}}
}
</script><style lang=less scoped></style>
3.2getData获取数据
3.2.1获取数据

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref)},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst ret = await this.$http.get('seller')console.log(ret)},// 更新图表updatechart () {}}
}
</script><style lang=less scoped></style>

 

 3.2.2提取data数据

    async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')console.log(ret)},

3.3updateChart跟新图表显示

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null // 服务器返回的数据}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref)},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 调用updatechartthis.updatechart()},// 更新图表updatechart () {// y轴// eslint-disable-next-line no-undefconst sellerNames = this.allData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = this.allData.map((item) => {return item.value})const option = {xAxis: {type: 'value'},yAxis: {type: 'category',data: sellerNames},series: [{type: 'bar',data: sellerValue}]}this.chartInstance.setOption(option)}}
}
</script><style lang=less scoped></style>

 

4.动态刷新的实现

4.1数据处理
4.1.1数据从小到大排序

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null // 服务器返回的数据}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref)},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 对数据排序this.allData.sort((a, b) => {return a.value - b.value // 从小到大})// 调用updatechartthis.updatechart()},// 更新图表updatechart () {// y轴// eslint-disable-next-line no-undefconst sellerNames = this.allData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = this.allData.map((item) => {return item.value})const option = {xAxis: {type: 'value'},yAxis: {type: 'category',data: sellerNames},series: [{type: 'bar',data: sellerValue}]}this.chartInstance.setOption(option)}}
}
</script><style lang=less scoped></style>

4.1.2每五个元素一页
  • currentPage 第几页
  • totaPage 总共几页

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null, // 服务器返回的数据currentPage: 1, // 当前显示的页数totalPage: 0 // 一共有多少页}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref)},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 对数据排序this.allData.sort((a, b) => {return a.value - b.value // 从小到大})// 每5个元素显示一页this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : this.allData.length / 5 + 1// 调用updatechartthis.updatechart()},// 更新图表updatechart () {const start = (this.currentPage - 1) * 5const end = this.currentPage * 5// eslint-disable-next-line no-unused-varsconst showData = this.allData.slice(start, end)// y轴// eslint-disable-next-line no-undefconst sellerNames = showData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = showData.map((item) => {return item.value})const option = {xAxis: {type: 'value'},yAxis: {type: 'category',data: sellerNames},series: [{type: 'bar',data: sellerValue}]}this.chartInstance.setOption(option)}}
}
</script><style lang=less scoped></style>

 

4.2启动和停止的时机
4.2.1获取数据之后
  • 启动定时器

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null, // 服务器返回的数据currentPage: 1, // 当前显示的页数totalPage: 0 // 一共有多少页}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref)},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 对数据排序this.allData.sort((a, b) => {return a.value - b.value // 从小到大})// 每5个元素显示一页this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : this.allData.length / 5 + 1// 调用updatechartthis.updatechart()// 启动定时器this.startInterval()},// 更新图表updatechart () {const start = (this.currentPage - 1) * 5const end = this.currentPage * 5// eslint-disable-next-line no-unused-varsconst showData = this.allData.slice(start, end)// y轴// eslint-disable-next-line no-undefconst sellerNames = showData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = showData.map((item) => {return item.value})const option = {xAxis: {type: 'value'},yAxis: {type: 'category',data: sellerNames},series: [{type: 'bar',data: sellerValue}]}this.chartInstance.setOption(option)},startInterval () {setInterval(() => {this.currentPage++if (this.currentPage > this.totalPage) {this.currentPage = 1}this.updatechart()}, 3000)}}
}
</script><style lang=less scoped></style>

 

  • 关闭定时器 

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null, // 服务器返回的数据currentPage: 1, // 当前显示的页数totalPage: 0 // 一共有多少页}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {clearInterval(this.timerId)},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref)},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 对数据排序this.allData.sort((a, b) => {return a.value - b.value // 从小到大})// 每5个元素显示一页this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : this.allData.length / 5 + 1// 调用updatechartthis.updatechart()// 启动定时器this.startInterval()},// 更新图表updatechart () {const start = (this.currentPage - 1) * 5const end = this.currentPage * 5// eslint-disable-next-line no-unused-varsconst showData = this.allData.slice(start, end)// y轴// eslint-disable-next-line no-undefconst sellerNames = showData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = showData.map((item) => {return item.value})const option = {xAxis: {type: 'value'},yAxis: {type: 'category',data: sellerNames},series: [{type: 'bar',data: sellerValue}]}this.chartInstance.setOption(option)},startInterval () {if (this.timerId) {clearInterval(this.timerId)}this.timerId = setInterval(() => {this.currentPage++if (this.currentPage > this.totalPage) {this.currentPage = 1}this.updatechart()}, 3000)}}
}
</script><style lang=less scoped></style>
4.2.2鼠标移出图表时启动定时器

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null, // 服务器返回的数据currentPage: 1, // 当前显示的页数totalPage: 0 // 一共有多少页}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {clearInterval(this.timerId)},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref)},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 对数据排序this.allData.sort((a, b) => {return a.value - b.value // 从小到大})// 每5个元素显示一页this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : this.allData.length / 5 + 1// 调用updatechartthis.updatechart()// 启动定时器this.startInterval()},// 更新图表updatechart () {const start = (this.currentPage - 1) * 5const end = this.currentPage * 5// eslint-disable-next-line no-unused-varsconst showData = this.allData.slice(start, end)// y轴// eslint-disable-next-line no-undefconst sellerNames = showData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = showData.map((item) => {return item.value})const option = {xAxis: {type: 'value'},yAxis: {type: 'category',data: sellerNames},series: [{type: 'bar',data: sellerValue}]}this.chartInstance.setOption(option)// 对图表对象进行鼠标事件的监听this.chartInstance.on('mouseover', () => {clearInterval(this.timerId)})this.chartInstance.on('mouseout', () => {this.startInterval()})},startInterval () {if (this.timerId) {clearInterval(this.timerId)}this.timerId = setInterval(() => {this.currentPage++if (this.currentPage > this.totalPage) {this.currentPage = 1}this.updatechart()}, 3000)}}
}
</script><style lang=less scoped></style>
4.3边界值的处理

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null, // 服务器返回的数据currentPage: 1, // 当前显示的页数totalPage: 0 // 一共有多少页}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {clearInterval(this.timerId)},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref)},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 对数据排序this.allData.sort((a, b) => {return a.value - b.value // 从小到大})// 每5个元素显示一页this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : this.allData.length / 5 + 1// 调用updatechartthis.updatechart()// 启动定时器this.startInterval()},// 更新图表updatechart () {const start = (this.currentPage - 1) * 5const end = this.currentPage * 5// eslint-disable-next-line no-unused-varsconst showData = this.allData.slice(start, end)// y轴// eslint-disable-next-line no-undefconst sellerNames = showData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = showData.map((item) => {return item.value})const option = {xAxis: {type: 'value'},yAxis: {type: 'category',data: sellerNames},series: [{type: 'bar',data: sellerValue}]}this.chartInstance.setOption(option)// 对图表对象进行鼠标事件的监听this.chartInstance.on('mouseover', () => {clearInterval(this.timerId)})this.chartInstance.on('mouseout', () => {this.startInterval()})},startInterval () {if (this.timerId) {clearInterval(this.timerId)}this.timerId = setInterval(() => {this.currentPage++if (this.currentPage > this.totalPage) {this.currentPage = 1}this.updatechart()}, 3000)}}
}
</script><style lang=less scoped></style>

5.UI调整

5.1主题使用

<!DOCTYPE html>
<html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1.0"><link rel="icon" href="<%= BASE_URL %>favicon.ico"><title><%= htmlWebpackPlugin.options.title %></title></head><body><noscript><strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><!-- built files will be auto injected --><!-- 一旦通过script标签引入的echarts.js文件后,window.echarts --><script src="static/lib/echarts.min.js"></script><!-- 引入主题的js文件 --><script src="static/theme/chalk.js"></script>    </body>
</html>

<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null, // 服务器返回的数据currentPage: 1, // 当前显示的页数totalPage: 0 // 一共有多少页}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {clearInterval(this.timerId)},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref, 'chalk')},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 对数据排序this.allData.sort((a, b) => {return a.value - b.value // 从小到大})// 每5个元素显示一页this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : this.allData.length / 5 + 1// 调用updatechartthis.updatechart()// 启动定时器this.startInterval()},// 更新图表updatechart () {const start = (this.currentPage - 1) * 5const end = this.currentPage * 5// eslint-disable-next-line no-unused-varsconst showData = this.allData.slice(start, end)// y轴// eslint-disable-next-line no-undefconst sellerNames = showData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = showData.map((item) => {return item.value})const option = {xAxis: {type: 'value'},yAxis: {type: 'category',data: sellerNames},series: [{type: 'bar',data: sellerValue}]}this.chartInstance.setOption(option)// 对图表对象进行鼠标事件的监听this.chartInstance.on('mouseover', () => {clearInterval(this.timerId)})this.chartInstance.on('mouseout', () => {this.startInterval()})},startInterval () {if (this.timerId) {clearInterval(this.timerId)}this.timerId = setInterval(() => {this.currentPage++if (this.currentPage > this.totalPage) {this.currentPage = 1}this.updatechart()}, 3000)}}
}
</script><style lang=less scoped></style>

5.2图表的圆角

html,body,#app {width: 100%;height: 100%;padding: 0;margin: 0;overflow: hidden;
}.com-page{width: 100%;height: 100%;overflow: hidden;
}.com-container{width: 100%;height: 100%;overflow: hidden;
}.com-chart{width: 100%;height: 100%;overflow: hidden;
}//图表圆角
canvas {border-radius: 20px;}

5.3图表的标题

        title: {text: '▎商家销售统计',textStyle: {fontSize: 66},

 

5.4坐标轴的位置

        grid: {top: '20%',left: '3%',right: '6%',bottom: '3%',containLabel: true // 距离是包含坐标轴上的文字},

 

5.5柱状图条目
  • 宽度

        series: [{type: 'bar',data: sellerValue,barWidth: 66}]

  • 文字

            label: {show: true,position: 'right',textStyle: {color: 'white'}}

  • 右边圆角

            itemStyle: {barBorderRadius: [0, 33, 33, 0]}

  • 颜色渐变

              // 指明颜色渐变的方向// 指明不同百分比之下颜色的值color: new this.$echarts.graphic.LinearGradient(0, 0, 1, 0, [// 百分之0状态之下的颜色值{offset: 0,color: '#5052EE'},// 百分之100状态之下的颜色值{offset: 1,color: '#AB6EE5'}])

  • 背景

        tooltip: {trigger: 'axis', // 鼠标移动坐标轴触发axisPointer: { // 触发的样式type: 'line', // 类型z: 0, // 层级lineStyle: {width: 66, // 宽度color: '#2D3443' // 颜色}}},

 

6.拆分图表的option

保留拆分前代码
<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null, // 服务器返回的数据currentPage: 1, // 当前显示的页数totalPage: 0 // 一共有多少页}},mounted () {this.initChart()this.getData()},// 生命周期destroyed () {clearInterval(this.timerId)},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref, 'chalk')},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 对数据排序this.allData.sort((a, b) => {return a.value - b.value // 从小到大})// 每5个元素显示一页this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : this.allData.length / 5 + 1// 调用updatechartthis.updatechart()// 启动定时器this.startInterval()},// 更新图表updatechart () {const start = (this.currentPage - 1) * 5const end = this.currentPage * 5// eslint-disable-next-line no-unused-varsconst showData = this.allData.slice(start, end)// y轴// eslint-disable-next-line no-undefconst sellerNames = showData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = showData.map((item) => {return item.value})const option = {title: {text: '▎商家销售统计',textStyle: {fontSize: 66},left: 20,top: 20},grid: {top: '20%',left: '3%',right: '6%',bottom: '3%',containLabel: true // 距离是包含坐标轴上的文字},xAxis: {type: 'value'},yAxis: {type: 'category',data: sellerNames},tooltip: {trigger: 'axis', // 鼠标移动坐标轴触发axisPointer: { // 触发的样式type: 'line', // 类型z: 0, // 层级lineStyle: {width: 66,color: '#2D3443' // 颜色}}},series: [{type: 'bar',data: sellerValue,barWidth: 66,label: {show: true,position: 'right',textStyle: {color: 'white'}},itemStyle: {barBorderRadius: [0, 33, 33, 0],// 指明颜色渐变的方向// 指明不同百分比之下颜色的值color: new this.$echarts.graphic.LinearGradient(0, 0, 1, 0, [// 百分之0状态之下的颜色值{offset: 0,color: '#5052EE'},// 百分之100状态之下的颜色值{offset: 1,color: '#AB6EE5'}])}}]}this.chartInstance.setOption(option)// 对图表对象进行鼠标事件的监听this.chartInstance.on('mouseover', () => {clearInterval(this.timerId)})this.chartInstance.on('mouseout', () => {this.startInterval()})},startInterval () {if (this.timerId) {clearInterval(this.timerId)}this.timerId = setInterval(() => {this.currentPage++if (this.currentPage > this.totalPage) {this.currentPage = 1}this.updatechart()}, 3000)}}
}
</script><style lang=less scoped></style>

 

6.1初始化配置initOption

      // 对图表初始化配置的控制const initOption = {title: {text: '▎商家销售统计',textStyle: {fontSize: 66},left: 20,top: 20},grid: {top: '20%',left: '3%',right: '6%',bottom: '3%',containLabel: true // 距离是包含坐标轴上的文字},xAxis: {type: 'value'},yAxis: {type: 'category'},tooltip: {trigger: 'axis', // 鼠标移动坐标轴触发axisPointer: { // 触发的样式type: 'line', // 类型z: 0, // 层级lineStyle: {width: 66,color: '#2D3443' // 颜色}}},series: [{type: 'bar',barWidth: 66,label: {show: true,position: 'right',textStyle: {color: 'white'}},itemStyle: {barBorderRadius: [0, 33, 33, 0],// 指明颜色渐变的方向// 指明不同百分比之下颜色的值color: new this.$echarts.graphic.LinearGradient(0, 0, 1, 0, [// 百分之0状态之下的颜色值{offset: 0,color: '#5052EE'},// 百分之100状态之下的颜色值{offset: 1,color: '#AB6EE5'}])}}]}this.chartInstance.setOption(initOption)

 

6.2获取数据之后的配置dataOption

      const dataOption = {yAxis: {data: sellerNames},series: [{data: sellerValue}]}this.chartInstance.setOption(dataOption)
6.3分辨率适配的配置adapterOption
  •  监听窗口大小变化的事件

  • 获取图表容器的宽度

  • 设置新的option
    • 标题文字大小
    • 柱的宽度
    • 柱的圆角
    • 阴影背景宽度

 

  • 图表实例对象resize

 取消监听

  // 生命周期destroyed () {clearInterval(this.timerId)// 在组件销毁的时候, 需要将监听器取消掉window.removeEventListener('resize', this.screenAdapter)},

 代码

  mounted () {this.initChart()this.getData()// 窗口发生变动自动调用screenAdapter方法window.addEventListener('resize', this.screenAdapter)// 在页面加载完成的时候, 主动进行屏幕的适配this.screenAdapter()},

 

  // 生命周期destroyed () {clearInterval(this.timerId)// 在组件销毁的时候, 需要将监听器取消掉window.removeEventListener('resize', this.screenAdapter)},
    // 当浏览器的大小发生变化的时候, 会调用的方法, 来完成屏幕的适配screenAdapter () {// console.log(this.$refs.seller_ref.offsetWidth)const titleFontSize = this.$refs.seller_ref.offsetWidth / 100 * 3.6// 和分辨率大小相关的配置项const adapterOption = {title: {textStyle: {fontSize: titleFontSize}},tooltip: {axisPointer: {lineStyle: {width: titleFontSize}}},series: [{barWidth: titleFontSize,itemStyle: {barBorderRadius: [0, titleFontSize / 2, titleFontSize / 2, 0]}}]}this.chartInstance.setOption(adapterOption)// 手动的调用图表对象的resize 才能产生效果this.chartInstance.resize()}
拆分后代码 
<!-- eslint-disable vue/multi-word-component-names -->
<!--  商家销量统计的横向柱状图-->
<template><div class="com-container"><div class="com-chart" ref="seller_ref"></div></div></template><script>
export default {data () {return {chartInstance: null,allData: null, // 服务器返回的数据currentPage: 1, // 当前显示的页数totalPage: 0 // 一共有多少页}},mounted () {this.initChart()this.getData()// 窗口发生变动自动调用screenAdapter方法window.addEventListener('resize', this.screenAdapter)// 在页面加载完成的时候, 主动进行屏幕的适配this.screenAdapter()},// 生命周期destroyed () {clearInterval(this.timerId)// 在组件销毁的时候, 需要将监听器取消掉window.removeEventListener('resize', this.screenAdapter)},methods: {// 初始化echartsinstance对象initChart () {this.chartInstance = this.$echarts.init(this.$refs.seller_ref, 'chalk')// 对图表初始化配置的控制const initOption = {title: {text: '▎商家销售统计',left: 20,top: 20},grid: {top: '20%',left: '3%',right: '6%',bottom: '3%',containLabel: true // 距离是包含坐标轴上的文字},xAxis: {type: 'value'},yAxis: {type: 'category'},tooltip: {trigger: 'axis', // 鼠标移动坐标轴触发axisPointer: { // 触发的样式type: 'line', // 类型z: 0, // 层级lineStyle: {color: '#2D3443' // 颜色}}},series: [{type: 'bar',label: {show: true,position: 'right',textStyle: {color: 'white'}},itemStyle: {// 指明颜色渐变的方向// 指明不同百分比之下颜色的值color: new this.$echarts.graphic.LinearGradient(0, 0, 1, 0, [// 百分之0状态之下的颜色值{offset: 0,color: '#5052EE'},// 百分之100状态之下的颜色值{offset: 1,color: '#AB6EE5'}])}}]}this.chartInstance.setOption(initOption)},// 获取数据async getData () {// http://127.0.0.1:8888/api/sellerconst { data: ret } = await this.$http.get('seller')// console.log(ret)this.allData = ret// 对数据排序this.allData.sort((a, b) => {return a.value - b.value // 从小到大})// 每5个元素显示一页this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : this.allData.length / 5 + 1// 调用updatechartthis.updatechart()// 启动定时器this.startInterval()},// 更新图表updatechart () {const start = (this.currentPage - 1) * 5const end = this.currentPage * 5// eslint-disable-next-line no-unused-varsconst showData = this.allData.slice(start, end)// y轴// eslint-disable-next-line no-undefconst sellerNames = showData.map((item) => {return item.name})// x轴// eslint-disable-next-line no-undefconst sellerValue = showData.map((item) => {return item.value})const dataOption = {yAxis: {data: sellerNames},series: [{data: sellerValue}]}this.chartInstance.setOption(dataOption)// 对图表对象进行鼠标事件的监听this.chartInstance.on('mouseover', () => {clearInterval(this.timerId)})this.chartInstance.on('mouseout', () => {this.startInterval()})},startInterval () {if (this.timerId) {clearInterval(this.timerId)}this.timerId = setInterval(() => {this.currentPage++if (this.currentPage > this.totalPage) {this.currentPage = 1}this.updatechart()}, 3000)},// 当浏览器的大小发生变化的时候, 会调用的方法, 来完成屏幕的适配screenAdapter () {// console.log(this.$refs.seller_ref.offsetWidth)const titleFontSize = this.$refs.seller_ref.offsetWidth / 100 * 3.6// 和分辨率大小相关的配置项const adapterOption = {title: {textStyle: {fontSize: titleFontSize}},tooltip: {axisPointer: {lineStyle: {width: titleFontSize}}},series: [{barWidth: titleFontSize,itemStyle: {barBorderRadius: [0, titleFontSize / 2, titleFontSize / 2, 0]}}]}this.chartInstance.setOption(adapterOption)// 手动的调用图表对象的resize 才能产生效果this.chartInstance.resize()}}
}
</script><style lang=less scoped></style>

 

 总结:

        本次文章讲解项目创建以及1/6商家销售统计(横向柱状图)组件开发,请关注后续指标开发,最终整合大屏可视化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五一假期零碎时间练习学习过的内容(商城版)

目录 1 总览1.1 技术架构1.2 其他1.2.1 数据库1.2.2 后端部分1.2.2.1 复习feign1.2.2.2 复习下网关网关的核心功能特性&#xff1a;网关路由的流程断言工厂过滤器工厂全局过滤器 过滤器执行顺序解决跨域问题 1.2.2.3 es部分复习 1.2.3 前端部分 2 day1 配置网关2.1 任务2.2 网关…

【4088】基于小程序实现的二手物品交易系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

pandas学习笔记11

DataFrame结构 DataFrame 一个表格型的数据结构&#xff0c;既有行标签&#xff08;index&#xff09;&#xff0c;又有列标签&#xff08;columns&#xff09;&#xff0c;它也被称异构数据表&#xff0c;所谓异构&#xff0c;指的是表格中每列的数据类型可以不同&#xff0c;…

目标检测算法YOLOv5简介

没有关于YOLOv5的直接论文&#xff0c;YOLOv5由Ultralytics维护&#xff0c;源码见&#xff1a;https://github.com/ultralytics/yolov5 &#xff0c;于2020年6月发布v1.0版本&#xff0c;最新发布版本为v7.0&#xff0c;License为AGPL-3.0. 以下内容主要来自&#xff1a; 1. U…

2024.4.29 Pandas day01 基础语法

pandas是python的一个数据库&#xff0c;在使用数据库的时候需要输入 import pandas as pd 引入&#xff0c; df pd.read.csv(文件路径“&#xff09;&#xff1a;这是利用pandas数据库读取CSV文件的方法&#xff0c;如果读取EXCEL文件或者其他文件&#xff0c;csv文件换成其他…

库存管理系统开源啦

软件介绍 ModernWMS是一个针对小型物流仓储供应链流程的开源库存管理系统。该系统的开发初衷是为了满足中小型企业在有限IT预算下对仓储管理的需求。通过总结多年ERP系统研发经验&#xff0c;项目团队开发了这套适用于中小型企业的系统&#xff0c;以帮助那些有特定需求的用户。…

Python-Socket编程实现tcp-udp通信

本文章是记录我准备大创项目时学的socket编程的用法&#xff0c;纯属记录生活&#xff0c;没有教学意义&#xff0c;视频我是看b站up主王铭东学的&#xff0c;讲的很详细&#xff0c;我只粗略学了个大概&#xff0c;我想要通过tcp&#xff0c;udp传输yolo目标检测中的物体坐标信…

C语言中的goto语句

goto label; C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。 #include <stdio.h> int main(){goto first;printf("我是你好\n");first:printf("nihao\n");second:printf("This is 2\n");return 0; } 使用goto会…

== 和 equals()区别,equals()重写问题

对于引用类型&#xff1a;比较的是两个引用是否相同&#xff08;所指的是否为同一个对象&#xff09;&#xff0c;注&#xff1a;如果两个引用所指的对象内容一样&#xff0c;但是不是同一个对象&#xff08;hashcode不一样&#xff09;&#xff0c;依然返回false&#xff0c;随…

MYSQL数据目录结构上篇-表在文件系统中表示

前言感悟:我个人是比较不喜欢只会用,不太懂为什么的这么用,而且有的时候很多官方术 语让人难以读懂, 这里我会用比较大白话的方式,让我自己也能让网友们更加理解,如果书写哪里有误,欢迎大家指出((,,•ω•)ノ"(っω•&#xff40;。)) 从入门开始啦推荐一个学习mysql的视频…

在GPU上加速RWKV6模型的Linear Attention计算

精简版&#xff1a;经过一些profile发现flash-linear-attention中的rwkv6 linear attention算子的表现比RWKV-CUDA中的实现性能还要更好&#xff0c;然后也看到了继续优化triton版本kernel的线索。接着还分析了一下rwkv6 cuda kernel的几次开发迭代以此说明对于不懂cuda以及平时…

基于Springboot的房屋租赁管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的房屋租赁管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

【机器学习】Ctrl-Adapter:视频生成领域的革新者

Ctrl-Adapter&#xff1a;视频生成领域的革新者 一、ControlNets的挑战与Ctrl-Adapter的应运而生二、Ctrl-Adapter的技术原理与实现三、Ctrl-Adapter的应用实例与性能表现四、Ctrl-Adapter的意义与未来展望 随着人工智能技术的飞速发展&#xff0c;图像与视频生成领域正经历着前…

【busybox记录】【shell指令】cksum

目录 内容来源&#xff1a; 【GUN】【cksum】指令介绍 【busybox】【cksum】指令介绍 【linux】【cksum】指令介绍 使用示例&#xff1a; 计算校验和 - 传统输出格式 默认输出 - 基础POSIX标准32位CRC校验和 其他校验指令对参数有更好的支持&#xff0c;请看其他校验指…

一篇文章带你深入了解“指针”

一篇文章带你深入了解“指针” 内存和地址了解指针指针类型const修饰指针指针的运算指针与整数之间的运算指针与指针之间的运算指针的关系运算 void* 指针传值调用和传址调用数组和指针的关系野指针野指针的形成原因规避野指针 二级指针字符指针指针数组数组指针数组传参一维数…

灌溉机器人 状压dp

灌溉机器人 题目描述 农田灌溉是一项十分费体力的农活&#xff0c;特别是大型的农田。小明想为农民伯伯们减轻农作负担&#xff0c;最近在研究一款高科技——灌溉机器人。它可以在远程电脑控制下&#xff0c;给农田里的作物进行灌溉。 现在有一片 N 行 M 列的农田。农田的土…

Java Jackson-jr 库是干什么用的

Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API&#xff0c;Jackson-jr 的启动速度更快&#xff0c;包大小更小。 虽然Jackson databind&#xff08;如ObjectMapper&#xff09;是通用数据绑定的良好选择&#…

三维重建(SFM)与实时定位建图(SLAM)的区分与联系

1、SLAM SLAM是Simultaneous Location and Mapping&#xff0c;同时定位与地图构建。是指搭载特定传感器的主体&#xff0c;在没有环境先验信息的情况下&#xff0c;于运动过程中建立环境的模型&#xff0c;同时估计自己的运动。目的是解决自主机器人“定位”和“建图”两个问题…

OpenCV多张图片堆叠显示

OpenCV实现多张图片堆叠显示 程序思路效果代码 程序思路 读取两张或多张图片&#xff1b;获取图片尺寸&#xff1b;选择多张图片中较大的宽度和高度建立画布&#xff1b;合并图片到画布&#xff1b; 效果 代码 import cv2 import numpy as np# 读取两张图片 img1 cv2.imrea…

C# Web控件与数据感应之 TreeView 类

目录 关于 TreeView 一些区别 准备数据源 范例运行环境 一些实用方法 获取数据进行呈现 ​根据ID设置节点 获取所有结点的索引 小结 关于 TreeView 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;本文将继续介绍与…