From 4f547b5bffc7f6613cddb998847d51651c896248 Mon Sep 17 00:00:00 2001 From: 2910410219 <2910410219@qq.com> Date: Thu, 16 Apr 2026 14:49:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=9F=A5=E8=AF=86=E5=BA=93):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=A8=A1=E5=9E=8B=E9=85=8D=E7=BD=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BF=AE=E5=A4=8D=E5=90=91=E9=87=8F?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加模型配置管理相关功能,包括模型配置列表展示、创建和编辑功能。同时修复文档详情中向量状态显示问题,将数字类型转换为布尔类型以正确绑定到el-switch组件。 - 新增模型配置相关API接口和类型定义 - 添加模型配置列表弹窗及创建/编辑表单 - 修复向量状态显示问题,确保与el-switch组件正确绑定 - 优化深拷贝逻辑,自动转换status字段类型 --- src/api/knowledge/model/index.ts | 83 +++++ .../component/documentDetailDialog.vue | 11 +- src/views/knowledge/index.vue | 328 +++++++++++++++++- 3 files changed, 413 insertions(+), 9 deletions(-) create mode 100644 src/api/knowledge/model/index.ts diff --git a/src/api/knowledge/model/index.ts b/src/api/knowledge/model/index.ts new file mode 100644 index 0000000..7d84f05 --- /dev/null +++ b/src/api/knowledge/model/index.ts @@ -0,0 +1,83 @@ +import request from '/@/utils/request'; + +// 模型配置查询参数 +export interface ModelConfigQueryParams { + pageNum: number; + pageSize: number; + modelType?: string; + modelName?: string; +} + +// 模型配置信息 +export interface ModelConfigInfo { + id: number; + modelType: string; + modelName: string; + modelDesc: string; + configType: string; + configContent: number[]; + createTime: string; + updateTime: string; +} + +// 获取模型配置列表 +export function listModelConfigs(params?: ModelConfigQueryParams) { + return request({ + url: '/rag/model/list', + method: 'get', + params, + }); +} + +// 创建模型配置 +export function createModelConfig(data: any) { + return request({ + url: '/rag/model/create', + method: 'post', + data, + }); +} + +// 更新模型配置 +export function updateModelConfig(data: any) { + return request({ + url: '/rag/model/update', + method: 'put', + data, + }); +} + +// 删除模型配置 +export function deleteModelConfig(id: string | number) { + return request({ + url: '/rag/model/delete', + method: 'post', + data: { id }, + }); +} + +// 获取模型配置详情 +export function getModelConfig(id: string | number, modelType: string) { + return request({ + url: '/rag/model/get', + method: 'get', + params: { id, modelType }, + }); +} + +// 获取模型类型和配置类型枚举 +export function getAllModelEnums() { + return request({ + url: '/rag/model/getAllEnums', + method: 'get', + }); +} + +// 获取模型表单字段 +export function getModelFormField(modelType: string, configType: string) { + return request({ + url: '/rag/model/getModelFormField', + method: 'get', + params: { modelType, configType }, + }); +} diff --git a/src/views/knowledge/component/documentDetailDialog.vue b/src/views/knowledge/component/documentDetailDialog.vue index 55b32ca..40068d7 100644 --- a/src/views/knowledge/component/documentDetailDialog.vue +++ b/src/views/knowledge/component/documentDetailDialog.vue @@ -77,7 +77,7 @@
块 {{ vector.chunkIndex }} - 状态: {{ vector.status === 1 ? '启用' : '禁用' }} + 状态: {{ vector.status ? '启用' : '禁用' }} 向量状态: {{ vector.vectorStatus === 1 ? '已生成' : '未生成' }}
@@ -233,8 +233,13 @@ const getVectorList = async () => { pageNum: vectorPage.value, pageSize: vectorPageSize.value, }); - // 深拷贝数据,避免v-model触发不必要的更新 - vectorList.value = (response.data?.list || []).map((item: any) => JSON.parse(JSON.stringify(item))); + // 深拷贝数据,避免v-model触发不必要的更新,并将status从数字转换为布尔类型 + vectorList.value = (response.data?.list || []).map((item: any) => { + const clonedItem = JSON.parse(JSON.stringify(item)); + // 将数字类型的status转换为布尔类型,以便正确绑定到el-switch + clonedItem.status = clonedItem.status === 1; + return clonedItem; + }); vectorTotal.value = response.data?.total || 0; } catch (_error) { ElMessage.error('获取向量列表失败'); diff --git a/src/views/knowledge/index.vue b/src/views/knowledge/index.vue index 4a8e6e4..c1c1c7b 100644 --- a/src/views/knowledge/index.vue +++ b/src/views/knowledge/index.vue @@ -7,10 +7,16 @@ 知识库
- - - 新建知识库 - +
+ + + 新建知识库 + + + + 模型配置 + +
@@ -268,6 +274,91 @@ :knowledgeName="currentknowledge?.name || ''" :document="currentDocument" /> + + + +
+ + + 创建模型配置 + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ +
@@ -284,6 +375,7 @@ import type { FormInstance, FormRules, UploadFile } from 'element-plus'; import DocumentDetailDialog from './component/documentDetailDialog.vue'; import { listknowledges, createknowledge, updateknowledge, deleteknowledge } from '/@/api/knowledge/dataset'; import { listDocuments, uploadFile, createDocument, deleteDocument, updateDocument, generateVector, getDocument } from '/@/api/knowledge/document'; +import { listModelConfigs, createModelConfig, updateModelConfig, getModelConfig, getAllModelEnums, getModelFormField } from '/@/api/knowledge/model'; // 数据集相关 const knowledgeLoading = ref(false); @@ -291,6 +383,23 @@ const knowledgeList = ref([]); const currentknowledge = ref(null); const showknowledgeDialog = ref(false); const knowledgeSaving = ref(false); + +// 模型配置相关 +const showModelConfigDialog = ref(false); +const modelConfigList = ref([]); +const modelConfigLoading = ref(false); + +// 创建模型配置相关 +const showCreateModelDialog = ref(false); +const modelEnums = ref([]); +const selectedModelType = ref(''); +const selectedConfigType = ref(''); +const modelFormFields = ref([]); +const modelFormData = ref({}); +const modelFormLoading = ref(false); +const modelEnumsLoading = ref(false); +const isEditMode = ref(false); +const currentModelId = ref(null); const knowledgeFormRef = ref(); const knowledgeForm = reactive({ id: '', @@ -675,8 +784,215 @@ const getLogList = () => { }; // 保存配置 -const onSaveSettings = () => { - ElMessage.success('配置保存成功'); +const onSaveSettings = async () => { + ElMessage.success('保存成功'); +}; + +// 打开模型配置弹窗 +const onOpenModelConfig = async () => { + await getModelConfigList(); + showModelConfigDialog.value = true; +}; + +// 打开创建模型配置弹窗 +const onCreateModelConfig = async () => { + // 重置状态 + selectedModelType.value = ''; + selectedConfigType.value = ''; + modelFormFields.value = []; + modelFormData.value = {}; + isEditMode.value = false; + currentModelId.value = null; + + // 获取模型类型和配置类型枚举 + await getModelEnums(); + + // 打开创建弹窗 + showCreateModelDialog.value = true; +}; + +// 编辑模型配置 +const onEditModelConfig = async (row: any) => { + try { + // 重置状态 + selectedModelType.value = ''; + selectedConfigType.value = ''; + modelFormFields.value = []; + modelFormData.value = {}; + isEditMode.value = true; + currentModelId.value = row.id; + + // 获取模型类型和配置类型枚举 + await getModelEnums(); + + // 调用获取详情接口 + const response = await getModelConfig(row.id, row.modelType); + const modelData = response.data; + + // 设置模型类型和配置类型 + selectedModelType.value = modelData.modelType; + selectedConfigType.value = modelData.configType; + + // 填充表单数据 + modelFormData.value = { + modelName: modelData.modelName, + modelDesc: modelData.modelDesc, + }; + + // 将configContent中的数据添加到表单数据中 + if (modelData.configContent) { + Object.keys(modelData.configContent).forEach((key) => { + modelFormData.value[key] = modelData.configContent[key]; + }); + } + + // 获取动态表单字段 + await getModelFormFields(); + + // 打开弹窗 + showCreateModelDialog.value = true; + } catch (error) { + ElMessage.error('获取模型配置详情失败'); + } +}; + +// 获取模型类型和配置类型枚举 +const getModelEnums = async () => { + modelEnumsLoading.value = true; + try { + const response = await getAllModelEnums(); + modelEnums.value = response.data?.options || []; + } catch (error) { + ElMessage.error('获取模型类型枚举失败'); + modelEnums.value = []; + } finally { + modelEnumsLoading.value = false; + } +}; + +// 模型类型选择变化 +const onModelTypeChange = async () => { + selectedConfigType.value = ''; + modelFormFields.value = []; + // 在编辑模式下,只保留模型名称和描述,清空其他字段 + if (isEditMode.value) { + const { modelName, modelDesc } = modelFormData.value; + modelFormData.value = { + modelName, + modelDesc, + }; + } else { + // 创建模式下清空所有字段 + modelFormData.value = {}; + } +}; + +// 配置类型选择变化 +const onConfigTypeChange = async () => { + if (selectedModelType.value && selectedConfigType.value) { + await getModelFormFields(); + } +}; + +// 获取模型表单字段 +const getModelFormFields = async () => { + modelFormLoading.value = true; + try { + const response = await getModelFormField(selectedModelType.value, selectedConfigType.value); + // 过滤掉模型类型和配置类型字段,避免重复显示 + modelFormFields.value = (response.data?.fields || []).filter((field: any) => { + return field.name !== 'modelType' && field.name !== 'configType'; + }); + // 设置字段的默认值,但保留已有的表单数据 + modelFormFields.value.forEach((field: any) => { + if (field.value !== undefined && modelFormData.value[field.name] === undefined) { + modelFormData.value[field.name] = field.value; + } + }); + } catch (error) { + ElMessage.error('获取模型表单字段失败'); + modelFormFields.value = []; + } finally { + modelFormLoading.value = false; + } +}; + +// 保存模型配置 +const onSaveModelConfig = async () => { + try { + // 构建请求数据,只传递接口需要的字段 + const data = { + modelType: selectedModelType.value, + configType: selectedConfigType.value, + modelName: modelFormData.value.modelName, + modelDesc: modelFormData.value.modelDesc, + configContent: {} as Record, + }; + + // 将动态表单字段(除了modelType、configType、modelName、modelDesc)添加到configContent中,以key-value形式 + Object.keys(modelFormData.value).forEach((key) => { + if (!['modelType', 'configType', 'modelName', 'modelDesc'].includes(key)) { + data.configContent[key] = modelFormData.value[key]; + } + }); + + // 根据模式调用不同的接口 + if (isEditMode.value && currentModelId.value) { + // 编辑模式,调用更新接口 + await updateModelConfig({ ...data, id: currentModelId.value }); + ElMessage.success('更新模型配置成功'); + } else { + // 创建模式,调用创建接口 + await createModelConfig(data); + ElMessage.success('创建模型配置成功'); + } + + // 关闭弹窗并刷新列表 + showCreateModelDialog.value = false; + getModelConfigList(); + } catch (error) { + ElMessage.error(isEditMode.value ? '更新模型配置失败' : '创建模型配置失败'); + } +}; + +// 根据选中的模型类型获取配置类型列表 +const getConfigTypes = () => { + if (!selectedModelType.value) { + return []; + } + + const selectedModel = modelEnums.value.find((item: any) => item.key === selectedModelType.value); + return selectedModel?.configTypes || []; +}; + +// 获取模型配置列表 +const getModelConfigList = async () => { + modelConfigLoading.value = true; + try { + const response = await listModelConfigs({ + pageNum: 1, + pageSize: 100, + }); + modelConfigList.value = response.data?.list || []; + } catch (error) { + ElMessage.error('获取模型配置列表失败'); + modelConfigList.value = []; + } finally { + modelConfigLoading.value = false; + } +}; + +// 格式化时间 +const formatDateTime = (dateTime: string) => { + if (!dateTime) return '-'; + const date = new Date(dateTime); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; }; // 页面加载