添加会话模型和API Key配置功能

- 在模型模块中新增会话开关状态字段,支持会话模型的管理。
- 更新模型选择器,增加系统模型的API Key配置弹窗,提升用户体验。
- 优化错误处理逻辑,确保接口错误由全局拦截器处理,减少冗余提示。
- 更新相关样式以增强界面可读性和美观性。
This commit is contained in:
2026-05-11 20:01:03 +08:00
parent 0a42e700e2
commit 29838b030f
19 changed files with 1296 additions and 274 deletions

View File

@@ -790,10 +790,11 @@ const buildTreeNodes = (tree: ExecutionTreeItem[]): TreeNode[] =>
const getList = async () => {
treeLoading.value = true;
try {
const res = await getExecutionList({ errorMode: 'page' });
const res = await getExecutionList();
imgAddressPrefix.value = res.data?.imgAddressPrefix || '';
treeNodes.value = buildTreeNodes(res.data?.tree || []);
} catch {
// 错误已由全局拦截器处理
treeNodes.value = [];
imgAddressPrefix.value = '';
} finally {
@@ -802,9 +803,10 @@ const getList = async () => {
};
const getNodeLibrary = async () => {
try {
const res = await getNodeLibraryList({ errorMode: 'page' });
const res = await getNodeLibraryList();
nodeLibraryGroups.value = res.data?.groups || [];
} catch {
// 错误已由全局拦截器处理
nodeLibraryGroups.value = [];
}
};
@@ -812,7 +814,7 @@ const getNodeLibrary = async () => {
const fetchWorkflowList = async () => {
workflowListLoading.value = true;
try {
const res = await getWorkflowList({ errorMode: 'page' });
const res = await getWorkflowList();
// 分别处理用户工作流和模板工作流
const userWorkflows = res.data?.listFlowUserRes?.list || [];
@@ -833,6 +835,7 @@ const fetchWorkflowList = async () => {
const templateEnd = templateStart + templateWorkflowPagination.pageSize;
templateWorkflowList.value = templateWorkflows.slice(templateStart, templateEnd);
} catch {
// 错误已由全局拦截器处理
userWorkflowList.value = [];
templateWorkflowList.value = [];
userWorkflowPagination.total = 0;
@@ -892,7 +895,7 @@ const handleRemoveModel = () => {
const useWorkflow = async (workflow: WorkflowItem) => {
try {
// 调用详情接口获取最新的工作流数据
const res = await getWorkflowDetail(workflow.id, { errorMode: 'page' });
const res = await getWorkflowDetail(workflow.id);
if (res.data) {
// 切换到创作模式
isCreationMode.value = true;
@@ -946,7 +949,7 @@ const useWorkflow = async (workflow: WorkflowItem) => {
const editWorkflow = async (workflow: WorkflowItem) => {
try {
// 调用详情接口获取最新的工作流数据
const res = await getWorkflowDetail(workflow.id, { errorMode: 'page' });
const res = await getWorkflowDetail(workflow.id);
if (res.data?.flowContent) {
// 切换回画布编辑模式
isCreationMode.value = false;
@@ -994,7 +997,7 @@ const deleteWorkflowAction = async (workflow: WorkflowItem) => {
type: 'warning',
});
await deleteWorkflow(workflow.id, { errorMode: 'page' });
await deleteWorkflow(workflow.id);
ElMessage.success('工作流删除成功');
// 如果删除的是当前正在编辑的工作流,清空编辑状态
@@ -1038,15 +1041,10 @@ const sendMessage = async () => {
const fileUrls: string[] = [];
if (selectedFiles.value.length > 0) {
for (const file of selectedFiles.value) {
try {
const uploadRes = await uploadFile(file, { errorMode: 'page' });
// 拼接完整的文件地址
const fullUrl = uploadRes.data.fileAddressPrefix ? `${uploadRes.data.fileAddressPrefix}${uploadRes.data.fileURL}` : uploadRes.data.fileURL;
fileUrls.push(fullUrl);
} catch (error) {
ElMessage.error(`文件 ${file.name} 上传失败`);
throw error;
}
const uploadRes = await uploadFile(file);
// 拼接完整的文件地址
const fullUrl = uploadRes.data.fileAddressPrefix ? `${uploadRes.data.fileAddressPrefix}${uploadRes.data.fileURL}` : uploadRes.data.fileURL;
fileUrls.push(fullUrl);
}
}
@@ -1109,7 +1107,7 @@ const sendMessage = async () => {
};
// 5. 调用执行接口(不再使用 FormData直接传 JSON
await executeFlow(params, { errorMode: 'page' });
await executeFlow(params);
ElMessage.success('创作完成!');
@@ -1117,8 +1115,8 @@ const sendMessage = async () => {
userInput.value = '';
selectedFiles.value = [];
selectedCreationSkill.value = null;
} catch (error) {
ElMessage.error('创作失败,请重试');
} catch {
// 接口错误由 request 全局提示后端 message
} finally {
isCreating.value = false;
}
@@ -1149,7 +1147,7 @@ const downloadNode = async (d: TreeNode) => {
if (!d.fileUrl) return ElMessage.warning('当前节点没有可下载地址');
try {
// 下载失败时希望展示更贴近页面语义的提示,因此改为 page 模式。
const r = await downloadToFile({ fileURL: d.fileUrl }, { errorMode: 'page' });
const r = await downloadToFile({ fileURL: d.fileUrl });
const blob = r instanceof Blob ? r : r?.data;
if (!(blob instanceof Blob)) throw new Error('invalid blob');
const name = decodeURIComponent(d.fileUrl.split('/').pop() || `${d.label}.${d.nodeType === 'html' ? 'html' : 'png'}`);
@@ -1163,7 +1161,7 @@ const downloadNode = async (d: TreeNode) => {
URL.revokeObjectURL(u);
ElMessage.success('下载成功');
} catch {
// 下载接口使用 errorMode: 'page',后端错误会自动显示
// 下载失败由 request 全局提示后端 message
}
};
const syncDsl = () => {
@@ -1847,26 +1845,20 @@ const confirmSaveWorkflow = async () => {
// 判断是新建还是更新
if (currentEditingWorkflowId.value) {
// 更新现有工作流
await updateWorkflow(
{
id: currentEditingWorkflowId.value,
flowName: saveForm.flowName,
description: saveForm.description,
flowContent: workflowDsl.value,
},
{ errorMode: 'page' }
);
await updateWorkflow({
id: currentEditingWorkflowId.value,
flowName: saveForm.flowName,
description: saveForm.description,
flowContent: workflowDsl.value,
});
ElMessage.success('工作流更新成功');
} else {
// 创建新工作流
await saveWorkflow(
{
flowName: saveForm.flowName,
description: saveForm.description,
flowContent: workflowDsl.value,
},
{ errorMode: 'page' }
);
await saveWorkflow({
flowName: saveForm.flowName,
description: saveForm.description,
flowContent: workflowDsl.value,
});
ElMessage.success('工作流保存成功');
}
saveDialogVisible.value = false;