#I4MKKW api接口调试支持文件上传,全局参数控制优化
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package com.zyplayer.doc.api.controller;
|
package com.zyplayer.doc.api.controller;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.zyplayer.doc.api.service.ApiDocAuthJudgeService;
|
||||||
import com.zyplayer.doc.core.annotation.AuthMan;
|
import com.zyplayer.doc.core.annotation.AuthMan;
|
||||||
import com.zyplayer.doc.core.json.DocResponseJson;
|
import com.zyplayer.doc.core.json.DocResponseJson;
|
||||||
import com.zyplayer.doc.core.json.ResponseJson;
|
import com.zyplayer.doc.core.json.ResponseJson;
|
||||||
@@ -37,6 +38,8 @@ public class ApiGlobalParamController {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private ApiGlobalParamService apiGlobalParamService;
|
private ApiGlobalParamService apiGlobalParamService;
|
||||||
|
@Resource
|
||||||
|
ApiDocAuthJudgeService apiDocAuthJudgeService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取所有的全局参数
|
* 获取所有的全局参数
|
||||||
@@ -49,6 +52,9 @@ public class ApiGlobalParamController {
|
|||||||
@PostMapping(value = "/list")
|
@PostMapping(value = "/list")
|
||||||
public ResponseJson<List<ApiGlobalParam>> list(Long docId) {
|
public ResponseJson<List<ApiGlobalParam>> list(Long docId) {
|
||||||
Long docIdNew = Optional.ofNullable(docId).orElse(0L);
|
Long docIdNew = Optional.ofNullable(docId).orElse(0L);
|
||||||
|
if (docIdNew > 0 && !apiDocAuthJudgeService.haveDevelopAuth(docIdNew)) {
|
||||||
|
return DocResponseJson.warn("没有此文档的查看权限");
|
||||||
|
}
|
||||||
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
|
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
|
||||||
QueryWrapper<ApiGlobalParam> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<ApiGlobalParam> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq("yn", 1);
|
queryWrapper.eq("yn", 1);
|
||||||
@@ -71,6 +77,11 @@ public class ApiGlobalParamController {
|
|||||||
@PostMapping(value = "/update")
|
@PostMapping(value = "/update")
|
||||||
public ResponseJson<List<ApiDoc>> update(ApiGlobalParam globalParam) {
|
public ResponseJson<List<ApiDoc>> update(ApiGlobalParam globalParam) {
|
||||||
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
|
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
|
||||||
|
globalParam.setDocId(Optional.ofNullable(globalParam.getDocId()).orElse(0L));
|
||||||
|
// 新的文档ID是否有权限
|
||||||
|
if (globalParam.getDocId() > 0 && !apiDocAuthJudgeService.haveDevelopAuth(globalParam.getDocId())) {
|
||||||
|
return DocResponseJson.warn("没有此文档的查看权限");
|
||||||
|
}
|
||||||
if (globalParam.getId() == null) {
|
if (globalParam.getId() == null) {
|
||||||
globalParam.setYn(1);
|
globalParam.setYn(1);
|
||||||
globalParam.setCreateTime(new Date());
|
globalParam.setCreateTime(new Date());
|
||||||
@@ -78,11 +89,17 @@ public class ApiGlobalParamController {
|
|||||||
globalParam.setCreateUserName(currentUser.getUsername());
|
globalParam.setCreateUserName(currentUser.getUsername());
|
||||||
} else {
|
} else {
|
||||||
ApiGlobalParam param = apiGlobalParamService.getById(globalParam.getId());
|
ApiGlobalParam param = apiGlobalParamService.getById(globalParam.getId());
|
||||||
if (param == null || !Objects.equals(param.getCreateUserId(), currentUser.getUserId())) {
|
if (param.getDocId() > 0) {
|
||||||
|
// 已有的文档ID是否有权限
|
||||||
|
if (!apiDocAuthJudgeService.haveDevelopAuth(param.getDocId())) {
|
||||||
|
return DocResponseJson.warn("没有此文档的查看权限");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!Objects.equals(param.getCreateUserId(), currentUser.getUserId())) {
|
||||||
return DocResponseJson.warn("目标全局参数不存在");
|
return DocResponseJson.warn("目标全局参数不存在");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
globalParam.setDocId(Optional.ofNullable(globalParam.getDocId()).orElse(0L));
|
}
|
||||||
QueryWrapper<ApiGlobalParam> wrapper = new QueryWrapper<>();
|
QueryWrapper<ApiGlobalParam> wrapper = new QueryWrapper<>();
|
||||||
wrapper.eq("yn", 1);
|
wrapper.eq("yn", 1);
|
||||||
wrapper.eq("param_key", globalParam.getParamKey());
|
wrapper.eq("param_key", globalParam.getParamKey());
|
||||||
|
|||||||
@@ -12,10 +12,13 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求参数控制器
|
* 请求参数控制器
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package com.zyplayer.doc.api.service;
|
package com.zyplayer.doc.api.service;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.resource.BytesResource;
|
||||||
|
import cn.hutool.core.io.resource.MultiResource;
|
||||||
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpRequest;
|
||||||
import cn.hutool.http.HttpResponse;
|
import cn.hutool.http.HttpResponse;
|
||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
import cn.hutool.http.Method;
|
import cn.hutool.http.Method;
|
||||||
|
import com.zyplayer.doc.api.controller.ApiPoxyRequestController;
|
||||||
import com.zyplayer.doc.api.controller.param.ProxyRequestParam;
|
import com.zyplayer.doc.api.controller.param.ProxyRequestParam;
|
||||||
import com.zyplayer.doc.api.controller.vo.HttpCookieVo;
|
import com.zyplayer.doc.api.controller.vo.HttpCookieVo;
|
||||||
import com.zyplayer.doc.api.controller.vo.HttpHeaderVo;
|
import com.zyplayer.doc.api.controller.vo.HttpHeaderVo;
|
||||||
@@ -16,12 +19,17 @@ import org.apache.commons.collections.CollectionUtils;
|
|||||||
import org.apache.commons.collections.MapUtils;
|
import org.apache.commons.collections.MapUtils;
|
||||||
import org.apache.commons.lang.ArrayUtils;
|
import org.apache.commons.lang.ArrayUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.Cookie;
|
import javax.servlet.http.Cookie;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.HttpCookie;
|
import java.net.HttpCookie;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -35,6 +43,7 @@ import java.util.stream.Stream;
|
|||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class SwaggerHttpRequestService {
|
public class SwaggerHttpRequestService {
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(SwaggerHttpRequestService.class);
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private ApiGlobalParamService apiGlobalParamService;
|
private ApiGlobalParamService apiGlobalParamService;
|
||||||
@@ -153,6 +162,30 @@ public class SwaggerHttpRequestService {
|
|||||||
// 用户输入的参数
|
// 用户输入的参数
|
||||||
requestParam.getFormParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue()));
|
requestParam.getFormParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue()));
|
||||||
requestParam.getFormEncodeParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue()));
|
requestParam.getFormEncodeParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue()));
|
||||||
|
// 文件参数
|
||||||
|
if (request instanceof StandardMultipartHttpServletRequest) {
|
||||||
|
StandardMultipartHttpServletRequest multipartRequest = (StandardMultipartHttpServletRequest) request;
|
||||||
|
Iterator<String> fileNames = multipartRequest.getFileNames();
|
||||||
|
while (fileNames.hasNext()) {
|
||||||
|
String fileName = fileNames.next();
|
||||||
|
String originKey = fileName.replace("_file_", "");
|
||||||
|
List<MultipartFile> fileList = multipartRequest.getFiles(fileName);
|
||||||
|
try {
|
||||||
|
if (fileList.size() > 1) {
|
||||||
|
MultiResource multiResource = new MultiResource();
|
||||||
|
for (MultipartFile file : fileList) {
|
||||||
|
multiResource.add(new BytesResource(file.getBytes(), file.getOriginalFilename()));
|
||||||
|
}
|
||||||
|
httpRequest.form(originKey, multiResource);
|
||||||
|
} else if (fileList.size() > 0) {
|
||||||
|
MultipartFile multipartFile = fileList.get(0);
|
||||||
|
httpRequest.form(originKey, multipartFile.getBytes(), multipartFile.getOriginalFilename());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.error("读取上传的文件失败", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// cookie参数
|
// cookie参数
|
||||||
Map<String, String> cookieParam = new HashMap<>();
|
Map<String, String> cookieParam = new HashMap<>();
|
||||||
String headerCookie = headerParam.getOrDefault("Cookie", headerParam.get("cookie"));
|
String headerCookie = headerParam.getOrDefault("Cookie", headerParam.get("cookie"));
|
||||||
|
|||||||
@@ -30,9 +30,13 @@ public class ApiGlobalParamServiceImpl extends ServiceImpl<ApiGlobalParamMapper,
|
|||||||
|
|
||||||
QueryWrapper<ApiGlobalParam> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<ApiGlobalParam> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq("yn", 1);
|
queryWrapper.eq("yn", 1);
|
||||||
queryWrapper.eq("doc_id", docIdNew);
|
|
||||||
// 全局参数才按创建人来控制,文档的全局参数大家共用
|
// 全局参数才按创建人来控制,文档的全局参数大家共用
|
||||||
queryWrapper.eq(docIdNew == 0, "create_user_id", currentUser.getUserId());
|
if (docIdNew == 0) {
|
||||||
|
queryWrapper.eq("create_user_id", currentUser.getUserId());
|
||||||
|
} else {
|
||||||
|
queryWrapper.and(con -> con.or(or -> or.eq("doc_id", docIdNew))
|
||||||
|
.or(or -> or.eq("create_user_id", currentUser.getUserId())));
|
||||||
|
}
|
||||||
return this.list(queryWrapper);
|
return this.list(queryWrapper);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
VITE_APP_TITLE=API文档管理
|
VITE_APP_TITLE=API文档管理
|
||||||
|
|
||||||
本地切换环境改这个参数,可选值:dev、online
|
本地切换环境改这个参数,可选值:dev、online
|
||||||
VITE_APP_ENV=online
|
VITE_APP_ENV=dev
|
||||||
|
|
||||||
# 线上环境
|
# 线上环境
|
||||||
VITE_APP_BASE_URL_ONLINE=http://doc.zyplayer.com/zyplayer-doc-manage
|
VITE_APP_BASE_URL_ONLINE=http://doc.zyplayer.com/zyplayer-doc-manage
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<a-select placeholder="请选择分组" v-model:value="docChoiceId" @change="docChoiceChange" style="width: 100%;">
|
<a-select placeholder="请选择分组" v-model:value="docChoiceId" @change="docChoiceChange" style="width: 100%;">
|
||||||
<a-select-option :value="item.id" v-for="item in docResourceList">{{item.name}}</a-select-option>
|
<a-select-option :value="item.id" v-for="item in docResourceList">{{item.name}}</a-select-option>
|
||||||
</a-select>
|
</a-select>
|
||||||
<a-input-search v-model:value="searchKeywords" placeholder="搜索文档内容" style="width: 100%;margin-top: 10px;" @search="docChoiceChange"/>
|
<a-input-search v-model:value="searchKeywords" placeholder="搜索文档内容" style="width: 100%;margin-top: 10px;" @search="searchDoc"/>
|
||||||
</div>
|
</div>
|
||||||
<template v-if="docChoice && docChoice.docType">
|
<template v-if="docChoice && docChoice.docType">
|
||||||
<DocTreeSwagger v-if="docChoice.docType === 1 || docChoice.docType === 2" ref="swaggerRef"></DocTreeSwagger>
|
<DocTreeSwagger v-if="docChoice.docType === 1 || docChoice.docType === 2" ref="swaggerRef"></DocTreeSwagger>
|
||||||
@@ -102,9 +102,26 @@
|
|||||||
openApiRef.value.loadDoc(docChoiceId.value, searchKeywords.value, loadDocCallback);
|
openApiRef.value.loadDoc(docChoiceId.value, searchKeywords.value, loadDocCallback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
zyplayerApi.docApiGlobalParamList({docId: docChoiceId.value}).then(res => {
|
||||||
|
let docGlobalParam = res.data || [];
|
||||||
|
store.commit('setDocGlobalParam', docGlobalParam);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
const docChoiceChange = () => {
|
const docChoiceChange = () => {
|
||||||
loadDoc();
|
loadDoc();
|
||||||
|
};
|
||||||
|
// 搜索文档
|
||||||
|
const searchDoc = () => {
|
||||||
|
// 如果文档是swagger类型
|
||||||
|
if (docChoice.value.docType === 1 || docChoice.value.docType === 2) {
|
||||||
|
if (swaggerRef.value) {
|
||||||
|
swaggerRef.value.loadTreeData(searchKeywords.value);
|
||||||
|
}
|
||||||
|
} else if (docChoice.value.docType === 3 || docChoice.value.docType === 4) {
|
||||||
|
if (openApiRef.value) {
|
||||||
|
openApiRef.value.loadTreeData(searchKeywords.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
watch(store.getters.getDocChangedNum, () => {
|
watch(store.getters.getDocChangedNum, () => {
|
||||||
getApiDocList();
|
getApiDocList();
|
||||||
@@ -136,6 +153,7 @@
|
|||||||
swaggerRef,
|
swaggerRef,
|
||||||
openApiRef,
|
openApiRef,
|
||||||
docChoice,
|
docChoice,
|
||||||
|
searchDoc,
|
||||||
docChoiceChange,
|
docChoiceChange,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -41,7 +41,6 @@
|
|||||||
let treeData = ref([]);
|
let treeData = ref([]);
|
||||||
let expandedKeys = ref([]);
|
let expandedKeys = ref([]);
|
||||||
let choiceDocId = ref('');
|
let choiceDocId = ref('');
|
||||||
let searchKeywords = ref('');
|
|
||||||
|
|
||||||
const docChecked = (val, node) => {
|
const docChecked = (val, node) => {
|
||||||
if (node.node.key === 'info') {
|
if (node.node.key === 'info') {
|
||||||
@@ -53,11 +52,11 @@
|
|||||||
};
|
};
|
||||||
const loadDoc = (docId, keyword, callback) => {
|
const loadDoc = (docId, keyword, callback) => {
|
||||||
choiceDocId.value = docId;
|
choiceDocId.value = docId;
|
||||||
searchKeywords.value = keyword;
|
|
||||||
zyplayerApi.apiDocApisDetail({id: docId}).then(res => {
|
zyplayerApi.apiDocApisDetail({id: docId}).then(res => {
|
||||||
let v2Doc = toJsonObj(res.data);
|
let v2Doc = toJsonObj(res.data);
|
||||||
// os:doc.swagger 和 doc.openapi 的区别
|
// os:doc.swagger 和 doc.openapi 的区别
|
||||||
if (typeof v2Doc !== 'object' || !v2Doc.openapi) {
|
if (typeof v2Doc !== 'object' || !v2Doc.openapi) {
|
||||||
|
callback(false);
|
||||||
message.error('获取文档数据失败,请检查文档是否为标准的OpenApi文档格式');
|
message.error('获取文档数据失败,请检查文档是否为标准的OpenApi文档格式');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -67,13 +66,15 @@
|
|||||||
store.commit('setOpenApiUrlMethodMap', treeData.urlMethodMap);
|
store.commit('setOpenApiUrlMethodMap', treeData.urlMethodMap);
|
||||||
store.commit('setOpenApiMethodStatistic', treeData.methodStatistic);
|
store.commit('setOpenApiMethodStatistic', treeData.methodStatistic);
|
||||||
tagPathMap.value = treeData.tagPathMap;
|
tagPathMap.value = treeData.tagPathMap;
|
||||||
loadTreeData();
|
loadTreeData(keyword);
|
||||||
callback();
|
callback(true);
|
||||||
|
}).catch(() => {
|
||||||
|
callback(false);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const loadTreeData = async () => {
|
const loadTreeData = async (keyword) => {
|
||||||
let metaInfo = {id: choiceDocId.value};
|
let metaInfo = {id: choiceDocId.value};
|
||||||
treeData.value = getTreeDataForTag(openApiDoc.value, tagPathMap.value, searchKeywords.value, metaInfo);
|
treeData.value = getTreeDataForTag(openApiDoc.value, tagPathMap.value, keyword, metaInfo);
|
||||||
treeData.value.unshift({key: 'info', title: '文档说明信息', isLeaf: true});
|
treeData.value.unshift({key: 'info', title: '文档说明信息', isLeaf: true});
|
||||||
await nextTick();
|
await nextTick();
|
||||||
expandedKeys.value = ['main'];
|
expandedKeys.value = ['main'];
|
||||||
@@ -97,6 +98,7 @@
|
|||||||
expandedKeys,
|
expandedKeys,
|
||||||
docChecked,
|
docChecked,
|
||||||
loadDoc,
|
loadDoc,
|
||||||
|
loadTreeData,
|
||||||
treeData,
|
treeData,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -41,7 +41,6 @@
|
|||||||
let treeData = ref([]);
|
let treeData = ref([]);
|
||||||
let expandedKeys = ref([]);
|
let expandedKeys = ref([]);
|
||||||
let choiceDocId = ref('');
|
let choiceDocId = ref('');
|
||||||
let searchKeywords = ref('');
|
|
||||||
|
|
||||||
const docChecked = (val, node) => {
|
const docChecked = (val, node) => {
|
||||||
if (node.node.key === 'info') {
|
if (node.node.key === 'info') {
|
||||||
@@ -53,7 +52,6 @@
|
|||||||
};
|
};
|
||||||
const loadDoc = (docId, keyword, callback) => {
|
const loadDoc = (docId, keyword, callback) => {
|
||||||
choiceDocId.value = docId;
|
choiceDocId.value = docId;
|
||||||
searchKeywords.value = keyword;
|
|
||||||
zyplayerApi.apiDocApisDetail({id: docId}).then(res => {
|
zyplayerApi.apiDocApisDetail({id: docId}).then(res => {
|
||||||
let v2Doc = toJsonObj(res.data);
|
let v2Doc = toJsonObj(res.data);
|
||||||
if (typeof v2Doc !== 'object' || !v2Doc.swagger) {
|
if (typeof v2Doc !== 'object' || !v2Doc.swagger) {
|
||||||
@@ -67,13 +65,15 @@
|
|||||||
store.commit('setSwaggerUrlMethodMap', treeData.urlMethodMap);
|
store.commit('setSwaggerUrlMethodMap', treeData.urlMethodMap);
|
||||||
store.commit('setSwaggerMethodStatistic', treeData.methodStatistic);
|
store.commit('setSwaggerMethodStatistic', treeData.methodStatistic);
|
||||||
tagPathMap.value = treeData.tagPathMap;
|
tagPathMap.value = treeData.tagPathMap;
|
||||||
loadTreeData();
|
loadTreeData(keyword);
|
||||||
callback(true);
|
callback(true);
|
||||||
|
}).catch(() => {
|
||||||
|
callback(false);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const loadTreeData = async () => {
|
const loadTreeData = async (keyword) => {
|
||||||
let metaInfo = {id: choiceDocId.value};
|
let metaInfo = {id: choiceDocId.value};
|
||||||
treeData.value = getTreeDataForTag(swaggerDoc.value, tagPathMap.value, searchKeywords.value, metaInfo);
|
treeData.value = getTreeDataForTag(swaggerDoc.value, tagPathMap.value, keyword, metaInfo);
|
||||||
treeData.value.unshift({key: 'info', title: '文档说明信息', isLeaf: true});
|
treeData.value.unshift({key: 'info', title: '文档说明信息', isLeaf: true});
|
||||||
await nextTick();
|
await nextTick();
|
||||||
expandedKeys.value = ['main'];
|
expandedKeys.value = ['main'];
|
||||||
@@ -97,6 +97,7 @@
|
|||||||
expandedKeys,
|
expandedKeys,
|
||||||
docChecked,
|
docChecked,
|
||||||
loadDoc,
|
loadDoc,
|
||||||
|
loadTreeData,
|
||||||
treeData,
|
treeData,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
<a-select-option value="true">TRUE</a-select-option>
|
<a-select-option value="true">TRUE</a-select-option>
|
||||||
<a-select-option value="false">FALSE</a-select-option>
|
<a-select-option value="false">FALSE</a-select-option>
|
||||||
</a-select>
|
</a-select>
|
||||||
<a-upload v-else-if="isFileType(record.type)"
|
<a-upload v-else-if="isFileType(record)"
|
||||||
:file-list="record.value" name="file" :multiple="record.type === 'array'"
|
:file-list="record.value" name="file" :multiple="record.type === 'array'"
|
||||||
:before-upload="file=>{return beforeUpload(file, record)}"
|
:before-upload="file=>{return beforeUpload(file, record)}"
|
||||||
:remove="file=>{return handleRemove(file, record)}"
|
:remove="file=>{return handleRemove(file, record)}"
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
paramListColumns.value.push({title: '参数值', dataIndex: 'value'});
|
paramListColumns.value.push({title: '参数值', dataIndex: 'value'});
|
||||||
paramListColumns.value.push({title: '', dataIndex: 'action', width: 40});
|
paramListColumns.value.push({title: '', dataIndex: 'action', width: 40});
|
||||||
const beforeUpload = (file, record) => {
|
const beforeUpload = (file, record) => {
|
||||||
if (record.type !== 'array') {
|
if (record.type !== 'array' || !(record.value instanceof Array) || record.value.length <= 0) {
|
||||||
record.value = [file];
|
record.value = [file];
|
||||||
} else {
|
} else {
|
||||||
record.value = [...record.value, file];
|
record.value = [...record.value, file];
|
||||||
|
|||||||
@@ -78,7 +78,16 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
const docSearch = () => {
|
const docSearch = () => {
|
||||||
loadDoc();
|
// 如果文档是swagger类型
|
||||||
|
if (docChoice.value.docType === 1 || docChoice.value.docType === 2) {
|
||||||
|
if (swaggerRef.value) {
|
||||||
|
swaggerRef.value.loadTreeData(searchKeywords.value);
|
||||||
|
}
|
||||||
|
} else if (docChoice.value.docType === 3 || docChoice.value.docType === 4) {
|
||||||
|
if (openApiRef.value) {
|
||||||
|
openApiRef.value.loadTreeData(searchKeywords.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
docChoiceId.value = route.query.uuid;
|
docChoiceId.value = route.query.uuid;
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
let treeData = ref([]);
|
let treeData = ref([]);
|
||||||
let expandedKeys = ref([]);
|
let expandedKeys = ref([]);
|
||||||
let choiceDocId = ref('');
|
let choiceDocId = ref('');
|
||||||
let searchKeywords = ref('');
|
|
||||||
|
|
||||||
const docChecked = (val, node) => {
|
const docChecked = (val, node) => {
|
||||||
if (node.node.isLeaf) {
|
if (node.node.isLeaf) {
|
||||||
@@ -46,11 +45,11 @@
|
|||||||
};
|
};
|
||||||
const loadDoc = (docId, keyword, callback) => {
|
const loadDoc = (docId, keyword, callback) => {
|
||||||
choiceDocId.value = docId;
|
choiceDocId.value = docId;
|
||||||
searchKeywords.value = keyword;
|
|
||||||
zyplayerApi.apiShareDocApisDetail({shareUuid: docId}).then(res => {
|
zyplayerApi.apiShareDocApisDetail({shareUuid: docId}).then(res => {
|
||||||
let v2Doc = toJsonObj(res.data);
|
let v2Doc = toJsonObj(res.data);
|
||||||
// os:doc.swagger 和 doc.openapi 的区别
|
// os:doc.swagger 和 doc.openapi 的区别
|
||||||
if (typeof v2Doc !== 'object' || !v2Doc.openapi) {
|
if (typeof v2Doc !== 'object' || !v2Doc.openapi) {
|
||||||
|
callback(false);
|
||||||
message.error('获取文档数据失败,请检查文档是否为标准的OpenApi文档格式');
|
message.error('获取文档数据失败,请检查文档是否为标准的OpenApi文档格式');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -60,13 +59,15 @@
|
|||||||
store.commit('setOpenApiUrlMethodMap', treeData.urlMethodMap);
|
store.commit('setOpenApiUrlMethodMap', treeData.urlMethodMap);
|
||||||
store.commit('setOpenApiMethodStatistic', treeData.methodStatistic);
|
store.commit('setOpenApiMethodStatistic', treeData.methodStatistic);
|
||||||
tagPathMap.value = treeData.tagPathMap;
|
tagPathMap.value = treeData.tagPathMap;
|
||||||
loadTreeData();
|
loadTreeData(keyword);
|
||||||
callback();
|
callback(true);
|
||||||
|
}).catch(() => {
|
||||||
|
callback(false);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const loadTreeData = async () => {
|
const loadTreeData = async (keyword) => {
|
||||||
let metaInfo = {uuid: choiceDocId.value};
|
let metaInfo = {uuid: choiceDocId.value};
|
||||||
treeData.value = getTreeDataForTag(openApiDoc.value, tagPathMap.value, searchKeywords.value, metaInfo);
|
treeData.value = getTreeDataForTag(openApiDoc.value, tagPathMap.value, keyword, metaInfo);
|
||||||
await nextTick();
|
await nextTick();
|
||||||
expandedKeys.value = ['main'];
|
expandedKeys.value = ['main'];
|
||||||
};
|
};
|
||||||
@@ -89,6 +90,7 @@
|
|||||||
expandedKeys,
|
expandedKeys,
|
||||||
docChecked,
|
docChecked,
|
||||||
loadDoc,
|
loadDoc,
|
||||||
|
loadTreeData,
|
||||||
treeData,
|
treeData,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
let treeData = ref([]);
|
let treeData = ref([]);
|
||||||
let expandedKeys = ref([]);
|
let expandedKeys = ref([]);
|
||||||
let choiceDocId = ref('');
|
let choiceDocId = ref('');
|
||||||
let searchKeywords = ref('');
|
|
||||||
|
|
||||||
const docChecked = (val, node) => {
|
const docChecked = (val, node) => {
|
||||||
if (node.node.isLeaf) {
|
if (node.node.isLeaf) {
|
||||||
@@ -46,7 +45,6 @@
|
|||||||
};
|
};
|
||||||
const loadDoc = (docId, keyword, callback) => {
|
const loadDoc = (docId, keyword, callback) => {
|
||||||
choiceDocId.value = docId;
|
choiceDocId.value = docId;
|
||||||
searchKeywords.value = keyword;
|
|
||||||
zyplayerApi.apiShareDocApisDetail({shareUuid: docId}).then(res => {
|
zyplayerApi.apiShareDocApisDetail({shareUuid: docId}).then(res => {
|
||||||
let v2Doc = toJsonObj(res.data);
|
let v2Doc = toJsonObj(res.data);
|
||||||
if (typeof v2Doc !== 'object' || !v2Doc.swagger) {
|
if (typeof v2Doc !== 'object' || !v2Doc.swagger) {
|
||||||
@@ -60,13 +58,15 @@
|
|||||||
store.commit('setSwaggerUrlMethodMap', treeData.urlMethodMap);
|
store.commit('setSwaggerUrlMethodMap', treeData.urlMethodMap);
|
||||||
store.commit('setSwaggerMethodStatistic', treeData.methodStatistic);
|
store.commit('setSwaggerMethodStatistic', treeData.methodStatistic);
|
||||||
tagPathMap.value = treeData.tagPathMap;
|
tagPathMap.value = treeData.tagPathMap;
|
||||||
loadTreeData();
|
loadTreeData(keyword);
|
||||||
callback(true);
|
callback(true);
|
||||||
|
}).catch(() => {
|
||||||
|
callback(false);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
const loadTreeData = async () => {
|
const loadTreeData = async (keyword) => {
|
||||||
let metaInfo = {uuid: choiceDocId.value};
|
let metaInfo = {uuid: choiceDocId.value};
|
||||||
treeData.value = getTreeDataForTag(swaggerDoc.value, tagPathMap.value, searchKeywords.value, metaInfo);
|
treeData.value = getTreeDataForTag(swaggerDoc.value, tagPathMap.value, keyword, metaInfo);
|
||||||
await nextTick();
|
await nextTick();
|
||||||
expandedKeys.value = ['main'];
|
expandedKeys.value = ['main'];
|
||||||
};
|
};
|
||||||
@@ -89,6 +89,7 @@
|
|||||||
expandedKeys,
|
expandedKeys,
|
||||||
docChecked,
|
docChecked,
|
||||||
loadDoc,
|
loadDoc,
|
||||||
|
loadTreeData,
|
||||||
treeData,
|
treeData,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ export default createStore({
|
|||||||
apiDoc: {},
|
apiDoc: {},
|
||||||
// 全局参数
|
// 全局参数
|
||||||
globalParam: [],
|
globalParam: [],
|
||||||
|
// 当前文档全局参数
|
||||||
|
docGlobalParam: [],
|
||||||
// 左侧菜单栏宽度
|
// 左侧菜单栏宽度
|
||||||
leftAsideWidth: 0,
|
leftAsideWidth: 0,
|
||||||
|
|
||||||
@@ -53,6 +55,19 @@ export default createStore({
|
|||||||
setGlobalParam(state, globalParam) {
|
setGlobalParam(state, globalParam) {
|
||||||
state.globalParam = globalParam;
|
state.globalParam = globalParam;
|
||||||
},
|
},
|
||||||
|
setDocGlobalParam(state, globalParam) {
|
||||||
|
state.docGlobalParam = globalParam;
|
||||||
|
},
|
||||||
|
setGlobalParamOnChange(state, globalParam, docId) {
|
||||||
|
if (docId && docId > 0) {
|
||||||
|
// 当前选中的文档是修改的文档才更新
|
||||||
|
if (state.apiDoc.id === docId) {
|
||||||
|
state.docGlobalParam = globalParam;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
state.globalParam = globalParam;
|
||||||
|
}
|
||||||
|
},
|
||||||
setApiDoc(state, apiDoc) {
|
setApiDoc(state, apiDoc) {
|
||||||
state.apiDoc = apiDoc;
|
state.apiDoc = apiDoc;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
zyplayerApi.docApiGlobalParamList(props.dynamicParam).then(res => {
|
zyplayerApi.docApiGlobalParamList(props.dynamicParam).then(res => {
|
||||||
setTimeout(() => docListLoading.value = false, 500);
|
setTimeout(() => docListLoading.value = false, 500);
|
||||||
docList.value = res.data || [];
|
docList.value = res.data || [];
|
||||||
store.commit('setGlobalParam', docList.value);
|
store.commit('setGlobalParamOnChange', docList.value, props.dynamicParam.id);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
let docEdit = ref({});
|
let docEdit = ref({});
|
||||||
|
|||||||
@@ -98,7 +98,8 @@
|
|||||||
setup(props) {
|
setup(props) {
|
||||||
const store = useStore();
|
const store = useStore();
|
||||||
let apiDoc = store.state.apiDoc || {};
|
let apiDoc = store.state.apiDoc || {};
|
||||||
let globalParam = store.state.globalParam || [];
|
let userGlobalParam = store.state.globalParam || [];
|
||||||
|
let docGlobalParam = store.state.docGlobalParam || [];
|
||||||
let openApiDoc = store.state.openApiDoc || {};
|
let openApiDoc = store.state.openApiDoc || {};
|
||||||
let urlDomain = apiDoc.rewriteDomain || '';
|
let urlDomain = apiDoc.rewriteDomain || '';
|
||||||
// os:取服务地址不一样 todo 多服务地址的情况处理
|
// os:取服务地址不一样 todo 多服务地址的情况处理
|
||||||
@@ -108,6 +109,7 @@
|
|||||||
}
|
}
|
||||||
let docUrl = ref(urlDomain + props.docInfoShow.url);
|
let docUrl = ref(urlDomain + props.docInfoShow.url);
|
||||||
let activePage = ref('urlParam');
|
let activePage = ref('urlParam');
|
||||||
|
let globalParam = [].concat(userGlobalParam, docGlobalParam);
|
||||||
// URL参数处理
|
// URL参数处理
|
||||||
const urlParamRef = ref();
|
const urlParamRef = ref();
|
||||||
let urlParamListProp = props.requestParamList.filter(item => item.in === 'query' || item.in === 'path');
|
let urlParamListProp = props.requestParamList.filter(item => item.in === 'query' || item.in === 'path');
|
||||||
@@ -184,6 +186,9 @@
|
|||||||
} else if (headerParamListProp.length > 0) {
|
} else if (headerParamListProp.length > 0) {
|
||||||
activePage.value = 'headerParam';
|
activePage.value = 'headerParam';
|
||||||
}
|
}
|
||||||
|
const isFileType = record => {
|
||||||
|
return record.type === 'file' || record.subType === 'file' || record.subType === 'MultipartFile';
|
||||||
|
};
|
||||||
// 发送请求
|
// 发送请求
|
||||||
let requestResult = ref({});
|
let requestResult = ref({});
|
||||||
let requestLoading = ref(false);
|
let requestLoading = ref(false);
|
||||||
@@ -195,11 +200,29 @@
|
|||||||
message.error('请输入请求的目标URL地址');
|
message.error('请输入请求的目标URL地址');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// 用于替换URL上的path参数
|
||||||
let formObjData = {};
|
let formObjData = {};
|
||||||
|
// 代理请求发送给后端的对象
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
|
const appendData = item => {
|
||||||
|
if (isFileType(item)) {
|
||||||
|
// 防止参数重名,加个前缀
|
||||||
|
let name = '_file_' + item.name;
|
||||||
|
if (item.type === 'array') {
|
||||||
|
item.value.forEach(file => formData.append(name, file));
|
||||||
|
} else {
|
||||||
|
if (item.value instanceof Array && item.value.length > 0) {
|
||||||
|
formData.append(name, item.value[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
formObjData[item.name] = item.value;
|
||||||
|
formData.append(item.name, item.value);
|
||||||
|
}
|
||||||
|
};
|
||||||
let urlParamSelected = urlParamRef.value.getSelectedRowKeys();
|
let urlParamSelected = urlParamRef.value.getSelectedRowKeys();
|
||||||
let urlParamStr = urlParamList.value.filter(item => urlParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
let urlParamStr = urlParamList.value.filter(item => urlParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
||||||
formObjData[item.name] = item.value;
|
appendData(item);
|
||||||
return item.name + '=' + encodeURIComponent(item.value);
|
return item.name + '=' + encodeURIComponent(item.value);
|
||||||
}).join('&');
|
}).join('&');
|
||||||
let headerParamSelected = headerParamRef.value.getSelectedRowKeys();
|
let headerParamSelected = headerParamRef.value.getSelectedRowKeys();
|
||||||
@@ -215,7 +238,7 @@
|
|||||||
let formParamSelected = formParamRef.value.getSelectedRowKeys();
|
let formParamSelected = formParamRef.value.getSelectedRowKeys();
|
||||||
formParamArr = formParamList.value.filter(item => formParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
formParamArr = formParamList.value.filter(item => formParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
||||||
// todo 判断处理文件格式
|
// todo 判断处理文件格式
|
||||||
formObjData[item.name] = item.value;
|
appendData(item);
|
||||||
return {code: item.name, value: item.value};
|
return {code: item.name, value: item.value};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -224,7 +247,7 @@
|
|||||||
let formEncodeParamSelected = formEncodeParamRef.value.getSelectedRowKeys();
|
let formEncodeParamSelected = formEncodeParamRef.value.getSelectedRowKeys();
|
||||||
formEncodeParamArr = formEncodeParamList.value.filter(item => formEncodeParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
formEncodeParamArr = formEncodeParamList.value.filter(item => formEncodeParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
||||||
// todo 判断处理文件格式
|
// todo 判断处理文件格式
|
||||||
formObjData[item.name] = item.value;
|
appendData(item);
|
||||||
return {code: item.name, value: item.value};
|
return {code: item.name, value: item.value};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -232,9 +255,6 @@
|
|||||||
if (bodyParamRef.value) {
|
if (bodyParamRef.value) {
|
||||||
bodyParamStr = bodyParamRef.value.getParam();
|
bodyParamStr = bodyParamRef.value.getParam();
|
||||||
}
|
}
|
||||||
// fileList.value.forEach(file => {
|
|
||||||
// formData.append('files[]', file);
|
|
||||||
// });
|
|
||||||
let url = urlParamStr ? (docUrl.value + '?' + urlParamStr) : docUrl.value;
|
let url = urlParamStr ? (docUrl.value + '?' + urlParamStr) : docUrl.value;
|
||||||
// 替换path参数
|
// 替换path参数
|
||||||
Object.keys(formObjData).forEach((key) => {
|
Object.keys(formObjData).forEach((key) => {
|
||||||
|
|||||||
@@ -98,11 +98,13 @@
|
|||||||
setup(props) {
|
setup(props) {
|
||||||
const store = useStore();
|
const store = useStore();
|
||||||
let apiDoc = store.state.apiDoc || {};
|
let apiDoc = store.state.apiDoc || {};
|
||||||
let globalParam = store.state.globalParam || [];
|
let userGlobalParam = store.state.globalParam || [];
|
||||||
|
let docGlobalParam = store.state.docGlobalParam || [];
|
||||||
let swaggerDoc = store.state.swaggerDoc || {};
|
let swaggerDoc = store.state.swaggerDoc || {};
|
||||||
let urlDomain = apiDoc.rewriteDomain || swaggerDoc.host;
|
let urlDomain = apiDoc.rewriteDomain || swaggerDoc.host;
|
||||||
let docUrl = ref(urlDomain + props.docInfoShow.url);
|
let docUrl = ref(urlDomain + props.docInfoShow.url);
|
||||||
let activePage = ref('urlParam');
|
let activePage = ref('urlParam');
|
||||||
|
let globalParam = [].concat(userGlobalParam, docGlobalParam);
|
||||||
// URL参数处理
|
// URL参数处理
|
||||||
const urlParamRef = ref();
|
const urlParamRef = ref();
|
||||||
let urlParamListProp = props.requestParamList.filter(item => item.in === 'query' || item.in === 'path');
|
let urlParamListProp = props.requestParamList.filter(item => item.in === 'query' || item.in === 'path');
|
||||||
@@ -179,6 +181,9 @@
|
|||||||
} else if (headerParamListProp.length > 0) {
|
} else if (headerParamListProp.length > 0) {
|
||||||
activePage.value = 'headerParam';
|
activePage.value = 'headerParam';
|
||||||
}
|
}
|
||||||
|
const isFileType = record => {
|
||||||
|
return record.type === 'file' || record.subType === 'file' || record.subType === 'MultipartFile';
|
||||||
|
};
|
||||||
// 发送请求
|
// 发送请求
|
||||||
let requestResult = ref({});
|
let requestResult = ref({});
|
||||||
let requestLoading = ref(false);
|
let requestLoading = ref(false);
|
||||||
@@ -190,11 +195,29 @@
|
|||||||
message.error('请输入请求的目标URL地址');
|
message.error('请输入请求的目标URL地址');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// 用于替换URL上的path参数
|
||||||
let formObjData = {};
|
let formObjData = {};
|
||||||
|
// 代理请求发送给后端的对象
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
|
const appendData = item => {
|
||||||
|
if (isFileType(item)) {
|
||||||
|
// 防止参数重名,加个前缀
|
||||||
|
let name = '_file_' + item.name;
|
||||||
|
if (item.type === 'array') {
|
||||||
|
item.value.forEach(file => formData.append(name, file));
|
||||||
|
} else {
|
||||||
|
if (item.value instanceof Array && item.value.length > 0) {
|
||||||
|
formData.append(name, item.value[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
formObjData[item.name] = item.value;
|
||||||
|
formData.append(item.name, item.value);
|
||||||
|
}
|
||||||
|
};
|
||||||
let urlParamSelected = urlParamRef.value.getSelectedRowKeys();
|
let urlParamSelected = urlParamRef.value.getSelectedRowKeys();
|
||||||
let urlParamStr = urlParamList.value.filter(item => urlParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
let urlParamStr = urlParamList.value.filter(item => urlParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
||||||
formObjData[item.name] = item.value;
|
appendData(item);
|
||||||
return item.name + '=' + encodeURIComponent(item.value);
|
return item.name + '=' + encodeURIComponent(item.value);
|
||||||
}).join('&');
|
}).join('&');
|
||||||
let headerParamSelected = headerParamRef.value.getSelectedRowKeys();
|
let headerParamSelected = headerParamRef.value.getSelectedRowKeys();
|
||||||
@@ -210,7 +233,7 @@
|
|||||||
let formParamSelected = formParamRef.value.getSelectedRowKeys();
|
let formParamSelected = formParamRef.value.getSelectedRowKeys();
|
||||||
formParamArr = formParamList.value.filter(item => formParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
formParamArr = formParamList.value.filter(item => formParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
||||||
// todo 判断处理文件格式
|
// todo 判断处理文件格式
|
||||||
formObjData[item.name] = item.value;
|
appendData(item);
|
||||||
return {code: item.name, value: item.value};
|
return {code: item.name, value: item.value};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -219,7 +242,7 @@
|
|||||||
let formEncodeParamSelected = formEncodeParamRef.value.getSelectedRowKeys();
|
let formEncodeParamSelected = formEncodeParamRef.value.getSelectedRowKeys();
|
||||||
formEncodeParamArr = formEncodeParamList.value.filter(item => formEncodeParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
formEncodeParamArr = formEncodeParamList.value.filter(item => formEncodeParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
|
||||||
// todo 判断处理文件格式
|
// todo 判断处理文件格式
|
||||||
formObjData[item.name] = item.value;
|
appendData(item);
|
||||||
return {code: item.name, value: item.value};
|
return {code: item.name, value: item.value};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -227,9 +250,6 @@
|
|||||||
if (bodyParamRef.value) {
|
if (bodyParamRef.value) {
|
||||||
bodyParamStr = bodyParamRef.value.getParam();
|
bodyParamStr = bodyParamRef.value.getParam();
|
||||||
}
|
}
|
||||||
// fileList.value.forEach(file => {
|
|
||||||
// formData.append('files[]', file);
|
|
||||||
// });
|
|
||||||
let url = urlParamStr ? (docUrl.value + '?' + urlParamStr) : docUrl.value;
|
let url = urlParamStr ? (docUrl.value + '?' + urlParamStr) : docUrl.value;
|
||||||
// 替换path参数
|
// 替换path参数
|
||||||
Object.keys(formObjData).forEach((key) => {
|
Object.keys(formObjData).forEach((key) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user