diff --git a/continew-admin-common/pom.xml b/continew-admin-common/pom.xml index 07ccca22..c9fd979d 100644 --- a/continew-admin-common/pom.xml +++ b/continew-admin-common/pom.xml @@ -64,12 +64,6 @@ continew-starter-file-excel - - - top.charles7c.continew - continew-starter-storage-local - - top.charles7c.continew @@ -93,7 +87,7 @@ org.dromara.x-file-storage x-file-storage-spring - + com.amazonaws aws-java-sdk-s3 diff --git a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/config/FileRecorderImpl.java b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/config/FileRecorderImpl.java index fddcbca1..493eef71 100644 --- a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/config/FileRecorderImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/config/FileRecorderImpl.java @@ -16,6 +16,8 @@ package top.charles7c.continew.admin.system.config; +import java.util.Optional; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -25,6 +27,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.EscapeUtil; +import cn.hutool.core.util.StrUtil; import top.charles7c.continew.admin.common.util.helper.LoginHelper; import top.charles7c.continew.admin.system.enums.FileTypeEnum; @@ -32,6 +35,7 @@ import top.charles7c.continew.admin.system.mapper.StorageMapper; import top.charles7c.continew.admin.system.model.entity.FileDO; import top.charles7c.continew.admin.system.model.entity.StorageDO; +import top.charles7c.continew.starter.core.constant.StringConstants; /** * 文件记录实现类 @@ -50,7 +54,9 @@ public class FileRecorderImpl implements FileRecorder { @Override public boolean save(FileInfo fileInfo) { FileDO file = new FileDO(); - file.setName(EscapeUtil.unescape(fileInfo.getOriginalFilename())); + String originalFilename = EscapeUtil.unescape(fileInfo.getOriginalFilename()); + file.setName(StrUtil.contains(originalFilename, StringConstants.DOT) + ? StrUtil.subBefore(originalFilename, StringConstants.DOT, true) : originalFilename); file.setSize(fileInfo.getSize()); file.setUrl(fileInfo.getUrl()); file.setExtension(fileInfo.getExt()); @@ -66,17 +72,40 @@ public boolean save(FileInfo fileInfo) { @Override public FileInfo getByUrl(String url) { - FileDO file = fileMapper.lambdaQuery().eq(FileDO::getUrl, url).one(); + FileDO file = this.getFileByUrl(url); + if (null == file) { + return null; + } FileInfo fileInfo = new FileInfo(); - fileInfo.setOriginalFilename(file.getName()); + String extension = file.getExtension(); + fileInfo.setOriginalFilename( + StrUtil.isNotBlank(extension) ? file.getName() + StringConstants.DOT + extension : file.getName()); fileInfo.setSize(file.getSize()); fileInfo.setUrl(file.getUrl()); - fileInfo.setExt(file.getExtension()); + fileInfo.setExt(extension); + fileInfo.setBasePath(StringConstants.EMPTY); + fileInfo.setPath(StringConstants.EMPTY); + fileInfo.setFilename(StrUtil.subAfter(url, StringConstants.SLASH, true)); + fileInfo.setPlatform(storageMapper.lambdaQuery().eq(StorageDO::getId, file.getStorageId()).one().getCode()); return fileInfo; } @Override public boolean delete(String url) { - return fileMapper.lambdaUpdate().eq(FileDO::getUrl, url).remove(); + FileDO file = this.getFileByUrl(url); + return fileMapper.lambdaUpdate().eq(FileDO::getUrl, file.getUrl()).remove(); + } + + /** + * 根据 URL 查询文件 + * + * @param url + * URL + * @return 文件信息 + */ + private FileDO getFileByUrl(String url) { + Optional fileOptional = fileMapper.lambdaQuery().eq(FileDO::getUrl, url).oneOpt(); + return fileOptional.orElseGet(() -> fileMapper.lambdaQuery() + .eq(FileDO::getUrl, StrUtil.subAfter(url, StringConstants.SLASH, true)).oneOpt().orElse(null)); } } \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/config/FileStorageConfigLoader.java b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/config/FileStorageConfigLoader.java index 955f8c70..a7838015 100644 --- a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/config/FileStorageConfigLoader.java +++ b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/config/FileStorageConfigLoader.java @@ -41,7 +41,7 @@ * @since 2023/12/24 22:31 */ @Slf4j -//@Component +@Component @RequiredArgsConstructor public class FileStorageConfigLoader implements ApplicationRunner { diff --git a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/FileService.java b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/FileService.java index 6debb373..1ba919ec 100644 --- a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/FileService.java +++ b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/FileService.java @@ -18,6 +18,7 @@ import java.util.List; +import org.dromara.x.file.storage.core.FileInfo; import org.springframework.web.multipart.MultipartFile; import top.charles7c.continew.admin.system.model.query.FileQuery; @@ -39,9 +40,10 @@ public interface FileService extends BaseService registerMapping, boolean isCan new ResourceHandlerRegistry(applicationContext, servletContext, contentNegotiationManager, urlPathHelper); // 重新注册相同 Pattern 的静态资源映射 for (Map.Entry entry : registerMapping.entrySet()) { - String pathPattern = StrUtil.appendIfMissing(entry.getKey(), "/**"); + String pathPattern = StrUtil.appendIfMissing(entry.getKey(), StringConstants.PATH_PATTERN); String resourceLocations = StrUtil.appendIfMissing(entry.getValue(), StringConstants.SLASH); // 移除之前注册过的相同 Pattern 映射 handlerMap.remove(pathPattern); diff --git a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/UserServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/UserServiceImpl.java index 9bdf426a..2f3c71b4 100644 --- a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/UserServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/UserServiceImpl.java @@ -16,7 +16,6 @@ package top.charles7c.continew.admin.system.service.impl; -import java.io.File; import java.time.LocalDateTime; import java.util.*; @@ -24,15 +23,15 @@ import lombok.RequiredArgsConstructor; +import org.dromara.x.file.storage.core.FileInfo; +import org.dromara.x.file.storage.core.FileStorageService; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.unit.DataSize; import org.springframework.web.multipart.MultipartFile; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -51,17 +50,12 @@ import top.charles7c.continew.admin.system.model.req.UserRoleUpdateReq; import top.charles7c.continew.admin.system.model.resp.UserDetailResp; import top.charles7c.continew.admin.system.model.resp.UserResp; -import top.charles7c.continew.admin.system.service.DeptService; -import top.charles7c.continew.admin.system.service.RoleService; -import top.charles7c.continew.admin.system.service.UserRoleService; -import top.charles7c.continew.admin.system.service.UserService; +import top.charles7c.continew.admin.system.service.*; import top.charles7c.continew.starter.core.constant.StringConstants; import top.charles7c.continew.starter.core.util.ExceptionUtils; -import top.charles7c.continew.starter.core.util.FileUploadUtils; import top.charles7c.continew.starter.core.util.validate.CheckUtils; import top.charles7c.continew.starter.extension.crud.base.BaseServiceImpl; import top.charles7c.continew.starter.extension.crud.base.CommonUserService; -import top.charles7c.continew.starter.storage.local.autoconfigure.LocalStorageProperties; /** * 用户业务实现 @@ -75,11 +69,12 @@ public class UserServiceImpl extends BaseServiceImpl implements UserService, CommonUserService { - private final UserRoleService userRoleService; - private final RoleService roleService; - private final LocalStorageProperties localStorageProperties; @Resource private DeptService deptService; + private final RoleService roleService; + private final UserRoleService userRoleService; + private final FileService fileService; + private final FileStorageService fileStorageService; @Override public Long add(UserDO user) { @@ -164,26 +159,20 @@ public void fillDetail(Object detailObj) { @Override @Transactional(rollbackFor = Exception.class) public String uploadAvatar(MultipartFile avatarFile, Long id) { - LocalStorageProperties.LocalStorageMapping storageMapping = localStorageProperties.getMapping().get("AVATAR"); - DataSize maxFileSize = storageMapping.getMaxFileSize(); - CheckUtils.throwIf(avatarFile.getSize() > maxFileSize.toBytes(), "请上传小于 {}MB 的图片", maxFileSize.toMegabytes()); String avatarImageType = FileNameUtil.extName(avatarFile.getOriginalFilename()); String[] avatarSupportImgTypes = FileConstants.AVATAR_SUPPORTED_IMG_TYPES; CheckUtils.throwIf(!StrUtil.equalsAnyIgnoreCase(avatarImageType, avatarSupportImgTypes), "头像仅支持 {} 格式的图片", String.join(StringConstants.CHINESE_COMMA, avatarSupportImgTypes)); // 上传新头像 UserDO user = super.getById(id); - String avatarPath = storageMapping.getLocation(); - File newAvatarFile = FileUploadUtils.upload(avatarFile, avatarPath, false); - CheckUtils.throwIfNull(newAvatarFile, "上传头像失败"); - assert null != newAvatarFile; + FileInfo fileInfo = fileService.upload(avatarFile); // 更新用户头像 - String newAvatar = newAvatarFile.getName(); + String newAvatar = fileInfo.getUrl(); baseMapper.lambdaUpdate().set(UserDO::getAvatar, newAvatar).eq(UserDO::getId, id).update(); // 删除原头像 String oldAvatar = user.getAvatar(); if (StrUtil.isNotBlank(oldAvatar)) { - FileUtil.del(avatarPath + oldAvatar); + fileStorageService.delete(oldAvatar); } return newAvatar; } diff --git a/continew-admin-ui/src/components/navbar/index.vue b/continew-admin-ui/src/components/navbar/index.vue index 945aa3fa..920ad8de 100644 --- a/continew-admin-ui/src/components/navbar/index.vue +++ b/continew-admin-ui/src/components/navbar/index.vue @@ -2,7 +2,7 @@