更新模型选择器以支持更多模型类型,重构输入栏以移除快捷指令和工作流功能,新增工作空间功能以支持文件预览和下载,优化工作流组件以增强节点数据处理的可选性和安全性。

This commit is contained in:
2026-05-29 14:20:27 +08:00
parent 78d1fd93c8
commit 538e153473
6 changed files with 356 additions and 107 deletions
+50 -16
View File
@@ -126,7 +126,7 @@ interface ParamRef {
label: string;
}
const { addNodes, addEdges, findNode, removeNodes, getNodes } = useVueFlow();
const { addNodes, addEdges, findNode, removeNodes, getNodes, updateNode } = useVueFlow();
// 常量定义
const START_NODE_CODE = '__start__';
@@ -254,6 +254,8 @@ const onNodeClick = (event: { node: Node<NodeData, any, string> }) => {
const updateSelectedNode = (updatedNode: Node<NodeData, any, string>) => {
selectedNode.value = updatedNode;
// 使用 VueFlow 的 API 更新节点,确保内部状态同步
updateNode(updatedNode.id, updatedNode);
// 同步更新到 nodes 数组
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
@@ -284,29 +286,47 @@ const availableParams = computed(() => {
const addParam = (param: ParamRef) => {
if (!selectedNode.value?.data) return;
if (!selectedNode.value.data.inputSource) {
selectedNode.value.data.inputSource = [];
}
const updatedNode: Node<NodeData> = {
...selectedNode.value,
data: {
...selectedNode.value.data,
inputSource: selectedNode.value.data.inputSource || [],
},
};
// 查找是否已存在该节点的引用
const existingIndex = selectedNode.value.data.inputSource.findIndex((item) => item.nodeId === param.id);
const existingIndex = updatedNode.data.inputSource!.findIndex((item) => item.nodeId === param.id);
if (existingIndex >= 0) {
// 已存在,添加 output 到 field 数组
const existing = selectedNode.value.data.inputSource[existingIndex];
const existing = updatedNode.data.inputSource![existingIndex];
if (!existing.field.includes('output')) {
existing.field.push('output');
selectedNode.value = updatedNode;
// 同步更新到 VueFlow 内部状态
updateNode(updatedNode.id, updatedNode);
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
nodes.value[index] = updatedNode;
}
ElMessage.success('已添加参数引用');
} else {
ElMessage.info('该参数已被引用');
}
} else {
// 不存在,创建新的引用
selectedNode.value.data.inputSource.push({
updatedNode.data.inputSource!.push({
nodeId: param.id,
field: ['output'],
quoteOutput: false,
});
selectedNode.value = updatedNode;
// 同步更新到 VueFlow 内部状态
updateNode(updatedNode.id, updatedNode);
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
nodes.value[index] = updatedNode;
}
ElMessage.success('已添加参数引用');
}
};
@@ -330,6 +350,8 @@ const handleModelConfirm = (model: any) => {
selectedNode.value = updatedNode;
selectedModelData.value = model;
// 同步更新到 VueFlow 内部状态
updateNode(updatedNode.id, updatedNode);
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
@@ -353,6 +375,8 @@ const handleRemoveModel = () => {
selectedNode.value = updatedNode;
selectedModelData.value = null;
// 同步更新到 VueFlow 内部状态
updateNode(updatedNode.id, updatedNode);
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
@@ -376,6 +400,8 @@ const handleSkillConfirm = (skill: any) => {
selectedNode.value = updatedNode;
selectedSkillData.value = skill;
// 同步更新到 VueFlow 内部状态
updateNode(updatedNode.id, updatedNode);
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
@@ -399,6 +425,8 @@ const handleRemoveSkill = () => {
selectedNode.value = updatedNode;
selectedSkillData.value = null;
// 同步更新到 VueFlow 内部状态
updateNode(updatedNode.id, updatedNode);
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
@@ -436,6 +464,8 @@ const handleRemoveField = (nodeId: string, fieldName: string) => {
};
selectedNode.value = updatedNode;
// 同步更新到 VueFlow 内部状态
updateNode(updatedNode.id, updatedNode);
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
nodes.value[index] = updatedNode;
@@ -478,6 +508,8 @@ const handleToggleOutput = (nodeId: string, enabled: boolean) => {
};
selectedNode.value = updatedNode;
// 同步更新到 VueFlow 内部状态
updateNode(updatedNode.id, updatedNode);
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
nodes.value[index] = updatedNode;
@@ -534,6 +566,8 @@ const handleAddParamByValue = (paramValue: string) => {
};
selectedNode.value = updatedNode;
// 同步更新到 VueFlow 内部状态
updateNode(updatedNode.id, updatedNode);
const index = nodes.value.findIndex((n) => n.id === updatedNode.id);
if (index >= 0) {
nodes.value[index] = updatedNode;
@@ -652,15 +686,15 @@ const fetchWorkflowList = async () => {
// 添加默认开始节点
const addDefaultStartNode = () => {
addNodes([
{
id: 'start-node',
type: 'input',
position: { x: 200, y: 200 },
data: { label: '开始', nodeCode: '__start__', inputSource: null },
style: { background: '#10b981', color: '#fff', border: '2px solid #059669', borderRadius: '8px', padding: '10px 20px' },
},
]);
const startNode = {
id: 'start-node',
type: 'input',
position: { x: 200, y: 200 },
data: { label: '开始', nodeCode: '__start__', inputSource: null },
style: { background: '#10b981', color: '#fff', border: '2px solid #059669', borderRadius: '8px', padding: '10px 20px' },
};
addNodes([startNode]);
nodes.value.push(startNode);
};
// 新建工作流