fix(dataset): 统一大小与版本元数据

This commit is contained in:
caoxiaozhu
2026-07-27 12:26:09 +08:00
parent e486d36a80
commit bce586697b
8 changed files with 345 additions and 31 deletions

View File

@@ -1,5 +1,10 @@
import { get, post, put, del } from '../request'
import type { DatasetItem, DatasetVersion, DatasetVersionList } from '@/types'
import type {
DatasetItem,
DatasetRecordSource,
DatasetVersion,
DatasetVersionList,
} from '@/types'
/** 数据集列表 */
export const getDatasetList = () => get<DatasetItem[]>('/dataset-manage')
@@ -31,6 +36,12 @@ export const uploadDatasetFiles = (datasetId: string | number, files: File[]) =>
export const previewDatasetFile = (fileId: string | number) =>
get<{ content: string }>(`/dataset-manage/preview/${encodeURIComponent(fileId)}`)
/** 获取发布样本所关联的原文参照 */
export const getDatasetFileRecordSources = (fileId: string | number) =>
get<{ items: DatasetRecordSource[] }>(
`/dataset-manage/records/${encodeURIComponent(fileId)}/sources`,
)
/** 数据集文件版本列表 */
export const getDatasetFileVersions = (fileId: string | number) =>
get<DatasetVersionList>(`/dataset-manage/versions/${encodeURIComponent(fileId)}`)

View File

@@ -63,6 +63,11 @@ export interface DatasetFile {
id?: string
name: string
size?: string | number
size_bytes?: number
active_version_id?: string | null
current_version_id?: string | null
current_version_no?: number | null
version_count?: number
record_count?: number
split?: 'train' | 'validation' | 'test' | null
[k: string]: any
@@ -76,13 +81,26 @@ export interface DatasetItem {
source?: DatasetSource
task_id?: string | number
size?: string | number
size_bytes?: number
count?: number
description?: string
create_time?: string
files?: DatasetFile[]
current_version_no?: number | null
current_version_nos?: number[]
version_count?: number
split_counts?: { train: number; validation: number; test: number }
}
export interface DatasetRecordSource {
line_no: number
instruction: string
input: string
output: string
source_text: string
preprocessed: boolean
}
export interface DatasetVersion {
id: string
version: number

View File

@@ -0,0 +1,26 @@
export function parseSizeBytes(value?: string | number | null) {
if (typeof value === 'number') return Number.isFinite(value) ? Math.max(0, value) : 0
const match = String(value || '').trim().match(/^(\d+(?:\.\d+)?)\s*(B|KB|MB|GB|TB)?$/i)
if (!match) return 0
const units: Record<string, number> = {
B: 1,
KB: 1024,
MB: 1024 ** 2,
GB: 1024 ** 3,
TB: 1024 ** 4,
}
return Number(match[1]) * units[(match[2] || 'B').toUpperCase()]
}
/** 列表统一使用 MB非零的小文件至少展示为 0.01 MB避免误显示为零。 */
export function formatMegabytes(
sizeBytes?: number | null,
legacySize?: string | number | null,
) {
const numericSize = Number(sizeBytes)
const bytes = Number.isFinite(numericSize) && numericSize > 0
? numericSize
: parseSizeBytes(legacySize)
if (bytes <= 0) return '0.00 MB'
return `${Math.max(bytes / 1024 ** 2, 0.01).toFixed(2)} MB`
}

View File

@@ -5,6 +5,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import DataTablePage from '@/components/DataTablePage.vue'
import { getDatasetList, deleteDataset, downloadDatasetUrl } from '@/api/modules/dataset'
import { DATASET_TYPE_MAP, STORAGE_MAP } from '@/constants'
import { formatMegabytes } from '@/utils/fileSize'
import type { DatasetItem, DatasetSource } from '@/types'
const router = useRouter()
@@ -107,6 +108,36 @@ function handleDownload(row: any) {
window.open(downloadDatasetUrl(row.id), '_blank')
}
function formatSizeMb(row: DatasetItem) {
return formatMegabytes(row.size_bytes, row.size)
}
function currentVersionNumbers(row: DatasetItem) {
const values = row.current_version_nos?.length
? row.current_version_nos
: [
row.current_version_no,
...(row.files || []).map((file) => file.current_version_no),
]
return [...new Set(
values
.map((value) => Number(value))
.filter((value) => Number.isInteger(value) && value > 0),
)].sort((a, b) => a - b)
}
function versionLabel(row: DatasetItem) {
const versions = currentVersionNumbers(row)
return versions.length ? versions.map((value) => `V${value}`).join(' / ') : '-'
}
function versionDescription(row: DatasetItem) {
const fileCount = row.files?.length || 0
const historyCount = Number(row.version_count || 0)
if (!fileCount) return '当前数据集没有文件版本'
return `${fileCount} 个文件,共 ${historyCount || fileCount} 个版本记录`
}
watch(activeTab, exitBatchMode)
onMounted(loadData)
</script>
@@ -118,7 +149,7 @@ onMounted(loadData)
:data="filteredDataList"
:loading="loading"
searchable
:search-fields="['task_id', 'name', 'description']"
:search-fields="['task_id', 'name']"
:multi-select="activeTab === 'task' && batchMode"
:show-batch-bar="false"
:create-text="activeTab === 'upload' ? '上传数据集' : ''"
@@ -181,16 +212,26 @@ onMounted(loadData)
</el-tag>
</template>
</el-table-column>
<el-table-column label="大小" align="center" width="100">
<el-table-column label="大小" align="center" width="120">
<template #default="{ row }">
{{ row.size && row.size !== '0 B' && row.size !== '0' ? row.size : '-' }}
<span class="numeric-cell">{{ formatSizeMb(row as DatasetItem) }}</span>
</template>
</el-table-column>
<el-table-column label="数据条数" align="center" width="100">
<template #default="{ row }">{{ row.count || 0 }}</template>
</el-table-column>
<el-table-column label="描述" align="center" show-overflow-tooltip>
<template #default="{ row }">{{ row.description || '-' }}</template>
<el-table-column label="版本" align="center" width="120">
<template #default="{ row }">
<el-tooltip
:content="versionDescription(row as DatasetItem)"
placement="top"
:show-after="350"
>
<el-tag size="small" type="info" effect="plain">
{{ versionLabel(row as DatasetItem) }}
</el-tag>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" width="180">
<template #default="{ row }">
@@ -257,4 +298,9 @@ onMounted(loadData)
}
}
.numeric-cell {
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
</style>