From 38a50cb176a78aa5bf5b9f550eb1aab520b402a6 Mon Sep 17 00:00:00 2001
From: ZhangXianQiang <1135831638@qq.com>
Date: 星期四, 07 三月 2024 14:53:43 +0800
Subject: [PATCH] fix:图片修改

---
 src/views/daoAnOffice/right/analysis/index.vue |  397 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 391 insertions(+), 6 deletions(-)

diff --git a/src/views/daoAnOffice/right/analysis/index.vue b/src/views/daoAnOffice/right/analysis/index.vue
index 394c160..04adfe9 100644
--- a/src/views/daoAnOffice/right/analysis/index.vue
+++ b/src/views/daoAnOffice/right/analysis/index.vue
@@ -1,27 +1,372 @@
 <!-- 浜ら�氬畨鍏ㄥ舰鍔跨爺鍒ゅ垎鏋� -->
+
 <template>
   <RightTitle title="浜ら�氬畨鍏ㄥ舰鍔跨爺鍒ゅ垎鏋�">
     <template #top>
       <div class="select-container flex">
-        <div class="item whitespace-no-wrap cursor-pointer" v-for="item in selectItems" :key="item.itemIndex">
+        <div class="item whitespace-no-wrap cursor-pointer" :class="{ 'select-active': item.isActive }"
+          v-for="item in selectItems" :key="item.itemIndex" @click="changeChart(item)">
           {{ item.name }}
         </div>
       </div>
     </template>
+
     <template #content>
-      <div id="analysisChart"></div>
+      <div class="charts-container">
+        <div id="analysisChart" ref="analysisChart"></div>
+        <div class="type-select-container" v-show="isShowSelect">
+          <el-select v-model="typeValue" class="select-style" @change="setConfig">
+            <el-option v-for="item in testData1" :key="item.name" :label="item.name" :value="item.name" />
+          </el-select>
+        </div>
+      </div>
     </template>
   </RightTitle>
 </template>
 
 <script setup>
 import RightTitle from "@/components/right-title";
-import { ref } from 'vue';
+import * as echarts from 'echarts';
+import { ref, onMounted } from 'vue';
+
+// dom
+const analysisChart = ref(null);
+
+// echart瀹炰緥
+let echartObject = null;
+
+// type閫夋嫨
+const typeValue = ref('');
+
+// 鏄惁鏄剧ず涓嬫媺妗�
+const isShowSelect = ref(true);
+
+
 
 const selectItems = ref([
-  { itemIndex: 1, name: '鏃堕棿缁熻', isActive: false },
-  { itemIndex: 2, name: '琛楅亾缁熻', isActive: true },
+  { itemIndex: 1, name: '鏃堕棿缁熻', isActive: true },
+  { itemIndex: 2, name: '琛楅亾缁熻', isActive: false },
 ]);
+
+const testData = ref([
+  { name: '濂庡厜濉旇閬�', state1: 1400, state2: 3533, state3: 2316 },
+  { name: '钂查槼琛楅亾', state1: 1820, state2: 4281, state3: 3064 },
+  { name: '鑱氭簮闀�', state1: 972, state2: 2124, state3: 1500 },
+  { name: '閾舵潖琛楅亾', state1: 1109, state2: 2876, state3: 1500 },
+  { name: '鐭崇緤闀�', state1: 972, state2: 2124, state3: 1500 },
+  { name: '榫欐睜闀�', state1: 972, state2: 2124, state3: 1500 },
+  { name: '澶╅┈闀�', state1: 972, state2: 4000, state3: 1500 },
+  { name: '鐜夊爞琛楅亾', state1: 972, state2: 2878, state3: 1500 },
+  { name: '鐏屽彛琛楅亾', state1: 972, state2: 2124, state3: 1500 },
+]);
+
+const testData1 = ref([
+  {
+    name: '閮芥睙鍫板競',
+    state: { '2023-1': 1000, '2023-2': 2000, '2023-3': 1233, '2023-4': 2132, '2023-5': 2999 },
+    state2: { '2023-1': 12312, '2023-2': 2312, '2023-3': 2111, '2023-4': 2132, '2023-5': 2999 }
+  },
+  {
+    name: '濂庡厜濉旇閬�',
+    state: { '2023-1': 21, '2023-2': 12, '2023-3': 224, '2023-4': 662, '2023-5': 71 },
+    state2: { '2023-1': 12312, '2023-2': 21, '2023-3': 2111, '2023-4': 2132, '2023-5': 2999 }
+  },
+  {
+    name: '钂查槼琛楅亾',
+    state: { '2023-1': 1000, '2023-2': 2131, '2023-3': 1233, '2023-4': 2132, '2023-5': 3211 },
+    state2: { '2023-1': 12312, '2023-2': 23123, '2023-3': 2111, '2023-4': 2132, '2023-5': 2999 }
+  },
+  {
+    name: '鑱氭簮闀�',
+    state: { '2023-1': 1000, '2023-2': 500, '2023-3': 1111, '2023-4': 2132, '2023-5': 2999 },
+    state2: { '2023-1': 12312, '2023-2': 2222, '2023-3': 2111, '2023-4': 2132, '2023-5': 2999 }
+  },
+  {
+    name: '閾舵潖琛楅亾',
+    state: { '2023-1': 1000, '2023-2': 2000, '2023-3': 1233, '2023-4': 2132, '2023-5': 12 },
+    state2: { '2023-1': 1231, '2023-2': 121, '2023-3': 123, '2023-4': 321, '2023-5': 2999 }
+  },
+  {
+    name: '鐭崇緤闀�',
+    state: { '2023-1': 1000, '2023-2': 8334, '2023-3': 1233, '2023-4': 123, '2023-5': 0 },
+    state2: { '2023-1': 12312, '2023-2': 512, '2023-3': 241, '2023-4': 2132, '2023-5': 2999 }
+  },
+]);
+let acitveData = ref(testData1.value[0]);
+
+
+// 鍦嗘煴鍥捐〃
+const barConfig = ref({
+  legend: {
+    right: '0',
+    icon: 'circle',
+    textStyle: {
+      color: 'rgba(77, 118, 176, 1)'
+    },
+    data: [
+      {
+        name: '閱夐┚',
+        itemStyle: {
+          color: 'rgba(0, 168, 217, 1)'
+        }
+      },
+      {
+        name: '閰掗┚',
+        itemStyle: {
+          color: 'rgba(207, 178, 73, 1)'
+        }
+      },
+      {
+        name: '鍏朵粬',
+        itemStyle: {
+          color: 'rgba(43, 176, 109, 1)'
+        }
+      },
+    ]
+
+  },
+  tooltip: {},
+  grid: {
+    left: 0,
+    right: 0,
+    bottom: 0,
+    top: '15%',
+    containLabel: true
+  },
+  dataset: {
+    dimensions: ['name', 'state1', 'state2', 'state3'],
+    source: testData.value
+  },
+  xAxis: {
+    type: 'category',
+    axisTick: false,
+    axisLabel: {
+      fontSize: 14,
+      color: '#4D76B0',
+      margin: 15
+    },
+    axisLine: {
+      lineStyle: {
+        color: '#4d76b033'
+      }
+    }
+  },
+  yAxis: {
+    axisLabel: {
+      fontSize: 14,
+      color: '#4D76B0',
+    },
+    splitLine: {
+      lineStyle: {
+        color: '#4d76b033'
+      }
+    }
+  },
+  series: [
+    {
+      type: 'bar',
+      name: '閱夐┚',
+      barWidth: 13,
+      barGap: '50%',
+      label: {
+        show: true, // 鏄剧ず鏍囩
+        position: 'top', // 鏍囩浣嶇疆
+        color: 'rgba(0, 168, 217, 1)', // 鏍囩棰滆壊
+        fontSize: 10,
+      },
+      itemStyle: {
+        // 璁剧疆娓愬彉鑹�
+        color: new echarts.graphic.LinearGradient(
+          0, 1, 0, 0,
+          [
+            { offset: 0, color: 'rgba(14, 32, 54, 1)' },    // 0% 澶勭殑棰滆壊
+            { offset: 1, color: 'rgba(0, 168, 217, 1)' }     // 100% 澶勭殑棰滆壊
+          ]
+        )
+      },
+    },
+    {
+      type: 'bar',
+      name: '閰掗┚',
+      barWidth: 13,
+      barGap: '50%',
+      label: {
+        show: true, // 鏄剧ず鏍囩
+        position: 'top', // 鏍囩浣嶇疆
+        color: 'rgba(207, 178, 73, 1)', // 鏍囩棰滆壊
+        fontSize: 10,
+      },
+      itemStyle: {
+        // 璁剧疆娓愬彉鑹�
+        color: new echarts.graphic.LinearGradient(
+          0, 1, 0, 0,
+          [
+            { offset: 0, color: 'rgba(14, 31, 53, 1)' },    // 0% 澶勭殑棰滆壊
+            { offset: 1, color: 'rgba(207, 178, 73, 1)' }     // 100% 澶勭殑棰滆壊
+          ]
+        )
+      },
+    },
+    {
+      type: 'bar',
+      name: '鍏朵粬',
+      barWidth: 13,
+      barGap: '50%',
+      label: {
+        show: true, // 鏄剧ず鏍囩
+        position: 'top', // 鏍囩浣嶇疆
+        color: 'rgba(43, 176, 109, 1)', // 鏍囩棰滆壊
+        fontSize: 10,
+      },
+      itemStyle: {
+        // 璁剧疆娓愬彉鑹�
+        color: new echarts.graphic.LinearGradient(
+          0, 1, 0, 0,
+          [
+            { offset: 0, color: 'rgba(14, 31, 53, 1)' },    // 0% 澶勭殑棰滆壊
+            { offset: 1, color: 'rgba(43, 176, 109, 1)' }     // 100% 澶勭殑棰滆壊
+          ]
+        )
+      },
+    },
+  ]
+});
+
+
+// line閰嶇疆
+const lineConfig = ref(null);
+
+
+
+// 鍥捐〃鏇存崲
+const changeChart = (selectItem) => {
+  selectItems.value.map(item => item.isActive = false);
+  selectItem.isActive = true;
+  if (selectItem.itemIndex == 1) {
+    echartObject.setOption(lineConfig.value, true);
+    isShowSelect.value = true;
+  } else {
+    echartObject.setOption(barConfig.value, true);
+    isShowSelect.value = false;
+  }
+}
+
+// 閰嶇疆鏁版嵁
+const setConfig = () => {
+  acitveData.value = testData1.value.find((item) => item.name === typeValue.value);
+  lineConfig.value = {
+    legend: {
+      right: '12%',
+      icon: 'circle',
+      textStyle: {
+        color: 'rgba(77, 118, 176, 1)'
+      },
+      data: [
+        {
+
+          name: '閰掗┚',
+          itemStyle: {
+            color: 'rgba(207, 178, 73, 1)'
+          }
+        },
+        {
+          name: '鍏朵粬',
+          itemStyle: {
+            color: 'rgba(43, 176, 109, 1)'
+          }
+        },
+      ],
+    },
+    tooltip: {
+      show: true,
+      trigger: 'axis',
+      backgroundColor: '#000001cc',
+      borderWidth: 0,
+      textStyle: {
+        color: '#4D76B0',
+        fontSize: 16
+      },
+      axisPointer: {
+        type: 'shadow',
+        lable: {
+          color: '#000000'
+        }
+      },
+      padding: [20, 25],
+      formatter: function (params) {
+        let temp = params[0].name + '<br/>';
+        params.forEach(element => {
+          temp += element.seriesName + ':' + `<span style="color:${element.componentIndex === 1 ? '#2bb06d' : '#cfb249'}">${element.value}</span>` + '<br/>';
+        });
+        return temp;
+      }
+    },
+    grid: {
+      left: 0,
+      right: 0,
+      bottom: 0,
+      top: '15%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'category',
+      data: Object.keys(acitveData.value.state),
+      axisLabel: {
+        fontSize: 14,
+        color: '#4D76B0',
+        margin: 15
+      },
+
+      axisTick: false,
+      axisLine: {
+        lineStyle: {
+          color: '#4d76b033'
+        }
+      }
+    },
+    yAxis: {
+      type: 'value',
+      axisLabel: {
+        fontSize: 14,
+        color: '#4D76B0'
+      },
+      splitLine: {
+        lineStyle: {
+          color: '#4d76b033'
+        }
+      }
+    },
+    series: [
+      {
+        name: '閰掗┚',
+        data: Object.entries(acitveData.value.state).map(([key, value]) => value),
+        type: 'line',
+        smooth: true,
+        itemStyle: {
+          color: 'rgba(207, 178, 73, 1)'
+        }
+      },
+      {
+        name: '鍏朵粬',
+        data: Object.entries(acitveData.value.state2).map(([key, value]) => value),
+        type: 'line',
+        smooth: true,
+        itemStyle: {
+          color: 'rgba(43, 176, 109, 1)'
+        }
+      }
+    ]
+  }
+  echartObject.setOption(lineConfig.value, true);
+}
+
+
+// 鎸傝浇
+onMounted(() => {
+  echartObject = echarts.init(analysisChart.value);
+  typeValue.value = testData1.value[0].name;
+  setConfig();
+})
 </script>
 
 <style lang="scss" scoped>
@@ -32,13 +377,53 @@
 .item {
   margin: 0 8px;
   padding: 10px 14px;
-  font-size: 12px;
+  font-size: 14px;
   background: rgba(67, 102, 155, 0.4);
   border: 1px solid rgba(47, 91, 157, 0.8);
   flex-shrink: 0;
+  color: #5B83BD;
+  font-family: 'PingFang SC';
+}
+
+.select-active {
+  color: #fff;
 }
 
 .item:last-child {
   margin-right: 0;
 }
+
+.charts-container {
+  width: 100%;
+  height: 280px;
+  padding: 20px;
+  background-color: rgba(17, 34, 58, 0.6);
+  border: 1px solid rgba(47, 91, 157, 0.8);
+  position: relative;
+}
+
+.type-select-container {
+  position: absolute;
+  right: 20px;
+  top: 14px;
+  width: 120px;
+  height: 23px;
+}
+
+#analysisChart {
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+}
+
+::v-deep .el-input.el-input--suffix {
+  .el-input__wrapper {
+    background: rgba(67, 102, 155, 0.4) !important;
+    border: 1px solid rgba(47, 91, 157, 0.8);
+  }
+
+  .el-input__inner {
+    color: #4481DD;
+  }
+}
 </style>
\ No newline at end of file

--
Gitblit v1.8.0