产出品管理 - 产出品概览页面饼图展示开发
This commit is contained in:
parent
b741c624f2
commit
a32894789c
@ -10,6 +10,7 @@ declare module 'vue' {
|
|||||||
AreaCascader: typeof import('./src/components/AreaCascader/index.vue')['default']
|
AreaCascader: typeof import('./src/components/AreaCascader/index.vue')['default']
|
||||||
AreaSelect: typeof import('./src/components/AreaSelect/index.vue')['default']
|
AreaSelect: typeof import('./src/components/AreaSelect/index.vue')['default']
|
||||||
CodeDialog: typeof import('./src/components/code-dialog/index.vue')['default']
|
CodeDialog: typeof import('./src/components/code-dialog/index.vue')['default']
|
||||||
|
CustomEchartBar: typeof import('./src/components/custom-echart-bar/index.vue')['default']
|
||||||
CustomEchartPie: typeof import('./src/components/custom-echart-pie/index.vue')['default']
|
CustomEchartPie: typeof import('./src/components/custom-echart-pie/index.vue')['default']
|
||||||
FileUploader: typeof import('./src/components/FileUploader/index.vue')['default']
|
FileUploader: typeof import('./src/components/FileUploader/index.vue')['default']
|
||||||
LandSelect: typeof import('./src/components/LandSelect.vue')['default']
|
LandSelect: typeof import('./src/components/LandSelect.vue')['default']
|
||||||
|
@ -0,0 +1,125 @@
|
|||||||
|
<template>
|
||||||
|
<div ref="chartRef" :style="{ height, width }"></div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { ref, reactive, watchEffect } from 'vue';
|
||||||
|
import { cloneDeep } from 'lodash';
|
||||||
|
import { useEcharts } from '../../hooks/useEcharts';
|
||||||
|
export default {
|
||||||
|
name: 'CustomEchartBar',
|
||||||
|
props: {
|
||||||
|
chartData: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
option: {
|
||||||
|
type: Object,
|
||||||
|
default: () => ({}),
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
default: 'bar',
|
||||||
|
},
|
||||||
|
width: {
|
||||||
|
type: String,
|
||||||
|
default: '100%',
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
type: String,
|
||||||
|
default: 'calc(100vh - 78px)',
|
||||||
|
},
|
||||||
|
isSeries: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
emits: ['click'],
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const chartRef = ref(null);
|
||||||
|
const { setOptions, getInstance, startAutoPlay } = useEcharts(chartRef);
|
||||||
|
const option = reactive({
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
tooltip: {
|
||||||
|
backgroundColor: 'rgba(12, 36, 56, 0.9)', // 背景颜色(支持RGBA格式)
|
||||||
|
borderColor: '#2cf4fd', // 边框颜色
|
||||||
|
borderWidth: 1, // 边框宽度
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff', // 文字颜色
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
formatter: '{b}:{c}',
|
||||||
|
},
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
backgroundColor: '#333',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
top: 30,
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
top: 60,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: [],
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'value',
|
||||||
|
},
|
||||||
|
series: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
props.chartData && initCharts();
|
||||||
|
});
|
||||||
|
|
||||||
|
function initCharts() {
|
||||||
|
if (props.option) {
|
||||||
|
Object.assign(option, cloneDeep(props.option));
|
||||||
|
}
|
||||||
|
let typeArr = Array.from(new Set(props.chartData.map((item) => item.type)));
|
||||||
|
let xAxisData = Array.from(new Set(props.chartData.map((item) => item.name)));
|
||||||
|
let seriesData = [];
|
||||||
|
typeArr.forEach((type, index) => {
|
||||||
|
const barStyle = props.option?.barStyle ?? {};
|
||||||
|
let obj = { name: type, type: props.type, ...barStyle };
|
||||||
|
let data = [];
|
||||||
|
xAxisData.forEach((x) => {
|
||||||
|
let dataArr = props.chartData.filter((item) => type === item.type && item.name == x);
|
||||||
|
if (dataArr && dataArr.length > 0) {
|
||||||
|
data.push(dataArr[0].value);
|
||||||
|
} else {
|
||||||
|
data.push(null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
obj['data'] = data;
|
||||||
|
if (props.option?.color) {
|
||||||
|
obj.color = props.option?.color[index];
|
||||||
|
}
|
||||||
|
seriesData.push(obj);
|
||||||
|
});
|
||||||
|
option.series = props.isSeries && option.series.length > 0 ? option.series : seriesData;
|
||||||
|
option.xAxis.data = xAxisData;
|
||||||
|
setOptions(option);
|
||||||
|
startAutoPlay({
|
||||||
|
interval: 2000,
|
||||||
|
seriesIndex: 0,
|
||||||
|
showTooltip: true,
|
||||||
|
});
|
||||||
|
getInstance()?.off('click', onClick);
|
||||||
|
getInstance()?.on('click', onClick);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onClick(params) {
|
||||||
|
emit('click', params);
|
||||||
|
}
|
||||||
|
return { chartRef };
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
@ -376,8 +376,6 @@
|
|||||||
padding: 10px 20px;
|
padding: 10px 20px;
|
||||||
.statistics-echart-box {
|
.statistics-echart-box {
|
||||||
height: 400px;
|
height: 400px;
|
||||||
padding-bottom: 50px;
|
|
||||||
box-sizing: content-box;
|
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
}
|
}
|
||||||
.statistics-echart-title {
|
.statistics-echart-title {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<template>
|
<!-- <template>
|
||||||
<div class="custom-page" :style="`background-image: url(${getAssetsFile('images/output/output.png')})`"></div>
|
<div class="custom-page" :style="`background-image: url(${getAssetsFile('images/output/output.png')})`"></div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -13,9 +13,9 @@ import { getAssetsFile } from '@/utils';
|
|||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
}
|
}
|
||||||
</style>
|
</style> -->
|
||||||
|
|
||||||
<!-- <template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<div class="container-custom">
|
<div class="container-custom">
|
||||||
<h2 class="custom-h2">产出品概览</h2>
|
<h2 class="custom-h2">产出品概览</h2>
|
||||||
@ -37,7 +37,11 @@ import { getAssetsFile } from '@/utils';
|
|||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :span="12" class="statistics-echart-box">
|
<el-col :span="12" class="statistics-echart-box">
|
||||||
<p class="statistics-echart-title">产出品产量数据</p>
|
<p class="statistics-echart-title">产出品产量数据</p>
|
||||||
<customEchartPie ref="pie1" :chart-data="chartData1" :option="option" :width="'100%'" :height="'100%'"></customEchartPie>
|
<customEchartPie ref="pie1" :chart-data="chartData1" :option="option" :width="'100%'" :height="'90%'"></customEchartPie>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12" class="statistics-echart-box">
|
||||||
|
<p class="statistics-echart-title">产出品产量排行</p>
|
||||||
|
<customEchartBar ref="pie1" :chart-data="chartData2" :option="option2" :width="'100%'" :height="'100%'"></customEchartBar>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
@ -48,6 +52,7 @@ import { getAssetsFile } from '@/utils';
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, reactive, computed, onMounted } from 'vue';
|
import { ref, reactive, computed, onMounted } from 'vue';
|
||||||
import customEchartPie from '@/components/custom-echart-pie';
|
import customEchartPie from '@/components/custom-echart-pie';
|
||||||
|
import customEchartBar from '@/components/custom-echart-bar';
|
||||||
import { ElMessage } from 'element-plus';
|
import { ElMessage } from 'element-plus';
|
||||||
|
|
||||||
// 查询条件
|
// 查询条件
|
||||||
@ -64,11 +69,53 @@ const chartData1 = ref([
|
|||||||
{ value: 735, name: '水果类' },
|
{ value: 735, name: '水果类' },
|
||||||
{ value: 484, name: '药材类' },
|
{ value: 484, name: '药材类' },
|
||||||
]);
|
]);
|
||||||
|
// 此处数据要大的在下,展示出来是按照这个数据的倒序展示的
|
||||||
|
const chartData2 = ref([
|
||||||
|
{ value: 30.57, name: '凤梨' },
|
||||||
|
{ value: 44.43, name: '铁皮石斛' },
|
||||||
|
{ value: 52.87, name: '芒果' },
|
||||||
|
{ value: 65.43, name: '榴莲' },
|
||||||
|
{ value: 74.54, name: '香蕉' },
|
||||||
|
{ value: 85.88, name: '苦瓜' },
|
||||||
|
{ value: 93.669, name: '丝瓜' },
|
||||||
|
{ value: 103.67, name: '小米椒' },
|
||||||
|
{ value: 118.98, name: '圆茄' },
|
||||||
|
{ value: 127.65, name: '黄皮甘蔗' },
|
||||||
|
]);
|
||||||
const option = reactive({
|
const option = reactive({
|
||||||
tooltip: {
|
tooltip: {
|
||||||
formatter: '{b} ({c} 吨)',
|
formatter: '{b} ({c} 吨)',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
const option2 = reactive({
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow', // 阴影指示器
|
||||||
|
},
|
||||||
|
formatter: '{b}: {c} 吨', // 提示框格式
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
left: '3%',
|
||||||
|
right: '4%',
|
||||||
|
bottom: '10%',
|
||||||
|
containLabel: true, // 包含坐标轴标签
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'value',
|
||||||
|
name: '吨',
|
||||||
|
axisLabel: {
|
||||||
|
formatter: '{value} 吨',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: ['凤梨', '铁皮石斛', '芒果', '榴莲', '香蕉', '苦瓜', '丝瓜', '小米椒', '圆茄', '黄皮甘蔗'],
|
||||||
|
axisLabel: {
|
||||||
|
interval: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
const onSubmit = () => {
|
const onSubmit = () => {
|
||||||
console.log(formInline);
|
console.log(formInline);
|
||||||
};
|
};
|
||||||
@ -77,4 +124,4 @@ onMounted(() => {
|
|||||||
// onSubmit();
|
// onSubmit();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped></style> -->
|
<style lang="scss" scoped></style>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user