<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      在SqlSugar的開發(fā)框架的Vue3+ElementPlus前端中增加對報表模塊的封裝處理,實現(xiàn)常規(guī)報表的快速處理

      在我們開發(fā)業(yè)務(wù)系統(tǒng)的時候,往往都需要一些數(shù)據(jù)報表進行統(tǒng)計查看,本篇內(nèi)容介紹如何在實際的前端中對報表內(nèi)容進行的一些封裝操作,以便提高報表模塊開發(fā)的效率,報表模塊的展示主要是結(jié)合Vue3中比較廣泛使用的echarts圖表組件進行展示。

      1、ECharts 圖表組件介紹

      ECharts 是一款基于 JavaScript 的開源可視化圖表庫,它非常高效,能夠支持大量數(shù)據(jù)的渲染。與 Vue 3 配合時,ECharts 能夠快速響應(yīng)視圖更新,確保報表的平滑渲染和高性能表現(xiàn)。ECharts 提供了多種類型的圖表(如折線圖、柱狀圖、餅圖、散點圖、雷達圖等),并且支持多種交互方式(如縮放、提示框、動態(tài)數(shù)據(jù)等)。

      Vue 3 提供了強大的組件化開發(fā)方式,可以將不同的圖表封裝成獨立的組件,方便維護、重用和組合。每個圖表組件可以根據(jù)不同的報表需求定制,實現(xiàn)高度復(fù)用。

      Vue 3 提供了雙向綁定和響應(yīng)式的數(shù)據(jù)流機制,當(dāng) Vue 組件的狀態(tài)發(fā)生變化時,圖表可以自動更新。例如,通過綁定數(shù)據(jù)到 chartOption,一旦數(shù)據(jù)變化,ECharts 會自動重新渲染相應(yīng)的圖表。因此我們可以通過動態(tài)綁定數(shù)據(jù)的方式,實現(xiàn)報表模塊的圖表展示。

      ECharts 的官網(wǎng)地址:https://echarts.apache.org/zh/index.html 

      ECharts 的各種案例地址:https://echarts.apache.org/examples/zh/index.html

      image

      我們單擊每個具體的圖表例子,可以查看對應(yīng)的數(shù)據(jù)和形狀,根據(jù)具體業(yè)務(wù)的數(shù)據(jù)和相關(guān)設(shè)置,替換這些數(shù)據(jù)就可以了。

      image

       

       

      2、定義通用圖表組件和具體業(yè)務(wù)圖表組件

      我們?yōu)榱朔奖汩_發(fā)各類型的業(yè)務(wù)圖表,我們可以針對性的對圖表類型、折線類型、條狀類型圖表進行一些簡單的封裝,以便方便統(tǒng)一使用相關(guān)的數(shù)據(jù)。

      image

      上面我在組件目錄里面創(chuàng)建了幾個不同類型的圖表組件,組件主要公布一些props參數(shù)來傳遞,如下說是定義數(shù)據(jù)的屬性。

      //聲明Props的接口類型
      interface Props {
        data?: any[]; // 固定列表方式,直接綁定,項目包括id,label屬性
      }
      //使用默認值定義Props
      const props = withDefaults(defineProps<Props>(), {
        data: () => {
          return [];
        },
      });

      然后對data的屬性監(jiān)控,變化的時候,加載圖表數(shù)據(jù)即可。

      watch(
        () => props.data,
        (newValue = []) => {
          loadChart(newValue);
        },
        { immediate: true } // 可選:如果你希望首次立即觸發(fā)
      );
      
      // 加載圖表數(shù)據(jù)
      async function loadChart(res) {
        setOptions(
          {
            tooltip: {
              trigger: "item"
            },
            legend: { //圖例設(shè)置
              orient: "vertical",
              right: 'right'
            },
            series: [
              {
                name: "標(biāo)題信息", //圖表標(biāo)題
                type: "pie",    //圖表類型,餅圖
                radius: "60%",
                center: ["30%", "50%"],
                data: res, //動態(tài)數(shù)據(jù)
                emphasis: {
                  itemStyle: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: "rgba(0, 0, 0, 0.5)"
                  }
                }
              }
            ]
          },
          {
            name: "click",
            callback: params => {
              console.log("click", params);
            }
          },
          {
            type: "zrender",
            name: "click",
            callback: params => {
              console.log("點擊空白處", params);
            }
          }
        );
      };

      而通用圖表組件的界面代碼比較簡單,只需要標(biāo)記下控件即可,如下代碼所示。

      <template>
        <div ref="pieChartRef" style="width: 100%; height: 35vh" />
      </template>

      有了簡單的組件,我們再次在此基礎(chǔ)上,對不同業(yè)務(wù)表現(xiàn)類型的圖表進行更高層次的組件封裝,以便可以用在首頁或者其他地方,實現(xiàn)多個案例重用顯示的處理。

      例如,對應(yīng)統(tǒng)計某個類型的業(yè)務(wù)圖表,如下所示。

      image

       對于數(shù)據(jù)的處理,我們通過接口動態(tài)獲取圖表統(tǒng)計的data數(shù)據(jù),如下所示。

      // 餅圖處理
      async function searchPie() {
        const data = await report.CarbonSummaryCategory(Number(year.value));
        pieData.value = data.map(item => ({
          value: item.value,
          name: `${item.category} (${item.percentage})`
        }));
      }

      組件封裝的時候,我們直接使用前面封裝的組件。

      import Pie from '@/components/echarts/Pie.vue';

      這個業(yè)務(wù)圖表組件,我們?yōu)榱送ㄓ茫残枰峁┮恍傩怨┩獠總魅耄瑢崿F(xiàn)數(shù)據(jù)的動態(tài)化處理,因此通過提供prop的屬性方式處理。

      //聲明Props的接口類型
      interface Props {
        year?: number | string;
        month?: number | string;
        stack?: boolean; //是否堆疊
        type?: string; //圖表類型
        showLink?: boolean;
      }
      
      //使用默認值定義Props
      const props = withDefaults(defineProps<Props>(), {
        year: 0,
        month: 0,
        stack: true,
        type: 'bar',
        showLink: false,
      });

      這樣組件的處理邏輯代碼如下所示。

      // 獲取當(dāng)前日期
      const currentDate = new Date();
      const currentYear = ref(currentDate.getFullYear());
      const currentMonth = ref(currentDate.getMonth() + 1); // 月份從0開始,所以加1
      
      // ? 在 setup 中補充默認值(只當(dāng) props 沒傳時才使用當(dāng)前時間)
      const year = computed(() => Number(props.year || currentYear.value))
      const month = computed(() => Number(props.month || currentMonth.value))
      
      const loading = ref(true);
      const barData = ref(); // 折線圖數(shù)據(jù)
      const pieData = ref([]); // 餅圖數(shù)據(jù)
      
      //頁面初始化加載
      onMounted(async () => {
        await search();
      });
      
      async function search() {
        loading.value = true;
        await searchPie();
      
        setTimeout(() => {
          loading.value = false;
        }, 500);
      }
      
      // 監(jiān)聽 Props 變化
      watch(
        () => [props.year, props.month, props.stack, props.type],
        async () => {
          await search();
        }
      );
      
      // 餅圖處理
      async function searchPie() {
        const data = await report.CarbonSummaryCategory(Number(year.value));
        pieData.value = data.map(item => ({
          value: item.value,
          name: `${item.category} (${item.percentage})`
        }));
      }

      界面代碼處理上,我們使用第一次封裝的餅圖組件,并通過提供外部卡片的顯示封裝,使它更加好看一些。如下所示。

      <template>
        <div class="welcome">
          <el-card>
            <template #header>
              <span style="font-size: 16px; font-weight: 500"> {{ year }} 年碳排放占比 </span>
              <div class="float-end" v-if="showLink">
                <router-link to="/report/carbon_summary">
                  <el-link type="primary">查看詳細</el-link>
                </router-link>
              </div>
            </template>
            <el-skeleton animated :rows="7" :loading="loading">
              <template #default>
                <Pie :data="pieData" />
              </template>
            </el-skeleton>
          </el-card>
        </div>
      </template>

      其他條狀圖表、折線圖表等其他類型的圖表,依次通過這樣的處理方式,可以實現(xiàn)業(yè)務(wù)組件的重用。

      如我們可能在首頁上放置一些圖表組件,具體報表頁面上也放置相同的圖表組件,這樣就可以很好的重用了。

      image

       

      在前端界面開發(fā)中,良好的組件封裝和使用,可以給我們提供更好的開發(fā)效率,因此為了業(yè)務(wù)的快速開發(fā),我們不僅在代碼生成代碼的方面持續(xù)優(yōu)化,也在一些前端頁面的開發(fā)中,提取一些常用的場景組件,最大化的實現(xiàn)代碼的快速開發(fā)。

       

      posted on 2025-07-25 12:22  伍華聰  閱讀(954)  評論(0)    收藏  舉報

      導(dǎo)航

      主站蜘蛛池模板: 久久亚洲精品天天综合网| 一区二区三区激情免费视频| 成人免费无码视频在线网站| 无码日韩精品一区二区免费| 91精品91久久久久久| 亚洲欧美日韩高清一区二区三区| 成人婷婷网色偷偷亚洲男人的天堂 | 国产一区二区三区四区五区加勒比| 日本高清在线播放一区二区三区| 精品中文字幕一区在线| 亚洲爆乳WWW无码专区| 亚洲一区二区三区蜜桃臀| 理论片午午伦夜理片影院99| 国产精品中文字幕日韩| 久久精品中文字幕少妇| 亚洲av第二区国产精品| 国产精品中文字幕二区| 欧美日韩在线视频| 毛多水多高潮高清视频| 精品不卡一区二区三区| 久久国产成人高清精品亚洲 | 国产精品无码不卡在线播放| 高中女无套中出17p| 亚洲乱色熟女一区二区蜜臀| 国产精品99久久免费| 高清无打码一区二区三区| 波多野结系列18部无码观看AV| 日本欧美大码a在线观看| 成年女人碰碰碰视频播放| 成av免费大片黄在线观看| 亚洲欧美v国产一区二区| 巨爆乳中文字幕爆乳区| 亚洲成人av高清在线| 99久久免费只有精品国产| 亚洲精品一二三中文字幕| 视频一区二区不中文字幕| 高清破外女出血AV毛片| 美日韩精品一区二区三区| 中文字幕成熟丰满人妻| 人妻夜夜爽天天爽| 国产稚嫩高中生呻吟激情在线视频|