|
@@ -0,0 +1,138 @@
|
|
|
+<template>
|
|
|
+ <div id="gauge">
|
|
|
+ <div :id="id" style="width: 99%;height:400px;"></div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+const _ = require('lodash');
|
|
|
+import * as echarts from 'echarts';
|
|
|
+import { mapState, createNamespacedHelpers } from 'vuex';
|
|
|
+export default {
|
|
|
+ name: 'gauge',
|
|
|
+ props: {
|
|
|
+ data: {
|
|
|
+ type: Array,
|
|
|
+ default: () => [
|
|
|
+ { value: 1048, name: 'first' },
|
|
|
+ { value: 735, name: 'second' },
|
|
|
+ { value: 580, name: 'third' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ title: { type: String, default: '仪表盘' },
|
|
|
+ },
|
|
|
+ components: {},
|
|
|
+ data: function() {
|
|
|
+ return {
|
|
|
+ id: `gauge${_.random(100000, 999999)}`,
|
|
|
+ // 位移
|
|
|
+ tags: [
|
|
|
+ // 第一个数据的标题与详情位置位移
|
|
|
+ {
|
|
|
+ title: { offsetCenter: ['0%', '-50%'] },
|
|
|
+ detail: { offsetCenter: ['0%', '-35%'] },
|
|
|
+ },
|
|
|
+ // 第二个数据的标题与详情位置位移
|
|
|
+ {
|
|
|
+ title: { offsetCenter: ['0%', '-15%'] },
|
|
|
+ detail: { offsetCenter: ['0%', '0%'] },
|
|
|
+ },
|
|
|
+ // 第三个数据的标题与详情位置位移
|
|
|
+ {
|
|
|
+ title: { offsetCenter: ['0%', '20%'] },
|
|
|
+ detail: { offsetCenter: ['0%', '35%'] },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ },
|
|
|
+ created() {},
|
|
|
+ mounted() {
|
|
|
+ this.init();
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ init() {
|
|
|
+ // 处理数据
|
|
|
+ let dup = _.cloneDeep(this.data);
|
|
|
+ for (let i = 0; i < dup.length; i++) {
|
|
|
+ const e = dup[i];
|
|
|
+ e.title = this.tags[i].title;
|
|
|
+ e.detail = this.tags[i].detail;
|
|
|
+ }
|
|
|
+ const max = dup.reduce((p, n) => p + n.value * 1, 0);
|
|
|
+ let chart = echarts.init(document.getElementById(this.id));
|
|
|
+ chart.setOption({
|
|
|
+ title: {
|
|
|
+ text: this.title,
|
|
|
+ left: 'center',
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ type: 'gauge',
|
|
|
+ startAngle: 90,
|
|
|
+ endAngle: -270,
|
|
|
+ pointer: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ progress: {
|
|
|
+ show: true,
|
|
|
+ overlap: false,
|
|
|
+ roundCap: true,
|
|
|
+ clip: true,
|
|
|
+ itemStyle: {
|
|
|
+ borderWidth: 1,
|
|
|
+ borderColor: '#464646',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ lineStyle: {
|
|
|
+ width: 40,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ show: false,
|
|
|
+ distance: 0,
|
|
|
+ length: 10,
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ show: false,
|
|
|
+ distance: 50,
|
|
|
+ },
|
|
|
+ // max需要通过data进行计算
|
|
|
+ max: max,
|
|
|
+ min: 0,
|
|
|
+ data: dup,
|
|
|
+ detail: {
|
|
|
+ width: 50,
|
|
|
+ height: 14,
|
|
|
+ lineHeight: 50,
|
|
|
+ fontSize: 14,
|
|
|
+ color: 'auto',
|
|
|
+ borderColor: 'auto',
|
|
|
+ borderRadius: 20,
|
|
|
+ borderWidth: 1,
|
|
|
+ // 需要计算
|
|
|
+ formatter: value => {
|
|
|
+ return `${_.multiply(_.round(_.divide(value, max), 2), 100)}%`;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ });
|
|
|
+ },
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapState(['user', 'menuParams']),
|
|
|
+ pageTitle() {
|
|
|
+ return `${this.$route.meta.title}`;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ metaInfo() {
|
|
|
+ return { title: this.$route.meta.title };
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less" scoped></style>
|