fix: 纯评委角色隐藏机构端评委管理菜单

Made-with: Cursor
This commit is contained in:
zhonghua 2026-04-08 11:13:35 +08:00
parent 197064820b
commit df7eae6125
2 changed files with 29 additions and 6 deletions

View File

@ -61,12 +61,11 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
new LambdaQueryWrapper<SysTenantMenu>().eq(SysTenantMenu::getTenantId, tenantId));
Set<Long> tenantMenuIds = new HashSet<>(tenantMenus.stream().map(SysTenantMenu::getMenuId).collect(Collectors.toSet()));
List<String> roles = isSuperAdmin ? Collections.emptyList() : userMapper.selectRolesByUserId(userId);
// 租户评委与平台评委共用我的评审菜单树机构租户未在 t_sys_tenant_menu 中配置时按角色合并评委端菜单
if (!isSuperAdmin) {
List<String> roles = userMapper.selectRolesByUserId(userId);
if (roles != null && roles.contains("judge")) {
tenantMenuIds.addAll(collectJudgePortalMenuIds(allMenus));
}
if (!isSuperAdmin && roles != null && roles.contains("judge")) {
tenantMenuIds.addAll(collectJudgePortalMenuIds(allMenus));
}
if (isSuperAdmin) {
@ -88,10 +87,14 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
List<String> userPermissions = userMapper.selectPermissionsByUserId(userId);
Set<String> permSet = new HashSet<>(userPermissions);
// 纯评委角色不展示机构端评委管理 judge:read 权限码重叠否则侧栏会出现该菜单
boolean hideTenantJudgeMgmtForPureJudge = shouldHideTenantJudgeManagementMenuForJudge(roles);
// 过滤菜单必须属于租户且用户有对应权限无权限要求的菜单直接放行
List<SysMenu> filteredMenus = allMenus.stream()
.filter(menu -> tenantMenuIds.contains(menu.getId()))
.filter(menu -> menu.getPermission() == null || menu.getPermission().isBlank() || permSet.contains(menu.getPermission()))
.filter(menu -> !hideTenantJudgeMgmtForPureJudge || !isTenantJudgeManagementMenu(menu))
.collect(Collectors.toList());
// 补全父菜单确保树结构完整
@ -176,6 +179,26 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
.collect(Collectors.toList());
}
/** 机构租户「评委管理」页(非评委工作台) */
private static final String TENANT_JUDGE_MANAGEMENT_COMPONENT = "contests/judges/Index";
/**
* 仅评委角色 tenant_admin / super_admin不展示机构端评委管理菜单
*/
private boolean shouldHideTenantJudgeManagementMenuForJudge(List<String> roles) {
if (roles == null || roles.isEmpty()) {
return false;
}
if (!roles.contains("judge")) {
return false;
}
return !roles.contains("tenant_admin") && !roles.contains("super_admin");
}
private boolean isTenantJudgeManagementMenu(SysMenu menu) {
return TENANT_JUDGE_MANAGEMENT_COMPONENT.equals(menu.getComponent());
}
/**
* 评委端菜单评审任务预设评语及其父级 docs/design/menu-config 一致不依赖固定菜单 ID
*/

View File

@ -116,7 +116,7 @@
- **平台评委**:在评委租户(`code=judge`)登录,见第三节「评委端」,`t_sys_tenant_menu` 仅含 **34、35、36**
- **租户评委**:在机构租户(如 `tenantCode=test2`)登录,角色为 `judge`,与平台评委使用**同一套**「我的评审」菜单(仍为 **34、35、36** 对应的 `component``activities/Review`、`activities/PresetComments` 及父级)。
- **实现**`GET /api/menus/user-menus` 在 `SysMenuServiceImpl.getUserMenus` 中,若当前用户角色含 `judge`,会在 `t_sys_tenant_menu` 基础上**合并**评委端菜单(按组件路径识别,不依赖固定 ID评委角色权限由 `JudgeRolePermissionConfigurer``JudgesManagementServiceImpl` 保证与上表「评委端权限码」一致,以便 `/api/auth/user-info``permissions` 与菜单 `permission` 字段匹配。
- **实现**`GET /api/menus/user-menus` 在 `SysMenuServiceImpl.getUserMenus` 中,若当前用户角色含 `judge`,会在 `t_sys_tenant_menu` 基础上**合并**评委端菜单(按组件路径识别,不依赖固定 ID评委角色权限由 `JudgeRolePermissionConfigurer``JudgesManagementServiceImpl` 保证与上表「评委端权限码」一致,以便 `/api/auth/user-info``permissions` 与菜单 `permission` 字段匹配。纯评委(仅有 `judge`、无 `tenant_admin`/`super_admin`**不展示**机构端「评委管理」菜单(`component=contests/judges/Index`),避免与 `judge:read` 权限码重叠导致误显。
- **可选**:若希望机构租户在「菜单管理」中显式看到评委菜单,也可在 `t_sys_tenant_menu` 中手工追加 **34、35、36**(与第三节一致),与合并逻辑效果相同。
### 租户端系统设置不包含的子菜单