|
@@ -0,0 +1,213 @@
|
|
|
+<template>
|
|
|
+ <div class="_consume">
|
|
|
+ <HeadlineTag value="碳排趋势(年)"></HeadlineTag>
|
|
|
+ <div class="_consume_mains">
|
|
|
+ <div ref="chartRef" style="width: 100%; height: 100%;"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ref, onMounted, onUnmounted } from 'vue';
|
|
|
+import * as echarts from 'echarts';
|
|
|
+import HeadlineTag from '@/components/HeadlineTag';
|
|
|
+
|
|
|
+const chartRef = ref(null);
|
|
|
+let chart = null;
|
|
|
+
|
|
|
+const generateRandomData = (length, max) => {
|
|
|
+ const randomData = [];
|
|
|
+ for (let i = 0; i < length; i++) {
|
|
|
+ randomData.push(Math.floor(Math.random() * max));
|
|
|
+ }
|
|
|
+ return randomData;
|
|
|
+};
|
|
|
+
|
|
|
+const handleResize = () => {
|
|
|
+ if (chart) {
|
|
|
+ chart.resize();
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ if (chartRef.value) {
|
|
|
+ chart = echarts.init(chartRef.value);
|
|
|
+
|
|
|
+ const months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];
|
|
|
+
|
|
|
+ const option = {
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ data: months,
|
|
|
+ axisLabel: {
|
|
|
+ color: '#fff'
|
|
|
+ },
|
|
|
+ },
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis',
|
|
|
+ axisPointer: {
|
|
|
+ type: 'cross',
|
|
|
+ crossStyle: {
|
|
|
+ color: '#999'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 调整 grid 配置以在 Y 轴方向拉伸图表
|
|
|
+ grid: {
|
|
|
+ top: '10%', // 减小顶部边距,让图表向上扩展
|
|
|
+ bottom: '10%', // 减小底部边距,让图表向下扩展
|
|
|
+ right: '0%',
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: 'value',
|
|
|
+ axisLabel: {
|
|
|
+ show: true, // 不显示刻度标签
|
|
|
+ color: '#fff'
|
|
|
+ },
|
|
|
+ // 配置 Y 轴网格刻线
|
|
|
+ splitLine: {
|
|
|
+ show: false, // 显示网格刻线
|
|
|
+ lineStyle: {
|
|
|
+ color: '#44585e' // 设置网格刻线颜色
|
|
|
+ }
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false // 不显示刻度线
|
|
|
+ },
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ // 单根柱状图
|
|
|
+ {
|
|
|
+ name: '当年',
|
|
|
+ type: 'bar',
|
|
|
+ data: generateRandomData(12, 50),
|
|
|
+ barWidth: '30%',
|
|
|
+ itemStyle: {
|
|
|
+ color: {
|
|
|
+ type: 'linear',
|
|
|
+ x: 0,
|
|
|
+ y: 0,
|
|
|
+ x2: 0,
|
|
|
+ y2: 1,
|
|
|
+ colorStops: [{
|
|
|
+ offset: 0, color: '#28c928' // 0% 处的颜色
|
|
|
+ }, {
|
|
|
+ offset: 1, color: '#89f87c' // 100% 处的颜色
|
|
|
+ }],
|
|
|
+ global: false // 缺省为 false
|
|
|
+ },
|
|
|
+ barBorderRadius: [10, 10, 10,10]
|
|
|
+
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // 曲线
|
|
|
+ {
|
|
|
+ name: '去年',
|
|
|
+ type: 'line',
|
|
|
+ // smooth: true,
|
|
|
+ data: generateRandomData(12, 50),
|
|
|
+ lineStyle: {
|
|
|
+ color: '#216b87',
|
|
|
+ // 设置柱状图圆角
|
|
|
+
|
|
|
+ },
|
|
|
+ showSymbol: false,
|
|
|
+ smooth: true,
|
|
|
+ areaStyle: {
|
|
|
+ color: new echarts.graphic.LinearGradient(
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 1,
|
|
|
+ [{
|
|
|
+ offset: 0,
|
|
|
+ color: 'rgba(0, 247, 255, .6)',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ offset: 0.8,
|
|
|
+ color: 'rgba(0, 247, 255, .2)',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ false
|
|
|
+ ),
|
|
|
+ shadowColor: 'rgba(0, 0, 0, 0.1)',
|
|
|
+ shadowBlur: 10,
|
|
|
+ },
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ };
|
|
|
+
|
|
|
+ chart.setOption(option);
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+onUnmounted(() => {
|
|
|
+ window.removeEventListener('resize', handleResize);
|
|
|
+ if (chart) {
|
|
|
+ chart.dispose();
|
|
|
+ }
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+._divider {
|
|
|
+ height: 1px;
|
|
|
+ border: 1px dashed #168cdb;
|
|
|
+ flex: 1;
|
|
|
+ margin: 0 10px;
|
|
|
+}
|
|
|
+
|
|
|
+._consume {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+
|
|
|
+ &_mains {
|
|
|
+ margin: 10px 30px;
|
|
|
+ flex: 1;
|
|
|
+ display: flex;
|
|
|
+
|
|
|
+ &_item {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ padding: 10px;
|
|
|
+
|
|
|
+ &_name {
|
|
|
+ width: 30px;
|
|
|
+ height: 30px;
|
|
|
+ background: url("@/assets/images/content_circle_num.png");
|
|
|
+ background-size: 100% 100%;
|
|
|
+ background-position: center;
|
|
|
+ background-repeat: no-repeat;
|
|
|
+ // animation: scanning 4s linear infinite;
|
|
|
+ border: 1px solid red;
|
|
|
+ }
|
|
|
+
|
|
|
+ &_flag {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 3px;
|
|
|
+
|
|
|
+ &_item {
|
|
|
+ width: 30px;
|
|
|
+ height: 30px;
|
|
|
+ border: 3px dashed #168cdb;
|
|
|
+ box-sizing: border-box;
|
|
|
+ background: #0e6ead;
|
|
|
+ color: #fff;
|
|
|
+ border-radius: 50%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &_item:hover {
|
|
|
+ cursor: pointer;
|
|
|
+ background-image: linear-gradient(to right, #168cdb, transparent);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|