feat: 数据处理任务详情页

新增 DataProcessDetailView,列表查看详情入口跳转到详情页,路由注册 data-process/:id,配套回归脚本与 npm 脚本注册(含数据转换与数据处理详情两个测试脚本)。
This commit is contained in:
caoxiaozhu
2026-07-13 11:04:55 +08:00
parent 0f8f41057a
commit b64d730616
5 changed files with 496 additions and 4 deletions

View File

@@ -0,0 +1,55 @@
import assert from 'node:assert/strict'
import { readFile } from 'node:fs/promises'
import { fileURLToPath } from 'node:url'
import path from 'node:path'
import { parse as parseSfc } from '@vue/compiler-sfc'
const scriptDir = path.dirname(fileURLToPath(import.meta.url))
const sourceRoot = path.resolve(scriptDir, '../src')
const [detailSource, listSource, routerSource] = await Promise.all([
readFile(path.join(sourceRoot, 'views/data-process/DataProcessDetailView.vue'), 'utf8'),
readFile(path.join(sourceRoot, 'views/data-process/DataProcessListView.vue'), 'utf8'),
readFile(path.join(sourceRoot, 'router/index.ts'), 'utf8'),
])
const { descriptor, errors } = parseSfc(detailSource, { filename: 'DataProcessDetailView.vue' })
assert.equal(errors.length, 0, `数据处理详情页无法解析:${errors[0]}`)
assert.ok(descriptor.template?.content.trim(), '数据处理详情页缺少可渲染模板')
assert.match(routerSource, /path:\s*['"]data-process\/:id['"]/, '缺少数据处理详情动态路由')
assert.match(routerSource, /name:\s*['"]data-process-detail['"]/, '数据处理详情路由缺少名称')
assert.match(routerSource, /DataProcessDetailView\.vue/, '数据处理详情路由未加载详情页面')
assert.match(routerSource, /title:\s*['"]数据处理详情['"]/, '数据处理详情路由标题不正确')
assert.match(listSource, /name:\s*['"]data-process-detail['"]/, '列表详情按钮未使用详情命名路由')
assert.match(listSource, /params:\s*\{\s*id:\s*taskId\s*\}/, '列表详情按钮未传递任务 ID')
assert.doesNotMatch(listSource, /查看详情功能开发中/, '详情按钮仍保留开发中提示')
for (const requiredCopy of [
'处理耗时',
'开始时间',
'完成时间',
'输入数据',
'输出结果',
'处理统计',
'处理配置',
'结果明细',
]) {
assert.match(detailSource, new RegExp(requiredCopy), `详情页缺少必要信息:${requiredCopy}`)
}
for (const status of ['completed', 'running', 'pending', 'failed']) {
assert.match(detailSource, new RegExp(`status:\\s*['"]${status}['"]`), `详情 Mock 缺少 ${status} 状态`)
}
assert.match(detailSource, /const completedResults:\s*ResultRow\[\]/, '完成任务缺少结果明细 Mock')
assert.match(detailSource, /:data="paginatedResults"/, '结果表格未绑定分页后的处理结果')
assert.match(detailSource, /v-model="keyword"/, '结果明细缺少搜索能力')
assert.match(detailSource, /v-model="statusFilter"/, '结果明细缺少状态筛选')
assert.match(detailSource, /router\.push\(`\/dataset\/\$\{detail\.outputDatasetId\}\/preview`\)/, '输出数据集未接入预览入口')
assert.match(detailSource, /未找到数据处理任务/, '未知任务 ID 缺少明确空状态')
assert.match(detailSource, /width:\s*100%/, '详情页没有铺满内容区域')
assert.doesNotMatch(detailSource, /^\s*max-width:\s*\d+px/m, '详情页不应使用固定最大宽度')
assert.doesNotMatch(detailSource, /\b(?:password|secret|token)\b/i, '详情页不得展示敏感凭据字段')
console.log('数据处理任务详情 UI 回归检查通过')