Java后端 || ElementUI 显示后端树形表格数据

devtools/2024/10/21 10:06:15/

文章目录

  • 1、前端源码
  • 2、数据库设计
  • 3、后端设计
    • 3.1、实体类
    • 3.2、Controller层
    • 3.3、具体树形列表后端代码实现

1、前端源码

ElementUI Table 链接

在此链接中找到 树形数据与懒加载

在这里插入图片描述
查看其JS源码,可知,每个菜单节点的子节点存放于children字段中,

java">const tableData: User[] = [{id: 1,date: '2016-05-02',name: 'wangxiaohu',address: 'No. 189, Grove St, Los Angeles',},{id: 2,date: '2016-05-04',name: 'wangxiaohu',address: 'No. 189, Grove St, Los Angeles',},{id: 3,date: '2016-05-01',name: 'wangxiaohu',address: 'No. 189, Grove St, Los Angeles',children: [{id: 31,date: '2016-05-01',name: 'wangxiaohu',address: 'No. 189, Grove St, Los Angeles',},{id: 32,date: '2016-05-01',name: 'wangxiaohu',address: 'No. 189, Grove St, Los Angeles',},],},{id: 4,date: '2016-05-03',name: 'wangxiaohu',address: 'No. 189, Grove St, Los Angeles',},
]

将示例代码复制到项目中,此处根据源码做了符合自己项目的修改,主要复制el-table中的内容

<el-table:data="list"style="width: 100%; margin-bottom: 20px"row-key="id"borderdefault-expand-all><el-table-column prop="title" label="菜单标题" /><el-table-column prop="component" label="路由名称" /><el-table-column prop="sortValue" label="排序" /><el-table-column prop="status" label="状态" #default="scope">{{ scope.row.status == 1 ? '正常' : '停用' }}</el-table-column><el-table-column prop="createTime" label="创建时间" /><el-table-column label="操作" align="center" width="280" #default="scope" ><el-button type="success" size="small" @click="addShow(scope.row)">添加下级节点</el-button><el-button type="primary" size="small" @click="editShow(scope.row)">修改</el-button><el-button type="danger" size="small" @click="remove(scope.row.id)">删除</el-button></el-table-column></el-table><script setup>javascript">
import { ref , onMounted } from "vue"// 定义表格数据模型
const list = ref([])
//页面表单数据
const defaultForm = {id: '',parentId: 0,title: '',url: '',component: '',icon: '',sortValue: 1,status: 1,
}// 钩子函数
onMounted(() => {fetchData()
})const fetchData = async () => {const { code, data, message } = await FindNodes()list.value = data
}
</script>

前端js配置文件

import request from '@/utils/request'
const api_name = '/admin/system/sysMenu'export const FindNodes = () => {return request({url: `${api_name}/findNodes`,method: 'get',})
}

2、数据库设计

每个菜单有自己的id,还有其父节点的parent_id(用于表示父子关系,双亲表示法)
在这里插入图片描述
给出SQL DDL 注:基于MySQL 8.0.30

CREATE TABLE `sys_menu` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',`parent_id` bigint NOT NULL DEFAULT '0' COMMENT '所属上级',`title` varchar(20) NOT NULL DEFAULT '' COMMENT '菜单标题',`component` varchar(100) DEFAULT NULL COMMENT '组件名称',`sort_value` int NOT NULL DEFAULT '1' COMMENT '排序',`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:禁止,1:正常)',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0:不可用 1:可用)',PRIMARY KEY (`id`),KEY `idx_parent_id` (`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='菜单表'

3、后端设计

3.1、实体类

这边先把公共的属性抽取出来 组成BaseEntity类,然后将菜单的属性定义在SysMenu类,并继承BaseEntity

java">// BaseEntity 类@Data
public class BaseEntity implements Serializable {@Schema(description = "唯一标识")private Long id;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@Schema(description = "创建时间")private Date createTime;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@Schema(description = "修改时间")private Date updateTime;@Schema(description = "是否删除")private Integer isDeleted;}
java">// SysMenu 类@Data
public class SysMenu extends BaseEntity {@Schema(description = "父节点id")private Long parentId;@Schema(description = "节点标题")private String title;@Schema(description = "组件名称")private String component;@Schema(description = "排序值")private Integer sortValue;@Schema(description = "状态(0:禁止,1:正常)")private Integer status;// 下级列表@Schema(description = "子节点")private List<SysMenu> children;}

3.2、Controller层

常规调用,注意"/findNodes"路径与前端js文件中保持一致

java">// 显示菜单列表方法
@GetMapping("/findNodes")
public Result findNodes(){List<SysMenu> sysMenuList = sysMenuService.findNodes();return Result.build(sysMenuList, ResultCodeEnum.SUCCESS);
}

3.3、具体树形列表后端代码实现

代码3.1为实现类中的方法,此代码中sysMenuMapper.findAll() 用于查询所有菜单,其SQL如下
select * from sys_menu where is_deleted = 0 order by sort_value

此外,其中的MenuHelper为自定义的一个类,在代码3.2中给出,该类的静态方法buildTree为具体的递归构造树形菜单的方法(该方法的参数为:菜单列表数据)。

buildTree方法调用了递归函数findChildren(该递归函数的参数为:已知的父节点,菜单列表数据),其思路是:已知的父节点为N0,再找出子节点N1,并递归地为N1节点的children属性赋值,然后将N1添加至N0的children中。

代码3.1:

java">// 递归查找列表
@Override
public List<SysMenu> findNodes() {// 1.先查询所有菜单,返回所有list集合List<SysMenu> sysMenuList = sysMenuMapper.findAll();if (CollectionUtils.isEmpty(sysMenuList)){return null;}// 2.调用工具类中的方法,返回树形数据结构列表List<SysMenu> treeList = MenuHelper.buildTree(sysMenuList);return treeList;
}

代码3.2:

java">public class MenuHelper {// 递归实现封装public static List<SysMenu> buildTree(List<SysMenu> sysMenuList){// TODO 完成封装过程List<SysMenu> trees = new ArrayList<>();for (SysMenu sysMenu : sysMenuList) {// 找到递归入口if (sysMenu.getParentId().longValue()==0){// 根据第一层,找下一层的数据trees.add(findChildren(sysMenu, sysMenuList));}}return trees;}// 返回已经封装好children字段的 菜单节点private static SysMenu findChildren(SysMenu sysMenu, List<SysMenu> sysMenuList) {// 初始化sysMenu.setChildren(new ArrayList<>());for (SysMenu menu : sysMenuList) {if(menu.getParentId().longValue()==sysMenu.getId().longValue()){sysMenu.getChildren().add(findChildren(menu, sysMenuList));}}return sysMenu;}
}

最终效果:

在这里插入图片描述


http://www.ppmy.cn/devtools/55791.html

相关文章

【前端】HTML5基础

目录 0 参考1 网页1.1 什么是网页1.2 什么是HTML1.3 网页的形成 2 浏览器2.1 常用的浏览器2.2 浏览器内核 3 Web标准3.1 为什么需要Web标准3.2 Web标准的构成 4 HTML 标签4.1 HTML语法规范4.1.1 基本语法概述4.1.2 标签关系4.1.2.1 包含关系4.1.2.2 并列关系 4.2 HTML基本结构标…

大学生毕业季,寄物流快递避雷指南

随着毕业季的来临&#xff0c;大学生们纷纷开始整理自己的行李&#xff0c;准备离开校园&#xff0c;踏入社会。 在这个过程中&#xff0c;寄送快递成为了一个不可或缺的环节。然而&#xff0c;在寄送快递的过程中&#xff0c;如果不注意一些细节&#xff0c;很容易遭遇各种“…

深入解析Linux中的用户态与内核态

引言 在计算机科学中&#xff0c;为了保障系统安全和资源管理的有序性&#xff0c;操作系统引入了内核态和用户态的概念。这两种状态在权限、资源访问和系统控制方面存在显著差异&#xff0c;它们共同确保了操作系统的稳定性和安全性。 一、内核态与用户态的基本概念 内核态&…

docker 搭建 redis 集群

Redis主从集群结构 下图就是一个简单的Redis主从集群结构&#xff1a; 如图所示&#xff0c;集群中有一个master节点、两个slave节点&#xff08;现在叫replica&#xff09;。当我们通过Redis的Java客户端访问主从集群时&#xff0c;应该做好路由&#xff1a; 如果是写操作&…

如何在 qmake(QtCreator)中指定 Mac 平台

在 Qt 项目文件(.pro 文件)中设置针对 Mac OS 的配置项。通常情况下,我们可以使用如下方式为 Windows 和 Unix 系统分别添加源文件: win32 {SOURCES += hellowin.cpp } unix {SOURCES += hellounix.cpp }虽然 Mac OS 是类 Unix 系统,但有时我们仍然需要区分它和 Linux 系…

【UE5.3】笔记2--资源导入

资源导入 方式一&#xff1a;内置资源--初学者内容包 方式二&#xff1a;虚幻商城 搜索免费资源&#xff1a; 添加到工程之后 搜素&#xff1a;虚幻学习工具包&#xff0c;需要注意的是支持的引擎版本 当然商城里包含了大量的免费的资源&#xff0c;初期学习不想投入太多可以…

vivado SLR

描述 超级逻辑区&#xff08;SLR&#xff09;是包含在堆叠硅中的单个FPGA芯片 互连&#xff08;SSI&#xff09;设备。堆叠式硅互连&#xff08;SSI&#xff09;技术使用无源硅 具有微凸块和硅通孔&#xff08;TSV&#xff09;的内插器&#xff0c;用于组合多个FPGA管芯 切片&a…

图像亮度和对比度的调整

在网上找了很多图像亮度的调整算法&#xff0c;下面是其中一种&#xff0c;可以通过条形框进行调整&#xff0c;并实时的查看对应参数值后的效果。 图像亮度处理公式: y [x - 127.5 * (1 - B)] * k 127.5 * (1 B); x 是输入像素值 y 是输出像素值 B 是亮度值&#xff0c; …