多级菜单spring
时间: 2025-02-03 20:13:19 浏览: 28
### 实现动态多级菜单功能
#### 1. 数据库设计
为了支持多级菜单,数据库表 `menu` 需要包含字段来表示父子关系。通常会有一个 `parent_id` 字段指向父菜单的 ID。如果 `parent_id` 是 NULL,则表示这是一个顶级菜单。
```sql
CREATE TABLE menu (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
url VARCHAR(255),
parent_id INT DEFAULT NULL,
permission VARCHAR(255),
FOREIGN KEY (parent_id) REFERENCES menu(id)
);
```
#### 2. 创建实体类
创建一个 Java 类来映射数据库中的 `menu` 表:
```java
public class Menu {
private Integer id;
private String name;
private String url;
private Integer parentId;
private String permission;
// Getters and Setters...
}
```
#### 3. 定义 Mapper 接口
定义 MyBatis 的 Mapper 接口来进行数据操作:
```java
@Mapper
public interface MenuMapper {
List<Menu> getAllMenus();
void insertMenu(Menu menu);
void updateMenu(Menu menu);
void deleteMenu(Integer id);
}
```
#### 4. 编写 Service 层逻辑
编写业务服务层代码,在这里处理复杂的业务需求,如构建树形结构等:
```java
@Service
public class MenuService {
@Autowired
private MenuMapper menuMapper;
/**
* 获取所有菜单并转换成树状结构.
*/
public List<Menu> getTreeStructureMenus() {
List<Menu> allMenus = menuMapper.getAllMenus();
Map<Integer, Menu> map = new HashMap<>();
for (Menu m : allMenus) {
map.put(m.getId(), m);
}
List<Menu> rootMenus = new ArrayList<>();
for (Menu m : allMenus) {
if (m.getParentId() != null && map.containsKey(m.getParentId())) {
Menu parent = map.get(m.getParentId());
if (!parent.getChildren().contains(m)) {
parent.getChildren().add(m);
}
} else {
rootMenus.add(m);
}
}
return rootMenus;
}
}
```
注意上述代码假设每个 `Menu` 对象都有一个名为 `children` 的属性列表用来保存子节点[^1]。
#### 5. 控制器配置
设置 RESTful API 来暴露获取菜单的服务接口给前端调用:
```java
@Controller
@RequestMapping("/api/menus")
@ResponseBody
public class MenuController {
@Autowired
private MenuService menuService;
@GetMapping("")
public ResponseEntity<List<Menu>> getAllMenus() {
try {
List<Menu> menus = menuService.getTreeStructureMenus();
return new ResponseEntity<>(menus, HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
```
通过这种方式,当用户请求 `/api/menus` 路径时,服务器将会返回整个菜单体系的数据,并且这些数据已经被整理成了易于渲染的形式。
阅读全文
相关推荐


















