fix (接口定义): case历史数据兼容处理

This commit is contained in:
fit2-zhao 2021-09-06 13:18:23 +08:00 committed by fit2-zhao
parent ec1b4bbdfd
commit d7b0000505
4 changed files with 204 additions and 171 deletions

View File

@ -109,7 +109,7 @@ public class JSONSchemaGenerator {
concept.put(propertyName, analyzeEnumProperty(object)); concept.put(propertyName, analyzeEnumProperty(object));
} else if (propertyObjType.equals("string")) { } else if (propertyObjType.equals("string")) {
// 先设置空值 // 先设置空值
concept.put(propertyName, null); concept.put(propertyName, "");
if (object.has("format")) { if (object.has("format")) {
String propertyFormat = object.get("format").getAsString(); String propertyFormat = object.get("format").getAsString();
if (propertyFormat.equals("date-time")) { if (propertyFormat.equals("date-time")) {

View File

@ -27,211 +27,232 @@
</el-radio-group> </el-radio-group>
<div style="min-width: 1200px;" v-if="body.type == 'Form Data' || body.type == 'WWW_FORM'"> <div style="min-width: 1200px;" v-if="body.type == 'Form Data' || body.type == 'WWW_FORM'">
<el-row v-if="body.type == 'Form Data' || body.type == 'WWW_FORM'"> <el-row v-if="body.type == 'Form Data' || body.type == 'WWW_FORM'">
<el-link class="ms-el-link" @click="batchAdd"> {{$t("commons.batch_add")}}</el-link> <el-link class="ms-el-link" @click="batchAdd"> {{ $t("commons.batch_add") }}</el-link>
</el-row> </el-row>
<ms-api-variable :with-mor-setting="true" :is-read-only="isReadOnly" <ms-api-variable
:parameters="body.kvs" :with-mor-setting="true"
:isShowEnable="isShowEnable" type="body"/> :is-read-only="isReadOnly"
:parameters="body.kvs"
:isShowEnable="isShowEnable"
type="body"/>
</div> </div>
<div v-if="body.type == 'JSON'"> <div v-if="body.type == 'JSON'">
<div style="padding: 10px"> <div style="padding: 10px">
<el-switch active-text="JSON-SCHEMA" v-model="body.format" @change="formatChange" active-value="JSON-SCHEMA"/> <el-switch active-text="JSON-SCHEMA" v-model="body.format" @change="formatChange" active-value="JSON-SCHEMA"/>
</div> </div>
<ms-json-code-edit v-if="body.format==='JSON-SCHEMA'" :body="body" ref="jsonCodeEdit"/> <ms-json-code-edit
<ms-code-edit v-else-if="codeEditActive" :read-only="isReadOnly" height="400px" :data.sync="body.raw" :modes="modes" :mode="'json'" ref="codeEdit"/> v-if="body.format==='JSON-SCHEMA'"
:body="body"
ref="jsonCodeEdit"/>
<ms-code-edit
v-else-if="codeEditActive"
:read-only="isReadOnly"
:data.sync="body.raw"
:modes="modes"
:mode="'json'"
height="400px"
ref="codeEdit"/>
</div> </div>
<div class="ms-body" v-if="body.type == 'XML'"> <div class="ms-body" v-if="body.type == 'XML'">
<ms-code-edit :read-only="isReadOnly" :data.sync="body.raw" :modes="modes" :mode="'text'" ref="codeEdit"/> <ms-code-edit
:read-only="isReadOnly"
:data.sync="body.raw"
:modes="modes"
:mode="'text'"
ref="codeEdit"/>
</div> </div>
<div class="ms-body" v-if="body.type == 'Raw'"> <div class="ms-body" v-if="body.type == 'Raw'">
<ms-code-edit :read-only="isReadOnly" :data.sync="body.raw" :modes="modes" ref="codeEdit"/> <ms-code-edit
:read-only="isReadOnly"
:data.sync="body.raw"
:modes="modes"
ref="codeEdit"/>
</div> </div>
<ms-api-binary-variable :is-read-only="isReadOnly" <ms-api-binary-variable
:parameters="body.binary" :is-read-only="isReadOnly"
:isShowEnable="isShowEnable" :parameters="body.binary"
type="body" :isShowEnable="isShowEnable"
v-if="body.type == 'BINARY'"/> type="body"
v-if="body.type == 'BINARY'"/>
<batch-add-parameter @batchSave="batchSave" ref="batchAddParameter"/> <batch-add-parameter @batchSave="batchSave" ref="batchAddParameter"/>
</div> </div>
</template> </template>
<script> <script>
import MsApiKeyValue from "../ApiKeyValue"; import MsApiKeyValue from "../ApiKeyValue";
import {BODY_TYPE, KeyValue} from "../../model/ApiTestModel"; import {BODY_TYPE, KeyValue} from "../../model/ApiTestModel";
import MsCodeEdit from "../../../../common/components/MsCodeEdit"; import MsCodeEdit from "../../../../common/components/MsCodeEdit";
import MsJsonCodeEdit from "../../../../common/json-schema/JsonSchemaEditor"; import MsJsonCodeEdit from "../../../../common/json-schema/JsonSchemaEditor";
import MsDropdown from "../../../../common/components/MsDropdown"; import MsDropdown from "../../../../common/components/MsDropdown";
import MsApiVariable from "../ApiVariable"; import MsApiVariable from "../ApiVariable";
import MsApiBinaryVariable from "./ApiBinaryVariable"; import MsApiBinaryVariable from "./ApiBinaryVariable";
import MsApiFromUrlVariable from "./ApiFromUrlVariable"; import MsApiFromUrlVariable from "./ApiFromUrlVariable";
import BatchAddParameter from "../basis/BatchAddParameter"; import BatchAddParameter from "../basis/BatchAddParameter";
import Convert from "@/business/components/common/json-schema/convert/convert"; import Convert from "@/business/components/common/json-schema/convert/convert";
export default { export default {
name: "MsApiBody", name: "MsApiBody",
components: { components: {
MsApiVariable, MsApiVariable,
MsDropdown, MsDropdown,
MsCodeEdit, MsCodeEdit,
MsApiKeyValue, MsApiKeyValue,
MsApiBinaryVariable, MsApiBinaryVariable,
MsApiFromUrlVariable, MsApiFromUrlVariable,
MsJsonCodeEdit, MsJsonCodeEdit,
BatchAddParameter BatchAddParameter
},
props: {
body: {},
headers: Array,
isReadOnly: {
type: Boolean,
default: false
}, },
props: { isShowEnable: {
body: {}, type: Boolean,
headers: Array, default: true
isReadOnly: { }
type: Boolean, },
default: false data() {
}, return {
isShowEnable: { type: BODY_TYPE,
type: Boolean, modes: ['text', 'json', 'xml', 'html'],
default: true jsonSchema: "JSON",
codeEditActive: true
};
},
methods: {
reloadCodeEdit() {
this.codeEditActive = false;
this.$nextTick(() => {
this.codeEditActive = true;
});
},
formatChange() {
const MsConvert = new Convert();
if (this.body.format === 'JSON-SCHEMA') {
if (this.body.raw) {
this.body.jsonSchema = MsConvert.format(JSON.parse(this.body.raw));
}
} else {
if (this.body.jsonSchema) {
MsConvert.schemaToJsonStr(this.body.jsonSchema, (result) => {
this.$set(this.body, 'raw', result);
this.reloadCodeEdit();
});
}
} }
}, },
data() { modeChange(mode) {
return { switch (this.body.type) {
type: BODY_TYPE, case "JSON":
modes: ['text', 'json', 'xml', 'html'], this.setContentType("application/json");
jsonSchema: "JSON", break;
codeEditActive: true case "XML":
}; this.setContentType("text/xml");
break;
case "WWW_FORM":
this.setContentType("application/x-www-form-urlencoded");
break;
// todo from data
case "BINARY":
this.setContentType("application/octet-stream");
break;
default:
this.removeContentType();
break;
}
}, },
methods: { setContentType(value) {
reloadCodeEdit() { let isType = false;
this.codeEditActive = false; this.headers.forEach(item => {
this.$nextTick(() => { if (item.name === "Content-Type") {
this.codeEditActive = true; item.value = value;
}); isType = true;
},
formatChange() {
const MsConvert = new Convert();
if (this.body.format === 'JSON-SCHEMA') {
if (this.body.raw) {
this.body.jsonSchema = MsConvert.format(JSON.parse(this.body.raw));
}
} else {
if (this.body.jsonSchema) {
MsConvert.schemaToJsonStr(this.body.jsonSchema, (result) => {
this.$set(this.body, 'raw', result);
this.reloadCodeEdit();
});
}
} }
}, })
modeChange(mode) { if (!isType) {
switch (this.body.type) { this.headers.unshift(new KeyValue({name: "Content-Type", value: value}));
case "JSON": this.$emit('headersChange');
this.setContentType("application/json"); }
break; },
case "XML": removeContentType() {
this.setContentType("text/xml"); for (let index in this.headers) {
break; if (this.headers[index].name === "Content-Type") {
case "WWW_FORM": this.headers.splice(index, 1);
this.setContentType("application/x-www-form-urlencoded");
break;
// todo from data
case "BINARY":
this.setContentType("application/octet-stream");
break;
default:
this.removeContentType();
break;
}
},
setContentType(value) {
let isType = false;
this.headers.forEach(item => {
if (item.name === "Content-Type") {
item.value = value;
isType = true;
}
})
if (!isType) {
this.headers.unshift(new KeyValue({name: "Content-Type", value: value}));
this.$emit('headersChange'); this.$emit('headersChange');
return;
} }
}, }
removeContentType() {
for (let index in this.headers) {
if (this.headers[index].name === "Content-Type") {
this.headers.splice(index, 1);
this.$emit('headersChange');
return;
}
}
},
batchAdd() {
this.$refs.batchAddParameter.open();
},
batchSave(data) {
if (data) {
let params = data.split("\n");
let keyValues = [];
params.forEach(item => {
let line = item.split(/|,/);
let required = false;
if (line[1] === '必填' || line[1] === 'Required' || line[1] === 'true') {
required = true;
}
keyValues.push(new KeyValue({name: line[0], required: required, value: line[2], description: line[3], type: "text", valid: false, file: false, encode: true, enable: true, contentType: "text/plain"}));
})
keyValues.forEach(item => {
this.body.kvs.unshift(item);
})
}
},
}, },
created() { batchAdd() {
if (!this.body.type) { this.$refs.batchAddParameter.open();
this.body.type = BODY_TYPE.FORM_DATA; },
} batchSave(data) {
if (this.body.kvs) { if (data) {
this.body.kvs.forEach(param => { let params = data.split("\n");
if (!param.type) { let keyValues = [];
param.type = 'text'; params.forEach(item => {
let line = item.split(/|,/);
let required = false;
if (line[1] === '必填' || line[1] === 'Required' || line[1] === 'true') {
required = true;
} }
}); keyValues.push(new KeyValue({name: line[0], required: required, value: line[2], description: line[3], type: "text", valid: false, file: false, encode: true, enable: true, contentType: "text/plain"}));
})
keyValues.forEach(item => {
this.body.kvs.unshift(item);
})
} }
},
},
created() {
if (!this.body.type) {
this.body.type = BODY_TYPE.FORM_DATA;
}
if (this.body.kvs) {
this.body.kvs.forEach(param => {
if (!param.type) {
param.type = 'text';
}
});
} }
} }
}
</script> </script>
<style scoped> <style scoped>
.textarea { .textarea {
margin-top: 10px; margin-top: 10px;
} }
.ms-body { .ms-body {
padding: 15px 0; padding: 15px 0;
height: 400px; height: 400px;
} }
.el-dropdown { .el-dropdown {
margin-left: 20px; margin-left: 20px;
line-height: 30px; line-height: 30px;
} }
.ace_editor { .ace_editor {
border-radius: 5px; border-radius: 5px;
} }
.el-radio-group { .el-radio-group {
margin: 10px 10px; margin: 10px 10px;
margin-top: 15px; margin-top: 15px;
} }
.ms-el-link { .ms-el-link {
float: right; float: right;
margin-right: 45px; margin-right: 45px;
} }
</style> </style>

View File

@ -181,12 +181,12 @@ import {TYPE_TO_C} from "@/business/components/api/automation/scenario/Setting";
export default { export default {
name: "ApiCaseItem", name: "ApiCaseItem",
filters: { filters: {
ellipsis (value) { ellipsis(value) {
if (!value) { if (!value) {
return ''; return '';
} }
if (value.length > 20) { if (value.length > 20) {
return value.slice(0,20) + '...' return value.slice(0, 20) + '...'
} }
return value return value
} }
@ -432,8 +432,10 @@ export default {
if (tmp.tags instanceof Array) { if (tmp.tags instanceof Array) {
tmp.tags = JSON.stringify(tmp.tags); tmp.tags = JSON.stringify(tmp.tags);
} }
tmp.clazzName = TYPE_TO_C.get(tmp.type); if (tmp.request) {
this.sort(tmp.hashTree); tmp.request.clazzName = TYPE_TO_C.get(tmp.request.type);
this.sort(tmp.request.hashTree);
}
this.result = this.$fileUpload(url, null, bodyFiles, tmp, (response) => { this.result = this.$fileUpload(url, null, bodyFiles, tmp, (response) => {
let data = response.data; let data = response.data;
row.id = data.id; row.id = data.id;

View File

@ -67,6 +67,11 @@
<el-tab-pane :label="$t('api_test.definition.request.other_config')" name="advancedConfig"> <el-tab-pane :label="$t('api_test.definition.request.other_config')" name="advancedConfig">
<ms-api-advanced-config :is-read-only="isReadOnly" :request="request"/> <ms-api-advanced-config :is-read-only="isReadOnly" :request="request"/>
</el-tab-pane> </el-tab-pane>
<!-- <el-tab-pane name="create" v-if="hasPermission('PROJECT_API_DEFINITION:READ+CREATE_API')">-->
<!-- <template v-slot:label>-->
<!-- <el-button size="mini" type="primary" @click.stop @click="createTestData">生成测试数据</el-button>-->
<!-- </template>-->
<!-- </el-tab-pane>-->
</el-tabs> </el-tabs>
</div> </div>
@ -93,6 +98,7 @@
import MsApiAdvancedConfig from "./ApiAdvancedConfig"; import MsApiAdvancedConfig from "./ApiAdvancedConfig";
import MsJsr233Processor from "../../../../automation/scenario/component/Jsr233Processor"; import MsJsr233Processor from "../../../../automation/scenario/component/Jsr233Processor";
import ApiDefinitionStepButton from "../components/ApiDefinitionStepButton"; import ApiDefinitionStepButton from "../components/ApiDefinitionStepButton";
import {hasPermission} from '@/common/js/utils';
export default { export default {
name: "MsApiHttpRequestForm", name: "MsApiHttpRequestForm",
@ -176,6 +182,10 @@
}, },
methods: { methods: {
hasPermission,
createTestData(){
},
remove(row) { remove(row) {
let index = this.request.hashTree.indexOf(row); let index = this.request.hashTree.indexOf(row);
this.request.hashTree.splice(index, 1); this.request.hashTree.splice(index, 1);