From 11b708b89f6f3896e63c550cfd94eab745dbbeb0 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Thu, 3 Sep 2026 14:53:05 +0800 Subject: [PATCH] fix: tool list error --- ui/src/styles/STYLE_README.md | 9 + ui/src/styles/app.scss | 14 +- ui/src/views/tool/ToolView.vue | 4 +- .../tool-form/tool-custom/ToolFormDrawer.vue | 2 +- ui/src/workflow-canvas/config/node-data.ts | 5 +- .../core/node-container/index.vue | 24 +- ui/src/workflow-canvas/core/workflow-node.ts | 2 +- .../nodes/base-node/BaseNodeFieldTables.vue | 352 ++++++++++++++++++ .../base-node/FileUploadSettingDialog.vue | 149 ++++++++ .../nodes/base-node/LongTermSettingDialog.vue | 209 +++++++++++ .../nodes/base-node/ModelParamsDialog.vue | 78 ++++ .../nodes/base-node/PrologueEditor.vue | 56 +++ .../workflow-canvas/nodes/base-node/index.ts | 2 +- .../workflow-canvas/nodes/base-node/index.vue | 308 ++++++++++++++- .../workflow-canvas/nodes/base-node/types.ts | 69 ++++ .../nodes/start-node/index.vue | 9 +- 16 files changed, 1251 insertions(+), 41 deletions(-) create mode 100644 ui/src/workflow-canvas/nodes/base-node/BaseNodeFieldTables.vue create mode 100644 ui/src/workflow-canvas/nodes/base-node/FileUploadSettingDialog.vue create mode 100644 ui/src/workflow-canvas/nodes/base-node/LongTermSettingDialog.vue create mode 100644 ui/src/workflow-canvas/nodes/base-node/ModelParamsDialog.vue create mode 100644 ui/src/workflow-canvas/nodes/base-node/PrologueEditor.vue create mode 100644 ui/src/workflow-canvas/nodes/base-node/types.ts diff --git a/ui/src/styles/STYLE_README.md b/ui/src/styles/STYLE_README.md index 3bc552fb218..50468c735c6 100644 --- a/ui/src/styles/STYLE_README.md +++ b/ui/src/styles/STYLE_README.md @@ -157,6 +157,15 @@ CSS 自定义属性同样按变量名排序。嵌套选择器、伪类和媒体 仅在布局语义与工具类完全一致时使用。需要覆盖排列方向或对齐方式的响应式布局继续组合 Tailwind 原子类,不为少量差异继续增加相似工具类。 +## 常用卡片样式 + +`mk-gray-card` 用于需要 N100 灰色背景的内容卡片,统一使用 6px 圆角、12px 水平内边距和 8px +垂直内边距。 + +```html +
卡片内容
+``` + ## 常用交互工具类 `group-hover-visible` 用于列表项、卡片等父级带有 `group` 的悬浮操作区。操作区默认透明且不响应 diff --git a/ui/src/styles/app.scss b/ui/src/styles/app.scss index 662f2b7941e..2b2ecf1c4d7 100644 --- a/ui/src/styles/app.scss +++ b/ui/src/styles/app.scss @@ -160,7 +160,6 @@ h6 { } } - // 资源菜单的导入按钮 .mk-import-button { width: 100%; @@ -169,7 +168,6 @@ h6 { } } - /* 标题前带竖线样式 */ @@ -207,6 +205,13 @@ h6 { } } +// 灰色背景卡片 +.mk-gray-card { + background-color: var(--mk-N100) !important; + border-radius: 6px; + padding: calc(var(--spacing) * 2) calc(var(--spacing) * 3); +} + // 资源的card grid布局 .mk-resource-card-grid { display: grid; @@ -219,9 +224,8 @@ h6 { grid-template-columns: repeat(auto-fill, minmax(min(100%, 270px), 1fr)); } - - -.mk-scrollbar-right { +// 让一些组件内部滚动条 不会限制在padding内,滚动条贴在最右侧 +.mk-scrollbar-right { &.el-scrollbar { margin-right: calc(var(--spacing) * -4); diff --git a/ui/src/views/tool/ToolView.vue b/ui/src/views/tool/ToolView.vue index 0817da730e3..25ee02783c5 100644 --- a/ui/src/views/tool/ToolView.vue +++ b/ui/src/views/tool/ToolView.vue @@ -6,7 +6,7 @@ import ToolApi from '@/api/admin/workspace/tool/tool' import SharedApi from '@/api/admin/workspace/shared' import ToolStoreApi from '@/api/admin/tool-store.ts' import type { Dict, FolderItem, OptionItem, ToolItem, ToolStoreResponse, ToolType } from '@/api/types' -import { RESOURCE_TYPE, TOOL_TYPE } from '@/api/enums' +import { RESOURCE_TYPE, TOOL_TYPE, TOOL_SCOPE } from '@/api/enums' import { TOOL_TYPE_OPTIONS, FOLDER_ENTRIES, FOLDER_ENTRY_ID } from '@/constants' import FolderTree from '@/components/business/folder-tree/index.vue' import MoveToDialog from '@/components/business/folder-tree/MoveToDialog.vue' @@ -68,7 +68,7 @@ const toolType = ref('') function loadToolsPage(pagination: { currentPage: number; pageSize: number }) { const request = isShared.value ? SharedApi : ToolApi - const folderId = isShared.value ? {} : { folder_id: currentFolder.value.id || FOLDER_ENTRY_ID.ALL } + const folderId = isShared.value ? {} : { folder_id: currentFolder.value.id || FOLDER_ENTRY_ID.ALL, scope: TOOL_SCOPE.WORKSPACE } return request.getToolPage(pagination, { ...toolQuery.value, tool_type: toolType.value, ...folderId }) } diff --git a/ui/src/views/tool/tool-form/tool-custom/ToolFormDrawer.vue b/ui/src/views/tool/tool-form/tool-custom/ToolFormDrawer.vue index 4a88ab61df8..61b73617519 100644 --- a/ui/src/views/tool/tool-form/tool-custom/ToolFormDrawer.vue +++ b/ui/src/views/tool/tool-form/tool-custom/ToolFormDrawer.vue @@ -175,7 +175,7 @@ defineExpose({ open })

输出参数

使用工具时显示 -
结果 {result}
+
结果 {result}
diff --git a/ui/src/workflow-canvas/config/node-data.ts b/ui/src/workflow-canvas/config/node-data.ts index 033dd0f11af..d9da5f0e87b 100644 --- a/ui/src/workflow-canvas/config/node-data.ts +++ b/ui/src/workflow-canvas/config/node-data.ts @@ -35,10 +35,14 @@ export const baseNode = { desc: '', prologue: '您好,我是 XXX 小助手,您可以向我提出 XXX 使用问题。\n- XXX 主要功能有什么?\n- XXX 如何收费?\n- 需要转人工服务', tts_type: 'BROWSER', + stt_model_id_type: 'default', + long_term_model_id_type: 'default', }, config: {}, showNode: true, user_input_config: { title: '用户输入' }, + api_input_field_list: [], + chat_input_field_list: [], user_input_field_list: [], }, } @@ -108,7 +112,6 @@ export const aiChatNode = { type: WorkflowNodeType.AiChat, text: '与 AI 大模型进行对话', label: 'AI 对话', - height: 340, properties: { stepName: 'AI 对话', config: { diff --git a/ui/src/workflow-canvas/core/node-container/index.vue b/ui/src/workflow-canvas/core/node-container/index.vue index f3b0f86362e..ecc6fa7ea06 100644 --- a/ui/src/workflow-canvas/core/node-container/index.vue +++ b/ui/src/workflow-canvas/core/node-container/index.vue @@ -1,5 +1,5 @@ + + diff --git a/ui/src/workflow-canvas/nodes/base-node/FileUploadSettingDialog.vue b/ui/src/workflow-canvas/nodes/base-node/FileUploadSettingDialog.vue new file mode 100644 index 00000000000..81e821e9652 --- /dev/null +++ b/ui/src/workflow-canvas/nodes/base-node/FileUploadSettingDialog.vue @@ -0,0 +1,149 @@ + + + diff --git a/ui/src/workflow-canvas/nodes/base-node/LongTermSettingDialog.vue b/ui/src/workflow-canvas/nodes/base-node/LongTermSettingDialog.vue new file mode 100644 index 00000000000..ca8f872cf4e --- /dev/null +++ b/ui/src/workflow-canvas/nodes/base-node/LongTermSettingDialog.vue @@ -0,0 +1,209 @@ + + + diff --git a/ui/src/workflow-canvas/nodes/base-node/ModelParamsDialog.vue b/ui/src/workflow-canvas/nodes/base-node/ModelParamsDialog.vue new file mode 100644 index 00000000000..7df25a29701 --- /dev/null +++ b/ui/src/workflow-canvas/nodes/base-node/ModelParamsDialog.vue @@ -0,0 +1,78 @@ + + + diff --git a/ui/src/workflow-canvas/nodes/base-node/PrologueEditor.vue b/ui/src/workflow-canvas/nodes/base-node/PrologueEditor.vue new file mode 100644 index 00000000000..52fa9a504a8 --- /dev/null +++ b/ui/src/workflow-canvas/nodes/base-node/PrologueEditor.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/ui/src/workflow-canvas/nodes/base-node/index.ts b/ui/src/workflow-canvas/nodes/base-node/index.ts index aada180d049..7793fe7bcad 100644 --- a/ui/src/workflow-canvas/nodes/base-node/index.ts +++ b/ui/src/workflow-canvas/nodes/base-node/index.ts @@ -11,7 +11,7 @@ class BaseNodeView extends WorkflowNodeView { class BaseNodeModel extends WorkflowNodeModel { setAttributes() { super.setAttributes() - this.width = 340 + this.width = 600 } } diff --git a/ui/src/workflow-canvas/nodes/base-node/index.vue b/ui/src/workflow-canvas/nodes/base-node/index.vue index 9c37edf21c7..ee2e91eeb3f 100644 --- a/ui/src/workflow-canvas/nodes/base-node/index.vue +++ b/ui/src/workflow-canvas/nodes/base-node/index.vue @@ -1,51 +1,323 @@ + + diff --git a/ui/src/workflow-canvas/nodes/base-node/types.ts b/ui/src/workflow-canvas/nodes/base-node/types.ts new file mode 100644 index 00000000000..d0c8cbdeda9 --- /dev/null +++ b/ui/src/workflow-canvas/nodes/base-node/types.ts @@ -0,0 +1,69 @@ +import type { FormField } from '@/components/mk-dynamics-form' + +export interface ApiInputField { + assignment_method: 'api_input' + default_value: string + desc: string + is_required: boolean + type: 'input' + variable: string +} + +export interface ChatInputField { + field: string + label: string +} + +export interface FileUploadSetting { + audio: boolean + document: boolean + fileLimit: number + image: boolean + local_upload: boolean + maxFiles: number + other: boolean + otherExtensions: string[] + url_upload: boolean + video: boolean +} + +export interface LongTermSetting { + long_term_model_id: string + long_term_model_id_type: 'custom' | 'default' + long_term_model_params_setting: Record + long_term_trigger_setting: Record + long_term_trigger_type: 'ROUND' | 'SCHEDULED' +} + +export interface BaseNodeForm extends LongTermSetting { + desc: string + file_upload_enable: boolean + file_upload_setting: FileUploadSetting + long_term_enable: boolean + name: string + prologue: string + stt_autosend: boolean + stt_model_enable: boolean + stt_model_id: string + stt_model_id_type: 'custom' | 'default' + tts_autoplay: boolean + tts_model_enable: boolean + tts_model_id: string + tts_model_params_setting: Record + tts_type: 'BROWSER' | 'CUSTOM' | 'DEFAULT' +} + +export type UserInputField = FormField + +export const defaultFileUploadSetting: FileUploadSetting = { + audio: false, + document: true, + fileLimit: 50, + image: false, + local_upload: true, + maxFiles: 3, + other: false, + otherExtensions: ['PPT', 'DOC'], + url_upload: false, + video: false, +} diff --git a/ui/src/workflow-canvas/nodes/start-node/index.vue b/ui/src/workflow-canvas/nodes/start-node/index.vue index fb3790173ce..629fbeb67e1 100644 --- a/ui/src/workflow-canvas/nodes/start-node/index.vue +++ b/ui/src/workflow-canvas/nodes/start-node/index.vue @@ -42,7 +42,10 @@ function refreshFields() { label: field.name ?? field.variable, value: field.variable, })) - const chatInputFields = (cloneDeep(baseNode?.properties.chat_input_field_list ?? []) as SourceField[]).map((field: SourceField) => ({ label: field.label, value: field.field })) + const chatInputFields = (cloneDeep(baseNode?.properties.chat_input_field_list ?? []) as SourceField[]).map((field: SourceField) => ({ + label: field.label, + value: field.field, + })) set(nodeConfig, 'fields', [{ label: '用户问题', value: 'question' }]) set(nodeConfig, 'globalFields', [ @@ -73,7 +76,7 @@ onBeforeUnmount(() => {