From fd9c739cf5a6a24ca93c26e4c76c15719d647312 Mon Sep 17 00:00:00 2001 From: aid Date: Thu, 2 Apr 2026 16:26:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A7=9F=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=92=8C=E8=8F=9C=E5=8D=95=EF=BC=9A=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20tenantCode=20=E7=99=BB=E5=BD=95=20+=20gdlib=20?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题1: 前端登录传 body.tenantCode(如 gdlib),但 Java 后端只从 X-Tenant-Id header 取租户ID 修复: AuthController/AuthService 支持从 tenantCode 查找租户,兼容两种方式 问题2: gdlib 租户菜单错乱(包含了超管端的活动监管/内容管理等) 修复: 重置 gdlib tenant_menus 为正确的18条: 工作台(50) + 活动管理(9+8子) + 数据统计(52+2子) + 系统设置(14+4子:机构信息/用户/角色/日志) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../modules/sys/controller/AuthController.java | 6 +++--- .../com/competition/modules/sys/dto/LoginDto.java | 3 +++ .../modules/sys/service/AuthService.java | 15 +++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/backend-java/src/main/java/com/competition/modules/sys/controller/AuthController.java b/backend-java/src/main/java/com/competition/modules/sys/controller/AuthController.java index 5c14f77..6dcc470 100644 --- a/backend-java/src/main/java/com/competition/modules/sys/controller/AuthController.java +++ b/backend-java/src/main/java/com/competition/modules/sys/controller/AuthController.java @@ -26,11 +26,11 @@ public class AuthController { @PostMapping("/login") @Operation(summary = "登录") public Result> login(@Valid @RequestBody LoginDto dto, HttpServletRequest request) { - // 从请求头获取租户 ID + // 优先从请求头获取租户 ID,其次从 body 的 tenantCode 查找 String tenantIdHeader = request.getHeader("X-Tenant-Id"); - Long tenantId = tenantIdHeader != null ? Long.parseLong(tenantIdHeader) : null; + Long tenantId = tenantIdHeader != null && !tenantIdHeader.isBlank() ? Long.parseLong(tenantIdHeader) : null; - return Result.success(authService.login(dto.getUsername(), dto.getPassword(), tenantId)); + return Result.success(authService.login(dto.getUsername(), dto.getPassword(), tenantId, dto.getTenantCode())); } @GetMapping("/user-info") diff --git a/backend-java/src/main/java/com/competition/modules/sys/dto/LoginDto.java b/backend-java/src/main/java/com/competition/modules/sys/dto/LoginDto.java index ea7b354..d4a8618 100644 --- a/backend-java/src/main/java/com/competition/modules/sys/dto/LoginDto.java +++ b/backend-java/src/main/java/com/competition/modules/sys/dto/LoginDto.java @@ -15,4 +15,7 @@ public class LoginDto { @NotBlank(message = "密码不能为空") @Schema(description = "密码") private String password; + + @Schema(description = "租户编码(从URL提取,如 gdlib)") + private String tenantCode; } diff --git a/backend-java/src/main/java/com/competition/modules/sys/service/AuthService.java b/backend-java/src/main/java/com/competition/modules/sys/service/AuthService.java index 6651136..a82d11a 100644 --- a/backend-java/src/main/java/com/competition/modules/sys/service/AuthService.java +++ b/backend-java/src/main/java/com/competition/modules/sys/service/AuthService.java @@ -31,8 +31,19 @@ public class AuthService { /** * 登录 */ - public Map login(String username, String password, Long tenantId) { - log.info("开始登录,用户名:{},租户:{}", username, tenantId); + public Map login(String username, String password, Long tenantId, String tenantCode) { + log.info("开始登录,用户名:{},租户ID:{},租户编码:{}", username, tenantId, tenantCode); + + // 如果没有 tenantId 但有 tenantCode,通过编码查找租户 + if (tenantId == null && tenantCode != null && !tenantCode.isBlank()) { + SysTenant tenantByCode = tenantService.getOne( + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(SysTenant::getCode, tenantCode) + .eq(SysTenant::getValidState, 1), false); + if (tenantByCode != null) { + tenantId = tenantByCode.getId(); + } + } // 查找用户 SysUser user = userService.findByUsername(username, tenantId);