From d6fed3d23ac24c052517f1738c67f5c629a874a1 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Sun, 27 Apr 2025 23:11:08 +0800 Subject: [PATCH] perf: fetch url (#4687) --- packages/web/i18n/en/app.json | 1 - packages/web/i18n/zh-CN/app.json | 1 - packages/web/i18n/zh-Hant/app.json | 1 - .../dashboard/apps/JsonImportModal.tsx | 5 +- .../src/pages/api/core/app/fetchWorkflow.ts | 51 ------------------- .../api/support/marketing/fetchWorkflow.ts | 46 +++++++++++++++++ projects/app/src/web/context/useInitApp.ts | 6 ++- projects/app/src/web/core/app/api/app.ts | 7 --- projects/app/src/web/support/marketing/api.ts | 8 +++ 9 files changed, 60 insertions(+), 66 deletions(-) delete mode 100644 projects/app/src/pages/api/core/app/fetchWorkflow.ts create mode 100644 projects/app/src/pages/api/support/marketing/fetchWorkflow.ts create mode 100644 projects/app/src/web/support/marketing/api.ts diff --git a/packages/web/i18n/en/app.json b/packages/web/i18n/en/app.json index 5119328ef..269bcc829 100644 --- a/packages/web/i18n/en/app.json +++ b/packages/web/i18n/en/app.json @@ -187,7 +187,6 @@ "type.Plugin": "Plugin", "type.Simple bot": "Simple App", "type.Workflow bot": "Workflow", - "type.error.URLempty": "The URL cannot be empty", "type.error.Workflow data is empty": "No workflow data was obtained", "type.error.workflowresponseempty": "Response content is empty", "type_not_recognized": "App type not recognized", diff --git a/packages/web/i18n/zh-CN/app.json b/packages/web/i18n/zh-CN/app.json index 0f7fb64a9..59e5ed33a 100644 --- a/packages/web/i18n/zh-CN/app.json +++ b/packages/web/i18n/zh-CN/app.json @@ -196,7 +196,6 @@ "type.Plugin": "插件", "type.Simple bot": "简易应用", "type.Workflow bot": "工作流", - "type.error.URLempty": "URL不能为空", "type.error.Workflow data is empty": "没有获取到工作流数据", "type.error.workflowresponseempty": "响应内容为空", "type_not_recognized": "未识别到应用类型", diff --git a/packages/web/i18n/zh-Hant/app.json b/packages/web/i18n/zh-Hant/app.json index df5c474c1..3546949d7 100644 --- a/packages/web/i18n/zh-Hant/app.json +++ b/packages/web/i18n/zh-Hant/app.json @@ -187,7 +187,6 @@ "type.Plugin": "外掛", "type.Simple bot": "簡易應用程式", "type.Workflow bot": "工作流程", - "type.error.URLempty": "URL不能為空", "type.error.Workflow data is empty": "沒有獲取到工作流數據", "type.error.workflowresponseempty": "響應內容為空", "type_not_recognized": "未識別到應用程式類型", diff --git a/projects/app/src/pageComponents/dashboard/apps/JsonImportModal.tsx b/projects/app/src/pageComponents/dashboard/apps/JsonImportModal.tsx index 3502c0477..b92d54c55 100644 --- a/projects/app/src/pageComponents/dashboard/apps/JsonImportModal.tsx +++ b/projects/app/src/pageComponents/dashboard/apps/JsonImportModal.tsx @@ -16,8 +16,7 @@ import { postCreateApp } from '@/web/core/app/api'; import { useRouter } from 'next/router'; import { form2AppWorkflow } from '@/web/core/app/utils'; import ImportAppConfigEditor from '@/pageComponents/app/ImportAppConfigEditor'; -import { useToast } from '@fastgpt/web/hooks/useToast'; -import { getFetchWorkflow } from '@/web/core/app/api/app'; +import { postFetchWorkflow } from '@/web/support/marketing/api'; import { getUtmParams, getUtmWorkflow, @@ -50,7 +49,7 @@ const JsonImportModal = ({ onClose }: { onClose: () => void }) => { const url = getUtmWorkflow(); if (!url) return; - const workflowData = await getFetchWorkflow({ url }); + const workflowData = await postFetchWorkflow({ url }); setValue('workflowStr', JSON.stringify(workflowData, null, 2)); diff --git a/projects/app/src/pages/api/core/app/fetchWorkflow.ts b/projects/app/src/pages/api/core/app/fetchWorkflow.ts deleted file mode 100644 index 3ccdf491e..000000000 --- a/projects/app/src/pages/api/core/app/fetchWorkflow.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { NextAPI } from '@/service/middleware/entry'; -import { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next'; -import axios from 'axios'; -import { authCert } from '@fastgpt/service/support/permission/auth/common'; - -export type FetchWorkflowBody = { - url: string; -}; - -export type FetchWorkflowQuery = { - url: string; -}; - -export type FetchWorkflowResponseType = ApiResponseType<{ - data: JSON; -}>; - -async function handler( - req: ApiRequestProps, - res: FetchWorkflowResponseType -) { - await authCert({ req, authToken: true }); - - const url = req.body?.url || req.query?.url; - - if (!url) { - return Promise.reject('app:type.error.URLempty'); - } - - const response = await axios.get(url, { - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - 'User-Agent': 'Mozilla/5.0 (compatible; FastGPT/1.0)' - }, - timeout: 30000, - validateStatus: (status) => status < 500 - }); - - const contentType = response.headers['content-type'] || ''; - - if (!response.data || response.data.length === 0) { - return Promise.reject('app:type.error.workflowresponseempty'); - } - - JSON.parse(JSON.stringify(response.data)); - - return response.data; -} - -export default NextAPI(handler); diff --git a/projects/app/src/pages/api/support/marketing/fetchWorkflow.ts b/projects/app/src/pages/api/support/marketing/fetchWorkflow.ts new file mode 100644 index 000000000..43bafc140 --- /dev/null +++ b/projects/app/src/pages/api/support/marketing/fetchWorkflow.ts @@ -0,0 +1,46 @@ +import { NextAPI } from '@/service/middleware/entry'; +import { ApiRequestProps } from '@fastgpt/service/type/next'; +import axios from 'axios'; +import { authCert } from '@fastgpt/service/support/permission/auth/common'; +import { isInternalAddress } from '@fastgpt/service/common/system/utils'; +import { NextApiResponse } from 'next'; + +export type FetchWorkflowBody = { + url: string; +}; + +export type FetchWorkflowQuery = {}; + +export type FetchWorkflowResponseType = { + data: Record; +}; + +async function handler( + req: ApiRequestProps, + res: NextApiResponse +): Promise { + await authCert({ req, authToken: true }); + + const url = req.body?.url; + + if (!url) { + return Promise.reject('Url is empty'); + } + if (isInternalAddress(url)) { + return Promise.reject('Url is invalid'); + } + + const { data } = await axios.get(url, { + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + 'User-Agent': 'Mozilla/5.0 (compatible; FastGPT/1.0)' + }, + timeout: 30000, + validateStatus: (status) => status < 500 + }); + + return data; +} + +export default NextAPI(handler); diff --git a/projects/app/src/web/context/useInitApp.ts b/projects/app/src/web/context/useInitApp.ts index 4af7fe92d..2db0444e6 100644 --- a/projects/app/src/web/context/useInitApp.ts +++ b/projects/app/src/web/context/useInitApp.ts @@ -84,7 +84,7 @@ export const useInitApp = () => { }); // Marketing data track - useEffect(() => { + useMount(() => { setInviterId(hiId); setBdVId(bd_vid); setUtmWorkflow(utm_workflow); @@ -97,7 +97,9 @@ export const useInitApp = () => { }; setUtmParams(utmParams); setFastGPTSem({ keyword: k, ...utmParams }); - }, [bd_vid, hiId, k, utm_workflow, sourceDomain, utm_source, utm_medium, utm_content]); + + router.replace(router.pathname); + }); return { feConfigs, diff --git a/projects/app/src/web/core/app/api/app.ts b/projects/app/src/web/core/app/api/app.ts index 2b36cca6a..0dc719e21 100644 --- a/projects/app/src/web/core/app/api/app.ts +++ b/projects/app/src/web/core/app/api/app.ts @@ -10,10 +10,6 @@ import type { } from '@/pages/api/core/app/transitionWorkflow'; import type { copyAppQuery, copyAppResponse } from '@/pages/api/core/app/copy'; -import type { - FetchWorkflowQuery, - FetchWorkflowResponseType -} from '@/pages/api/core/app/fetchWorkflow'; /* folder */ export const postCreateAppFolder = (data: CreateAppFolderBody) => POST('/core/app/folder/create', data); @@ -29,6 +25,3 @@ export const postTransition2Workflow = (data: transitionWorkflowBody) => POST('/core/app/transitionWorkflow', data); export const postCopyApp = (data: copyAppQuery) => POST('/core/app/copy', data); - -export const getFetchWorkflow = (data: FetchWorkflowQuery) => - GET('/core/app/fetchWorkflow', data); diff --git a/projects/app/src/web/support/marketing/api.ts b/projects/app/src/web/support/marketing/api.ts new file mode 100644 index 000000000..95caae045 --- /dev/null +++ b/projects/app/src/web/support/marketing/api.ts @@ -0,0 +1,8 @@ +import { POST } from '@/web/common/api/request'; +import { + FetchWorkflowQuery, + FetchWorkflowResponseType +} from '@/pages/api/support/marketing/fetchWorkflow'; + +export const postFetchWorkflow = (data: FetchWorkflowQuery) => + POST('/support/marketing/fetchWorkflow', data);