From f73a3e539a48547fb74493bac94bb4f40da5243b Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Sat, 5 Oct 2024 10:32:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BF=AE=E6=94=B9):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=8A=E4=BC=A0=E5=A4=B4=E5=83=8F=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/service/utils/minio/MinioUtil.java | 10 +-- .../dto/system/user/AdminUserUpdateDto.java | 3 - .../system/user/UserUpdateWithAvatarDto.java | 8 +-- ...{MinioFIlePath.java => MinioFilePath.java} | 2 +- .../bunny/services/factory/FileFactory.java | 72 +++++++++++++++++++ .../service/impl/FilesServiceImpl.java | 49 +------------ .../service/impl/UserServiceImpl.java | 18 ++++- 7 files changed, 100 insertions(+), 62 deletions(-) rename dao/src/main/java/cn/bunny/dao/pojo/common/{MinioFIlePath.java => MinioFilePath.java} (92%) create mode 100644 service/src/main/java/cn/bunny/services/factory/FileFactory.java diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioUtil.java index dd1adae..7043c42 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioUtil.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioUtil.java @@ -1,7 +1,7 @@ package cn.bunny.common.service.utils.minio; import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.dao.pojo.common.MinioFIlePath; +import cn.bunny.dao.pojo.common.MinioFilePath; import cn.bunny.dao.pojo.constant.MinioConstant; import cn.bunny.dao.pojo.result.ResultCodeEnum; import io.minio.GetObjectArgs; @@ -35,7 +35,7 @@ public class MinioUtil { /** * 获取Minio文件路径 */ - public static MinioFIlePath getMinioFilePath(String buckName, String minioPreType, MultipartFile file) { + public static MinioFilePath getMinioFilePath(String buckName, String minioPreType, MultipartFile file) { String uuid = UUID.randomUUID().toString(); // 定义日期时间格式 LocalDateTime currentDateTime = LocalDateTime.now(); @@ -61,7 +61,7 @@ public class MinioUtil { String buckNameFilepath = "/" + buckName + MinioConstant.getType(minioPreType) + timeUuidFilename; // 设置及Minio基础信息 - MinioFIlePath minioFIlePath = new MinioFIlePath(); + MinioFilePath minioFIlePath = new MinioFilePath(); minioFIlePath.setFilename(filename); minioFIlePath.setUuidFilename(uuidFilename); minioFIlePath.setTimeUuidFilename(timeUuidFilename); @@ -74,11 +74,11 @@ public class MinioUtil { /** * * 上传文件并返回处理信息 */ - public MinioFIlePath getUploadMinioObjectFilePath(MultipartFile file, String minioPreType) throws IOException { + public MinioFilePath getUploadMinioObjectFilePath(MultipartFile file, String minioPreType) throws IOException { // 如果buckName为空,设置为默认的桶 String bucketName = properties.getBucketName(); if (file != null) { - MinioFIlePath minioFile = getMinioFilePath(bucketName, minioPreType, file); + MinioFilePath minioFile = getMinioFilePath(bucketName, minioPreType, file); String filepath = minioFile.getFilepath(); // 上传对象 diff --git a/dao/src/main/java/cn/bunny/dao/dto/system/user/AdminUserUpdateDto.java b/dao/src/main/java/cn/bunny/dao/dto/system/user/AdminUserUpdateDto.java index bad7ae5..e2a112b 100644 --- a/dao/src/main/java/cn/bunny/dao/dto/system/user/AdminUserUpdateDto.java +++ b/dao/src/main/java/cn/bunny/dao/dto/system/user/AdminUserUpdateDto.java @@ -34,9 +34,6 @@ public class AdminUserUpdateDto { @Schema(name = "phone", title = "手机号") private String phone; - @Schema(name = "avatar", title = "头像") - private String avatar; - @Schema(name = "sex", title = "性别", description = "0:女 1:男") private Byte sex; diff --git a/dao/src/main/java/cn/bunny/dao/dto/system/user/UserUpdateWithAvatarDto.java b/dao/src/main/java/cn/bunny/dao/dto/system/user/UserUpdateWithAvatarDto.java index 2c9f89d..39e1e23 100644 --- a/dao/src/main/java/cn/bunny/dao/dto/system/user/UserUpdateWithAvatarDto.java +++ b/dao/src/main/java/cn/bunny/dao/dto/system/user/UserUpdateWithAvatarDto.java @@ -1,13 +1,12 @@ package cn.bunny.dao.dto.system.user; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.web.multipart.MultipartFile; @Data @AllArgsConstructor @@ -21,8 +20,7 @@ public class UserUpdateWithAvatarDto { private Long userId; @Schema(name = "avatar", title = "用户头像") - @NotBlank(message = "用户头像不能为空") - @NotEmpty - private String avatar; + @NotNull(message = "用户头像不能为空") + private MultipartFile avatar; } \ No newline at end of file diff --git a/dao/src/main/java/cn/bunny/dao/pojo/common/MinioFIlePath.java b/dao/src/main/java/cn/bunny/dao/pojo/common/MinioFilePath.java similarity index 92% rename from dao/src/main/java/cn/bunny/dao/pojo/common/MinioFIlePath.java rename to dao/src/main/java/cn/bunny/dao/pojo/common/MinioFilePath.java index 0275481..87e7d0b 100644 --- a/dao/src/main/java/cn/bunny/dao/pojo/common/MinioFIlePath.java +++ b/dao/src/main/java/cn/bunny/dao/pojo/common/MinioFilePath.java @@ -9,7 +9,7 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor @Builder -public class MinioFIlePath { +public class MinioFilePath { private String filename; private String uuidFilename; private String timeUuidFilename; diff --git a/service/src/main/java/cn/bunny/services/factory/FileFactory.java b/service/src/main/java/cn/bunny/services/factory/FileFactory.java new file mode 100644 index 0000000..7a4f008 --- /dev/null +++ b/service/src/main/java/cn/bunny/services/factory/FileFactory.java @@ -0,0 +1,72 @@ +package cn.bunny.services.factory; + +import cn.bunny.common.service.context.BaseContext; +import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.common.service.utils.FileUtil; +import cn.bunny.common.service.utils.minio.MinioUtil; +import cn.bunny.dao.entity.system.Files; +import cn.bunny.dao.pojo.common.MinioFilePath; +import cn.bunny.dao.pojo.result.ResultCodeEnum; +import cn.bunny.dao.vo.system.files.FileInfoVo; +import cn.bunny.services.mapper.FilesMapper; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +@Component +public class FileFactory { + @Autowired + private FilesMapper filesMapper; + @Value("${spring.servlet.multipart.max-file-size}") + private String maxFileSize; + @Autowired + private MinioUtil minioUtil; + + /** + * 上传文件 + * + * @param file 文件 + * @param type 文件类型(MinioConstant) + * @return 返回文件信息 + */ + @SneakyThrows + public FileInfoVo uploadFile(MultipartFile file, String type) { + // 管理员Id + Long userId = BaseContext.getUserId(); + // 文件大小 + long fileSize = file.getSize(); + // 文件类型 + String contentType = file.getContentType(); + // 文件名 + String filename = file.getOriginalFilename(); + + // 上传文件 + MinioFilePath minioFIlePath = minioUtil.getUploadMinioObjectFilePath(file, type); + String bucketNameFilepath = minioFIlePath.getBucketNameFilepath(); + + // 盘读研数据是否过大 + String mb = maxFileSize.replace("MB", ""); + if (fileSize / 1024 / 1024 > Long.parseLong(mb)) throw new BunnyException(ResultCodeEnum.DATA_TOO_LARGE); + + // 插入文件信息 + Files adminFiles = new Files(); + adminFiles.setFileSize(fileSize); + adminFiles.setFileType(contentType); + adminFiles.setFilename(filename); + adminFiles.setFilepath(bucketNameFilepath); + adminFiles.setCreateUser(userId); + filesMapper.insert(adminFiles); + + // 返回信息内容化 + return FileInfoVo.builder() + .size(FileUtil.getSize(fileSize)) + .filepath(bucketNameFilepath) + .fileSize(fileSize) + .fileType(contentType) + .filename(filename) + .url(minioUtil.getObjectNameFullPath(bucketNameFilepath)) + .build(); + } +} diff --git a/service/src/main/java/cn/bunny/services/service/impl/FilesServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/FilesServiceImpl.java index 0ad599b..fa15930 100644 --- a/service/src/main/java/cn/bunny/services/service/impl/FilesServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/impl/FilesServiceImpl.java @@ -1,20 +1,14 @@ package cn.bunny.services.service.impl; -import cn.bunny.common.service.context.BaseContext; -import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.common.service.utils.FileUtil; -import cn.bunny.common.service.utils.minio.MinioUtil; import cn.bunny.dao.dto.system.files.FileUploadDto; import cn.bunny.dao.entity.system.Files; -import cn.bunny.dao.pojo.common.MinioFIlePath; -import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.dao.vo.system.files.FileInfoVo; +import cn.bunny.services.factory.FileFactory; import cn.bunny.services.mapper.FilesMapper; import cn.bunny.services.service.FilesService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -30,10 +24,7 @@ import org.springframework.web.multipart.MultipartFile; public class FilesServiceImpl extends ServiceImpl implements FilesService { @Autowired - private MinioUtil minioUtil; - - @Value("${spring.servlet.multipart.max-file-size}") - private String maxFileSize; + private FileFactory fileFactory; /** * * 上传文件 @@ -47,40 +38,6 @@ public class FilesServiceImpl extends ServiceImpl implements MultipartFile file = dto.getFile(); String type = dto.getType(); - // 管理员Id - Long userId = BaseContext.getUserId(); - // 文件大小 - long fileSize = file.getSize(); - // 文件类型 - String contentType = file.getContentType(); - // 文件名 - String filename = file.getOriginalFilename(); - - // 上传文件 - MinioFIlePath minioFIlePath = minioUtil.getUploadMinioObjectFilePath(file, type); - String bucketNameFilepath = minioFIlePath.getBucketNameFilepath(); - - // 盘读研数据是否过大 - String mb = maxFileSize.replace("MB", ""); - if (fileSize / 1024 / 1024 > Long.parseLong(mb)) throw new BunnyException(ResultCodeEnum.DATA_TOO_LARGE); - - // 插入文件信息 - Files adminFiles = new Files(); - adminFiles.setFileSize(fileSize); - adminFiles.setFileType(contentType); - adminFiles.setFilename(filename); - adminFiles.setFilepath(bucketNameFilepath); - adminFiles.setCreateUser(userId); - save(adminFiles); - - // 返回信息内容化 - return FileInfoVo.builder() - .size(FileUtil.getSize(fileSize)) - .filepath(bucketNameFilepath) - .fileSize(fileSize) - .fileType(contentType) - .filename(filename) - .url(minioUtil.getObjectNameFullPath(bucketNameFilepath)) - .build(); + return fileFactory.uploadFile(file, type); } } diff --git a/service/src/main/java/cn/bunny/services/service/impl/UserServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/UserServiceImpl.java index 13e176a..4197ec8 100644 --- a/service/src/main/java/cn/bunny/services/service/impl/UserServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/impl/UserServiceImpl.java @@ -4,13 +4,16 @@ import cn.bunny.common.service.context.BaseContext; import cn.bunny.common.service.exception.BunnyException; import cn.bunny.common.service.utils.JwtHelper; import cn.bunny.common.service.utils.minio.MinioUtil; +import cn.bunny.dao.dto.system.files.FileUploadDto; import cn.bunny.dao.dto.system.user.*; import cn.bunny.dao.entity.system.AdminUser; import cn.bunny.dao.entity.system.EmailUsers; import cn.bunny.dao.pojo.common.EmailSendInit; +import cn.bunny.dao.pojo.constant.MinioConstant; import cn.bunny.dao.pojo.constant.RedisUserConstant; import cn.bunny.dao.pojo.result.PageResult; import cn.bunny.dao.pojo.result.ResultCodeEnum; +import cn.bunny.dao.vo.system.files.FileInfoVo; import cn.bunny.dao.vo.system.user.AdminUserVo; import cn.bunny.dao.vo.system.user.LoginVo; import cn.bunny.dao.vo.system.user.RefreshTokenVo; @@ -19,12 +22,14 @@ import cn.bunny.services.factory.EmailFactory; import cn.bunny.services.factory.UserFactory; import cn.bunny.services.mapper.EmailUsersMapper; import cn.bunny.services.mapper.UserMapper; +import cn.bunny.services.service.FilesService; import cn.bunny.services.service.UserService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import jakarta.validation.Valid; +import lombok.SneakyThrows; import org.jetbrains.annotations.NotNull; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -33,6 +38,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.DigestUtils; import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -62,6 +68,9 @@ public class UserServiceImpl extends ServiceImpl implemen @Autowired private MinioUtil minioUtil; + @Autowired + private FilesService filesService; + /** * 登录发送邮件验证码 * @@ -170,19 +179,24 @@ public class UserServiceImpl extends ServiceImpl implemen * * @param dto 管理员用户修改头像 */ + @SneakyThrows @Override public void uploadAvatarByAdmin(UserUpdateWithAvatarDto dto) { - String avatar = dto.getAvatar(); + MultipartFile avatar = dto.getAvatar(); Long userId = dto.getUserId(); // 判断是否存在这个用户 AdminUser adminUser = getOne(Wrappers.lambdaQuery().eq(AdminUser::getId, userId)); if (adminUser == null) throw new BunnyException(ResultCodeEnum.USER_IS_EMPTY); + // 上传头像 + FileUploadDto uploadDto = FileUploadDto.builder().file(avatar).type(MinioConstant.avatar).build(); + FileInfoVo fileInfoVo = filesService.upload(uploadDto); + // 更新用户 adminUser = new AdminUser(); adminUser.setId(userId); - adminUser.setAvatar(avatar); + adminUser.setAvatar(fileInfoVo.getFilepath()); updateById(adminUser); }