From 52c0785e63d95d3a8b4f6d13d2a76f045902ff77 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Wed, 23 Sep 2026 10:01:39 +0800 Subject: [PATCH] feat: tool template --- .../system/shared-resources/tool/store.ts | 21 +++++++++++++++++++ ui/src/views/VIEW_README.md | 4 +++- .../views/home/components/HomeQuickCreate.vue | 4 ++-- .../shared-resources/ToolSharedView.vue | 2 +- ui/src/views/tool/ToolView.vue | 2 +- .../tool/components/ButtonCreateTool.vue | 5 ++--- .../tool/tool-store/ApplyStoreToolDialog.vue | 19 +++++++++++++---- 7 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 ui/src/api/admin/system/shared-resources/tool/store.ts diff --git a/ui/src/api/admin/system/shared-resources/tool/store.ts b/ui/src/api/admin/system/shared-resources/tool/store.ts new file mode 100644 index 00000000000..7db59a7652b --- /dev/null +++ b/ui/src/api/admin/system/shared-resources/tool/store.ts @@ -0,0 +1,21 @@ +import { post } from '../../../core/request' +import type { AddInternalToolPayload, AddStoreToolPayload, ToolItem, UpdateStoreToolPayload } from '@/api/types' + +const prefix = '/system/shared/tool' + +/** 将系统内置工具添加到当前工作空间。 */ +const postInternalTool = (toolId: string, payload: AddInternalToolPayload) => { + return post(`${prefix}/${toolId}/add_internal_tool`, payload) +} + +/** 将商店工具添加到当前工作空间。 */ +const postStoreTool = (toolId: string, payload: AddStoreToolPayload) => { + return post(`${prefix}/${toolId}/add_store_tool`, payload) +} + +/** 将工作空间中的商店工具更新到最新版本。 */ +const postStoreToolUpdate = (toolId: string, payload: UpdateStoreToolPayload) => { + return post(`${prefix}/${toolId}/update_store_tool`, payload) +} + +export default { postInternalTool, postStoreTool, postStoreToolUpdate } diff --git a/ui/src/views/VIEW_README.md b/ui/src/views/VIEW_README.md index 02af71a043c..1c370079a6d 100644 --- a/ui/src/views/VIEW_README.md +++ b/ui/src/views/VIEW_README.md @@ -302,7 +302,9 @@ Workspace 的自定义工具和工作流工具菜单 把不同工具类型的字段重新合并到一个通用表单中。所有调用 `postTool` 创建工具的流程在接口成功后 先调用 `auth.loadAuthBaseProfile()` 刷新当前用户基础资料,再执行成功提示以及列表刷新或工作流页面 跳转;`putTool` 编辑流程不触发该刷新。跨资源范围复用且需要请求的 Action 和表单接收页面传入的完整 Tool API,不额外 -维护逐方法接口类型;固定服务于 Workspace 工具商店的 `StoreToolFormDialog` 直接内聚对应请求。 +维护逐方法接口类型;`ApplyStoreToolDialog` 内聚商店应用请求,提交时通过 +`isSystemSharedResource()` 选择 System 共享资源或 Workspace 的 Tool API 和 Tool Store API, +覆盖内置工具、工作流模板及商店工具三个分支。 工具启用状态属于固定的卡片内交互,由 `ToolStatusSwitch` 使用卡片传入的 Tool API 更新,并通过 `update` 事件通知页面替换列表数据。工具批量选择状态、 批量移动和批量删除流程由 `ToolView` 管理;`MoveToolAction` 复用公共 `MoveToDialog` 完成单个工具移动, diff --git a/ui/src/views/home/components/HomeQuickCreate.vue b/ui/src/views/home/components/HomeQuickCreate.vue index 0a957b4979a..c706b92a74c 100644 --- a/ui/src/views/home/components/HomeQuickCreate.vue +++ b/ui/src/views/home/components/HomeQuickCreate.vue @@ -59,7 +59,7 @@ onMounted(() => - + - + diff --git a/ui/src/views/tool/components/ButtonCreateTool.vue b/ui/src/views/tool/components/ButtonCreateTool.vue index 2c59888d857..831a9f3cf0f 100644 --- a/ui/src/views/tool/components/ButtonCreateTool.vue +++ b/ui/src/views/tool/components/ButtonCreateTool.vue @@ -19,14 +19,13 @@ const { auth } = useStore() const props = withDefaults( defineProps<{ api?: typeof ToolApi | typeof SystemSharedToolApi - showWorkflow?: boolean folderId: string trigger?: 'click' | 'hover' | 'contextmenu' popperStyle?: CSSProperties popperClass?: string fitTriggerWidth?: boolean }>(), - { api: () => ToolApi, showWorkflow: true, trigger: 'click', fitTriggerWidth: false }, + { api: () => ToolApi, trigger: 'click', fitTriggerWidth: false, folderId: 'default' }, ) const emit = defineEmits<{ refresh: [] }>() @@ -128,7 +127,7 @@ function handleRefresh() { 工具 - + 工作流 diff --git a/ui/src/views/tool/tool-store/ApplyStoreToolDialog.vue b/ui/src/views/tool/tool-store/ApplyStoreToolDialog.vue index 7b98ba85725..5a6ef82bd90 100644 --- a/ui/src/views/tool/tool-store/ApplyStoreToolDialog.vue +++ b/ui/src/views/tool/tool-store/ApplyStoreToolDialog.vue @@ -3,14 +3,22 @@ import { reactive, ref } from 'vue' import type { FormInstance, FormRules } from 'element-plus' import ToolApi from '@/api/admin/workspace/tool/tool' import WorkspaceToolStoreApi from '@/api/admin/workspace/tool/store' +import SystemSharedToolApi from '@/api/admin/system/shared-resources/tool/tool' +import SystemSharedToolStoreApi from '@/api/admin/system/shared-resources/tool/store' import { TOOL_TYPE } from '@/api/enums' import type { ToolItem, ToolStoreItem } from '@/api/types' import { useStore } from '@/stores' import { MsgSuccess } from '@/utils/message' +import { isSystemSharedResource } from '@/utils/resource-context' defineOptions({ name: 'StoreToolFormDialog' }) -const props = defineProps<{ folderId?: string }>() +const props = withDefaults( + defineProps<{ + folderId: string + }>(), + { folderId: 'default' }, +) const { auth } = useStore() @@ -36,14 +44,17 @@ function handleSubmit() { loading.value = true const commonPayload = { folder_id: props.folderId || 'default', name } + const isSharedResource = isSystemSharedResource() + const toolApi = isSharedResource ? SystemSharedToolApi : ToolApi + const toolStoreApi = isSharedResource ? SystemSharedToolStoreApi : WorkspaceToolStoreApi let request: Promise if (tool.source === 'internal') { - request = WorkspaceToolStoreApi.postInternalTool(tool.id, commonPayload) + request = toolStoreApi.postInternalTool(tool.id, commonPayload) } else if (tool.label === 'workflow_template') { - request = ToolApi.postTool({ ...commonPayload, code: '{}', tool_type: TOOL_TYPE.WORKFLOW, work_flow_template: tool }) + request = toolApi.postTool({ ...commonPayload, code: '{}', tool_type: TOOL_TYPE.WORKFLOW, work_flow_template: tool }) } else { - request = WorkspaceToolStoreApi.postStoreTool(tool.id, { + request = toolStoreApi.postStoreTool(tool.id, { ...commonPayload, download_callback_url: tool.downloadCallbackUrl ?? '', download_url: tool.downloadUrl ?? '',