产出品管理 - 产出品概览页面饼图展示开发
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