添加接口

This commit is contained in:
luke 2025-06-12 16:38:27 +08:00
parent 6aaab95126
commit 78f4c659ad
11 changed files with 119 additions and 16 deletions

View File

@ -2,7 +2,9 @@ package com.knowledge.base.application.service;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.knowledge.base.application.exceptions.AppException; 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.UserDO;
import com.knowledge.base.domain.user.model.UserRoleDO;
import com.knowledge.base.domain.user.service.iface.UserDomainService; import com.knowledge.base.domain.user.service.iface.UserDomainService;
import com.knowledge.base.infrastructure.converter.*; import com.knowledge.base.infrastructure.converter.*;
import com.knowledge.base.infrastructure.north.dto.role.RoleDTO; import com.knowledge.base.infrastructure.north.dto.role.RoleDTO;
@ -15,6 +17,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -48,16 +51,13 @@ public class UserAppServiceImpl implements UserAppService {
} }
@Override @Override
public boolean updateUser(Long id, UserDTO userDTO) { public boolean updateUser(Long userId, UserDTO userDTO) {
UserDO userDO = UserDtoConverter.toDO(userDTO); UserDO userDO = UserDtoConverter.toDO(userDTO);
try { try {
userDomainService.updateUser(userDO); userDomainService.updateUser(userDO);
userDomainService.findRolesByUserId(id).forEach(role -> { userDomainService.removeUserRoles(userId);
userDomainService.removeUserRole(id, role.getRoleId()); userDomainService.batchAddUserRoles(userId,
}); userDTO.getUserRoles().stream().map(RoleDTO::getId).collect(Collectors.toList()));
userDTO.getUserRoles().forEach(roleId -> {
userDomainService.addUserRole(id, roleId.longValue());
});
} catch (Exception e) { } catch (Exception e) {
throw new AppException("更新用户信息失败", e); throw new AppException("更新用户信息失败", e);
} }
@ -76,8 +76,21 @@ public class UserAppServiceImpl implements UserAppService {
@Override @Override
public List<UserDTO> findAll() { public List<UserDTO> findAll() {
return Optional.ofNullable(userDomainService.findAllUsers()).orElse(Lists.newArrayList()).stream() // userIds
.map(e -> UserDtoConverter.toDTO(e)) List<UserDO> allUsers = userDomainService.findAllUsers();
List<Long> allUserIds = allUsers.stream().map(e -> e.getId()).collect(Collectors.toList());
// userId ---> roleId
Map<Long, List<UserRoleDO>> userRolesRelationMap = userDomainService.batchFindRolesByUserIds(allUserIds);
// roleId ---> role详情
Map<Long, RoleDO> roleMap = userDomainService.findAllRoles().stream().collect(Collectors.toMap(RoleDO::getId, e -> e));
// userId ---> role详情
Map<Long, List<RoleDO>> userRolesMap = allUserIds.stream().collect(Collectors.toMap(userId -> userId, userId -> {
List<Long> 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()); .collect(Collectors.toList());
} }

View File

@ -2,6 +2,7 @@ package com.knowledge.base.domain.user.repository.iface;
import com.knowledge.base.domain.user.repository.po.UserRole; import com.knowledge.base.domain.user.repository.po.UserRole;
import java.util.Collection;
import java.util.List; import java.util.List;
public interface UserRoleRepository { public interface UserRoleRepository {
@ -12,4 +13,8 @@ public interface UserRoleRepository {
UserRole findById(Long id); UserRole findById(Long id);
List<UserRole> findByUserId(Long userId); List<UserRole> findByUserId(Long userId);
List<UserRole> findAll(); List<UserRole> findAll();
List<UserRole> findByUserIdIn(List<Long> userIds);
boolean removeUserRoles(Long userId);
} }

View File

@ -3,6 +3,7 @@ package com.knowledge.base.domain.user.service.iface;
import com.knowledge.base.domain.user.model.*; import com.knowledge.base.domain.user.model.*;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
public interface UserDomainService { public interface UserDomainService {
@ -30,6 +31,9 @@ public interface UserDomainService {
// 用户-角色 // 用户-角色
List<UserRoleDO> findRolesByUserId(Long userId); List<UserRoleDO> findRolesByUserId(Long userId);
Map<Long, List<UserRoleDO>> batchFindRolesByUserIds(List<Long> userIds);
boolean batchAddUserRoles(Long userId, List<Long> roleIds);
boolean removeUserRoles(Long userId);
boolean addUserRole(Long userId, Long roleId); boolean addUserRole(Long userId, Long roleId);
boolean removeUserRole(Long userId, Long roleId); boolean removeUserRole(Long userId, Long roleId);

View File

@ -4,9 +4,16 @@ import com.knowledge.base.domain.user.model.UserRoleDO;
import com.knowledge.base.domain.user.repository.po.UserRole; import com.knowledge.base.domain.user.repository.po.UserRole;
import java.util.List; import java.util.List;
import java.util.Map;
public interface UserRoleDomainSupport { public interface UserRoleDomainSupport {
List<UserRoleDO> findByUserId(Long userId); List<UserRoleDO> findByUserId(Long userId);
boolean addUserRole(Long userId, Long roleId); boolean addUserRole(Long userId, Long roleId);
boolean removeUserRole(Long userId, Long roleId); boolean removeUserRole(Long userId, Long roleId);
Map<Long, List<UserRoleDO>> batchFindRolesByUserIds(List<Long> userIds);
boolean batchAddUserRoles(Long userId, List<Long> roleIds);
boolean removeUserRoles(Long userId);
} }

View File

@ -1,11 +1,14 @@
package com.knowledge.base.domain.user.service.impl; 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.model.*;
import com.knowledge.base.domain.user.service.iface.*; import com.knowledge.base.domain.user.service.iface.*;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
@Service @Service
@ -104,6 +107,25 @@ public class UserDomainServiceImpl implements UserDomainService {
public List<UserRoleDO> findRolesByUserId(Long userId) { public List<UserRoleDO> findRolesByUserId(Long userId) {
return userRoleDomainSupport.findByUserId(userId); return userRoleDomainSupport.findByUserId(userId);
} }
@Override
public Map<Long, List<UserRoleDO>> batchFindRolesByUserIds(List<Long> userIds) {
if(CollectionUtil.isEmpty(userIds)) {
return MapUtil.newHashMap();
}
return userRoleDomainSupport.batchFindRolesByUserIds(userIds);
}
@Override
public boolean batchAddUserRoles(Long userId, List<Long> roleIds) {
return userRoleDomainSupport.batchAddUserRoles(userId, roleIds);
}
@Override
public boolean removeUserRoles(Long userId) {
return userRoleDomainSupport.removeUserRoles(userId);
}
@Override @Override
public boolean addUserRole(Long userId, Long roleId) { public boolean addUserRole(Long userId, Long roleId) {
return userRoleDomainSupport.addUserRole(userId, roleId); return userRoleDomainSupport.addUserRole(userId, roleId);

View File

@ -10,6 +10,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -38,4 +39,26 @@ public class UserRoleDomainSupportImpl implements UserRoleDomainSupport {
public boolean removeUserRole(Long userId, Long roleId) { public boolean removeUserRole(Long userId, Long roleId) {
return userRoleRepository.deleteByUserIdAndRoleId(userId, roleId); return userRoleRepository.deleteByUserIdAndRoleId(userId, roleId);
} }
@Override
public Map<Long, List<UserRoleDO>> batchFindRolesByUserIds(List<Long> userIds) {
return userRoleRepository.findByUserIdIn(userIds).stream()
.map(e -> UserRoleDomainConverter.toDO(e))
.collect(Collectors.groupingBy(UserRoleDO::getUserId));
}
@Override
public boolean batchAddUserRoles(Long userId, List<Long> 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);
}
} }

View File

@ -18,7 +18,7 @@ public class DynamicConfig {
@Value("${cookie.domain.name:wisdompulse.cn}") @Value("${cookie.domain.name:wisdompulse.cn}")
private String cookieDomainName; private String cookieDomainName;
@Value("${import.schedule.cron:0 0 * * * *}") @Value("${import.schedule.cron:* 0/30 * * * ?}")
private String importScheduleCron; private String importScheduleCron;
// token失效时间默认24小时 // token失效时间默认24小时

View File

@ -1,11 +1,17 @@
package com.knowledge.base.infrastructure.converter; 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.domain.user.model.UserDO;
import com.knowledge.base.infrastructure.config.ConstantConfig; 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 com.knowledge.base.infrastructure.north.dto.user.UserDTO;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import java.time.ZoneId; 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)); dto.setAddTime(doObj.getAddTime() == null ? null : doObj.getAddTime().atZone(ZoneId.of("Asia/Shanghai")).format(ConstantConfig.DTF));
return dto; return dto;
} }
public static UserDTO toDTO(UserDO doObj, List<RoleDO> 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<RoleDTO> roleDTOS = Optional.ofNullable(roleDOs).orElse(Lists.newArrayList()).stream().map(RoleDtoConverter::toDTO).collect(Collectors.toList());
dto.setUserRoles(roleDTOS);
return dto;
}
} }

View File

@ -55,12 +55,12 @@ public class UserWriteController {
return ResponseEntity.ok(userAppService.deleteUser(id)); return ResponseEntity.ok(userAppService.deleteUser(id));
} }
@PutMapping("/{id}") @PutMapping("/{userId}")
public ResponseEntity<?> updateUser(@PathVariable Long id, @RequestBody UserDTO userDTO) { public ResponseEntity<?> updateUser(@PathVariable Long userId, @RequestBody UserDTO userDTO) {
if(Objects.isNull(id) || Objects.isNull(userDTO)) { if(Objects.isNull(userId) || Objects.isNull(userDTO)) {
return ResponseEntity.badRequest().body(Map.of("msg", "参数错误id或用户信息为空")); return ResponseEntity.badRequest().body(Map.of("msg", "参数错误id或用户信息为空"));
} }
return ResponseEntity.ok(userAppService.updateUser(id, userDTO)); return ResponseEntity.ok(userAppService.updateUser(userId, userDTO));
} }
@PostMapping("/login") @PostMapping("/login")

View File

@ -1,8 +1,9 @@
package com.knowledge.base.infrastructure.north.dto.user; package com.knowledge.base.infrastructure.north.dto.user;
import com.knowledge.base.infrastructure.north.dto.role.RoleDTO;
import lombok.Data; import lombok.Data;
import java.util.Set; import java.util.List;
/** /**
* @author Luke.ye * @author Luke.ye
@ -13,6 +14,6 @@ import java.util.Set;
public class UserDTO { public class UserDTO {
private Long id; private Long id;
private String username; private String username;
private List<RoleDTO> userRoles;
private String addTime; private String addTime;
private Set<Integer> userRoles;
} }

View File

@ -51,4 +51,16 @@ public class UserRoleRepositoryImpl implements UserRoleRepository {
public List<UserRole> findAll() { public List<UserRole> findAll() {
return userRoleMapper.selectList(null); return userRoleMapper.selectList(null);
} }
@Override
public List<UserRole> findByUserIdIn(List<Long> userIds) {
return userRoleMapper.selectList(new QueryWrapper<UserRole>().in("user_id", userIds));
}
@Override
public boolean removeUserRoles(Long userId) {
return userRoleMapper.delete(
new QueryWrapper<UserRole>().eq("user_id", userId)
) > 0;
}
} }