From e919d8855453cad3f6e943bb65df8a54c126bbea Mon Sep 17 00:00:00 2001 From: zzy Date: Sat, 25 Apr 2026 16:27:00 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/auth/AuthController.java | 23 +-- .../auth/AuthTenantSwitchController.java | 59 -------- .../admin/auth/vo/AuthSwitchTenantReqVO.java | 16 +++ .../admin/user/vo/user/UserSaveReqVO.java | 5 +- .../dal/dataobject/user/UserTenantRelDO.java | 2 + .../dal/mysql/user/UserTenantRelMapper.java | 7 + .../system/enums/ErrorCodeConstants.java | 1 + .../system/service/auth/AdminAuthService.java | 17 ++- .../service/auth/AdminAuthServiceImpl.java | 132 ++++++++++++------ .../service/user/AdminUserServiceImpl.java | 8 +- .../usertenant/UserTenantRelService.java | 9 ++ .../usertenant/UserTenantRelServiceImpl.java | 17 +++ 12 files changed, 183 insertions(+), 113 deletions(-) delete mode 100644 fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthTenantSwitchController.java create mode 100644 fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthSwitchTenantReqVO.java diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthController.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthController.java index c960b03..bb486e8 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthController.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthController.java @@ -66,6 +66,7 @@ public class AuthController { @PostMapping("/login") @PermitAll @Operation(summary = "使用账号密码登录") + @TenantIgnore public CommonResult login(@RequestBody @Valid AuthLoginReqVO reqVO) { return success(authService.login(reqVO)); } @@ -123,6 +124,20 @@ public class AuthController { return success(authService.register(registerReqVO)); } + @PostMapping("/switch-tenant") + @Operation(summary = "切换租户并重新登录") + public CommonResult switchTenant(@Valid @RequestBody AuthSwitchTenantReqVO reqVO) { + return success(authService.switchTenant(reqVO)); + } + + @GetMapping("/get-user-tenant-list") + @Operation(summary = "获取当前登录用户的租户列表") + public CommonResult> getUserTenantList() { + Long userId = getLoginUserId(); + List tenants = authService.getUserTenantList(userId); + return success(tenants); + } + // ========== 短信登录相关 ========== @PostMapping("/sms-login") @@ -149,14 +164,6 @@ public class AuthController { return success(true); } - @PostMapping("/get-user-tenant-list") - @PermitAll - @TenantIgnore - @Operation(summary = "获取用户的租户列表(未登录状态)") - public CommonResult getUserTenantList(@RequestBody @Valid AuthUserTenantListReqVO reqVO) { - return success(authService.getUserTenantList(reqVO)); - } - // ========== 社交登录相关 ========== @GetMapping("/social-auth-redirect") diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthTenantSwitchController.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthTenantSwitchController.java deleted file mode 100644 index 6a9b0aa..0000000 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthTenantSwitchController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.fjrcloud.community.module.system.controller.admin.auth; - -import com.fjrcloud.community.framework.common.enums.UserTypeEnum; -import com.fjrcloud.community.framework.common.pojo.CommonResult; -import com.fjrcloud.community.framework.tenant.core.util.TenantUtils; -import com.fjrcloud.community.module.system.controller.admin.auth.vo.SwitchTenantReqVO; -import com.fjrcloud.community.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; -import com.fjrcloud.community.module.system.dal.dataobject.user.UserTenantRelDO; -import com.fjrcloud.community.module.system.enums.ErrorCodeConstants; -import com.fjrcloud.community.module.system.enums.oauth2.OAuth2ClientConstants; -import com.fjrcloud.community.module.system.service.oauth2.OAuth2TokenService; -import com.fjrcloud.community.module.system.service.usertenant.UserTenantRelService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import javax.validation.Valid; - -import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.fjrcloud.community.framework.common.pojo.CommonResult.success; -import static com.fjrcloud.community.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管理后台 - 认证 - 租户切换") -@RestController -@RequestMapping("/system/auth") -@Validated -public class AuthTenantSwitchController { - - @Resource - private UserTenantRelService userTenantRelService; - - @Resource - private OAuth2TokenService oauth2TokenService; - - @PostMapping("/switch-tenant") - @Operation(summary = "切换租户") - public CommonResult switchTenant(@Valid @RequestBody SwitchTenantReqVO reqVO) { - Long userId = getLoginUserId(); - - UserTenantRelDO rel = userTenantRelService.getUserTenantRel(userId, reqVO.getTenantId()); - if (rel == null) { - throw exception(ErrorCodeConstants.USER_TENANT_REL_NOT_EXISTS); - } - - String newToken = TenantUtils.execute(reqVO.getTenantId(), () -> { - OAuth2AccessTokenDO newAccessToken = oauth2TokenService.createAccessToken( - userId, UserTypeEnum.ADMIN.getValue(), - OAuth2ClientConstants.CLIENT_ID_DEFAULT, null); - return newAccessToken.getAccessToken(); - }); - - return success(newToken); - } -} diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthSwitchTenantReqVO.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthSwitchTenantReqVO.java new file mode 100644 index 0000000..c35c9d1 --- /dev/null +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthSwitchTenantReqVO.java @@ -0,0 +1,16 @@ +package com.fjrcloud.community.module.system.controller.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 切换租户 Request VO") +@Data +public class AuthSwitchTenantReqVO { + + @Schema(description = "租户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "租户ID不能为空") + private Long tenantId; + +} \ No newline at end of file diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/vo/user/UserSaveReqVO.java index 6852350..2efcadf 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/vo/user/UserSaveReqVO.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/vo/user/UserSaveReqVO.java @@ -1,11 +1,11 @@ package com.fjrcloud.community.module.system.controller.admin.user.vo.user; import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fjrcloud.community.framework.common.validation.Mobile; import com.fjrcloud.community.module.system.framework.operatelog.core.DeptParseFunction; import com.fjrcloud.community.module.system.framework.operatelog.core.PostParseFunction; import com.fjrcloud.community.module.system.framework.operatelog.core.SexParseFunction; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.mzt.logapi.starter.annotation.DiffLogField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -51,7 +51,8 @@ public class UserSaveReqVO { @DiffLogField(name = "用户邮箱") private String email; - @Schema(description = "手机号码", example = "15601691300") + @Schema(description = "手机号码", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") + @NotBlank(message = "手机号码不能为空") @Mobile @DiffLogField(name = "手机号码") private String mobile; diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/dataobject/user/UserTenantRelDO.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/dataobject/user/UserTenantRelDO.java index 33b2745..482beaa 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/dataobject/user/UserTenantRelDO.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/dataobject/user/UserTenantRelDO.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fjrcloud.community.framework.mybatis.core.dataobject.BaseDO; +import com.fjrcloud.community.framework.tenant.core.aop.TenantIgnore; import lombok.*; @TableName("system_user_tenant_rel") @@ -14,6 +15,7 @@ import lombok.*; @Builder @NoArgsConstructor @AllArgsConstructor +@TenantIgnore public class UserTenantRelDO extends BaseDO { @TableId diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/mysql/user/UserTenantRelMapper.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/mysql/user/UserTenantRelMapper.java index 2ac720c..53b6956 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/mysql/user/UserTenantRelMapper.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/mysql/user/UserTenantRelMapper.java @@ -1,5 +1,6 @@ package com.fjrcloud.community.module.system.dal.mysql.user; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fjrcloud.community.framework.mybatis.core.mapper.BaseMapperX; import com.fjrcloud.community.framework.mybatis.core.query.LambdaQueryWrapperX; import com.fjrcloud.community.module.system.dal.dataobject.user.UserTenantRelDO; @@ -30,4 +31,10 @@ public interface UserTenantRelMapper extends BaseMapperX { return delete(new LambdaQueryWrapperX() .eq(UserTenantRelDO::getUserId, userId)); } + + default int clearDefaultByUserId(Long userId) { + return update(new UserTenantRelDO().setDefaultTenant(false), + new LambdaQueryWrapper().eq(UserTenantRelDO::getUserId, userId)); + } + } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/enums/ErrorCodeConstants.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/enums/ErrorCodeConstants.java index 9b0b76a..17fbc64 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/enums/ErrorCodeConstants.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/enums/ErrorCodeConstants.java @@ -16,6 +16,7 @@ public interface ErrorCodeConstants { ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1_002_000_005, "未绑定账号,需要进行绑定"); ErrorCode AUTH_MOBILE_NOT_EXISTS = new ErrorCode(1_002_000_007, "手机号不存在"); ErrorCode AUTH_REGISTER_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_008, "验证码不正确,原因:{}"); + ErrorCode AUTH_NO_TENANT_PERMISSION = new ErrorCode(1_002_000_009, "当前用户无权限访问系统,请联系管理员"); // ========== 菜单模块 1-002-001-000 ========== ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1_002_001_000, "已经存在该名字的菜单"); diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthService.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthService.java index 2c6ba2a..e0221f6 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthService.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthService.java @@ -4,6 +4,7 @@ import com.fjrcloud.community.module.system.controller.admin.auth.vo.*; import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO; import javax.validation.Valid; +import java.util.List; /** * 管理后台的认证 Service 接口 @@ -80,6 +81,20 @@ public interface AdminAuthService { void resetPassword(@Valid AuthResetPasswordReqVO reqVO); - AuthUserTenantListRespVO getUserTenantList(@Valid AuthUserTenantListReqVO reqVO); + /** + * 获取用户的租户列表 + * + * @param userId 用户ID + * @return 租户列表 + */ + List getUserTenantList(Long userId); + + /** + * 切换租户并重新登录 + * + * @param reqVO 切换请求 + * @return 登录响应 + */ + AuthLoginRespVO switchTenant(AuthSwitchTenantReqVO reqVO); } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthServiceImpl.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthServiceImpl.java index b87d8a0..511b821 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthServiceImpl.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthServiceImpl.java @@ -1,6 +1,8 @@ package com.fjrcloud.community.module.system.service.auth; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.anji.captcha.model.common.ResponseModel; import com.anji.captcha.model.vo.CaptchaVO; import com.anji.captcha.service.CaptchaService; @@ -11,6 +13,7 @@ import com.fjrcloud.community.framework.common.util.object.BeanUtils; import com.fjrcloud.community.framework.common.util.servlet.ServletUtils; import com.fjrcloud.community.framework.common.util.validation.ValidationUtils; import com.fjrcloud.community.framework.datapermission.core.annotation.DataPermission; +import com.fjrcloud.community.framework.security.core.util.SecurityFrameworkUtils; import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder; import com.fjrcloud.community.framework.tenant.core.util.TenantUtils; import com.fjrcloud.community.module.system.api.logger.dto.LoginLogCreateReqDTO; @@ -23,6 +26,7 @@ import com.fjrcloud.community.module.system.convert.auth.AuthConvert; import com.fjrcloud.community.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO; import com.fjrcloud.community.module.system.dal.dataobject.user.UserTenantRelDO; +import com.fjrcloud.community.module.system.enums.ErrorCodeConstants; import com.fjrcloud.community.module.system.enums.logger.LoginLogTypeEnum; import com.fjrcloud.community.module.system.enums.logger.LoginResultEnum; import com.fjrcloud.community.module.system.enums.oauth2.OAuth2ClientConstants; @@ -79,24 +83,49 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override public AdminUserDO authenticate(String username, String password) { final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; - // 校验账号是否存在 - AdminUserDO user = userService.getUserByUsername(username); + // 校验账号是否存在(支持用户名或手机号登录) + AdminUserDO user; + String loginAccount = username; + + // 判断是手机号还是用户名 + if (isMobile(username)) { + // 手机号登录 + user = userService.getUserByMobile(username); + } else { + // 用户名登录 + user = userService.getUserByUsername(username); + } + if (user == null) { - createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + createLoginLog(null, loginAccount, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); throw exception(AUTH_LOGIN_BAD_CREDENTIALS); } if (!userService.isPasswordMatch(password, user.getPassword())) { - createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + createLoginLog(user.getId(), loginAccount, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); throw exception(AUTH_LOGIN_BAD_CREDENTIALS); } // 校验是否禁用 if (CommonStatusEnum.isDisable(user.getStatus())) { - createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.USER_DISABLED); + createLoginLog(user.getId(), loginAccount, logTypeEnum, LoginResultEnum.USER_DISABLED); throw exception(AUTH_LOGIN_USER_DISABLED); } return user; } + /** + * 判断是否为手机号 + * + * @param account 账号 + * @return 是否为手机号 + */ + private boolean isMobile(String account) { + if (StrUtil.isBlank(account)) { + return false; + } + // 手机号格式:11位数字,以1开头 + return account.matches("^1[3-9]\\d{9}$"); + } + @Override @DataPermission(enable = false) public AuthLoginRespVO login(AuthLoginReqVO reqVO) { @@ -106,20 +135,38 @@ public class AdminAuthServiceImpl implements AdminAuthService { // 使用账号密码,进行登录 AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword()); + // 获取用户租户关联关系 + List rels = userTenantRelService.getUserTenantRels(user.getId()); + if (CollUtil.isEmpty(rels)) { + createLoginLog(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.TENANT_PERMISSION_DENIED); + throw exception(ErrorCodeConstants.AUTH_NO_TENANT_PERMISSION); + } + + // 查找默认租户 + UserTenantRelDO defaultRel = rels.stream() + .filter(rel -> Boolean.TRUE.equals(rel.getDefaultTenant())) + .findFirst() + .orElse(null); + + Long tenantId; + if (defaultRel != null) { + tenantId = defaultRel.getTenantId(); + } else { + // 没有默认租户,取第一条 + tenantId = rels.get(0).getTenantId(); + // 设置为默认租户 + userTenantRelService.setDefaultTenant(user.getId(), tenantId); + } + + // 设置当前请求的租户上下文 + TenantContextHolder.setTenantId(tenantId); + // 如果 socialType 非空,说明需要绑定社交用户 if (reqVO.getSocialType() != null) { socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); } - Long tenantId = TenantContextHolder.getTenantId(); - if (tenantId == null) { - createLoginLog(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.BAD_CREDENTIALS); - throw exception(AUTH_LOGIN_BAD_CREDENTIALS); - } - - validateUserTenantPermission(user.getId(), tenantId); - return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); } @@ -236,21 +283,21 @@ public class AdminAuthServiceImpl implements AdminAuthService { private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType) { createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS); - + Long tenantId = TenantContextHolder.getTenantId(); - + OAuth2AccessTokenDO accessTokenDO; if (tenantId != null) { - accessTokenDO = TenantUtils.execute(tenantId, () -> - oauth2TokenService.createAccessToken(userId, getUserType().getValue(), - OAuth2ClientConstants.CLIENT_ID_DEFAULT, null)); + accessTokenDO = TenantUtils.execute(tenantId, () -> + oauth2TokenService.createAccessToken(userId, getUserType().getValue(), + OAuth2ClientConstants.CLIENT_ID_DEFAULT, null)); } else { accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(), OAuth2ClientConstants.CLIENT_ID_DEFAULT, null); } - + List tenants = userTenantRelService.getUserTenants(userId); - + AuthLoginRespVO respVO = BeanUtils.toBean(accessTokenDO, AuthLoginRespVO.class); respVO.setTenants(tenants); return respVO; @@ -337,27 +384,32 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override @DataPermission(enable = false) - public AuthUserTenantListRespVO getUserTenantList(AuthUserTenantListReqVO reqVO) { - AdminUserDO user = userService.getUserByUsername(reqVO.getUsername()); - if (user == null) { - throw exception(AUTH_LOGIN_BAD_CREDENTIALS); - } - - if (!userService.isPasswordMatch(reqVO.getPassword(), user.getPassword())) { - throw exception(AUTH_LOGIN_BAD_CREDENTIALS); - } - - if (CommonStatusEnum.isDisable(user.getStatus())) { - throw exception(AUTH_LOGIN_USER_DISABLED); + public List getUserTenantList(Long userId) { + return userTenantRelService.getUserTenants(userId); + } + + @Override + @DataPermission(enable = false) + public AuthLoginRespVO switchTenant(AuthSwitchTenantReqVO reqVO) { + Long userId = SecurityFrameworkUtils.getLoginUserId(); + + // 获得用户信息 + AdminUserDO user = userService.getUser(userId); + + // 校验新租户是否在用户授权列表中 + List rels = userTenantRelService.getUserTenantRels(userId); + boolean exists = rels.stream().anyMatch(r -> r.getTenantId().equals(reqVO.getTenantId())); + if (!exists) { + throw exception(USER_TENANT_REL_NOT_EXISTS); } - List tenants = userTenantRelService.getUserTenants(user.getId()); - - return AuthUserTenantListRespVO.builder() - .userId(user.getId()) - .username(user.getUsername()) - .nickname(user.getNickname()) - .tenants(tenants) - .build(); + // 设置新租户为默认 + userTenantRelService.setDefaultTenant(userId, reqVO.getTenantId()); + + // 切换租户上下文 + TenantContextHolder.setTenantId(reqVO.getTenantId()); + + // 创建新租户下的 Token(自动失效旧 Token) + return createTokenAfterLoginSuccess(userId, user.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); } } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserServiceImpl.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserServiceImpl.java index fdd670d..10e55f9 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserServiceImpl.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserServiceImpl.java @@ -358,6 +358,11 @@ public class AdminUserServiceImpl implements AdminUserService { private AdminUserDO validateUserForCreateOrUpdate(Long id, String username, String mobile, String email, Long deptId, Set postIds) { return DataPermissionUtils.executeIgnore(() -> { + // 校验手机号不能为空 + if (StrUtil.isBlank(mobile)) { + throw exception(USER_MOBILE_NOT_EXISTS); + } + AdminUserDO user = validateUserExists(id); validateUsernameUnique(id, username); validateMobileUnique(id, mobile); @@ -416,9 +421,6 @@ public class AdminUserServiceImpl implements AdminUserService { @VisibleForTesting void validateMobileUnique(Long id, String mobile) { - if (StrUtil.isBlank(mobile)) { - return; - } AdminUserDO user = userMapper.selectByMobile(mobile); if (user == null) { return; diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelService.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelService.java index fffe59e..49a70c4 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelService.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelService.java @@ -20,4 +20,13 @@ public interface UserTenantRelService { void removeUserFromTenant(Long userId, Long tenantId); void batchAssignUserToTenants(Long userId, List tenantIds); + + /** + * 设置用户默认租户 + * + * @param userId 用户ID + * @param tenantId 租户ID + */ + void setDefaultTenant(Long userId, Long tenantId); + } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelServiceImpl.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelServiceImpl.java index 6ed4dc4..ab6267d 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelServiceImpl.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelServiceImpl.java @@ -1,6 +1,7 @@ package com.fjrcloud.community.module.system.service.usertenant; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fjrcloud.community.module.system.controller.admin.auth.vo.TenantInfoVO; import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO; import com.fjrcloud.community.module.system.dal.dataobject.user.UserTenantRelDO; @@ -115,6 +116,22 @@ public class UserTenantRelServiceImpl implements UserTenantRelService { } } + @Override + @Transactional(rollbackFor = Exception.class) + public void setDefaultTenant(Long userId, Long tenantId) { + // 1. 清除该用户所有关联租户的默认标记 + userTenantRelMapper.clearDefaultByUserId(userId); + // 2. 设置指定租户为默认 + UserTenantRelDO rel = userTenantRelMapper.selectOne(new LambdaQueryWrapper() + .eq(UserTenantRelDO::getUserId, userId) + .eq(UserTenantRelDO::getTenantId, tenantId)); + if (rel != null) { + rel.setDefaultTenant(true); + userTenantRelMapper.updateById(rel); + } + } + + private void clearDefaultTenant(Long userId) { UserTenantRelDO defaultRel = userTenantRelMapper.selectDefaultByUserId(userId); if (defaultRel != null) {