知识库相关

This commit is contained in:
2026-05-27 15:29:18 +08:00
parent 0d946c050e
commit 4174c424fc
5 changed files with 237 additions and 182 deletions

View File

@@ -1,62 +1,61 @@
<template>
<el-dialog :title="isEdit ? '编辑数据集' : '新增数据集'" v-model="isShowDialog" width="600px" :close-on-click-modal="false" @close="onCancel">
<el-form ref="formRef" :model="ruleForm" :rules="rules" label-width="100px">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="数据集名称" prop="name">
<el-input v-model="ruleForm.name" placeholder="请输入数据集名称" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="数据集类型" prop="type">
<el-select v-model="ruleForm.type" placeholder="请选择类型" clearable style="width: 100%">
<el-option label="文本" value="text" />
<el-option label="问答" value="qa" />
<el-option label="表格" value="table" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="向量模型" prop="embeddingModel">
<el-select v-model="ruleForm.embeddingModel" placeholder="请选择向量模型" clearable style="width: 100%">
<el-option label="text-embedding-ada-002" value="text-embedding-ada-002" />
<el-option label="text-embedding-3-small" value="text-embedding-3-small" />
<el-option label="text-embedding-3-large" value="text-embedding-3-large" />
<el-option label="bge-large-zh" value="bge-large-zh" />
<el-option label="m3e-base" value="m3e-base" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="描述" prop="description">
<el-input v-model="ruleForm.description" type="textarea" :rows="4" placeholder="请输入数据集描述" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="isEdit">
<el-col :span="12">
<el-form-item label="文档数量">
<el-input :value="ruleForm.documentCount" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="字符数量">
<el-input :value="ruleForm.charCount" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="onCancel"> </el-button>
<el-button type="primary" @click="onSubmit" :loading="submitLoading">{{ isEdit ? '保 存' : '创 建' }}</el-button>
</span>
</template>
</el-dialog>
<el-dialog :title="isEdit ? '编辑数据集' : '新增数据集'" v-model="isShowDialog" width="600px" :close-on-click-modal="false" @close="onCancel">
<el-form ref="formRef" :model="ruleForm" :rules="rules" label-width="100px">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="数据集名称" prop="name">
<el-input v-model="ruleForm.name" placeholder="请输入数据集名称" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="数据集类型" prop="datasetType">
<el-select v-model="ruleForm.datasetType" placeholder="请选择类型" clearable style="width: 100%">
<el-option label="文本" :value="1" />
<el-option label="视频" :value="2" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="向量模型" prop="embeddingModel">
<el-select v-model="ruleForm.embeddingModel" placeholder="请选择向量模型" clearable style="width: 100%">
<el-option label="text-embedding-ada-002" value="text-embedding-ada-002" />
<el-option label="text-embedding-3-small" value="text-embedding-3-small" />
<el-option label="text-embedding-3-large" value="text-embedding-3-large" />
<el-option label="bge-large-zh" value="bge-large-zh" />
<el-option label="m3e-base" value="m3e-base" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="描述" prop="description">
<el-input v-model="ruleForm.description" type="textarea" :rows="4" placeholder="请输入数据集描述" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="isEdit">
<el-col :span="12">
<el-form-item label="文档数量">
<el-input :value="ruleForm.documentCount" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="字符数量">
<el-input :value="ruleForm.charCount" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="onCancel"> </el-button>
<el-button type="primary" @click="onSubmit" :loading="submitLoading">{{ isEdit ? '保 存' : '创 建' }}</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts">
@@ -86,7 +85,7 @@ const submitLoading = ref(false);
const ruleForm = reactive({
id: '',
name: '',
type: 'text',
datasetType: 1 as number,
description: '',
embeddingModel: 'text-embedding-ada-002',
documentCount: 0,
@@ -96,7 +95,7 @@ const ruleForm = reactive({
// 表单验证规则
const rules = reactive<FormRules>({
name: [{ required: true, message: '请输入数据集名称', trigger: 'blur' }],
type: [{ required: true, message: '请选择数据集类型', trigger: 'change' }],
datasetType: [{ required: true, message: '请选择数据集类型', trigger: 'change' }],
embeddingModel: [{ required: true, message: '请选择向量模型', trigger: 'change' }],
});
@@ -104,7 +103,7 @@ const rules = reactive<FormRules>({
const resetForm = () => {
ruleForm.id = '';
ruleForm.name = '';
ruleForm.type = 'text';
ruleForm.datasetType = 1;
ruleForm.description = '';
ruleForm.embeddingModel = 'text-embedding-ada-002';
ruleForm.documentCount = 0;
@@ -122,7 +121,7 @@ const openDialog = async (row?: any) => {
const data = res.data || row;
ruleForm.id = data.id || '';
ruleForm.name = data.name || '';
ruleForm.type = data.type || 'text';
ruleForm.datasetType = data.datasetType || 1;
ruleForm.description = data.description || '';
ruleForm.embeddingModel = data.embeddingModel || 'text-embedding-ada-002';
ruleForm.documentCount = data.documentCount || 0;
@@ -132,7 +131,7 @@ const openDialog = async (row?: any) => {
// 使用传入的row数据
ruleForm.id = row.id || '';
ruleForm.name = row.name || '';
ruleForm.type = row.type || 'text';
ruleForm.datasetType = row.datasetType || 1;
ruleForm.description = row.description || '';
ruleForm.embeddingModel = row.embeddingModel || 'text-embedding-ada-002';
ruleForm.documentCount = row.documentCount || 0;
@@ -161,7 +160,7 @@ const onSubmit = async () => {
const data = {
id: ruleForm.id || undefined,
name: ruleForm.name,
type: ruleForm.type,
datasetType: ruleForm.datasetType,
description: ruleForm.description,
embeddingModel: ruleForm.embeddingModel,
status: 'enable',

View File

@@ -1,107 +1,106 @@
<template>
<div class="knowledge-knowledge-page">
<div class="knowledge-knowledge-container">
<el-card shadow="hover">
<div class="knowledge-knowledge-search mb15">
<el-form :inline="true">
<el-form-item label="数据集名称">
<el-input size="default" v-model="tableData.param.keyword" placeholder="请输入数据集名称" clearable style="width: 200px" />
</el-form-item>
<el-form-item label="数据集类型">
<el-select size="default" v-model="tableData.param.type" placeholder="请选择类型" clearable style="width: 150px">
<el-option label="文本" value="text" />
<el-option label="问答" value="qa" />
<el-option label="表格" value="table" />
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-select size="default" v-model="tableData.param.status" placeholder="请选择状态" clearable style="width: 120px">
<el-option label="用" value="enable" />
<el-option label="禁用" value="disable" />
</el-select>
</el-form-item>
<el-form-item>
<el-button size="default" type="primary" @click="getknowledgeList">
<el-icon><ele-Search /></el-icon>
查询
</el-button>
<el-button size="default" @click="onResetQuery">
<el-icon><ele-Refresh /></el-icon>
重置
</el-button>
<el-button size="default" type="success" @click="onOpenAdd" v-auth="'api/v1/knowledge/knowledge/create'">
<el-icon><ele-Plus /></el-icon>
新增
</el-button>
</el-form-item>
</el-form>
</div>
<el-table :data="tableData.data" style="width: 100%" v-loading="tableData.loading" border>
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="name" label="数据集名称" min-width="180" show-overflow-tooltip>
<template #default="scope">
<el-link type="primary" @click="onViewDetail(scope.row)">{{ scope.row.name }}</el-link>
</template>
</el-table-column>
<el-table-column prop="type" label="类型" width="100" align="center">
<template #default="scope">
<el-tag :type="getTypeTagType(scope.row.type)">{{ getTypeText(scope.row.type) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="documentCount" label="文档数" width="100" align="center" />
<el-table-column prop="charCount" label="字符数" width="120" align="center">
<template #default="scope">
{{ formatCharCount(scope.row.charCount) }}
</template>
</el-table-column>
<el-table-column prop="embeddingModel" label="向量模型" width="150" show-overflow-tooltip />
<el-table-column prop="status" label="状态" width="80" align="center">
<template #default="scope">
<el-switch
v-model="scope.row.statusEnabled"
inline-prompt
active-text=""
inactive-text=""
@change="onStatusChange(scope.row)"
v-auth="'api/v1/knowledge/knowledge/updateStatus'"
/>
</template>
</el-table-column>
<el-table-column prop="createdAt" label="创建时间" width="170" show-overflow-tooltip />
<el-table-column prop="updatedAt" label="更新时间" width="170" show-overflow-tooltip />
<el-table-column label="操作" width="200" fixed="right" align="center">
<template #default="scope">
<el-button size="small" text type="primary" @click="onEdit(scope.row)" v-auth="'api/v1/knowledge/knowledge/update'">编辑</el-button>
<el-button size="small" text type="success" @click="onManageDocuments(scope.row)">文档</el-button>
<el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'api/v1/knowledge/knowledge/delete'">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<div class="mt15" style="text-align: right">
<el-pagination
v-model:current-page="tableData.param.pageNum"
v-model:page-size="tableData.param.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="tableData.total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="onSizeChange"
@current-change="onCurrentChange"
/>
</div>
</el-card>
<div class="knowledge-knowledge-page">
<div class="knowledge-knowledge-container">
<el-card shadow="hover">
<div class="knowledge-knowledge-search mb15">
<el-form :inline="true">
<el-form-item label="数据集名称">
<el-input size="default" v-model="tableData.param.keyword" placeholder="请输入数据集名称" clearable style="width: 200px" />
</el-form-item>
<el-form-item label="数据集类型">
<el-select size="default" v-model="tableData.param.datasetType" placeholder="请选择类型" clearable style="width: 150px">
<el-option label="文本" :value="1" />
<el-option label="视频" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-select size="default" v-model="tableData.param.status" placeholder="请选择状态" clearable style="width: 120px">
<el-option label="启用" value="enable" />
<el-option label="用" value="disable" />
</el-select>
</el-form-item>
<el-form-item>
<el-button size="default" type="primary" @click="getknowledgeList">
<el-icon><ele-Search /></el-icon>
查询
</el-button>
<el-button size="default" @click="onResetQuery">
<el-icon><ele-Refresh /></el-icon>
重置
</el-button>
<el-button size="default" type="success" @click="onOpenAdd" v-auth="'api/v1/knowledge/knowledge/create'">
<el-icon><ele-Plus /></el-icon>
新增
</el-button>
</el-form-item>
</el-form>
</div>
<el-table :data="tableData.data" style="width: 100%" v-loading="tableData.loading" border>
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="name" label="数据集名称" min-width="180" show-overflow-tooltip>
<template #default="scope">
<el-link type="primary" @click="onViewDetail(scope.row)">{{ scope.row.name }}</el-link>
</template>
</el-table-column>
<el-table-column prop="datasetType" label="类型" width="100" align="center">
<template #default="scope">
<el-tag :type="getTypeTagType(scope.row.datasetType)">{{ getTypeText(scope.row.datasetType) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="documentCount" label="文档数" width="100" align="center" />
<el-table-column prop="charCount" label="字符数" width="120" align="center">
<template #default="scope">
{{ formatCharCount(scope.row.charCount) }}
</template>
</el-table-column>
<el-table-column prop="embeddingModel" label="向量模型" width="150" show-overflow-tooltip />
<el-table-column prop="status" label="状态" width="80" align="center">
<template #default="scope">
<el-switch
v-model="scope.row.statusEnabled"
inline-prompt
active-text=""
inactive-text=""
@change="onStatusChange(scope.row)"
v-auth="'api/v1/knowledge/knowledge/updateStatus'"
/>
</template>
</el-table-column>
<el-table-column prop="createdAt" label="创建时间" width="170" show-overflow-tooltip />
<el-table-column prop="updatedAt" label="更新时间" width="170" show-overflow-tooltip />
<el-table-column label="操作" width="200" fixed="right" align="center">
<template #default="scope">
<el-button size="small" text type="primary" @click="onEdit(scope.row)" v-auth="'api/v1/knowledge/knowledge/update'">编辑</el-button>
<el-button size="small" text type="success" @click="onManageDocuments(scope.row)">文档</el-button>
<el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'api/v1/knowledge/knowledge/delete'">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<div class="mt15" style="text-align: right">
<el-pagination
v-model:current-page="tableData.param.pageNum"
v-model:page-size="tableData.param.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="tableData.total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="onSizeChange"
@current-change="onCurrentChange"
/>
</div>
</el-card>
</div>
<Editknowledge ref="editknowledgeRef" @getknowledgeList="getknowledgeList" />
</div>
<Editknowledge ref="editknowledgeRef" @getknowledgeList="getknowledgeList" />
</div>
</template>
</template>
<script lang="ts">
<script lang="ts">
export default {
name: 'knowledgeknowledge',
};
</script>
</script>
<script setup lang="ts">
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { ElMessage, ElMessageBox } from 'element-plus';
@@ -117,7 +116,7 @@ const tableData = reactive({
loading: false,
param: {
keyword: '',
type: '',
datasetType: undefined as number | undefined,
status: undefined as string | undefined,
pageNum: 1,
pageSize: 10,
@@ -148,30 +147,26 @@ const getknowledgeList = async () => {
};
// 获取类型标签类型
const getTypeTagType = (type: string) => {
switch (type) {
case 'text':
const getTypeTagType = (datasetType: number) => {
switch (datasetType) {
case 1:
return 'primary';
case 'qa':
case 2:
return 'success';
case 'table':
return 'warning';
default:
return 'info';
}
};
// 获取类型文本
const getTypeText = (type: string) => {
switch (type) {
case 'text':
const getTypeText = (datasetType: number) => {
switch (datasetType) {
case 1:
return '文本';
case 'qa':
return '问答';
case 'table':
return '表格';
case 2:
return '视频';
default:
return type;
return String(datasetType);
}
};
@@ -187,7 +182,7 @@ const formatCharCount = (count: number) => {
// 重置查询
const onResetQuery = () => {
tableData.param.keyword = '';
tableData.param.type = '';
tableData.param.datasetType = undefined;
tableData.param.status = undefined;
tableData.param.pageNum = 1;
getknowledgeList();
@@ -261,9 +256,9 @@ const onCurrentChange = (page: number) => {
onMounted(() => {
getknowledgeList();
});
</script>
</script>
<style scoped lang="scss">
<style scoped lang="scss">
.knowledge-knowledge-page {
padding: 15px;
.knowledge-knowledge-container {
@@ -274,4 +269,4 @@ onMounted(() => {
}
}
}
</style>
</style>