作者 dong

智能助手配置,bug修正

... ... @@ -59,6 +59,11 @@ export const columns: BasicColumn[] = [
},
},
{
title: '按钮名称',
align: 'center',
dataIndex: 'buttonName',
},
{
title: 'code',
align: 'center',
dataIndex: 'code',
... ... @@ -82,7 +87,7 @@ export const searchFormSchema: FormSchema[] = [
// 新增知识库选择字段
{
label: '模型名称',
field: 'name', // 注意:这里使用knowledgeId作为字段名
field: 'modelId', // 注意:这里使用knowledgeId作为字段名
component: 'ApiSelect',
componentProps: {
api: listmodelid,
... ... @@ -148,13 +153,13 @@ export const searchFormSchema: FormSchema[] = [
export const formSchema: FormSchema[] = [
{
label: '模型名称',
field: 'name', // 注意:这里使用knowledgeId作为字段名
field: 'name',
component: 'Input',
required: true,
componentProps: {
api: listmodelid, // 使用知识库接口
labelField: 'name', // 显示知识库名称
valueField: 'id', // 提交知识库ID
api: listmodelid,
labelField: 'name',
valueField: 'id',
showSearch: true,
readonly: true,
filterOption: (input: string, option: any) => {
... ...
... ... @@ -225,7 +225,7 @@
showSaveButton: true,
operationType: 'knowledge', // 指定操作类型
onConfirm: async (record) => {
console.log("执行知识库确认回调");
console.log('执行知识库确认回调');
try {
await defHttp.post({ url: '/airaglog/airagLog/saveToEmbeddingLibrary', params: record });
// 刷新列表
... ...
... ... @@ -31,10 +31,9 @@
const emit = defineEmits(['register', 'success']);
const isUpdate = ref(true);
const isDetail = ref(false);
const showSaveButton = ref(true);
let customOnConfirm = ref<Function | null>(null);
//表单配置
const [registerForm, { setProps, resetFields, setFieldsValue, validate, scrollToField }] = useForm({
const [registerForm, { setProps, resetFields, setFieldsValue, validate, scrollToField, updateSchema }] = useForm({
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
... ... @@ -42,7 +41,7 @@
});
//表单赋值
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
console.log("模态框打开,操作类型:", data?.operationType);
console.log('模态框打开,操作类型:', data?.operationType);
//重置表单
await resetFields();
setModalProps({ confirmLoading: false, showCancelBtn: !!data?.showFooter, showOkBtn: !!data?.showFooter });
... ... @@ -51,6 +50,18 @@
customOnConfirm.value = data?.onConfirm || null;
isUpdate.value = !!data?.isUpdate;
isDetail.value = !!data?.showFooter;
if (operationType.value === 'knowledge') {
updateSchema({
field: 'question',
show: false,
});
} else {
updateSchema({
field: 'question',
show: true,
});
}
if (unref(isUpdate)) {
//表单赋值
await setFieldsValue({
... ...
<template>
<a-card title="智能助手配置" class="config-card">
<a-form :model="formState" layout="vertical">
<!-- 向量模型 -->
<a-form-item label="向量模型" class="form-item">
<a-select
v-model:value="formState.embeddingId"
placeholder="请选择向量模型"
:options="options.embeddingOptions"
show-search
option-filter-prop="label"
/>
</a-form-item>
<!-- 大语言模型 -->
<a-form-item label="大语言模型" class="form-item">
<a-select
v-model:value="formState.llmId"
placeholder="请选择大语言模型"
:options="options.llmOptions"
show-search
option-filter-prop="label"
/>
</a-form-item>
<!-- 知识库 -->
<a-form-item label="知识库" class="form-item">
<a-select
v-model:value="formState.knowledgeId"
placeholder="请选择知识库"
:options="options.knowledgeOptions"
show-search
option-filter-prop="label"
/>
</a-form-item>
<!-- 按钮(多选) -->
<a-form-item label="功能按钮" class="form-item">
<a-select
v-model:value="formState.buttonIds"
mode="multiple"
placeholder="请选择按钮"
:options="options.buttonOptions"
show-search
option-filter-prop="label"
:max-tag-count="6"
:max="5"
/>
<div class="hint">最多可选择5个按钮</div>
</a-form-item>
<!-- 提示词 -->
<a-form-item label="提示词" class="form-item">
<a-textarea
v-model:value="formState.prompt"
placeholder="请输入提示词,例如:你是一个专业的AI助手..."
:rows="4"
:maxlength="500"
show-count
/>
</a-form-item>
<!-- 操作按钮 -->
<a-form-item class="action-buttons">
<a-space>
<a-button @click="resetForm">
<template #icon><UndoOutlined /></template>
重置
</a-button>
<a-button type="primary" @click="saveConfigData" :loading="saving">
<template #icon><SaveOutlined /></template>
保存配置
</a-button>
</a-space>
</a-form-item>
</a-form>
</a-card>
</template>
<script lang="ts" setup>
import { reactive, ref, onMounted } from 'vue';
import { getConfigData, saveConfig } from './Chatsetting.api';
import { message } from 'ant-design-vue';
import { SaveOutlined, UndoOutlined } from '@ant-design/icons-vue';
// 表单数据结构
const formState = reactive({
id: '',
embeddingId: undefined,
llmId: undefined,
knowledgeId: undefined,
buttonIds: [],
prompt: '',
});
// 选项数据
const options = reactive({
embeddingOptions: [],
llmOptions: [],
knowledgeOptions: [],
buttonOptions: [],
});
const saving = ref(false);
// 加载配置数据
const loadConfig = async () => {
try {
const res = await getConfigData();
if (res.success) {
const data = res.result;
// 填充表单
Object.keys(formState).forEach((key) => {
if (data.airagChatsettingConfig[key] !== undefined) {
formState[key] = data.airagChatsettingConfig[key];
console.log('shuju' + formState[key]);
}
});
// 填充选项
options.embeddingOptions = data.embeddingOptions || [];
console.log('向量' + options.embeddingOptions);
options.llmOptions = data.llmOptions || [];
options.knowledgeOptions = data.knowledgeOptions || [];
options.buttonOptions = data.buttonOptions || [];
}
} catch (error) {
console.error('配置加载失败', error);
message.error('配置加载失败');
}
};
// 保存配置
const saveConfigData = async () => {
const params = {
...formState,
id: formState.id || '',
buttonIds: formState.buttonIds.filter((id) => id && id !== 'undefined'),
};
if (formState.buttonIds.length > 5) {
message.error('最多只能选择五个按钮');
return;
}
saving.value = true;
try {
const res = await saveConfig(params);
console.log(res.success);
if (res.success) {
message.success('配置保存成功');
loadConfig(); // 重新加载最新数据
} else {
message.error('保存失败: ' + res.message);
}
} catch (error) {
console.error('保存失败', error);
message.error('保存失败');
} finally {
saving.value = false;
}
};
// 重置表单
const resetForm = () => {
loadConfig();
};
// 初始化加载
onMounted(() => {
loadConfig();
});
</script>
<style lang="less" scoped>
.config-card {
max-width: 800px;
margin: 20px auto;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
:deep(.ant-card-head) {
background-color: #f0f5ff;
border-bottom: 1px solid #e8e8e8;
}
}
.form-item {
margin-bottom: 24px;
:deep(.ant-form-item-label) {
font-weight: 500;
margin-bottom: 8px;
}
}
.hint {
font-size: 12px;
color: #999;
margin-top: 4px;
}
.action-buttons {
margin-top: 24px;
text-align: center;
.ant-space {
justify-content: center;
}
.ant-btn {
min-width: 120px;
}
}
</style>
... ...
import { defHttp } from '/@/utils/http/axios';
enum Api {
getConfigData = '/airagchatsetting/airagChatsetting/getConfigData',
saveConfig = '/airagchatsetting/airagChatsetting/saveConfig',
}
/**
* 列表接口
* @param params
*/
export const getConfigData = () => defHttp.get({ url: Api.getConfigData }, { isTransformResponse: false });
/**
* 保存或者更新
* @param params
*/
export const saveConfig = (params) => {
return defHttp.post({ url: Api.saveConfig, params }, { isTransformResponse: false });
};
... ...