知识库相关

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

@@ -5,30 +5,42 @@ export interface knowledgeQueryParams {
keyword?: string; keyword?: string;
pageNum: number; pageNum: number;
pageSize: number; pageSize: number;
datasetType?: number; // 1=文本2=视频
} }
// 创建知识库参数 // 创建知识库参数
export interface CreateknowledgeParams { export interface CreateknowledgeParams {
name: string; // 必传 name: string; // 必传
datasetType: number; // 1=文本2=视频
description?: string; // 可选 description?: string; // 可选
embeddingModel?: string; // 向量模型
status?: string; // 状态
} }
// 更新知识库参数 // 更新知识库参数
export interface UpdateknowledgeParams { export interface UpdateknowledgeParams {
id: string; // 必传 id: string; // 必传
name?: string; // 可选 name?: string; // 可选
datasetType?: number; // 1=文本2=视频
description?: string; // 可选 description?: string; // 可选
embeddingModel?: string; // 向量模型
status?: string; // 状态
} }
// 数据集信息 // 数据集信息
export interface knowledgeInfo { export interface knowledgeInfo {
id?: string; id?: string;
name: string; name: string;
datasetType?: number; // 1=文本2=视频
description?: string; description?: string;
fileCount?: number; fileCount?: number;
totalSize?: number; totalSize?: number;
createdAt?: string; createdAt?: string;
updatedAt?: string; updatedAt?: string;
embeddingModel?: string; // 向量模型
documentCount?: number; // 文档数量
charCount?: number; // 字符数量
status?: string; // 状态
} }
// 获取知识库列表 // 获取知识库列表

View File

@@ -48,6 +48,42 @@ const messages = ref<Message[]>([
time: '09:31', time: '09:31',
isUser: false, isUser: false,
}, },
{
id: 4,
content: '当然可以,这个系统提供了多种功能:日记、文件、快捷指令、快捷回复,以及技能管理和模型管理入口。你想先看哪一块?',
time: '09:31',
isUser: true,
},
{
id: 5,
content: '当然可以,这个系统提供了多种功能:日记、文件、快捷指令、快捷回复,以及技能管理和模型管理入口。你想先看哪一块?',
time: '09:31',
isUser: false,
},
{
id: 6,
content: '当然可以,这个系统提供了多种功能:日记、文件、快捷指令、快捷回复,以及技能管理和模型管理入口。你想先看哪一块?',
time: '09:31',
isUser: true,
},
{
id: 7,
content: '当然可以,这个系统提供了多种功能:日记、文件、快捷指令、快捷回复,以及技能管理和模型管理入口。你想先看哪一块?',
time: '09:31',
isUser: false,
},
{
id: 8,
content: '当然可以,这个系统提供了多种功能:日记、文件、快捷指令、快捷回复,以及技能管理和模型管理入口。你想先看哪一块?',
time: '09:31',
isUser: true,
},
{
id: 9,
content: '当然可以,这个系统提供了多种功能:日记、文件、快捷指令、快捷回复,以及技能管理和模型管理入口。你想先看哪一块?',
time: '09:31',
isUser: false,
},
]); ]);
</script> </script>

View File

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

View File

@@ -8,10 +8,9 @@
<el-input size="default" v-model="tableData.param.keyword" placeholder="请输入数据集名称" clearable style="width: 200px" /> <el-input size="default" v-model="tableData.param.keyword" placeholder="请输入数据集名称" clearable style="width: 200px" />
</el-form-item> </el-form-item>
<el-form-item label="数据集类型"> <el-form-item label="数据集类型">
<el-select size="default" v-model="tableData.param.type" placeholder="请选择类型" clearable style="width: 150px"> <el-select size="default" v-model="tableData.param.datasetType" placeholder="请选择类型" clearable style="width: 150px">
<el-option label="文本" value="text" /> <el-option label="文本" :value="1" />
<el-option label="问答" value="qa" /> <el-option label="视频" :value="2" />
<el-option label="表格" value="table" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="状态"> <el-form-item label="状态">
@@ -43,9 +42,9 @@
<el-link type="primary" @click="onViewDetail(scope.row)">{{ scope.row.name }}</el-link> <el-link type="primary" @click="onViewDetail(scope.row)">{{ scope.row.name }}</el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="type" label="类型" width="100" align="center"> <el-table-column prop="datasetType" label="类型" width="100" align="center">
<template #default="scope"> <template #default="scope">
<el-tag :type="getTypeTagType(scope.row.type)">{{ getTypeText(scope.row.type) }}</el-tag> <el-tag :type="getTypeTagType(scope.row.datasetType)">{{ getTypeText(scope.row.datasetType) }}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="documentCount" label="文档数" width="100" align="center" /> <el-table-column prop="documentCount" label="文档数" width="100" align="center" />
@@ -93,15 +92,15 @@
</div> </div>
<Editknowledge ref="editknowledgeRef" @getknowledgeList="getknowledgeList" /> <Editknowledge ref="editknowledgeRef" @getknowledgeList="getknowledgeList" />
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
export default { export default {
name: 'knowledgeknowledge', name: 'knowledgeknowledge',
}; };
</script> </script>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'; import { ref, reactive, onMounted } from 'vue';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { ElMessage, ElMessageBox } from 'element-plus'; import { ElMessage, ElMessageBox } from 'element-plus';
@@ -117,7 +116,7 @@ const tableData = reactive({
loading: false, loading: false,
param: { param: {
keyword: '', keyword: '',
type: '', datasetType: undefined as number | undefined,
status: undefined as string | undefined, status: undefined as string | undefined,
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
@@ -148,30 +147,26 @@ const getknowledgeList = async () => {
}; };
// 获取类型标签类型 // 获取类型标签类型
const getTypeTagType = (type: string) => { const getTypeTagType = (datasetType: number) => {
switch (type) { switch (datasetType) {
case 'text': case 1:
return 'primary'; return 'primary';
case 'qa': case 2:
return 'success'; return 'success';
case 'table':
return 'warning';
default: default:
return 'info'; return 'info';
} }
}; };
// 获取类型文本 // 获取类型文本
const getTypeText = (type: string) => { const getTypeText = (datasetType: number) => {
switch (type) { switch (datasetType) {
case 'text': case 1:
return '文本'; return '文本';
case 'qa': case 2:
return '问答'; return '视频';
case 'table':
return '表格';
default: default:
return type; return String(datasetType);
} }
}; };
@@ -187,7 +182,7 @@ const formatCharCount = (count: number) => {
// 重置查询 // 重置查询
const onResetQuery = () => { const onResetQuery = () => {
tableData.param.keyword = ''; tableData.param.keyword = '';
tableData.param.type = ''; tableData.param.datasetType = undefined;
tableData.param.status = undefined; tableData.param.status = undefined;
tableData.param.pageNum = 1; tableData.param.pageNum = 1;
getknowledgeList(); getknowledgeList();
@@ -261,9 +256,9 @@ const onCurrentChange = (page: number) => {
onMounted(() => { onMounted(() => {
getknowledgeList(); getknowledgeList();
}); });
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.knowledge-knowledge-page { .knowledge-knowledge-page {
padding: 15px; padding: 15px;
.knowledge-knowledge-container { .knowledge-knowledge-container {
@@ -274,4 +269,4 @@ onMounted(() => {
} }
} }
} }
</style> </style>

View File

@@ -233,6 +233,12 @@
<el-form-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input v-model="knowledgeForm.name" placeholder="请输入知识库名称" /> <el-input v-model="knowledgeForm.name" placeholder="请输入知识库名称" />
</el-form-item> </el-form-item>
<el-form-item label="数据集类型" prop="datasetType">
<el-select v-model="knowledgeForm.datasetType" placeholder="请选择类型" clearable style="width: 100%">
<el-option label="文本" :value="1" />
<el-option label="视频" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="描述" prop="description"> <el-form-item label="描述" prop="description">
<el-input v-model="knowledgeForm.description" type="textarea" :rows="3" placeholder="请输入描述" /> <el-input v-model="knowledgeForm.description" type="textarea" :rows="3" placeholder="请输入描述" />
</el-form-item> </el-form-item>
@@ -469,10 +475,12 @@ const knowledgeFormRef = ref<FormInstance>();
const knowledgeForm = reactive({ const knowledgeForm = reactive({
id: '', id: '',
name: '', name: '',
datasetType: undefined as number | undefined,
description: '', description: '',
}); });
const knowledgeRules = reactive<FormRules>({ const knowledgeRules = reactive<FormRules>({
name: [{ required: true, message: '请输入知识库名称', trigger: 'blur' }], name: [{ required: true, message: '请输入知识库名称', trigger: 'blur' }],
datasetType: [{ required: true, message: '请选择数据集类型', trigger: 'change' }],
}); });
// 文件列表含OSS上传结果 // 文件列表含OSS上传结果
@@ -555,6 +563,7 @@ const getknowledgeList = async () => {
const response = await listknowledges({ const response = await listknowledges({
pageNum: 1, pageNum: 1,
pageSize: 100, pageSize: 100,
datasetType: 1,
}); });
knowledgeList.value = response.data.list || []; knowledgeList.value = response.data.list || [];
} catch (_error) { } catch (_error) {
@@ -576,6 +585,7 @@ const onSelectknowledge = (item: any) => {
const onAddknowledge = () => { const onAddknowledge = () => {
knowledgeForm.id = ''; knowledgeForm.id = '';
knowledgeForm.name = ''; knowledgeForm.name = '';
knowledgeForm.datasetType = undefined;
knowledgeForm.description = ''; knowledgeForm.description = '';
showknowledgeDialog.value = true; showknowledgeDialog.value = true;
}; };
@@ -594,6 +604,7 @@ const onCardContextMenu = (event: MouseEvent, item: any) => {
const onRenameknowledge = (item: any) => { const onRenameknowledge = (item: any) => {
knowledgeForm.id = item.id; knowledgeForm.id = item.id;
knowledgeForm.name = item.name; knowledgeForm.name = item.name;
knowledgeForm.datasetType = item.datasetType;
knowledgeForm.description = item.description || ''; knowledgeForm.description = item.description || '';
showknowledgeDialog.value = true; showknowledgeDialog.value = true;
}; };
@@ -634,12 +645,14 @@ const onSaveknowledge = async () => {
await updateknowledge({ await updateknowledge({
id: knowledgeForm.id, id: knowledgeForm.id,
name: knowledgeForm.name, name: knowledgeForm.name,
datasetType: knowledgeForm.datasetType,
description: knowledgeForm.description, description: knowledgeForm.description,
}); });
} else { } else {
// 创建知识库 // 创建知识库
await createknowledge({ await createknowledge({
name: knowledgeForm.name, name: knowledgeForm.name,
datasetType: knowledgeForm.datasetType!,
description: knowledgeForm.description, description: knowledgeForm.description,
}); });
} }
@@ -988,7 +1001,7 @@ const onSaveModelConfig = async () => {
// 构建请求数据,只传递接口需要的字段 // 构建请求数据,只传递接口需要的字段
const data = { const data = {
modelType: selectedModelType.value, modelType: selectedModelType.value,
configType: selectedConfigType.value, configType: selectedConfigType,
modelName: modelFormData.value.modelName, modelName: modelFormData.value.modelName,
modelDesc: modelFormData.value.modelDesc, modelDesc: modelFormData.value.modelDesc,
configContent: {} as Record<string, any>, configContent: {} as Record<string, any>,