diff --git a/backend/src/main/java/com/qqchen/deploy/backend/api/MenuApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/api/MenuApiController.java new file mode 100644 index 00000000..7a26f8ed --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/api/MenuApiController.java @@ -0,0 +1,49 @@ +package com.qqchen.deploy.backend.api; + +import com.qqchen.deploy.backend.entity.Menu; +import com.qqchen.deploy.backend.entity.Tenant; +import com.qqchen.deploy.backend.framework.api.Response; +import com.qqchen.deploy.backend.framework.controller.BaseController; +import com.qqchen.deploy.backend.model.MenuDTO; +import com.qqchen.deploy.backend.model.TenantDTO; +import com.qqchen.deploy.backend.model.query.MenuQuery; +import com.qqchen.deploy.backend.model.query.TenantQuery; +import com.qqchen.deploy.backend.model.response.MenuResponse; +import com.qqchen.deploy.backend.service.IMenuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Slf4j +@RestController +@RequestMapping("/api/v1/menu") +@Tag(name = "菜单管理API", description = "对外提供的菜单管理接口") +public class MenuApiController extends BaseController { + + @Resource + private IMenuService menuService; + + /** + * 获取当前用户的菜单 + */ + @Operation(summary = "获取当前用户的菜单") + @GetMapping("/current") + public Response> getCurrentUserMenus() { + // TODO: 从 SecurityContext 获取当前用户ID +// return Response.success(menuService.getUserMenus(1L)); + return null; + } + + @Override + protected void exportData(HttpServletResponse response, List data) { + + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/controller/MenuController.java b/backend/src/main/java/com/qqchen/deploy/backend/controller/MenuController.java new file mode 100644 index 00000000..a347c2e5 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/controller/MenuController.java @@ -0,0 +1,49 @@ +//package com.qqchen.deploy.backend.controller; +// +//import com.qqchen.deploy.backend.entity.Menu; +//import com.qqchen.deploy.backend.framework.api.Response; +//import com.qqchen.deploy.backend.framework.controller.BaseController; +//import com.qqchen.deploy.backend.model.MenuDTO; +//import com.qqchen.deploy.backend.model.query.MenuQuery; +//import com.qqchen.deploy.backend.model.response.MenuResponse; +//import com.qqchen.deploy.backend.service.IMenuService; +//import io.swagger.v3.oas.annotations.Operation; +//import io.swagger.v3.oas.annotations.tags.Tag; +//import jakarta.servlet.http.HttpServletResponse; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//import java.util.List; +// +//@Slf4j +//@RestController +//@RequestMapping("/api/v1/menu") +//@Tag(name = "菜单管理", description = "菜单管理相关接口") +//public class MenuController extends BaseController { +// +// /** +// * 获取菜单树 +// */ +// @Operation(summary = "获取菜单树") +// @GetMapping("/tree") +// public Response> getMenuTree() { +// return Response.success(((IMenuService) service).getMenuTree()); +// } +// +// /** +// * 获取当前用户的菜单 +// */ +// @Operation(summary = "获取当前用户的菜单") +// @GetMapping("/current") +// public Response> getCurrentUserMenus() { +// // TODO: 从 SecurityContext 获取当前用户ID +// return Response.success(((IMenuService) service).getUserMenus(1L)); +// } +// +// @Override +// protected void exportData(HttpServletResponse response, List data) { +// +// } +//} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/converter/MenuConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/converter/MenuConverter.java new file mode 100644 index 00000000..80cdfa95 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/converter/MenuConverter.java @@ -0,0 +1,21 @@ +package com.qqchen.deploy.backend.converter; + +import com.qqchen.deploy.backend.entity.Menu; +import com.qqchen.deploy.backend.framework.converter.BaseConverter; +import com.qqchen.deploy.backend.model.MenuDTO; +import com.qqchen.deploy.backend.model.request.MenuRequest; +import com.qqchen.deploy.backend.model.response.MenuResponse; +import org.mapstruct.Mapper; + +import java.util.List; + +@Mapper(config = BaseConverter.class) +public interface MenuConverter extends BaseConverter { + + MenuDTO requestToDto(MenuRequest request); + + MenuResponse toResponse(Menu menu); + + List toResponseList(List dtos); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/entity/Menu.java b/backend/src/main/java/com/qqchen/deploy/backend/entity/Menu.java index 47b05793..8852da88 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/entity/Menu.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/entity/Menu.java @@ -15,29 +15,56 @@ import lombok.EqualsAndHashCode; @LogicDelete public class Menu extends Entity { + /** + * 菜单名称 + */ @Column(nullable = false) private String name; - private String permission; - + /** + * 菜单路径 + */ private String path; + /** + * 前端组件路径 + */ private String component; - @Column(nullable = false) - private Integer type; // 0-目录 1-菜单 2-按钮 - + /** + * 菜单图标 + */ private String icon; - @Column(name = "parent_id") + /** + * 权限标识 + */ + private String permission; + + /** + * 菜单类型(1:目录 2:菜单 3:按钮) + */ + @Column(nullable = false) + private Integer type; + + /** + * 父级菜单ID + */ private Long parentId; + /** + * 显示顺序 + */ @Column(nullable = false) - private Integer sort = 0; + private Integer sort; - private Boolean hidden = false; + /** + * 是否隐藏(true:隐藏 false:显示) + */ + private Boolean hidden; - @Column(nullable = false) - private Boolean enabled = true; - + /** + * 是否启用(true:启用 false:禁用) + */ + private Boolean enabled; } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/model/MenuDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/model/MenuDTO.java new file mode 100644 index 00000000..678f4d82 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/model/MenuDTO.java @@ -0,0 +1,64 @@ +package com.qqchen.deploy.backend.model; + +import com.qqchen.deploy.backend.framework.dto.BaseDTO; +import lombok.Data; + +import java.util.List; + +@Data +public class MenuDTO extends BaseDTO { + /** + * 菜单名称 + */ + private String name; + + /** + * 菜单路径 + */ + private String path; + + /** + * 前端组件路径 + */ + private String component; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 权限标识 + */ + private String permission; + + /** + * 菜单类型(1:目录 2:菜单 3:按钮) + */ + private Integer type; + + /** + * 父级菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private Integer sort; + + /** + * 是否隐藏(true:隐藏 false:显示) + */ + private Boolean hidden; + + /** + * 是否启用(true:启用 false:禁用) + */ + private Boolean enabled; + + /** + * 子菜单列表 + */ + private List children; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/model/query/MenuQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/model/query/MenuQuery.java new file mode 100644 index 00000000..0ed19e86 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/model/query/MenuQuery.java @@ -0,0 +1,27 @@ +package com.qqchen.deploy.backend.model.query; + +import com.qqchen.deploy.backend.framework.query.BaseQuery; +import lombok.Data; + +@Data +public class MenuQuery extends BaseQuery { + /** + * 菜单名称 + */ + private String name; + + /** + * 菜单路径 + */ + private String path; + + /** + * 菜单类型 + */ + private Integer type; + + /** + * 是否启用 + */ + private Boolean enabled; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/model/request/MenuRequest.java b/backend/src/main/java/com/qqchen/deploy/backend/model/request/MenuRequest.java new file mode 100644 index 00000000..d8bea810 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/model/request/MenuRequest.java @@ -0,0 +1,61 @@ +package com.qqchen.deploy.backend.model.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class MenuRequest { + /** + * 菜单名称 + */ + @NotBlank(message = "菜单名称不能为空") + private String name; + + /** + * 菜单路径 + */ + private String path; + + /** + * 前端组件路径 + */ + private String component; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 权限标识 + */ + private String permission; + + /** + * 菜单类型(1:目录 2:菜单 3:按钮) + */ + @NotNull(message = "菜单类型不能为空") + private Integer type; + + /** + * 父级菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + /** + * 是否隐藏(true:隐藏 false:显示) + */ + private Boolean hidden; + + /** + * 是否启用(true:启用 false:禁用��� + */ + private Boolean enabled; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/model/response/MenuResponse.java b/backend/src/main/java/com/qqchen/deploy/backend/model/response/MenuResponse.java new file mode 100644 index 00000000..5027c6e4 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/model/response/MenuResponse.java @@ -0,0 +1,89 @@ +package com.qqchen.deploy.backend.model.response; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class MenuResponse { + /** + * 菜单ID + */ + private Long id; + + /** + * 菜单名称 + */ + private String name; + + /** + * 菜单路径 + */ + private String path; + + /** + * 前端组件路径 + */ + private String component; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 权限标识 + */ + private String permission; + + /** + * 菜单类型(1:目录 2:菜单 3:按钮) + */ + private Integer type; + + /** + * 父级菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private Integer sort; + + /** + * 是否隐藏(true:隐藏 false:显示) + */ + private Boolean hidden; + + /** + * 是否启用(true:启用 false:禁用) + */ + private Boolean enabled; + + /** + * 子菜单列表 + */ + private List children; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 更新人 + */ + private String updateBy; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/repository/IMenuRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/repository/IMenuRepository.java index 95fcb25e..c9518290 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/repository/IMenuRepository.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/repository/IMenuRepository.java @@ -1,13 +1,14 @@ package com.qqchen.deploy.backend.repository; import com.qqchen.deploy.backend.entity.Menu; +import com.qqchen.deploy.backend.entity.User; +import com.qqchen.deploy.backend.framework.repository.IBaseRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface IMenuRepository extends JpaRepository { - List findByDeletedFalseOrderBySort(); List findByParentIdAndDeletedFalseOrderBySort(Long parentId); @@ -23,4 +24,6 @@ public interface IMenuRepository extends JpaRepository { List findByParentIdAndDeletedFalse(Long parentId); List findByTypeInAndDeletedFalseOrderBySort(List types); + + List findByEnabledAndDeletedFalseOrderBySort(Boolean enabled); } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/IMenuService.java b/backend/src/main/java/com/qqchen/deploy/backend/service/IMenuService.java index 58d1060b..02281488 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/IMenuService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/IMenuService.java @@ -1,20 +1,27 @@ -//package com.qqchen.deploy.backend.service; +package com.qqchen.deploy.backend.service; + +import com.qqchen.deploy.backend.entity.User; +import com.qqchen.deploy.backend.framework.service.IBaseService; +import com.qqchen.deploy.backend.entity.Menu; +import com.qqchen.deploy.backend.model.MenuDTO; +import com.qqchen.deploy.backend.model.UserDTO; +import com.qqchen.deploy.backend.model.request.MenuRequest; +import com.qqchen.deploy.backend.model.response.MenuResponse; + +import java.util.List; + +public interface IMenuService extends IBaseService { + +// /** +// * 获取菜单树 +// * @return 菜单树 +// */ +// List getMenuTree(); // -// -//import com.qqchen.deploy.backend.framework.service.IBaseService; -//import com.qqchen.deploy.backend.entity.Menu; -// -//import java.util.List; -// -//public interface IMenuService extends IBaseService { -// -//// List getMenuTree(); -// -//// List getMenuTreeWithoutButtons(); -// -//// List getUserMenus(Long userId); -// -// List getMenusByRoleId(Long roleId); -// -// void saveRoleMenus(Long roleId, List menuIds); -//} \ No newline at end of file +// /** +// * 获取用户菜单 +// * @param userId 用户ID +// * @return 用户菜单 +// */ +// List getUserMenus(Long userId); +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/IMenuServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/IMenuServiceImpl.java deleted file mode 100644 index 87d457c4..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/IMenuServiceImpl.java +++ /dev/null @@ -1,254 +0,0 @@ -//package com.qqchen.deploy.backend.service.impl; -// -//import com.qqchen.application.dto.MenuDTO; -//import com.qqchen.application.query.MenuQuery; -//import com.qqchen.application.service.MenuService; -//import com.qqchen.common.exception.ApiException; -//import com.qqchen.common.service.impl.BaseServiceImpl; -//import com.qqchen.domain.entity.Menu; -//import com.qqchen.domain.entity.RoleMenu; -//import com.qqchen.domain.repository.MenuRepository; -//import com.qqchen.domain.repository.RoleMenuRepository; -//import lombok.RequiredArgsConstructor; -//import org.springframework.beans.BeanUtils; -//import org.springframework.data.jpa.repository.JpaRepository; -//import org.springframework.stereotype.Service; -//import org.springframework.transaction.annotation.Transactional; -// -//import java.util.ArrayList; -//import java.util.Arrays; -//import java.util.Comparator; -//import java.util.List; -//import java.util.stream.Collectors; -// -//@Service -//@RequiredArgsConstructor -//public class IMenuServiceImpl extends BaseServiceImpl implements MenuService { -// -// private final MenuRepository menuRepository; -// private final RoleMenuRepository roleMenuRepository; -// -// @Override -// protected JpaRepository getRepository() { -// return menuRepository; -// } -// -// @Override -// public List getMenuTree() { -// List menus = menuRepository.findByDeletedFalseOrderBySort(); -// return buildMenuTree(menus); -// } -// -// @Override -// public List getUserMenus(Long userId) { -// // TODO: 根据用户ID获取角色,然后获取菜单 -// return new ArrayList<>(); -// } -// -// @Override -// public List getMenusByRoleId(Long roleId) { -// List roleMenus = roleMenuRepository.findByRoleId(roleId); -// return roleMenus.stream() -// .map(rm -> menuRepository.findById(rm.getMenuId()) -// .orElseThrow(() -> new ApiException("菜单不存在"))) -// .collect(Collectors.toList()); -// } -// -// @Override -// @Transactional -// public void saveRoleMenus(Long roleId, List menuIds) { -// // 先删除原有的关联 -// roleMenuRepository.deleteByRoleId(roleId); -// -// // 保存新的关联 -// List roleMenus = menuIds.stream() -// .map(menuId -> { -// RoleMenu rm = new RoleMenu(); -// rm.setRoleId(roleId); -// rm.setMenuId(menuId); -// return rm; -// }) -// .collect(Collectors.toList()); -// -// roleMenuRepository.saveAll(roleMenus); -// } -// -// @Override -// @Transactional -// public Menu update(Long id, Menu menu) { -// Menu existing = findById(id) -// .orElseThrow(() -> new ApiException("菜单不存在")); -// -// // 设置不允许修改的字段 -// menu.setId(id); -// menu.setVersion(existing.getVersion()); -// menu.setDeleted(existing.getDeleted()); -// -// // 如果是按钮类型,清空路径和组件 -// if (menu.getType() == 2) { -// menu.setPath(null); -// menu.setComponent(null); -// menu.setIcon(null); -// } -// -// // 如果是目录,设置固定组件 -// if (menu.getType() == 0) { -// menu.setComponent("LAYOUT"); -// } -// -// // 如果没有父级菜单,设置为根节点 -// if (menu.getParentId() == null) { -// menu.setParentId(0L); -// } -// -// return menuRepository.save(menu); -// } -// -// @Override -// @Transactional -// public Menu save(Menu menu) { -// // 如果是按钮类型,清空路径和组件 -// if (menu.getType() == 2) { -// menu.setPath(null); -// menu.setComponent(null); -// menu.setIcon(null); -// } -// -// // 如果是目录,设置固定组件 -// if (menu.getType() == 0) { -// menu.setComponent("LAYOUT"); -// } -// -// // 如果没有父级菜单,设置为根节点 -// if (menu.getParentId() == null) { -// menu.setParentId(0L); -// } -// -// menu.setDeleted(false); -// Menu savedMenu = menuRepository.save(menu); -// -// // 如果是菜单类型,自动创建增删改查按钮 -// if (menu.getType() == 1) { -// createDefaultButtons(savedMenu); -// } -// -// return savedMenu; -// } -// -// /** -// * 创建默认的按钮权限 -// */ -// private void createDefaultButtons(Menu menu) { -// // 获取基础权限标识 -// String basePermission = getBasePermission(menu.getPath()); -// -// // 创建默认按钮列表 -// List buttons = List.of( -// createButton(menu.getName() + "查看", basePermission + ":view", menu.getId(), 1), -// createButton(menu.getName() + "新增", basePermission + ":add", menu.getId(), 2), -// createButton(menu.getName() + "修改", basePermission + ":edit", menu.getId(), 3), -// createButton(menu.getName() + "删除", basePermission + ":delete", menu.getId(), 4) -// ); -// -// menuRepository.saveAll(buttons); -// } -// -// /** -// * 创建按钮 -// */ -// private Menu createButton(String name, String permission, Long parentId, int sort) { -// Menu button = new Menu(); -// button.setName(name); -// button.setPermission(permission); -// button.setType(2); -// button.setParentId(parentId); -// button.setSort(sort); -// button.setEnabled(true); -// button.setDeleted(false); -// return button; -// } -// -// /** -// * 根据路径获取基础权限标识 -// * 例如:/system/user -> system:user -// */ -// private String getBasePermission(String path) { -// if (path == null) { -// return ""; -// } -// // 移除开头的斜杠 -// if (path.startsWith("/")) { -// path = path.substring(1); -// } -// // 将斜杠替换为冒号 -// return path.replace("/", ":"); -// } -// -// @Override -// @Transactional -// public void delete(Long id) { -// Menu menu = findById(id) -// .orElseThrow(() -> new ApiException("菜单不存在")); -// -// // 如果是菜单类型,同时删除其下的按钮 -// if (menu.getType() == 1) { -// List buttons = menuRepository.findByParentIdAndDeletedFalse(id); -// if (!buttons.isEmpty()) { -// for (Menu button : buttons) { -// button.setDeleted(true); -// menuRepository.save(button); -// } -// } -// } -// -// // 检查是否有子菜单 -// List children = menuRepository.findByParentIdAndDeletedFalse(id); -// if (!children.isEmpty()) { -// throw new ApiException("该菜单下还有子菜单,不能删除"); -// } -// -// menu.setDeleted(true); -// menuRepository.save(menu); -// } -// -// private List buildMenuTree(List menus) { -// // 先找出所有的根节点(parentId为null或0的节点) -// List rootMenus = menus.stream() -// .filter(menu -> menu.getParentId() == null || menu.getParentId() == 0) -// .collect(Collectors.toList()); -// -// // 构建子树 -// return rootMenus.stream() -// .map(menu -> buildMenuNode(menu, menus)) -// .collect(Collectors.toList()); -// } -// -// /** -// * 构建菜单节点 -// */ -// private MenuDTO buildMenuNode(Menu menu, List allMenus) { -// MenuDTO dto = new MenuDTO(); -// BeanUtils.copyProperties(menu, dto); -// -// // 查找当前节点的子节点 -// List children = allMenus.stream() -// .filter(m -> menu.getId().equals(m.getParentId())) -// .sorted(Comparator.comparing(Menu::getSort)) -// .collect(Collectors.toList()); -// -// if (!children.isEmpty()) { -// dto.setChildren(children.stream() -// .map(child -> buildMenuNode(child, allMenus)) -// .collect(Collectors.toList())); -// } -// -// return dto; -// } -// -// @Override -// public List getMenuTreeWithoutButtons() { -// // 获取所有非按钮类型的菜单 -// List menus = menuRepository.findByTypeInAndDeletedFalseOrderBySort(Arrays.asList(0, 1)); // 0-目录 1-菜单 -// return buildMenuTree(menus); -// } -//} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/MenuServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/MenuServiceImpl.java new file mode 100644 index 00000000..daa8f17a --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/MenuServiceImpl.java @@ -0,0 +1,68 @@ +package com.qqchen.deploy.backend.service.impl; + +import com.qqchen.deploy.backend.converter.MenuConverter; +import com.qqchen.deploy.backend.entity.Menu; +import com.qqchen.deploy.backend.framework.annotation.ServiceType; +import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; +import com.qqchen.deploy.backend.model.MenuDTO; +import com.qqchen.deploy.backend.model.response.MenuResponse; +import com.qqchen.deploy.backend.repository.IMenuRepository; +import com.qqchen.deploy.backend.service.IMenuService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.stream.Collectors; + +import static com.qqchen.deploy.backend.framework.annotation.ServiceType.Type.DATABASE; + +@Slf4j +@Service +@ServiceType(DATABASE) +public class MenuServiceImpl extends BaseServiceImpl implements IMenuService { + + @Resource + private IMenuRepository repository; + + @Resource + private MenuConverter converter; + +// @Override +// public List getMenuTree() { +// List allMenus = repository.findByDeletedFalseOrderBySort(); +// List menuDTOs = converter.toDtoList(allMenus); +// List menuTree = buildMenuTree(menuDTOs); +// return converter.toResponseList(menuTree); +// } +// +// @Override +// public List getUserMenus(Long userId) { +// // TODO: 根据用户角色获取菜单 +// return getMenuTree(); +// } +// +// private List buildMenuTree(List menus) { +// Map menuMap = menus.stream() +// .collect(Collectors.toMap(MenuDTO::getId, menu -> menu)); +// +// List rootMenus = new ArrayList<>(); +// +// for (MenuDTO menu : menus) { +// if (menu.getParentId() == null || menu.getParentId() == 0) { +// rootMenus.add(menu); +// } else { +// MenuDTO parent = menuMap.get(menu.getParentId()); +// if (parent != null) { +// if (parent.getChildren() == null) { +// parent.setChildren(new ArrayList<>()); +// } +// parent.getChildren().add(menu); +// } +// } +// } +// +// return rootMenus; +// } +} \ No newline at end of file