refactor(system): 重构系统模块中的用户和角色相关功能

This commit is contained in:
2026-01-15 11:11:30 +08:00
parent 4d773797cd
commit 7425577126
14 changed files with 155 additions and 122 deletions
@@ -104,7 +104,7 @@
<el-table-column prop="browserInfo" label="浏览器" /> <el-table-column prop="browserInfo" label="浏览器" />
<el-table-column prop="executeTime" label="请求耗时" align="center"> <el-table-column prop="executeTime" label="请求耗时" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.executeTime <= 300">{{ scope.row.time }}ms</el-tag> <el-tag v-if="scope.row.executeTime <= 300">{{ scope.row.time || 0 }}ms</el-tag>
<el-tag v-else-if="scope.row.executeTime <= 1000" type="warning">{{ scope.row.executeTime }}ms</el-tag> <el-tag v-else-if="scope.row.executeTime <= 1000" type="warning">{{ scope.row.executeTime }}ms</el-tag>
<el-tag v-else type="danger">{{ scope.row.executeTime }}ms</el-tag> <el-tag v-else type="danger">{{ scope.row.executeTime }}ms</el-tag>
</template> </template>
@@ -54,13 +54,6 @@ public class SystemDictDetailController {
return ResponseEntity.ok(systemDictDetailService.searchDictDetail(pageArgs.getArgs(), page)); return ResponseEntity.ok(systemDictDetailService.searchDictDetail(pageArgs.getArgs(), page));
} }
@ApiOperation("查询多个字典详情")
@GetMapping(value = "/getDictDetailMaps")
public ResponseEntity<Map<String, List<SystemDictDetailVo>>> getDictDetailMaps(@RequestParam String dictName) {
Map<String, List<SystemDictDetailVo>> dictMap = systemDictDetailService.getDictDetailMap(dictName);
return ResponseEntity.ok(dictMap);
}
@OperationLog @OperationLog
@ApiOperation("新增字典详情") @ApiOperation("新增字典详情")
@PostMapping(value = "/saveDictDetail") @PostMapping(value = "/saveDictDetail")
@@ -17,7 +17,9 @@ package cn.odboy.system.dal.mysql;
import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemRoleTb;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/** /**
* 角色 Mapper * 角色 Mapper
@@ -27,4 +29,5 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface SystemRoleMapper extends BaseMapper<SystemRoleTb> { public interface SystemRoleMapper extends BaseMapper<SystemRoleTb> {
List<Integer> listRoleLevelByRoleIds(@Param("roleIds") List<Long> roleIds);
} }
@@ -18,8 +18,10 @@ package cn.odboy.system.dal.mysql;
import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.dataobject.SystemUserTb;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import java.util.Set; import java.util.Set;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/** /**
* 用户 Mapper * 用户 Mapper
@@ -49,4 +51,6 @@ public interface SystemUserMapper extends BaseMapper<SystemUserTb> {
wrapper.set(SystemUserTb::getPassword, password); wrapper.set(SystemUserTb::getPassword, password);
update(null, wrapper); update(null, wrapper);
} }
List<String> listUsernameByIds(@Param("userIds") Set<Long> userIds);
} }
@@ -18,6 +18,7 @@ package cn.odboy.system.dal.mysql;
import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemRoleTb;
import cn.odboy.system.dal.dataobject.SystemUserRoleTb; import cn.odboy.system.dal.dataobject.SystemUserRoleTb;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import java.util.Set; import java.util.Set;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@@ -26,4 +27,5 @@ import org.apache.ibatis.annotations.Param;
public interface SystemUserRoleMapper extends BaseMapper<SystemUserRoleTb> { public interface SystemUserRoleMapper extends BaseMapper<SystemUserRoleTb> {
Set<SystemRoleTb> listUserRoleByUserId(@Param("userId") Long userId); Set<SystemRoleTb> listUserRoleByUserId(@Param("userId") Long userId);
List<Integer> listUserRoleLevelByUserId(@Param("userId") Long userId);
} }
@@ -32,7 +32,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -140,13 +139,4 @@ public class SystemDictDetailService {
} }
return detailVos; return detailVos;
} }
public Map<String, List<SystemDictDetailVo>> getDictDetailMap(String dictName) {
String[] names = dictName.split("[,, ]");
Map<String, List<SystemDictDetailVo>> dictMap = new HashMap<>(16);
for (String name : names) {
dictMap.put(name, this.listDictDetailByName(name));
}
return dictMap;
}
} }
@@ -150,8 +150,4 @@ public class SystemJobService {
} }
KitExcelExporter.exportSimple(response, "岗位数据", SystemJobExportRowVo.class, rowVos); KitExcelExporter.exportSimple(response, "岗位数据", SystemJobExportRowVo.class, rowVos);
} }
public List<SystemJobTb> listByIds(Set<Long> jobIds) {
return systemJobMapper.selectByIds(jobIds);
}
} }
@@ -218,7 +218,7 @@ public class SystemMenuService {
* @return / * @return /
*/ */
public List<SystemMenuVo> listMenuByUserId(Long currentUserId) { public List<SystemMenuVo> listMenuByUserId(Long currentUserId) {
List<SystemRoleVo> roles = systemUserRoleService.queryRoleVoByUsersId(currentUserId); List<SystemRoleVo> roles = systemUserRoleService.listRoleVoByUsersId(currentUserId);
Set<Long> roleIds = roles.stream().map(SystemRoleVo::getId).collect(Collectors.toSet()); Set<Long> roleIds = roles.stream().map(SystemRoleVo::getId).collect(Collectors.toSet());
return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds));
} }
@@ -222,7 +222,7 @@ public class SystemRoleService {
permissions.add("admin"); permissions.add("admin");
return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
} }
List<SystemRoleVo> roles = systemUserRoleService.queryRoleVoByUsersId(user.getId()); List<SystemRoleVo> roles = systemUserRoleService.listRoleVoByUsersId(user.getId());
permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuVo::getPermission) permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuVo::getPermission)
.filter(StrUtil::isNotBlank).collect(Collectors.toSet()); .filter(StrUtil::isNotBlank).collect(Collectors.toSet());
return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
@@ -268,7 +268,7 @@ public class SystemRoleService {
* @return / * @return /
*/ */
private int checkRoleLevels(Integer level) { private int checkRoleLevels(Integer level) {
List<Integer> levels = systemUserRoleService.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream() List<Integer> levels = systemUserRoleService.listRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream()
.map(SystemRoleVo::getLevel).collect(Collectors.toList()); .map(SystemRoleVo::getLevel).collect(Collectors.toList());
int min = Collections.min(levels); int min = Collections.min(levels);
if (level != null) { if (level != null) {
@@ -99,7 +99,7 @@ public class SystemUserRoleService {
* @param userId 用户ID * @param userId 用户ID
* @return / * @return /
*/ */
public List<SystemRoleVo> queryRoleVoByUsersId(Long userId) { public List<SystemRoleVo> listRoleVoByUsersId(Long userId) {
Set<SystemRoleTb> roles = this.listUserRoleByUserId(userId); Set<SystemRoleTb> roles = this.listUserRoleByUserId(userId);
return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList());
} }
@@ -115,16 +115,12 @@ public class SystemUserRoleService {
// 最小权限 // 最小权限
return Integer.MAX_VALUE; return Integer.MAX_VALUE;
} }
List<Long> roleIds = List<Long> roleIds = roles.stream().map(SystemRoleTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
roles.stream().map(SystemRoleTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
if (CollUtil.isEmpty(roleIds)) { if (CollUtil.isEmpty(roleIds)) {
// 最小权限 // 最小权限
return Integer.MAX_VALUE; return Integer.MAX_VALUE;
} }
List<Integer> roleLevels = systemRoleMapper.selectList( List<Integer> roleLevels = systemRoleMapper.listRoleLevelByRoleIds(roleIds);
new LambdaQueryWrapper<SystemRoleTb>().select(SystemRoleTb::getLevel).isNotNull(SystemRoleTb::getLevel)
.in(SystemRoleTb::getId, roleIds)).stream().map(SystemRoleTb::getLevel).distinct()
.collect(Collectors.toList());
if (CollUtil.isEmpty(roleLevels)) { if (CollUtil.isEmpty(roleLevels)) {
// 最小权限 // 最小权限
return Integer.MAX_VALUE; return Integer.MAX_VALUE;
@@ -138,9 +134,8 @@ public class SystemUserRoleService {
* @param args / * @param args /
*/ */
public void checkLevel(SystemUserVo args) { public void checkLevel(SystemUserVo args) {
Integer currentLevel = Collections.min( List<Integer> roleLevels = systemUserRoleMapper.listUserRoleLevelByUserId(KitSecurityHelper.getCurrentUserId());
this.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream().map(SystemRoleVo::getLevel) Integer currentLevel = Collections.min(roleLevels);
.collect(Collectors.toList()));
Integer optLevel = this.getDeptLevelByRoles(args.getRoles()); Integer optLevel = this.getDeptLevelByRoles(args.getRoles());
if (currentLevel > optLevel) { if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足"); throw new BadRequestException("角色权限不足");
@@ -159,4 +154,8 @@ public class SystemUserRoleService {
public Set<SystemRoleTb> listUserRoleByUserId(Long userId) { public Set<SystemRoleTb> listUserRoleByUserId(Long userId) {
return systemUserRoleMapper.listUserRoleByUserId(userId); return systemUserRoleMapper.listUserRoleByUserId(userId);
} }
public List<Integer> listUserRoleLevelByUserId(Long userId) {
return systemUserRoleMapper.listUserRoleLevelByUserId(userId);
}
} }
@@ -32,7 +32,6 @@ import cn.odboy.system.dal.dataobject.SystemUserTb;
import cn.odboy.system.dal.model.export.SystemUserExportRowVo; import cn.odboy.system.dal.model.export.SystemUserExportRowVo;
import cn.odboy.system.dal.model.request.SystemQueryUserArgs; import cn.odboy.system.dal.model.request.SystemQueryUserArgs;
import cn.odboy.system.dal.model.request.SystemUpdateUserPasswordArgs; import cn.odboy.system.dal.model.request.SystemUpdateUserPasswordArgs;
import cn.odboy.system.dal.model.response.SystemRoleVo;
import cn.odboy.system.dal.model.response.SystemUserVo; import cn.odboy.system.dal.model.response.SystemUserVo;
import cn.odboy.system.dal.mysql.SystemUserMapper; import cn.odboy.system.dal.mysql.SystemUserMapper;
import cn.odboy.system.dal.redis.SystemUserInfoDAO; import cn.odboy.system.dal.redis.SystemUserInfoDAO;
@@ -42,7 +41,6 @@ import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitRsaEncryptUtil; import cn.odboy.util.KitRsaEncryptUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter; import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -91,7 +89,7 @@ public class SystemUserService {
private PasswordEncoder passwordEncoder; private PasswordEncoder passwordEncoder;
/** /**
* 新增用户 * 新增用户 -> TestPassed
* *
* @param args / * @param args /
*/ */
@@ -102,13 +100,13 @@ public class SystemUserService {
// 默认密码 123456 // 默认密码 123456
record.setPassword(passwordEncoder.encode("123456")); record.setPassword(passwordEncoder.encode("123456"));
record.setDeptId(args.getDept().getId()); record.setDeptId(args.getDept().getId());
if (this.getUserByUsername(record.getUsername()) != null) { if (this.existUserWithUsername(record.getUsername())) {
throw new BadRequestException("用户名已存在"); throw new BadRequestException("用户名已存在");
} }
if (this.getUserByEmail(record.getEmail()) != null) { if (this.existUserWithEmail(record.getEmail())) {
throw new BadRequestException("邮箱已存在"); throw new BadRequestException("邮箱已存在");
} }
if (this.getUserByPhone(record.getPhone()) != null) { if (this.existUserWithPhone(record.getPhone())) {
throw new BadRequestException("手机号已存在"); throw new BadRequestException("手机号已存在");
} }
// 保存用户 // 保存用户
@@ -119,8 +117,29 @@ public class SystemUserService {
systemUserRoleService.batchInsertUserRole(args.getRoles(), record.getId()); systemUserRoleService.batchInsertUserRole(args.getRoles(), record.getId());
} }
private boolean existUserWithPhone(String phone) {
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemUserTb::getPhone, phone);
wrapper.eq(SystemUserTb::getEnabled, 1);
return systemUserMapper.exists(wrapper);
}
private boolean existUserWithEmail(String email) {
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemUserTb::getEmail, email);
wrapper.eq(SystemUserTb::getEnabled, 1);
return systemUserMapper.exists(wrapper);
}
private boolean existUserWithUsername(String username) {
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemUserTb::getUsername, username);
wrapper.eq(SystemUserTb::getEnabled, 1);
return systemUserMapper.exists(wrapper);
}
/** /**
* 编辑用户 * 编辑用户 -> TestPassed
* *
* @param args / * @param args /
*/ */
@@ -128,16 +147,13 @@ public class SystemUserService {
public void updateUserById(SystemUserVo args) { public void updateUserById(SystemUserVo args) {
systemUserRoleService.checkLevel(args); systemUserRoleService.checkLevel(args);
SystemUserTb user = systemUserMapper.selectById(args.getId()); SystemUserTb user = systemUserMapper.selectById(args.getId());
SystemUserTb user1 = this.getUserByUsername(args.getUsername()); if (this.existUserWithUsernameNeSelf(args.getUsername(), user.getId())) {
SystemUserTb user2 = this.getUserByEmail(args.getEmail());
SystemUserTb user3 = this.getUserByPhone(args.getPhone());
if (user1 != null && !user.getId().equals(user1.getId())) {
throw new BadRequestException("用户名已存在"); throw new BadRequestException("用户名已存在");
} }
if (user2 != null && !user.getId().equals(user2.getId())) { if (this.existUserWithEmailNeSelf(args.getEmail(), user.getId())) {
throw new BadRequestException("邮箱已存在"); throw new BadRequestException("邮箱已存在");
} }
if (user3 != null && !user.getId().equals(user3.getId())) { if (this.existUserWithPhoneNeSelf(args.getPhone(), user.getId())) {
throw new BadRequestException("手机号已存在"); throw new BadRequestException("手机号已存在");
} }
// 如果用户被禁用, 则清除用户登录信息 // 如果用户被禁用, 则清除用户登录信息
@@ -162,8 +178,29 @@ public class SystemUserService {
systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId());
} }
private boolean existUserWithPhoneNeSelf(String phone, Long currentUserId) {
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemUserTb::getPhone, phone);
wrapper.ne(SystemUserTb::getId, currentUserId);
return systemUserMapper.exists(wrapper);
}
private boolean existUserWithEmailNeSelf(String email, Long currentUserId) {
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemUserTb::getEmail, email);
wrapper.ne(SystemUserTb::getId, currentUserId);
return systemUserMapper.exists(wrapper);
}
private boolean existUserWithUsernameNeSelf(String username, Long currentUserId) {
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemUserTb::getUsername, username);
wrapper.ne(SystemUserTb::getId, currentUserId);
return systemUserMapper.exists(wrapper);
}
/** /**
* 用户自助修改资料 * 用户自助修改资料 -> TestPassed
* *
* @param args / * @param args /
*/ */
@@ -173,19 +210,18 @@ public class SystemUserService {
throw new BadRequestException("不能修改他人资料"); throw new BadRequestException("不能修改他人资料");
} }
SystemUserTb user = systemUserMapper.selectById(args.getId()); SystemUserTb user = systemUserMapper.selectById(args.getId());
SystemUserTb user1 = this.getUserByPhone(args.getPhone()); if (this.existUserWithPhoneNeSelf(args.getPhone(), user.getId())) {
if (user1 != null && !user.getId().equals(user1.getId())) {
throw new BadRequestException("手机号已存在"); throw new BadRequestException("手机号已存在");
} }
user.setNickName(args.getNickName()); user.setNickName(args.getNickName());
user.setPhone(args.getPhone()); user.setPhone(args.getPhone());
user.setGender(args.getGender()); user.setGender(args.getGender());
systemUserMapper.insertOrUpdate(user); systemUserMapper.updateById(user);
systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername());
} }
/** /**
* 删除用户 * 删除用户 -> TestPassed
* *
* @param ids / * @param ids /
*/ */
@@ -194,19 +230,15 @@ public class SystemUserService {
Long currentUserId = KitSecurityHelper.getCurrentUserId(); Long currentUserId = KitSecurityHelper.getCurrentUserId();
// 校验权限 // 校验权限
for (Long id : ids) { for (Long id : ids) {
Integer currentLevel = Collections.min( Integer currentLevel = Collections.min(systemUserRoleService.listUserRoleLevelByUserId(currentUserId));
systemUserRoleService.queryRoleVoByUsersId(currentUserId).stream().map(SystemRoleVo::getLevel) Integer optLevel = Collections.min(systemUserRoleService.listUserRoleLevelByUserId(id));
.collect(Collectors.toList()));
Integer optLevel = Collections.min(
systemUserRoleService.queryRoleVoByUsersId(id).stream().map(SystemRoleVo::getLevel)
.collect(Collectors.toList()));
if (currentLevel > optLevel) { if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足, 不能删除:" + this.getUserById(id).getUsername()); SystemUserTb systemUserTb = systemUserMapper.selectById(id);
throw new BadRequestException("角色权限不足, 不能删除:" + systemUserTb.getUsername());
} }
} }
// 清理缓存 // 清理缓存
List<String> usernameList = systemUserMapper.selectByIds(ids).stream().map(SystemUserTb::getUsername).distinct() List<String> usernameList = systemUserMapper.listUsernameByIds(ids);
.collect(Collectors.toList());
for (String username : usernameList) { for (String username : usernameList) {
systemUserInfoDAO.deleteUserLoginInfoByUserName(username); systemUserInfoDAO.deleteUserLoginInfoByUserName(username);
} }
@@ -219,7 +251,7 @@ public class SystemUserService {
} }
/** /**
* 修改密码 * 修改密码 -> TestPassed
* *
* @param username 用户名 * @param username 用户名
* @param args 参数 * @param args 参数
@@ -241,27 +273,27 @@ public class SystemUserService {
} }
/** /**
* 重置密码 * 重置密码 -> TestPassed
* *
* @param ids 用户id * @param ids 用户id
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void resetUserPasswordByIds(Set<Long> ids) { public void resetUserPasswordByIds(Set<Long> ids) {
String defaultPwd = passwordEncoder.encode("123456"); String defaultPwd = passwordEncoder.encode("123456");
List<SystemUserTb> users = systemUserMapper.selectByIds(ids); List<String> users = systemUserMapper.listUsernameByIds(ids);
// 清除缓存 // 清除缓存
for (SystemUserTb user : users) { for (String username : users) {
// 清除缓存 // 清除缓存
systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); systemUserInfoDAO.deleteUserLoginInfoByUserName(username);
// 强制退出 // 强制退出
systemUserOnlineInfoDAO.kickOutByUsername(user.getUsername()); systemUserOnlineInfoDAO.kickOutByUsername(username);
} }
// 重置密码 // 重置密码
systemUserMapper.updateUserPasswordByUserIds(defaultPwd, ids); systemUserMapper.updateUserPasswordByUserIds(defaultPwd, ids);
} }
/** /**
* 修改头像 * 修改头像 -> TestPassed
* *
* @param multipartFile 文件 * @param multipartFile 文件
* @return / * @return /
@@ -271,7 +303,7 @@ public class SystemUserService {
SystemUserTb user = this.getUserByUsername(KitSecurityHelper.getCurrentUsername()); SystemUserTb user = this.getUserByUsername(KitSecurityHelper.getCurrentUsername());
String username = user.getUsername(); String username = user.getUsername();
if (StrUtil.isBlank(username)) { if (StrUtil.isBlank(username)) {
throw new BadRequestException("异常用户数据, 请联系管理员处理"); throw new BadRequestException("异常用户数据, 请联系管理员处理!");
} }
// 文件大小验证 // 文件大小验证
KitFileUtil.checkSize(fileUploadPathHelper.getAvatarMaxSize(), multipartFile.getSize()); KitFileUtil.checkSize(fileUploadPathHelper.getAvatarMaxSize(), multipartFile.getSize());
@@ -279,13 +311,13 @@ public class SystemUserService {
String image = "gif jpg png jpeg"; String image = "gif jpg png jpeg";
String fileType = KitFileUtil.getSuffix(multipartFile.getOriginalFilename()); String fileType = KitFileUtil.getSuffix(multipartFile.getOriginalFilename());
if (fileType != null && !image.contains(fileType)) { if (fileType != null && !image.contains(fileType)) {
throw new BadRequestException("文件格式错误!, 仅支持 " + image + " 格式"); throw new BadRequestException("文件格式错误, 仅支持 " + image + " 格式!");
} }
String oldPath = user.getAvatarPath(); String oldPath = user.getAvatarPath();
File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath()); File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath());
user.setAvatarPath(Objects.requireNonNull(file).getPath()); user.setAvatarPath(Objects.requireNonNull(file).getPath());
user.setAvatarName(file.getName()); user.setAvatarName(file.getName());
systemUserMapper.insertOrUpdate(user); systemUserMapper.updateById(user);
if (StrUtil.isNotBlank(oldPath)) { if (StrUtil.isNotBlank(oldPath)) {
KitFileUtil.del(oldPath); KitFileUtil.del(oldPath);
} }
@@ -296,7 +328,7 @@ public class SystemUserService {
} }
/** /**
* 修改邮箱 * 修改邮箱 -> TestPassed
* *
* @param username 用户名 * @param username 用户名
* @param args 参数 * @param args 参数
@@ -304,8 +336,7 @@ public class SystemUserService {
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateUserEmailByUsername(String username, SystemUserTb args, String code) throws Exception { public void updateUserEmailByUsername(String username, SystemUserTb args, String code) throws Exception {
String password = String password = KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword());
KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword());
SystemUserTb user = this.getUserByUsername(username); SystemUserTb user = this.getUserByUsername(username);
if (!passwordEncoder.matches(password, user.getPassword())) { if (!passwordEncoder.matches(password, user.getPassword())) {
throw new BadRequestException("密码错误"); throw new BadRequestException("密码错误");
@@ -316,7 +347,7 @@ public class SystemUserService {
} }
/** /**
* 查询全部 * 查询全部 -> TestPassed
* *
* @param args 条件 * @param args 条件
* @param page 分页参数 * @param page 分页参数
@@ -328,8 +359,7 @@ public class SystemUserService {
IPage<SystemUserTb> userPage = systemUserMapper.selectPage(page, wrapper); IPage<SystemUserTb> userPage = systemUserMapper.selectPage(page, wrapper);
List<SystemUserTb> users = userPage.getRecords(); List<SystemUserTb> users = userPage.getRecords();
// 转换为SystemUserVo并关联查询 // 转换为SystemUserVo并关联查询
List<SystemUserVo> userVos = List<SystemUserVo> userVos = users.stream().map(m -> this.convertToUserVo(m, false)).collect(Collectors.toList());
users.stream().map(m -> this.convertToUserVo(m, false)).collect(Collectors.toList());
return KitPageUtil.toPage(userVos, userPage.getTotal()); return KitPageUtil.toPage(userVos, userPage.getTotal());
} }
@@ -338,16 +368,6 @@ public class SystemUserService {
return systemUserMapper.selectCount(wrapper); return systemUserMapper.selectCount(wrapper);
} }
/**
* 根据ID查询
*
* @param id ID
* @return /
*/
public SystemUserTb getUserById(long id) {
return systemUserMapper.selectById(id);
}
public List<KitSelectOptionVo> queryUserMetadataOptions(KitPageArgs<SystemQueryUserArgs> pageArgs) { public List<KitSelectOptionVo> queryUserMetadataOptions(KitPageArgs<SystemQueryUserArgs> pageArgs) {
SystemQueryUserArgs args = pageArgs.getArgs(); SystemQueryUserArgs args = pageArgs.getArgs();
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
@@ -372,36 +392,37 @@ public class SystemUserService {
} }
/** /**
* 构建用户查询条件 * 构建用户查询条件 -> TestPassed
* *
* @param args 查询条件 * @param args 查询条件
* @return / * @return /
*/ */
private LambdaQueryWrapper<SystemUserTb> buildUserQueryWrapper(SystemQueryUserArgs args) { private LambdaQueryWrapper<SystemUserTb> buildUserQueryWrapper(SystemQueryUserArgs args) {
KitValidUtil.notNull(args);
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
if (args.getId() != null) { if (args != null) {
wrapper.eq(SystemUserTb::getId, args.getId()); if (args.getId() != null) {
} wrapper.eq(SystemUserTb::getId, args.getId());
if (args.getEnabled() != null) { }
wrapper.eq(SystemUserTb::getEnabled, args.getEnabled()); if (args.getEnabled() != null) {
} wrapper.eq(SystemUserTb::getEnabled, args.getEnabled());
if (CollUtil.isNotEmpty(args.getDeptIds())) { }
wrapper.in(SystemUserTb::getDeptId, args.getDeptIds()); if (CollUtil.isNotEmpty(args.getDeptIds())) {
} wrapper.in(SystemUserTb::getDeptId, args.getDeptIds());
if (StrUtil.isNotBlank(args.getBlurry())) { }
wrapper.and(w -> w.like(SystemUserTb::getUsername, args.getBlurry()).or() if (StrUtil.isNotBlank(args.getBlurry())) {
.like(SystemUserTb::getNickName, args.getBlurry()).or().like(SystemUserTb::getEmail, args.getBlurry())); wrapper.and(w -> w.like(SystemUserTb::getUsername, args.getBlurry()).or()
} .like(SystemUserTb::getNickName, args.getBlurry()).or().like(SystemUserTb::getEmail, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { }
wrapper.between(SystemUserTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemUserTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
}
} }
wrapper.orderByDesc(SystemUserTb::getCreateTime); wrapper.orderByDesc(SystemUserTb::getCreateTime);
return wrapper; return wrapper;
} }
/** /**
* 转换为SystemUserVo并关联查询部门、角色、岗位信息 * 转换为SystemUserVo并关联查询部门、角色、岗位信息 -> TestPassed
* *
* @param user 用户基本信息 * @param user 用户基本信息
* @param includePassword 是否包含用户密码 * @param includePassword 是否包含用户密码
@@ -442,28 +463,16 @@ public class SystemUserService {
return this.convertToUserVo(this.getUserByUsername(username), false); return this.convertToUserVo(this.getUserByUsername(username), false);
} }
public SystemUserTb getUserByEmail(String email) { /**
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>(); * 聚合查询 -> TestPassed
wrapper.eq(SystemUserTb::getEmail, email); */
wrapper.eq(SystemUserTb::getEnabled, 1);
return systemUserMapper.selectOne(wrapper);
}
public SystemUserTb getUserByPhone(String phone) {
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemUserTb::getPhone, phone);
wrapper.eq(SystemUserTb::getEnabled, 1);
return systemUserMapper.selectOne(wrapper);
}
public KitPageResult<SystemUserVo> aggregationSearchUserByArgs(Page<SystemUserTb> page, SystemQueryUserArgs args, public KitPageResult<SystemUserVo> aggregationSearchUserByArgs(Page<SystemUserTb> page, SystemQueryUserArgs args,
String currentUsername) { String currentUsername) {
if (!ObjectUtils.isEmpty(args.getDeptId())) { if (!ObjectUtils.isEmpty(args.getDeptId())) {
args.getDeptIds().add(args.getDeptId()); args.getDeptIds().add(args.getDeptId());
// 先查找是否存在子节点 // 先查找是否存在子节点
List<SystemDeptTb> data = systemDeptService.listDeptByPid(args.getDeptId()); List<SystemDeptTb> data = systemDeptService.listDeptByPid(args.getDeptId());
Map<Long, List<SystemDeptTb>> deptPidMap = Map<Long, List<SystemDeptTb>> deptPidMap = systemDeptService.listPidNonNull().stream().collect(Collectors.groupingBy(SystemDeptTb::getPid));
systemDeptService.listPidNonNull().stream().collect(Collectors.groupingBy(SystemDeptTb::getPid));
// 然后把子节点的ID都加入到集合中 // 然后把子节点的ID都加入到集合中
args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data, deptPidMap)); args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data, deptPidMap));
} }
@@ -484,6 +493,9 @@ public class SystemUserService {
return KitPageUtil.emptyData(); return KitPageUtil.emptyData();
} }
/**
* 导出 -> TestPassed
*/
public void exportUserXlsx(HttpServletResponse response, SystemQueryUserArgs args) { public void exportUserXlsx(HttpServletResponse response, SystemQueryUserArgs args) {
long totalCount = this.countUserByArgs(args); long totalCount = this.countUserByArgs(args);
KitExcelExporter.exportByPage(response, "用户数据", SystemUserExportRowVo.class, totalCount, KitExcelExporter.exportByPage(response, "用户数据", SystemUserExportRowVo.class, totalCount,
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.odboy.system.dal.mysql.SystemRoleMapper">
<select id="listRoleLevelByRoleIds" resultType="java.lang.Integer">
SELECT DISTINCT t1.`level`
FROM system_role t1
WHERE t1.`level` IS NOT NULL
AND t1.role_id IN
<foreach collection="roleIds" separator="," open="(" close=")" item="roleId">
#{roleId}
</foreach>
</select>
</mapper>
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.odboy.system.dal.mysql.SystemUserMapper">
<select id="listUsernameByIds" resultType="java.lang.String">
SELECT DISTINCT
t1.username
FROM
system_user t1
WHERE
t1.user_id IN
<foreach collection="userIds" item="userId" open="(" close=")" separator=",">
#{userId}
</foreach>
</select>
</mapper>
@@ -7,4 +7,10 @@
LEFT JOIN system_users_roles t2 ON t1.role_id = t2.role_id LEFT JOIN system_users_roles t2 ON t1.role_id = t2.role_id
WHERE t2.user_id = #{userId} WHERE t2.user_id = #{userId}
</select> </select>
<select id="listUserRoleLevelByUserId" resultType="java.lang.Integer">
SELECT DISTINCT t1.`level`
FROM system_role t1
LEFT JOIN system_users_roles t2 ON t1.role_id = t2.role_id
WHERE t2.user_id = #{userId}
</select>
</mapper> </mapper>