122 lines
3.8 KiB
Vue
122 lines
3.8 KiB
Vue
<template>
|
||
<div class="ds-page">
|
||
<div class="ds-head">
|
||
<el-button type="primary" @click="openCreate">新建数据集</el-button>
|
||
</div>
|
||
<el-table :data="datasets" v-loading="loading" empty-text="暂无数据集">
|
||
<el-table-column prop="name" label="名称" min-width="160" show-overflow-tooltip />
|
||
<el-table-column prop="description" label="描述" min-width="200" show-overflow-tooltip />
|
||
<el-table-column label="向量模型" width="200">
|
||
<template #default="{ row }">
|
||
<span v-if="row.embedding_cfg_id">{{ embeddingName(row.embedding_cfg_id) }}</span>
|
||
<el-tag v-else size="small" type="info">未绑定(仅全文检索)</el-tag>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="created_at" label="创建时间" width="170" />
|
||
<el-table-column label="操作" width="150" fixed="right">
|
||
<template #default="{ row }">
|
||
<el-button link type="primary" @click="$router.push('/datasets/' + row.id)">详情</el-button>
|
||
<el-button link type="danger" @click="remove(row)">删除</el-button>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
|
||
<el-dialog v-model="dialogVisible" :title="editing ? '编辑数据集' : '新建数据集'" width="480px">
|
||
<el-form :model="form" label-width="90px">
|
||
<el-form-item label="名称" required>
|
||
<el-input v-model="form.name" placeholder="如:产品手册" />
|
||
</el-form-item>
|
||
<el-form-item label="描述">
|
||
<el-input v-model="form.description" type="textarea" :rows="2" />
|
||
</el-form-item>
|
||
<el-form-item label="向量模型">
|
||
<el-select v-model="form.embedding_cfg_id" clearable placeholder="不绑定则仅全文检索" style="width: 100%">
|
||
<el-option v-for="m in embedders" :key="m.id" :label="m.name" :value="m.id" />
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-form>
|
||
<template #footer>
|
||
<el-button @click="dialogVisible = false">取消</el-button>
|
||
<el-button type="primary" :loading="saving" @click="save">保存</el-button>
|
||
</template>
|
||
</el-dialog>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { onMounted, ref } from 'vue'
|
||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||
import { listDatasets, saveDataset, deleteDataset } from '../api/dataset.js'
|
||
import { listModelConfigs } from '../api/model_config.js'
|
||
|
||
const datasets = ref([])
|
||
const embedders = ref([])
|
||
const loading = ref(false)
|
||
const saving = ref(false)
|
||
const dialogVisible = ref(false)
|
||
const editing = ref(false)
|
||
const form = ref({ id: 0, name: '', description: '', embedding_cfg_id: 0 })
|
||
|
||
onMounted(async () => {
|
||
await load()
|
||
try {
|
||
embedders.value = await listModelConfigs('embedding')
|
||
} catch { /* 忽略 */ }
|
||
})
|
||
|
||
async function load() {
|
||
loading.value = true
|
||
try {
|
||
datasets.value = await listDatasets()
|
||
} finally {
|
||
loading.value = false
|
||
}
|
||
}
|
||
|
||
function embeddingName(id) {
|
||
const m = embedders.value.find(x => x.id === id)
|
||
return m ? m.name : '(已删除的配置)'
|
||
}
|
||
|
||
function openCreate() {
|
||
editing.value = false
|
||
form.value = { id: 0, name: '', description: '', embedding_cfg_id: 0 }
|
||
dialogVisible.value = true
|
||
}
|
||
|
||
async function save() {
|
||
if (!form.value.name.trim()) {
|
||
ElMessage.warning('请输入数据集名称')
|
||
return
|
||
}
|
||
saving.value = true
|
||
try {
|
||
await saveDataset(form.value)
|
||
ElMessage.success('保存成功')
|
||
dialogVisible.value = false
|
||
await load()
|
||
} finally {
|
||
saving.value = false
|
||
}
|
||
}
|
||
|
||
async function remove(row) {
|
||
try {
|
||
await ElMessageBox.confirm(`删除数据集「${row.name}」?`, '删除确认', { type: 'warning' })
|
||
} catch {
|
||
return
|
||
}
|
||
try {
|
||
await deleteDataset(row.id)
|
||
ElMessage.success('已删除')
|
||
await load()
|
||
} catch { /* request.js 已提示 */ }
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
.ds-head {
|
||
margin-bottom: 12px;
|
||
}
|
||
</style>
|