From 78f4c659ad734cff8ded1be998f0aed1d2182e89 Mon Sep 17 00:00:00 2001 From: luke Date: Thu, 12 Jun 2025 16:38:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/UserAppServiceImpl.java | 31 +++++++++++++------ .../repository/iface/UserRoleRepository.java | 5 +++ .../user/service/iface/UserDomainService.java | 4 +++ .../service/iface/UserRoleDomainSupport.java | 7 +++++ .../service/impl/UserDomainServiceImpl.java | 22 +++++++++++++ .../impl/UserRoleDomainSupportImpl.java | 23 ++++++++++++++ .../infrastructure/config/DynamicConfig.java | 2 +- .../converter/UserDtoConverter.java | 16 ++++++++++ .../north/controller/UserWriteController.java | 8 ++--- .../north/dto/user/UserDTO.java | 5 +-- .../user/UserRoleRepositoryImpl.java | 12 +++++++ 11 files changed, 119 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/knowledge/base/application/service/UserAppServiceImpl.java b/src/main/java/com/knowledge/base/application/service/UserAppServiceImpl.java index 768dee1..e32c796 100644 --- a/src/main/java/com/knowledge/base/application/service/UserAppServiceImpl.java +++ b/src/main/java/com/knowledge/base/application/service/UserAppServiceImpl.java @@ -2,7 +2,9 @@ package com.knowledge.base.application.service; import com.google.common.collect.Lists; import com.knowledge.base.application.exceptions.AppException; +import com.knowledge.base.domain.user.model.RoleDO; import com.knowledge.base.domain.user.model.UserDO; +import com.knowledge.base.domain.user.model.UserRoleDO; import com.knowledge.base.domain.user.service.iface.UserDomainService; import com.knowledge.base.infrastructure.converter.*; import com.knowledge.base.infrastructure.north.dto.role.RoleDTO; @@ -15,6 +17,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -48,16 +51,13 @@ public class UserAppServiceImpl implements UserAppService { } @Override - public boolean updateUser(Long id, UserDTO userDTO) { + public boolean updateUser(Long userId, UserDTO userDTO) { UserDO userDO = UserDtoConverter.toDO(userDTO); try { userDomainService.updateUser(userDO); - userDomainService.findRolesByUserId(id).forEach(role -> { - userDomainService.removeUserRole(id, role.getRoleId()); - }); - userDTO.getUserRoles().forEach(roleId -> { - userDomainService.addUserRole(id, roleId.longValue()); - }); + userDomainService.removeUserRoles(userId); + userDomainService.batchAddUserRoles(userId, + userDTO.getUserRoles().stream().map(RoleDTO::getId).collect(Collectors.toList())); } catch (Exception e) { throw new AppException("更新用户信息失败", e); } @@ -76,8 +76,21 @@ public class UserAppServiceImpl implements UserAppService { @Override public List findAll() { - return Optional.ofNullable(userDomainService.findAllUsers()).orElse(Lists.newArrayList()).stream() - .map(e -> UserDtoConverter.toDTO(e)) + // userIds + List allUsers = userDomainService.findAllUsers(); + List allUserIds = allUsers.stream().map(e -> e.getId()).collect(Collectors.toList()); + // userId ---> roleId + Map> userRolesRelationMap = userDomainService.batchFindRolesByUserIds(allUserIds); + // roleId ---> role详情 + Map roleMap = userDomainService.findAllRoles().stream().collect(Collectors.toMap(RoleDO::getId, e -> e)); + // userId ---> role详情 + Map> userRolesMap = allUserIds.stream().collect(Collectors.toMap(userId -> userId, userId -> { + List roleIds = Optional.ofNullable(userRolesRelationMap.get(userId)).orElse(Lists.newArrayList()).stream() + .map(UserRoleDO::getId).collect(Collectors.toList()); + return roleIds.stream().map(roleId -> roleMap.get(roleId)).collect(Collectors.toList()); + })); + return Optional.ofNullable(allUsers).orElse(Lists.newArrayList()).stream() + .map(e -> UserDtoConverter.toDTO(e, userRolesMap.get(e.getId()))) .collect(Collectors.toList()); } diff --git a/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRoleRepository.java b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRoleRepository.java index a1eacb8..e416692 100644 --- a/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRoleRepository.java +++ b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRoleRepository.java @@ -2,6 +2,7 @@ package com.knowledge.base.domain.user.repository.iface; import com.knowledge.base.domain.user.repository.po.UserRole; +import java.util.Collection; import java.util.List; public interface UserRoleRepository { @@ -12,4 +13,8 @@ public interface UserRoleRepository { UserRole findById(Long id); List findByUserId(Long userId); List findAll(); + + List findByUserIdIn(List userIds); + + boolean removeUserRoles(Long userId); } diff --git a/src/main/java/com/knowledge/base/domain/user/service/iface/UserDomainService.java b/src/main/java/com/knowledge/base/domain/user/service/iface/UserDomainService.java index e8f3052..f502b70 100644 --- a/src/main/java/com/knowledge/base/domain/user/service/iface/UserDomainService.java +++ b/src/main/java/com/knowledge/base/domain/user/service/iface/UserDomainService.java @@ -3,6 +3,7 @@ package com.knowledge.base.domain.user.service.iface; import com.knowledge.base.domain.user.model.*; import java.util.List; +import java.util.Map; import java.util.Optional; public interface UserDomainService { @@ -30,6 +31,9 @@ public interface UserDomainService { // 用户-角色 List findRolesByUserId(Long userId); + Map> batchFindRolesByUserIds(List userIds); + boolean batchAddUserRoles(Long userId, List roleIds); + boolean removeUserRoles(Long userId); boolean addUserRole(Long userId, Long roleId); boolean removeUserRole(Long userId, Long roleId); diff --git a/src/main/java/com/knowledge/base/domain/user/service/iface/UserRoleDomainSupport.java b/src/main/java/com/knowledge/base/domain/user/service/iface/UserRoleDomainSupport.java index ece3146..2da9ff4 100644 --- a/src/main/java/com/knowledge/base/domain/user/service/iface/UserRoleDomainSupport.java +++ b/src/main/java/com/knowledge/base/domain/user/service/iface/UserRoleDomainSupport.java @@ -4,9 +4,16 @@ import com.knowledge.base.domain.user.model.UserRoleDO; import com.knowledge.base.domain.user.repository.po.UserRole; import java.util.List; +import java.util.Map; public interface UserRoleDomainSupport { List findByUserId(Long userId); boolean addUserRole(Long userId, Long roleId); boolean removeUserRole(Long userId, Long roleId); + + Map> batchFindRolesByUserIds(List userIds); + + boolean batchAddUserRoles(Long userId, List roleIds); + + boolean removeUserRoles(Long userId); } diff --git a/src/main/java/com/knowledge/base/domain/user/service/impl/UserDomainServiceImpl.java b/src/main/java/com/knowledge/base/domain/user/service/impl/UserDomainServiceImpl.java index c04d90f..f95c5b4 100644 --- a/src/main/java/com/knowledge/base/domain/user/service/impl/UserDomainServiceImpl.java +++ b/src/main/java/com/knowledge/base/domain/user/service/impl/UserDomainServiceImpl.java @@ -1,11 +1,14 @@ package com.knowledge.base.domain.user.service.impl; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; import com.knowledge.base.domain.user.model.*; import com.knowledge.base.domain.user.service.iface.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; import java.util.Optional; @Service @@ -104,6 +107,25 @@ public class UserDomainServiceImpl implements UserDomainService { public List findRolesByUserId(Long userId) { return userRoleDomainSupport.findByUserId(userId); } + + @Override + public Map> batchFindRolesByUserIds(List userIds) { + if(CollectionUtil.isEmpty(userIds)) { + return MapUtil.newHashMap(); + } + return userRoleDomainSupport.batchFindRolesByUserIds(userIds); + } + + @Override + public boolean batchAddUserRoles(Long userId, List roleIds) { + return userRoleDomainSupport.batchAddUserRoles(userId, roleIds); + } + + @Override + public boolean removeUserRoles(Long userId) { + return userRoleDomainSupport.removeUserRoles(userId); + } + @Override public boolean addUserRole(Long userId, Long roleId) { return userRoleDomainSupport.addUserRole(userId, roleId); diff --git a/src/main/java/com/knowledge/base/domain/user/service/impl/UserRoleDomainSupportImpl.java b/src/main/java/com/knowledge/base/domain/user/service/impl/UserRoleDomainSupportImpl.java index 531022d..964a978 100644 --- a/src/main/java/com/knowledge/base/domain/user/service/impl/UserRoleDomainSupportImpl.java +++ b/src/main/java/com/knowledge/base/domain/user/service/impl/UserRoleDomainSupportImpl.java @@ -10,6 +10,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -38,4 +39,26 @@ public class UserRoleDomainSupportImpl implements UserRoleDomainSupport { public boolean removeUserRole(Long userId, Long roleId) { return userRoleRepository.deleteByUserIdAndRoleId(userId, roleId); } + + @Override + public Map> batchFindRolesByUserIds(List userIds) { + return userRoleRepository.findByUserIdIn(userIds).stream() + .map(e -> UserRoleDomainConverter.toDO(e)) + .collect(Collectors.groupingBy(UserRoleDO::getUserId)); + } + + @Override + public boolean batchAddUserRoles(Long userId, List roleIds) { + boolean res = true; + for (Long roleId : roleIds) { + boolean b = addUserRole(userId, roleId); + res = res && b; + } + return res; + } + + @Override + public boolean removeUserRoles(Long userId) { + return userRoleRepository.removeUserRoles(userId); + } } diff --git a/src/main/java/com/knowledge/base/infrastructure/config/DynamicConfig.java b/src/main/java/com/knowledge/base/infrastructure/config/DynamicConfig.java index b41bf05..45742d1 100644 --- a/src/main/java/com/knowledge/base/infrastructure/config/DynamicConfig.java +++ b/src/main/java/com/knowledge/base/infrastructure/config/DynamicConfig.java @@ -18,7 +18,7 @@ public class DynamicConfig { @Value("${cookie.domain.name:wisdompulse.cn}") private String cookieDomainName; - @Value("${import.schedule.cron:0 0 * * * *}") + @Value("${import.schedule.cron:* 0/30 * * * ?}") private String importScheduleCron; // token失效时间,默认24小时 diff --git a/src/main/java/com/knowledge/base/infrastructure/converter/UserDtoConverter.java b/src/main/java/com/knowledge/base/infrastructure/converter/UserDtoConverter.java index f1a0274..6168f3f 100644 --- a/src/main/java/com/knowledge/base/infrastructure/converter/UserDtoConverter.java +++ b/src/main/java/com/knowledge/base/infrastructure/converter/UserDtoConverter.java @@ -1,11 +1,17 @@ package com.knowledge.base.infrastructure.converter; +import com.google.common.collect.Lists; +import com.knowledge.base.domain.user.model.RoleDO; import com.knowledge.base.domain.user.model.UserDO; import com.knowledge.base.infrastructure.config.ConstantConfig; +import com.knowledge.base.infrastructure.north.dto.role.RoleDTO; import com.knowledge.base.infrastructure.north.dto.user.UserDTO; import org.springframework.beans.BeanUtils; import java.time.ZoneId; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; /** @@ -26,5 +32,15 @@ public class UserDtoConverter { dto.setAddTime(doObj.getAddTime() == null ? null : doObj.getAddTime().atZone(ZoneId.of("Asia/Shanghai")).format(ConstantConfig.DTF)); return dto; } + + public static UserDTO toDTO(UserDO doObj, List roleDOs) { + if (doObj == null) return null; + UserDTO dto = new UserDTO(); + BeanUtils.copyProperties(doObj, dto); + dto.setAddTime(doObj.getAddTime() == null ? null : doObj.getAddTime().atZone(ZoneId.of("Asia/Shanghai")).format(ConstantConfig.DTF)); + List roleDTOS = Optional.ofNullable(roleDOs).orElse(Lists.newArrayList()).stream().map(RoleDtoConverter::toDTO).collect(Collectors.toList()); + dto.setUserRoles(roleDTOS); + return dto; + } } diff --git a/src/main/java/com/knowledge/base/infrastructure/north/controller/UserWriteController.java b/src/main/java/com/knowledge/base/infrastructure/north/controller/UserWriteController.java index c28d90e..235d9f7 100644 --- a/src/main/java/com/knowledge/base/infrastructure/north/controller/UserWriteController.java +++ b/src/main/java/com/knowledge/base/infrastructure/north/controller/UserWriteController.java @@ -55,12 +55,12 @@ public class UserWriteController { return ResponseEntity.ok(userAppService.deleteUser(id)); } - @PutMapping("/{id}") - public ResponseEntity updateUser(@PathVariable Long id, @RequestBody UserDTO userDTO) { - if(Objects.isNull(id) || Objects.isNull(userDTO)) { + @PutMapping("/{userId}") + public ResponseEntity updateUser(@PathVariable Long userId, @RequestBody UserDTO userDTO) { + if(Objects.isNull(userId) || Objects.isNull(userDTO)) { return ResponseEntity.badRequest().body(Map.of("msg", "参数错误:id或用户信息为空!")); } - return ResponseEntity.ok(userAppService.updateUser(id, userDTO)); + return ResponseEntity.ok(userAppService.updateUser(userId, userDTO)); } @PostMapping("/login") diff --git a/src/main/java/com/knowledge/base/infrastructure/north/dto/user/UserDTO.java b/src/main/java/com/knowledge/base/infrastructure/north/dto/user/UserDTO.java index ff6fd05..2c5316c 100644 --- a/src/main/java/com/knowledge/base/infrastructure/north/dto/user/UserDTO.java +++ b/src/main/java/com/knowledge/base/infrastructure/north/dto/user/UserDTO.java @@ -1,8 +1,9 @@ package com.knowledge.base.infrastructure.north.dto.user; +import com.knowledge.base.infrastructure.north.dto.role.RoleDTO; import lombok.Data; -import java.util.Set; +import java.util.List; /** * @author Luke.ye @@ -13,6 +14,6 @@ import java.util.Set; public class UserDTO { private Long id; private String username; + private List userRoles; private String addTime; - private Set userRoles; } diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRoleRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRoleRepositoryImpl.java index e5d0148..32fefc8 100644 --- a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRoleRepositoryImpl.java +++ b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRoleRepositoryImpl.java @@ -51,4 +51,16 @@ public class UserRoleRepositoryImpl implements UserRoleRepository { public List findAll() { return userRoleMapper.selectList(null); } + + @Override + public List findByUserIdIn(List userIds) { + return userRoleMapper.selectList(new QueryWrapper().in("user_id", userIds)); + } + + @Override + public boolean removeUserRoles(Long userId) { + return userRoleMapper.delete( + new QueryWrapper().eq("user_id", userId) + ) > 0; + } }