在SqlSugar的开发框架的Vue3+ElementPlus前端中增加对报表模块的封装处理,实现常规报表的快速处理
在我们开发业务系统的时候,往往都需要一些数据报表进行统计查看,本篇内容介绍如何在实际的前端中对报表内容进行的一些封装操作,以便提高报表模块开发的效率,报表模块的展示主要是结合Vue3中比较广泛使用的echarts图表组件进行展示。
1、ECharts 图表组件介绍
ECharts 是一款基于 JavaScript 的开源可视化图表库,它非常高效,能够支持大量数据的渲染。与 Vue 3 配合时,ECharts 能够快速响应视图更新,确保报表的平滑渲染和高性能表现。ECharts 提供了多种类型的图表(如折线图、柱状图、饼图、散点图、雷达图等),并且支持多种交互方式(如缩放、提示框、动态数据等)。
Vue 3 提供了强大的组件化开发方式,可以将不同的图表封装成独立的组件,方便维护、重用和组合。每个图表组件可以根据不同的报表需求定制,实现高度复用。
Vue 3 提供了双向绑定和响应式的数据流机制,当 Vue 组件的状态发生变化时,图表可以自动更新。例如,通过绑定数据到 chartOption,一旦数据变化,ECharts 会自动重新渲染相应的图表。因此我们可以通过动态绑定数据的方式,实现报表模块的图表展示。
ECharts 的官网地址:https://echarts.apache.org/zh/index.html
ECharts 的各种案例地址:https://echarts.apache.org/examples/zh/index.html

我们单击每个具体的图表例子,可以查看对应的数据和形状,根据具体业务的数据和相关设置,替换这些数据就可以了。

2、定义通用图表组件和具体业务图表组件
我们为了方便开发各类型的业务图表,我们可以针对性的对图表类型、折线类型、条状类型图表进行一些简单的封装,以便方便统一使用相关的数据。

上面我在组件目录里面创建了几个不同类型的图表组件,组件主要公布一些props参数来传递,如下说是定义数据的属性。
//声明Props的接口类型
interface Props {
data?: any[]; // 固定列表方式,直接绑定,项目包括id,label属性
}
//使用默认值定义Props
const props = withDefaults(defineProps<Props>(), {
data: () => {
return [];
},
});
然后对data的属性监控,变化的时候,加载图表数据即可。
watch(
() => props.data,
(newValue = []) => {
loadChart(newValue);
},
{ immediate: true } // 可选:如果你希望首次立即触发
); // 加载图表数据
async function loadChart(res) {
setOptions(
{
tooltip: {
trigger: "item"
},
legend: { //图例设置
orient: "vertical",
right: 'right'
},
series: [
{
name: "标题信息", //图表标题
type: "pie", //图表类型,饼图
radius: "60%",
center: ["30%", "50%"],
data: res, //动态数据
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);
}
}
);
};
而通用图表组件的界面代码比较简单,只需要标记下控件即可,如下代码所示。
<template>
<div ref="pieChartRef" style="width: 100%; height: 35vh" />
</template>
有了简单的组件,我们再次在此基础上,对不同业务表现类型的图表进行更高层次的组件封装,以便可以用在首页或者其他地方,实现多个案例重用显示的处理。
例如,对应统计某个类型的业务图表,如下所示。

对于数据的处理,我们通过接口动态获取图表统计的data数据,如下所示。
// 饼图处理
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';
这个业务图表组件,我们为了通用,也需要提供一些属性供外部传入,实现数据的动态化处理,因此通过提供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,
});
这样组件的处理逻辑代码如下所示。
// 获取当前日期
const currentDate = new Date();
const currentYear = ref(currentDate.getFullYear());
const currentMonth = ref(currentDate.getMonth() + 1); // 月份从0开始,所以加1 // 在 setup 中补充默认值(只当 props 没传时才使用当前时间)
const year = computed(() => Number(props.year || currentYear.value))
const month = computed(() => Number(props.month || currentMonth.value)) const loading = ref(true);
const barData = ref(); // 折线图数据
const pieData = ref([]); // 饼图数据 //页面初始化加载
onMounted(async () => {
await search();
}); async function search() {
loading.value = true;
await searchPie(); setTimeout(() => {
loading.value = false;
}, 500);
} // 监听 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>
其他条状图表、折线图表等其他类型的图表,依次通过这样的处理方式,可以实现业务组件的重用。
如我们可能在首页上放置一些图表组件,具体报表页面上也放置相同的图表组件,这样就可以很好的重用了。

在前端界面开发中,良好的组件封装和使用,可以给我们提供更好的开发效率,因此为了业务的快速开发,我们不仅在代码生成代码的方面持续优化,也在一些前端页面的开发中,提取一些常用的场景组件,最大化的实现代码的快速开发。
在SqlSugar的开发框架的Vue3+ElementPlus前端中增加对报表模块的封装处理,实现常规报表的快速处理的更多相关文章
- 基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理
在SqlSugar的开发框架的后端,我们基于Web API的封装了统一的返回结果,使得WebAPI的接口返回值更加简洁,而在前端,我们也需要统一对返回的结果进行解析,并获取和Web API接口对应的数 ...
- 基于SqlSugar的开发框架循序渐进介绍(12)-- 拆分页面模块内容为组件,实现分而治之的处理
在早期的随笔就介绍过,把常规页面的内容拆分为几个不同的组件,如普通的页面,包括列表查询.详细资料查看.新增资料.编辑资料.导入资料等页面场景,这些内容相对比较独立,而有一定的代码量,本篇随笔介绍基于V ...
- 基于SqlSugar的开发框架循序渐进介绍(22)-- Vue3+TypeScript的前端工作流模块中实现统一的表单编辑和表单详情查看处理
在工作流页面中,除了特定的业务表单信息外,往往也需要同时展示通用申请单的相关信息,因此在页面设计的时候需要使用一些组件化的概念来实现动态的内容展示处理,本篇随笔介绍Vue3+TypeScript+El ...
- 基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用
在我们实际项目开发过程中,往往需要根据实际情况,对组件进行封装,以更简便的在界面代码中使用,在实际的前端应用中,适当的组件封装,可以减少很多重复的界面代码,并且能够非常简便的使用,本篇随笔介绍基于El ...
- 基于SqlSugar的开发框架循序渐进介绍(14)-- 基于Vue3+TypeScript的全局对象的注入和使用
刚完成一些前端项目的开发,腾出精力来总结一些前端开发的技术点,以及继续完善基于SqlSugar的开发框架循序渐进介绍的系列文章,本篇随笔主要介绍一下基于Vue3+TypeScript的全局对象的注入和 ...
- 基于SqlSugar的开发框架循序渐进介绍(15)-- 整合代码生成工具进行前端界面的生成
在前面随笔<基于SqlSugar的开发框架循序渐进介绍(12)-- 拆分页面模块内容为组件,实现分而治之的处理>中我们已经介绍过,对于相关的业务表的界面代码,我们已经尽可能把不同的业务逻辑 ...
- 基于SqlSugar的开发框架循序渐进介绍(17)-- 基于CSRedis实现缓存的处理
在一个应用系统的开发框架中,往往很多地方需要用到缓存的处理,有些地方是为了便于记录用户的数据,有些地方是为了提高系统的响应速度,如有时候我们在发送一个短信验证码的时候,可以在缓存中设置几分钟的过期时间 ...
- 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理
在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件 ...
- 基于SqlSugar的开发框架循序渐进介绍(21)-- 在工作流列表页面中增加一些转义信息的输出,在后端进行内容转换
有时候,为了给前端页面输出内容,有时候我们需要准备和数据库不一样的实体信息,因为数据库可能记录的是一些引用的ID或者特殊字符,那么我们为了避免前端单独的进行转义处理,我们可以在后端进行统一的格式化后再 ...
- 基于SqlSugar的开发框架循序渐进介绍(26)-- 实现本地上传、FTP上传、阿里云OSS上传三者合一处理
在前面介绍的随笔<基于SqlSugar的开发框架循序渐进介绍(7)-- 在文件上传模块中采用选项模式[Options]处理常规上传和FTP文件上传>中介绍过在文件上传处理的过程中,整合了本 ...
随机推荐
- RandomAccessFile、FileInputStream、MappedByteBuffer、FileChannel 区别及应用场景
RandomAccessFile.FileInputStream.MappedByteBuffer.FileChannel 比较 这些类都是Java中用于文件I/O操作的类,但各有特点和适用场景.下面 ...
- div中文本超过指定宽度自动换行
一.场景 因为想要一个页面显示完所有的文本,所以要进行文本处理 二.代码 宽度超过1800px就自动换行 <div style="word-break: break-all; word ...
- IP到国家代码映射之GeoLite2导入到MySQL形成数据字典
一.准备CSV文件与MySQL表结构 下载并解压GeoLite2-Country-CSV数据 从 MaxMind 下载 GeoLite2-Country-CSV.zip,解压后获取以下文件: G ...
- codeup之C语言10.16(指针
Description 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换.要求用3个函数实现,分别为输入10个数.进行处理.输出10个数.要求使用指针的方法进行处理. Inpu ...
- Tomcat安装与环境配置详解
由于eclipse的很多开发版本不支持最新版的9.0,所以接下来下载的是8.0(钢铁直女的鼠标字丑的一批,极易引起不适,给各位猿兄打个预防针先) 官网地址:https://tomcat.apache. ...
- 9 easybr指纹浏览器https代理认证教程
目的 在高匿名浏览环境中,代理是关键组件之一.相比普通 HTTP 代理,HTTPS 代理(HTTP over TLS) 支持加密传输,在保障隐私.防止中间人攻击方面更具优势. Chromium 浏览器 ...
- vue中使用swiper 插件出错问题
由于我自己在写一个demo时候用到了该插件,出现了一些问题,所以就简单查了一下该插件的用法以及一些常见的错误 1.出现Get .../maps/swiper.min.js.map 500(Intern ...
- 探秘Transformer系列之(34)--- 量化基础
探秘Transformer系列之(34)--- 量化基础 目录 探秘Transformer系列之(34)--- 量化基础 0x00 概述 0x01 背景知识 1.1 需求 1.2 压缩 1.3 如何表 ...
- JS+CSS多行文本显示“更多”
本代码展示最多显示3行,每行行高16px,3行总高48px,4行总高64px 当文本行数1-3行,正常显示:当文本行数大于3行,显示"更多". CSS: #CourseDesc { ...
- AI Chat 智能聊天工具,支持DeepSeek 、Gemini、Grok、OpenAI和自定义AI
AI Chat [中文]|[English] AI Chat 是一个智能聊天工具,支持DeepSeek .Gemini.Grok.OpenAI和自定义AI,使用SwiftUI.SwiftData开发, ...