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

news2024/11/28 0:35:48

一.创建项目

创建

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-components
    seller: 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-components
    seller: 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/seller
      const 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/seller
      const { 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/seller
      const { data: ret } = await this.$http.get('seller')
      // console.log(ret)
      this.allData = ret
      // 调用updatechart
      this.updatechart()
    },
    // 更新图表
    updatechart () {
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = this.allData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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/seller
      const { data: ret } = await this.$http.get('seller')
      // console.log(ret)
      this.allData = ret
      // 对数据排序
      this.allData.sort((a, b) => {
        return a.value - b.value // 从小到大
      })
      // 调用updatechart
      this.updatechart()
    },
    // 更新图表
    updatechart () {
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = this.allData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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/seller
      const { 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
      // 调用updatechart
      this.updatechart()
    },
    // 更新图表
    updatechart () {
      const start = (this.currentPage - 1) * 5
      const end = this.currentPage * 5
      // eslint-disable-next-line no-unused-vars
      const showData = this.allData.slice(start, end)
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = showData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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/seller
      const { 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
      // 调用updatechart
      this.updatechart()
      // 启动定时器
      this.startInterval()
    },
    // 更新图表
    updatechart () {
      const start = (this.currentPage - 1) * 5
      const end = this.currentPage * 5
      // eslint-disable-next-line no-unused-vars
      const showData = this.allData.slice(start, end)
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = showData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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/seller
      const { 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
      // 调用updatechart
      this.updatechart()
      // 启动定时器
      this.startInterval()
    },
    // 更新图表
    updatechart () {
      const start = (this.currentPage - 1) * 5
      const end = this.currentPage * 5
      // eslint-disable-next-line no-unused-vars
      const showData = this.allData.slice(start, end)
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = showData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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/seller
      const { 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
      // 调用updatechart
      this.updatechart()
      // 启动定时器
      this.startInterval()
    },
    // 更新图表
    updatechart () {
      const start = (this.currentPage - 1) * 5
      const end = this.currentPage * 5
      // eslint-disable-next-line no-unused-vars
      const showData = this.allData.slice(start, end)
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = showData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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/seller
      const { 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
      // 调用updatechart
      this.updatechart()
      // 启动定时器
      this.startInterval()
    },
    // 更新图表
    updatechart () {
      const start = (this.currentPage - 1) * 5
      const end = this.currentPage * 5
      // eslint-disable-next-line no-unused-vars
      const showData = this.allData.slice(start, end)
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = showData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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/seller
      const { 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
      // 调用updatechart
      this.updatechart()
      // 启动定时器
      this.startInterval()
    },
    // 更新图表
    updatechart () {
      const start = (this.currentPage - 1) * 5
      const end = this.currentPage * 5
      // eslint-disable-next-line no-unused-vars
      const showData = this.allData.slice(start, end)
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = showData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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/seller
      const { 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
      // 调用updatechart
      this.updatechart()
      // 启动定时器
      this.startInterval()
    },
    // 更新图表
    updatechart () {
      const start = (this.currentPage - 1) * 5
      const end = this.currentPage * 5
      // eslint-disable-next-line no-unused-vars
      const showData = this.allData.slice(start, end)
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = showData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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/seller
      const { 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
      // 调用updatechart
      this.updatechart()
      // 启动定时器
      this.startInterval()
    },
    // 更新图表
    updatechart () {
      const start = (this.currentPage - 1) * 5
      const end = this.currentPage * 5
      // eslint-disable-next-line no-unused-vars
      const showData = this.allData.slice(start, end)
      // y轴
      // eslint-disable-next-line no-undef
      const sellerNames = showData.map((item) => {
        return item.name
      })
      // x轴
      // eslint-disable-next-line no-undef
      const 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.coloradmin.cn/o/1670935.html

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

相关文章

时间瑾眼中的IT行业现状与未来趋势

文章目录 技术革新与行业应用IT行业的人才培养与教育人工智能与机器学习的演进数据安全与隐私保护可持续发展与绿色技术社会责任与道德规范 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链…

AI 入门:AI 提示词如何入门?这篇就够了!(含提示词)

先看案例&#xff0c;一目了然 一个通用的提示词案例&#xff1a; 普通的提示词&#xff1a; 我给你我写的参考文章&#xff0c;请你学习我的风格来根据主题创作1篇文章。请你根据我给你的参考文章&#xff0c;学习我的写作风格&#xff0c;并进行风格学习模仿创作。为了更好…

python智能电力监控与资费电费缴纳管理系统vue+django

本系统的设计与实现共包含6个表:分别是配置文件信息表&#xff0c;电力记录信息表&#xff0c;故障报修信息表&#xff0c;缴费订单信息表&#xff0c;用户表信息表&#xff0c;用户信息表&#xff0c; 本文所设计的电费缴纳系统的设计与实现拥有前端和后端&#xff0c;前端使…

【声呐仿真】学习记录3.5-docker中Gazebo是否使用GPU?解决声呐图像黑屏

【声呐仿真】学习记录3.5-docker中Gazebo是否使用GPU&#xff1f;解决声呐图像黑屏 &#x1f921;打包镜像&#xff0c;重装驱动&#xff08;失败&#xff09;Xorg重新配置DAVE环境&#xff08;补充之前教程中的一些细节&#xff09;解决声呐图像黑屏问题 在容器中运行 roslau…

在ubuntu中使用python

在ubuntu中使用python ubuntu20版本中已经涵盖了python3&#xff0c;需要使用python3命令去运行 可以使用命令 python3 --version 进行检查 ubuntu20版本中已经涵盖了python3&#xff0c;需要使用python3命令去运行 可以使用命令 python3 --version 进行

基于STM32F401RET6智能锁项目(AT24C0X存储芯片)

一、IIC基本介绍 1、IIC通信接口 • I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线 • 两根通信线&#xff1a;SCL&#xff08;串行时钟线&#xff09;、SDA&#xff08;串行数据线&#xff09; • 同步&#xff0c;半双工 • 带数据应答 •…

长途火车~48小时记录

1.出门记得带大功率充电宝&#xff0c;最好是50000ma及以上的&#xff0c;不然还没上火车&#xff0c;手机就没电了&#xff0c;电量焦虑症又来了。手机有电就有无限可能。

家政服务新体验——家政小程序开发,让生活更轻松!

一、引言 随着现代生活节奏的加快&#xff0c;家政服务已经成为越来越多家庭不可或缺的一部分。然而&#xff0c;传统家政服务方式往往存在预约不便、服务质量参差不齐等问题。为了解决这些问题&#xff0c;我们精心打造了一款家政小程序&#xff0c;为您带来全新的家政服务体…

【送书福利第七期】你好!Java(文末送书)

文章目录 编辑推荐内容简介作者简介目录前言/序言 编辑推荐 适读人群 &#xff1a;程序员;相关院校师生 本书以轻松幽默的语言&#xff0c;从零开始介绍Java语言。书名来源于编程语言中最经典的Hello World程序&#xff0c;寓意带读者从入门到精通。 书中每章都设有总结与扩展…

绝地求生PUBG初版艾伦格回归 初版艾伦格和新版有什么区别

PUBG终于迎来了经典的旧版艾伦格地图的回归&#xff01;我们希望通过本次经典艾伦格的回归为大家带回记忆中那一幕幕熟悉的场景&#xff0c;并让大家好好回味一番当年与好友们共同冒险的峥嵘岁月&#xff01;还怀念从前为了抢到自己最爱的武器而飞奔的日日夜夜吗&#xff1f;那…

从编辑器角度来理解定义和声明

报错,在函数里面(包括int main函数)extern声明会和定义冲突 下面这种写法就很ok 静态变量的反汇编 #include<iostream> using namespace std; extern int c; int ma

如何在 CloudFlare 里屏蔽/拦截某个 IP 或者 IP 地址段

最近除了接的 CloudFlare 代配置订单基本很少折腾自己的 CloudFlare 配置了,今天给大家简单的讲解一下如何在 CloudFlare 里屏蔽/拦截 IP 地址和 IP 地址段,虽然明月一直都很反感针对 IP 的屏蔽拦截,但不得不说有时候还是很有必要的。并且,既然可以拦截屏蔽 IP 自然也可以但…

【机器学习】人力资源管理的新篇章:AI驱动的高效与智能化

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

共享云桌面到底有哪些优势?

共享云桌面作为一种新兴的云桌面技术&#xff0c;近年来在企业设计和办公环境中得到了广泛的应用。它通过将物理服务器的计算资源共享化&#xff0c;实现多个用户共享同一台服务器的桌面环境&#xff0c;从而带来了诸多明显的优势。 企业在用传统办公电脑和虚拟云桌面的过程中…

一键批量剪辑,轻松上手:视频剪辑随机分割技巧全解析

在数字化时代&#xff0c;视频剪辑已经成为许多人日常生活和工作中的必备技能。无论是为了制作一部精美的短视频&#xff0c;还是为了将长视频分割成多个片段&#xff0c;掌握视频剪辑技巧都显得尤为重要。本文将为您详细解析云炫AI智剪一键批量剪辑随机分割技巧&#xff0c;帮…

数据中心--AI时代的“炼油厂”

数据中心正在成为AI时代的“炼油厂”&#xff01; 众所周知&#xff0c;AI的高歌猛进催生了对数据的海量处理需求。为了满足蓬勃的算力需求&#xff0c;全球开启了新一轮的数据中心建设热潮&#xff0c;数据中心业务正在以指数级的速度疯狂扩张。 此番情景&#xff0c;和第二…

VMamba模型

VMamba模型 摘要Abstract1. VMamba模型1.1 文献摘要1.2 研究背景1.3 状态空间模型&#xff08;SSM&#xff09;1.4 VMamba架构1.5 实验1.5.1 ImageNet-1K 上的图像分类1.5.2 COCO 上的物体检测 总结2. pytorch练习 摘要 本周阅读了 VMamba: Visual State Space ModelVMamba 这…

Linux内核下RAS(Reliability, Availability and Serviceability)功能分析记录

1 简介 Reliability, Availability and Serviceability (RAS) — The Linux Kernel documentation 在服务器 和 卫星等领域&#xff0c;对设备的稳定性要求很高&#xff0c;需要及时的发现并处理软/硬件上的错误。RAS功能可以用来及时的发现硬件上的错误。 RAS功能需要硬件的…

网页版五子棋的自动化测试

目录 前言 一、主要技术 二、测试环境的准备部署 三、测试用例 四、执行测试 4.1、公共类设计 创建浏览器驱动对象 测试套件 释放驱动类 4.2、功能测试 登录页面 注册页面 游戏大厅页面 游戏房间页面 测试套件结果 4.3、界面测试 登录页面 注册页面 游戏大…

5.13网络编程

只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的&#xff0c;因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…