设备,楼,层三者依次为父子节点,请设计出MySQL数据库表,后端java语言如何去查询并且返回给前端,前端用<el-tree>渲染出来,写出全部代码
时间: 2024-05-21 18:11:51 浏览: 107
好的,我理解您的要求。针对您的问题,我给出以下 MySQL 数据库表的设计:
CREATE TABLE device (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE floor (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
device_id int(11) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (device_id) REFERENCES device(id)
);
CREATE TABLE building (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
floor_id int(11) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (floor_id) REFERENCES floor(id)
);
其中,设备(device)、楼层(floor)和建筑(building)分别存储设备、楼层和建筑的基本信息。设备和楼层之间是一对多的关系,楼层和建筑之间也是一对多的关系。
后端 Java 语言的代码如下:
@GetMapping("/buildings")
public List<Building> getBuildings() {
List<Building> buildings = buildingRepository.findAll();
for (Building building : buildings) {
List<Floor> floors = floorRepository.findByBuildingId(building.getId());
for (Floor floor : floors) {
List<Device> devices = deviceRepository.findByFloorId(floor.getId());
floor.setDevices(devices);
}
building.setFloors(floors);
}
return buildings;
}
这段代码通过调用各个仓库(如 buildingRepository、floorRepository 和 deviceRepository)来获取对应的数据。然后,它循环遍历所有建筑物,获取其中的楼层和设备。最后,将所有的数据合并到建筑物对象中并返回给前端。
前端 Vue.js 框架中,使用 <el-tree> 控件来渲染建筑物数据。代码如下:
<template>
<el-tree :data="buildings" :props="treeProps"></el-tree>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
buildings: []
};
},
created() {
axios.get('/buildings').then(response => {
this.buildings = response.data;
});
},
computed: {
treeProps() {
return {
children: 'floors',
label: 'name',
isLeaf: node => !node.floors
};
}
}
};
</script>
这段代码通过 HTTP GET 请求获取建筑物数据,并在响应时将其存储到 Vue 组件中的 buildings 数据中。然后,它使用 <el-tree> 控件来渲染数据。其中,children、label 和 isLeaf 属性分别指定了建筑物、楼层和设备数据在树中的对应位置,以及每一个节点是否是叶子节点。
阅读全文