Commit cf3cfdd2d6c2967a9fc1c12f155330ebe93a6804
1 parent
c845f3f0
补全用户与岗位的关联的单元测试,简化相关的实现代码
Showing
6 changed files
with
85 additions
and
100 deletions
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/UserPostDO.java
| 1 | package cn.iocoder.yudao.module.system.dal.dataobject.dept; | 1 | package cn.iocoder.yudao.module.system.dal.dataobject.dept; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | -import com.baomidou.mybatisplus.annotation.DbType; | 4 | +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; |
| 5 | import com.baomidou.mybatisplus.annotation.KeySequence; | 5 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 6 | import com.baomidou.mybatisplus.annotation.TableId; | 6 | import com.baomidou.mybatisplus.annotation.TableId; |
| 7 | import com.baomidou.mybatisplus.annotation.TableName; | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
| @@ -14,6 +14,7 @@ import lombok.EqualsAndHashCode; | @@ -14,6 +14,7 @@ import lombok.EqualsAndHashCode; | ||
| 14 | * @author ruoyi | 14 | * @author ruoyi |
| 15 | */ | 15 | */ |
| 16 | @TableName("system_user_post") | 16 | @TableName("system_user_post") |
| 17 | +@KeySequence("system_user_post_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | ||
| 17 | @Data | 18 | @Data |
| 18 | @EqualsAndHashCode(callSuper = true) | 19 | @EqualsAndHashCode(callSuper = true) |
| 19 | public class UserPostDO extends BaseDO { | 20 | public class UserPostDO extends BaseDO { |
| @@ -25,10 +26,14 @@ public class UserPostDO extends BaseDO { | @@ -25,10 +26,14 @@ public class UserPostDO extends BaseDO { | ||
| 25 | private Long id; | 26 | private Long id; |
| 26 | /** | 27 | /** |
| 27 | * 用户 ID | 28 | * 用户 ID |
| 29 | + * | ||
| 30 | + * 关联 {@link AdminUserDO#getId()} | ||
| 28 | */ | 31 | */ |
| 29 | private Long userId; | 32 | private Long userId; |
| 30 | /** | 33 | /** |
| 31 | * 角色 ID | 34 | * 角色 ID |
| 35 | + * | ||
| 36 | + * 关联 {@link PostDO#getId()} | ||
| 32 | */ | 37 | */ |
| 33 | private Long postId; | 38 | private Long postId; |
| 34 | 39 |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/UserPostMapper.java
| @@ -12,9 +12,9 @@ import java.util.List; | @@ -12,9 +12,9 @@ import java.util.List; | ||
| 12 | @Mapper | 12 | @Mapper |
| 13 | public interface UserPostMapper extends BaseMapperX<UserPostDO> { | 13 | public interface UserPostMapper extends BaseMapperX<UserPostDO> { |
| 14 | 14 | ||
| 15 | - default List<UserPostDO> selectIdList(Long id) { | 15 | + default List<UserPostDO> selectListByUserId(Long userId) { |
| 16 | return selectList(new LambdaQueryWrapperX<UserPostDO>() | 16 | return selectList(new LambdaQueryWrapperX<UserPostDO>() |
| 17 | - .eq(UserPostDO::getUserId, id)); | 17 | + .eq(UserPostDO::getUserId, userId)); |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | default void deleteByUserIdAndPostId(Long userId, Collection<Long> postIds) { | 20 | default void deleteByUserIdAndPostId(Long userId, Collection<Long> postIds) { |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
| @@ -11,12 +11,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | @@ -11,12 +11,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 11 | import cn.iocoder.yudao.module.infra.api.file.FileApi; | 11 | import cn.iocoder.yudao.module.infra.api.file.FileApi; |
| 12 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; | 12 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; |
| 13 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; | 13 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; |
| 14 | -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserCreateReqVO; | ||
| 15 | -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserExportReqVO; | ||
| 16 | -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO; | ||
| 17 | -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO; | ||
| 18 | -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; | ||
| 19 | -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserUpdateReqVO; | 14 | +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; |
| 20 | import cn.iocoder.yudao.module.system.convert.user.UserConvert; | 15 | import cn.iocoder.yudao.module.system.convert.user.UserConvert; |
| 21 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; | 16 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; |
| 22 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO; | 17 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO; |
| @@ -36,25 +31,12 @@ import org.springframework.transaction.annotation.Transactional; | @@ -36,25 +31,12 @@ import org.springframework.transaction.annotation.Transactional; | ||
| 36 | 31 | ||
| 37 | import javax.annotation.Resource; | 32 | import javax.annotation.Resource; |
| 38 | import java.io.InputStream; | 33 | import java.io.InputStream; |
| 39 | -import java.util.ArrayList; | ||
| 40 | -import java.util.Collection; | ||
| 41 | -import java.util.Collections; | ||
| 42 | -import java.util.Date; | ||
| 43 | -import java.util.LinkedHashMap; | ||
| 44 | -import java.util.List; | ||
| 45 | -import java.util.Map; | ||
| 46 | -import java.util.Set; | ||
| 47 | -import java.util.stream.Collectors; | 34 | +import java.util.*; |
| 48 | 35 | ||
| 49 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 36 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 50 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_COUNT_MAX; | ||
| 51 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_EMAIL_EXISTS; | ||
| 52 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_IMPORT_LIST_IS_EMPTY; | ||
| 53 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_IS_DISABLE; | ||
| 54 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_MOBILE_EXISTS; | ||
| 55 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS; | ||
| 56 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_PASSWORD_FAILED; | ||
| 57 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS; | 37 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| 38 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | ||
| 39 | +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; | ||
| 58 | 40 | ||
| 59 | /** | 41 | /** |
| 60 | * 后台用户 Service 实现类 | 42 | * 后台用户 Service 实现类 |
| @@ -98,22 +80,17 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -98,22 +80,17 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 98 | } | 80 | } |
| 99 | }); | 81 | }); |
| 100 | // 校验正确性 | 82 | // 校验正确性 |
| 101 | - this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), | 83 | + checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), |
| 102 | reqVO.getDeptId(), reqVO.getPostIds()); | 84 | reqVO.getDeptId(), reqVO.getPostIds()); |
| 103 | // 插入用户 | 85 | // 插入用户 |
| 104 | AdminUserDO user = UserConvert.INSTANCE.convert(reqVO); | 86 | AdminUserDO user = UserConvert.INSTANCE.convert(reqVO); |
| 105 | user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 | 87 | user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 |
| 106 | user.setPassword(passwordEncoder.encode(reqVO.getPassword())); // 加密密码 | 88 | user.setPassword(passwordEncoder.encode(reqVO.getPassword())); // 加密密码 |
| 107 | userMapper.insert(user); | 89 | userMapper.insert(user); |
| 108 | - Set<Long> postIds = user.getPostIds(); | ||
| 109 | - if (CollectionUtil.isNotEmpty(postIds)) { | ||
| 110 | - List<UserPostDO> insertUserPostList = CollectionUtils.convertList(postIds, postId -> { | ||
| 111 | - UserPostDO entity = new UserPostDO(); | ||
| 112 | - entity.setUserId(user.getId()); | ||
| 113 | - entity.setPostId(postId); | ||
| 114 | - return entity; | ||
| 115 | - }); | ||
| 116 | - userPostMapper.insertBatch(insertUserPostList); | 90 | + // 插入关联岗位 |
| 91 | + if (CollectionUtil.isNotEmpty(user.getPostIds())) { | ||
| 92 | + userPostMapper.insertBatch(convertList(user.getPostIds(), | ||
| 93 | + postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId))); | ||
| 117 | } | 94 | } |
| 118 | return user.getId(); | 95 | return user.getId(); |
| 119 | } | 96 | } |
| @@ -122,48 +99,32 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -122,48 +99,32 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 122 | @Transactional(rollbackFor = Exception.class) | 99 | @Transactional(rollbackFor = Exception.class) |
| 123 | public void updateUser(UserUpdateReqVO reqVO) { | 100 | public void updateUser(UserUpdateReqVO reqVO) { |
| 124 | // 校验正确性 | 101 | // 校验正确性 |
| 125 | - this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), | 102 | + checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), |
| 126 | reqVO.getDeptId(), reqVO.getPostIds()); | 103 | reqVO.getDeptId(), reqVO.getPostIds()); |
| 127 | // 更新用户 | 104 | // 更新用户 |
| 128 | AdminUserDO updateObj = UserConvert.INSTANCE.convert(reqVO); | 105 | AdminUserDO updateObj = UserConvert.INSTANCE.convert(reqVO); |
| 129 | userMapper.updateById(updateObj); | 106 | userMapper.updateById(updateObj); |
| 130 | // 更新岗位 | 107 | // 更新岗位 |
| 131 | updateUserPost(reqVO, updateObj); | 108 | updateUserPost(reqVO, updateObj); |
| 132 | - | ||
| 133 | } | 109 | } |
| 134 | 110 | ||
| 135 | private void updateUserPost(UserUpdateReqVO reqVO, AdminUserDO updateObj) { | 111 | private void updateUserPost(UserUpdateReqVO reqVO, AdminUserDO updateObj) { |
| 136 | - Set<Long> postIds = updateObj.getPostIds(); | ||
| 137 | Long userId = reqVO.getId(); | 112 | Long userId = reqVO.getId(); |
| 138 | - List<Long> dbPostIds = userPostMapper.selectIdList(userId) | ||
| 139 | - .stream() | ||
| 140 | - .map(UserPostDO::getPostId) | ||
| 141 | - .collect(Collectors.toList()); | 113 | + Set<Long> dbPostIds = convertSet(userPostMapper.selectListByUserId(userId), UserPostDO::getPostId); |
| 142 | // 计算新增和删除的岗位编号 | 114 | // 计算新增和删除的岗位编号 |
| 115 | + Set<Long> postIds = updateObj.getPostIds(); | ||
| 143 | Collection<Long> createPostIds = CollUtil.subtract(postIds, dbPostIds); | 116 | Collection<Long> createPostIds = CollUtil.subtract(postIds, dbPostIds); |
| 144 | Collection<Long> deletePostIds = CollUtil.subtract(dbPostIds, postIds); | 117 | Collection<Long> deletePostIds = CollUtil.subtract(dbPostIds, postIds); |
| 145 | // 执行新增和删除。对于已经授权的菜单,不用做任何处理 | 118 | // 执行新增和删除。对于已经授权的菜单,不用做任何处理 |
| 146 | if (!CollectionUtil.isEmpty(createPostIds)) { | 119 | if (!CollectionUtil.isEmpty(createPostIds)) { |
| 147 | - List<UserPostDO> list = createUserPost(userId, createPostIds); | ||
| 148 | - userPostMapper.insertBatch(list); | 120 | + userPostMapper.insertBatch(convertList(createPostIds, |
| 121 | + postId -> new UserPostDO().setUserId(userId).setPostId(postId))); | ||
| 149 | } | 122 | } |
| 150 | if (!CollectionUtil.isEmpty(deletePostIds)) { | 123 | if (!CollectionUtil.isEmpty(deletePostIds)) { |
| 151 | userPostMapper.deleteByUserIdAndPostId(userId, deletePostIds); | 124 | userPostMapper.deleteByUserIdAndPostId(userId, deletePostIds); |
| 152 | } | 125 | } |
| 153 | } | 126 | } |
| 154 | 127 | ||
| 155 | - private List<UserPostDO> createUserPost(Long userId, Collection<Long> createPostIds) { | ||
| 156 | - return createPostIds | ||
| 157 | - .stream() | ||
| 158 | - .map(postId -> { | ||
| 159 | - UserPostDO entity = new UserPostDO(); | ||
| 160 | - entity.setUserId(userId); | ||
| 161 | - entity.setPostId(postId); | ||
| 162 | - return entity; | ||
| 163 | - }) | ||
| 164 | - .collect(Collectors.toList()); | ||
| 165 | - } | ||
| 166 | - | ||
| 167 | @Override | 128 | @Override |
| 168 | public void updateUserLogin(Long id, String loginIp) { | 129 | public void updateUserLogin(Long id, String loginIp) { |
| 169 | userMapper.updateById(new AdminUserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date())); | 130 | userMapper.updateById(new AdminUserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date())); |
| @@ -172,9 +133,9 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -172,9 +133,9 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 172 | @Override | 133 | @Override |
| 173 | public void updateUserProfile(Long id, UserProfileUpdateReqVO reqVO) { | 134 | public void updateUserProfile(Long id, UserProfileUpdateReqVO reqVO) { |
| 174 | // 校验正确性 | 135 | // 校验正确性 |
| 175 | - this.checkUserExists(id); | ||
| 176 | - this.checkEmailUnique(id, reqVO.getEmail()); | ||
| 177 | - this.checkMobileUnique(id, reqVO.getMobile()); | 136 | + checkUserExists(id); |
| 137 | + checkEmailUnique(id, reqVO.getEmail()); | ||
| 138 | + checkMobileUnique(id, reqVO.getMobile()); | ||
| 178 | // 执行更新 | 139 | // 执行更新 |
| 179 | userMapper.updateById(UserConvert.INSTANCE.convert(reqVO).setId(id)); | 140 | userMapper.updateById(UserConvert.INSTANCE.convert(reqVO).setId(id)); |
| 180 | } | 141 | } |
| @@ -182,7 +143,7 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -182,7 +143,7 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 182 | @Override | 143 | @Override |
| 183 | public void updateUserPassword(Long id, UserProfileUpdatePasswordReqVO reqVO) { | 144 | public void updateUserPassword(Long id, UserProfileUpdatePasswordReqVO reqVO) { |
| 184 | // 校验旧密码密码 | 145 | // 校验旧密码密码 |
| 185 | - this.checkOldPassword(id, reqVO.getOldPassword()); | 146 | + checkOldPassword(id, reqVO.getOldPassword()); |
| 186 | // 执行更新 | 147 | // 执行更新 |
| 187 | AdminUserDO updateObj = new AdminUserDO().setId(id); | 148 | AdminUserDO updateObj = new AdminUserDO().setId(id); |
| 188 | updateObj.setPassword(passwordEncoder.encode(reqVO.getNewPassword())); // 加密密码 | 149 | updateObj.setPassword(passwordEncoder.encode(reqVO.getNewPassword())); // 加密密码 |
| @@ -191,7 +152,7 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -191,7 +152,7 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 191 | 152 | ||
| 192 | @Override | 153 | @Override |
| 193 | public String updateUserAvatar(Long id, InputStream avatarFile) throws Exception { | 154 | public String updateUserAvatar(Long id, InputStream avatarFile) throws Exception { |
| 194 | - this.checkUserExists(id); | 155 | + checkUserExists(id); |
| 195 | // 存储文件 | 156 | // 存储文件 |
| 196 | String avatar = fileApi.createFile(IoUtil.readBytes(avatarFile)); | 157 | String avatar = fileApi.createFile(IoUtil.readBytes(avatarFile)); |
| 197 | // 更新路径 | 158 | // 更新路径 |
| @@ -205,7 +166,7 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -205,7 +166,7 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 205 | @Override | 166 | @Override |
| 206 | public void updateUserPassword(Long id, String password) { | 167 | public void updateUserPassword(Long id, String password) { |
| 207 | // 校验用户存在 | 168 | // 校验用户存在 |
| 208 | - this.checkUserExists(id); | 169 | + checkUserExists(id); |
| 209 | // 更新密码 | 170 | // 更新密码 |
| 210 | AdminUserDO updateObj = new AdminUserDO(); | 171 | AdminUserDO updateObj = new AdminUserDO(); |
| 211 | updateObj.setId(id); | 172 | updateObj.setId(id); |
| @@ -216,7 +177,7 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -216,7 +177,7 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 216 | @Override | 177 | @Override |
| 217 | public void updateUserStatus(Long id, Integer status) { | 178 | public void updateUserStatus(Long id, Integer status) { |
| 218 | // 校验用户存在 | 179 | // 校验用户存在 |
| 219 | - this.checkUserExists(id); | 180 | + checkUserExists(id); |
| 220 | // 更新状态 | 181 | // 更新状态 |
| 221 | AdminUserDO updateObj = new AdminUserDO(); | 182 | AdminUserDO updateObj = new AdminUserDO(); |
| 222 | updateObj.setId(id); | 183 | updateObj.setId(id); |
| @@ -228,7 +189,7 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -228,7 +189,7 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 228 | @Transactional(rollbackFor = Exception.class) | 189 | @Transactional(rollbackFor = Exception.class) |
| 229 | public void deleteUser(Long id) { | 190 | public void deleteUser(Long id) { |
| 230 | // 校验用户存在 | 191 | // 校验用户存在 |
| 231 | - this.checkUserExists(id); | 192 | + checkUserExists(id); |
| 232 | // 删除用户 | 193 | // 删除用户 |
| 233 | userMapper.deleteById(id); | 194 | userMapper.deleteById(id); |
| 234 | // 删除用户关联数据 | 195 | // 删除用户关联数据 |
| @@ -244,7 +205,7 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -244,7 +205,7 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 244 | 205 | ||
| 245 | @Override | 206 | @Override |
| 246 | public PageResult<AdminUserDO> getUserPage(UserPageReqVO reqVO) { | 207 | public PageResult<AdminUserDO> getUserPage(UserPageReqVO reqVO) { |
| 247 | - return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId())); | 208 | + return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId())); |
| 248 | } | 209 | } |
| 249 | 210 | ||
| 250 | @Override | 211 | @Override |
| @@ -265,15 +226,11 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -265,15 +226,11 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 265 | if (CollUtil.isEmpty(postIds)) { | 226 | if (CollUtil.isEmpty(postIds)) { |
| 266 | return Collections.emptyList(); | 227 | return Collections.emptyList(); |
| 267 | } | 228 | } |
| 268 | - List<Long> userIdList = userPostMapper.selectListByPostIds(postIds) | ||
| 269 | - .stream() | ||
| 270 | - .map(UserPostDO::getUserId) | ||
| 271 | - .distinct() | ||
| 272 | - .collect(Collectors.toList());; | ||
| 273 | - if (userIdList.isEmpty()) { | 229 | + Set<Long> userIds = convertSet(userPostMapper.selectListByPostIds(postIds), UserPostDO::getUserId); |
| 230 | + if (CollUtil.isEmpty(userIds)) { | ||
| 274 | return Collections.emptyList(); | 231 | return Collections.emptyList(); |
| 275 | } | 232 | } |
| 276 | - return userMapper.selectBatchIds(userIdList); | 233 | + return userMapper.selectBatchIds(userIds); |
| 277 | } | 234 | } |
| 278 | 235 | ||
| 279 | @Override | 236 | @Override |
| @@ -306,7 +263,7 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -306,7 +263,7 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 306 | 263 | ||
| 307 | @Override | 264 | @Override |
| 308 | public List<AdminUserDO> getUsers(UserExportReqVO reqVO) { | 265 | public List<AdminUserDO> getUsers(UserExportReqVO reqVO) { |
| 309 | - return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId())); | 266 | + return userMapper.selectList(reqVO, getDeptCondition(reqVO.getDeptId())); |
| 310 | } | 267 | } |
| 311 | 268 | ||
| 312 | @Override | 269 | @Override |
| @@ -328,7 +285,7 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -328,7 +285,7 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 328 | if (deptId == null) { | 285 | if (deptId == null) { |
| 329 | return Collections.emptySet(); | 286 | return Collections.emptySet(); |
| 330 | } | 287 | } |
| 331 | - Set<Long> deptIds = CollectionUtils.convertSet(deptService.getDeptsByParentIdFromCache( | 288 | + Set<Long> deptIds = convertSet(deptService.getDeptsByParentIdFromCache( |
| 332 | deptId, true), DeptDO::getId); | 289 | deptId, true), DeptDO::getId); |
| 333 | deptIds.add(deptId); // 包括自身 | 290 | deptIds.add(deptId); // 包括自身 |
| 334 | return deptIds; | 291 | return deptIds; |
| @@ -337,13 +294,13 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -337,13 +294,13 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 337 | private void checkCreateOrUpdate(Long id, String username, String mobile, String email, | 294 | private void checkCreateOrUpdate(Long id, String username, String mobile, String email, |
| 338 | Long deptId, Set<Long> postIds) { | 295 | Long deptId, Set<Long> postIds) { |
| 339 | // 校验用户存在 | 296 | // 校验用户存在 |
| 340 | - this.checkUserExists(id); | 297 | + checkUserExists(id); |
| 341 | // 校验用户名唯一 | 298 | // 校验用户名唯一 |
| 342 | - this.checkUsernameUnique(id, username); | 299 | + checkUsernameUnique(id, username); |
| 343 | // 校验手机号唯一 | 300 | // 校验手机号唯一 |
| 344 | - this.checkMobileUnique(id, mobile); | 301 | + checkMobileUnique(id, mobile); |
| 345 | // 校验邮箱唯一 | 302 | // 校验邮箱唯一 |
| 346 | - this.checkEmailUnique(id, email); | 303 | + checkEmailUnique(id, email); |
| 347 | // 校验部门处于开启状态 | 304 | // 校验部门处于开启状态 |
| 348 | deptService.validDepts(CollectionUtils.singleton(deptId)); | 305 | deptService.validDepts(CollectionUtils.singleton(deptId)); |
| 349 | // 校验岗位处于开启状态 | 306 | // 校验岗位处于开启状态 |
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/UserServiceImplTest.java renamed to yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java
| @@ -7,21 +7,23 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -7,21 +7,23 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 7 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; | 7 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; |
| 8 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 8 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 9 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 9 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 10 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 10 | import cn.iocoder.yudao.module.infra.api.file.FileApi; | 11 | import cn.iocoder.yudao.module.infra.api.file.FileApi; |
| 11 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; | 12 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; |
| 12 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; | 13 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; |
| 13 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; | 14 | import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*; |
| 14 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; | 15 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; |
| 15 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; | 16 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; |
| 17 | +import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO; | ||
| 16 | import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; | 18 | import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; |
| 17 | import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; | 19 | import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; |
| 20 | +import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper; | ||
| 18 | import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; | 21 | import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; |
| 19 | import cn.iocoder.yudao.module.system.enums.common.SexEnum; | 22 | import cn.iocoder.yudao.module.system.enums.common.SexEnum; |
| 20 | import cn.iocoder.yudao.module.system.service.dept.DeptService; | 23 | import cn.iocoder.yudao.module.system.service.dept.DeptService; |
| 21 | import cn.iocoder.yudao.module.system.service.dept.PostService; | 24 | import cn.iocoder.yudao.module.system.service.dept.PostService; |
| 22 | import cn.iocoder.yudao.module.system.service.permission.PermissionService; | 25 | import cn.iocoder.yudao.module.system.service.permission.PermissionService; |
| 23 | import cn.iocoder.yudao.module.system.service.tenant.TenantService; | 26 | import cn.iocoder.yudao.module.system.service.tenant.TenantService; |
| 24 | -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 25 | import org.junit.jupiter.api.Test; | 27 | import org.junit.jupiter.api.Test; |
| 26 | import org.mockito.stubbing.Answer; | 28 | import org.mockito.stubbing.Answer; |
| 27 | import org.springframework.boot.test.mock.mockito.MockBean; | 29 | import org.springframework.boot.test.mock.mockito.MockBean; |
| @@ -30,16 +32,19 @@ import org.springframework.security.crypto.password.PasswordEncoder; | @@ -30,16 +32,19 @@ import org.springframework.security.crypto.password.PasswordEncoder; | ||
| 30 | 32 | ||
| 31 | import javax.annotation.Resource; | 33 | import javax.annotation.Resource; |
| 32 | import java.io.ByteArrayInputStream; | 34 | import java.io.ByteArrayInputStream; |
| 35 | +import java.util.Collection; | ||
| 33 | import java.util.List; | 36 | import java.util.List; |
| 34 | import java.util.function.Consumer; | 37 | import java.util.function.Consumer; |
| 35 | 38 | ||
| 36 | import static cn.hutool.core.util.RandomUtil.randomBytes; | 39 | import static cn.hutool.core.util.RandomUtil.randomBytes; |
| 37 | import static cn.hutool.core.util.RandomUtil.randomEle; | 40 | import static cn.hutool.core.util.RandomUtil.randomEle; |
| 41 | +import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; | ||
| 38 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; | 42 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; |
| 39 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | 43 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; |
| 40 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | 44 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; |
| 41 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; | 45 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; |
| 42 | import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; | 46 | import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; |
| 47 | +import static java.util.Collections.singleton; | ||
| 43 | import static org.assertj.core.util.Lists.newArrayList; | 48 | import static org.assertj.core.util.Lists.newArrayList; |
| 44 | import static org.junit.jupiter.api.Assertions.assertEquals; | 49 | import static org.junit.jupiter.api.Assertions.assertEquals; |
| 45 | import static org.junit.jupiter.api.Assertions.assertNull; | 50 | import static org.junit.jupiter.api.Assertions.assertNull; |
| @@ -47,13 +52,15 @@ import static org.mockito.ArgumentMatchers.*; | @@ -47,13 +52,15 @@ import static org.mockito.ArgumentMatchers.*; | ||
| 47 | import static org.mockito.Mockito.*; | 52 | import static org.mockito.Mockito.*; |
| 48 | 53 | ||
| 49 | @Import(AdminUserServiceImpl.class) | 54 | @Import(AdminUserServiceImpl.class) |
| 50 | -public class UserServiceImplTest extends BaseDbUnitTest { | 55 | +public class AdminUserServiceImplTest extends BaseDbUnitTest { |
| 51 | 56 | ||
| 52 | @Resource | 57 | @Resource |
| 53 | private AdminUserServiceImpl userService; | 58 | private AdminUserServiceImpl userService; |
| 54 | 59 | ||
| 55 | @Resource | 60 | @Resource |
| 56 | private AdminUserMapper userMapper; | 61 | private AdminUserMapper userMapper; |
| 62 | + @Resource | ||
| 63 | + private UserPostMapper userPostMapper; | ||
| 57 | 64 | ||
| 58 | @MockBean | 65 | @MockBean |
| 59 | private DeptService deptService; | 66 | private DeptService deptService; |
| @@ -74,6 +81,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { | @@ -74,6 +81,7 @@ public class UserServiceImplTest extends BaseDbUnitTest { | ||
| 74 | UserCreateReqVO reqVO = randomPojo(UserCreateReqVO.class, o -> { | 81 | UserCreateReqVO reqVO = randomPojo(UserCreateReqVO.class, o -> { |
| 75 | o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); | 82 | o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); |
| 76 | o.setMobile(randomString()); | 83 | o.setMobile(randomString()); |
| 84 | + o.setPostIds(asSet(1L, 2L)); | ||
| 77 | }); | 85 | }); |
| 78 | // mock 账户额度充足 | 86 | // mock 账户额度充足 |
| 79 | TenantDO tenant = randomPojo(TenantDO.class, o -> o.setAccountCount(1)); | 87 | TenantDO tenant = randomPojo(TenantDO.class, o -> o.setAccountCount(1)); |
| @@ -104,6 +112,10 @@ public class UserServiceImplTest extends BaseDbUnitTest { | @@ -104,6 +112,10 @@ public class UserServiceImplTest extends BaseDbUnitTest { | ||
| 104 | assertPojoEquals(reqVO, user, "password"); | 112 | assertPojoEquals(reqVO, user, "password"); |
| 105 | assertEquals("yudaoyuanma", user.getPassword()); | 113 | assertEquals("yudaoyuanma", user.getPassword()); |
| 106 | assertEquals(CommonStatusEnum.ENABLE.getStatus(), user.getStatus()); | 114 | assertEquals(CommonStatusEnum.ENABLE.getStatus(), user.getStatus()); |
| 115 | + // 断言关联岗位 | ||
| 116 | + List<UserPostDO> userPosts = userPostMapper.selectListByUserId(user.getId()); | ||
| 117 | + assertEquals(1L, userPosts.get(0).getPostId()); | ||
| 118 | + assertEquals(2L, userPosts.get(1).getPostId()); | ||
| 107 | } | 119 | } |
| 108 | 120 | ||
| 109 | @Test | 121 | @Test |
| @@ -124,13 +136,16 @@ public class UserServiceImplTest extends BaseDbUnitTest { | @@ -124,13 +136,16 @@ public class UserServiceImplTest extends BaseDbUnitTest { | ||
| 124 | @Test | 136 | @Test |
| 125 | public void testUpdateUser_success() { | 137 | public void testUpdateUser_success() { |
| 126 | // mock 数据 | 138 | // mock 数据 |
| 127 | - AdminUserDO dbUser = randomAdminUserDO(); | 139 | + AdminUserDO dbUser = randomAdminUserDO(o -> o.setPostIds(asSet(1L, 2L))); |
| 128 | userMapper.insert(dbUser); | 140 | userMapper.insert(dbUser); |
| 141 | + userPostMapper.insert(new UserPostDO().setUserId(dbUser.getId()).setPostId(1L)); | ||
| 142 | + userPostMapper.insert(new UserPostDO().setUserId(dbUser.getId()).setPostId(2L)); | ||
| 129 | // 准备参数 | 143 | // 准备参数 |
| 130 | UserUpdateReqVO reqVO = randomPojo(UserUpdateReqVO.class, o -> { | 144 | UserUpdateReqVO reqVO = randomPojo(UserUpdateReqVO.class, o -> { |
| 131 | o.setId(dbUser.getId()); | 145 | o.setId(dbUser.getId()); |
| 132 | o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); | 146 | o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); |
| 133 | o.setMobile(randomString()); | 147 | o.setMobile(randomString()); |
| 148 | + o.setPostIds(asSet(2L, 3L)); | ||
| 134 | }); | 149 | }); |
| 135 | // mock deptService 的方法 | 150 | // mock deptService 的方法 |
| 136 | DeptDO dept = randomPojo(DeptDO.class, o -> { | 151 | DeptDO dept = randomPojo(DeptDO.class, o -> { |
| @@ -151,6 +166,10 @@ public class UserServiceImplTest extends BaseDbUnitTest { | @@ -151,6 +166,10 @@ public class UserServiceImplTest extends BaseDbUnitTest { | ||
| 151 | // 断言 | 166 | // 断言 |
| 152 | AdminUserDO user = userMapper.selectById(reqVO.getId()); | 167 | AdminUserDO user = userMapper.selectById(reqVO.getId()); |
| 153 | assertPojoEquals(reqVO, user); | 168 | assertPojoEquals(reqVO, user); |
| 169 | + // 断言关联岗位 | ||
| 170 | + List<UserPostDO> userPosts = userPostMapper.selectListByUserId(user.getId()); | ||
| 171 | + assertEquals(2L, userPosts.get(0).getPostId()); | ||
| 172 | + assertEquals(3L, userPosts.get(1).getPostId()); | ||
| 154 | } | 173 | } |
| 155 | 174 | ||
| 156 | @Test | 175 | @Test |
| @@ -552,22 +571,26 @@ public class UserServiceImplTest extends BaseDbUnitTest { | @@ -552,22 +571,26 @@ public class UserServiceImplTest extends BaseDbUnitTest { | ||
| 552 | verify(passwordEncoder, times(1)).matches(eq(oldPassword), eq(user.getPassword())); | 571 | verify(passwordEncoder, times(1)).matches(eq(oldPassword), eq(user.getPassword())); |
| 553 | } | 572 | } |
| 554 | 573 | ||
| 555 | -// @Test //TODO jason 已经移到userCoreService.getUsersByPostIds | ||
| 556 | -// public void testUsersByPostIds() { | ||
| 557 | -// // 准备参数 | ||
| 558 | -// Collection<Long> postIds = asSet(10L, 20L); | ||
| 559 | -// // mock 方法 | ||
| 560 | -// AdminUserDO user1 = randomAdminUserDO(o -> o.setPostIds(asSet(10L, 30L))); | ||
| 561 | -// userMapper.insert(user1); | ||
| 562 | -// AdminUserDO user2 = randomAdminUserDO(o -> o.setPostIds(singleton(100L))); | ||
| 563 | -// userMapper.insert(user2); | ||
| 564 | -// | ||
| 565 | -// // 调用 | ||
| 566 | -// List<AdminUserDO> result = userService.getUsersByPostIds(postIds); | ||
| 567 | -// // 断言 | ||
| 568 | -// assertEquals(1, result.size()); | ||
| 569 | -// assertEquals(user1, result.get(0)); | ||
| 570 | -// } | 574 | + @Test |
| 575 | + public void testUsersByPostIds() { | ||
| 576 | + // 准备参数 | ||
| 577 | + Collection<Long> postIds = asSet(10L, 20L); | ||
| 578 | + // mock user1 数据 | ||
| 579 | + AdminUserDO user1 = randomAdminUserDO(o -> o.setPostIds(asSet(10L, 30L))); | ||
| 580 | + userMapper.insert(user1); | ||
| 581 | + userPostMapper.insert(new UserPostDO().setUserId(user1.getId()).setPostId(10L)); | ||
| 582 | + userPostMapper.insert(new UserPostDO().setUserId(user1.getId()).setPostId(30L)); | ||
| 583 | + // mock user2 数据 | ||
| 584 | + AdminUserDO user2 = randomAdminUserDO(o -> o.setPostIds(singleton(100L))); | ||
| 585 | + userMapper.insert(user2); | ||
| 586 | + userPostMapper.insert(new UserPostDO().setUserId(user2.getId()).setPostId(100L)); | ||
| 587 | + | ||
| 588 | + // 调用 | ||
| 589 | + List<AdminUserDO> result = userService.getUsersByPostIds(postIds); | ||
| 590 | + // 断言 | ||
| 591 | + assertEquals(1, result.size()); | ||
| 592 | + assertEquals(user1, result.get(0)); | ||
| 593 | + } | ||
| 571 | 594 | ||
| 572 | // ========== 随机对象 ========== | 595 | // ========== 随机对象 ========== |
| 573 | 596 |
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/clean.sql
| @@ -10,7 +10,7 @@ DELETE FROM "system_user_session"; | @@ -10,7 +10,7 @@ DELETE FROM "system_user_session"; | ||
| 10 | DELETE FROM "system_post"; | 10 | DELETE FROM "system_post"; |
| 11 | DELETE FROM "system_login_log"; | 11 | DELETE FROM "system_login_log"; |
| 12 | DELETE FROM "system_operate_log"; | 12 | DELETE FROM "system_operate_log"; |
| 13 | -DELETE FROM "system_user"; | 13 | +DELETE FROM "system_users"; |
| 14 | DELETE FROM "system_sms_channel"; | 14 | DELETE FROM "system_sms_channel"; |
| 15 | DELETE FROM "system_sms_template"; | 15 | DELETE FROM "system_sms_template"; |
| 16 | DELETE FROM "system_sms_log"; | 16 | DELETE FROM "system_sms_log"; |
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
| @@ -225,7 +225,7 @@ CREATE TABLE IF NOT EXISTS `system_operate_log` ( | @@ -225,7 +225,7 @@ CREATE TABLE IF NOT EXISTS `system_operate_log` ( | ||
| 225 | PRIMARY KEY (`id`) | 225 | PRIMARY KEY (`id`) |
| 226 | ) COMMENT ='操作日志记录'; | 226 | ) COMMENT ='操作日志记录'; |
| 227 | 227 | ||
| 228 | -CREATE TABLE IF NOT EXISTS "system_user" ( | 228 | +CREATE TABLE IF NOT EXISTS "system_users" ( |
| 229 | "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, | 229 | "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, |
| 230 | "username" varchar(30) not null, | 230 | "username" varchar(30) not null, |
| 231 | "password" varchar(100) not null default '', | 231 | "password" varchar(100) not null default '', |