From f515e897e96c73db768cb54390e544a98e028292 Mon Sep 17 00:00:00 2001 From: shuanglin Date: Mon, 6 Jan 2025 15:43:10 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=B0=83=E6=95=B4=E6=8E=A5=E5=8F=A3=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=A1=B5=E9=9D=A2bug=202.=E6=95=B4=E7=90=86=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=BB=93=E6=9E=84=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E4=B8=AD=E5=AF=B9=E5=BA=94=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=90=8D=E7=A7=B0=E4=B8=8A=E4=B8=8B=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vue/y9vue-interfacePlatform/.env.development | 6 +- .../src/api/interface/interface.ts | 26 +++++-- .../src/api/lib/requestNode.js | 8 ++- .../src/views/home/home.vue | 18 ++--- .../src/views/interface/interfaceDialog.vue | 13 ++++ .../src/views/interface/interfaceRegister.vue | 15 ++++- .../src/views/interfaceTest/testDialog.vue | 67 ++++++++++++------- y9-module-interface/pom.xml | 45 +++++++++++++ .../src/main/resources/application.yml | 9 ++- .../pom.xml | 2 +- .../src/main/resources/application.yml | 8 +-- 11 files changed, 162 insertions(+), 55 deletions(-) create mode 100644 y9-module-interface/pom.xml diff --git a/vue/y9vue-interfacePlatform/.env.development b/vue/y9vue-interfacePlatform/.env.development index d63c15b..f461c8d 100644 --- a/vue/y9vue-interfacePlatform/.env.development +++ b/vue/y9vue-interfacePlatform/.env.development @@ -9,10 +9,10 @@ VUE_APP_PUBLIC_PATH = '/interface/' VUE_APP_HOST = 'http://localhost:7055/' # index页面 VUE_APP_HOST_INDEX = 'http://localhost:7070/interface/' -# y9home接口 -VUE_APP_CONTEXT = 'http://localhost:7055/interfacePlatform/' +# 后端请求路径 +VUE_APP_CONTEXT = 'http://localhost:7055/interfaceManager/' # 执行转发节点入口接口 -VUE_APP_NODE_CONTEXT = 'http://localhost:7055/interfacePlatform/' +VUE_APP_NODE_CONTEXT = 'http://localhost:7055/interfaceExecute/' # kernel-log接口 VUE_APP_LOG_URL = 'http://localhost:7055/log/' # sso接口 diff --git a/vue/y9vue-interfacePlatform/src/api/interface/interface.ts b/vue/y9vue-interfacePlatform/src/api/interface/interface.ts index 06faaf7..cc0f1b8 100644 --- a/vue/y9vue-interfacePlatform/src/api/interface/interface.ts +++ b/vue/y9vue-interfacePlatform/src/api/interface/interface.ts @@ -58,13 +58,25 @@ export const saveInterfaceInfo = async (data) => { * @returns */ export const testInterface = async (data) => { - return await nodeRequest({ - url: "/api/rest/interface/testInterface", - method: 'POST', - JSON:true, - cType: false, - data - }); + if(data.isResponseFile){ + return await nodeRequest({ + url: "/api/rest/interface/testInterface", + method: 'POST', + JSON:true, + cType: false, + isDowFile: true, + responseType:'blob', + data + }); + }else{ + return await nodeRequest({ + url: "/api/rest/interface/testInterface", + method: 'POST', + JSON:true, + cType: false, + data + }); + } }; /** diff --git a/vue/y9vue-interfacePlatform/src/api/lib/requestNode.js b/vue/y9vue-interfacePlatform/src/api/lib/requestNode.js index b6feb74..23669ed 100644 --- a/vue/y9vue-interfacePlatform/src/api/lib/requestNode.js +++ b/vue/y9vue-interfacePlatform/src/api/lib/requestNode.js @@ -20,6 +20,7 @@ import { $y9_SSO } from '@/main'; // 创建一个axios实例 function y9Request(baseUrl = '') { let requestList = new Set(); + let isDowFile = false; const service = axios.create({ baseURL: import.meta.env.VUE_APP_NODE_CONTEXT, @@ -46,7 +47,7 @@ function y9Request(baseUrl = '') { config.headers['Authorization'] = 'Bearer ' + access_token; } config.headers['Accept'] = '*/*' - + isDowFile = config.isDowFile; return config; }, (error) => { @@ -69,7 +70,7 @@ function y9Request(baseUrl = '') { res = response; } const { code } = res; - if (code !== 0) { + if (code!=undefined && code !== 0) { // 获取替换后的字符串 const reqUrl = response.config.url.split('?')[0].replace(response.config.baseURL, ''); const noVerifyBool = settings.ajaxResponseNoVerifyUrl.includes(reqUrl); @@ -126,6 +127,9 @@ function y9Request(baseUrl = '') { } } else { + if(isDowFile){ + return response; + } return res; } }, diff --git a/vue/y9vue-interfacePlatform/src/views/home/home.vue b/vue/y9vue-interfacePlatform/src/views/home/home.vue index a9bd1d6..d2f7cb2 100644 --- a/vue/y9vue-interfacePlatform/src/views/home/home.vue +++ b/vue/y9vue-interfacePlatform/src/views/home/home.vue @@ -117,7 +117,7 @@ const fetchTableData = async ( } else { dataRef.value = []; pagination.value.total = 0; - ElMessage.error(errorMessage); + // ElMessage.error(errorMessage); } } finally { pagination.value.loading = false; @@ -149,11 +149,11 @@ async function fetchOverviewData() { overviewData.value.stopCount = res.data.stopCount || 0; overviewData.value.runningCount = res.data.runningCount || 0; } else { - ElMessage.error('获取接口概况数据失败'); + // ElMessage.error('获取接口概况数据失败'); } } catch (error) { - console.error('获取接口概况数据失败:', error); + // console.error('获取接口概况数据失败:', error); } }; @@ -164,10 +164,10 @@ async function fetchRunningCountData() { runningCountData.value.normalCount = res.data.normalCount || 0 runningCountData.value.abnormalCount = res.data.abnormalCount || 0 } else { - ElMessage.error('获取接口运行状态数据失败'); + // ElMessage.error('获取接口运行状态数据失败'); } } catch (error) { - console.error('获取接口运行状态数据失败:', error); + // console.error('获取接口运行状态数据失败:', error); } }; @@ -182,10 +182,10 @@ const fetchTrendData = async () => { }; updateTrendChart(); } else { - ElMessage.error('获取接口趋势图数据失败'); + // ElMessage.error('获取接口趋势图数据失败'); } } catch (error) { - console.error('获取接口趋势图数据失败:', error); + // console.error('获取接口趋势图数据失败:', error); } }; @@ -199,11 +199,11 @@ async function fetchLogOverviewData() { logOverviewData.value.todayAllTotal = res.data.todayAllTotal || 0; logOverviewData.value.todayAllErrorTotal = res.data.todayAllErrorTotal || 0; } else { - ElMessage.error('获取日志概况数据失败'); + // ElMessage.error('获取日志概况数据失败'); } } catch (error) { - console.error('获取日志概况数据失败:', error); + // console.error('获取日志概况数据失败:', error); } }; diff --git a/vue/y9vue-interfacePlatform/src/views/interface/interfaceDialog.vue b/vue/y9vue-interfacePlatform/src/views/interface/interfaceDialog.vue index b386430..3a9856a 100644 --- a/vue/y9vue-interfacePlatform/src/views/interface/interfaceDialog.vue +++ b/vue/y9vue-interfacePlatform/src/views/interface/interfaceDialog.vue @@ -835,6 +835,7 @@ let ruleFormConfig = ref({ ], interfaceType: [{ required: true, message: computed(() => t('接口类型不能为空')), trigger: 'blur' }], interfaceMethod: [{ required: true, message: computed(() => t('请求方式不能为空')), trigger: 'blur' }], + isResponseFile: [{ required: true, message: computed(() => t('是否返回文件不能为空')), trigger: 'blur' }], networkAgreement: [{ required: true, message: computed(() => t('网络协议不能为空')), trigger: 'blur' }], head: [{ required: true, message: computed(() => t('接口负责人不能为空')), trigger: 'blur' }], headPhone: [{ required: true, message: computed(() => t('接口负责人联系方式不能为空')), trigger: 'blur' } @@ -917,6 +918,18 @@ let ruleFormConfig = ref({ } } }, + { + type: 'select', + label: computed(() => t('是否返回文件')), + prop: 'isResponseFile', + props: { + options: [ + //选项列表 + { label: computed(() => t('是')), value: true }, + { label: computed(() => t('否')), value: false } + ] + } + }, { type: 'slot', label: computed(() => t('是否限流')), diff --git a/vue/y9vue-interfacePlatform/src/views/interface/interfaceRegister.vue b/vue/y9vue-interfacePlatform/src/views/interface/interfaceRegister.vue index e4e5279..b9a0be3 100644 --- a/vue/y9vue-interfacePlatform/src/views/interface/interfaceRegister.vue +++ b/vue/y9vue-interfacePlatform/src/views/interface/interfaceRegister.vue @@ -725,6 +725,7 @@ let ruleFormConfig = ref({ ], interfaceType:[{required: true, message: computed(() => t('接口类型不能为空')), trigger: 'blur'}], interfaceMethod:[{required: true, message: computed(() => t('请求方式不能为空')), trigger: 'blur'}], + isResponseFile: [{ required: true, message: computed(() => t('是否返回文件不能为空')), trigger: 'blur' }], networkAgreement:[{required: true, message: computed(() => t('网络协议不能为空')), trigger: 'blur'}], head:[{required: true, message: computed(() => t('接口负责人不能为空')), trigger: 'blur'}], headPhone:[{required: true, message: computed(() => t('负责人联系方式不能为空')), trigger: 'blur'} @@ -810,6 +811,18 @@ let ruleFormConfig = ref({ } } }, + { + type: 'select', + label: computed(() => t('是否返回文件')), + prop: 'isResponseFile', + props: { + options: [ + //选项列表 + { label: computed(() => t('是')), value: true }, + { label: computed(() => t('否')), value: false } + ] + } + }, { type: 'slot', label: computed(() => t('是否限流')), @@ -875,7 +888,7 @@ let ruleFormConfig = ref({ } systemList.value.push(item) } - ruleFormConfig.value.itemList[10].props.options = systemList.value + ruleFormConfig.value.itemList[11].props.options = systemList.value }) } } diff --git a/vue/y9vue-interfacePlatform/src/views/interfaceTest/testDialog.vue b/vue/y9vue-interfacePlatform/src/views/interfaceTest/testDialog.vue index a43f707..5928350 100644 --- a/vue/y9vue-interfacePlatform/src/views/interfaceTest/testDialog.vue +++ b/vue/y9vue-interfacePlatform/src/views/interfaceTest/testDialog.vue @@ -130,6 +130,8 @@ import { useRoute } from 'vue-router'; import { nextTick } from 'vue'; import VueJsonPretty from 'vue-json-pretty'; import 'vue-json-pretty/lib/styles.css' +import y9_storage from '@/utils/storage'; +import settings from '@/settings'; // 注入 字体对象 const fontSizeObj: any = inject('sizeObjInfo'); @@ -611,7 +613,7 @@ let ruleFormConfig = ref({ interfaceMethod: [{ required: true, message: computed(() => t('请求方式不能为空')), trigger: 'blur' }], networkAgreement: [{ required: true, message: computed(() => t('网络协议不能为空')), trigger: 'blur' }], head: [{ required: true, message: computed(() => t('接口负责人不能为空')), trigger: 'blur' }], - isResponseFile: [{ required: true, message: computed(() => t('是否返回文件')), trigger: 'blur' }], + isResponseFile: [{ required: true, message: computed(() => t('是否返回文件不能为空')), trigger: 'blur' }], headPhone: [{ required: true, message: computed(() => t('接口负责人联系方式不能为空')), trigger: 'blur' } , { validator: validatePhone, trigger: 'blur' } ], @@ -688,11 +690,10 @@ let ruleFormConfig = ref({ label: computed(() => t('是否返回文件')), prop: 'isResponseFile', props: { - disabled: true, options: [ //选项列表 - { label: computed(() => t('是')), value: 'true' }, - { label: computed(() => t('否')), value: 'false' } + { label: computed(() => t('是')), value: true }, + { label: computed(() => t('否')), value: false } ] } }, @@ -904,10 +905,10 @@ function confirDialog(type) { async function addDialog() { ruleFormConfig.value.model = {} ruleFormConfig.value.model.networkAgreement = "http" - ruleFormConfig.value.model.interfaceUrl = "192.168.31.94:7055/interfacePlatform/openInterface/test" + ruleFormConfig.value.model.interfaceUrl = "127.0.0.1:7055/interfaceExecute/openInterface/forward" ruleFormConfig.value.model.interfaceType = "Rest" ruleFormConfig.value.model.interfaceMethod = "post" - ruleFormConfig.value.model.isResponseFile = "false" + ruleFormConfig.value.model.isResponseFile = true initFormData() let res = await getInterfaceId() ruleFormConfig.value.model.id = res.data @@ -1196,25 +1197,45 @@ const submitData = () => { } data.reqParameters = JSON.stringify(reqData) - let res = await testInterface( - data - ); - if (data.isResponseFile == "true") { - const a = document.createElement('a') - a.href = URL.createObjectURL(new Blob(res, { type: 'application/octet-stream' })) - // 获取文件名 - const contentDisposition = res.headers.get('Content-Disposition'); - let fileName = '流文件'; - if (contentDisposition && contentDisposition.includes('attachment')) { - const match = contentDisposition.match(/filename="(["]*)"/); - if (match) { - fileName = match; - } - } - a.download = fileName - a.click() + const access_token = y9_storage.getObjectItem(settings.siteTokenKey, 'access_token'); + + if (data.isResponseFile) { + let contentDisposition = ""; + fetch(import.meta.env.VUE_APP_NODE_CONTEXT + 'api/rest/interface/testInterface', { + method: 'POST', + body: JSON.stringify(data), + headers: new Headers({ + 'Authorization': 'Bearer ' + access_token, + 'Content-Type':'application/json', + 'Accept':'*/*' + }), + }) + .then(res => { + contentDisposition = res.headers.get("content-disposition") + return res.blob()}) + .then(data => { + const blobUrl = window.URL.createObjectURL(data); + const a = document.createElement('a'); + let fileName = '流文件'; + if (contentDisposition && contentDisposition.includes('attachment')) { + const match = contentDisposition.match(/filename="?([^";]*)"?/); + if (match) { + fileName = decodeURIComponent(match[1]); + } + console.log(match) + } + a.download = fileName; + a.href = blobUrl; + a.click(); + loading.value = false + window.URL.revokeObjectURL(blobUrl); + + }); } else { + let res = await testInterface( + data + ); if (res.code == 0) { ElMessage({ diff --git a/y9-module-interface/pom.xml b/y9-module-interface/pom.xml new file mode 100644 index 0000000..6abb7e4 --- /dev/null +++ b/y9-module-interface/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + + net.risesoft + y9-digitalbase + v9.6.8-SNAPSHOT + + + + y9-module-interface + pom + y9-module-interface + InterfacePlatform Engine y9-module-interface project parent pom.xml file + + + risenet-y9boot-support-interface-jpa-repository + risenet-y9boot-webapp-interface-platform-execute + risenet-y9boot-webapp-interface-platform-manager + + + + + deploy-maven-central + + + + org.sonatype.central + central-publishing-maven-plugin + + + risenet-y9boot-webapp-interface-platform-execute + risenet-y9boot-webapp-interface-platform-manager + + + + + + + + + \ No newline at end of file diff --git a/y9-module-interface/risenet-y9boot-webapp-interface-platform-execute/src/main/resources/application.yml b/y9-module-interface/risenet-y9boot-webapp-interface-platform-execute/src/main/resources/application.yml index ed0d533..0c16cfc 100644 --- a/y9-module-interface/risenet-y9boot-webapp-interface-platform-execute/src/main/resources/application.yml +++ b/y9-module-interface/risenet-y9boot-webapp-interface-platform-execute/src/main/resources/application.yml @@ -5,7 +5,7 @@ server: error: include-message: always servlet: - context-path: /interfacePlatform + context-path: /interfaceExecute register-default-servlet: true encoding: charset: UTF-8 @@ -17,7 +17,7 @@ server: uri-encoding: UTF-8 spring: application: - name: interfacePlatform + name: interfaceExecute aop: auto: false proxy-target-class: false @@ -71,7 +71,7 @@ spring: useGlobalDataSourceStat: true validationQuery: SELECT 1 FROM DUAL jmx: - default-domain: interfacePlatform + default-domain: interfaceExecute jpa: hibernate: naming: @@ -125,8 +125,7 @@ spring: maxFileSize: 200MB maxRequestSize: 1000MB y9: - interfacePath: /home - systemName: interfacePlatform + systemName: interfaceExecute common: idEnabled: 0 kafkaEnabled: false diff --git a/y9-module-interface/risenet-y9boot-webapp-interface-platform-manager/pom.xml b/y9-module-interface/risenet-y9boot-webapp-interface-platform-manager/pom.xml index a586aef..17c47d8 100644 --- a/y9-module-interface/risenet-y9boot-webapp-interface-platform-manager/pom.xml +++ b/y9-module-interface/risenet-y9boot-webapp-interface-platform-manager/pom.xml @@ -221,7 +221,7 @@ - Y9-interfaceManagementPlatform + interfaceManager org.apache.maven.plugins diff --git a/y9-module-interface/risenet-y9boot-webapp-interface-platform-manager/src/main/resources/application.yml b/y9-module-interface/risenet-y9boot-webapp-interface-platform-manager/src/main/resources/application.yml index ed0d533..5dcedc5 100644 --- a/y9-module-interface/risenet-y9boot-webapp-interface-platform-manager/src/main/resources/application.yml +++ b/y9-module-interface/risenet-y9boot-webapp-interface-platform-manager/src/main/resources/application.yml @@ -5,7 +5,7 @@ server: error: include-message: always servlet: - context-path: /interfacePlatform + context-path: /interfaceManager register-default-servlet: true encoding: charset: UTF-8 @@ -17,7 +17,7 @@ server: uri-encoding: UTF-8 spring: application: - name: interfacePlatform + name: interfaceManager aop: auto: false proxy-target-class: false @@ -71,7 +71,7 @@ spring: useGlobalDataSourceStat: true validationQuery: SELECT 1 FROM DUAL jmx: - default-domain: interfacePlatform + default-domain: interfaceManager jpa: hibernate: naming: @@ -126,7 +126,7 @@ spring: maxRequestSize: 1000MB y9: interfacePath: /home - systemName: interfacePlatform + systemName: interfaceManager common: idEnabled: 0 kafkaEnabled: false