fix(dataset): 统一大小与版本元数据
This commit is contained in:
@@ -42,7 +42,11 @@ assert.match(
|
||||
)
|
||||
assert.match(viewSource, /return dataList\.value\.filter\(\(item\) => item\.source !== 'task'\)/)
|
||||
assert.doesNotMatch(viewSource, /数据任务产生的数据集[\s\S]*?return \[\]/)
|
||||
assert.match(viewSource, /:search-fields="\['task_id', 'name', 'description'\]"/, '数据任务搜索应支持任务 ID')
|
||||
assert.match(viewSource, /:search-fields="\['task_id', 'name'\]"/, '数据任务搜索应支持任务 ID')
|
||||
assert.match(viewSource, /formatMegabytes\(row\.size_bytes, row\.size\)/, '数据集大小应统一转换为 MB')
|
||||
assert.match(viewSource, /<el-table-column label="版本"/, '描述列应替换为真实版本列')
|
||||
assert.doesNotMatch(viewSource, /<el-table-column label="描述"/, '列表不应继续显示描述列')
|
||||
assert.match(viewSource, /current_version_nos/, '版本列应使用接口返回的真实当前版本号')
|
||||
assert.match(viewSource, /:multi-select="activeTab === 'task' && batchMode"/, '多选框只能在数据任务的批量模式显示')
|
||||
assert.match(viewSource, /:show-batch-bar="false"/, '数据任务应使用搜索框旁的批量删除入口')
|
||||
assert.match(viewSource, /<template #toolbar-extra>[\s\S]*?批量删除[\s\S]*?v-if="selectedCount > 0"[\s\S]*?删除(\{\{ selectedCount \}\})/, '批量删除按钮没有按选择状态切换')
|
||||
|
||||
@@ -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)}`)
|
||||
|
||||
@@ -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
|
||||
|
||||
26
frontend/src/utils/fileSize.ts
Normal file
26
frontend/src/utils/fileSize.ts
Normal 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`
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user