打印了JENKINS节点日志

This commit is contained in:
dengqichen 2025-11-11 10:09:34 +08:00
parent 36f8f92f85
commit 161978b1be
11 changed files with 173 additions and 177 deletions

View File

@ -13,6 +13,7 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
@ -31,44 +32,25 @@ public class RepositoryBranchApiController extends BaseController<RepositoryBran
private IRepositoryBranchService repositoryBranchService; private IRepositoryBranchService repositoryBranchService;
@Override @Override
public Response<RepositoryBranchDTO> create(RepositoryBranchDTO dto) { public Response<RepositoryBranchDTO> create(@Validated @RequestBody RepositoryBranchDTO dto) {
return super.create(dto); return super.create(dto);
} }
@Override @Override
public Response<RepositoryBranchDTO> update(Long aLong, RepositoryBranchDTO dto) { public Response<RepositoryBranchDTO> update(@PathVariable Long id, @Validated @RequestBody RepositoryBranchDTO dto) {
return super.update(aLong, dto); return super.update(id, dto);
} }
@Override @Override
public Response<Void> delete(Long aLong) { public Response<Void> delete(@PathVariable Long id) {
return super.delete(aLong); return super.delete(id);
} }
@Override @Override
public Response<RepositoryBranchDTO> findById(Long aLong) { public Response<RepositoryBranchDTO> findById(@PathVariable Long id) {
return super.findById(aLong); return super.findById(id);
} }
@Override
public Response<List<RepositoryBranchDTO>> findAll() {
return super.findAll();
}
@Override
public Response<Page<RepositoryBranchDTO>> page(RepositoryBranchQuery query) {
return super.page(query);
}
@Override
public Response<List<RepositoryBranchDTO>> findAll(RepositoryBranchQuery query) {
return super.findAll(query);
}
@Override
public CompletableFuture<Response<Void>> batchProcess(List<RepositoryBranchDTO> dtos) {
return super.batchProcess(dtos);
}
@Operation(summary = "同步Git分支", description = "异步同步支持三种模式1)只传externalSystemId-全量同步 2)传externalSystemId+repoGroupId-同步仓库组 3)传externalSystemId+repoGroupId+repoProjectId-同步单个项目") @Operation(summary = "同步Git分支", description = "异步同步支持三种模式1)只传externalSystemId-全量同步 2)传externalSystemId+repoGroupId-同步仓库组 3)传externalSystemId+repoGroupId+repoProjectId-同步单个项目")
@PostMapping("/sync") @PostMapping("/sync")

View File

@ -13,6 +13,7 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
@ -31,44 +32,25 @@ public class RepositoryProjectApiController extends BaseController<RepositoryPro
private IRepositoryProjectService repositoryProjectService; private IRepositoryProjectService repositoryProjectService;
@Override @Override
public Response<RepositoryProjectDTO> create(RepositoryProjectDTO dto) { public Response<RepositoryProjectDTO> create(@Validated @RequestBody RepositoryProjectDTO dto) {
return super.create(dto); return super.create(dto);
} }
@Override @Override
public Response<RepositoryProjectDTO> update(Long aLong, RepositoryProjectDTO dto) { public Response<RepositoryProjectDTO> update(@PathVariable Long id, @Validated @RequestBody RepositoryProjectDTO dto) {
return super.update(aLong, dto); return super.update(id, dto);
} }
@Override @Override
public Response<Void> delete(Long aLong) { public Response<Void> delete(@PathVariable Long id) {
return super.delete(aLong); return super.delete(id);
} }
@Override @Override
public Response<RepositoryProjectDTO> findById(Long aLong) { public Response<RepositoryProjectDTO> findById(@PathVariable Long id) {
return super.findById(aLong); return super.findById(id);
} }
@Override
public Response<List<RepositoryProjectDTO>> findAll() {
return super.findAll();
}
@Override
public Response<Page<RepositoryProjectDTO>> page(RepositoryProjectQuery query) {
return super.page(query);
}
@Override
public Response<List<RepositoryProjectDTO>> findAll(RepositoryProjectQuery query) {
return super.findAll(query);
}
@Override
public CompletableFuture<Response<Void>> batchProcess(List<RepositoryProjectDTO> dtos) {
return super.batchProcess(dtos);
}
@Operation(summary = "同步Git项目", description = "异步同步支持两种模式1)只传externalSystemId-全量同步 2)传externalSystemId+repoGroupId-同步单个仓库组") @Operation(summary = "同步Git项目", description = "异步同步支持两种模式1)只传externalSystemId-全量同步 2)传externalSystemId+repoGroupId-同步单个仓库组")
@PostMapping("/sync") @PostMapping("/sync")

View File

@ -11,6 +11,8 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -31,7 +33,7 @@ public class ServerCategoryApiController
private IServerCategoryService serverCategoryService; private IServerCategoryService serverCategoryService;
@Override @Override
public Response<ServerCategoryDTO> create(ServerCategoryDTO dto) { public Response<ServerCategoryDTO> create(@Validated @RequestBody ServerCategoryDTO dto) {
return super.create(dto); return super.create(dto);
} }

View File

@ -12,7 +12,10 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -26,23 +29,23 @@ public class DepartmentApiController extends BaseController<Department, Departme
@Override @Override
public Response<DepartmentDTO> create(DepartmentDTO dto) { public Response<DepartmentDTO> create(@Validated @RequestBody DepartmentDTO dto) {
return super.create(dto); return super.create(dto);
} }
@Override @Override
public Response<DepartmentDTO> update(Long aLong, DepartmentDTO dto) { public Response<DepartmentDTO> update(@PathVariable Long id, @Validated @RequestBody DepartmentDTO dto) {
return super.update(aLong, dto); return super.update(id, dto);
} }
@Override @Override
public Response<Void> delete(Long aLong) { public Response<Void> delete(@PathVariable Long id) {
return super.delete(aLong); return super.delete(id);
} }
@Override @Override
public Response<DepartmentDTO> findById(Long aLong) { public Response<DepartmentDTO> findById(@PathVariable Long id) {
return super.findById(aLong); return super.findById(id);
} }
@Override @Override

View File

@ -13,7 +13,11 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -28,6 +32,27 @@ public class MenuApiController extends BaseController<Menu, MenuDTO, Long, MenuQ
@Resource @Resource
private IMenuService menuService; private IMenuService menuService;
@Override
public Response<MenuDTO> create(@Validated @RequestBody MenuDTO dto) {
return super.create(dto);
}
@Override
public Response<MenuDTO> update(@PathVariable Long id, @Validated @RequestBody MenuDTO dto) {
return super.update(id, dto);
}
@Override
public Response<Void> delete(@PathVariable Long id) {
return super.delete(id);
}
@Override
public Response<MenuDTO> findById(@PathVariable Long id) {
return super.findById(id);
}
/** /**
* 获取当前用户的菜单 * 获取当前用户的菜单
*/ */

View File

@ -6,6 +6,7 @@ import com.qqchen.deploy.backend.framework.controller.BaseController;
import com.qqchen.deploy.backend.system.model.PermissionDTO; import com.qqchen.deploy.backend.system.model.PermissionDTO;
import com.qqchen.deploy.backend.system.model.RoleDTO; import com.qqchen.deploy.backend.system.model.RoleDTO;
import com.qqchen.deploy.backend.system.model.query.RoleQuery; import com.qqchen.deploy.backend.system.model.query.RoleQuery;
import com.qqchen.deploy.backend.system.model.response.RoleMenusAndPermissionsResponse;
import com.qqchen.deploy.backend.system.service.IRoleService; import com.qqchen.deploy.backend.system.service.IRoleService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@ -72,21 +73,21 @@ public class RoleApiController extends BaseController<Role, RoleDTO, Long, RoleQ
return Response.success(); return Response.success();
} }
@Operation(summary = "获取角色权限") @Operation(summary = "获取角色菜单和权限", description = "返回菜单ID列表和功能权限点ID列表")
@GetMapping("/{id}/permissions") @GetMapping("/{id}/menus-and-permissions")
public Response<List<PermissionDTO>> getRolePermissions( public Response<RoleMenusAndPermissionsResponse> getRoleMenusAndPermissions(
@Parameter(description = "角色ID", required = true) @PathVariable Long id @Parameter(description = "角色ID", required = true) @PathVariable Long id
) { ) {
return Response.success(roleService.listRolePermissions(id)); return Response.success(roleService.getRoleMenusAndPermissions(id));
} }
@Operation(summary = "分配权限") @Operation(summary = "分配菜单和权限", description = "同时分配菜单和功能权限点,后端自动补全父菜单")
@PostMapping("/{id}/permissions") @PostMapping("/{id}/menus-and-permissions")
public Response<Void> assignPermissions( public Response<Void> assignMenusAndPermissions(
@Parameter(description = "角色ID", required = true) @PathVariable Long id, @Parameter(description = "角色ID", required = true) @PathVariable Long id,
@Parameter(description = "权限ID列表", required = true) @RequestBody List<Long> permissionIds @Parameter(description = "分配权限请求", required = true) @RequestBody com.qqchen.deploy.backend.system.model.request.AssignPermissionsRequest request
) { ) {
roleService.assignPermissions(id, permissionIds); roleService.assignMenusAndPermissions(id, request.getMenuIds(), request.getPermissionIds());
return Response.success(); return Response.success();
} }

View File

@ -10,6 +10,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -21,48 +24,26 @@ import java.util.concurrent.CompletableFuture;
@RequestMapping("/api/v1/role-tag") @RequestMapping("/api/v1/role-tag")
public class RoleTagApiController extends BaseController<RoleTag, RoleTagDTO, Long, RoleTagQuery> { public class RoleTagApiController extends BaseController<RoleTag, RoleTagDTO, Long, RoleTagQuery> {
@Resource
private IRoleTagService roleTagService;
@Override @Override
public Response<RoleTagDTO> create(RoleTagDTO dto) { public Response<RoleTagDTO> create(@Validated @RequestBody RoleTagDTO dto) {
return super.create(dto); return super.create(dto);
} }
@Override @Override
public Response<RoleTagDTO> update(Long aLong, RoleTagDTO dto) { public Response<RoleTagDTO> update(@PathVariable Long id, @Validated @RequestBody RoleTagDTO dto) {
return super.update(aLong, dto); return super.update(id, dto);
} }
@Override @Override
public Response<Void> delete(Long aLong) { public Response<Void> delete(@PathVariable Long id) {
return super.delete(aLong); return super.delete(id);
} }
@Override @Override
public Response<RoleTagDTO> findById(Long aLong) { public Response<RoleTagDTO> findById(@PathVariable Long id) {
return super.findById(aLong); return super.findById(id);
} }
@Override
public Response<List<RoleTagDTO>> findAll() {
return super.findAll();
}
@Override
public Response<Page<RoleTagDTO>> page(RoleTagQuery query) {
return super.page(query);
}
@Override
public Response<List<RoleTagDTO>> findAll(RoleTagQuery query) {
return super.findAll(query);
}
@Override
public CompletableFuture<Response<Void>> batchProcess(List<RoleTagDTO> dtos) {
return super.batchProcess(dtos);
}
@Override @Override
protected void exportData(HttpServletResponse response, List<RoleTagDTO> data) { protected void exportData(HttpServletResponse response, List<RoleTagDTO> data) {

View File

@ -13,6 +13,7 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
@ -37,44 +38,25 @@ public class TenantApiController extends BaseController<Tenant, TenantDTO, Long,
private ITenantService tenantService; private ITenantService tenantService;
@Override @Override
public Response<TenantDTO> create(TenantDTO dto) { public Response<TenantDTO> create(@Validated @RequestBody TenantDTO dto) {
return super.create(dto); return super.create(dto);
} }
@Override @Override
public Response<TenantDTO> update(Long aLong, TenantDTO dto) { public Response<TenantDTO> update(@PathVariable Long id, @Validated @RequestBody TenantDTO dto) {
return super.update(aLong, dto); return super.update(id, dto);
} }
@Override @Override
public Response<Void> delete(Long aLong) { public Response<Void> delete(@PathVariable Long id) {
return super.delete(aLong); return super.delete(id);
} }
@Override @Override
public Response<TenantDTO> findById(Long aLong) { public Response<TenantDTO> findById(@PathVariable Long id) {
return super.findById(aLong); return super.findById(id);
} }
@Override
public Response<List<TenantDTO>> findAll() {
return super.findAll();
}
@Override
public Response<Page<TenantDTO>> page(TenantQuery query) {
return super.page(query);
}
@Override
public Response<List<TenantDTO>> findAll(TenantQuery query) {
return super.findAll(query);
}
@Override
public CompletableFuture<Response<Void>> batchProcess(List<TenantDTO> dtos) {
return super.batchProcess(dtos);
}
@Operation(summary = "获取状态") @Operation(summary = "获取状态")
@GetMapping("/{id}/enabled") @GetMapping("/{id}/enabled")

View File

@ -5,6 +5,7 @@ import com.qqchen.deploy.backend.system.entity.Role;
import com.qqchen.deploy.backend.system.model.RoleDTO; import com.qqchen.deploy.backend.system.model.RoleDTO;
import com.qqchen.deploy.backend.system.model.PermissionDTO; import com.qqchen.deploy.backend.system.model.PermissionDTO;
import com.qqchen.deploy.backend.system.model.query.RoleQuery; import com.qqchen.deploy.backend.system.model.query.RoleQuery;
import com.qqchen.deploy.backend.system.model.response.RoleMenusAndPermissionsResponse;
import java.util.List; import java.util.List;
@ -31,12 +32,19 @@ public interface IRoleService extends IBaseService<Role, RoleDTO, RoleQuery, Lon
void assignTags(Long roleId, List<Long> tagIds); void assignTags(Long roleId, List<Long> tagIds);
/** /**
* 获取角色的权限列表 * 获取角色的菜单和功能权限两个维度
*
* @param roleId 角色ID
* @return 包含菜单ID和权限点ID的响应对象
*/ */
List<PermissionDTO> listRolePermissions(Long roleId); RoleMenusAndPermissionsResponse getRoleMenusAndPermissions(Long roleId);
/** /**
* 分配权限给角色 * 分配菜单和功能权限给角色两个维度
*
* @param roleId 角色ID
* @param menuIds 菜单ID列表后端会自动补全父菜单
* @param permissionIds 功能权限点ID列表
*/ */
void assignPermissions(Long roleId, List<Long> permissionIds); void assignMenusAndPermissions(Long roleId, List<Long> menuIds, List<Long> permissionIds);
} }

View File

@ -14,6 +14,7 @@ import com.qqchen.deploy.backend.system.model.MenuDTO;
import com.qqchen.deploy.backend.system.model.PermissionDTO; import com.qqchen.deploy.backend.system.model.PermissionDTO;
import com.qqchen.deploy.backend.system.model.RoleDTO; import com.qqchen.deploy.backend.system.model.RoleDTO;
import com.qqchen.deploy.backend.system.model.query.RoleQuery; import com.qqchen.deploy.backend.system.model.query.RoleQuery;
import com.qqchen.deploy.backend.system.model.response.RoleMenusAndPermissionsResponse;
import com.qqchen.deploy.backend.system.repository.IMenuRepository; import com.qqchen.deploy.backend.system.repository.IMenuRepository;
import com.qqchen.deploy.backend.system.repository.IPermissionRepository; import com.qqchen.deploy.backend.system.repository.IPermissionRepository;
import com.qqchen.deploy.backend.system.repository.IRoleRepository; import com.qqchen.deploy.backend.system.repository.IRoleRepository;
@ -122,67 +123,96 @@ public class RoleServiceImpl extends BaseServiceImpl<Role, RoleDTO, RoleQuery, L
} }
@Override @Override
public List<PermissionDTO> listRolePermissions(Long roleId) { public RoleMenusAndPermissionsResponse getRoleMenusAndPermissions(Long roleId) {
Role role = roleRepository.findById(roleId) Role role = roleRepository.findById(roleId)
.orElseThrow(() -> new BusinessException(ResponseCode.ROLE_NOT_FOUND)); .orElseThrow(() -> new BusinessException(ResponseCode.ROLE_NOT_FOUND));
List<PermissionDTO> permissionDTOs = role.getPermissions().stream() // 获取菜单ID列表
.map(permissionConverter::toDto) List<Long> menuIds = role.getMenus().stream()
.map(Menu::getId)
.sorted()
.collect(Collectors.toList()); .collect(Collectors.toList());
// 批量填充菜单信息 // 获取功能权限点ID列表
enrichWithMenuInfo(permissionDTOs); List<Long> permissionIds = role.getPermissions().stream()
.map(Permission::getId)
return permissionDTOs; .sorted()
}
/**
* 为权限DTO列表批量填充菜单信息
*/
private void enrichWithMenuInfo(List<PermissionDTO> permissionDTOs) {
if (permissionDTOs == null || permissionDTOs.isEmpty()) {
return;
}
// 收集所有菜单ID
List<Long> menuIds = permissionDTOs.stream()
.map(PermissionDTO::getMenuId)
.filter(id -> id != null)
.distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
if (menuIds.isEmpty()) { return new com.qqchen.deploy.backend.system.model.response.RoleMenusAndPermissionsResponse(menuIds, permissionIds);
return;
}
// 批量查询菜单并转换为DTO
Map<Long, MenuDTO> menuMap = menuRepository.findAllById(menuIds).stream()
.map(menuConverter::toDto)
.collect(Collectors.toMap(MenuDTO::getId, menu -> menu));
// 填充菜单信息
permissionDTOs.forEach(dto -> {
if (dto.getMenuId() != null) {
dto.setMenu(menuMap.get(dto.getMenuId()));
}
});
} }
@Override @Override
@Transactional @Transactional
public void assignPermissions(Long roleId, List<Long> permissionIds) { public void assignMenusAndPermissions(Long roleId, List<Long> menuIds, List<Long> permissionIds) {
Role role = roleRepository.findById(roleId) Role role = roleRepository.findById(roleId)
.orElseThrow(() -> new BusinessException(ResponseCode.ROLE_NOT_FOUND)); .orElseThrow(() -> new BusinessException(ResponseCode.ROLE_NOT_FOUND));
Set<Permission> permissions = permissionRepository.findByIdIn(permissionIds) // 1. 处理菜单维度自动补全父菜单
.stream() if (menuIds != null && !menuIds.isEmpty()) {
.collect(Collectors.toSet()); // 一次性查询所有菜单避免N+1查询
List<Menu> allMenus = menuRepository.findByDeletedFalseOrderBySort();
Map<Long, Menu> menuMap = allMenus.stream()
.collect(Collectors.toMap(Menu::getId, menu -> menu));
if (permissions.size() != permissionIds.size()) { // 验证请求的菜单是否存在
throw new BusinessException(ResponseCode.PERMISSION_NOT_FOUND); for (Long menuId : menuIds) {
if (!menuMap.containsKey(menuId)) {
throw new BusinessException(ResponseCode.DATA_NOT_FOUND);
}
}
// 在内存中递归补全父菜单ID
Set<Long> completeMenuIds = new HashSet<>(menuIds);
for (Long menuId : menuIds) {
addParentMenuIdsFromMap(completeMenuIds, menuId, menuMap);
}
// 根据补全后的ID获取菜单对象
Set<Menu> menus = completeMenuIds.stream()
.map(menuMap::get)
.filter(menu -> menu != null)
.collect(Collectors.toSet());
role.setMenus(menus);
log.info("角色[{}]分配菜单完成,原始菜单数:{},补全后菜单数:{}",
roleId, menuIds.size(), completeMenuIds.size());
} else {
role.setMenus(new HashSet<>());
}
// 2. 处理功能权限点维度
if (permissionIds != null && !permissionIds.isEmpty()) {
Set<Permission> permissions = permissionRepository.findByIdIn(permissionIds)
.stream()
.collect(Collectors.toSet());
if (permissions.size() != permissionIds.size()) {
throw new BusinessException(ResponseCode.PERMISSION_NOT_FOUND);
}
role.setPermissions(permissions);
log.info("角色[{}]分配功能权限完成,权限点数:{}", roleId, permissionIds.size());
} else {
role.setPermissions(new HashSet<>());
} }
role.setPermissions(permissions);
roleRepository.save(role); roleRepository.save(role);
} }
/**
* 在内存中递归添加所有父菜单ID优化版避免数据库查询
* @param menuIds 菜单ID集合
* @param menuId 当前菜单ID
* @param menuMap 所有菜单的Map
*/
private void addParentMenuIdsFromMap(Set<Long> menuIds, Long menuId, Map<Long, Menu> menuMap) {
Menu menu = menuMap.get(menuId);
if (menu != null && menu.getParentId() != null) {
menuIds.add(menu.getParentId());
// 递归查找父菜单的父菜单
addParentMenuIdsFromMap(menuIds, menu.getParentId(), menuMap);
}
}
} }

View File

@ -144,8 +144,8 @@ INSERT INTO sys_role_menu (role_id, menu_id)
VALUES VALUES
-- 运维拥有工作台、运维管理和资源管理权限 -- 运维拥有工作台、运维管理和资源管理权限
(2, 99), (2, 200), (2, 201), (2, 202), (2, 203), (2, 204), (2, 205), (2, 300), (2, 301), (2, 302), (2, 303), (2, 304), (2, 99), (2, 200), (2, 201), (2, 202), (2, 203), (2, 204), (2, 205), (2, 300), (2, 301), (2, 302), (2, 303), (2, 304),
-- 开发拥有工作台、工作流子菜单和应用管理(不包含父菜单 -- 开发拥有工作台、工作流管理及子菜单、运维管理及应用管理(后端自动补全父菜单,但显式声明更清晰
(3, 99), (3, 101), (3, 102), (3, 104), (3, 202); (3, 99), (3, 100), (3, 101), (3, 102), (3, 104), (3, 200), (3, 202);
-- ==================== 初始化权限数据 ==================== -- ==================== 初始化权限数据 ====================
DELETE FROM sys_permission WHERE id < 10000; DELETE FROM sys_permission WHERE id < 10000;