From 09d077cb076bd9fc4de32921c0e812a323ce4d38 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9A=AE=E5=85=89=EF=BC=9A=E5=9F=8E=E4=B8=AD=E5=9F=8E?=
<806783409@qq.com>
Date: Wed, 26 Dec 2018 22:34:20 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=87=E4=BB=B6=E4=B8=8A?=
=?UTF-8?q?=E4=BC=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
zyplayer-doc-manage/pom.xml | 26 ++--
.../com/zyplayer/doc/manage/Application.java | 7 +-
zyplayer-doc-swagger/pom.xml | 5 +
.../controller/MgDocumentController.java | 9 +-
.../controller/MgHttpRequestController.java | 116 +++++++++---------
.../controller/param/HttpRequestParam.java | 49 +++++++-
.../main/resources/webjars/mg-ui/js/common.js | 32 ++++-
.../resources/webjars/mg-ui/js/mg-ui-debug.js | 69 ++++++++---
.../main/resources/webjars/mg-ui/js/mg-ui.js | 11 +-
9 files changed, 219 insertions(+), 105 deletions(-)
diff --git a/zyplayer-doc-manage/pom.xml b/zyplayer-doc-manage/pom.xml
index 0f53ce15..af5c9096 100644
--- a/zyplayer-doc-manage/pom.xml
+++ b/zyplayer-doc-manage/pom.xml
@@ -82,21 +82,31 @@
${springfox.swagger.version}
-
- com.zyplayer
- zyplayer-doc-swagger
- ${zyplayer.doc.swagger.version}
-
+
com.zyplayer
zyplayer-doc-core
${zyplayer.doc.core.version}
+
+
+ com.zyplayer
+ zyplayer-doc-db
+ ${zyplayer.doc.db.version}
+
+
+
+ com.zyplayer
+ zyplayer-doc-swagger
+ ${zyplayer.doc.swagger.version}
+
+
com.github.xiaoymin
swagger-bootstrap-ui
${swagger.bootstrap.ui.version}
+
io.springfox
springfox-swagger-ui
@@ -118,12 +128,6 @@
org.springframework.boot
spring-boot-starter-security
-
- com.zyplayer
- zyplayer-doc-db
- ${zyplayer.doc.db.version}
- compile
-
diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java
index 0a649bf1..a0aefc56 100644
--- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java
+++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java
@@ -34,16 +34,11 @@ public class Application extends SpringBootServletInitializer {
String hostAddress = InetAddress.getLocalHost().getHostAddress();
String serverPort = env.getProperty("server.port");
String urlCtx = hostAddress + ":" + serverPort + "/" + contextPath;
- // 三个UI的名字长度惊人的一致!肯定是知道我有强迫症!
logger.info("\n----------------------------------------------------------\n\t" +
"\t\t地址列表\n\t" +
- "zyplayer-doc-swagger:http://{}document.html\n\t" +
- "swagger-bootstrap-ui:http://{}doc.html\n\t" +
- "springfox-swagger-ui:http://{}swagger-ui.html\n\t" +
- "数据库文档管理地址:http://{}doc-db.html\n\t" +
"管理地址:http://{}statics/manage/home.html\n" +
"----------------------------------------------------------",
- urlCtx, urlCtx, urlCtx, urlCtx, urlCtx
+ urlCtx
);
}
}
diff --git a/zyplayer-doc-swagger/pom.xml b/zyplayer-doc-swagger/pom.xml
index eeb5add0..d4be2c25 100644
--- a/zyplayer-doc-swagger/pom.xml
+++ b/zyplayer-doc-swagger/pom.xml
@@ -74,6 +74,11 @@
zyplayer-doc-core
${zyplayer.doc.core.version}
+
+ commons-fileupload
+ commons-fileupload
+ 1.3.3
+
diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgDocumentController.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgDocumentController.java
index 9bd1f7e2..155ae51f 100644
--- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgDocumentController.java
+++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgDocumentController.java
@@ -52,14 +52,13 @@ public class MgDocumentController {
*/
@ResponseBody
@PostMapping(value = "/resourcesList")
- public ResponseJson> resourcesList() {
+ public ResponseJson> resourcesList() {
String swaggerResourcesStr = storageService.get(StorageKeys.SWAGGER_RESOURCES_LIST);
- Set resourcesSet = new HashSet<>();
+ List resourcesList = new LinkedList<>();
if (StringUtils.isNotBlank(swaggerResourcesStr)) {
- List resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class);
- resourcesSet.addAll(resourcesList);
+ resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class);
}
- return DocResponseJson.ok(resourcesSet);
+ return DocResponseJson.ok(resourcesList);
}
/**
diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgHttpRequestController.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgHttpRequestController.java
index 00a5e72e..061300e2 100644
--- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgHttpRequestController.java
+++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/MgHttpRequestController.java
@@ -1,60 +1,56 @@
-package com.zyplayer.doc.swagger.controller;
-
-import java.net.HttpCookie;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
-
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.zyplayer.doc.core.json.DocResponseJson;
-import com.zyplayer.doc.swagger.controller.param.HttpRequestParam;
-import com.zyplayer.doc.swagger.controller.vo.HttpCookieVo;
-import com.zyplayer.doc.swagger.controller.vo.HttpHeaderVo;
-import com.zyplayer.doc.swagger.controller.vo.HttpRequestVo;
-
-import cn.hutool.http.HttpRequest;
-import cn.hutool.http.HttpResponse;
-
-/**
- * 后台代理网络请求的控制器
- *
- * @author 暮光:城中城
- * @since 2018年8月21日
- */
-@RestController
-@RequestMapping("/swagger-mg-ui/http")
-public class MgHttpRequestController {
-
- @PostMapping(value = "/request")
- public DocResponseJson post(HttpRequestParam param) {
- HttpRequest request = param.createRequest();
- HttpResponse response = request.execute();
- HttpRequestVo httpRequestVo = new HttpRequestVo();
- httpRequestVo.setData(response.body());
- httpRequestVo.setStatus(response.getStatus());
- List cookies = response.getCookies();
- if (cookies != null && cookies.size() > 0) {
- List cookie = cookies.stream().map(val -> {
- return new HttpCookieVo(val.getName(), val.getValue());
- }).collect(Collectors.toList());
- httpRequestVo.setCookie(cookie);
- }
- Map> headers = response.headers();
- if (headers != null && headers.size() > 0) {
- List header = new ArrayList<>(headers.size());
- for (Entry> httpHeader : headers.entrySet()) {
- HttpHeaderVo vo = new HttpHeaderVo();
- vo.setName(httpHeader.getKey());
- vo.setValue(String.join(";", httpHeader.getValue()));
- header.add(vo);
- }
- httpRequestVo.setHeader(header);
- }
- return DocResponseJson.ok(httpRequestVo);
- }
-}
+package com.zyplayer.doc.swagger.controller;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.zyplayer.doc.core.json.DocResponseJson;
+import com.zyplayer.doc.swagger.controller.param.HttpRequestParam;
+import com.zyplayer.doc.swagger.controller.vo.HttpCookieVo;
+import com.zyplayer.doc.swagger.controller.vo.HttpHeaderVo;
+import com.zyplayer.doc.swagger.controller.vo.HttpRequestVo;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.net.HttpCookie;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+/**
+ * 后台代理网络请求的控制器
+ *
+ * @author 暮光:城中城
+ * @since 2018年8月21日
+ */
+@RestController
+@RequestMapping("/swagger-mg-ui/http")
+public class MgHttpRequestController {
+
+ @PostMapping(value = "/request")
+ public DocResponseJson post(HttpRequestParam param) {
+ HttpRequest request = param.createRequest();
+ HttpResponse response = request.execute();
+ HttpRequestVo httpRequestVo = new HttpRequestVo();
+ httpRequestVo.setData(response.body());
+ httpRequestVo.setStatus(response.getStatus());
+ List cookies = response.getCookies();
+ if (cookies != null && cookies.size() > 0) {
+ List cookie = cookies.stream().map(val -> new HttpCookieVo(val.getName(), val.getValue())).collect(Collectors.toList());
+ httpRequestVo.setCookie(cookie);
+ }
+ Map> headers = response.headers();
+ if (headers != null && headers.size() > 0) {
+ List header = new ArrayList<>(headers.size());
+ for (Entry> httpHeader : headers.entrySet()) {
+ HttpHeaderVo vo = new HttpHeaderVo();
+ vo.setName(httpHeader.getKey());
+ vo.setValue(String.join(";", httpHeader.getValue()));
+ header.add(vo);
+ }
+ httpRequestVo.setHeader(header);
+ }
+ return DocResponseJson.ok(httpRequestVo);
+ }
+}
diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/param/HttpRequestParam.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/param/HttpRequestParam.java
index 5a6c7f6a..692c884a 100644
--- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/param/HttpRequestParam.java
+++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/param/HttpRequestParam.java
@@ -1,8 +1,15 @@
package com.zyplayer.doc.swagger.controller.param;
+import java.io.File;
+import java.io.IOException;
import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.resource.BytesResource;
+import cn.hutool.core.io.resource.MultiFileResource;
import org.apache.commons.lang.StringUtils;
import com.alibaba.fastjson.JSON;
@@ -10,6 +17,7 @@ import com.alibaba.fastjson.TypeReference;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.Method;
+import org.springframework.web.multipart.MultipartFile;
/**
* 请求参数对象
@@ -23,6 +31,8 @@ public class HttpRequestParam {
private String header;
private String form;
private String body;
+ private String[] fileNames;
+ private MultipartFile[] files;
public String getUrl() {
return url;
@@ -84,6 +94,28 @@ public class HttpRequestParam {
if (formMap != null) {
request.form(formMap);
}
+ // 拼文件
+ if (this.getFiles() != null && this.getFiles().length > 0) {
+ Map bytesResourceMap = new HashMap<>();
+ for (int i = 0; i < this.getFiles().length; i++) {
+ try {
+ String fileName = this.getFileNames()[i].replace("[", "").replace("]", "");
+ MultipartFile file = this.getFiles()[i];
+ BytesResource bytesResource = new BytesResource(file.getBytes(), file.getOriginalFilename());
+ MultiFileResource multiFileResource = bytesResourceMap.get(fileName);
+ if (multiFileResource == null) {
+ multiFileResource = new MultiFileResource();
+ }
+ multiFileResource.add(bytesResource);
+ bytesResourceMap.put(fileName, multiFileResource);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ for (Map.Entry entry : bytesResourceMap.entrySet()) {
+ request.form(entry.getKey(), entry.getValue());
+ }
+ }
if (StringUtils.isNotBlank(body) && request.getMethod() != Method.GET) {
request.body(body);
}
@@ -192,5 +224,20 @@ public class HttpRequestParam {
public void setMethod(String method) {
this.method = method;
}
-
+
+ public MultipartFile[] getFiles() {
+ return files;
+ }
+
+ public void setFiles(MultipartFile[] files) {
+ this.files = files;
+ }
+
+ public String[] getFileNames() {
+ return fileNames;
+ }
+
+ public void setFileNames(String[] fileNames) {
+ this.fileNames = fileNames;
+ }
}
diff --git a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/common.js b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/common.js
index 45f0cebd..84d719eb 100644
--- a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/common.js
+++ b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/common.js
@@ -197,7 +197,7 @@ function ajaxTemp(url, dataSentType, dataReceiveType, paramsStr, successFunction
}
},
beforeSend : function() {
-
+
},
complete : function(msg) {
if(typeof completeFunction == "function") {
@@ -212,6 +212,36 @@ function ajaxTemp(url, dataSentType, dataReceiveType, paramsStr, successFunction
});
}
+function postWithFile(url, paramsStr, successFunction, errorFunction, completeFunction, id) {
+ $.ajax({
+ url: url, // 后台处理程序
+ sync: false,
+ type: "POST", // 数据发送方式
+ dataType: "JSON", // 接受数据格式
+ data: eval(paramsStr),
+ processData: false,
+ contentType: false,
+ success: function (msg) {
+ if (typeof successFunction == "function") {
+ successFunction(msg, id);
+ }
+ },
+ beforeSend: function () {
+
+ },
+ complete: function (msg) {
+ if (typeof completeFunction == "function") {
+ completeFunction(msg, id);
+ }
+ },
+ error: function (msg) {
+ if (typeof errorFunction == "function") {
+ errorFunction(msg, id);
+ }
+ }
+ });
+}
+
/**
* 获取cookie
* @param name
diff --git a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-debug.js b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-debug.js
index 3c4fa942..58e0a523 100644
--- a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-debug.js
+++ b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-debug.js
@@ -45,17 +45,19 @@ $(document).ready(function(){
var paramFormSend = {};
var paramBodySend = $("[name=paramBody]").val();
var formToUrl = $("[name=formToUrl]").prop('checked') ? 1 : 0;
- var paramSendToServer = {};
+ // 组装空的表单对象
+ var formDataToServer = new FormData();
+
requestHeaderForm = serializeArrayToObj(requestHeaderForm);
requestParamForm = serializeArrayToObj(requestParamForm);
storeRequestParam.formToUrl = formToUrl;
- paramSendToServer.formToUrl = formToUrl;
+ formDataToServer.append("formToUrl", formToUrl);
if (isNotEmpty(paramBodySend)) {
try {
paramBodySend = JSON.stringify(JSON.parse(paramBodySend));
} catch (e) {}
storeRequestParam.body = paramBodySend;
- paramSendToServer.body = paramBodySend;
+ formDataToServer.append("body", paramBodySend);
// 替换path参数
Object.keys(requestParamForm).forEach(function (key) {
postUrl = postUrl.replace("{" + key + "}", requestParamForm[key]);
@@ -74,13 +76,14 @@ $(document).ready(function(){
postUrl = postUrl.replace("{" + key + "}", value);
}
});
+
storeRequestParam.form = paramFormSend;
// 表单参数是否拼在url上
if(formToUrl == 1) {
postUrl += "?" + reqParamStr;
paramFormSend = "";
} else {
- paramSendToServer.form = JSON.stringify(paramFormSend);
+ formDataToServer.append("form", JSON.stringify(paramFormSend));
}
// 显示加载中图标
$(".send-request .icon").removeClass("hide");
@@ -92,13 +95,23 @@ $(document).ready(function(){
}
});
storeRequestParam.header = paramHeaderSend;
- paramSendToServer.header = JSON.stringify(paramHeaderSend);
- paramSendToServer.url = postUrl;
- paramSendToServer.method = options;
//console.log(paramBodySend);
var beforeSendTime = new Date().getTime();
+ // 拼装文件
+ var fileInput = $('#requestParamForm').find(".file-input");
+ for (var i = 0; i < fileInput.length; i++) {
+ var fileName = $(fileInput[i]).parents("tr").find("[name=paramName]").val();
+ for (var j = 0; j < fileInput[i].files.length; j++) {
+ formDataToServer.append('files', fileInput[i].files[j]);
+ formDataToServer.append('fileNames', fileName);
+ }
+ }
+ formDataToServer.append("header", JSON.stringify(paramHeaderSend));
+ formDataToServer.append("url", postUrl);
+ formDataToServer.append("method", options);
+ // debugger;
// 模拟请求开始
- ajaxTemp("swagger-mg-ui/http/request", "post", "json", paramSendToServer, function(result){
+ postWithFile("swagger-mg-ui/http/request", formDataToServer, function(result){
var afterSendTime = new Date().getTime();
//console.log(result);
var requestObj = result.data;
@@ -361,6 +374,7 @@ function createOnlineDebugRequestParamFun(pRequestObj, requestParamObj, url) {
|| (tempParam.paramIn == "path")
|| (tempParam.paramIn == "body")
|| (tempParam.paramIn == "form")
+ || (tempParam.paramIn == "formData")
|| isNotEmpty(tempParam.paramIn);
if (paramInForm && !onlyUseLastForm) {
//console.log(tempParam);
@@ -374,10 +388,21 @@ function createOnlineDebugRequestParamFun(pRequestObj, requestParamObj, url) {
formVal = getAutoFillValue(tempParam.paramType, key);
}
if(formValueCount > 0) {
- $("#tabParamTypeForm table tbody").append(getParamTableTr(key, formVal, "", tempParam.paramDesc));
+ $("#tabParamTypeForm table tbody").append(getParamTableTr(key, formVal, "", tempParam.paramDesc, tempParam.paramType));
} else {
+ // 文件的input特殊处理
+ if(tempParam.paramType == 'file'){
+ $("#tabParamTypeForm table tbody .base input[name=paramValue]")
+ .attr("type", "file").attr("multiple", "multiple")
+ .addClass("file-input")
+ .val(formVal);
+ } else {
+ $("#tabParamTypeForm table tbody .base input[name=paramValue]")
+ .attr("type", "text")
+ .removeClass("file-input")
+ .val(formVal);
+ }
$("#tabParamTypeForm table tbody .base input[name=paramName]").val(key);
- $("#tabParamTypeForm table tbody .base input[name=paramValue]").val(formVal);
$("#tabParamTypeForm table tbody .base input[name=paramValue]").attr("placeholder", getNotEmptyStr(tempParam.paramDesc));
}
$("#tabParamBody .nav li").eq(0).find("a").click();
@@ -462,8 +487,8 @@ function serializeArrayToObj(formArr) {
for (var i = 0; i < formArr.length; i++) {
if (formArr[i].name == "paramName" && i < formArr.length) {
var key = formArr[i].value;
- var value = formArr[i+1].value;
- if(isNotEmpty(key)) {
+ var value = formArr[i + 1].value;
+ if (isNotEmpty(key) && formArr[i + 1].name != "paramName") {
paramObj[key] = value;
}
}
@@ -503,7 +528,7 @@ function bulkEditToTable(tableId, bulkEdit) {
* @param valuePl
* @returns
*/
-function getParamTableTr(name, value, namePl, valuePl) {
+function getParamTableTr(name, value, namePl, valuePl, paramType) {
name = getNotEmptyStr(name);
namePl = getNotEmptyStr(namePl);
value = getNotEmptyStr(value);
@@ -514,12 +539,18 @@ function getParamTableTr(name, value, namePl, valuePl) {
namePl = (typeof namePl === 'string') ? namePl.replace(regExp, """) : namePl;
value = (typeof value === 'string') ? value.replace(regExp, """) : value;
valuePl = (typeof valuePl === 'string') ? valuePl.replace(regExp, """) : valuePl;
- var resultStr =
- ''
- +' | '
- +' | '
- +' | '
- +'
';
+
+ var resultStr =
+ ''
+ +' | ';
+ // 文件的input特殊处理
+ if(paramType == 'file') {
+ resultStr += ' | ';
+ } else {
+ resultStr += ' | '
+ }
+ resultStr += ' | '
+ +'
';
return resultStr;
}
diff --git a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui.js b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui.js
index ffbe06ba..2cd48b8b 100644
--- a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui.js
+++ b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui.js
@@ -375,8 +375,15 @@ $("#apiPathTree").on("click", ".show-doc", function(){
var paramIn = getNotEmptyStr(tempParameters.in);
var example = getNotEmptyStr(tempParameters.example, tempParameters.default);
if(isNotEmpty(tempParameters.items)) {
- htmlStr = paramName + "[0]";
- htmlStrExample = paramName + "[0]";
+ if(tempParameters.items.$ref == '#/definitions/MultipartFile') {
+ htmlStr = paramName;
+ htmlStrExample = paramName;
+ paramType = 'file';
+ addRequestParamObj(requestParamObj, paramName, paramType, paramIn, required, paramDesc, example);
+ } else {
+ htmlStr = paramName + "[0]";
+ htmlStrExample = paramName + "[0]";
+ }
} else if(isNotEmpty(tempParameters.schema)) {
if("array" == tempParameters.schema.type) {
var responsesObj = definitionsDataMap.get(tempParameters.schema.items.$ref);