From d46e62a21a5232c50549856f968db002030782fa Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 6 Jun 2025 14:58:01 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=A4=B4=E5=83=8F=E6=9B=B4?= =?UTF-8?q?=E6=8D=A2=E5=90=8E=E7=A7=BB=E9=99=A4=E6=97=A7=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/CommonController.java | 3 +- .../system/SysProfileController.java | 14 ++++-- .../common/utils/file/FileUploadUtils.java | 44 +++++++++++++++---- .../ruoyi/common/utils/file/FileUtils.java | 14 +++++- .../ruoyi/system/mapper/SysUserMapper.java | 8 ++-- .../ruoyi/system/service/ISysUserService.java | 8 ++-- .../service/impl/SysUserServiceImpl.java | 12 ++--- .../resources/mapper/system/SysUserMapper.xml | 18 ++++---- 8 files changed, 83 insertions(+), 38 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index d51d61d0..e2b44f66 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.config.RuoYiConfig; -import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUploadUtils; @@ -148,7 +147,7 @@ public class CommonController // 本地资源路径 String localPath = RuoYiConfig.getProfile(); // 数据库资源地址 - String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); + String downloadPath = localPath + FileUtils.stripPrefix(resource); // 下载名称 String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index bd1025d1..5b02a70a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -21,6 +21,7 @@ import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.file.MimeTypeUtils; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.service.ISysUserService; @@ -94,7 +95,7 @@ public class SysProfileController extends BaseController String oldPassword = params.get("oldPassword"); String newPassword = params.get("newPassword"); LoginUser loginUser = getLoginUser(); - String userName = loginUser.getUsername(); + Long userId = loginUser.getUserId(); String password = loginUser.getPassword(); if (!SecurityUtils.matchesPassword(oldPassword, password)) { @@ -105,7 +106,7 @@ public class SysProfileController extends BaseController return error("新密码不能与旧密码相同"); } newPassword = SecurityUtils.encryptPassword(newPassword); - if (userService.resetUserPwd(userName, newPassword) > 0) + if (userService.resetUserPwd(userId, newPassword) > 0) { // 更新缓存用户密码&密码最后更新时间 loginUser.getUser().setPwdUpdateDate(DateUtils.getNowDate()); @@ -126,9 +127,14 @@ public class SysProfileController extends BaseController if (!file.isEmpty()) { LoginUser loginUser = getLoginUser(); - String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION); - if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) + String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION, true); + if (userService.updateUserAvatar(loginUser.getUserId(), avatar)) { + String oldAvatar = loginUser.getUser().getAvatar(); + if (StringUtils.isNotEmpty(oldAvatar)) + { + FileUtils.deleteFile(RuoYiConfig.getProfile() + FileUtils.stripPrefix(oldAvatar)); + } AjaxResult ajax = AjaxResult.success(); ajax.put("imgUrl", avatar); // 更新缓存用户头像 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java index 5a0ef640..75bbacdc 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java @@ -13,11 +13,12 @@ import com.ruoyi.common.exception.file.FileSizeLimitExceededException; import com.ruoyi.common.exception.file.InvalidExtensionException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.common.utils.uuid.Seq; /** * 文件上传工具类 - * + * * @author ruoyi */ public class FileUploadUtils @@ -102,15 +103,35 @@ public class FileUploadUtils throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, InvalidExtensionException { - int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); - if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + return upload(baseDir, file, allowedExtension, false); + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param useCustomNaming 系统自定义文件名 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension, boolean useCustomNaming) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNameLength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNameLength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); } assertAllowed(file, allowedExtension); - String fileName = extractFilename(file); + String fileName = useCustomNaming ? uuidFilename(file) : extractFilename(file); String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); file.transferTo(Paths.get(absPath)); @@ -118,12 +139,19 @@ public class FileUploadUtils } /** - * 编码文件名 + * 编码文件名(日期格式目录 + 原文件名 + 序列值 + 后缀) */ public static final String extractFilename(MultipartFile file) { - return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), - FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + } + + /** + * 编编码文件名(日期格式目录 + UUID + 后缀) + */ + public static final String uuidFilename(MultipartFile file) + { + return StringUtils.format("{}/{}.{}", DateUtils.datePath(), IdUtils.fastSimpleUUID(), getExtension(file)); } public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException @@ -216,7 +244,7 @@ public class FileUploadUtils /** * 获取文件名的后缀 - * + * * @param file 表单文件 * @return 后缀名 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java index 5c96f7cb..fc17274f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -11,13 +11,14 @@ import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ArrayUtils; import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.uuid.IdUtils; -import org.apache.commons.io.FilenameUtils; /** * 文件处理工具类 @@ -103,6 +104,17 @@ public class FileUtils return FileUploadUtils.getPathFileName(uploadDir, pathName); } + /** + * 移除路径中的请求前缀片段 + * + * @param filePath 文件路径 + * @return 移除后的文件路径 + */ + public static String stripPrefix(String filePath) + { + return StringUtils.substringAfter(filePath, Constants.RESOURCE_PREFIX); + } + /** * 删除文件 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index c86acea4..aaca4332 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -70,20 +70,20 @@ public interface SysUserMapper /** * 修改用户头像 * - * @param userName 用户名 + * @param userId 用户ID * @param avatar 头像地址 * @return 结果 */ - public int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar); + public int updateUserAvatar(@Param("userId") Long userId, @Param("avatar") String avatar); /** * 重置用户密码 * - * @param userName 用户名 + * @param userId 用户ID * @param password 密码 * @return 结果 */ - public int resetUserPwd(@Param("userName") String userName, @Param("password") String password); + public int resetUserPwd(@Param("userId") Long userId, @Param("password") String password); /** * 通过用户ID删除用户 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index e438b577..d687a5c1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -155,11 +155,11 @@ public interface ISysUserService /** * 修改用户头像 * - * @param userName 用户名 + * @param userId 用户ID * @param avatar 头像地址 * @return 结果 */ - public boolean updateUserAvatar(String userName, String avatar); + public boolean updateUserAvatar(Long userId, String avatar); /** * 重置用户密码 @@ -172,11 +172,11 @@ public interface ISysUserService /** * 重置用户密码 * - * @param userName 用户名 + * @param userId 用户ID * @param password 密码 * @return 结果 */ - public int resetUserPwd(String userName, String password); + public int resetUserPwd(Long userId, String password); /** * 通过用户ID删除用户 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 3f4dba2a..9ac4a75b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -344,14 +344,14 @@ public class SysUserServiceImpl implements ISysUserService /** * 修改用户头像 * - * @param userName 用户名 + * @param userId 用户ID * @param avatar 头像地址 * @return 结果 */ @Override - public boolean updateUserAvatar(String userName, String avatar) + public boolean updateUserAvatar(Long userId, String avatar) { - return userMapper.updateUserAvatar(userName, avatar) > 0; + return userMapper.updateUserAvatar(userId, avatar) > 0; } /** @@ -369,14 +369,14 @@ public class SysUserServiceImpl implements ISysUserService /** * 重置用户密码 * - * @param userName 用户名 + * @param userId 用户ID * @param password 密码 * @return 结果 */ @Override - public int resetUserPwd(String userName, String password) + public int resetUserPwd(Long userId, String password) { - return userMapper.resetUserPwd(userName, password); + return userMapper.resetUserPwd(userId, password); } /** diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 823af75e..02a67ff1 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -19,13 +19,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - - - - - + + + + + + + @@ -202,11 +202,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update sys_user set avatar = #{avatar} where user_name = #{userName} + update sys_user set avatar = #{avatar} where user_id = #{userId} - update sys_user set pwd_update_date = sysdate(), password = #{password} where user_name = #{userName} + update sys_user set pwd_update_date = sysdate(), password = #{password} where user_id = #{userId}