From 0796eebe3520fafb0ac5d36ee584af81506d7e9c Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期六, 20 九月 2025 14:05:52 +0800
Subject: [PATCH] 2025.9.20 数据产品(待完成)

---
 src/utils/echart-util.js |  275 ++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 160 insertions(+), 115 deletions(-)

diff --git a/src/utils/echart-util.js b/src/utils/echart-util.js
index 0934d69..7f907dd 100644
--- a/src/utils/echart-util.js
+++ b/src/utils/echart-util.js
@@ -1,123 +1,168 @@
-// 閫掑綊鐨勮幏鍙杘bj涓殑prop灞炴�� 瑙e喅鏈夋椂闇�瑕佸彇val.obj.prop鐨勬儏鍐�
-function getPropValueLoop(obj, prop) {
-  if (typeof prop !== 'string') {
-    return obj;
-  }
-  const props = prop.split('.');
-  let result = obj;
-  props.forEach((item) => {
-    result = result[item];
-  });
-  return result;
-}
-function getCount(array, element) {
-  let count = 0;
-  array.forEach((e) => {
-    if (e == element) {
-      count++;
-    }
-  });
-  return count;
-}
-export default {
-  /** 灏哻hart鍥捐〃杞寲涓哄浘鐗噓rl
-   * @param chart锛� chart鍥捐〃鐨勫疄渚�
-   *  */
-  chartToImageUrl(chart) {
-    const dataURL = chart.getDataURL({
-      pixelRatio: 5, // 鎻愰珮鍥剧墖璐ㄩ噺
-      backgroundColor: '#FFFFFF', // 璁剧疆鑳屾櫙棰滆壊
-      excludeComponents: ['toolbox'], // 鎺掗櫎宸ュ叿绠辩粍浠�
-      type: 'png' // 杈撳嚭鍥剧墖绫诲瀷涓篜NG
-    });
-    return dataURL;
-  },
-  // 灞曠ず data 鏁扮粍涓璞$殑 prop 灞炴�х殑楗煎浘, title 鏄ゼ鍥剧殑鏍囬
-  getPieChartByDataAndProp(data, prop, label) {
-    let chartData = [];
-    function hasThisName(name) {
-      for (let index = 0; index < chartData.length; index++) {
-        const element = chartData[index];
-        if (element.name === name) {
-          return true;
+function pieChartOption() {
+  return {
+    color: [
+      '#5470c6',
+      '#91cc75',
+      '#fac858',
+      '#ee6666',
+      '#73c0de',
+      '#3ba272',
+      '#fc8452',
+      '#9a60b4',
+      '#ea7ccc',
+      '#514a9d',
+      '#2ec7c9',
+      '#b6a2de'
+    ],
+    title: {
+      text: `楗煎浘榛樿鍚嶇О`,
+      left: 'center' // 鏍囬灞呬腑鏄剧ず
+    },
+    // 娣诲姞宸ュ叿鏍忛厤缃紝鍖呭惈涓嬭浇鍔熻兘
+    toolbox: {
+      show: true,
+      feature: {
+        saveAsImage: {
+          show: true,
+          title: '涓嬭浇鍥捐〃',
+          type: 'png',
+          pixelRatio: 2 // 鎻愰珮鍥剧墖娓呮櫚搴�
         }
       }
-      return false;
-    }
-
-    data.map((item) => {
-      const name = getPropValueLoop(item, prop);
-      if (hasThisName(name)) {
-        chartData.map((item) => {
-          if (item.name === name) {
-            item.value++;
+    },
+    tooltip: {
+      trigger: 'item', // 楗煎浘浣跨敤item瑙﹀彂tooltip
+      formatter: '{a} <br/>{b}: {c} ({d}%)' // 鏄剧ず鏍煎紡锛氬悕绉�: 鏁伴噺 (鐧惧垎姣�)
+    },
+    legend: {
+      show: false,
+      orient: 'vertical',
+      left: 'right', // 鍥句緥灞呭乏鍨傜洿鎺掑垪
+      data: ['sample1', 'sample2', 'sample3'] // 鍥句緥鏁版嵁涓洪棶棰樼被鍨嬪悕绉�
+    },
+    series: [
+      {
+        name: 'sample',
+        type: 'pie', // 鍥捐〃绫诲瀷鏀逛负楗煎浘
+        radius: '60%', // 楗煎浘鍗婂緞
+        center: ['50%', '55%'], // 楗煎浘涓績浣嶇疆
+        data: [
+          {
+            name: 'sample1',
+            value: 100
+          },
+          {
+            name: 'sample2',
+            value: 200
+          },
+          {
+            name: 'sample3',
+            value: 300
           }
-        });
-      } else {
-        chartData.push({
-          name: name,
-          value: 1
-        });
+        ],
+        label: {
+          show: true,
+          formatter: '{b}: {c} ({d}%)' // 鎵囧尯鏍囩鏄剧ず锛氬悕绉�: 鏁伴噺 (鐧惧垎姣�)
+        }
       }
-    });
+    ]
+  };
+}
 
-    return {
-      title: {
-        text: label,
-        left: 'center'
-      },
-      tooltip: {
-        trigger: 'item'
-      },
-      legend: {
-        orient: 'vertical',
-        left: 'left'
-      },
-      series: [
-        {
-          type: 'pie',
-          radius: '50%',
-          data: chartData,
-          emphasis: {
-            itemStyle: {
-              shadowBlur: 10,
-              shadowOffsetX: 0,
-              shadowColor: 'rgba(0, 0, 0, 0.5)'
-            }
-          }
+function barChartOption() {
+  return {
+    title: {
+      text: `鏌辩姸鍥鹃粯璁ゅ悕绉癭,
+      left: 'center' // 鏍囬灞呬腑鏄剧ず
+    },
+    // 娣诲姞宸ュ叿鏍忛厤缃紝鍖呭惈涓嬭浇鍔熻兘
+    toolbox: {
+      show: true,
+      feature: {
+        saveAsImage: {
+          show: true,
+          title: '涓嬭浇鍥捐〃',
+          type: 'png',
+          pixelRatio: 2 // 鎻愰珮鍥剧墖娓呮櫚搴�
         }
-      ]
-    };
-  },
-  // 灞曠ず data 鏁扮粍涓璞$殑 prop 灞炴�х殑鐩存柟鍥�, title 鏄洿鏂瑰浘鐨勬爣棰�
-  getBarChartByDataAndProp(data, prop, title) {
-    let series = data.map((item) => getPropValueLoop(item, prop));
-    const option = {
-      title: {
-        text: title //璁剧疆鏍囬
+      }
+    },
+    tooltip: {
+      trigger: 'axis', // 鏌辩姸鍥句娇鐢╝xis瑙﹀彂tooltip
+      axisPointer: {
+        type: 'shadow' // 鏄剧ず闃村奖鎸囩ず鍣�
       },
-      xAxis: {
-        type: 'category',
-        data: Array.from(new Set(series)),
-        axisLabel: {
-          rotate: 45, // 鏃嬭浆鏍囩锛岄伩鍏嶉噸鍙�
-          // 鎴栬��
-          interval: 0 // 鏄剧ず鎵�鏈夋爣绛撅紝鍙兘瀵艰嚧閲嶅彔锛屾牴鎹渶姹傝皟鏁�
+      formatter: '{b}: {c}' // 鏄剧ず鏍煎紡锛氬悕绉�: 鏁伴噺
+    },
+    legend: {
+      show: true,
+      orient: 'horizontal',
+      bottom: '0%', // 鍥句緥搴曢儴姘村钩鎺掑垪
+    },
+    grid: {
+      // left: '3%',
+      // right: '4%',
+      bottom: '10%',
+      top: '15%',
+      containLabel: true
+    },
+    xAxis: {
+      name: '鍧愭爣杞�',
+      type: 'category',
+      data: ['sample1', 'sample2', 'sample3'], // X杞存暟鎹�
+      axisTick: {
+        alignWithLabel: true
+      },
+      axisLabel: {
+        rotate: 45,
+      }
+    },
+    yAxis: {
+      type: 'value',
+      name: '鏁伴噺', // Y杞村悕绉�
+      axisLine: {
+        show: true
+      },
+      axisLabel: {
+        formatter: '{value}'
+      }
+    },
+    series: [
+      {
+        name: 'sample',
+        type: 'bar', // 鍥捐〃绫诲瀷鏀逛负鏌辩姸鍥�
+        data: [100, 200, 300], // 鏁版嵁鍊�
+        label: {
+          show: true,
+          position: 'top', // 鏍囩鏄剧ず鍦ㄦ煴瀛愰《閮�
+          formatter: '{c}' // 鏍囩鏍煎紡锛氭暟閲�
         }
-      },
-      yAxis: {
-        type: 'value'
-      },
-      series: [
-        {
-          data: Array.from(new Set(series)).map((item) =>
-            getCount(series, item)
-          ),
-          type: 'bar',
-          smooth: true
-        }
-      ]
-    };
-    return option;
-  }
-};
+      }
+    ]
+  };
+}
+
+// 閫氳繃 ECharts API 涓嬭浇鍥剧墖鐨勫嚱鏁�
+function downloadChartImage(chart, fileName) {
+  if (!chart) return; // 纭繚鍥捐〃宸插垵濮嬪寲
+
+  // 鑾峰彇鍥捐〃鍥剧墖鏁版嵁锛堟敮鎸� png/jpeg 鏍煎紡锛宲ixelRatio 鎺у埗娓呮櫚搴︼級
+  const dataURL = chart.getDataURL({
+    type: 'png', // 鍥剧墖鏍煎紡
+    pixelRatio: 2, // 鍍忕礌姣旓紝鍊艰秺澶у浘鐗囪秺娓呮櫚
+    backgroundColor: '#fff', // 鑳屾櫙鑹诧紙榛樿閫忔槑锛�
+    excludeComponents: ['toolbox']
+  });
+  // 鍒涘缓涓嬭浇閾炬帴
+  const link = document.createElement('a');
+  link.href = dataURL;
+  // 璁剧疆涓嬭浇鏂囦欢鍚嶏紙鍙牴鎹疄闄呴渶姹傝皟鏁达級
+  link.download = `${fileName}.png`;
+  // 娣诲姞鍒版枃妗e苟瑙﹀彂涓嬭浇
+  document.body.appendChild(link);
+  link.click();
+  // 娓呯悊閾炬帴鍏冪礌
+  document.body.removeChild(link);
+}
+
+export { pieChartOption, barChartOption, downloadChartImage };

--
Gitblit v1.9.3