| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- <template>
- <div class="content" v-if="interfaceData">
- <div class="head">
- <Input v-model="interfaceData.path">
- <template #prepend>
- <Select v-model="interfaceData.method" style="width: 120px">
- <Option v-for="(item, index) in requestTypeList" :key="index" :value="item.value">{{ item.label }}</Option>
- </Select>
- </template>
- </Input>
- <Button class="ml20" type="primary" @click="requestData">请求</Button>
- <Button v-if="codes" class="ml10 copy-btn" type="success" @click="insertCopy()">复制结果</Button>
- </div>
- <div class="params">
- <Tabs class="mt10" v-model="paramsType" @on-click="changeTab">
- <TabPane label="Params" name="Params"> </TabPane>
- <TabPane label="Body" name="Body"> </TabPane>
- <TabPane label="Header" name="Header"> </TabPane>
- </Tabs>
- <div v-show="paramsType === 'Params'">
- <vxe-table
- class="mt10"
- resizable
- show-overflow
- keep-source
- ref="xTable"
- row-id="id"
- :print-config="{}"
- :export-config="{}"
- :tree-config="{ transform: true, rowField: 'id', parentField: 'parentId' }"
- :data="interfaceData.request"
- >
- <vxe-column field="attribute" width="150" title="属性" tree-node :edit-render="{}">
- <template #default="{ row }">
- <vxe-input v-model="row.attribute" type="text"></vxe-input>
- </template>
- </vxe-column>
- <vxe-column field="value" title="参数值" :edit-render="{}">
- <template #default="{ row }">
- <vxe-input v-model="row.value" type="text"></vxe-input>
- </template>
- </vxe-column>
- <vxe-column field="type" title="类型" width="120" :edit-render="{}">
- <template #default="{ row }">
- <vxe-select
- v-model="row.type"
- transfer
- @change="
- (val) => {
- handleChange(val, row, 'xTable');
- }
- "
- >
- <vxe-option
- v-for="item in typeList"
- :key="item.value"
- :value="item.value"
- :label="item.label"
- ></vxe-option>
- </vxe-select>
- </template>
- </vxe-column>
- <!-- <vxe-column field="must" title="必填" width="50" :edit-render="{}">
- <template #default="{ row }">
- <span>{{ row.must == '1' ? '是' : '否' }}</span>
- </template>
- </vxe-column>
- <vxe-column field="trip" width="150" title="说明" :edit-render="{}">
- <template #default="{ row }">
- <vxe-input v-model="row.trip" type="text"></vxe-input>
- </template>
- </vxe-column> -->
- <vxe-column title="操作" width="120">
- <template #default="{ row }">
- <vxe-button
- type="text"
- v-if="['array', 'object'].includes(row.type)"
- status="primary"
- @click="insertRow(row, 'xTable')"
- >插入</vxe-button
- >
- <vxe-button type="text" status="primary" @click="removeRow(row, 'xTable')">删除</vxe-button>
- </template>
- </vxe-column>
- </vxe-table>
- <Button class="mt10" type="primary" @click="insertEvent('xTable')">添加参数</Button>
- </div>
- <div v-show="paramsType === 'Body'">
- <RadioGroup v-model="bodyType" class="mt10">
- <Radio label="form-data"></Radio>
- <Radio label="json"></Radio>
- </RadioGroup>
- <vxe-table
- v-if="bodyType == 'form-data'"
- class="mt10"
- resizable
- show-overflow
- keep-source
- ref="yTable"
- row-id="id"
- :print-config="{}"
- :export-config="{}"
- :tree-config="{ transform: true, rowField: 'id', parentField: 'parentId' }"
- :data="interfaceData.request_body"
- >
- <vxe-column field="attribute" width="150" title="属性" tree-node :edit-render="{}">
- <template #default="{ row }">
- <vxe-input v-model="row.attribute" type="text"></vxe-input>
- </template>
- </vxe-column>
- <vxe-column field="value" title="参数值" :edit-render="{}">
- <template #default="{ row }">
- <vxe-input v-model="row.value" type="text"></vxe-input>
- </template>
- </vxe-column>
- <vxe-column field="type" title="类型" width="120" :edit-render="{}">
- <template #default="{ row }">
- <vxe-select
- v-model="row.type"
- transfer
- @change="
- (val) => {
- handleChange(val, row, 'yTable');
- }
- "
- >
- <vxe-option
- v-for="item in typeList"
- :key="item.value"
- :value="item.value"
- :label="item.label"
- ></vxe-option>
- </vxe-select>
- </template>
- </vxe-column>
- <!-- <vxe-column field="must" title="必填" width="50" :edit-render="{}">
- <template #default="{ row }">
- <span>{{ row.must == '1' ? '是' : '否' }}</span>
- </template>
- </vxe-column>
- <vxe-column field="trip" title="说明" width="150" :edit-render="{}">
- <template #default="{ row }">
- <vxe-input v-model="row.trip" type="text"></vxe-input>
- </template>
- </vxe-column> -->
- <vxe-column title="操作" width="120">
- <template #default="{ row }">
- <vxe-button
- type="text"
- v-if="['array', 'object'].includes(row.type)"
- status="primary"
- @click="insertRow(row, 'yTable')"
- >插入</vxe-button
- >
- <vxe-button type="text" status="primary" @click="removeRow(row, 'yTable')">删除</vxe-button>
- </template>
- </vxe-column>
- </vxe-table>
- <div v-else>
- <Input v-model="jsonBody" type="textarea" :rows="8" placeholder="请求数据" />
- </div>
- <Button v-if="bodyType == 'form-data'" class="mt10" type="primary" @click="insertEvent('yTable')"
- >添加参数</Button
- >
- </div>
- <div v-show="paramsType === 'Header'">
- <vxe-table
- class="mt10"
- resizable
- show-overflow
- keep-source
- ref="zTable"
- row-id="id"
- :print-config="{}"
- :export-config="{}"
- :tree-config="{ transform: true, rowField: 'id', parentField: 'parentId' }"
- :data="interfaceData.headerData"
- >
- <vxe-column field="attribute" width="300" title="属性" tree-node :edit-render="{}">
- <template #default="{ row }">
- <vxe-input v-model="row.attribute" type="text"></vxe-input>
- </template>
- </vxe-column>
- <vxe-column field="value" title="参数值" :edit-render="{}">
- <template #default="{ row }">
- <vxe-input v-model="row.value" type="text"></vxe-input>
- </template>
- </vxe-column>
- <vxe-column title="操作" width="100">
- <template #default="{ row }">
- <vxe-button
- type="text"
- v-if="['array', 'object'].includes(row.type)"
- status="primary"
- @click="insertRow(row, 'zTable')"
- >插入</vxe-button
- >
- <vxe-button type="text" status="primary" @click="removeRow(row, 'zTable')">删除</vxe-button>
- </template>
- </vxe-column>
- </vxe-table>
- <Button class="mt10" type="primary" @click="insertEvent('zTable')">添加参数</Button>
- <!-- <h4 class="mt10 title">全局Header参数</h4>
- <vxe-table
- class="mt10"
- resizable
- show-overflow
- keep-source
- ref="zaTable"
- row-id="id"
- :print-config="{}"
- :export-config="{}"
- :tree-config="{ transform: true, rowField: 'id', parentField: 'parentId' }"
- :data="interfaceData.allHeaderData"
- >
- <vxe-column field="attribute" width="300" title="属性" tree-node :edit-render="{}">
- <template #default="{ row }">
- <span>{{ row.attribute || '' }}</span>
- </template>
- </vxe-column>
- <vxe-column field="value" title="参数值" :edit-render="{}">
- <template #default="{ row }">
- <span>{{ row.value || '' }}</span>
- </template>
- </vxe-column>
- <vxe-column field="type" title="类型" width="200" :edit-render="{}">
- <template #default="{ row }">
- <span>{{ row.type || '' }}</span>
- </template>
- </vxe-column>
- <vxe-column field="trip" title="说明" :edit-render="{}">
- <template #default="{ row }">
- <span>{{ row.trip || '' }}</span>
- </template>
- </vxe-column>
- </vxe-table> -->
- </div>
- </div>
- <div class="res mt10 mb10" v-if="codes">
- <MonacoEditor :codes="codes" :readOnly="true" />
- </div>
- </div>
- </template>
- <script>
- import request from './request';
- import MonacoEditor from './components/MonacoEditor.vue';
- import vuedraggable from 'vuedraggable';
- function requestMethod(url, method, params, data, headerItem) {
- return request({
- url,
- method,
- params,
- data,
- headerItem,
- });
- }
- export default {
- components: { MonacoEditor },
- props: {
- formValidate: {
- type: Object,
- default: () => {
- return {};
- },
- },
- requestTypeList: {
- type: Array,
- default: () => {
- return [];
- },
- },
- typeList: {
- type: Array,
- default: () => {
- return [];
- },
- },
- },
- data() {
- return {
- bodyType: 'form-data',
- interfaceData: undefined,
- paramsType: 'Params',
- editor: '', //当前编辑器对象
- codes: '',
- jsonBody: '',
- };
- },
- created() {
- this.interfaceData = this.formValidate;
- this.interfaceData.request_body = JSON.parse(JSON.stringify(this.interfaceData.request));
- console.log(this.interfaceData);
- },
- mounted() {},
- methods: {
- async handleChange(e, row, type) {
- console.log(type, row);
- if (e.value !== 'array' && e.value !== 'object') {
- if (row.children.length) {
- let arr = this.$refs[type].getTableData().tableData;
- let id = row.children[0].parentId;
- const $table = this.$refs[type];
- for (let i = 0; i < arr.length; i++) {
- if (arr[i].parentId == id) {
- await $table.remove(arr[i]);
- }
- }
- }
- }
- },
- insertCopy() {
- this.$copyText(this.codes)
- .then((message) => {
- this.$Message.success('复制成功');
- })
- .catch((err) => {
- this.$Message.error('复制失败');
- });
- },
- async requestData() {
- let url, method, params, body, headers;
- url = this.interfaceData.app_name + '/' + this.interfaceData.path;
- method = this.interfaceData.method;
- params = this.filtersData((await this.$refs.xTable.getTableData().tableData) || []);
- body =
- this.bodyType === 'json'
- ? this.jsonBody
- : this.filtersData((await this.$refs.yTable.getTableData().tableData) || []);
- let h = this.filtersData((await this.$refs.zTable.getTableData().tableData) || []);
- let h1 = this.filtersData((await this.$refs.zaTable.getTableData().tableData) || []);
- headers = {
- ...h,
- ...h1,
- };
- console.log(url, method, params, body, headers);
- this.codes = '';
- requestMethod(url, method, params, body, headers)
- .then((res) => {
- console.log(res, 'res');
- if (!res) return this.$Message.error('接口异常');
- this.codes = JSON.stringify(res);
- })
- .catch((err) => {
- console.log(err, 'err');
- if (!err) return this.$Message.error('接口异常');
- this.codes = JSON.stringify(err);
- });
- },
- filtersData(arr) {
- console.log(arr);
- try {
- let x = {};
- arr.map((e) => {
- if (!e.parentId) {
- for (let i in e) {
- if (i == 'attribute') {
- console.log(e.type);
- if (e.type === 'object') {
- let obj = {};
- e.children.map((item, index) => {
- obj = this.filtersObj(item, 1);
- });
- console.log(obj, 'objobjobj');
- x[e[i]] = obj;
- } else if (e.type !== 'array') {
- x[e[i]] = e.value || '';
- } else {
- let arr = [];
- e.children.map((item, index) => {
- arr[index] = this.filtersObj(item);
- });
- x[e[i]] = arr;
- }
- }
- }
- }
- });
- return x;
- } catch (error) {
- console.log(error);
- }
- },
- // type 1 为obj属性
- filtersObj(obj, type) {
- let x = {};
- for (let i in obj) {
- if (i == 'attribute') {
- console.log(obj, 'obj111');
- if (obj.type === 'object') {
- let oj = {};
- obj.children.map((item, index) => {
- oj[obj.attribute] = this.filtersObj(item);
- });
- console.log(oj, 'oj');
- x = oj;
- } else if (obj.type !== 'array') {
- if (type) {
- x[obj.attribute] = obj.value || '';
- } else {
- x[obj[i]] = obj.value || '';
- }
- } else {
- let arr = [];
- obj.children.map((item, index) => {
- arr[index] = this.filtersObj(item);
- });
- x[obj[i]] = arr;
- }
- }
- }
- return x;
- },
- changeTab(name) {
- if (name === 'Header') {
- // if (!this.$refs.zTable.getTableData().tableData.length) {
- // this.insertEvent('zTable', {
- // attribute: 'Content-Type',
- // value: 'application/x-www-form-urlencoded',
- // });
- // this.insertEvent('zaTable');
- // }
- }
- console.log(this.interfaceData);
- },
- async insertEvent(type, d) {
- const $table = this.$refs[type];
- let newRow;
- if (type == 'xTable') {
- newRow = {
- attribute: '',
- type: 'string',
- must: 0,
- value: '',
- trip: '',
- };
- } else if (type == 'yTable') {
- newRow = {
- attribute: '',
- type: 'string',
- value: '',
- must: 0,
- trip: '',
- };
- } else if (type == 'zTable') {
- newRow = {
- attribute: '',
- type: '',
- value: '',
- trip: '',
- };
- newRow = { ...newRow, ...d };
- } else if (type == 'zaTable') {
- newRow = {
- attribute: 'token',
- type: 'string',
- value: '',
- must: 0,
- trip: '',
- };
- } else {
- newRow = {
- code: '',
- value: '',
- solution: '',
- };
- }
- const { row: data } = await $table.insertAt(newRow, -1);
- await $table.setActiveCell(data, 'name');
- },
- async insertRow(currRow, type) {
- const $table = this.$refs[type];
- // 如果 null 则插入到目标节点顶部
- // 如果 -1 则插入到目标节点底部
- // 如果 row 则有插入到效的目标节点该行的位置
- let record;
- if (type == 'xTable') {
- record = {
- attribute: '',
- type: 'string',
- must: 0,
- value: '',
- trip: '',
- id: Date.now(),
- parentId: currRow.id, // 需要指定父节点,自动插入该节点中
- };
- } else {
- record = {
- code: '',
- value: '',
- solution: '',
- id: Date.now(),
- parentId: currRow.id, // 需要指定父节点,自动插入该节点中
- };
- }
- const { row: newRow } = await $table.insertAt(record, -1);
- await $table.setTreeExpand(currRow, true); // 将父节点展开
- await $table.setActiveRow(newRow); // 插入子节点
- },
- async removeRow(row, type) {
- const $table = this.$refs[type];
- await $table.remove(row);
- },
- },
- };
- </script>
- <style>
- .vxe-select--panel.is--transfer {
- z-index: 99999 !important;
- }
- </style>
- <style lang="scss" scoped>
- .content {
- padding: 12px;
- .head {
- display: flex;
- align-items: center;
- .item {
- display: flex;
- align-items: center;
- margin-bottom: 12px;
- font-size: 14px;
- .title {
- margin-right: 14px;
- }
- }
- }
- }
- .copy-btn {
- display: flex;
- justify-content: right;
- }
- </style>
|