diff --git a/frontend/scripts/regression-dataset-preview.mjs b/frontend/scripts/regression-dataset-preview.mjs
index 8a339ac..de14357 100644
--- a/frontend/scripts/regression-dataset-preview.mjs
+++ b/frontend/scripts/regression-dataset-preview.mjs
@@ -10,6 +10,7 @@ const previewComponentPaths = [
'DatasetRecordTable.vue',
'DatasetRecordEditorDialog.vue',
'DatasetRawPreview.vue',
+ 'DatasetSplitNavigator.vue',
].map((name) => path.join(previewComponentsDir, name))
const apiPath = path.join(root, 'src/api/modules/dataset.ts')
const adapterPath = path.join(root, 'src/mock/adapter.ts')
@@ -50,12 +51,16 @@ function expect(condition, message) {
}
expect(previewLogicSource.split('\n').length < 520, 'DatasetPreviewView.vue 的逻辑与模板应保持在 520 行以内')
-for (const componentName of ['DatasetVersionBar', 'DatasetRecordTable', 'DatasetRecordEditorDialog', 'DatasetRawPreview']) {
+for (const componentName of ['DatasetVersionBar', 'DatasetRecordTable', 'DatasetRecordEditorDialog', 'DatasetRawPreview', 'DatasetSplitNavigator']) {
expect(source.includes(`import ${componentName}`), `主页面未导入叶子组件:${componentName}`)
expect(source.includes(`<${componentName}`), `主页面未挂载叶子组件:${componentName}`)
}
expect(source.includes('class="preview-workspace"'), '详情页应提供数据文件工作区')
-expect(!source.includes('class="file-pane"'), '单文件数据集详情不应展示文件选择侧栏')
+expect(previewSurfaceSource.includes('class="split-file-tabs"'), '多切分数据集应提供训练/验证/测试文件切换')
+expect(source.includes('@select="handleFileChange"'), '切换数据切分时应加载对应文件版本')
+expect(previewSurfaceSource.includes('splitCounts.train'), '数据集概览应显示训练集数量')
+expect(previewSurfaceSource.includes('splitCounts.validation'), '数据集概览应显示验证集数量')
+expect(previewSurfaceSource.includes('splitCounts.test'), '数据集概览应显示测试集数量')
expect(previewSurfaceSource.includes('class="code-line"'), '内容查看器应提供逐行展示')
expect(previewSurfaceSource.includes('class="line-number"'), '内容查看器应显示行号')
expect(source.includes('previewLoading'), '切换文件时应提供独立加载状态')
diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts
index 9405842..e64cc66 100644
--- a/frontend/src/types/index.ts
+++ b/frontend/src/types/index.ts
@@ -63,6 +63,8 @@ export interface DatasetFile {
id?: string
name: string
size?: string | number
+ record_count?: number
+ split?: 'train' | 'validation' | 'test' | null
[k: string]: any
}
@@ -78,6 +80,7 @@ export interface DatasetItem {
description?: string
create_time?: string
files?: DatasetFile[]
+ split_counts?: { train: number; validation: number; test: number }
}
export interface DatasetVersion {
diff --git a/frontend/src/views/data-process/DataProcessDetailView.vue b/frontend/src/views/data-process/DataProcessDetailView.vue
index b81a371..d881276 100644
--- a/frontend/src/views/data-process/DataProcessDetailView.vue
+++ b/frontend/src/views/data-process/DataProcessDetailView.vue
@@ -448,6 +448,33 @@ async function publishDataset() {
}
}
+async function resyncPublishedDataset() {
+ if (!detail.value || !outputDatasetId.value || publishing.value) return
+ try {
+ await ElMessageBox.confirm(
+ '将按当前 8:1:1 配置重新生成训练、验证、测试三个切分文件,数据集 ID 保持不变。',
+ '重新同步数据切分?',
+ { type: 'warning', confirmButtonText: '重新同步', cancelButtonText: '取消' },
+ )
+ } catch {
+ return
+ }
+
+ publishing.value = true
+ try {
+ const published = await publishDataProcess(taskId.value, {
+ ...publishForm,
+ dataset_name: outputDatasetName.value || `${detail.value.name}-数据集`,
+ split: configuredSplit(),
+ })
+ ElMessage.success('训练集、验证集和测试集已重新同步')
+ const datasetId = published.dataset?.id || outputDatasetId.value
+ await router.push(`/dataset/${datasetId}/preview`)
+ } finally {
+ publishing.value = false
+ }
+}
+
watch([currentPage, pageSize], () => void loadResults())
onMounted(loadPage)
@@ -472,6 +499,13 @@ onBeforeUnmount(() => {
{{ outputDatasetId ? '查看输出数据集' : '发布为数据集' }}
+
{{ detail.description || '暂无任务描述' }}