在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

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

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

上面我在組件目錄里面創(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ù)圖表,如下所示。

對于數(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ù)組件的重用。
如我們可能在首頁上放置一些圖表組件,具體報表頁面上也放置相同的圖表組件,這樣就可以很好的重用了。

在前端界面開發(fā)中,良好的組件封裝和使用,可以給我們提供更好的開發(fā)效率,因此為了業(yè)務(wù)的快速開發(fā),我們不僅在代碼生成代碼的方面持續(xù)優(yōu)化,也在一些前端頁面的開發(fā)中,提取一些常用的場景組件,最大化的實現(xiàn)代碼的快速開發(fā)。
專注于代碼生成工具、.Net/Python 框架架構(gòu)及軟件開發(fā),以及各種Vue.js的前端技術(shù)應(yīng)用。著有Winform開發(fā)框架/混合式開發(fā)框架、微信開發(fā)框架、Bootstrap開發(fā)框架、ABP開發(fā)框架、SqlSugar開發(fā)框架、Python開發(fā)框架等框架產(chǎn)品。
??轉(zhuǎn)載請注明出處:撰寫人:伍華聰??http://www.iqidi.com?
????
浙公網(wǎng)安備 33010602011771號