前后端交互之动态列

news2024/12/23 18:03:05

一. 情景

  • 在做项目时,有时候后会遇到后端使用了聚合函数,导致生成的对象的属性数量或数量不固定,因此无法建立一个与之对应的对象来向前端传递数据,
  • 这时可以采用NameDataListVO向前端传递数据。
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class NameDataListVO {
    private String name;                 //名称(可以是聚合函数的分组名)
    private List<BigDecimal> data1;      //数据
    private List<BigDecimal> data2;
    private List<String> desp;            //与数据List的长度相等,用于描述每个数据的含义 
}

二. 前端处理

1. 数据显示

要想显示如下的数据
在这里插入图片描述

(1) 前端接收的List< NameDataVOList>对象(其中每个对象的desp字段保持一致

this.rawData=[
    {
      "name": "2023",
      "data1": [85.5, 92.3, 88.1, 91.4, 87.6, 89.8, 93.2, 90.0, 86.7, 88.9, 92.5, 91.1],
      "data2": null,
      "desp": ["张三", "李四", "王五", "赵六", "钱七", "周八", "吴九", "郑十", "王十一", "李十二", "赵十三", "孙十四"]
    },
    {
      "name": "2022",
      "data1": [82.4, 90.5, 85.3, 89.7, 84.2, 86.9, 88.4, 83.6, 87.8, 91.2, 90.1, 84.5],
      "data2": null,
      "desp": ["张三", "李四", "王五", "赵六", "钱七", "周八", "吴九", "郑十", "王十一", "李十二", "赵十三", "孙十四"]
    },
  ]

要想在前端正确显示,必须将data由数组转为prop:value(注意:为了使得this.columnList中的列名(label)与属性(prop)一一对应,可以以data_${index}来命名属性)

this.columnList=["张三", "李四", "王五", "赵六", "钱七", "周八", "吴九", "郑十", "王十一", "李十二", "赵十三", "孙十四"]
this.processedData=[
    {
      "name": "2023",
      "data_0":85.5,
      "data_1":92.3
      "data_2":88.1
      "data_3":91.4

    },
    {
      "name": "2022",
      "data_0":85.5,
      "data_1":92.3
      "data_2":88.1
      "data_3":91.4
    },
  ]
  • 前端数据处理代码:
    if (this.rawData.length > 0) {
       this.columnList = this.rawData[0].dep;
       this.processedData=processData(this.rawData)
   }
   processData(rawData) {
      return rawData.map(item => {
        const processedItem = {
          name: item.name,
        };
        item.data1.forEach((data, index) => {
          processedItem[`data_${index}`] = data;
        });
        return processedItem;
      });
    },

(2) 前端页面显示

<el-table :data="processedData" height="800" v-loading="loading" @selection-change="handleSelectionChange">
    <el-table-column type="selection" width="55" />
          <el-table-column prop="name" label="聚类名称" sortable width="60" align="center" />
          <el-table-column v-for="(column, index) in columnList" :key="index" :label="column" :prop="`data_${index}`"
            align="center" v-if="columns[index].visible">
            <template slot-scope="scope">
              <span>{{ scope.row[`data_${index}`] }}</span>
            </template>
   </el-table-column>
</el-table>
2. 显隐列

新建列配置列表this.columns,通过使用 v-if=“columns[index].visible” 来控制是该列是否显示

//构建columns配置列表
    buildColumns(rawData) {
      // 初始化一个空数组用于存储列配置
      this.columns = [];

      // 将列名称添加到列配置中,动态生成key
      this.columnList.forEach((c, index) => {
        let key = this.columns.length; // 使用 this.columns 数组的当前长度作为 key
        this.columns.push({
          key: key,
          label: c,
          visible: true
        });
      });
    },
3. Echarts图表显示
  • chartOptions 是一个计算属性,它返回一个对象,这个对象包含了图表的配置项。每当组件的数据发生变化时,chartOptions 会重新计算,并且图表会根据新的配置进行更新。
<template>
 <div class="app-container">
   <!-- ... 其他代码 ... -->

   <!-- 生成图表按钮 -->
   <el-button type="warning" plain icon="el-icon-s-data" size="mini" @click="handleGraph">生成图表</el-button>

   <!-- ... 其他代码 ... -->

   <!-- 图表对话框 -->
   <el-dialog title="图表展示" :visible.sync="chartDialogVisible" width="80%">
     <div ref="chart" style="width: 100%; height: 500px;"></div>
   </el-dialog>

   <!-- ... 其他代码 ... -->
 </div>
</template>

<script>
// 引入echarts
import * as echarts from 'echarts';

export default {
 // ... 其他选项 ...

 data() {
   return {
     // ... 其他数据 ...
     chartDialogVisible: false, // 控制图表对话框的显示
     // 假设yearList是存储年份的数组
     yearList: [],
   };
 },
 computed: {
   // ... 其他计算属性 ...

   chartOptions() {
     const xAxisData = this.columnList;
     const seriesData = this.processedData.map(item => ({
       name: item.name,
       type: 'bar',
       data: Object.keys(item)
         .filter(key => key.startsWith('data_')) // 过滤出以 'data_' 开头的键
         .map(key => item[key]) // 获取每个 'data_X' 属性的值
     }));

     return {
       legend: {
         data: this.nameList
       },
       tooltip: {},
       xAxis: {
         type: 'category',
         data: xAxisData,

       },
       yAxis: {
         // // 设置 y 轴的最大值为数据中的最大值加上 20%
         // max: (value) => {
         //   return value.max + value.max * 0.2;
         // }
       },
       dataZoom: [
         {
           type: 'slider',
           show: true,
           xAxisIndex: [0],
           start: 1,
           end: 35
         },
         {
           type: 'inside',
           xAxisIndex: [0],
           start: 1,
           end: 35
         }
       ],
       toolbox: {
         show: true,
         feature: {
           mark: { show: true },
           saveAsImage: { show: true },
         }
       },
       series: seriesData
     };
   }
 },
 methods: {
   // ... 其他方法 ...

   // 处理图表显示
   handleGraph() {
     this.chartDialogVisible = true;
     this.$nextTick(() => {
       this.initChart();
     });
   },

   // 初始化图表
   initChart() {
     const chart = echarts.init(this.$refs.chart);
     const options = this.chartOptions;
     chart.setOption(options);
   },

   // ... 其他方法 ...
 }
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2241798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

json转excel,读取json文件写入到excel中【rust语言】

一、rust代码 将json文件写入到 excel中。&#xff08;保持json &#xff1a;key原始顺序&#xff09; 可执行程序: 「json2excel.exe」 链接&#xff1a;https://pan.quark.cn/s/fe851c86c659 use indexmap::IndexMap; use serde::Deserialize; use serde_json::{Value,…

【python系列】python数据类型之数字类型

1.定义 数字类型是编程中最常用的数据类型。什么是数字类型&#xff0c;下面是数字类型官方文档的解释&#xff1a;https://docs.python.org/zh-cn/3.10/library/stdtypes.html?highlightstr%20join#numeric-types-int-float-complex 以上可以知道&#xff1a; 数字类型包…

[Redis] Redis服务集群

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

LLaMA-Factory全流程训练模型

&#x1f917;本文主要讲述在docker下使用LLaMA-Factory训练推理模型。 &#x1fae1;拉取镜像 首先需要启动docker&#xff0c;然后在终端中输入&#xff1a; docker run -tid --gpus all -p 8000:8000 --name LLM -e NVIDIA_DRIVER_CAPABILITIEScompute,utility -e NVIDIA…

计算机组成原理对于学习嵌入式开发的意义

计算机组成原理对于学习嵌入式开发的意义 前言 最近有位同学向我咨询&#xff0c;问学习嵌入式开发需不需要学习硬件&#xff1f;进而引申到了需不需要学习计算机组成原理呢&#xff1f; 正文 首先计算机组成原理是计算机科学与技术专业的一门核心基础课程&#xff0c;它深入…

Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式

此去经年&#xff0c;再难同游 —— 24.11.11 一、什么是设计模式 设计模式是一种编程套路&#xff0c;可以极大的方便程序的开发最常见、最经典的设计模式&#xff0c;就是我们所学习的面向对象了。 除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模…

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…

2024游戏陪玩app源码的功能介绍/线上陪玩交友上线即可运营软件平台源码搭建流程

一个完整的陪玩交友系统从概念到实现再到维护的全过程得以清晰展现。每一步都需要团队的紧密协作与细致规划&#xff0c;以确保系统既满足用户需求&#xff0c;又具备良好的稳定性和可扩展性。 基础框架 移动端开发框架&#xff1a;如uniapp&#xff0c;它支持多平台开发&…

AGI自学分享,简单有用的理论与实践

开始必备 谷歌邮箱 没有谷歌邮箱简直“寸步难行”。 GitHub Build and ship software on a single, collaborative platform GitHub GitHub上有所有开源项目的源代码&#xff0c;当然还有许许多多资源的分享。 huggingface huggingface上的space可以试用许多模型demo&a…

基于stm32的智能变频电冰箱系统

基于stm32的智能变频电冰箱系统 持续更新&#xff0c;欢迎关注!!! 基于stm32的智能变频电冰箱系统 随着集成电路技术的发展&#xff0c;单片微型计算机的功能也不断增强&#xff0c;许多高性能的新型机种不断涌现出来。单片机以其功能强、体积小、可靠性高、造价低和开发周期短…

[OpenGL]使用OpenGL实现透明效果

一、简介 本文介绍了如何使用OpenGL实现透明效果&#xff08;transparent&#xff09;&#xff0c;并在最后给出了全部的代码。 在实现透明效果时&#xff0c;使用OpenGL中的混合&#xff08;Blend&#xff09;功能&#xff0c;根据纹理贴图的 alpha 分量将各像素&#xff08;…

ABAP关于PS模块CJ20N中项目物料的屏幕和字段增强CI_RSADD

网上搜关于CJ20N的屏幕增强,基本都是关于项目定义(CI_PROJ)、项目WBS(CI_PRPS)、项目网络活动工序(CI_AFVU)的字段与屏幕增强,几乎没有关于项目物料(CI_RSADD)的字段屏幕增强,我在这里做一个分享。 主要逻辑:实现badi增强,并自建一个函数组后创建屏幕,在badi里面调用…

Android setTheme设置透明主题无效

【问题现象】 1、首先&#xff0c;你在AndroidManifest.xml中声明一个activity&#xff0c;不给application或者activity设置android:theme, 例如这样&#xff1a; <applicationandroid:allowBackup"true"android:icon"mipmap/ic_launcher"android:lab…

windows下git和TortoiseGit(小乌龟)和putty安装配置对github进行操作

本次安装版本如下&#xff1a; 1&#xff0c;先下载安装tortoiseGit一路下载安装即可一直到在桌面上右键可以看到有git的选项出现为止&#xff0c;注意在第一步的时候选择使用putty还是ssh建立网络连接决定后面的步骤&#xff0c;本次以选择putty为例。 2&#xff0c;安装git&a…

Flutter:input输入框

输入框&#xff1a; // 是否显示关闭按钮 bool _showClear false; // 文字编辑控制器&#xff0c;监听搜索框的变化。 final TextEditingController _controller TextEditingController(); // 输入框发生变化事件 void _onChange(String value){if(value.length > 0){setS…

Ubuntu相关指令

1、查看 Ubuntu 系统的版本信息&#xff0c;在终端输入&#xff1a; lsb_release -a该命令会输出类似如下的信息&#xff1a; No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04 Codename: jammy 在 Re…

Unity教程(十八)战斗系统 攻击逻辑

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

【软件测试】设计测试用例的方法(正交法、判定表法、错误猜测法),测试文档的写法

文章目录 正交法正交表设计正交表 判定表法判定表 设计测试用例的步骤 错误猜测法测试文档 正交法 正交试验设计(Orthogonal experimentaldesign)是研究多因素多⽔平的⼀种设计⽅法&#xff0c;它是根据正交性&#xff0c;由试验因素的全部⽔平组合中挑选出部分有代表性的点进…

MySQL技巧之跨服务器数据查询:进阶篇-从A数据库复制到B数据库的表中

MySQL技巧之跨服务器数据查询&#xff1a;进阶篇-从A数据库复制到B数据库的表中 基础篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQ…

网络安全练习之 ctfshow_web

文章目录 VIP题目限免&#xff08;即&#xff1a;信息泄露题&#xff09;源码泄露前台JS绕过协议头信息泄露robots后台泄露phps源码泄露源码压缩包泄露版本控制泄露源码(git)版本控制泄露源码2(svn)vim临时文件泄露cookie泄露域名txt记录泄露敏感信息公布内部技术文档泄露编辑器…