1
This commit is contained in:
@@ -28,7 +28,7 @@ const coverFile = ref(null) // 新选择的封面文件(el-upload 单文件)
|
||||
const coverFileList = ref([]) // 封面回显:已有封面(服务端 url)或新选文件(本地预览)
|
||||
const coverDeleted = ref(false) // 用户删除了已有封面(保存时调删除接口)
|
||||
|
||||
const training = ref(false)
|
||||
const trainingIds = reactive(new Set()) // 训练发起中的数据集 id(请求期间按钮置灰防重复点击)
|
||||
|
||||
const statusMap = { building: '建设中', labeled: '已标注', synced: '已同步' }
|
||||
const statusTag = { building: 'info', labeled: 'success', synced: 'primary' }
|
||||
@@ -134,16 +134,19 @@ async function submitConfig() {
|
||||
// ---------- 开始训练(一键发起:任务名自动生成,参数走 config.yml training 节点) ----------
|
||||
|
||||
function startTrain(row) {
|
||||
training.value = true
|
||||
if (trainingIds.has(row.id)) return
|
||||
trainingIds.add(row.id)
|
||||
request
|
||||
.post('/trainings', { datasetId: row.id })
|
||||
// 后端已异步化(请求只做校验+落记录),60s 仅作兜底
|
||||
.post('/trainings', { datasetId: row.id }, { timeout: 60000 })
|
||||
.then(() => {
|
||||
ElMessage.success('训练任务已发起,完成后可发布为模型版本')
|
||||
load()
|
||||
})
|
||||
.catch(() => {})
|
||||
.finally(() => {
|
||||
training.value = false
|
||||
trainingIds.delete(row.id)
|
||||
// 请求失败也可能已落 running 记录(如响应异常),一律刷新拿真实状态
|
||||
load()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -251,7 +254,14 @@ onBeforeUnmount(() => {
|
||||
</div>
|
||||
</div>
|
||||
<div class="ds-actions" @click.stop>
|
||||
<el-button type="primary" size="small" :icon="VideoPlay" :disabled="row.trainingStatus === 'running'" @click="startTrain(row)">
|
||||
<el-button
|
||||
type="primary"
|
||||
size="small"
|
||||
:icon="VideoPlay"
|
||||
:loading="trainingIds.has(row.id)"
|
||||
:disabled="trainingIds.has(row.id) || row.trainingStatus === 'running'"
|
||||
@click="startTrain(row)"
|
||||
>
|
||||
{{ row.trainingStatus === 'running' ? '训练中' : '开始训练' }}
|
||||
</el-button>
|
||||
<el-button size="small" :icon="Setting" @click="openConfig(row)">配置</el-button>
|
||||
|
||||
Reference in New Issue
Block a user