refactor: 评测列表移除内嵌维度管理
EvalView 移除维度列表加载/删除与相关 Tab 内容,聚焦评测任务展示;维度表单与规则步骤同步微调,回归脚本适配。
This commit is contained in:
@@ -11,6 +11,7 @@ const [
|
|||||||
createSource,
|
createSource,
|
||||||
taskStepSource,
|
taskStepSource,
|
||||||
ruleStepSource,
|
ruleStepSource,
|
||||||
|
dimensionFieldsSource,
|
||||||
listSource,
|
listSource,
|
||||||
routerSource,
|
routerSource,
|
||||||
apiSource,
|
apiSource,
|
||||||
@@ -18,6 +19,7 @@ const [
|
|||||||
readFile(path.join(evalViewDir, 'EvalCreateView.vue'), 'utf8'),
|
readFile(path.join(evalViewDir, 'EvalCreateView.vue'), 'utf8'),
|
||||||
readFile(path.join(evalViewDir, 'create/EvalTaskSetupStep.vue'), 'utf8'),
|
readFile(path.join(evalViewDir, 'create/EvalTaskSetupStep.vue'), 'utf8'),
|
||||||
readFile(path.join(evalViewDir, 'create/EvalRuleSetupStep.vue'), 'utf8'),
|
readFile(path.join(evalViewDir, 'create/EvalRuleSetupStep.vue'), 'utf8'),
|
||||||
|
readFile(path.join(evalViewDir, 'create/DimensionFormFields.vue'), 'utf8'),
|
||||||
readFile(path.join(evalViewDir, 'EvalView.vue'), 'utf8'),
|
readFile(path.join(evalViewDir, 'EvalView.vue'), 'utf8'),
|
||||||
readFile(path.join(sourceRoot, 'router/index.ts'), 'utf8'),
|
readFile(path.join(sourceRoot, 'router/index.ts'), 'utf8'),
|
||||||
readFile(path.join(sourceRoot, 'api/modules/eval.ts'), 'utf8'),
|
readFile(path.join(sourceRoot, 'api/modules/eval.ts'), 'utf8'),
|
||||||
@@ -60,11 +62,9 @@ assert.match(
|
|||||||
'编辑维度路由必须继续复用 DimensionCreateView.vue',
|
'编辑维度路由必须继续复用 DimensionCreateView.vue',
|
||||||
)
|
)
|
||||||
|
|
||||||
const dimensionTabStart = listSource.indexOf('<!-- 评测维度 -->')
|
assert.doesNotMatch(listSource, /评测维度/, '模型评测页不应保留评测维度页签及内容')
|
||||||
assert.notEqual(dimensionTabStart, -1, '评测列表缺少维度标签页')
|
assert.doesNotMatch(listSource, /activeTab\s*===\s*['"]dimensions['"]/, '模型评测页不应保留评测维度状态分支')
|
||||||
const dimensionTabSource = listSource.slice(dimensionTabStart)
|
assert.doesNotMatch(listSource, /getDimensionList|deleteDimension|dimensionList/, '模型评测页不应继续加载维度列表数据')
|
||||||
assert.doesNotMatch(dimensionTabSource, /create-text=["']添加维度["']/, '维度标签页不应保留“添加维度”按钮')
|
|
||||||
assert.doesNotMatch(dimensionTabSource, /@create=["']handleCreateClick["']/, '维度标签页不应保留独立创建事件')
|
|
||||||
|
|
||||||
assert.match(
|
assert.match(
|
||||||
apiSource,
|
apiSource,
|
||||||
@@ -79,6 +79,16 @@ assert.match(
|
|||||||
/任务配置[\s\S]*?评测规则/,
|
/任务配置[\s\S]*?评测规则/,
|
||||||
'评测创建向导必须按“任务配置、评测规则”定义两个步骤',
|
'评测创建向导必须按“任务配置、评测规则”定义两个步骤',
|
||||||
)
|
)
|
||||||
|
assert.match(
|
||||||
|
ruleStepSource,
|
||||||
|
/:show-description=["']false["']/,
|
||||||
|
'新建评测任务第二步不应显示重复的规则描述输入框',
|
||||||
|
)
|
||||||
|
assert.match(
|
||||||
|
dimensionFieldsSource,
|
||||||
|
/v-if=["']showDescription["'][^>]*label=["']描述["']/,
|
||||||
|
'共享维度字段必须支持按场景隐藏描述输入框',
|
||||||
|
)
|
||||||
assert.match(createSource, /currentStep\s*=\s*ref\(0\)/, '评测创建向导缺少当前步骤状态')
|
assert.match(createSource, /currentStep\s*=\s*ref\(0\)/, '评测创建向导缺少当前步骤状态')
|
||||||
assert.match(createSource, /class=["']custom-wizard-steps["']/, '评测向导未复用数据处理的自定义步骤条结构')
|
assert.match(createSource, /class=["']custom-wizard-steps["']/, '评测向导未复用数据处理的自定义步骤条结构')
|
||||||
assert.match(createSource, /class=["']step-connector["']/, '评测向导步骤条缺少连接线')
|
assert.match(createSource, /class=["']step-connector["']/, '评测向导步骤条缺少连接线')
|
||||||
|
|||||||
@@ -6,19 +6,14 @@ import DataTablePage from '@/components/DataTablePage.vue'
|
|||||||
import {
|
import {
|
||||||
getEvalList,
|
getEvalList,
|
||||||
deleteEval,
|
deleteEval,
|
||||||
getDimensionList,
|
|
||||||
deleteDimension,
|
|
||||||
} from '@/api/modules/eval'
|
} from '@/api/modules/eval'
|
||||||
import { DIMENSION_TYPE_MAP } from '@/constants'
|
import type { EvalTask } from '@/types'
|
||||||
import type { EvalTask, Dimension } from '@/types'
|
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const activeTab = ref('tasks')
|
const activeTab = ref('tasks')
|
||||||
|
|
||||||
const evalLoading = ref(false)
|
const evalLoading = ref(false)
|
||||||
const evalList = ref<EvalTask[]>([])
|
const evalList = ref<EvalTask[]>([])
|
||||||
const dimLoading = ref(false)
|
|
||||||
const dimensionList = ref<Dimension[]>([])
|
|
||||||
|
|
||||||
// 排行榜(原项目为 mock 数据)
|
// 排行榜(原项目为 mock 数据)
|
||||||
const leaderboard = ref([
|
const leaderboard = ref([
|
||||||
@@ -38,17 +33,6 @@ async function loadEvalList() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadDimensions() {
|
|
||||||
dimLoading.value = true
|
|
||||||
try {
|
|
||||||
dimensionList.value = (await getDimensionList()) || []
|
|
||||||
} catch {
|
|
||||||
dimensionList.value = []
|
|
||||||
} finally {
|
|
||||||
dimLoading.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleDeleteEval(row: any) {
|
async function handleDeleteEval(row: any) {
|
||||||
await ElMessageBox.confirm('确定要删除这个评测任务吗?', '确认删除', { type: 'warning' })
|
await ElMessageBox.confirm('确定要删除这个评测任务吗?', '确认删除', { type: 'warning' })
|
||||||
await deleteEval(row.id)
|
await deleteEval(row.id)
|
||||||
@@ -56,17 +40,6 @@ async function handleDeleteEval(row: any) {
|
|||||||
loadEvalList()
|
loadEvalList()
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleDeleteDimension(row: any) {
|
|
||||||
await ElMessageBox.confirm('确定要删除这个评测维度吗?', '确认删除', { type: 'warning' })
|
|
||||||
await deleteDimension(row.id)
|
|
||||||
ElMessage.success('删除成功')
|
|
||||||
loadDimensions()
|
|
||||||
}
|
|
||||||
|
|
||||||
function editDimension(row: any) {
|
|
||||||
router.push(`/model-eval/dimension/${row.id}/edit`)
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleCreateClick() {
|
function handleCreateClick() {
|
||||||
router.push('/model-eval/create')
|
router.push('/model-eval/create')
|
||||||
}
|
}
|
||||||
@@ -81,7 +54,6 @@ function handleViewDetail(row: any) {
|
|||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
loadEvalList()
|
loadEvalList()
|
||||||
loadDimensions()
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -103,7 +75,6 @@ onMounted(() => {
|
|||||||
<div class="capsule-tabs">
|
<div class="capsule-tabs">
|
||||||
<button class="capsule-tab-item" :class="{ active: isActiveTab('tasks') }" @click="activeTab = 'tasks'">评测任务</button>
|
<button class="capsule-tab-item" :class="{ active: isActiveTab('tasks') }" @click="activeTab = 'tasks'">评测任务</button>
|
||||||
<button class="capsule-tab-item" :class="{ active: isActiveTab('leaderboard') }" @click="activeTab = 'leaderboard'">排行榜</button>
|
<button class="capsule-tab-item" :class="{ active: isActiveTab('leaderboard') }" @click="activeTab = 'leaderboard'">排行榜</button>
|
||||||
<button class="capsule-tab-item" :class="{ active: isActiveTab('dimensions') }" @click="activeTab = 'dimensions'">评测维度</button>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #columns>
|
<template #columns>
|
||||||
@@ -136,7 +107,6 @@ onMounted(() => {
|
|||||||
<div class="capsule-tabs">
|
<div class="capsule-tabs">
|
||||||
<button class="capsule-tab-item" :class="{ active: isActiveTab('tasks') }" @click="activeTab = 'tasks'">评测任务</button>
|
<button class="capsule-tab-item" :class="{ active: isActiveTab('tasks') }" @click="activeTab = 'tasks'">评测任务</button>
|
||||||
<button class="capsule-tab-item" :class="{ active: isActiveTab('leaderboard') }" @click="activeTab = 'leaderboard'">排行榜</button>
|
<button class="capsule-tab-item" :class="{ active: isActiveTab('leaderboard') }" @click="activeTab = 'leaderboard'">排行榜</button>
|
||||||
<button class="capsule-tab-item" :class="{ active: isActiveTab('dimensions') }" @click="activeTab = 'dimensions'">评测维度</button>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #columns>
|
<template #columns>
|
||||||
@@ -146,43 +116,6 @@ onMounted(() => {
|
|||||||
</template>
|
</template>
|
||||||
</DataTablePage>
|
</DataTablePage>
|
||||||
|
|
||||||
<!-- 评测维度 -->
|
|
||||||
<DataTablePage
|
|
||||||
v-if="activeTab === 'dimensions'"
|
|
||||||
title=""
|
|
||||||
:data="dimensionList"
|
|
||||||
:loading="dimLoading"
|
|
||||||
:delete-fn="handleDeleteDimension"
|
|
||||||
row-key="id"
|
|
||||||
@refresh="loadDimensions"
|
|
||||||
>
|
|
||||||
<template #title>
|
|
||||||
<div class="capsule-tabs">
|
|
||||||
<button class="capsule-tab-item" :class="{ active: isActiveTab('tasks') }" @click="activeTab = 'tasks'">评测任务</button>
|
|
||||||
<button class="capsule-tab-item" :class="{ active: isActiveTab('leaderboard') }" @click="activeTab = 'leaderboard'">排行榜</button>
|
|
||||||
<button class="capsule-tab-item" :class="{ active: isActiveTab('dimensions') }" @click="activeTab = 'dimensions'">评测维度</button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template #columns>
|
|
||||||
<el-table-column label="维度名称" prop="name" align="center" />
|
|
||||||
<el-table-column label="类型" align="center" width="160">
|
|
||||||
<template #default="{ row }">
|
|
||||||
{{ DIMENSION_TYPE_MAP[row.type] || row.type }}
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="描述" prop="description" show-overflow-tooltip align="center" />
|
|
||||||
<el-table-column label="状态" align="center" width="100">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<el-tag v-if="row.is_active" type="success" size="small">启用</el-tag>
|
|
||||||
<el-tag v-else type="info" size="small">禁用</el-tag>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</template>
|
|
||||||
<template #actions="{ row }">
|
|
||||||
<el-button link type="primary" size="small" @click="editDimension(row)">编辑</el-button>
|
|
||||||
<el-button link type="danger" size="small" @click="handleDeleteDimension(row)">删除</el-button>
|
|
||||||
</template>
|
|
||||||
</DataTablePage>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,15 @@ export interface DimensionFormDraft {
|
|||||||
pass_threshold: number
|
pass_threshold: number
|
||||||
}
|
}
|
||||||
|
|
||||||
defineProps<{ evalModels: ModelItem[] }>()
|
withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
evalModels: ModelItem[]
|
||||||
|
showDescription?: boolean
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
showDescription: true,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
const form = defineModel<DimensionFormDraft>({ required: true })
|
const form = defineModel<DimensionFormDraft>({ required: true })
|
||||||
|
|
||||||
@@ -66,7 +74,7 @@ watch(
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="描述">
|
<el-form-item v-if="showDescription" label="描述">
|
||||||
<el-input v-model="form.description" type="textarea" :rows="2" maxlength="200" show-word-limit />
|
<el-input v-model="form.description" type="textarea" :rows="2" maxlength="200" show-word-limit />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,11 @@ defineExpose({ validate })
|
|||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
scroll-to-error
|
scroll-to-error
|
||||||
>
|
>
|
||||||
<DimensionFormFields v-model="form.newDimension" :eval-models="evalModels" />
|
<DimensionFormFields
|
||||||
|
v-model="form.newDimension"
|
||||||
|
:eval-models="evalModels"
|
||||||
|
:show-description="false"
|
||||||
|
/>
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Reference in New Issue
Block a user