This commit is contained in:
2026-08-27 11:04:56 +08:00
parent 0ca8f4c3ab
commit bb7bac3dee
30 changed files with 171 additions and 260 deletions
+14 -22
View File
@@ -1,7 +1,7 @@
<script setup>
import { onBeforeUnmount, onMounted, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus, Picture, Setting, VideoPlay, Download } from '@element-plus/icons-vue'
import { Plus, Picture, Setting, VideoPlay } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
import request from '../api/request'
@@ -14,7 +14,7 @@ const size = ref(12)
const keyword = ref('')
const createVisible = ref(false)
const createForm = reactive({ name: '', source: 'manual' })
const createForm = reactive({ name: '' })
const creating = ref(false)
const configVisible = ref(false)
@@ -55,7 +55,6 @@ function search() {
function openCreate() {
createForm.name = ''
createForm.source = 'manual'
createVisible.value = true
}
@@ -66,7 +65,7 @@ function submitCreate() {
}
creating.value = true
request
.post('/datasets', { name: createForm.name.trim(), source: createForm.source })
.post('/datasets', { name: createForm.name.trim(), source: 'manual' })
.then(() => {
ElMessage.success('数据集已创建,请上传或生成图片')
createVisible.value = false
@@ -88,8 +87,10 @@ function openConfig(row) {
})
coverFile.value = null
coverDeleted.value = false
// 已有封面回显:el-upload picture-card 直接以 url 项展示
coverFileList.value = row.cover ? [{ name: '当前封面', url: imgUrl(`/api/v1/admin/datasets/cover?datasetId=${row.id}`) }] : []
// 已有封面回显:el-upload picture-card 直接以 url 项展示(带版本参数防浏览器缓存旧封面)
coverFileList.value = row.cover
? [{ name: '当前封面', url: imgUrl(`/api/v1/admin/datasets/cover?datasetId=${row.id}&v=${encodeURIComponent(row.updatedAt || '')}`) }]
: []
configVisible.value = true
}
@@ -150,11 +151,7 @@ function startTrain(row) {
})
}
// ---------- 导出 / 删除 ----------
function exportDataset(row) {
window.open(`${location.origin}/api/v1/admin/datasets/export?datasetId=${row.id}`, '_blank')
}
// ---------- 删除 ----------
function removeDataset(row) {
const warn =
@@ -181,7 +178,8 @@ function imgUrl(u) {
function coverUrl(row) {
if (!row.cover) return ''
return imgUrl(`/api/v1/admin/datasets/cover?datasetId=${row.id}`)
// v=updatedAt 版本参数:换封面后 URL 变化,强制浏览器重新拉取
return imgUrl(`/api/v1/admin/datasets/cover?datasetId=${row.id}&v=${encodeURIComponent(row.updatedAt || '')}`)
}
// 训练进度(百分比):有总轮数才显示比例
@@ -265,7 +263,6 @@ onBeforeUnmount(() => {
{{ row.trainingStatus === 'running' ? '训练中' : '开始训练' }}
</el-button>
<el-button size="small" :icon="Setting" @click="openConfig(row)">配置</el-button>
<el-button size="small" :icon="Download" @click="exportDataset(row)">导出</el-button>
<el-button size="small" type="danger" @click="removeDataset(row)">删除</el-button>
</div>
@@ -283,7 +280,8 @@ onBeforeUnmount(() => {
{{ trainStatusMap[row.trainingStatus] || row.trainingStatus }}
</el-tag>
</el-tooltip>
<el-tag v-else :type="trainStatusTag[row.trainingStatus] || 'info'" size="small">
<!-- 训练成功不显示已训练标签只保留发布按钮 -->
<el-tag v-else-if="row.trainingStatus !== 'success'" :type="trainStatusTag[row.trainingStatus] || 'info'" size="small">
{{ trainStatusMap[row.trainingStatus] || row.trainingStatus }}
</el-tag>
<el-button v-if="row.trainingStatus === 'success' && row.trainingId" size="small" type="success" @click="publishModel(row)">
@@ -316,12 +314,6 @@ onBeforeUnmount(() => {
placeholder="中文/字母/数字/下划线/短横线,唯一且作磁盘目录名"
/>
</el-form-item>
<el-form-item label="图片来源">
<el-radio-group v-model="createForm.source">
<el-radio value="manual">手动上传</el-radio>
<el-radio value="ai">AI 生成</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="createVisible = false">取消</el-button>
@@ -404,13 +396,13 @@ onBeforeUnmount(() => {
}
.ds-cover {
position: relative;
height: 150px;
aspect-ratio: 16 / 9;
background: #f5f7fa;
}
.ds-cover img {
width: 100%;
height: 100%;
object-fit: contain;
object-fit: cover;
display: block;
}
.ds-cover-placeholder {