From ee7e0a44c44f5b46b8a93095e484b51f16f0efd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=9A=E8=BE=B0=E5=85=88=E7=94=9F?= Date: Sat, 30 Nov 2024 10:52:12 +0800 Subject: [PATCH] =?UTF-8?q?menu=E5=AE=8C=E6=88=90=EF=BC=8C=E5=9B=A0?= =?UTF-8?q?=E4=B8=BA=E6=95=B0=E6=8D=AE=E5=BA=93=E7=B1=BBrepository?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E7=BB=A7=E6=89=BFbase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deploy/backend/api/MenuApiController.java | 8 +- .../backend/controller/MenuController.java | 97 +++++++++---------- .../DependencyInjectionPostProcessor.java | 3 +- .../backend/repository/IMenuRepository.java | 2 +- .../deploy/backend/service/IMenuService.java | 23 +++-- .../backend/service/impl/MenuServiceImpl.java | 82 +++++++++------- .../db/migration/V1.0.0__init_schema.sql | 22 +++++ .../db/migration/V1.0.1__init_data.sql | 38 +++++++- 8 files changed, 167 insertions(+), 108 deletions(-) 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 index 7a26f8ed..d6c9ef39 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/api/MenuApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/api/MenuApiController.java @@ -1,20 +1,16 @@ 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; @@ -37,9 +33,7 @@ public class MenuApiController extends BaseController> getCurrentUserMenus() { - // TODO: 从 SecurityContext 获取当前用户ID -// return Response.success(menuService.getUserMenus(1L)); - return null; + return Response.success(menuService.getUserMenus()); } @Override 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 index a347c2e5..308d5d4b 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/controller/MenuController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/controller/MenuController.java @@ -1,49 +1,48 @@ -//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 +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("/mgmt/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() { + return Response.success(((IMenuService) service).getUserMenus()); + } + + @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/framework/config/DependencyInjectionPostProcessor.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/config/DependencyInjectionPostProcessor.java index 785effce..c6ab3ed0 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/config/DependencyInjectionPostProcessor.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/config/DependencyInjectionPostProcessor.java @@ -190,8 +190,7 @@ public class DependencyInjectionPostProcessor implements BeanPostProcessor, Disp entityClass, key -> { if (!applicationContext.containsBean(repositoryBeanName)) { - String errorMsg = String.format("找不到 Repository - 服务类: %s, 实体类: %s, Repository名称: %s", - service.getClass().getName(), key.getSimpleName(), repositoryBeanName); + String errorMsg = String.format("找不到 Repository - 服务类: %s, 实体类: %s, Repository名称: %s", service.getClass().getName(), key.getSimpleName(), repositoryBeanName); log.error(errorMsg); throw new DependencyInjectionException(errorMsg, new RuntimeException(errorMsg)); } 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 c9518290..a820b2ed 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 @@ -8,7 +8,7 @@ import org.springframework.stereotype.Repository; import java.util.List; @Repository -public interface IMenuRepository extends JpaRepository { +public interface IMenuRepository extends IBaseRepository { List findByDeletedFalseOrderBySort(); List findByParentIdAndDeletedFalseOrderBySort(Long parentId); 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 02281488..49cfa959 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 @@ -12,16 +12,15 @@ import java.util.List; public interface IMenuService extends IBaseService { -// /** -// * 获取菜单树 -// * @return 菜单树 -// */ -// List getMenuTree(); -// -// /** -// * 获取用户菜单 -// * @param userId 用户ID -// * @return 用户菜单 -// */ -// List getUserMenus(Long userId); + /** + * 获取菜单树 + * @return 菜单树 + */ + List getMenuTree(); + + /** + * 获取当前用户的菜单 + * @return 用户菜单 + */ + List getUserMenus(); } \ 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 index daa8f17a..15387368 100644 --- 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 @@ -2,12 +2,18 @@ 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.entity.User; import com.qqchen.deploy.backend.framework.annotation.ServiceType; +import com.qqchen.deploy.backend.framework.enums.ResponseCode; +import com.qqchen.deploy.backend.framework.exception.BusinessException; +import com.qqchen.deploy.backend.framework.security.SecurityUtils; import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; import com.qqchen.deploy.backend.model.MenuDTO; +import com.qqchen.deploy.backend.model.response.LoginResponse; import com.qqchen.deploy.backend.model.response.MenuResponse; import com.qqchen.deploy.backend.repository.IMenuRepository; import com.qqchen.deploy.backend.service.IMenuService; +import com.qqchen.deploy.backend.service.IUserService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -28,41 +34,45 @@ public class MenuServiceImpl extends BaseServiceImpl implem @Resource private MenuConverter converter; + + @Resource + private IUserService userService; -// @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; -// } + @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() { + LoginResponse user = userService.getCurrentUser(); + // 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 diff --git a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql index e74a7ba6..b5850d35 100644 --- a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql +++ b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql @@ -54,4 +54,26 @@ CREATE TABLE sys_param ( CONSTRAINT UK_sys_param_code UNIQUE (code) ) COMMENT '系统参数表'; + +-- 菜单表 +CREATE TABLE sys_menu ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + create_by VARCHAR(255), + create_time DATETIME(6), + deleted BIT NOT NULL DEFAULT 0, + update_by VARCHAR(255), + update_time DATETIME(6), + version INT NOT NULL DEFAULT 0, + + name VARCHAR(100) NOT NULL COMMENT '菜单名称', + path VARCHAR(200) COMMENT '路由路径', + component VARCHAR(255) COMMENT '组件路径', + icon VARCHAR(100) COMMENT '菜单图标', + permission VARCHAR(100) COMMENT '权限标识', + type INT NOT NULL COMMENT '菜单类型(1:目录 2:菜单 3:按钮)', + parent_id BIGINT COMMENT '父菜单ID', + sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', + hidden BIT NOT NULL DEFAULT 0 COMMENT '是否隐藏(0显示 1隐藏)', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0禁用 1启用)' +) COMMENT '菜单表'; \ No newline at end of file diff --git a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql index 7b097ac5..497a3dba 100644 --- a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql +++ b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql @@ -23,4 +23,40 @@ VALUES ('SYSTEM_NAME', '系统名称', 'DevOps平台', 'TEXT', '系统显示名称', 1, 'system', '2024-01-01 00:00:00'), ('SYSTEM_LOGO', '系统Logo', '/logo.png', 'TEXT', '系统Logo路径', 1, 'system', '2024-01-01 00:00:00'), ('GENDER_ENUM', '性别枚举', '[{"code":"1","name":"男"},{"code":"2","name":"女"}]', 'ENUM', '性别枚举值', 1, 'system', '2024-01-01 00:00:00'), -('USER_STATUS_ENUM', '用户状态枚举', '[{"code":"0","name":"禁用"},{"code":"1","name":"启用"}]', 'ENUM', '用户状态枚举值', 1, 'system', '2024-01-01 00:00:00'); \ No newline at end of file +('USER_STATUS_ENUM', '用户状态枚举', '[{"code":"0","name":"禁用"},{"code":"1","name":"启用"}]', 'ENUM', '用户状态枚举值', 1, 'system', '2024-01-01 00:00:00'); + +-- 初始化系统管理菜单 +INSERT INTO sys_menu (create_by, create_time, deleted, update_by, update_time, version, + name, path, component, icon, type, parent_id, sort, hidden, enabled) +VALUES +-- 系统管理 +('system', '2024-01-01 00:00:00', 0, 'system', '2024-01-01 00:00:00', 0, + '系统管理', '/system', null, 'setting', 1, null, 1, 0, 1), + +-- 用户管理 +('system', '2024-01-01 00:00:00', 0, 'system', '2024-01-01 00:00:00', 0, + '用户管理', '/system/user', '/System/User', 'user', 2, 1, 1, 0, 1), + +-- 角色管理 +('system', '2024-01-01 00:00:00', 0, 'system', '2024-01-01 00:00:00', 0, + '角色管理', '/system/role', '/System/Role', 'team', 2, 1, 2, 0, 1), + +-- 菜单管理 +('system', '2024-01-01 00:00:00', 0, 'system', '2024-01-01 00:00:00', 0, + '菜单管理', '/system/menu', '/System/Menu', 'menu', 2, 1, 3, 0, 1), + +-- 部门管理 +('system', '2024-01-01 00:00:00', 0, 'system', '2024-01-01 00:00:00', 0, + '部门管理', '/system/department', '/System/Department', 'apartment', 2, 1, 4, 0, 1), + +-- 租户管理 +('system', '2024-01-01 00:00:00', 0, 'system', '2024-01-01 00:00:00', 0, + '租户管理', '/system/tenant', '/System/Tenant', 'cluster', 2, 1, 5, 0, 1), + +-- Jenkins管理 +('system', '2024-01-01 00:00:00', 0, 'system', '2024-01-01 00:00:00', 0, + 'Jenkins管理', '/system/jenkins', '/System/Jenkins', 'cloud-server', 2, 1, 6, 0, 1), + +-- 代码仓库 +('system', '2024-01-01 00:00:00', 0, 'system', '2024-01-01 00:00:00', 0, + '代码仓库', '/system/repository', '/System/Repository', 'code', 2, 1, 7, 0, 1); \ No newline at end of file