设备,楼,层三者依次为父子节点,左边是右边的父节点,请设计出MySQL数据库表,只使用一张数据库的表,后端java语言如何去查询并且返回给前端,前端用<el-tree>渲染出来,写出全部代码
时间: 2024-05-15 14:18:14 浏览: 171
好的,可以开始回答你的问题了。针对你的问题,我可以设计一张名为“building”的MySQL数据库表,如下所示:
| 字段名称 | 数据类型 | 描述 |
| -------- | ------------ | ------------------ |
| id | int | 主键,自增长 |
| name | varchar(100) | 名称 |
| parent | int | 父节点的id,为空表示根节点 |
其中,根节点的parent字段为空。以设备、楼、层为例,可以插入如下数据:
| id | name | parent |
| --- | ------- | ------ |
| 1 | 设备1 | 2 |
| 2 | 楼1 | 3 |
| 3 | 层1 | 4 |
| 4 | 根节点 | NULL |
上述数据库表的Java后端实现代码如下:
```java
@RestController
@RequestMapping("/building")
public class BuildingController {
private final BuildingRepository buildingRepository;
@Autowired
public BuildingController(BuildingRepository buildingRepository) {
this.buildingRepository = buildingRepository;
}
@GetMapping("/tree")
public List<BuildingDto> getBuildingTree() {
List<BuildingDto> buildingDtos = new ArrayList<>();
// 查询所有的根节点
List<Building> rootNodes = buildingRepository.findByParentIsNull();
// 构造以根节点为顶点的树形结构
for (Building rootNode : rootNodes) {
BuildingDto rootNodeDto = new BuildingDto();
rootNodeDto.setId(rootNode.getId());
rootNodeDto.setName(rootNode.getName());
rootNodeDto.setChildren(getChildren(rootNode));
buildingDtos.add(rootNodeDto);
}
return buildingDtos;
}
private List<BuildingDto> getChildren(Building parentBuilding) {
List<BuildingDto> childrenDtos = new ArrayList<>();
List<Building> children = buildingRepository.findByParent(parentBuilding.getId());
for (Building child : children) {
BuildingDto childDto = new BuildingDto();
childDto.setId(child.getId());
childDto.setName(child.getName());
childDto.setChildren(getChildren(child));
childrenDtos.add(childDto);
}
return childrenDtos;
}
}
```
其中,Building和BuildingDto分别代表数据库表中的记录和前端渲染所需的数据格式,定义如下:
```java
@Entity
@Table(name = "building")
public class Building {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@Column(name = "parent")
private Integer parentId;
// 省略getter和setter方法
}
```
```java
public class BuildingDto {
private Integer id;
private String name;
private List<BuildingDto> children;
// 省略getter和setter方法
}
```
最后,前端可以使用<el-tree>组件进行渲染,代码如下:
```html
<template>
<el-tree :data="treeData" :props="{label: 'name', children: 'children'}"></el-tree>
</template>
<script>
import axios from 'axios'
export default {
data() {
return {
treeData: []
}
},
mounted() {
this.getTreeData();
},
methods: {
async getTreeData() {
const response = await axios.get('/building/tree');
this.treeData = response.data;
}
}
}
</script>
```
以上就是全部的代码实现。注意,这里为了简单起见,省略了所有的异常处理、日志记录等非核心代码。如果你需要使用该代码,需要根据自己的实际情况进行相应的修改和完善。
阅读全文