数据权限,登录

master
zzy 2026-04-21 00:58:26 +08:00
parent c01d68aec8
commit 76ed1f579c
15 changed files with 286 additions and 44 deletions

View File

@ -7,6 +7,7 @@ import com.fjrcloud.community.framework.common.enums.UserTypeEnum;
import com.fjrcloud.community.framework.common.pojo.CommonResult; import com.fjrcloud.community.framework.common.pojo.CommonResult;
import com.fjrcloud.community.framework.security.config.SecurityProperties; import com.fjrcloud.community.framework.security.config.SecurityProperties;
import com.fjrcloud.community.framework.security.core.util.SecurityFrameworkUtils; import com.fjrcloud.community.framework.security.core.util.SecurityFrameworkUtils;
import com.fjrcloud.community.framework.tenant.core.aop.TenantIgnore;
import com.fjrcloud.community.module.system.controller.admin.auth.vo.*; import com.fjrcloud.community.module.system.controller.admin.auth.vo.*;
import com.fjrcloud.community.module.system.convert.auth.AuthConvert; import com.fjrcloud.community.module.system.convert.auth.AuthConvert;
import com.fjrcloud.community.module.system.dal.dataobject.permission.MenuDO; import com.fjrcloud.community.module.system.dal.dataobject.permission.MenuDO;
@ -148,6 +149,14 @@ public class AuthController {
return success(true); return success(true);
} }
@PostMapping("/get-user-tenant-list")
@PermitAll
@TenantIgnore
@Operation(summary = "获取用户的租户列表(未登录状态)")
public CommonResult<AuthUserTenantListRespVO> getUserTenantList(@RequestBody @Valid AuthUserTenantListReqVO reqVO) {
return success(authService.getUserTenantList(reqVO));
}
// ========== 社交登录相关 ========== // ========== 社交登录相关 ==========
@GetMapping("/social-auth-redirect") @GetMapping("/social-auth-redirect")

View File

@ -0,0 +1,22 @@
package com.fjrcloud.community.module.system.controller.admin.auth.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
@Schema(description = "管理后台 - 获取用户租户列表 Request VO")
@Data
public class AuthUserTenantListReqVO {
@Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "admin")
@NotEmpty(message = "登录账号不能为空")
@Length(min = 4, max = 30, message = "账号长度为 4-30 位")
private String username;
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "admin123")
@NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
}

View File

@ -0,0 +1,29 @@
package com.fjrcloud.community.module.system.controller.admin.auth.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Schema(description = "管理后台 - 用户租户列表 Response VO")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AuthUserTenantListRespVO {
@Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long userId;
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "admin")
private String username;
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "管理员")
private String nickname;
@Schema(description = "租户列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<TenantInfoVO> tenants;
}

View File

@ -11,6 +11,7 @@ import com.fjrcloud.community.framework.tenant.core.aop.TenantIgnore;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantRespVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantRespVO;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO;
import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO; import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO;
import com.fjrcloud.community.module.system.service.tenant.TenantService; import com.fjrcloud.community.module.system.service.tenant.TenantService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -29,6 +30,7 @@ import java.util.List;
import static com.fjrcloud.community.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static com.fjrcloud.community.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static com.fjrcloud.community.framework.common.pojo.CommonResult.success; import static com.fjrcloud.community.framework.common.pojo.CommonResult.success;
import static com.fjrcloud.community.framework.common.util.collection.CollectionUtils.convertList; import static com.fjrcloud.community.framework.common.util.collection.CollectionUtils.convertList;
import static com.fjrcloud.community.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Tag(name = "管理后台 - 租户") @Tag(name = "管理后台 - 租户")
@RestController @RestController
@ -48,7 +50,7 @@ public class TenantController {
return success(tenant != null ? tenant.getId() : null); return success(tenant != null ? tenant.getId() : null);
} }
@GetMapping({ "simple-list" }) @GetMapping({ "simple-total-list" })
@PermitAll @PermitAll
@TenantIgnore @TenantIgnore
@Operation(summary = "获取租户精简信息列表", description = "只包含被开启的租户,用于【首页】功能的选择租户选项") @Operation(summary = "获取租户精简信息列表", description = "只包含被开启的租户,用于【首页】功能的选择租户选项")
@ -133,4 +135,12 @@ public class TenantController {
BeanUtils.toBean(list, TenantRespVO.class)); BeanUtils.toBean(list, TenantRespVO.class));
} }
@GetMapping("/simple-list")
@Operation(summary = "获取租户精简列表")
@PermitAll
@TenantIgnore
public CommonResult<List<TenantSimpleRespVO>> getSimpleTenantList() {
List<TenantSimpleRespVO> list = tenantService.getUserTenantList(getLoginUserId());
return success(list);
}
} }

View File

@ -0,0 +1,21 @@
package com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Schema(description = "管理后台 - 租户精简 Response VO")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TenantSimpleRespVO {
@Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long tenantId;
@Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "XX小区")
private String tenantName;
}

View File

@ -13,7 +13,9 @@ import com.fjrcloud.community.module.system.dal.dataobject.dept.DeptDO;
import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO; import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO;
import com.fjrcloud.community.module.system.enums.common.SexEnum; import com.fjrcloud.community.module.system.enums.common.SexEnum;
import com.fjrcloud.community.module.system.service.dept.DeptService; import com.fjrcloud.community.module.system.service.dept.DeptService;
import com.fjrcloud.community.module.system.service.tenant.TenantService;
import com.fjrcloud.community.module.system.service.user.AdminUserService; import com.fjrcloud.community.module.system.service.user.AdminUserService;
import com.fjrcloud.community.module.system.service.usertenant.UserTenantRelService;
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;
import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.Parameters;
@ -28,6 +30,7 @@ import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -45,6 +48,10 @@ public class UserController {
private AdminUserService userService; private AdminUserService userService;
@Resource @Resource
private DeptService deptService; private DeptService deptService;
@Resource
private TenantService tenantService;
@Resource
private UserTenantRelService userTenantRelService;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "新增用户") @Operation(summary = "新增用户")
@ -100,23 +107,24 @@ public class UserController {
@Operation(summary = "获得用户分页列表") @Operation(summary = "获得用户分页列表")
@PreAuthorize("@ss.hasPermission('system:user:query')") @PreAuthorize("@ss.hasPermission('system:user:query')")
public CommonResult<PageResult<UserRespVO>> getUserPage(@Valid UserPageReqVO pageReqVO) { public CommonResult<PageResult<UserRespVO>> getUserPage(@Valid UserPageReqVO pageReqVO) {
// 获得用户分页列表
PageResult<AdminUserDO> pageResult = userService.getUserPage(pageReqVO); PageResult<AdminUserDO> pageResult = userService.getUserPage(pageReqVO);
if (CollUtil.isEmpty(pageResult.getList())) { if (CollUtil.isEmpty(pageResult.getList())) {
return success(new PageResult<>(pageResult.getTotal())); return success(new PageResult<>(pageResult.getTotal()));
} }
// 拼接数据
Map<Long, DeptDO> deptMap = deptService.getDeptMap( Map<Long, DeptDO> deptMap = deptService.getDeptMap(
convertList(pageResult.getList(), AdminUserDO::getDeptId)); convertList(pageResult.getList(), AdminUserDO::getDeptId));
return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap), List<UserRespVO> list = UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap);
pageResult.getTotal()));
userService.fillUserTenantNames(list);
return success(new PageResult<>(list, pageResult.getTotal()));
} }
@GetMapping({"/list-all-simple", "/simple-list"}) @GetMapping({"/list-all-simple", "/simple-list"})
@Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项") @Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项")
public CommonResult<List<UserSimpleRespVO>> getSimpleUserList() { public CommonResult<List<UserSimpleRespVO>> getSimpleUserList() {
List<AdminUserDO> list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus()); List<AdminUserDO> list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus());
// 拼接数据
Map<Long, DeptDO> deptMap = deptService.getDeptMap( Map<Long, DeptDO> deptMap = deptService.getDeptMap(
convertList(list, AdminUserDO::getDeptId)); convertList(list, AdminUserDO::getDeptId));
return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap));
@ -131,9 +139,12 @@ public class UserController {
if (user == null) { if (user == null) {
return success(null); return success(null);
} }
// 拼接数据
DeptDO dept = deptService.getDept(user.getDeptId()); DeptDO dept = deptService.getDept(user.getDeptId());
return success(UserConvert.INSTANCE.convert(user, dept)); UserRespVO userVO = UserConvert.INSTANCE.convert(user, dept);
userService.fillUserTenantNames(Collections.singletonList(userVO));
return success(userVO);
} }
@GetMapping("/export-excel") @GetMapping("/export-excel")
@ -144,24 +155,24 @@ public class UserController {
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<AdminUserDO> list = userService.getUserPage(exportReqVO).getList(); List<AdminUserDO> list = userService.getUserPage(exportReqVO).getList();
// 输出 Excel
Map<Long, DeptDO> deptMap = deptService.getDeptMap( Map<Long, DeptDO> deptMap = deptService.getDeptMap(
convertList(list, AdminUserDO::getDeptId)); convertList(list, AdminUserDO::getDeptId));
ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class, List<UserRespVO> userVOList = UserConvert.INSTANCE.convertList(list, deptMap);
UserConvert.INSTANCE.convertList(list, deptMap));
userService.fillUserTenantNames(userVOList);
ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class, userVOList);
} }
@GetMapping("/get-import-template") @GetMapping("/get-import-template")
@Operation(summary = "获得导入用户模板") @Operation(summary = "获得导入用户模板")
public void importTemplate(HttpServletResponse response) throws IOException { public void importTemplate(HttpServletResponse response) throws IOException {
// 手动创建导出 demo
List<UserImportExcelVO> list = Arrays.asList( List<UserImportExcelVO> list = Arrays.asList(
UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@fjrcloud.cn").mobile("15601691300") UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@fjrcloud.cn").mobile("15601691300")
.nickname("融云").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), .nickname("融云").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(),
UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@fjrcloud.cn").mobile("15601701300") UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@fjrcloud.cn").mobile("15601701300")
.nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build()
); );
// 输出
ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list);
} }

View File

@ -1,10 +1,10 @@
package com.fjrcloud.community.module.system.controller.admin.user.vo.user; package com.fjrcloud.community.module.system.controller.admin.user.vo.user;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.fjrcloud.community.framework.excel.core.annotations.DictFormat; import com.fjrcloud.community.framework.excel.core.annotations.DictFormat;
import com.fjrcloud.community.framework.excel.core.convert.DictConvert; import com.fjrcloud.community.framework.excel.core.convert.DictConvert;
import com.fjrcloud.community.module.system.enums.DictTypeConstants; import com.fjrcloud.community.module.system.enums.DictTypeConstants;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ -65,6 +65,10 @@ public class UserRespVO{
@ExcelProperty("最后登录IP") @ExcelProperty("最后登录IP")
private String loginIp; private String loginIp;
@Schema(description = "数据权限", requiredMode = Schema.RequiredMode.REQUIRED, example = "光明小区")
@ExcelProperty("数据权限")
private String tenantNames;
@Schema(description = "最后登录时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") @Schema(description = "最后登录时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
@ExcelProperty("最后登录时间") @ExcelProperty("最后登录时间")
private LocalDateTime loginDate; private LocalDateTime loginDate;

View File

@ -73,16 +73,13 @@ public interface AdminAuthService {
/** /**
* *
* *
* @param createReqVO * @param registerReqVO
* @return * @return
*/ */
AuthLoginRespVO register(AuthRegisterReqVO createReqVO); AuthLoginRespVO register(@Valid AuthRegisterReqVO registerReqVO);
/** void resetPassword(@Valid AuthResetPasswordReqVO reqVO);
*
* AuthUserTenantListRespVO getUserTenantList(@Valid AuthUserTenantListReqVO reqVO);
* @param reqVO
*/
void resetPassword(AuthResetPasswordReqVO reqVO);
} }

View File

@ -334,4 +334,30 @@ public class AdminAuthServiceImpl implements AdminAuthService {
userService.updateUserPassword(userByMobile.getId(), reqVO.getPassword()); userService.updateUserPassword(userByMobile.getId(), reqVO.getPassword());
} }
@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);
}
List<TenantInfoVO> tenants = userTenantRelService.getUserTenants(user.getId());
return AuthUserTenantListRespVO.builder()
.userId(user.getId())
.username(user.getUsername())
.nickname(user.getNickname())
.tenants(tenants)
.build();
}
} }

View File

@ -4,6 +4,7 @@ import com.fjrcloud.community.framework.common.pojo.PageResult;
import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder; import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO;
import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO; import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO;
import com.fjrcloud.community.module.system.service.tenant.handler.TenantInfoHandler; import com.fjrcloud.community.module.system.service.tenant.handler.TenantInfoHandler;
import com.fjrcloud.community.module.system.service.tenant.handler.TenantMenuHandler; import com.fjrcloud.community.module.system.service.tenant.handler.TenantMenuHandler;
@ -135,11 +136,10 @@ public interface TenantService {
*/ */
List<Long> getTenantIdList(); List<Long> getTenantIdList();
/**
*
*
* @param id
*/
void validTenant(Long id); void validTenant(Long id);
List<TenantSimpleRespVO> getUserTenantList(Long userId);
List<TenantSimpleRespVO> getTenantListByIds(List<Long> ids);
} }

View File

@ -3,6 +3,7 @@ package com.fjrcloud.community.module.system.service.tenant;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.fjrcloud.community.framework.common.enums.CommonStatusEnum; import com.fjrcloud.community.framework.common.enums.CommonStatusEnum;
import com.fjrcloud.community.framework.common.pojo.PageResult; import com.fjrcloud.community.framework.common.pojo.PageResult;
import com.fjrcloud.community.framework.common.util.collection.CollectionUtils; import com.fjrcloud.community.framework.common.util.collection.CollectionUtils;
@ -15,11 +16,13 @@ import com.fjrcloud.community.framework.tenant.core.util.TenantUtils;
import com.fjrcloud.community.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; import com.fjrcloud.community.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO;
import com.fjrcloud.community.module.system.convert.tenant.TenantConvert; import com.fjrcloud.community.module.system.convert.tenant.TenantConvert;
import com.fjrcloud.community.module.system.dal.dataobject.permission.MenuDO; import com.fjrcloud.community.module.system.dal.dataobject.permission.MenuDO;
import com.fjrcloud.community.module.system.dal.dataobject.permission.RoleDO; import com.fjrcloud.community.module.system.dal.dataobject.permission.RoleDO;
import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO; import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO;
import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantPackageDO; import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantPackageDO;
import com.fjrcloud.community.module.system.dal.dataobject.user.UserTenantRelDO;
import com.fjrcloud.community.module.system.dal.mysql.tenant.TenantMapper; import com.fjrcloud.community.module.system.dal.mysql.tenant.TenantMapper;
import com.fjrcloud.community.module.system.enums.permission.RoleCodeEnum; import com.fjrcloud.community.module.system.enums.permission.RoleCodeEnum;
import com.fjrcloud.community.module.system.enums.permission.RoleTypeEnum; import com.fjrcloud.community.module.system.enums.permission.RoleTypeEnum;
@ -29,7 +32,7 @@ import com.fjrcloud.community.module.system.service.permission.RoleService;
import com.fjrcloud.community.module.system.service.tenant.handler.TenantInfoHandler; import com.fjrcloud.community.module.system.service.tenant.handler.TenantInfoHandler;
import com.fjrcloud.community.module.system.service.tenant.handler.TenantMenuHandler; import com.fjrcloud.community.module.system.service.tenant.handler.TenantMenuHandler;
import com.fjrcloud.community.module.system.service.user.AdminUserService; import com.fjrcloud.community.module.system.service.user.AdminUserService;
import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.fjrcloud.community.module.system.service.usertenant.UserTenantRelService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
@ -37,9 +40,11 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.fjrcloud.community.module.system.enums.ErrorCodeConstants.*; import static com.fjrcloud.community.module.system.enums.ErrorCodeConstants.*;
@ -73,6 +78,8 @@ public class TenantServiceImpl implements TenantService {
private MenuService menuService; private MenuService menuService;
@Resource @Resource
private PermissionService permissionService; private PermissionService permissionService;
@Resource
private UserTenantRelService userTenantRelService;
@Override @Override
public List<Long> getTenantIdList() { public List<Long> getTenantIdList() {
@ -317,4 +324,36 @@ public class TenantServiceImpl implements TenantService {
return tenantProperties == null || Boolean.FALSE.equals(tenantProperties.getEnable()); return tenantProperties == null || Boolean.FALSE.equals(tenantProperties.getEnable());
} }
@Override
public List<TenantSimpleRespVO> getUserTenantList(Long userId) {
List<UserTenantRelDO> rels = userTenantRelService.getUserTenantRels(userId);
if (CollUtil.isEmpty(rels)) {
return Collections.emptyList();
}
List<Long> tenantIds = CollectionUtils.convertList(rels, UserTenantRelDO::getTenantId);
List<TenantDO> tenants = tenantMapper.selectBatchIds(tenantIds);
return tenants.stream()
.map(tenant -> TenantSimpleRespVO.builder()
.tenantId(tenant.getId())
.tenantName(tenant.getName())
.build())
.collect(Collectors.toList());
}
@Override
public List<TenantSimpleRespVO> getTenantListByIds(List<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return Collections.emptyList();
}
List<TenantDO> tenants = tenantMapper.selectBatchIds(ids);
return tenants.stream()
.map(tenant -> TenantSimpleRespVO.builder()
.tenantId(tenant.getId())
.tenantName(tenant.getName())
.build())
.collect(Collectors.toList());
}
} }

View File

@ -6,10 +6,7 @@ import com.fjrcloud.community.framework.common.util.collection.CollectionUtils;
import com.fjrcloud.community.module.system.controller.admin.auth.vo.AuthRegisterReqVO; import com.fjrcloud.community.module.system.controller.admin.auth.vo.AuthRegisterReqVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserImportExcelVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.user.*;
import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserImportRespVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserPageReqVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO; import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO;
import javax.validation.Valid; import javax.validation.Valid;
@ -188,13 +185,8 @@ public interface AdminUserService {
*/ */
List<AdminUserDO> getUserListByNickname(String nickname); List<AdminUserDO> getUserListByNickname(String nickname);
/** void fillUserTenantNames(List<UserRespVO> userList);
*
*
* @param importUsers
* @param isUpdateSupport
* @return
*/
UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport); UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport);
/** /**

View File

@ -15,15 +15,14 @@ import com.fjrcloud.community.framework.datapermission.core.util.DataPermissionU
import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder; import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder;
import com.fjrcloud.community.module.infra.api.config.ConfigApi; import com.fjrcloud.community.module.infra.api.config.ConfigApi;
import com.fjrcloud.community.module.system.controller.admin.auth.vo.AuthRegisterReqVO; import com.fjrcloud.community.module.system.controller.admin.auth.vo.AuthRegisterReqVO;
import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserImportExcelVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.user.*;
import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserImportRespVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserPageReqVO;
import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import com.fjrcloud.community.module.system.dal.dataobject.dept.DeptDO; import com.fjrcloud.community.module.system.dal.dataobject.dept.DeptDO;
import com.fjrcloud.community.module.system.dal.dataobject.dept.UserPostDO; import com.fjrcloud.community.module.system.dal.dataobject.dept.UserPostDO;
import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO; 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.dal.mysql.dept.UserPostMapper; import com.fjrcloud.community.module.system.dal.mysql.dept.UserPostMapper;
import com.fjrcloud.community.module.system.dal.mysql.user.AdminUserMapper; import com.fjrcloud.community.module.system.dal.mysql.user.AdminUserMapper;
import com.fjrcloud.community.module.system.service.dept.DeptService; import com.fjrcloud.community.module.system.service.dept.DeptService;
@ -47,6 +46,7 @@ import javax.validation.ConstraintViolationException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.fjrcloud.community.framework.common.util.collection.CollectionUtils.*; import static com.fjrcloud.community.framework.common.util.collection.CollectionUtils.*;
@ -488,6 +488,81 @@ public class AdminUserServiceImpl implements AdminUserService {
return passwordEncoder.matches(rawPassword, encodedPassword); return passwordEncoder.matches(rawPassword, encodedPassword);
} }
@Override
public void fillUserTenantNames(List<UserRespVO> userList) {
if (CollUtil.isEmpty(userList)) {
return;
}
Map<Long, List<UserTenantRelDO>> userTenantRelMap = getUserTenantRelsBatch(userList);
Map<Long, String> tenantNameMap = buildTenantNameMap(userTenantRelMap);
for (UserRespVO userVO : userList) {
Long userId = userVO.getId();
if (userId != null && tenantNameMap.containsKey(userId)) {
userVO.setTenantNames(tenantNameMap.get(userId));
}
}
}
private Map<Long, List<UserTenantRelDO>> getUserTenantRelsBatch(List<UserRespVO> userList) {
List<Long> userIds = userList.stream()
.map(UserRespVO::getId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (CollUtil.isEmpty(userIds)) {
return Collections.emptyMap();
}
Map<Long, List<UserTenantRelDO>> result = new HashMap<>();
for (Long userId : userIds) {
List<UserTenantRelDO> rels = userTenantRelService.getUserTenantRels(userId);
if (CollUtil.isNotEmpty(rels)) {
result.put(userId, rels);
}
}
return result;
}
private Map<Long, String> buildTenantNameMap(Map<Long, List<UserTenantRelDO>> userTenantRelMap) {
if (CollUtil.isEmpty(userTenantRelMap)) {
return Collections.emptyMap();
}
Set<Long> allTenantIds = userTenantRelMap.values().stream()
.flatMap(List::stream)
.map(UserTenantRelDO::getTenantId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
if (CollUtil.isEmpty(allTenantIds)) {
return Collections.emptyMap();
}
List<TenantSimpleRespVO> allTenants = tenantService.getTenantListByIds(new ArrayList<>(allTenantIds));
if (CollUtil.isEmpty(allTenants)) {
return Collections.emptyMap();
}
Map<Long, String> tenantIdNameMap = allTenants.stream()
.collect(Collectors.toMap(TenantSimpleRespVO::getTenantId, TenantSimpleRespVO::getTenantName, (v1, v2) -> v1));
Map<Long, String> result = new HashMap<>();
for (Map.Entry<Long, List<UserTenantRelDO>> entry : userTenantRelMap.entrySet()) {
String tenantNames = entry.getValue().stream()
.map(UserTenantRelDO::getTenantId)
.filter(tenantIdNameMap::containsKey)
.map(tenantIdNameMap::get)
.collect(Collectors.joining(","));
if (StrUtil.isNotBlank(tenantNames)) {
result.put(entry.getKey(), tenantNames);
}
}
return result;
}
private String encodePassword(String password) { private String encodePassword(String password) {
return passwordEncoder.encode(password); return passwordEncoder.encode(password);
} }

View File

@ -13,6 +13,8 @@ public interface UserTenantRelService {
UserTenantRelDO getDefaultTenant(Long userId); UserTenantRelDO getDefaultTenant(Long userId);
List<UserTenantRelDO> getUserTenantRels(Long userId);
void assignUserToTenant(Long userId, Long tenantId, Boolean isDefault); void assignUserToTenant(Long userId, Long tenantId, Boolean isDefault);
void removeUserFromTenant(Long userId, Long tenantId); void removeUserFromTenant(Long userId, Long tenantId);

View File

@ -54,6 +54,11 @@ public class UserTenantRelServiceImpl implements UserTenantRelService {
return userTenantRelMapper.selectDefaultByUserId(userId); return userTenantRelMapper.selectDefaultByUserId(userId);
} }
@Override
public List<UserTenantRelDO> getUserTenantRels(Long userId) {
return userTenantRelMapper.selectListByUserId(userId);
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void assignUserToTenant(Long userId, Long tenantId, Boolean isDefault) { public void assignUserToTenant(Long userId, Long tenantId, Boolean isDefault) {