17 changed files with 891 additions and 20 deletions
@ -0,0 +1,177 @@ |
|||
<template> |
|||
<div class="chart-container" ref="chartContainer"></div> |
|||
</template> |
|||
|
|||
<script> |
|||
import * as echarts from 'echarts'; |
|||
import {getStatistics} from '@/api/yg/dikeMark' |
|||
export default { |
|||
name: 'ProjectQuantityChart', |
|||
props: { |
|||
// 可以通过props接收数据,方便父组件传入不同数据 |
|||
chartData: { |
|||
type: Array, |
|||
default: () => [ |
|||
{ city: '广州市', value: 2 }, |
|||
{ city: '珠海市', value: 1 } |
|||
] |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
chart: null, |
|||
queryParams: { |
|||
pageNum: 1, |
|||
pageSize: 10, |
|||
ids: null, |
|||
data: { |
|||
dikeName: null, |
|||
markName: null, |
|||
type: null, |
|||
markType: null, |
|||
}, |
|||
// 排序方式 |
|||
params: { |
|||
// 按哪个字段排序 |
|||
orderBy: "create_time", |
|||
// desc降序,升序asc |
|||
sortBy: "desc", |
|||
}, |
|||
}, |
|||
}; |
|||
}, |
|||
mounted() { |
|||
getStatistics(this.queryParams).then(res=>{ |
|||
console.log(666,res) |
|||
this.initChart(res); |
|||
|
|||
}) |
|||
// 添加窗口大小变化监听,使图表响应式调整 |
|||
window.addEventListener('resize', this.resizeChart); |
|||
}, |
|||
beforeDestroy() { |
|||
// 组件销毁前移除事件监听,避免内存泄漏 |
|||
window.removeEventListener('resize', this.resizeChart); |
|||
// 销毁图表实例 |
|||
if (this.chart) { |
|||
this.chart.dispose(); |
|||
this.chart = null; |
|||
} |
|||
}, |
|||
methods: { |
|||
initChart(res) { |
|||
// 初始化图表 |
|||
this.chart = echarts.init(this.$refs.chartContainer); |
|||
this.updateChart(res); |
|||
}, |
|||
updateChart(res) { |
|||
// 提取城市名和数值 |
|||
// const cities = this.chartData.map(item => item.city); |
|||
// const values = this.chartData.map(item => item.value); |
|||
const entries = Object.entries(res); |
|||
const cities = entries.map(([key, value]) => { |
|||
return key |
|||
}); |
|||
const values = entries.map(([key, value]) => { |
|||
return value |
|||
}); |
|||
// 设置图表配置项 |
|||
const option = { |
|||
title: { |
|||
text: '标识标牌数量统计图', |
|||
left: 'center' |
|||
}, |
|||
tooltip: { |
|||
trigger: 'axis', |
|||
axisPointer: { |
|||
type: 'shadow' |
|||
} |
|||
}, |
|||
|
|||
grid: { |
|||
left: '3%', |
|||
right: '4%', |
|||
bottom: '3%', |
|||
containLabel: true |
|||
}, |
|||
xAxis: { |
|||
type: 'category', |
|||
data: cities, |
|||
axisLine: { |
|||
lineStyle: { |
|||
color: '#999' |
|||
} |
|||
}, |
|||
axisLabel: { |
|||
color: '#333' |
|||
} |
|||
}, |
|||
yAxis: { |
|||
type: 'value', |
|||
name: '数量(个)', |
|||
nameTextStyle: { |
|||
color: '#333' |
|||
}, |
|||
min: 0, |
|||
max: Math.ceil(Math.max(...values) * 1.2), // 动态设置最大值 |
|||
interval: 1, |
|||
axisLine: { |
|||
show: true, |
|||
lineStyle: { |
|||
color: '#999' |
|||
} |
|||
}, |
|||
axisLabel: { |
|||
color: '#333' |
|||
}, |
|||
splitLine: { |
|||
lineStyle: { |
|||
color: '#eee', |
|||
type: 'solid' |
|||
} |
|||
} |
|||
}, |
|||
series: [{ |
|||
name: '数量', |
|||
type: 'bar', |
|||
data: values, |
|||
itemStyle: { |
|||
color: '#45B7AF' // 使用相似的青绿色 |
|||
}, |
|||
barWidth: '40%', |
|||
label: { |
|||
show: false |
|||
} |
|||
}], |
|||
color: ['#45B7AF'] |
|||
}; |
|||
|
|||
// 使用配置项显示图表 |
|||
this.chart.setOption(option); |
|||
}, |
|||
resizeChart() { |
|||
if (this.chart) { |
|||
this.chart.resize(); |
|||
} |
|||
} |
|||
}, |
|||
watch: { |
|||
// 监听数据变化,更新图表 |
|||
chartData: { |
|||
handler() { |
|||
this.$nextTick(() => { |
|||
this.updateChart(); |
|||
}); |
|||
}, |
|||
deep: true |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.chart-container { |
|||
width: 100%; |
|||
height: 400px; |
|||
} |
|||
</style> |
@ -0,0 +1,175 @@ |
|||
<template> |
|||
<div class="chart-container" ref="chartContainer"></div> |
|||
</template> |
|||
|
|||
<script> |
|||
import * as echarts from 'echarts'; |
|||
import {getStatistics} from '@/api/yg/sluiceMark' |
|||
|
|||
export default { |
|||
name: 'ProjectQuantityChart', |
|||
props: { |
|||
// 可以通过props接收数据,方便父组件传入不同数据 |
|||
chartData: { |
|||
type: Array, |
|||
default: () => [ |
|||
{ city: '广州市', value: 2 }, |
|||
{ city: '珠海市', value: 1 } |
|||
] |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
chart: null, |
|||
queryParams: { |
|||
pageNum: 1, |
|||
pageSize: 10, |
|||
ids: null, |
|||
data: { |
|||
wagaName: null, |
|||
markName: null, |
|||
type: null, |
|||
markType: null, |
|||
}, |
|||
// 排序方式 |
|||
params: { |
|||
// 按哪个字段排序 |
|||
orderBy: "create_time", |
|||
// desc降序,升序asc |
|||
sortBy: "desc", |
|||
}, |
|||
}, |
|||
}; |
|||
}, |
|||
mounted() { |
|||
getStatistics(this.queryParams).then(res=>{ |
|||
console.log(666,res) |
|||
this.initChart(res); |
|||
|
|||
}) |
|||
// 添加窗口大小变化监听,使图表响应式调整 |
|||
window.addEventListener('resize', this.resizeChart); |
|||
}, |
|||
beforeDestroy() { |
|||
// 组件销毁前移除事件监听,避免内存泄漏 |
|||
window.removeEventListener('resize', this.resizeChart); |
|||
// 销毁图表实例 |
|||
if (this.chart) { |
|||
this.chart.dispose(); |
|||
this.chart = null; |
|||
} |
|||
}, |
|||
methods: { |
|||
initChart(res) { |
|||
// 初始化图表 |
|||
this.chart = echarts.init(this.$refs.chartContainer); |
|||
this.updateChart(res); |
|||
}, |
|||
updateChart(res) { |
|||
// 提取城市名和数值 |
|||
const entries = Object.entries(res); |
|||
const cities = entries.map(([key, value]) => { |
|||
return key |
|||
}); |
|||
const values = entries.map(([key, value]) => { |
|||
return value |
|||
}); |
|||
|
|||
// 设置图表配置项 |
|||
const option = { |
|||
title: { |
|||
text: '标识标牌数量统计图', |
|||
left: 'center' |
|||
}, |
|||
tooltip: { |
|||
trigger: 'axis', |
|||
axisPointer: { |
|||
type: 'shadow' |
|||
} |
|||
}, |
|||
grid: { |
|||
left: '3%', |
|||
right: '4%', |
|||
bottom: '3%', |
|||
containLabel: true |
|||
}, |
|||
xAxis: { |
|||
type: 'category', |
|||
data: cities, |
|||
axisLine: { |
|||
lineStyle: { |
|||
color: '#999' |
|||
} |
|||
}, |
|||
axisLabel: { |
|||
color: '#333' |
|||
} |
|||
}, |
|||
yAxis: { |
|||
type: 'value', |
|||
name: '数量(个)', |
|||
nameTextStyle: { |
|||
color: '#333' |
|||
}, |
|||
min: 0, |
|||
max: Math.ceil(Math.max(...values) * 1.2), // 动态设置最大值 |
|||
axisLine: { |
|||
show: true, |
|||
lineStyle: { |
|||
color: '#999' |
|||
} |
|||
}, |
|||
axisLabel: { |
|||
color: '#333' |
|||
}, |
|||
splitLine: { |
|||
lineStyle: { |
|||
color: '#eee', |
|||
type: 'solid' |
|||
} |
|||
} |
|||
}, |
|||
series: [{ |
|||
name: '工程数量', |
|||
type: 'bar', |
|||
data: values, |
|||
itemStyle: { |
|||
color: '#45B7AF' // 使用相似的青绿色 |
|||
}, |
|||
barWidth: '40%', |
|||
label: { |
|||
show: false |
|||
} |
|||
}], |
|||
color: ['#45B7AF'] |
|||
}; |
|||
|
|||
// 使用配置项显示图表 |
|||
this.chart.setOption(option); |
|||
}, |
|||
resizeChart() { |
|||
if (this.chart) { |
|||
this.chart.resize(); |
|||
} |
|||
} |
|||
}, |
|||
watch: { |
|||
// 监听数据变化,更新图表 |
|||
chartData: { |
|||
handler() { |
|||
this.$nextTick(() => { |
|||
this.updateChart(); |
|||
}); |
|||
}, |
|||
deep: true |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.chart-container { |
|||
width: 100%; |
|||
height: 400px; |
|||
} |
|||
</style> |
Loading…
Reference in new issue