mirror of
https://github.com/rustfs/console.git
synced 2026-08-30 17:14:47 +08:00
feat:force delete object
This commit is contained in:
@@ -176,6 +176,7 @@
|
||||
:visible="showVersions"
|
||||
@close="showVersions = false"
|
||||
@preview="handlePreviewVersion"
|
||||
@refresh-parent="handleRefreshParent"
|
||||
/>
|
||||
</template>
|
||||
|
||||
@@ -199,10 +200,21 @@ const openDrawer = (bucket: string, objName: string) => {
|
||||
getObject();
|
||||
getObjectLockConfig();
|
||||
};
|
||||
|
||||
// 处理版本组件请求刷新父组件
|
||||
const handleRefreshParent = () => {
|
||||
// 通知父组件(文件列表)刷新
|
||||
emit('refresh-parent');
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
openDrawer,
|
||||
});
|
||||
|
||||
// 定义emit事件
|
||||
const emit = defineEmits(['refresh-parent']);
|
||||
|
||||
const message = useMessage();
|
||||
|
||||
// 当前路径的前缀, example: '/folder1/folder2/'
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
<Icon name="ri:arrow-right-s-line" class="ml-2" />
|
||||
</n-button>
|
||||
</n-button-group>
|
||||
<object-info ref="infoRef" />
|
||||
<object-info ref="infoRef" @refresh-parent="handleObjectDeleted" />
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
@@ -233,7 +233,7 @@ const columns: DataTableColumns<RowData> = [
|
||||
title: t('Actions'),
|
||||
key: 'actions',
|
||||
align: 'center',
|
||||
width: 100,
|
||||
width: 150,
|
||||
render: (row: RowData) => {
|
||||
return h(
|
||||
NSpace,
|
||||
@@ -258,6 +258,37 @@ const columns: DataTableColumns<RowData> = [
|
||||
),
|
||||
}
|
||||
),
|
||||
// 删除按钮 - 文件和文件夹都显示
|
||||
h(
|
||||
NPopconfirm,
|
||||
{ onPositiveClick: () => handleDeleteAllVersions(row) },
|
||||
{
|
||||
default: () =>
|
||||
h('div', [
|
||||
h(
|
||||
'div',
|
||||
{ style: 'margin-bottom: 8px;' },
|
||||
row.type === 'object' ? t('Delete All Versions Warning') : t('Warning')
|
||||
),
|
||||
h(
|
||||
'div',
|
||||
{ style: 'color: #666; font-size: 12px;' },
|
||||
row.type === 'object'
|
||||
? t('Delete All Versions Description')
|
||||
: t('Are you sure you want to delete this folder and all its contents?')
|
||||
),
|
||||
]),
|
||||
trigger: () =>
|
||||
h(
|
||||
NButton,
|
||||
{ size: 'small', type: 'error', secondary: true },
|
||||
{
|
||||
default: () => '',
|
||||
icon: () => h(Icon, { name: 'ri:delete-bin-5-line' }),
|
||||
}
|
||||
),
|
||||
}
|
||||
),
|
||||
],
|
||||
}
|
||||
);
|
||||
@@ -349,6 +380,51 @@ const filteredObjects = computed(() => {
|
||||
});
|
||||
});
|
||||
|
||||
/** ************************************处理对象删除********************************* */
|
||||
// 处理对象被删除(从版本组件触发)
|
||||
const handleObjectDeleted = () => {
|
||||
// 刷新文件列表
|
||||
salt.value = randomString();
|
||||
refresh();
|
||||
};
|
||||
|
||||
/** ************************************删除所有版本********************************* */
|
||||
// 删除文件的所有版本或文件夹及其内容
|
||||
const handleDeleteAllVersions = async (row: RowData) => {
|
||||
try {
|
||||
if (row.type === 'object') {
|
||||
// 删除文件的所有版本
|
||||
const { deleteAllVersions } = useObject({ bucket: bucketName.value });
|
||||
await deleteAllVersions(row.Key);
|
||||
message.success(t('Delete All Versions Success'));
|
||||
} else if (row.type === 'prefix') {
|
||||
// 删除文件夹及其所有内容
|
||||
const { mapAllFiles } = useObject({ bucket: bucketName.value });
|
||||
const files: string[] = [];
|
||||
|
||||
// 递归收集文件夹下的所有文件
|
||||
await mapAllFiles(bucketName.value, row.Key, (fileKey: string) => {
|
||||
files.push(fileKey);
|
||||
});
|
||||
|
||||
if (files.length > 0) {
|
||||
// 使用删除任务管理器删除所有文件
|
||||
deleteTaskStore.addKeys(files, bucketName.value);
|
||||
message.success(t('Delete task created'));
|
||||
} else {
|
||||
message.success(t('Delete Success'));
|
||||
}
|
||||
}
|
||||
|
||||
// 刷新数据
|
||||
salt.value = randomString();
|
||||
refresh();
|
||||
} catch (error: any) {
|
||||
console.error('Delete failed:', error);
|
||||
message.error(t('Delete Failed'));
|
||||
}
|
||||
};
|
||||
|
||||
/** ************************************批量删除********************************* */
|
||||
function rowKey(row: any): string {
|
||||
return row.Key || '';
|
||||
|
||||
@@ -21,7 +21,7 @@ import dayjs from 'dayjs';
|
||||
import { NButton } from 'naive-ui';
|
||||
|
||||
const props = defineProps<{ bucketName: string; objectKey: string; visible: boolean }>();
|
||||
const emit = defineEmits(['close', 'preview']);
|
||||
const emit = defineEmits(['close', 'preview', 'refresh-parent']);
|
||||
const { t } = useI18n();
|
||||
const message = useMessage();
|
||||
|
||||
@@ -153,7 +153,10 @@ async function deleteVersion(row: any) {
|
||||
try {
|
||||
await deleteObject(props.objectKey, row.VersionId);
|
||||
message.success(t('Delete Success'));
|
||||
|
||||
// 重新获取版本列表
|
||||
await fetchVersions();
|
||||
emit('refresh-parent');
|
||||
} catch (e: any) {
|
||||
message.error(t('Delete Failed'));
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@ export function useObject({ bucket, region }: { bucket: string; region?: string
|
||||
Key: key,
|
||||
};
|
||||
|
||||
// 如果版本ID存在且不是null版本ID,则传递版本ID
|
||||
if (versionId) {
|
||||
params.VersionId = versionId;
|
||||
}
|
||||
@@ -191,6 +192,28 @@ export function useObject({ bucket, region }: { bucket: string; region?: string
|
||||
return await $client.send(new ListObjectVersionsCommand(params));
|
||||
}
|
||||
|
||||
async function deleteAllVersions(key: string) {
|
||||
try {
|
||||
// 获取对象的所有版本
|
||||
const versions = await getObjectVersions(key);
|
||||
const versionsToDelete = versions.Versions || [];
|
||||
const deleteMarkers = versions.DeleteMarkers || [];
|
||||
|
||||
// 删除所有版本
|
||||
const deletePromises = versionsToDelete.map(version => deleteObject(key, version.VersionId));
|
||||
|
||||
// 删除所有删除标记
|
||||
const deleteMarkerPromises = deleteMarkers.map(marker => deleteObject(key, marker.VersionId));
|
||||
|
||||
await Promise.all([...deletePromises, ...deleteMarkerPromises]);
|
||||
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
console.error('Error deleting all versions:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
headObject,
|
||||
putObject,
|
||||
@@ -206,5 +229,6 @@ export function useObject({ bucket, region }: { bucket: string; region?: string
|
||||
getObjectLegalHold,
|
||||
putObjectLegalHold,
|
||||
getObjectVersions,
|
||||
deleteAllVersions,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user