From c371d294a75bedbb6be511e7954af8f7f306b759 Mon Sep 17 00:00:00 2001 From: colin Date: Sun, 27 Apr 2025 13:53:00 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(vben5):=20=E5=A2=9E=E5=8A=A0Oss?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/vben5/apps/app-antd/package.json | 1 + .../app-antd/src/locales/langs/en-US/abp.json | 4 + .../app-antd/src/locales/langs/zh-CN/abp.json | 4 + .../src/views/oss/containers/index.vue | 15 ++ apps/vben5/packages/@abp/oss/package.json | 39 ++++ apps/vben5/packages/@abp/oss/src/api/index.ts | 1 + .../@abp/oss/src/api/useContainesApi.ts | 46 +++++ .../components/containers/ContainerModal.vue | 55 +++++ .../components/containers/ContainerTable.vue | 190 ++++++++++++++++++ .../packages/@abp/oss/src/components/index.ts | 1 + apps/vben5/packages/@abp/oss/src/index.ts | 3 + .../packages/@abp/oss/src/types/containes.ts | 38 ++++ .../packages/@abp/oss/src/types/index.ts | 1 + apps/vben5/packages/@abp/oss/tsconfig.json | 6 + 14 files changed, 404 insertions(+) create mode 100644 apps/vben5/apps/app-antd/src/views/oss/containers/index.vue create mode 100644 apps/vben5/packages/@abp/oss/package.json create mode 100644 apps/vben5/packages/@abp/oss/src/api/index.ts create mode 100644 apps/vben5/packages/@abp/oss/src/api/useContainesApi.ts create mode 100644 apps/vben5/packages/@abp/oss/src/components/containers/ContainerModal.vue create mode 100644 apps/vben5/packages/@abp/oss/src/components/containers/ContainerTable.vue create mode 100644 apps/vben5/packages/@abp/oss/src/components/index.ts create mode 100644 apps/vben5/packages/@abp/oss/src/index.ts create mode 100644 apps/vben5/packages/@abp/oss/src/types/containes.ts create mode 100644 apps/vben5/packages/@abp/oss/src/types/index.ts create mode 100644 apps/vben5/packages/@abp/oss/tsconfig.json diff --git a/apps/vben5/apps/app-antd/package.json b/apps/vben5/apps/app-antd/package.json index 0d22aff5b..7a5e41b08 100644 --- a/apps/vben5/apps/app-antd/package.json +++ b/apps/vben5/apps/app-antd/package.json @@ -36,6 +36,7 @@ "@abp/localization": "workspace:*", "@abp/notifications": "workspace:*", "@abp/openiddict": "workspace:*", + "@abp/oss": "workspace:*", "@abp/permissions": "workspace:*", "@abp/platform": "workspace:*", "@abp/request": "workspace:*", diff --git a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json index e7becde31..bf18b9eae 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json @@ -129,5 +129,9 @@ "textTemplating": { "title": "Text Templating", "definitions": "Definitions" + }, + "oss": { + "title": "Object storage", + "containers": "Containers" } } diff --git a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json index e2ee0db57..8cdbf8324 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json @@ -129,5 +129,9 @@ "textTemplating": { "title": "文本模板", "definitions": "模板定义" + }, + "oss": { + "title": "对象存储", + "containers": "容器管理" } } diff --git a/apps/vben5/apps/app-antd/src/views/oss/containers/index.vue b/apps/vben5/apps/app-antd/src/views/oss/containers/index.vue new file mode 100644 index 000000000..f9dbfea0d --- /dev/null +++ b/apps/vben5/apps/app-antd/src/views/oss/containers/index.vue @@ -0,0 +1,15 @@ + + + diff --git a/apps/vben5/packages/@abp/oss/package.json b/apps/vben5/packages/@abp/oss/package.json new file mode 100644 index 000000000..9bf32f938 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/package.json @@ -0,0 +1,39 @@ +{ + "name": "@abp/oss", + "version": "9.0.4", + "homepage": "https://github.com/colinin/abp-next-admin", + "bugs": "https://github.com/colinin/abp-next-admin/issues", + "repository": { + "type": "git", + "url": "git+https://github.com/colinin/abp-next-admin.git", + "directory": "packages/@abp/oss" + }, + "license": "MIT", + "type": "module", + "sideEffects": [ + "**/*.css" + ], + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + } + }, + "dependencies": { + "@abp/components": "workspace:*", + "@abp/core": "workspace:*", + "@abp/features": "workspace:*", + "@abp/request": "workspace:*", + "@abp/ui": "workspace:*", + "@ant-design/icons-vue": "catalog:", + "@vben/access": "workspace:*", + "@vben/common-ui": "workspace:*", + "@vben/hooks": "workspace:*", + "@vben/icons": "workspace:*", + "@vben/layouts": "workspace:*", + "@vben/locales": "workspace:*", + "ant-design-vue": "catalog:", + "vue": "catalog:*", + "vxe-table": "catalog:" + } +} diff --git a/apps/vben5/packages/@abp/oss/src/api/index.ts b/apps/vben5/packages/@abp/oss/src/api/index.ts new file mode 100644 index 000000000..cba485d84 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/api/index.ts @@ -0,0 +1 @@ +export { useContainesApi } from './useContainesApi'; diff --git a/apps/vben5/packages/@abp/oss/src/api/useContainesApi.ts b/apps/vben5/packages/@abp/oss/src/api/useContainesApi.ts new file mode 100644 index 000000000..6043b7435 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/api/useContainesApi.ts @@ -0,0 +1,46 @@ +import type { + GetOssContainersInput, + OssContainerDto, + OssContainersResultDto, +} from '../types/containes'; + +import { useRequest } from '@abp/request'; + +export function useContainesApi() { + const { cancel, request } = useRequest(); + + function deleteApi(name: string): Promise { + return request(`/api/oss-management/containes/${name}`, { + method: 'DELETE', + }); + } + + function getApi(name: string): Promise { + return request(`/api/oss-management/containes/${name}`, { + method: 'GET', + }); + } + + function getListApi( + input?: GetOssContainersInput, + ): Promise { + return request(`/api/oss-management/containes`, { + method: 'GET', + params: input, + }); + } + + function createApi(name: string): Promise { + return request(`/api/oss-management/containes/${name}`, { + method: 'POST', + }); + } + + return { + cancel, + createApi, + deleteApi, + getApi, + getListApi, + }; +} diff --git a/apps/vben5/packages/@abp/oss/src/components/containers/ContainerModal.vue b/apps/vben5/packages/@abp/oss/src/components/containers/ContainerModal.vue new file mode 100644 index 000000000..1f6abca21 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/components/containers/ContainerModal.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/apps/vben5/packages/@abp/oss/src/components/containers/ContainerTable.vue b/apps/vben5/packages/@abp/oss/src/components/containers/ContainerTable.vue new file mode 100644 index 000000000..ebef3e3f6 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/components/containers/ContainerTable.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/apps/vben5/packages/@abp/oss/src/components/index.ts b/apps/vben5/packages/@abp/oss/src/components/index.ts new file mode 100644 index 000000000..8f45d9807 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/components/index.ts @@ -0,0 +1 @@ +export { default as ContainerTable } from './containers/ContainerTable.vue'; diff --git a/apps/vben5/packages/@abp/oss/src/index.ts b/apps/vben5/packages/@abp/oss/src/index.ts new file mode 100644 index 000000000..314dad0cd --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/index.ts @@ -0,0 +1,3 @@ +export * from './api'; +export * from './components'; +export * from './types'; diff --git a/apps/vben5/packages/@abp/oss/src/types/containes.ts b/apps/vben5/packages/@abp/oss/src/types/containes.ts new file mode 100644 index 000000000..d882b7d72 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/types/containes.ts @@ -0,0 +1,38 @@ +import type { PagedAndSortedResultRequestDto } from '@abp/core'; + +interface OssContainerDto { + creationDate: Date; + lastModifiedDate?: Date; + metadata: Record; + name: string; + size: number; +} + +interface OssContainersResultDto { + containers: OssContainerDto[]; + marker?: string; + maxKeys?: number; + nextMarker?: string; + prefix?: string; +} + +interface GetOssContainersInput extends PagedAndSortedResultRequestDto { + marker?: string; + prefix?: string; +} + +interface GetOssObjectsInput extends PagedAndSortedResultRequestDto { + bucket?: string; + delimiter?: string; + encodingType?: string; + marker?: string; + mD5?: string; + prefix?: string; +} + +export type { + GetOssContainersInput, + GetOssObjectsInput, + OssContainerDto, + OssContainersResultDto, +}; diff --git a/apps/vben5/packages/@abp/oss/src/types/index.ts b/apps/vben5/packages/@abp/oss/src/types/index.ts new file mode 100644 index 000000000..6100a918d --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/types/index.ts @@ -0,0 +1 @@ +export * from './containes'; diff --git a/apps/vben5/packages/@abp/oss/tsconfig.json b/apps/vben5/packages/@abp/oss/tsconfig.json new file mode 100644 index 000000000..ce1a891fb --- /dev/null +++ b/apps/vben5/packages/@abp/oss/tsconfig.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vben/tsconfig/web.json", + "include": ["src"], + "exclude": ["node_modules"] +} From 90db54b54a1f4be959181b1aade2ac81adef803c Mon Sep 17 00:00:00 2001 From: colin Date: Mon, 28 Apr 2025 20:03:04 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(vben5):=20=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8A=E4=BC=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app-antd/src/locales/langs/en-US/abp.json | 3 +- .../app-antd/src/locales/langs/zh-CN/abp.json | 3 +- .../app-antd/src/views/oss/objects/index.vue | 15 + apps/vben5/packages/@abp/oss/package.json | 5 + apps/vben5/packages/@abp/oss/src/api/index.ts | 1 + .../@abp/oss/src/api/useContainesApi.ts | 15 + .../@abp/oss/src/api/useObjectsApi.ts | 50 +++ .../packages/@abp/oss/src/components/index.ts | 1 + .../oss/src/components/objects/FileList.vue | 282 +++++++++++++++++ .../components/objects/FileUploadModal.vue | 286 ++++++++++++++++++ .../src/components/objects/FolderModal.vue | 66 ++++ .../oss/src/components/objects/FolderTree.vue | 192 ++++++++++++ .../oss/src/components/objects/ObjectPage.vue | 34 +++ .../@abp/oss/src/constants/permissions.ts | 18 ++ apps/vben5/packages/@abp/oss/src/global.d.ts | 1 + .../packages/@abp/oss/src/types/objects.ts | 50 +++ 16 files changed, 1020 insertions(+), 2 deletions(-) create mode 100644 apps/vben5/apps/app-antd/src/views/oss/objects/index.vue create mode 100644 apps/vben5/packages/@abp/oss/src/api/useObjectsApi.ts create mode 100644 apps/vben5/packages/@abp/oss/src/components/objects/FileList.vue create mode 100644 apps/vben5/packages/@abp/oss/src/components/objects/FileUploadModal.vue create mode 100644 apps/vben5/packages/@abp/oss/src/components/objects/FolderModal.vue create mode 100644 apps/vben5/packages/@abp/oss/src/components/objects/FolderTree.vue create mode 100644 apps/vben5/packages/@abp/oss/src/components/objects/ObjectPage.vue create mode 100644 apps/vben5/packages/@abp/oss/src/constants/permissions.ts create mode 100644 apps/vben5/packages/@abp/oss/src/global.d.ts create mode 100644 apps/vben5/packages/@abp/oss/src/types/objects.ts diff --git a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json index bf18b9eae..d6145c3b6 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json @@ -132,6 +132,7 @@ }, "oss": { "title": "Object storage", - "containers": "Containers" + "containers": "Containers", + "objects": "Files" } } diff --git a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json index 8cdbf8324..8edd4ab47 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json @@ -132,6 +132,7 @@ }, "oss": { "title": "对象存储", - "containers": "容器管理" + "containers": "容器管理", + "objects": "文件管理" } } diff --git a/apps/vben5/apps/app-antd/src/views/oss/objects/index.vue b/apps/vben5/apps/app-antd/src/views/oss/objects/index.vue new file mode 100644 index 000000000..7cbd43a2f --- /dev/null +++ b/apps/vben5/apps/app-antd/src/views/oss/objects/index.vue @@ -0,0 +1,15 @@ + + + diff --git a/apps/vben5/packages/@abp/oss/package.json b/apps/vben5/packages/@abp/oss/package.json index 9bf32f938..ad7022566 100644 --- a/apps/vben5/packages/@abp/oss/package.json +++ b/apps/vben5/packages/@abp/oss/package.json @@ -17,6 +17,9 @@ ".": { "types": "./src/index.ts", "default": "./src/index.ts" + }, + "./global": { + "types": "./global.d.ts" } }, "dependencies": { @@ -32,8 +35,10 @@ "@vben/icons": "workspace:*", "@vben/layouts": "workspace:*", "@vben/locales": "workspace:*", + "@vben/stores": "workspace:*", "ant-design-vue": "catalog:", "vue": "catalog:*", + "vue-simple-uploader": "catalog:", "vxe-table": "catalog:" } } diff --git a/apps/vben5/packages/@abp/oss/src/api/index.ts b/apps/vben5/packages/@abp/oss/src/api/index.ts index cba485d84..b72d0ebb1 100644 --- a/apps/vben5/packages/@abp/oss/src/api/index.ts +++ b/apps/vben5/packages/@abp/oss/src/api/index.ts @@ -1 +1,2 @@ export { useContainesApi } from './useContainesApi'; +export { useObjectsApi } from './useObjectsApi'; diff --git a/apps/vben5/packages/@abp/oss/src/api/useContainesApi.ts b/apps/vben5/packages/@abp/oss/src/api/useContainesApi.ts index 6043b7435..0fb560cf3 100644 --- a/apps/vben5/packages/@abp/oss/src/api/useContainesApi.ts +++ b/apps/vben5/packages/@abp/oss/src/api/useContainesApi.ts @@ -1,8 +1,10 @@ import type { GetOssContainersInput, + GetOssObjectsInput, OssContainerDto, OssContainersResultDto, } from '../types/containes'; +import type { OssObjectsResultDto } from '../types/objects'; import { useRequest } from '@abp/request'; @@ -30,6 +32,18 @@ export function useContainesApi() { }); } + function getObjectsApi( + input: GetOssObjectsInput, + ): Promise { + return request( + `/api/oss-management/containes/objects`, + { + method: 'GET', + params: input, + }, + ); + } + function createApi(name: string): Promise { return request(`/api/oss-management/containes/${name}`, { method: 'POST', @@ -42,5 +56,6 @@ export function useContainesApi() { deleteApi, getApi, getListApi, + getObjectsApi, }; } diff --git a/apps/vben5/packages/@abp/oss/src/api/useObjectsApi.ts b/apps/vben5/packages/@abp/oss/src/api/useObjectsApi.ts new file mode 100644 index 000000000..67bb1a608 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/api/useObjectsApi.ts @@ -0,0 +1,50 @@ +import type { + CreateOssObjectInput, + GetOssObjectInput, + OssObjectDto, +} from '../types/objects'; + +import { useRequest } from '@abp/request'; + +export function useObjectsApi() { + const { cancel, request } = useRequest(); + + function createApi(input: CreateOssObjectInput): Promise { + const formData = new window.FormData(); + formData.append('bucket', input.bucket); + formData.append('fileName', input.fileName); + formData.append('overwrite', String(input.overwrite)); + input.expirationTime && + formData.append('expirationTime', input.expirationTime.toString()); + input.path && formData.append('path', input.path); + input.file && formData.append('file', input.file); + return request(`/api/oss-management/objects`, { + data: formData, + headers: { + 'Content-Type': 'multipart/form-data;charset=utf-8', + }, + method: 'POST', + }); + } + + function generateUrlApi(input: GetOssObjectInput): Promise { + return request('/api/oss-management/objects/generate-url', { + method: 'GET', + params: input, + }); + } + + function deleteApi(input: GetOssObjectInput): Promise { + return request('/api/oss-management/objects', { + method: 'DELETE', + params: input, + }); + } + + return { + cancel, + createApi, + deleteApi, + generateUrlApi, + }; +} diff --git a/apps/vben5/packages/@abp/oss/src/components/index.ts b/apps/vben5/packages/@abp/oss/src/components/index.ts index 8f45d9807..af5101805 100644 --- a/apps/vben5/packages/@abp/oss/src/components/index.ts +++ b/apps/vben5/packages/@abp/oss/src/components/index.ts @@ -1 +1,2 @@ export { default as ContainerTable } from './containers/ContainerTable.vue'; +export { default as ObjectPage } from './objects/ObjectPage.vue'; diff --git a/apps/vben5/packages/@abp/oss/src/components/objects/FileList.vue b/apps/vben5/packages/@abp/oss/src/components/objects/FileList.vue new file mode 100644 index 000000000..019a84e87 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/components/objects/FileList.vue @@ -0,0 +1,282 @@ + + + + + diff --git a/apps/vben5/packages/@abp/oss/src/components/objects/FileUploadModal.vue b/apps/vben5/packages/@abp/oss/src/components/objects/FileUploadModal.vue new file mode 100644 index 000000000..69b38a1f8 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/components/objects/FileUploadModal.vue @@ -0,0 +1,286 @@ + + + + + diff --git a/apps/vben5/packages/@abp/oss/src/components/objects/FolderModal.vue b/apps/vben5/packages/@abp/oss/src/components/objects/FolderModal.vue new file mode 100644 index 000000000..983087636 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/components/objects/FolderModal.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/apps/vben5/packages/@abp/oss/src/components/objects/FolderTree.vue b/apps/vben5/packages/@abp/oss/src/components/objects/FolderTree.vue new file mode 100644 index 000000000..4da8b4514 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/components/objects/FolderTree.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/apps/vben5/packages/@abp/oss/src/components/objects/ObjectPage.vue b/apps/vben5/packages/@abp/oss/src/components/objects/ObjectPage.vue new file mode 100644 index 000000000..63a9c4efa --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/components/objects/ObjectPage.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/apps/vben5/packages/@abp/oss/src/constants/permissions.ts b/apps/vben5/packages/@abp/oss/src/constants/permissions.ts new file mode 100644 index 000000000..4d60a901e --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/constants/permissions.ts @@ -0,0 +1,18 @@ +/** 容器权限 */ +export const ContainerPermissions = { + /** 新增 */ + Create: 'AbpOssManagement.Container.Create', + Default: 'AbpOssManagement.Container', + /** 删除 */ + Delete: 'AbpOssManagement.Container.Delete', +}; +/** 容器权限 */ +export const OssObjectPermissions = { + /** 新增 */ + Create: 'AbpOssManagement.OssObject.Create', + Default: 'AbpOssManagement.OssObject', + /** 删除 */ + Delete: 'AbpOssManagement.OssObject.Delete', + /** 下载 */ + Download: 'AbpOssManagement.OssObject.Download', +}; diff --git a/apps/vben5/packages/@abp/oss/src/global.d.ts b/apps/vben5/packages/@abp/oss/src/global.d.ts new file mode 100644 index 000000000..a0956a4a5 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/global.d.ts @@ -0,0 +1 @@ +declare module 'vue-simple-uploader'; diff --git a/apps/vben5/packages/@abp/oss/src/types/objects.ts b/apps/vben5/packages/@abp/oss/src/types/objects.ts new file mode 100644 index 000000000..da6d2cf28 --- /dev/null +++ b/apps/vben5/packages/@abp/oss/src/types/objects.ts @@ -0,0 +1,50 @@ +interface OssObjectDto { + creationDate: Date; + isFolder: boolean; + lastModifiedDate?: Date; + mD5?: string; + metadata: Record; + name: string; + path: string; + size: number; +} + +interface CreateOssObjectInput { + bucket: string; + expirationTime?: string; + file?: File; + fileName: string; + overwrite: boolean; + path?: string; +} + +interface GetOssObjectInput { + bucket: string; + mD5: boolean; + object: string; + path?: string; +} + +interface BulkDeleteOssObjectInput { + bucket: string; + object: string; + path?: string; +} + +interface OssObjectsResultDto { + bucket: string; + delimiter?: string; + marker?: string; + maxKeys: number; + nextMarker?: string; + objects: OssObjectDto[]; + prefix?: string; +} + +export type { + BulkDeleteOssObjectInput, + CreateOssObjectInput, + GetOssObjectInput, + OssObjectDto, + OssObjectsResultDto, +};