From c90361d7d97334f025d883a260d0601ad450b784 Mon Sep 17 00:00:00 2001 From: Charles7c Date: Fri, 29 Dec 2023 23:10:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=90=8E=E7=AB=AF=E6=96=87=E4=BB=B6=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E3=80=81=E5=8D=95=E4=B8=AA=E5=88=A0=E9=99=A4=E3=80=81?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/system/config/FileRecorderImpl.java | 13 +--- .../admin/system/model/entity/FileDO.java | 28 ++++++++ .../admin/system/model/req/FileReq.java | 16 ++++- .../system/service/impl/FileServiceImpl.java | 16 +++++ continew-admin-ui/src/api/system/file.ts | 6 +- .../src/store/modules/app/index.ts | 6 +- continew-admin-ui/src/utils/file.ts | 13 ---- .../file/components/FileRenameModal/index.vue | 23 +++---- .../system/file/main/FileMain/FileImg.vue | 2 +- .../system/file/main/FileMain/FileList.vue | 4 +- .../views/system/file/main/FileMain/index.vue | 69 ++++++++++++++++--- 11 files changed, 138 insertions(+), 58 deletions(-) delete mode 100644 continew-admin-ui/src/utils/file.ts 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 493eef71..5ea49e08 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 @@ -76,18 +76,7 @@ public class FileRecorderImpl implements FileRecorder { if (null == file) { return null; } - FileInfo fileInfo = new FileInfo(); - 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(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; + return file.toFileInfo(storageMapper.lambdaQuery().eq(StorageDO::getId, file.getStorageId()).one().getCode()); } @Override diff --git a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/model/entity/FileDO.java b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/model/entity/FileDO.java index dadc1250..6e4fc521 100644 --- a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/model/entity/FileDO.java +++ b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/model/entity/FileDO.java @@ -20,9 +20,15 @@ import java.io.Serial; import lombok.Data; +import org.dromara.x.file.storage.core.FileInfo; + import com.baomidou.mybatisplus.annotation.*; +import cn.hutool.core.util.StrUtil; + import top.charles7c.continew.admin.system.enums.FileTypeEnum; +import top.charles7c.continew.starter.core.constant.StringConstants; +import top.charles7c.continew.starter.core.util.URLUtils; import top.charles7c.continew.starter.extension.crud.base.BaseDO; /** @@ -70,4 +76,26 @@ public class FileDO extends BaseDO { * 存储库 ID */ private Long storageId; + + /** + * 转换为 X-File-Storage 文件信息对象 + * + * @param storageCode + * 存储库编码 + * @return X-File-Storage 文件信息对象 + */ + public FileInfo toFileInfo(String storageCode) { + FileInfo fileInfo = new FileInfo(); + fileInfo.setOriginalFilename( + StrUtil.isNotBlank(this.extension) ? this.name + StringConstants.DOT + this.extension : this.name); + fileInfo.setSize(this.size); + fileInfo.setUrl(this.url); + fileInfo.setExt(this.extension); + fileInfo.setBasePath(StringConstants.EMPTY); + fileInfo.setPath(StringConstants.EMPTY); + fileInfo.setFilename( + URLUtils.isHttpUrl(this.url) ? StrUtil.subAfter(this.url, StringConstants.SLASH, true) : this.url); + fileInfo.setPlatform(storageCode); + return fileInfo; + } } \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/model/req/FileReq.java b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/model/req/FileReq.java index 313ede6a..d8e059e8 100644 --- a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/model/req/FileReq.java +++ b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/model/req/FileReq.java @@ -18,22 +18,34 @@ package top.charles7c.continew.admin.system.model.req; import java.io.Serial; +import jakarta.validation.constraints.NotBlank; + import lombok.Data; import io.swagger.v3.oas.annotations.media.Schema; +import org.hibernate.validator.constraints.Length; + import top.charles7c.continew.starter.extension.crud.base.BaseReq; /** - * 创建或修改文件信息 + * 修改文件信息 * * @author Charles7c * @since 2023/12/23 10:38 */ @Data -@Schema(description = "创建或修改文件信息") +@Schema(description = "修改文件信息") public class FileReq extends BaseReq { @Serial private static final long serialVersionUID = 1L; + + /** + * 名称 + */ + @Schema(description = "名称", example = "test123") + @NotBlank(message = "文件名称不能为空") + @Length(max = 255, message = "文件名称长度不能超过 {max} 个字符") + private String name; } \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/FileServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/FileServiceImpl.java index 988ee9b4..5c0416de 100644 --- a/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/FileServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/FileServiceImpl.java @@ -17,6 +17,8 @@ package top.charles7c.continew.admin.system.service.impl; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import jakarta.annotation.Resource; @@ -62,6 +64,20 @@ public class FileServiceImpl extends BaseServiceImpl ids) { + List fileList = baseMapper.lambdaQuery().in(FileDO::getId, ids).list(); + Map> fileListGroup = fileList.stream().collect(Collectors.groupingBy(FileDO::getStorageId)); + for (Map.Entry> entry : fileListGroup.entrySet()) { + StorageDetailResp storage = storageService.get(entry.getKey()); + for (FileDO file : entry.getValue()) { + FileInfo fileInfo = file.toFileInfo(storage.getCode()); + fileStorageService.delete(fileInfo); + } + } + super.delete(ids); + } + @Override public FileInfo upload(MultipartFile file, String storageCode) { StorageDO storage; diff --git a/continew-admin-ui/src/api/system/file.ts b/continew-admin-ui/src/api/system/file.ts index 0daf502c..02ed63de 100644 --- a/continew-admin-ui/src/api/system/file.ts +++ b/continew-admin-ui/src/api/system/file.ts @@ -47,7 +47,11 @@ export function get(id: string) { return axios.get(`${BASE_URL}/${id}`); } -export function update(req: FileItem, id: string) { +export interface FileItemUpdate { + name: string; +} + +export function update(req: FileItemUpdate, id: string) { return axios.put(`${BASE_URL}/${id}`, req); } diff --git a/continew-admin-ui/src/store/modules/app/index.ts b/continew-admin-ui/src/store/modules/app/index.ts index 4d535253..401dee5e 100644 --- a/continew-admin-ui/src/store/modules/app/index.ts +++ b/continew-admin-ui/src/store/modules/app/index.ts @@ -10,7 +10,6 @@ import type { RouteRecordNormalized } from 'vue-router'; import defaultSettings from '@/config/settings.json'; import { listRoute } from '@/api/auth'; import { listOption } from '@/api/common'; -import getFile from '@/utils/file'; import { AppState, Config } from './types'; const recursionMenu = ( @@ -134,7 +133,7 @@ const useAppStore = defineStore('app', { .querySelector('link[rel="shortcut icon"]') ?.setAttribute( 'href', - getFile(resMap.get('site_favicon')) || + resMap.get('site_favicon') || 'https://cnadmin.charles7c.top/favicon.ico', ); }); @@ -152,8 +151,7 @@ const useAppStore = defineStore('app', { .querySelector('link[rel="shortcut icon"]') ?.setAttribute( 'href', - getFile(config.site_favicon) || - 'https://cnadmin.charles7c.top/favicon.ico', + config.site_favicon || 'https://cnadmin.charles7c.top/favicon.ico', ); }, }, diff --git a/continew-admin-ui/src/utils/file.ts b/continew-admin-ui/src/utils/file.ts deleted file mode 100644 index 6e94291b..00000000 --- a/continew-admin-ui/src/utils/file.ts +++ /dev/null @@ -1,13 +0,0 @@ -export default function getFile(file: string | undefined) { - if (file) { - const baseUrl = import.meta.env.VITE_API_BASE_URL; - if ( - !file.startsWith('http://') && - !file.startsWith('https://') && - !file.startsWith('blob:') - ) { - return `${baseUrl}/file/${file}`; - } - } - return file; -} diff --git a/continew-admin-ui/src/views/system/file/components/FileRenameModal/index.vue b/continew-admin-ui/src/views/system/file/components/FileRenameModal/index.vue index ae58111c..4d9d60d3 100644 --- a/continew-admin-ui/src/views/system/file/components/FileRenameModal/index.vue +++ b/continew-admin-ui/src/views/system/file/components/FileRenameModal/index.vue @@ -20,7 +20,7 @@ label="文件名称" :rules="[{ required: true, message: '请输入文件名称' }]" > - + @@ -28,16 +28,16 @@ diff --git a/continew-admin-ui/src/views/system/file/main/FileMain/FileImg.vue b/continew-admin-ui/src/views/system/file/main/FileMain/FileImg.vue index 2e23e09d..5cf5c5e5 100644 --- a/continew-admin-ui/src/views/system/file/main/FileMain/FileImg.vue +++ b/continew-admin-ui/src/views/system/file/main/FileMain/FileImg.vue @@ -1,6 +1,6 @@