实现swagger的代理请求和拿到返回结果并展示了

This commit is contained in:
暮光:城中城
2021-11-04 23:43:58 +08:00
parent 4487c138b2
commit 339a29e739
34 changed files with 3289 additions and 86 deletions

View File

@@ -75,7 +75,7 @@ public class SwaggerDocumentController {
// UI地址替换为文档json地址 // UI地址替换为文档json地址
String docUrl = SwaggerDocUtil.replaceSwaggerResources(swaggerDoc.getDocUrl()); String docUrl = SwaggerDocUtil.replaceSwaggerResources(swaggerDoc.getDocUrl());
if (SwaggerDocUtil.isSwaggerResources(docUrl)) { if (SwaggerDocUtil.isSwaggerResources(docUrl)) {
String resourcesStr = swaggerHttpRequestService.requestUrl(request, docUrl); String resourcesStr = swaggerHttpRequestService.requestSwaggerUrl(request, docUrl);
List<SwaggerResource> resourceList = JSON.parseArray(resourcesStr, SwaggerResource.class); List<SwaggerResource> resourceList = JSON.parseArray(resourcesStr, SwaggerResource.class);
if (resourceList == null || resourceList.isEmpty()) { if (resourceList == null || resourceList.isEmpty()) {
return DocResponseJson.warn("该地址未找到文档"); return DocResponseJson.warn("该地址未找到文档");

View File

@@ -0,0 +1,47 @@
package com.zyplayer.doc.swaggerplus.controller;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.swaggerplus.controller.param.ProxyRequestParam;
import com.zyplayer.doc.swaggerplus.controller.vo.ProxyRequestResultVo;
import com.zyplayer.doc.swaggerplus.service.SwaggerHttpRequestService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
/**
* 请求参数控制器
*
* @author 暮光:城中城
* @since 2021年10月16日
*/
@AuthMan
@RestController
@RequestMapping("/doc-swagger/proxy")
public class SwaggerPoxyRequestController {
private static Logger logger = LoggerFactory.getLogger(SwaggerPoxyRequestController.class);
@Resource
private SwaggerHttpRequestService swaggerHttpRequestService;
/**
* 代理接口请求
*
* @return 请求参数
* @author 暮光:城中城
* @since 2021年10月16日
*/
@ResponseBody
@PostMapping(value = "/request")
public ResponseJson<ProxyRequestResultVo> request(HttpServletRequest request, ProxyRequestParam requestParam) {
ProxyRequestResultVo requestResult = swaggerHttpRequestService.proxyRequest(request, requestParam);
return DocResponseJson.ok(requestResult);
}
}

View File

@@ -1,17 +1,11 @@
package com.zyplayer.doc.swaggerplus.controller; package com.zyplayer.doc.swaggerplus.controller;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.zyplayer.doc.core.annotation.AuthMan; import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.exception.ConfirmException; import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.data.repository.manage.entity.SwaggerDoc; import com.zyplayer.doc.data.repository.manage.entity.SwaggerDoc;
import com.zyplayer.doc.data.service.manage.SwaggerDocService; import com.zyplayer.doc.data.service.manage.SwaggerDocService;
import com.zyplayer.doc.swaggerplus.controller.vo.SwaggerResourceVo; import com.zyplayer.doc.swaggerplus.controller.vo.SwaggerResourceVo;
import com.zyplayer.doc.swaggerplus.service.SwaggerHttpRequestService; import com.zyplayer.doc.swaggerplus.service.SwaggerHttpRequestService;
import io.swagger.models.Swagger;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.util.MimeTypeUtils; import org.springframework.util.MimeTypeUtils;
@@ -21,15 +15,12 @@ import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.spring.web.json.Json; import springfox.documentation.spring.web.json.Json;
import springfox.documentation.swagger.web.ApiKeyVehicle; import springfox.documentation.swagger.web.ApiKeyVehicle;
import springfox.documentation.swagger.web.SecurityConfiguration; import springfox.documentation.swagger.web.SecurityConfiguration;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.UiConfiguration; import springfox.documentation.swagger.web.UiConfiguration;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.*; import java.util.*;
import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE;
/** /**
* 承接了所有的ApiResourceController的接口 * 承接了所有的ApiResourceController的接口
* *
@@ -72,7 +63,7 @@ public class SwaggerProxyController {
throw new ConfirmException("文档不存在"); throw new ConfirmException("文档不存在");
} }
if (Objects.equals(swaggerDoc.getDocType(), 1)) { if (Objects.equals(swaggerDoc.getDocType(), 1)) {
String contentStr = swaggerHttpRequestService.requestUrl(request, swaggerDoc.getDocUrl()); String contentStr = swaggerHttpRequestService.requestSwaggerUrl(request, swaggerDoc.getDocUrl());
return new ResponseEntity<>(new Json(contentStr), HttpStatus.OK); return new ResponseEntity<>(new Json(contentStr), HttpStatus.OK);
} }
return new ResponseEntity<>(new Json(swaggerDoc.getJsonContent()), HttpStatus.OK); return new ResponseEntity<>(new Json(swaggerDoc.getJsonContent()), HttpStatus.OK);

View File

@@ -0,0 +1,22 @@
package com.zyplayer.doc.swaggerplus.controller.param;
public class ParamData {
private String code;
private String value;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@@ -0,0 +1,102 @@
package com.zyplayer.doc.swaggerplus.controller.param;
import com.alibaba.fastjson.JSON;
import java.util.List;
/**
* 代理请求参数
*
* @author 暮光:城中城
* @since 2021-11-04
*/
public class ProxyRequestParam {
private String url;
private String method;
private String contentType;
private String headerParam;
private String cookieParam;
private String formParam;
private String formEncodeParam;
private String bodyParam;
public List<ParamData> getHeaderParamData() {
return JSON.parseArray(headerParam, ParamData.class);
}
public List<ParamData> getCookieParamData() {
return JSON.parseArray(cookieParam, ParamData.class);
}
public List<ParamData> getFormParamData() {
return JSON.parseArray(formParam, ParamData.class);
}
public List<ParamData> getFormEncodeParamData() {
return JSON.parseArray(formEncodeParam, ParamData.class);
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getHeaderParam() {
return headerParam;
}
public void setHeaderParam(String headerParam) {
this.headerParam = headerParam;
}
public String getCookieParam() {
return cookieParam;
}
public void setCookieParam(String cookieParam) {
this.cookieParam = cookieParam;
}
public String getFormParam() {
return formParam;
}
public void setFormParam(String formParam) {
this.formParam = formParam;
}
public String getFormEncodeParam() {
return formEncodeParam;
}
public void setFormEncodeParam(String formEncodeParam) {
this.formEncodeParam = formEncodeParam;
}
public String getBodyParam() {
return bodyParam;
}
public void setBodyParam(String bodyParam) {
this.bodyParam = bodyParam;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
}

View File

@@ -0,0 +1,38 @@
package com.zyplayer.doc.swaggerplus.controller.vo;
/**
* cookie返回值对象
*
* @author 暮光:城中城
* @since 2018年8月21日
*/
public class HttpCookieVo {
private String name;
private String value;
public HttpCookieVo() {
}
public HttpCookieVo(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@@ -0,0 +1,29 @@
package com.zyplayer.doc.swaggerplus.controller.vo;
/**
* header返回值对象
*
* @author 暮光:城中城
* @since 2018年8月21日
*/
public class HttpHeaderVo {
private String name;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@@ -0,0 +1,61 @@
package com.zyplayer.doc.swaggerplus.controller.vo;
import java.util.List;
public class ProxyRequestResultVo {
private List<HttpCookieVo> cookies;
private List<HttpHeaderVo> headers;
private Integer status;
private Long useTime;
private String data;
private String errorMsg;
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Long getUseTime() {
return useTime;
}
public void setUseTime(Long useTime) {
this.useTime = useTime;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public List<HttpCookieVo> getCookies() {
return cookies;
}
public void setCookies(List<HttpCookieVo> cookies) {
this.cookies = cookies;
}
public List<HttpHeaderVo> getHeaders() {
return headers;
}
public void setHeaders(List<HttpHeaderVo> headers) {
this.headers = headers;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}

View File

@@ -1,20 +1,28 @@
package com.zyplayer.doc.swaggerplus.service; package com.zyplayer.doc.swaggerplus.service;
import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.Method;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.data.repository.manage.entity.SwaggerGlobalParam; import com.zyplayer.doc.data.repository.manage.entity.SwaggerGlobalParam;
import com.zyplayer.doc.data.service.manage.SwaggerGlobalParamService; import com.zyplayer.doc.data.service.manage.SwaggerGlobalParamService;
import com.zyplayer.doc.swaggerplus.controller.param.ProxyRequestParam;
import com.zyplayer.doc.swaggerplus.controller.vo.HttpCookieVo;
import com.zyplayer.doc.swaggerplus.controller.vo.HttpHeaderVo;
import com.zyplayer.doc.swaggerplus.controller.vo.ProxyRequestResultVo;
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.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
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 java.net.HttpCookie; import java.net.HttpCookie;
import java.util.LinkedList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
@Service @Service
public class SwaggerHttpRequestService { public class SwaggerHttpRequestService {
@@ -22,7 +30,15 @@ public class SwaggerHttpRequestService {
@Resource @Resource
private SwaggerGlobalParamService swaggerGlobalParamService; private SwaggerGlobalParamService swaggerGlobalParamService;
public String requestUrl(HttpServletRequest request, String docUrl) { private static final Map<String, Method> requestMethodMap = Stream.of(Method.values()).collect(Collectors.toMap(val -> val.name().toLowerCase(), val -> val));
/**
* 请求真实的swagger文档内容
*
* @author 暮光:城中城
* @since 2021-11-04
*/
public String requestSwaggerUrl(HttpServletRequest request, String docUrl) {
List<SwaggerGlobalParam> globalParamList = swaggerGlobalParamService.getGlobalParamList(); List<SwaggerGlobalParam> globalParamList = swaggerGlobalParamService.getGlobalParamList();
Map<String, Object> globalFormParamMap = globalParamList.stream().filter(item -> Objects.equals(item.getParamType(), 1)) Map<String, Object> globalFormParamMap = globalParamList.stream().filter(item -> Objects.equals(item.getParamType(), 1))
.collect(Collectors.toMap(SwaggerGlobalParam::getParamKey, SwaggerGlobalParam::getParamValue)); .collect(Collectors.toMap(SwaggerGlobalParam::getParamKey, SwaggerGlobalParam::getParamValue));
@@ -33,14 +49,78 @@ public class SwaggerHttpRequestService {
// 执行请求 // 执行请求
String resultStr = HttpRequest.get(docUrl) String resultStr = HttpRequest.get(docUrl)
.form(globalFormParamMap) .form(globalFormParamMap)
.addHeaders(this.getHttpHeader(request, globalHeaderParamMap))
.header("Accept", "application/json, text/javascript, */*; q=0.01") .header("Accept", "application/json, text/javascript, */*; q=0.01")
.header("User-Agent", request.getHeader("User-Agent"))
.addHeaders(globalHeaderParamMap)
.cookie(this.getHttpCookie(request, globalCookieParamMap)) .cookie(this.getHttpCookie(request, globalCookieParamMap))
.timeout(5000).execute().body(); .timeout(10000).execute().body();
return resultStr; return resultStr;
} }
/**
* 执行代理请求
*
* @author 暮光:城中城
* @since 2021-11-04
*/
public ProxyRequestResultVo proxyRequest(HttpServletRequest request, ProxyRequestParam requestParam) {
ProxyRequestResultVo resultVo = new ProxyRequestResultVo();
long startTime = System.currentTimeMillis();
try {
// 执行请求
Method method = requestMethodMap.get(requestParam.getMethod());
if (method == null) {
throw new ConfirmException("不支持的请求方式:" + requestParam.getMethod());
}
HttpRequest httpRequest = new HttpRequest(requestParam.getUrl()).setMethod(method);
// http自带参数
httpRequest.addHeaders(this.getHttpHeader(request, Collections.emptyMap()));
httpRequest.cookie(this.getHttpCookie(request, Collections.emptyMap()));
// 用户输入的参数
requestParam.getFormParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue()));
requestParam.getFormEncodeParamData().forEach(data -> httpRequest.form(data.getCode(), data.getValue()));
requestParam.getHeaderParamData().forEach(data -> httpRequest.header(data.getCode(), data.getValue()));
if (StringUtils.isNotBlank(requestParam.getBodyParam())) {
httpRequest.body(requestParam.getBodyParam());
}
// 强制设置类型
if (StringUtils.isNotBlank(requestParam.getContentType())) {
httpRequest.contentType(requestParam.getContentType());
}
// 执行请求
HttpResponse httpResponse = httpRequest.timeout(10000).execute();
resultVo.setData(httpResponse.body());
resultVo.setStatus(httpResponse.getStatus());
// 设置返回的cookies
List<HttpCookie> responseCookies = httpResponse.getCookies();
if (CollectionUtils.isNotEmpty(responseCookies)) {
resultVo.setCookies(responseCookies.stream().map(val -> new HttpCookieVo(val.getName(), val.getValue())).collect(Collectors.toList()));
}
// 设置返回的headers
Map<String, List<String>> responseHeaders = httpResponse.headers();
if (MapUtils.isNotEmpty(responseHeaders)) {
List<HttpHeaderVo> headerList = new ArrayList<>(responseHeaders.size());
for (Map.Entry<String, List<String>> httpHeader : responseHeaders.entrySet()) {
HttpHeaderVo vo = new HttpHeaderVo();
vo.setName(httpHeader.getKey());
vo.setValue(String.join(";", httpHeader.getValue()));
headerList.add(vo);
}
resultVo.setHeaders(headerList);
}
} catch (Exception e) {
e.printStackTrace();
resultVo.setErrorMsg(e.getMessage());
}
resultVo.setUseTime(System.currentTimeMillis() - startTime);
return resultVo;
}
/**
* 获取http的cookie
*
* @author 暮光:城中城
* @since 2021-11-04
*/
private List<HttpCookie> getHttpCookie(HttpServletRequest request, Map<String, String> globalCookieParamMap) { private List<HttpCookie> getHttpCookie(HttpServletRequest request, Map<String, String> globalCookieParamMap) {
List<HttpCookie> httpCookies = new LinkedList<>(); List<HttpCookie> httpCookies = new LinkedList<>();
for (Cookie cookie : request.getCookies()) { for (Cookie cookie : request.getCookies()) {
@@ -51,4 +131,27 @@ public class SwaggerHttpRequestService {
} }
return httpCookies; return httpCookies;
} }
/**
* 获取http的header
*
* @author 暮光:城中城
* @since 2021-11-04
*/
private Map<String, String> getHttpHeader(HttpServletRequest request, Map<String, String> globalHeaderParamMap) {
Map<String, String> headerParamMap = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
String[] notNeedHeaders = new String[]{"referer", "origin", "host"};
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
if (ArrayUtils.contains(notNeedHeaders, headerName)) {
continue;
}
// headerParamMap.put(headerName, request.getHeader(headerName));
}
if (MapUtils.isNotEmpty(globalHeaderParamMap)) {
headerParamMap.putAll(globalHeaderParamMap);
}
return headerParamMap;
}
} }

View File

@@ -1 +0,0 @@
import{O as a,P as e,r as t,c as o,w as s,o as l,a as n,p as r,t as c,b as g,n as f,d as i,e as u,F as d}from"./vendor.cbf1194d.js";const w={setup(){const t=a();return{swaggerDoc:e((()=>t.state.swaggerDoc)),swaggerDocInfo:e((()=>t.state.swaggerDoc.info)),methodStatistic:e((()=>t.state.methodStatistic))}}},D=["href"],I=["href"],_=["innerHTML"],m={key:1,style:{"text-align":"center"}};w.render=function(a,e,w,T,b,p){const h=t("a-form-item"),k=t("a-statistic"),y=t("a-card"),E=t("a-col"),O=t("a-row"),S=t("a-form");return l(),o(y,null,{default:s((()=>[T.swaggerDocInfo?(l(),o(S,{key:0,"label-col":{span:4},"wrapper-col":{span:20}},{default:s((()=>[n(h,{label:"标题"},{default:s((()=>[r(c(T.swaggerDocInfo.title),1)])),_:1}),n(h,{label:"版本"},{default:s((()=>[r(c(T.swaggerDocInfo.version),1)])),_:1}),T.swaggerDocInfo.contact?(l(),o(h,{key:0,label:"作者"},{default:s((()=>[r(c(T.swaggerDocInfo.contact.name)+" "+c(T.swaggerDocInfo.contact.email)+" ",1),T.swaggerDocInfo.contact.url?(l(),g("a",{key:0,href:T.swaggerDocInfo.contact.url,target:"_blank"},c(T.swaggerDocInfo.contact.url),9,D)):f("",!0)])),_:1})):f("",!0),n(h,{label:"host"},{default:s((()=>[r(c(T.swaggerDoc.host),1)])),_:1}),T.swaggerDocInfo.license?(l(),o(h,{key:1,label:"许可证"},{default:s((()=>[i("a",{href:T.swaggerDocInfo.license.url,target:"_blank"},c(T.swaggerDocInfo.license.name),9,I)])),_:1})):f("",!0),n(h,{label:"文档说明"},{default:s((()=>[i("span",{innerHTML:T.swaggerDocInfo.description},null,8,_)])),_:1}),n(h,{label:"接口统计"},{default:s((()=>[n(O,{gutter:[16,16]},{default:s((()=>[(l(),g(d,null,u(["GET","POST","PUT","DELETE","HEAD","PATCH","OPTIONS","TRACE","TOTAL"],(a=>(l(),g(d,null,[T.methodStatistic[a]?(l(),o(E,{key:0,span:6},{default:s((()=>[n(y,{size:"small"},{default:s((()=>[n(k,{title:"TOTAL"===a?"总计":a+"方法",value:T.methodStatistic[a],suffix:"个"},null,8,["title","value"])])),_:2},1024)])),_:2},1024)):f("",!0)],64)))),64))])),_:1})])),_:1})])),_:1})):(l(),g("div",m,"暂无文档信息,请先选择文档"))])),_:1})};export{w as default};

View File

@@ -0,0 +1 @@
import{O as p,P as d,r,o as t,c as s,w as a,a as o,p as f,t as c,b as i,n as g,e as D,d as y,F as I}from"./vendor.1f907179.js";import{_ as S}from"./main.b5589b09.js";const v={setup(){const l=p(),m=d(()=>l.state.swaggerDoc),w=d(()=>l.state.swaggerDoc.info),e=d(()=>l.state.methodStatistic);return{swaggerDoc:m,swaggerDocInfo:w,methodStatistic:e}}},x=["href"],E=["href"],L=["innerHTML"],O={key:1,style:{"text-align":"center"}};function A(l,m,w,e,C,N){const n=r("a-form-item"),T=r("a-statistic"),u=r("a-card"),b=r("a-col"),h=r("a-row"),k=r("a-form");return t(),s(u,null,{default:a(()=>[e.swaggerDocInfo?(t(),s(k,{key:0,"label-col":{span:4},"wrapper-col":{span:20}},{default:a(()=>[o(n,{label:"\u6807\u9898"},{default:a(()=>[f(c(e.swaggerDocInfo.title),1)]),_:1}),o(n,{label:"\u7248\u672C"},{default:a(()=>[f(c(e.swaggerDocInfo.version),1)]),_:1}),e.swaggerDocInfo.contact?(t(),s(n,{key:0,label:"\u4F5C\u8005"},{default:a(()=>[f(c(e.swaggerDocInfo.contact.name)+" "+c(e.swaggerDocInfo.contact.email)+" ",1),e.swaggerDocInfo.contact.url?(t(),i("a",{key:0,href:e.swaggerDocInfo.contact.url,target:"_blank"},c(e.swaggerDocInfo.contact.url),9,x)):g("",!0)]),_:1})):g("",!0),o(n,{label:"host"},{default:a(()=>[f(c(e.swaggerDoc.host),1)]),_:1}),e.swaggerDocInfo.license?(t(),s(n,{key:1,label:"\u8BB8\u53EF\u8BC1"},{default:a(()=>[D("a",{href:e.swaggerDocInfo.license.url,target:"_blank"},c(e.swaggerDocInfo.license.name),9,E)]),_:1})):g("",!0),o(n,{label:"\u6587\u6863\u8BF4\u660E"},{default:a(()=>[D("span",{innerHTML:e.swaggerDocInfo.description},null,8,L)]),_:1}),o(n,{label:"\u63A5\u53E3\u7EDF\u8BA1"},{default:a(()=>[o(h,{gutter:[16,16]},{default:a(()=>[(t(),i(I,null,y(["GET","POST","PUT","DELETE","HEAD","PATCH","OPTIONS","TRACE","TOTAL"],_=>(t(),i(I,null,[e.methodStatistic[_]?(t(),s(b,{key:0,span:6},{default:a(()=>[o(u,{size:"small"},{default:a(()=>[o(T,{title:_==="TOTAL"?"\u603B\u8BA1":_+"\u65B9\u6CD5",value:e.methodStatistic[_],suffix:"\u4E2A"},null,8,["title","value"])]),_:2},1024)]),_:2},1024)):g("",!0)],64))),64))]),_:1})]),_:1})]),_:1})):(t(),i("div",O,"\u6682\u65E0\u6587\u6863\u4FE1\u606F\uFF0C\u8BF7\u5148\u9009\u62E9\u6587\u6863"))]),_:1})}var H=S(v,[["render",A]]);export{H as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
var e=Object.defineProperty,a=Object.getOwnPropertySymbols,t=Object.prototype.hasOwnProperty,l=Object.prototype.propertyIsEnumerable,o=(a,t,l)=>t in a?e(a,t,{enumerable:!0,configurable:!0,writable:!0,value:l}):a[t]=l;import{z as d}from"./custom.79099f61.js";import{O as i,Q as n,R as r,r as c,b as u,d as s,a as p,w as y,F as m,o as v,c as k,t as f,n as E,p as g}from"./vendor.cbf1194d.js";const b={setup(){i();let e=n([]),c=n(!1);const u=async()=>{s.value={},c.value=!0,d.docSwaggerGlobalParamList().then((a=>{setTimeout((()=>c.value=!1),500),e.value=a.data||[]}))};let s=n({});const p=a=>{a.isEdit=!1,a.id?e.value.forEach((e=>e.isEdit=!1)):e.value=e.value.filter((e=>e!==a)),s.value={}};return r((()=>{u()})),{docList:e,docListLoading:c,docEdit:s,searchDocList:u,deleteDoc:async e=>{d.docSwaggerGlobalParamUpdate({id:e.id,yn:0}).then((e=>{u()}))},editDoc:e=>{s.value.isEdit&&p(s.value),e.isEdit=!0,s.value=((e,d)=>{for(var i in d||(d={}))t.call(d,i)&&o(e,i,d[i]);if(a)for(var i of a(d))l.call(d,i)&&o(e,i,d[i]);return e})({},e)},saveEditDoc:e=>{d.docSwaggerGlobalParamUpdate(s.value).then((a=>{e.isEdit=!1,u()}))},cancelEditDoc:p,addDocLine:()=>{s.value.isEdit&&p(s.value);let a={isEdit:!0};e.value.push(a),s.value=a},docListColumns:[{title:"参数名称",dataIndex:"paramKey",width:250},{title:"参数值",dataIndex:"paramValue"},{title:"参数位置",dataIndex:"paramType",width:120},{title:"操作",dataIndex:"operation",fixed:"right",width:170}]}}},h={style:{"margin-bottom":"10px","text-align":"right"}},x=g("刷新"),C=g("新建"),_={key:1},L={key:1},w=g("Form"),D=g("Header"),I=g("Cookie"),O=g("Form"),j=g("Header"),P=g("Cookie"),S=g("取消"),T=g("保存"),U=g("编辑"),K=g("删除");b.render=function(e,a,t,l,o,d){const i=c("a-button"),n=c("a-input"),r=c("a-textarea"),g=c("a-select-option"),b=c("a-select"),V=c("a-tag"),F=c("a-popconfirm"),G=c("a-table");return v(),u(m,null,[s("div",h,[p(i,{onClick:l.searchDocList,type:"primary"},{default:y((()=>[x])),_:1},8,["onClick"]),p(i,{onClick:l.addDocLine},{default:y((()=>[C])),_:1},8,["onClick"])]),p(G,{dataSource:l.docList,columns:l.docListColumns,size:"middle",loading:l.docListLoading,pagination:!1,scroll:{x:1e3,y:"calc(100vh - 340px)"}},{bodyCell:y((({column:e,text:t,record:o})=>["paramKey"===e.dataIndex?(v(),u(m,{key:0},[o.isEdit?(v(),k(n,{key:0,placeholder:"请输入参数名称",value:l.docEdit.paramKey,"onUpdate:value":a[0]||(a[0]=e=>l.docEdit.paramKey=e)},null,8,["value"])):(v(),u("span",_,f(t),1))],64)):E("",!0),"paramValue"===e.dataIndex?(v(),u(m,{key:1},[o.isEdit?(v(),k(r,{key:0,rows:1,placeholder:"请输入参数值",value:l.docEdit.paramValue,"onUpdate:value":a[1]||(a[1]=e=>l.docEdit.paramValue=e)},null,8,["value"])):(v(),u("span",L,f(t),1))],64)):E("",!0),"paramType"===e.dataIndex?(v(),u(m,{key:2},[o.isEdit?(v(),k(b,{key:0,placeholder:"参数位置",value:l.docEdit.paramType,"onUpdate:value":a[2]||(a[2]=e=>l.docEdit.paramType=e),style:{width:"110px"}},{default:y((()=>[p(g,{value:1},{default:y((()=>[w])),_:1}),p(g,{value:2},{default:y((()=>[D])),_:1}),p(g,{value:3},{default:y((()=>[I])),_:1})])),_:1},8,["value"])):(v(),u(m,{key:1},[1===t?(v(),k(V,{key:0,color:"green"},{default:y((()=>[O])),_:1})):2===t?(v(),k(V,{key:1,color:"pink"},{default:y((()=>[j])),_:1})):3===t?(v(),k(V,{key:2,color:"pink"},{default:y((()=>[P])),_:1})):E("",!0)],64))],64)):E("",!0),"operation"===e.dataIndex?(v(),u(m,{key:3},[o.isEdit?(v(),u(m,{key:0},[p(i,{type:"link",onClick:e=>l.cancelEditDoc(o)},{default:y((()=>[S])),_:2},1032,["onClick"]),p(i,{type:"link",onClick:e=>l.saveEditDoc(o)},{default:y((()=>[T])),_:2},1032,["onClick"])],64)):(v(),u(m,{key:1},[p(i,{type:"link",onClick:e=>l.editDoc(o)},{default:y((()=>[U])),_:2},1032,["onClick"]),p(F,{title:"确定要删除吗?",onConfirm:e=>l.deleteDoc(o)},{default:y((()=>[p(i,{type:"link",danger:""},{default:y((()=>[K])),_:1})])),_:2},1032,["onConfirm"])],64))],64)):E("",!0)])),_:1},8,["dataSource","columns","loading","scroll"])],64)};export{b as default};

View File

@@ -0,0 +1 @@
var B=Object.defineProperty;var w=Object.getOwnPropertySymbols;var F=Object.prototype.hasOwnProperty,G=Object.prototype.propertyIsEnumerable;var I=(i,a,o)=>a in i?B(i,a,{enumerable:!0,configurable:!0,writable:!0,value:o}):i[a]=o,V=(i,a)=>{for(var o in a||(a={}))F.call(a,o)&&I(i,o,a[o]);if(w)for(var o of w(a))G.call(a,o)&&I(i,o,a[o]);return i};import{z as x}from"./custom.93dbced2.js";import{O as K,Q as b,R as N,r as p,o as n,b as r,e as P,a as s,w as l,F as m,c as v,t as S,n as k,p as d}from"./vendor.1f907179.js";import{_ as j}from"./main.b5589b09.js";const z={setup(){K();let i=b([]),a=b(!1);const o=async()=>{e.value={},a.value=!0,x.docSwaggerGlobalParamList().then(t=>{setTimeout(()=>a.value=!1,500),i.value=t.data||[]})};let e=b({});const L=()=>{e.value.isEdit&&c(e.value);let t={isEdit:!0};i.value.push(t),e.value=t},D=t=>{e.value.isEdit&&c(e.value),t.isEdit=!0,e.value=V({},t)},c=t=>{t.isEdit=!1,t.id?i.value.forEach(f=>f.isEdit=!1):i.value=i.value.filter(f=>f!==t),e.value={}},E=t=>{x.docSwaggerGlobalParamUpdate(e.value).then(f=>{t.isEdit=!1,o()})},g=async t=>{x.docSwaggerGlobalParamUpdate({id:t.id,yn:0}).then(f=>{o()})};return N(()=>{o()}),{docList:i,docListLoading:a,docEdit:e,searchDocList:o,deleteDoc:g,editDoc:D,saveEditDoc:E,cancelEditDoc:c,addDocLine:L,docListColumns:[{title:"\u53C2\u6570\u540D\u79F0",dataIndex:"paramKey",width:250},{title:"\u53C2\u6570\u503C",dataIndex:"paramValue"},{title:"\u53C2\u6570\u4F4D\u7F6E",dataIndex:"paramType",width:120},{title:"\u64CD\u4F5C",dataIndex:"operation",fixed:"right",width:170}]}}},H={style:{"margin-bottom":"10px","text-align":"right"}},A=d("\u5237\u65B0"),M=d("\u65B0\u5EFA"),O={key:1},Q={key:1},R=d("Form"),q=d("Header"),J=d("Cookie"),W=d("Form"),X=d("Header"),Y=d("Cookie"),Z=d("\u53D6\u6D88"),$=d("\u4FDD\u5B58"),ee=d("\u7F16\u8F91"),ae=d("\u5220\u9664");function te(i,a,o,e,L,D){const c=p("a-button"),E=p("a-input"),g=p("a-textarea"),t=p("a-select-option"),f=p("a-select"),C=p("a-tag"),T=p("a-popconfirm"),U=p("a-table");return n(),r(m,null,[P("div",H,[s(c,{onClick:e.searchDocList,type:"primary"},{default:l(()=>[A]),_:1},8,["onClick"]),s(c,{onClick:e.addDocLine},{default:l(()=>[M]),_:1},8,["onClick"])]),s(U,{dataSource:e.docList,columns:e.docListColumns,size:"middle",loading:e.docListLoading,pagination:!1,scroll:{x:1e3,y:"calc(100vh - 340px)"}},{bodyCell:l(({column:h,text:y,record:u})=>[h.dataIndex==="paramKey"?(n(),r(m,{key:0},[u.isEdit?(n(),v(E,{key:0,placeholder:"\u8BF7\u8F93\u5165\u53C2\u6570\u540D\u79F0",value:e.docEdit.paramKey,"onUpdate:value":a[0]||(a[0]=_=>e.docEdit.paramKey=_)},null,8,["value"])):(n(),r("span",O,S(y),1))],64)):k("",!0),h.dataIndex==="paramValue"?(n(),r(m,{key:1},[u.isEdit?(n(),v(g,{key:0,rows:1,placeholder:"\u8BF7\u8F93\u5165\u53C2\u6570\u503C",value:e.docEdit.paramValue,"onUpdate:value":a[1]||(a[1]=_=>e.docEdit.paramValue=_)},null,8,["value"])):(n(),r("span",Q,S(y),1))],64)):k("",!0),h.dataIndex==="paramType"?(n(),r(m,{key:2},[u.isEdit?(n(),v(f,{key:0,placeholder:"\u53C2\u6570\u4F4D\u7F6E",value:e.docEdit.paramType,"onUpdate:value":a[2]||(a[2]=_=>e.docEdit.paramType=_),style:{width:"110px"}},{default:l(()=>[s(t,{value:1},{default:l(()=>[R]),_:1}),s(t,{value:2},{default:l(()=>[q]),_:1}),s(t,{value:3},{default:l(()=>[J]),_:1})]),_:1},8,["value"])):(n(),r(m,{key:1},[y===1?(n(),v(C,{key:0,color:"green"},{default:l(()=>[W]),_:1})):y===2?(n(),v(C,{key:1,color:"pink"},{default:l(()=>[X]),_:1})):y===3?(n(),v(C,{key:2,color:"pink"},{default:l(()=>[Y]),_:1})):k("",!0)],64))],64)):k("",!0),h.dataIndex==="operation"?(n(),r(m,{key:3},[u.isEdit?(n(),r(m,{key:0},[s(c,{type:"link",onClick:_=>e.cancelEditDoc(u)},{default:l(()=>[Z]),_:2},1032,["onClick"]),s(c,{type:"link",onClick:_=>e.saveEditDoc(u)},{default:l(()=>[$]),_:2},1032,["onClick"])],64)):(n(),r(m,{key:1},[s(c,{type:"link",onClick:_=>e.editDoc(u)},{default:l(()=>[ee]),_:2},1032,["onClick"]),s(T,{title:"\u786E\u5B9A\u8981\u5220\u9664\u5417\uFF1F",onConfirm:_=>e.deleteDoc(u)},{default:l(()=>[s(c,{type:"link",danger:""},{default:l(()=>[ae]),_:1})]),_:2},1032,["onConfirm"])],64))],64)):k("",!0)]),_:1},8,["dataSource","columns","loading","scroll"])],64)}var de=j(z,[["render",te]]);export{de as default};

View File

@@ -0,0 +1 @@
import{_ as e}from"./main.b5589b09.js";import{o as t,b as o}from"./vendor.1f907179.js";const n={name:"SettingView",components:{},data(){return{}},computed:{},mounted(){},methods:{}};function r(a,s,c,m,i,p){return t(),o("div",null," \u5C55\u793A\u914D\u7F6E\u9875\u9762 ")}var f=e(n,[["render",r]]);export{f as default};

View File

@@ -1 +0,0 @@
import{b as e,o as t}from"./vendor.cbf1194d.js";const n={name:"SettingView",components:{},data:()=>({}),computed:{},mounted(){},methods:{}};n.render=function(n,o,d,r,a,m){return t(),e("div",null," 展示配置页面 ")};export{n as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -5,9 +5,9 @@
<link rel="icon" href="logo.png" /> <link rel="icon" href="logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Swagger文档管理</title> <title>Swagger文档管理</title>
<script type="module" crossorigin src="assets/main.23f5737f.js"></script> <script type="module" crossorigin src="assets/main.b5589b09.js"></script>
<link rel="modulepreload" href="assets/vendor.cbf1194d.js"> <link rel="modulepreload" href="assets/vendor.1f907179.js">
<link rel="stylesheet" href="assets/style.6e7ba32f.css"> <link rel="stylesheet" href="assets/style.3bf21d5d.css">
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>

View File

@@ -9,6 +9,6 @@ export const zyplayerApi = {
swaggerDocUpdate: data => apiClient({url: '/doc-swagger/doc/update', method: 'post', data: data}), swaggerDocUpdate: data => apiClient({url: '/doc-swagger/doc/update', method: 'post', data: data}),
docSwaggerGlobalParamList: data => apiClient({url: '/doc-swagger/global-param/list', method: 'post', data: data}), docSwaggerGlobalParamList: data => apiClient({url: '/doc-swagger/global-param/list', method: 'post', data: data}),
docSwaggerGlobalParamUpdate: data => apiClient({url: '/doc-swagger/global-param/update', method: 'post', data: data}), docSwaggerGlobalParamUpdate: data => apiClient({url: '/doc-swagger/global-param/update', method: 'post', data: data}),
requestUrl: data => apiClient({url: '/doc-swagger/proxy/query', method: 'post', data: data}), requestUrl: data => apiClient({url: '/doc-swagger/proxy/request', method: 'post', data: data}),
}; };

View File

@@ -25,7 +25,7 @@
emits: [], emits: [],
setup(props, { attrs, slots, emit, expose}) { setup(props, { attrs, slots, emit, expose}) {
let paramList = props.paramList; let paramList = props.paramList;
let bodyParamObj = {}; let bodyParamObj = '';
let getChildren = paramObj => { let getChildren = paramObj => {
if (paramObj.children) { if (paramObj.children) {
let bodyParamObj = {}; let bodyParamObj = {};
@@ -43,8 +43,15 @@
bodyParamObj[item.name] = getChildren(item); bodyParamObj[item.name] = getChildren(item);
}); });
} }
let bodyRowParam = ref(JSON.stringify(bodyParamObj, null, 4)); let bodyRowParam = ref('');
if (bodyParamObj) {
bodyRowParam.value = JSON.stringify(bodyParamObj, null, 4);
}
const getParam = () => {
return bodyRowParam.value;
}
return { return {
getParam,
bodyRowParam, bodyRowParam,
}; };
}, },

View File

@@ -1,16 +1,15 @@
<template> <template>
<div> <div>
<a-input-search <a-input-search :addon-before="docInfoShow.method.toUpperCase()" v-model:value="docUrl" @search="sendRequest">
:addon-before="docInfoShow.method.toUpperCase()" <template #enterButton>
v-model:value="docUrl" <a-button type="primary" :loading="requestLoading">发送请求</a-button>
enter-button="发送请求" </template>
@search="sendRequest" </a-input-search>
/>
<a-tabs v-model:activeKey="activePage" closable @tab-click="" style="padding: 5px 10px 0;"> <a-tabs v-model:activeKey="activePage" closable @tab-click="" style="padding: 5px 10px 0;">
<a-tab-pane tab="URL参数" key="urlParam"> <a-tab-pane tab="URL参数" key="urlParam" forceRender>
<ParamTable ref="urlParamRef" v-model:selected="urlParamChecked" :paramList="urlParamList"></ParamTable> <ParamTable ref="urlParamRef" :paramList="urlParamList"></ParamTable>
</a-tab-pane> </a-tab-pane>
<a-tab-pane tab="请求参数" key="bodyParam" v-if="docInfoShow.method !== 'get'"> <a-tab-pane tab="请求参数" key="bodyParam" v-if="docInfoShow.method !== 'get'" forceRender>
<a-radio-group v-model:value="bodyParamType" style="margin-bottom: 5px;"> <a-radio-group v-model:value="bodyParamType" style="margin-bottom: 5px;">
<a-radio value="none">none</a-radio> <a-radio value="none">none</a-radio>
<a-radio value="form">form-data</a-radio> <a-radio value="form">form-data</a-radio>
@@ -28,13 +27,14 @@
<ParamBody ref="bodyParamRef" :paramList="bodyRowParamList"></ParamBody> <ParamBody ref="bodyParamRef" :paramList="bodyRowParamList"></ParamBody>
</div> </div>
</a-tab-pane> </a-tab-pane>
<a-tab-pane tab="Header参数" key="headerParam"> <a-tab-pane tab="Header参数" key="headerParam" forceRender>
<ParamTable ref="headerParamRef" :paramList="headerParamList"></ParamTable> <ParamTable ref="headerParamRef" :paramList="headerParamList"></ParamTable>
</a-tab-pane> </a-tab-pane>
<a-tab-pane tab="Cookie参数" key="cookieParam"> <a-tab-pane tab="Cookie参数" key="cookieParam" forceRender>
<ParamTable ref="cookieParamRef" :paramList="cookieParamList"></ParamTable> <ParamTable ref="cookieParamRef" :paramList="cookieParamList"></ParamTable>
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
<DocDebuggerResult :result="requestResult"></DocDebuggerResult>
</div> </div>
</template> </template>
@@ -44,6 +44,7 @@
import {useStore} from 'vuex'; import {useStore} from 'vuex';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import {markdownIt} from 'mavon-editor' import {markdownIt} from 'mavon-editor'
import DocDebuggerResult from './DocDebuggerResult.vue'
import ParamTable from '../../../components/params/ParamTable.vue' import ParamTable from '../../../components/params/ParamTable.vue'
import ParamBody from '../../../components/params/ParamBody.vue' import ParamBody from '../../../components/params/ParamBody.vue'
import {CloseOutlined} from '@ant-design/icons-vue'; import {CloseOutlined} from '@ant-design/icons-vue';
@@ -67,7 +68,7 @@
}, },
}, },
components: { components: {
CloseOutlined, ParamTable, ParamBody CloseOutlined, ParamTable, ParamBody, DocDebuggerResult,
}, },
setup(props) { setup(props) {
const store = useStore(); const store = useStore();
@@ -78,22 +79,18 @@
let activePage = ref('urlParam'); let activePage = ref('urlParam');
// URL参数处理 // URL参数处理
const urlParamRef = ref(); const urlParamRef = ref();
const urlParamChecked = ref([]);
let urlParamListProp = props.requestParamList.filter(item => item.in === 'query'); let urlParamListProp = props.requestParamList.filter(item => item.in === 'query');
let urlParamList = ref([]); let urlParamList = ref([]);
// Header参数处理 // Header参数处理
const headerParamRef = ref(); const headerParamRef = ref();
const headerParamChecked = ref([]);
let headerParamListProp = props.requestParamList.filter(item => item.in === 'header'); let headerParamListProp = props.requestParamList.filter(item => item.in === 'header');
let headerParamList = ref(JSON.parse(JSON.stringify(headerParamListProp))); let headerParamList = ref(JSON.parse(JSON.stringify(headerParamListProp)));
// cookie参数处理 // cookie参数处理
const cookieParamRef = ref(); const cookieParamRef = ref();
const cookieParamChecked = ref([]);
let cookieParamListProp = props.requestParamList.filter(item => item.in === 'cookie'); let cookieParamListProp = props.requestParamList.filter(item => item.in === 'cookie');
let cookieParamList = ref(JSON.parse(JSON.stringify(cookieParamListProp))); let cookieParamList = ref(JSON.parse(JSON.stringify(cookieParamListProp)));
// form参数处理 // form参数处理
const formParamRef= ref(); const formParamRef= ref();
const formParamChecked = ref([]);
let formParamListProp = props.requestParamList.filter(item => item.in === 'formData'); let formParamListProp = props.requestParamList.filter(item => item.in === 'formData');
let formParamList = ref([]); let formParamList = ref([]);
if (props.docInfoShow.method === 'post') { if (props.docInfoShow.method === 'post') {
@@ -105,7 +102,6 @@
} }
// form参数处理 // form参数处理
const formEncodeParamRef = ref(); const formEncodeParamRef = ref();
const formEncodeParamChecked = ref([]);
let formEncodeParamList = ref([]); let formEncodeParamList = ref([]);
// body 参数 // body 参数
let bodyParamRef = ref(); let bodyParamRef = ref();
@@ -136,45 +132,82 @@
activePage.value = 'headerParam'; activePage.value = 'headerParam';
} }
// 发送请求 // 发送请求
let requestResult = ref({});
let requestLoading = ref(false);
const sendRequest = () => { const sendRequest = () => {
const formData = new FormData(); const formData = new FormData();
let selectedRowKeys = urlParamRef.value.getSelectedRowKeys(); let urlParamSelected = urlParamRef.value.getSelectedRowKeys();
let urlParamStr = urlParamList.value.filter(item => selectedRowKeys.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 => {
return item.name + '=' + encodeURIComponent(item.value); return item.name + '=' + encodeURIComponent(item.value);
}).join('&'); }).join('&');
console.log('urlParamStr', urlParamStr); let headerParamSelected = headerParamRef.value.getSelectedRowKeys();
let headerParamArr = headerParamList.value.filter(item => headerParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
return {code: item.name, value: item.value};
});
let cookieParamSelected = cookieParamRef.value.getSelectedRowKeys();
let cookieParamArr = cookieParamList.value.filter(item => cookieParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
return {code: item.name, value: item.value};
});
let formParamArr = [];
if (formParamRef.value) {
let formParamSelected = formParamRef.value.getSelectedRowKeys();
formParamArr = formParamList.value.filter(item => formParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
// todo 判断处理文件格式
return {code: item.name, value: item.value};
});
}
let formEncodeParamArr = [];
if (formEncodeParamRef.value) {
let formEncodeParamSelected = formEncodeParamRef.value.getSelectedRowKeys();
formEncodeParamArr = formEncodeParamList.value.filter(item => formEncodeParamSelected.indexOf(item.key) >= 0 && item.name && item.value).map(item => {
// todo 判断处理文件格式
return {code: item.name, value: item.value};
});
}
let bodyParamStr = '';
if (bodyParamRef.value) {
bodyParamStr = bodyParamRef.value.getParam();
}
// fileList.value.forEach(file => { // fileList.value.forEach(file => {
// formData.append('files[]', file); // formData.append('files[]', file);
// }); // });
formData.append('url', docUrl.value + '?' + urlParamStr); let url = urlParamStr ? (docUrl.value + '?' + urlParamStr) : docUrl.value;
formData.append('url', url);
formData.append('method', props.docInfoShow.method);
formData.append('contentType', props.docInfoShow.consumes);
formData.append('headerParam', JSON.stringify(headerParamArr));
formData.append('cookieParam', JSON.stringify(cookieParamArr));
formData.append('formParam', JSON.stringify(formParamArr));
formData.append('formEncodeParam', JSON.stringify(formEncodeParamArr));
formData.append('bodyParam', bodyParamStr);
requestLoading.value = true;
zyplayerApi.requestUrl(formData).then(res => { zyplayerApi.requestUrl(formData).then(res => {
debugger requestResult.value = res;
requestLoading.value = false;
}).catch(e => {
requestLoading.value = false;
}); });
message.info('暂未开放此功能,敬请期待');
}; };
return { return {
docUrl, docUrl,
activePage, activePage,
requestLoading,
sendRequest, sendRequest,
requestResult,
// url参数 // url参数
urlParamRef, urlParamRef,
urlParamChecked,
urlParamList, urlParamList,
// header参数 // header参数
headerParamRef, headerParamRef,
headerParamChecked,
headerParamList, headerParamList,
// cookie参数 // cookie参数
cookieParamRef, cookieParamRef,
cookieParamChecked,
cookieParamList, cookieParamList,
// form参数 // form参数
formParamRef, formParamRef,
formParamChecked,
formParamList, formParamList,
// form-encode参数 // form-encode参数
formEncodeParamRef, formEncodeParamRef,
formEncodeParamChecked,
formEncodeParamList, formEncodeParamList,
// body参数 // body参数
bodyParamRef, bodyParamRef,

View File

@@ -0,0 +1,82 @@
<template>
<div>
<a-tabs v-model:activeKey="activePage" closable @tab-click="" style="padding: 5px 10px 0;">
<a-tab-pane tab="Body" key="body" forceRender>
<template v-if="result.data && result.data.data">{{result.data.data}}</template>
<template v-else-if="result.data">{{result.data}}</template>
<template v-else>{{result}}</template>
</a-tab-pane>
<a-tab-pane tab="Headers" key="headers" forceRender>
<a-table :dataSource="resultHeaders"
:columns="resultHeadersColumns" size="small"
:pagination="false"
:scroll="{ y: '300px' }">
</a-table>
</a-tab-pane>
<a-tab-pane tab="Cookies" key="cookies" forceRender>
<a-table :dataSource="resultCookies"
:columns="resultCookiesColumns" size="small"
:pagination="false"
:scroll="{ y: '300px' }">
</a-table>
</a-tab-pane>
</a-tabs>
</div>
</template>
<script>
import {toRefs, ref, reactive, onMounted, watch} from 'vue';
import {useRouter, useRoute} from "vue-router";
import {useStore} from 'vuex';
import {message} from 'ant-design-vue';
import {markdownIt} from 'mavon-editor'
import ParamTable from '../../../components/params/ParamTable.vue'
import ParamBody from '../../../components/params/ParamBody.vue'
import {CloseOutlined} from '@ant-design/icons-vue';
import 'mavon-editor/dist/markdown/github-markdown.min.css'
import 'mavon-editor/dist/css/index.css'
import {zyplayerApi} from "../../../api";
export default {
props: {
result: {
type: Object,
required: true
},
},
components: {
CloseOutlined, ParamTable, ParamBody
},
setup(props) {
const { result } = toRefs(props);
let activePage = ref('body');
let resultHeaders = ref([]);
let resultCookies = ref([]);
const initData = () => {
if (props.result.data) {
if (props.result.data.headers) {
resultHeaders.value = props.result.data.headers;
}
if (props.result.data.cookies) {
resultCookies.value = props.result.data.cookies;
}
}
};
initData();
watch(result, () => initData());
return {
activePage,
resultHeaders,
resultCookies,
resultHeadersColumns: [
{title: 'KEY', dataIndex: 'name'},
{title: 'VALUE', dataIndex: 'value'},
],
resultCookiesColumns: [
{title: 'KEY', dataIndex: 'name'},
{title: 'VALUE', dataIndex: 'value'},
],
};
},
};
</script>