fix: 用户角色上传头像缺陷修复

This commit is contained in:
bunny 2024-10-28 16:32:56 +08:00
parent cdccf0e4c5
commit 775deeb662
8 changed files with 149 additions and 74 deletions

View File

@ -52,7 +52,7 @@ public class GlobalExceptionHandler {
String primaryKeyError = "Duplicate entry '(.*?)' for key .*"; String primaryKeyError = "Duplicate entry '(.*?)' for key .*";
Matcher primaryKeyErrorMatcher = Pattern.compile(primaryKeyError).matcher(message); Matcher primaryKeyErrorMatcher = Pattern.compile(primaryKeyError).matcher(message);
if (primaryKeyErrorMatcher.find()) { if (primaryKeyErrorMatcher.find()) {
return Result.error(null, 500, "" + primaryKeyErrorMatcher.group(1) + "已存在"); return Result.error(null, 500, "[" + primaryKeyErrorMatcher.group(1) + "]已存在");
} }
log.error("GlobalExceptionHandler===>运行时异常信息:{}", message); log.error("GlobalExceptionHandler===>运行时异常信息:{}", message);

View File

@ -54,8 +54,7 @@ public enum ResultCodeEnum {
AUTHENTICATION_EXPIRED(208, "身份验证过期"), AUTHENTICATION_EXPIRED(208, "身份验证过期"),
SESSION_EXPIRATION(208, "会话过期"), SESSION_EXPIRATION(208, "会话过期"),
// 封禁 209 // 209
FAIL_NO_ACCESS_DENIED_USER_LOCKED(209, "该账户已封禁"),
THE_SAME_USER_HAS_LOGGED_IN(209, "相同用户已登录"), THE_SAME_USER_HAS_LOGGED_IN(209, "相同用户已登录"),
// 提示错误 // 提示错误
@ -72,6 +71,7 @@ public enum ResultCodeEnum {
FAIL_NO_ACCESS_DENIED_USER_OFFLINE(403, "用户强制下线"), FAIL_NO_ACCESS_DENIED_USER_OFFLINE(403, "用户强制下线"),
LOGGED_IN_FROM_ANOTHER_DEVICE(403, "没有权限访问"), LOGGED_IN_FROM_ANOTHER_DEVICE(403, "没有权限访问"),
TOKEN_PARSING_FAILED(403, "token解析失败"), TOKEN_PARSING_FAILED(403, "token解析失败"),
FAIL_NO_ACCESS_DENIED_USER_LOCKED(403, "该账户已封禁"),
// 系统错误 500 // 系统错误 500
UNKNOWN_EXCEPTION(500, "服务异常"), UNKNOWN_EXCEPTION(500, "服务异常"),

View File

@ -121,7 +121,7 @@ public class UserController {
} }
@Operation(summary = "刷新token", description = "刷新用户token") @Operation(summary = "刷新token", description = "刷新用户token")
@PostMapping("noAuth/refreshToken") @PostMapping("noManage/refreshToken")
public Result<RefreshTokenVo> refreshToken(@Valid @RequestBody RefreshTokenDto dto) { public Result<RefreshTokenVo> refreshToken(@Valid @RequestBody RefreshTokenDto dto) {
RefreshTokenVo vo = userService.refreshToken(dto); RefreshTokenVo vo = userService.refreshToken(dto);
return Result.success(vo); return Result.success(vo);

View File

@ -0,0 +1,44 @@
package cn.bunny.services.factory;
import cn.bunny.dao.entity.system.AdminUser;
import cn.bunny.dao.pojo.constant.RedisUserConstant;
import cn.bunny.services.mapper.UserMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class RoleFactory {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private UserMapper userMapper;
@Autowired
private UserFactory userFactory;
/**
* 批量更新Redis中用户信息
*
* @param userIds 用户Id列表
*/
public void updateUserRedisInfo(List<Long> userIds) {
// 根据Id查找所有用户
List<AdminUser> adminUsers = userMapper.selectList(Wrappers.<AdminUser>lambdaQuery().in(AdminUser::getId, userIds));
// 用户为空时不更新Redis的key
if (adminUsers.isEmpty()) return;
// 更新Redis中用户信息
adminUsers.stream().filter(user -> {
String adminLoginInfoPrefix = RedisUserConstant.getAdminLoginInfoPrefix(user.getUsername());
Object object = redisTemplate.opsForValue().get(adminLoginInfoPrefix);
return object != null;
}).forEach(user -> userFactory.buildUserVo(user, RedisUserConstant.REDIS_EXPIRATION_TIME));
}
}

View File

@ -117,9 +117,7 @@ public class UserFactory {
Long userId = user.getId(); Long userId = user.getId();
// 判断用户是否有头像如果没有头像设置默认头像并且用户头像不能和默认头像相同 // 判断用户是否有头像如果没有头像设置默认头像并且用户头像不能和默认头像相同
String avatar = user.getAvatar(); String avatar = checkGetUserAvatar(user.getAvatar());
String userAvatar = UserConstant.USER_AVATAR;
avatar = StringUtils.hasText(avatar) && !avatar.equals(userAvatar) ? minioUtil.getObjectNameFullPath(avatar) : userAvatar;
// 查找用户橘色 // 查找用户橘色
List<String> roles = new ArrayList<>(roleMapper.selectListByUserId(userId).stream().map(Role::getRoleCode).toList()); List<String> roles = new ArrayList<>(roleMapper.selectListByUserId(userId).stream().map(Role::getRoleCode).toList());
@ -162,7 +160,7 @@ public class UserFactory {
* @param avatar 头像字符串 * @param avatar 头像字符串
* @return 整理好的头像内容 * @return 整理好的头像内容
*/ */
public String checkUserAvatar(String avatar) { public String checkPostUserAvatar(String avatar) {
// 如果用户没有头像或者用户头像和默认头像相同返回默认头像 // 如果用户没有头像或者用户头像和默认头像相同返回默认头像
String userAvatar = UserConstant.USER_AVATAR; String userAvatar = UserConstant.USER_AVATAR;
if (!StringUtils.hasText(avatar) || avatar.equals(userAvatar)) return userAvatar; if (!StringUtils.hasText(avatar) || avatar.equals(userAvatar)) return userAvatar;
@ -179,6 +177,30 @@ public class UserFactory {
return "/" + matcher.group(1); return "/" + matcher.group(1);
} }
/**
* 检查用户头像是否合规
*
* @param avatar 头像字符串
* @return 整理好的头像内容
*/
public String checkGetUserAvatar(String avatar) {
// 如果用户没有头像或者用户头像和默认头像相同返回默认头像
String userAvatar = UserConstant.USER_AVATAR;
if (!StringUtils.hasText(avatar) || avatar.equals(userAvatar)) return userAvatar;
// 替换前端发送的host前缀将其删除只保留路径名称
String regex = "^https?://.*?/(.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(avatar);
// 如果没有匹配
if (matcher.matches()) return avatar;
// 匹配后返回内容
return minioUtil.getObjectNameFullPath(avatar);
}
/** /**
* * 设置用户登录日志内容 * * 设置用户登录日志内容
*/ */

View File

@ -1,10 +1,17 @@
package cn.bunny.services.service.impl; package cn.bunny.services.service.impl;
import cn.bunny.dao.dto.system.rolePower.AssignPowersToRoleDto; import cn.bunny.dao.dto.system.rolePower.AssignPowersToRoleDto;
import cn.bunny.dao.entity.system.AdminUser;
import cn.bunny.dao.entity.system.RolePower; import cn.bunny.dao.entity.system.RolePower;
import cn.bunny.dao.entity.system.UserRole;
import cn.bunny.services.factory.RoleFactory;
import cn.bunny.services.mapper.RolePowerMapper; import cn.bunny.services.mapper.RolePowerMapper;
import cn.bunny.services.mapper.UserMapper;
import cn.bunny.services.mapper.UserRoleMapper;
import cn.bunny.services.service.RolePowerService; import cn.bunny.services.service.RolePowerService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -22,6 +29,14 @@ import java.util.List;
@Transactional @Transactional
public class RolePowerServiceImpl extends ServiceImpl<RolePowerMapper, RolePower> implements RolePowerService { public class RolePowerServiceImpl extends ServiceImpl<RolePowerMapper, RolePower> implements RolePowerService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleFactory roleFactory;
@Autowired
private UserRoleMapper userRoleMapper;
/** /**
* * 根据角色id获取权限内容 * * 根据角色id获取权限内容
* *
@ -54,7 +69,20 @@ public class RolePowerServiceImpl extends ServiceImpl<RolePowerMapper, RolePower
rolePower.setPowerId(powerId); rolePower.setPowerId(powerId);
return rolePower; return rolePower;
}).toList(); }).toList();
saveBatch(rolePowerList); saveBatch(rolePowerList);
// 找到所有和当前更新角色相同的用户
List<Long> roleIds = userRoleMapper.selectList(Wrappers.<UserRole>lambdaQuery().eq(UserRole::getRoleId, roleId))
.stream().map(UserRole::getUserId).toList();
// 根据Id查找所有用户
List<AdminUser> adminUsers = userMapper.selectList(Wrappers.<AdminUser>lambdaQuery().in(AdminUser::getId, roleIds));
// 用户为空时不更新Redis的key
if (adminUsers.isEmpty()) return;
// 更新Redis中用户信息
List<Long> userIds = adminUsers.stream().map(AdminUser::getId).toList();
roleFactory.updateUserRedisInfo(userIds);
} }
} }

View File

@ -4,15 +4,16 @@ import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.dao.dto.system.rolePower.role.RoleAddDto; import cn.bunny.dao.dto.system.rolePower.role.RoleAddDto;
import cn.bunny.dao.dto.system.rolePower.role.RoleDto; import cn.bunny.dao.dto.system.rolePower.role.RoleDto;
import cn.bunny.dao.dto.system.rolePower.role.RoleUpdateDto; import cn.bunny.dao.dto.system.rolePower.role.RoleUpdateDto;
import cn.bunny.dao.entity.system.AdminUser;
import cn.bunny.dao.entity.system.Role; import cn.bunny.dao.entity.system.Role;
import cn.bunny.dao.entity.system.UserRole; import cn.bunny.dao.entity.system.UserRole;
import cn.bunny.dao.pojo.constant.RedisUserConstant;
import cn.bunny.dao.pojo.result.PageResult; import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.system.rolePower.RoleVo; import cn.bunny.dao.vo.system.rolePower.RoleVo;
import cn.bunny.services.factory.UserFactory; import cn.bunny.services.factory.RoleFactory;
import cn.bunny.services.mapper.*; import cn.bunny.services.mapper.RoleMapper;
import cn.bunny.services.mapper.RolePowerMapper;
import cn.bunny.services.mapper.RouterRoleMapper;
import cn.bunny.services.mapper.UserRoleMapper;
import cn.bunny.services.service.RoleService; import cn.bunny.services.service.RoleService;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -23,7 +24,6 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@ -49,14 +49,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
private RouterRoleMapper routerRoleMapper; private RouterRoleMapper routerRoleMapper;
@Autowired @Autowired
private UserMapper userMapper; private RoleFactory roleFactory;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private UserFactory userFactory;
/** /**
* * 角色 服务实现类 * * 角色 服务实现类
@ -129,25 +122,13 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
BeanUtils.copyProperties(dto, role); BeanUtils.copyProperties(dto, role);
updateById(role); updateById(role);
// 找到所有和当前更新角色相同的用户 // 找到所有和当前更新角色相同的用户并更新Redis中用户信息
List<Long> userIds = userRoleMapper.selectList(Wrappers.<UserRole>lambdaQuery().eq(UserRole::getRoleId, dto.getId())) List<Long> userIds = userRoleMapper.selectList(Wrappers.<UserRole>lambdaQuery().eq(UserRole::getRoleId, dto.getId()))
.stream().map(UserRole::getUserId).toList(); .stream().map(UserRole::getUserId).toList();
roleFactory.updateUserRedisInfo(userIds);
// 根据Id查找所有用户
List<AdminUser> adminUsers = userMapper.selectList(Wrappers.<AdminUser>lambdaQuery().in(AdminUser::getId, userIds));
// 用户为空时不更新Redis的key
if (adminUsers.isEmpty()) return;
// 更新Redis中用户信息
adminUsers.stream().filter(user -> {
String adminLoginInfoPrefix = RedisUserConstant.getAdminLoginInfoPrefix(user.getUsername());
Object object = redisTemplate.opsForValue().get(adminLoginInfoPrefix);
return object != null;
}).forEach(user -> userFactory.buildUserVo(user, RedisUserConstant.REDIS_EXPIRATION_TIME));
} }
/** /**
* 删除|批量删除角色 * 删除|批量删除角色
* *

View File

@ -4,7 +4,6 @@ import cn.bunny.common.service.context.BaseContext;
import cn.bunny.common.service.exception.BunnyException; import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.common.service.utils.JwtHelper; import cn.bunny.common.service.utils.JwtHelper;
import cn.bunny.common.service.utils.ip.IpUtil; import cn.bunny.common.service.utils.ip.IpUtil;
import cn.bunny.common.service.utils.minio.MinioUtil;
import cn.bunny.dao.dto.system.files.FileUploadDto; import cn.bunny.dao.dto.system.files.FileUploadDto;
import cn.bunny.dao.dto.system.user.*; import cn.bunny.dao.dto.system.user.*;
import cn.bunny.dao.entity.log.UserLoginLog; import cn.bunny.dao.entity.log.UserLoginLog;
@ -72,9 +71,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
@Autowired @Autowired
private RedisTemplate<String, Object> redisTemplate; private RedisTemplate<String, Object> redisTemplate;
@Autowired
private MinioUtil minioUtil;
@Autowired @Autowired
private FilesService filesService; private FilesService filesService;
@ -190,7 +186,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
UserVo userVo = new UserVo(); UserVo userVo = new UserVo();
BeanUtils.copyProperties(user, userVo); BeanUtils.copyProperties(user, userVo);
if (StringUtils.hasText(avatar)) userVo.setAvatar(minioUtil.getObjectNameFullPath(avatar)); userVo.setAvatar(userFactory.checkGetUserAvatar(avatar));
return userVo; return userVo;
} }
@ -215,14 +211,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
if (adminUser.getPassword().equals(md5Password)) if (adminUser.getPassword().equals(md5Password))
throw new BunnyException(ResultCodeEnum.UPDATE_NEW_PASSWORD_SAME_AS_OLD_PASSWORD); throw new BunnyException(ResultCodeEnum.UPDATE_NEW_PASSWORD_SAME_AS_OLD_PASSWORD);
// 删除Redis中登录用户信息
redisTemplate.delete(RedisUserConstant.getAdminLoginInfoPrefix(adminUser.getUsername()));
// 更新用户密码 // 更新用户密码
adminUser = new AdminUser(); adminUser = new AdminUser();
adminUser.setPassword(md5Password); adminUser.setPassword(md5Password);
adminUser.setId(userId); adminUser.setId(userId);
updateById(adminUser); updateById(adminUser);
// 删除Redis中登录用户信息
redisTemplate.delete(RedisUserConstant.getAdminLoginInfoPrefix(adminUser.getUsername()));
} }
/** /**
@ -237,18 +233,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
Long userId = dto.getUserId(); Long userId = dto.getUserId();
// 判断是否存在这个用户 // 判断是否存在这个用户
AdminUser adminUser = getOne(Wrappers.<AdminUser>lambdaQuery().eq(AdminUser::getId, userId)); AdminUser user = getOne(Wrappers.<AdminUser>lambdaQuery().eq(AdminUser::getId, userId));
if (adminUser == null) throw new BunnyException(ResultCodeEnum.USER_IS_EMPTY); if (user == null) throw new BunnyException(ResultCodeEnum.USER_IS_EMPTY);
// 上传头像 // 上传头像
FileUploadDto uploadDto = FileUploadDto.builder().file(avatar).type(MinioConstant.avatar).build(); FileUploadDto uploadDto = FileUploadDto.builder().file(avatar).type(MinioConstant.avatar).build();
FileInfoVo fileInfoVo = filesService.upload(uploadDto); FileInfoVo fileInfoVo = filesService.upload(uploadDto);
// 更新用户 // 更新用户
adminUser = new AdminUser(); AdminUser adminUser = new AdminUser();
adminUser.setId(userId); adminUser.setId(userId);
adminUser.setAvatar(fileInfoVo.getFilepath()); adminUser.setAvatar(fileInfoVo.getFilepath());
updateById(adminUser); updateById(adminUser);
// 重新生成用户信息到Redis中
user.setAvatar(adminUser.getAvatar());
userFactory.buildUserVo(user, RedisUserConstant.REDIS_EXPIRATION_TIME);
} }
/** /**
@ -302,11 +302,19 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
*/ */
@Override @Override
public void updateUserStatusByAdmin(AdminUserUpdateUserStatusDto dto) { public void updateUserStatusByAdmin(AdminUserUpdateUserStatusDto dto) {
AdminUser adminUser = new AdminUser(); Long userId = dto.getUserId();
adminUser.setId(dto.getUserId());
adminUser.setStatus(dto.getStatus());
// 更新用户Id
AdminUser adminUser = new AdminUser();
adminUser.setId(userId);
adminUser.setStatus(dto.getStatus());
updateById(adminUser); updateById(adminUser);
// 如果是锁定用户删除Redis中内容
if (dto.getStatus()) {
adminUser = getOne(Wrappers.<AdminUser>lambdaQuery().eq(AdminUser::getId, userId));
redisTemplate.delete(RedisUserConstant.getAdminLoginInfoPrefix(adminUser.getUsername()));
}
} }
/** /**
@ -333,7 +341,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
if (user == null) throw new BunnyException(ResultCodeEnum.USER_IS_EMPTY); if (user == null) throw new BunnyException(ResultCodeEnum.USER_IS_EMPTY);
// 检查用户头像 // 检查用户头像
dto.setAvatar(userFactory.checkUserAvatar(dto.getAvatar())); dto.setAvatar(userFactory.checkPostUserAvatar(dto.getAvatar()));
// 更新用户 // 更新用户
AdminUser adminUser = new AdminUser(); AdminUser adminUser = new AdminUser();
@ -367,14 +375,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
// 判断数据库中密码是否和更新用户密码相同 // 判断数据库中密码是否和更新用户密码相同
if (dbPassword.equals(password)) throw new BunnyException(ResultCodeEnum.NEW_PASSWORD_SAME_OLD_PASSWORD); if (dbPassword.equals(password)) throw new BunnyException(ResultCodeEnum.NEW_PASSWORD_SAME_OLD_PASSWORD);
// 删除Redis中登录用户信息
redisTemplate.delete(RedisUserConstant.getAdminLoginInfoPrefix(adminUser.getUsername()));
// 更新用户密码 // 更新用户密码
adminUser = new AdminUser(); adminUser = new AdminUser();
adminUser.setId(userId); adminUser.setId(userId);
adminUser.setPassword(password); adminUser.setPassword(password);
updateById(adminUser); updateById(adminUser);
// 删除Redis中登录用户信息
redisTemplate.delete(RedisUserConstant.getAdminLoginInfoPrefix(adminUser.getUsername()));
} }
/** /**
@ -392,10 +400,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
List<AdminUserVo> voList = page.getRecords().stream() List<AdminUserVo> voList = page.getRecords().stream()
.map(adminUser -> { .map(adminUser -> {
// 如果存在用户头像则设置用户头像 // 如果存在用户头像则设置用户头像
String avatar = adminUser.getAvatar(); String avatar = userFactory.checkGetUserAvatar(adminUser.getAvatar());
if (StringUtils.hasText(avatar)) {
avatar = minioUtil.getObjectNameFullPath(avatar);
}
AdminUserVo adminUserVo = new AdminUserVo(); AdminUserVo adminUserVo = new AdminUserVo();
BeanUtils.copyProperties(adminUser, adminUserVo); BeanUtils.copyProperties(adminUser, adminUserVo);
@ -444,33 +449,28 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
/** /**
* 更新用户信息 * 更新用户信息
* 如果更新了用户名需要用户重新登录因为Redis中的key已经被删除
* *
* @param dto 用户信息更新 * @param dto 用户信息更新
*/ */
@Override @Override
public void updateAdminUser(AdminUserUpdateDto dto) { public void updateAdminUser(AdminUserUpdateDto dto) {
List<AdminUser> userList = list(Wrappers.<AdminUser>lambdaQuery()
.ne(AdminUser::getId, dto.getId())
.and(queryWrapper -> queryWrapper.eq(AdminUser::getEmail, dto.getEmail())
.or()
.eq(AdminUser::getUsername, dto.getUsername()))
);
// 确保邮箱和用户名不能重复
if (!userList.isEmpty()) {
throw new BunnyException(ResultCodeEnum.ALREADY_USER_EXCEPTION);
}
// 部门Id // 部门Id
Long deptId = dto.getDeptId(); Long deptId = dto.getDeptId();
Long userId = dto.getId(); Long userId = dto.getId();
// 判断更新内容是否存在 // 判断更新内容是否存在
List<AdminUser> adminUserList = list(Wrappers.<AdminUser>lambdaQuery().eq(AdminUser::getId, userId)); AdminUser adminUser = getOne(Wrappers.<AdminUser>lambdaQuery().eq(AdminUser::getId, userId));
if (adminUserList.isEmpty()) throw new BunnyException(ResultCodeEnum.DATA_NOT_EXIST); if (adminUser == null) throw new BunnyException(ResultCodeEnum.DATA_NOT_EXIST);
// 如果更新了用户名删除之前的用户数据
if (!dto.getUsername().equals(adminUser.getUsername())) {
String adminLoginInfoPrefix = RedisUserConstant.getAdminLoginInfoPrefix(adminUser.getUsername());
redisTemplate.delete(adminLoginInfoPrefix);
}
// 更新用户 // 更新用户
AdminUser adminUser = new AdminUser(); adminUser = new AdminUser();
BeanUtils.copyProperties(dto, adminUser); BeanUtils.copyProperties(dto, adminUser);
updateById(adminUser); updateById(adminUser);