diff --git a/src/utils/menu.ts b/src/utils/menu.ts index 80ad2814..9b3b3e9d 100644 --- a/src/utils/menu.ts +++ b/src/utils/menu.ts @@ -181,13 +181,13 @@ const handleMeta = (item: MenuItem, isApp: boolean) => { } } -const findComponents = (code: string, level: number, isApp: boolean, components: any) => { +const findComponents = (code: string, level: number, isApp: boolean, components: any, mate: any, hasChildren: boolean) => { const myComponents = components[code] if (level === 1) { // BasicLayoutPage - if (myComponents) { - return h(BasicLayoutPage, {}, () => [h(defineAsyncComponent(() => myComponents()), {})]) + if (myComponents && !hasChildren) { + return mate?.hasLayout === false ? () => myComponents() : h(BasicLayoutPage, {}, () => [h(defineAsyncComponent(() => myComponents()), {})]) } - if (isApp) { + if (isApp && !hasChildren) { return h(BasicLayoutPage, {}, () => [h(Iframe, {})]) } return myComponents ? () => myComponents() : BasicLayoutPage @@ -268,7 +268,7 @@ export const handleMenus = (menuData: any[], components: any, level: number = 1) children: item.children } - route.component = findComponents(item.code, level, isApp, components) + route.component = findComponents(item.code, level, isApp, components, item.meta, !!item.chidlren?.length) const extraRoute = hasExtraChildren(item, extraRouteObj) const detail_components = findDetailRouteItem(item, components) diff --git a/src/views/device/components/Metadata/Import/index.vue b/src/views/device/components/Metadata/Import/index.vue index 8789b971..361167c5 100644 --- a/src/views/device/components/Metadata/Import/index.vue +++ b/src/views/device/components/Metadata/Import/index.vue @@ -197,6 +197,7 @@ import { getToken, onlyMessage } from '@/utils/comm'; import { useMetadataStore } from '@/store/metadata'; import { omit } from 'lodash-es'; import { Modal } from 'jetlinks-ui-components'; +import { testObject , testType , testAliType , testAliObject} from './valideta' const route = useRoute(); const instanceStore = useInstanceStore(); @@ -298,18 +299,19 @@ const requiredCheck = (data:any) =>{ onlyMessage(`标签定义第${index + 1}个数组中缺失valueType.type属性`,'error'); check = true return + }else{ + check = testType(item,index) } if(!item?.expands?.source){ onlyMessage(`属性定义第${index + 1}个数组中缺失expands.source属性`,'error'); check = true return } - if((item?.expands?.source === 'device' || item?.expands?.source === 'rule') && !item?.expands?.type){ onlyMessage(`属性定义第${index + 1}个数组中缺失type属性`,'error'); check = true return - } + } }) } if(data?.functions && !check){ @@ -329,6 +331,16 @@ const requiredCheck = (data:any) =>{ check = true return } + if(item?.inputs){ + testObject(item.inputs,index) + item.inputs.forEach((i:any)=>{ + if(!i?.expands?.required && i?.expands?.required !== false){ + onlyMessage(`方法定义inputs第${index+1}个数组中缺失expands.required属性`,'error') + check = true + return + } + }) + } }) } if(data?.events && !check){ @@ -401,6 +413,8 @@ const requiredCheck = (data:any) =>{ onlyMessage(`标签定义第${index + 1}个数组中缺失valueType.type属性`,'error'); check = true return + }else{ + testType(item?.valueType?.type,index) } if(!item?.expands?.type){ onlyMessage(`标签定义第${index + 1}个数组中缺失expands.type属性`,'error'); @@ -430,6 +444,8 @@ const aliCheck = (data:any) => { onlyMessage(`属性定义第${index + 1}个数组中缺失dataType.type属性`,'error'); check = true return + }else{ + testAliType(item,index) } }) } @@ -450,6 +466,9 @@ const aliCheck = (data:any) => { check = true return } + if(item?.inputData){ + testAliObject(item.inputData,index) + } }) } if(data?.events && !check){ diff --git a/src/views/device/components/Metadata/Import/valideta.ts b/src/views/device/components/Metadata/Import/valideta.ts new file mode 100644 index 00000000..df2d5841 --- /dev/null +++ b/src/views/device/components/Metadata/Import/valideta.ts @@ -0,0 +1,141 @@ +import { onlyMessage } from "@/utils/comm" +export const testProperties = (data:any) =>{ + +} + +export const testType = (data:any,index:number,isArray?:boolean,isObject?:boolean)=>{ + if(data.valueType.type === 'boolean'){ + if(!data?.valueType?.trueText || !data?.valueType?.trueValue || !data?.valueType?.falseText || !data?.valueType?.falseValue){ + onlyMessage(`方法定义inputs第${index+1}个数组ValueType中缺失必填属性`,'error') + return true + } + } + if(data.valueType.type === 'enum' && !isObject){ + if(data.valueType?.elements?.length > 0){ + data.valueType.elements.forEach((a:any,b:number)=>{ + if(!a.value || !a.text){ + onlyMessage(`方法定义inputs第${index+1}个数组ValueType中elements缺失必填属性`,'error') + return true + } + }) + }else{ + onlyMessage(`方法定义inputs第${index+1}个数组ValueType中缺失elements属性`,'error') + return true + } + } + if(data.valueType.type === 'array' && !isArray && !isObject){ + if(data.valueType?.elementType){ + testType(data.valueType.elementType,index,true) + }else{ + onlyMessage(`方法定义inputs第${index+1}个数组ValueType中缺失elementType属性`,'error') + return true + } + } + if(data.valueType.type === 'file' && !isArray && !isObject){ + if(!data.valueType?.fileType){ + onlyMessage(`方法定义inputs第${index+1}个数组ValueType中缺失fileType属性`,'error') + return true + } + } + if(data.valueType.type === 'object' && !isArray && !isObject){ + if(data?.valueType?.properties?.length > 0){ + return testObject(data.valueType.properties,index) + }else{ + onlyMessage(`方法定义inputs第${index+1}个数组ValueType中缺失properties属性`,'error') + return true + } + } +} +export const testObject = (data:any,index:number)=>{ + let check = false + data.forEach((i:any)=>{ + if(!i?.id){ + onlyMessage(`方法定义inputs第${index+1}个数组中缺失id属性`,'error') + check = true + return + } + if(!i?.name){ + onlyMessage(`方法定义inputs第${index+1}个数组中缺失name属性`,'error') + check = true + return + } + if(!i?.valueType?.type){ + onlyMessage(`方法定义inputs第${index+1}个数组中缺失valueType.type属性`,'error') + check = true + return + }else{ + check = testType(i,index,false,true) + return + } + }) + return check +} + +export const testAliType = (data:any,index:number,isArray?:boolean,isObject?:boolean)=>{ + if(data.dataType.type === 'boolean'){ + if(!data?.dataType?.trueText || !data?.dataType?.trueValue || !data?.dataType?.falseText || !data?.dataType?.falseValue){ + onlyMessage(`方法定义inputs第${index+1}个数组dataType中缺失必填属性`,'error') + return true + } + } + if(data.dataType.type === 'enum' && !isObject){ + if(data.dataType?.elements?.length > 0){ + data.dataType.elements.forEach((a:any,b:number)=>{ + if(!a.value || !a.text){ + onlyMessage(`方法定义inputs第${index+1}个数组dataType中elements缺失必填属性`,'error') + return true + } + }) + }else{ + onlyMessage(`方法定义inputs第${index+1}个数组dataType中缺失elements属性`,'error') + return true + } + } + if(data.dataType.type === 'array' && !isArray && !isObject){ + if(data.dataType?.elementType){ + testType(data.dataType.elementType,index,true) + }else{ + onlyMessage(`方法定义inputs第${index+1}个数组dataType中缺失elementType属性`,'error') + return true + } + } + if(data.dataType.type === 'file' && !isArray && !isObject){ + if(!data.dataType?.fileType){ + onlyMessage(`方法定义inputs第${index+1}个数组dataType中缺失fileType属性`,'error') + return true + } + } + if(data.dataType.type === 'object' && !isArray && !isObject){ + if(data?.dataType?.properties?.length > 0){ + return testAliObject(data.dataType.properties,index) + }else{ + onlyMessage(`方法定义inputs第${index+1}个数组dataType中缺失properties属性`,'error') + return true + } + } +} + +export const testAliObject = (data:any,index:number)=>{ + let check = false + data.forEach((i:any)=>{ + if(!i?.identifier){ + onlyMessage(`方法定义inputs第${index+1}个数组中缺失id属性`,'error') + check = true + return + } + if(!i?.name){ + onlyMessage(`方法定义inputs第${index+1}个数组中缺失name属性`,'error') + check = true + return + } + if(!i?.dataType?.type){ + onlyMessage(`方法定义inputs第${index+1}个数组中缺失dataType.type属性`,'error') + check = true + return + }else{ + check = testAliType(i,index,false,true) + return + } + }) + return check +} \ No newline at end of file diff --git a/src/views/system/Platforms/Api/components/ApiTest.vue b/src/views/system/Platforms/Api/components/ApiTest.vue index 4f52f9c0..bc3ef0c4 100644 --- a/src/views/system/Platforms/Api/components/ApiTest.vue +++ b/src/views/system/Platforms/Api/components/ApiTest.vue @@ -52,12 +52,6 @@ requestBody.pageSize, 'value', ]" - :rules="[ - { - required: true, - message: '该字段是必填字段', - }, - ]" > { }; let url = props.selectApi?.url; - const urlParams = {}; - requestBody.params.paramsTable.forEach((item) => { - if (methodName === 'get') urlParams[item.name] = item.value; + let params + if (methodName === 'get'){ + const urlParams = {}; + requestBody.params.paramsTable.forEach((item) => { + urlParams[item.name] = item.value; if (url.includes(`{${item.name}}`)) url = url.replace(`{${item.name}}`, item.value); }); - const params = { + params = { ...JSON.parse(requestBody.code || '{}'), ...urlParams, }; + }else{ + params = JSON.parse(requestBody.code || '{}') + } + server[methodObj[methodName]](url, params).then((resp: any) => { // 如果用户没填写参数且有body的情况下,给用户展示请求示例 if (Object.keys(params).length === 0 && refStr.value) {