From 1874d3ed264ed2c0512e66035e8b83ec6ca86127 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: Thu, 20 Dec 2018 23:28:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=A2=9E=E5=8A=A0=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E9=87=8D=E5=86=99=E5=9F=9F=E5=90=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/webapp/statics/lib/mg/css/mg-ui.css | 4 +- .../controller/MgDocumentController.java | 33 +- .../controller/vo/SwaggerResourcesInfoVo.java | 9 + .../resources/webjars/mg-ui/js/mg-ui-tag.js | 258 ++++++++-------- .../resources/webjars/mg-ui/js/mg-ui-tree.js | 284 +++++++++--------- .../main/resources/webjars/mg-ui/js/mg-ui.js | 23 +- .../webjars/zpages/docShowConfig.html | 35 ++- .../webjars/zpages/docUrlConfig.html | 36 ++- 8 files changed, 380 insertions(+), 302 deletions(-) diff --git a/zyplayer-doc-manage/src/main/webapp/statics/lib/mg/css/mg-ui.css b/zyplayer-doc-manage/src/main/webapp/statics/lib/mg/css/mg-ui.css index 97818d55..69a4916d 100644 --- a/zyplayer-doc-manage/src/main/webapp/statics/lib/mg/css/mg-ui.css +++ b/zyplayer-doc-manage/src/main/webapp/statics/lib/mg/css/mg-ui.css @@ -2,7 +2,7 @@ body{width: 100%;height: 100%;margin: 0;padding: 0;} a:focus{outline:none;} ul{list-style: none;list-style-type: none;} .tree li a{white-space: nowrap;} -.tree-menu li > ul{background-color: #555980;} +.tree-menu li > ul{background-color: #353953;} .tree-menu li li li li a{padding-left: 68px;} .tree-menu li li li li li a{padding-left: 88px;} .tree-menu li li li li li li a{padding-left: 108px;} @@ -47,7 +47,7 @@ label{font-weight: normal;} font-size: 24px;float: right;margin: 18px 18px 0 0;color: #fff;cursor: pointer; } .left-container{ - width: 100%;position: absolute;background: #555980;color: #fff; + width: 100%;position: absolute;background: #353953;color: #fff; top: 60px; bottom: 0; left: 0; overflow-y: auto; padding: 10px; } .left-container .projects{border: 0px; border-radius: 0px;} 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 40f1313f..9bd1f7e2 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 @@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; /** * 文档控制器 @@ -76,16 +77,24 @@ public class MgDocumentController { // 转成set,防止重复 List resourcesSet = new LinkedList<>(); Set swaggerDocsDeleteSet = new HashSet<>(); + + List resourcesList = new LinkedList<>(); + String swaggerResourcesStr = storageService.get(StorageKeys.SWAGGER_RESOURCES_LIST); + String swaggerDocsDeleteStr = storageService.get(StorageKeys.SWAGGER_DOCS_DELETE_LIST); + if (StringUtils.isNotBlank(swaggerResourcesStr)) { + resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class); + } if (StringUtils.isNotBlank(choiceDocList)) { needRestorage = false;// 选择的则不再存入 + Map infoVoMap = resourcesList.stream().collect(Collectors.toMap(SwaggerResourcesInfoVo::getUrl, val -> val)); for (String url : choiceDocList.split(",")) { - resourcesSet.add(new SwaggerResourcesInfoVo(url)); + SwaggerResourcesInfoVo resourcesInfoVo = infoVoMap.get(url); + if (resourcesInfoVo != null) { + resourcesSet.add(resourcesInfoVo); + } } } else { - String swaggerResourcesStr = storageService.get(StorageKeys.SWAGGER_RESOURCES_LIST); - String swaggerDocsDeleteStr = storageService.get(StorageKeys.SWAGGER_DOCS_DELETE_LIST); - if (StringUtils.isNotBlank(swaggerResourcesStr)) { - List resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class); + if (resourcesList.size() > 0) { resourcesSet.addAll(resourcesList); } else { // 默认加上自身的文档 @@ -172,9 +181,11 @@ public class MgDocumentController { swaggerResourceList.add(jsonObject); // 本来想转对象之后赋值,但是在此转成JSON字符串之后格式就不是之前的了,所有不能转。。。 // 直接字符串拼接,坑真多~ + String rewriteDomainUrl = Optional.ofNullable(resourcesInfoVo.getRewriteDomainUrl()).orElse(""); resourceStr = resourceStr.substring(1); resourceStr = "{\"fullUrl\":\"" + location + "\"," + "\"domainUrl\":\"" + resourcesUrl + "\"," + + "\"rewriteDomainUrl\":\"" + rewriteDomainUrl + "\"," + resourceStr; swaggerResourceStrList.add(resourceStr); } catch (Exception e) { @@ -200,7 +211,7 @@ public class MgDocumentController { * @return 添加结果 */ @PostMapping(value = "/addSwaggerResources") - public ResponseJson addSwaggerResources(String resourcesUrl) { + public ResponseJson addSwaggerResources(String resourcesUrl, String rewriteDomainUrl, String oldUrl) { String swaggerResourcesStr = storageService.get(StorageKeys.SWAGGER_RESOURCES_LIST); String swaggerDocsDeleteStr = storageService.get(StorageKeys.SWAGGER_DOCS_DELETE_LIST); Set swaggerDocsDeleteSet = new HashSet<>(); @@ -209,9 +220,13 @@ public class MgDocumentController { swaggerDocsDeleteSet.addAll(swaggerDocsDeleteList); } // 转成set,防止重复 - List resourcesList = null; + List resourcesList = new LinkedList<>(); if (StringUtils.isNotBlank(swaggerResourcesStr)) { resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class); + // 如果是编辑,把之前的删除掉,再在后面添加 + if (StringUtils.isNotBlank(oldUrl)) { + resourcesList = resourcesList.stream().filter(val -> !Objects.equals(val.getUrl(), oldUrl)).collect(Collectors.toList()); + } } try { String resourcesStr = HttpRequest.get(resourcesUrl).timeout(3000).execute().body(); @@ -236,7 +251,9 @@ public class MgDocumentController { location = resourcesDomain + location; swaggerDocsDeleteSet.remove(location); } - resourcesList.add(new SwaggerResourcesInfoVo(resourcesUrl, resourceList)); + SwaggerResourcesInfoVo resourcesInfoVo = new SwaggerResourcesInfoVo(resourcesUrl, resourceList); + resourcesInfoVo.setRewriteDomainUrl(rewriteDomainUrl); + resourcesList.add(resourcesInfoVo); AtomicInteger idIndex = new AtomicInteger(1); resourcesList.forEach(val -> val.setId(idIndex.getAndIncrement())); } catch (Exception e) { diff --git a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/vo/SwaggerResourcesInfoVo.java b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/vo/SwaggerResourcesInfoVo.java index e71a1814..7c3582a6 100644 --- a/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/vo/SwaggerResourcesInfoVo.java +++ b/zyplayer-doc-swagger/src/main/java/com/zyplayer/doc/swagger/controller/vo/SwaggerResourcesInfoVo.java @@ -12,6 +12,7 @@ public class SwaggerResourcesInfoVo implements Serializable { private Integer id; private String url; private String storageKey; + private String rewriteDomainUrl; private List resourceList; private Date creationTime; private Date lastSync; @@ -80,4 +81,12 @@ public class SwaggerResourcesInfoVo implements Serializable { public void setId(Integer id) { this.id = id; } + + public String getRewriteDomainUrl() { + return rewriteDomainUrl; + } + + public void setRewriteDomainUrl(String rewriteDomainUrl) { + this.rewriteDomainUrl = rewriteDomainUrl; + } } diff --git a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-tag.js b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-tag.js index 85bfebcf..e612f003 100644 --- a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-tag.js +++ b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-tag.js @@ -1,128 +1,130 @@ -/** - * 以每个Tag方式生成并展示: - * 核心信息控制器 - * /api/data/getDataList - * /api/data/getDataDetail - * 跟进控制器 - * /api/track/getTrackList - * /api/track/getTrackDetail - * - * 先把树形的写完了再写这个,, - * - * @author 暮光:城中城 - * @since 2018年5月26日 -*/ - -function createTreeViewByTag(json, keywords) { - var pathIndex = {}; - var paths = json.paths; - var domain = json.domainUrl;// 服务器代理会返回此属性 - if(isEmpty(domain)) { - domain = "http://" + json.host + json.basePath; - } - if(domain.endWith("/")) { - domain = domain.substring(0, domain.length - 1); - } - if (isEmptyObject(paths)) { - return; - } - //console.log(paths); - Object.keys(paths).forEach(function(key){ - //console.log(key, paths[key]); - if(!findInPathsValue(key, paths[key], keywords)) { - return; - } - setRequestMethodForTag(domain, paths[key], pathIndex, key, "get"); - setRequestMethodForTag(domain, paths[key], pathIndex, key, "head"); - setRequestMethodForTag(domain, paths[key], pathIndex, key, "post"); - setRequestMethodForTag(domain, paths[key], pathIndex, key, "put"); - setRequestMethodForTag(domain, paths[key], pathIndex, key, "patch"); - setRequestMethodForTag(domain, paths[key], pathIndex, key, "delete"); - setRequestMethodForTag(domain, paths[key], pathIndex, key, "options"); - setRequestMethodForTag(domain, paths[key], pathIndex, key, "trace"); - }); - //console.log(pathIndex); - var htmlStr = '
  • '; - htmlStr += ''+json.info.title+''; - htmlStr += '
      '; - htmlStr += getTreeHtmlForTag(pathIndex, projectTreeIdIndex); - htmlStr += '
    '; - htmlStr += '
  • '; - $('#apiPathTree .projects').append(htmlStr); - projectTreeIdIndex++; -} - -/** - * 设置对象的各种请求方式,存在则复制 - * @param source 资源,原始json的paths的指定对象 - * @param pathObj 当前的待赋值对象 - * @param url url绝对路径 - * @param method 请求方式,post、get... - * @returns - */ -function setRequestMethodForTag(domain, source, pathObj, url, method) { - if (isEmpty(source[method])) { - return; - } - source[method].tags.forEach(function(val, index) { - var tempObj = pathObj[val]; - if(isEmpty(tempObj)) { - tempObj = pathObj[val] = {}; - } - var tempUrlObj = tempObj[url]; - if(isEmpty(tempUrlObj)) { - tempUrlObj = tempObj[url] = {}; - } - var tempPath = projectTreeIdIndex + url + "." + method; - tempUrlObj[method] = source[method]; - tempUrlObj[method].path = tempPath; - tempUrlObj[method].url = url; - tempUrlObj[method].method = method; - tempUrlObj[method].domain = domain; - treePathDataMap.set(tempPath, source[method]); - }); -} - -/** - * 将对象列表递归的方式转换成文档格式html字符串 - * @param pathData 处理后的对象列表 - * @returns 生成的html字符串 - */ -function getTreeHtmlForTag(pathData, treeIdStr) { - var tempStr = ""; - var indexNow = 1; - // get, head, post, put, patch, delete, options, trace - var actionArrays = ["get", "head", "post", "put", "patch", "delete", "options", "trace"]; - Object.keys(pathData).forEach(function(key){ - var tempNode = pathData[key]; - var tempTreeId = treeIdStr + "_" + indexNow; - // 只有一个子元素,而且有method元素,说明是只有一个节点 - var nodeSub = getObjectFirstAttributeIfOnly(tempNode); - if(nodeSub != null && isNotEmpty(nodeSub.method)) { - var summary = isEmpty(nodeSub.summary) ? "" : "(" + nodeSub.summary + ")"; - if(summary.length > 10){ - summary = summary.substring(0, 10)+"...)";// 防止被撑得太长,只显示10个字 - } - nodeSub.treeId = tempTreeId; - tempStr += '
  • '+key+''+summary+'
  • '; - } else if(haveString(actionArrays, key)) { - //console.log(tempTreeId); - tempNode.treeId = tempTreeId; - var summary = isEmpty(tempNode.summary) ? "" : "("+tempNode.summary+")"; - if(summary.length > 10){ - summary = summary.substring(0, 10)+"...)";// 防止被撑得太长,只显示10个字 - } - tempStr += '
  • '+key+''+summary+'
  • '; - } else { - tempStr += '
  • '; - tempStr += ''+key+''; - tempStr += '
      '; - tempStr += getTreeHtmlForTag(tempNode, tempTreeId); - tempStr += '
    '; - tempStr += '
  • '; - } - indexNow++; - }); - return tempStr; -} - +/** + * 以每个Tag方式生成并展示: + * 核心信息控制器 + * /api/data/getDataList + * /api/data/getDataDetail + * 跟进控制器 + * /api/track/getTrackList + * /api/track/getTrackDetail + * + * 先把树形的写完了再写这个,, + * + * @author 暮光:城中城 + * @since 2018年5月26日 +*/ + +function createTreeViewByTag(json, keywords) { + var pathIndex = {}; + var paths = json.paths; + var domain = json.domainUrl;// 服务器代理会返回此属性 + var rewriteDomainUrl = json.rewriteDomainUrl;// 服务器代理会返回此属性 + if(isEmpty(domain)) { + domain = "http://" + json.host + json.basePath; + } + if(domain.endWith("/")) { + domain = domain.substring(0, domain.length - 1); + } + if (isEmptyObject(paths)) { + return; + } + //console.log(paths); + Object.keys(paths).forEach(function(key){ + //console.log(key, paths[key]); + if(!findInPathsValue(key, paths[key], keywords)) { + return; + } + setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "get"); + setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "head"); + setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "post"); + setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "put"); + setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "patch"); + setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "delete"); + setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "options"); + setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "trace"); + }); + //console.log(pathIndex); + var htmlStr = '
  • '; + htmlStr += ''+json.info.title+''; + htmlStr += '
      '; + htmlStr += getTreeHtmlForTag(pathIndex, projectTreeIdIndex); + htmlStr += '
    '; + htmlStr += '
  • '; + $('#apiPathTree .projects').append(htmlStr); + projectTreeIdIndex++; +} + +/** + * 设置对象的各种请求方式,存在则复制 + * @param source 资源,原始json的paths的指定对象 + * @param pathObj 当前的待赋值对象 + * @param url url绝对路径 + * @param method 请求方式,post、get... + * @returns + */ +function setRequestMethodForTag(rewriteDomainUrl, domain, source, pathObj, url, method) { + if (isEmpty(source[method])) { + return; + } + source[method].tags.forEach(function(val, index) { + var tempObj = pathObj[val]; + if(isEmpty(tempObj)) { + tempObj = pathObj[val] = {}; + } + var tempUrlObj = tempObj[url]; + if(isEmpty(tempUrlObj)) { + tempUrlObj = tempObj[url] = {}; + } + var tempPath = projectTreeIdIndex + url + "." + method; + tempUrlObj[method] = source[method]; + tempUrlObj[method].path = tempPath; + tempUrlObj[method].url = url; + tempUrlObj[method].method = method; + tempUrlObj[method].domain = domain; + tempUrlObj[method].rewriteDomainUrl = rewriteDomainUrl; + treePathDataMap.set(tempPath, source[method]); + }); +} + +/** + * 将对象列表递归的方式转换成文档格式html字符串 + * @param pathData 处理后的对象列表 + * @returns 生成的html字符串 + */ +function getTreeHtmlForTag(pathData, treeIdStr) { + var tempStr = ""; + var indexNow = 1; + // get, head, post, put, patch, delete, options, trace + var actionArrays = ["get", "head", "post", "put", "patch", "delete", "options", "trace"]; + Object.keys(pathData).forEach(function(key){ + var tempNode = pathData[key]; + var tempTreeId = treeIdStr + "_" + indexNow; + // 只有一个子元素,而且有method元素,说明是只有一个节点 + var nodeSub = getObjectFirstAttributeIfOnly(tempNode); + if(nodeSub != null && isNotEmpty(nodeSub.method)) { + var summary = isEmpty(nodeSub.summary) ? "" : "(" + nodeSub.summary + ")"; + if(summary.length > 10){ + summary = summary.substring(0, 10)+"...)";// 防止被撑得太长,只显示10个字 + } + nodeSub.treeId = tempTreeId; + tempStr += '
  • '+key+''+summary+'
  • '; + } else if(haveString(actionArrays, key)) { + //console.log(tempTreeId); + tempNode.treeId = tempTreeId; + var summary = isEmpty(tempNode.summary) ? "" : "("+tempNode.summary+")"; + if(summary.length > 10){ + summary = summary.substring(0, 10)+"...)";// 防止被撑得太长,只显示10个字 + } + tempStr += '
  • '+key+''+summary+'
  • '; + } else { + tempStr += '
  • '; + tempStr += ''+key+''; + tempStr += '
      '; + tempStr += getTreeHtmlForTag(tempNode, tempTreeId); + tempStr += '
    '; + tempStr += '
  • '; + } + indexNow++; + }); + return tempStr; +} + diff --git a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-tree.js b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-tree.js index ae09db2c..c340977d 100644 --- a/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-tree.js +++ b/zyplayer-doc-swagger/src/main/resources/webjars/mg-ui/js/mg-ui-tree.js @@ -1,141 +1,143 @@ -/** - * 以树形方式生成并展示: - * /api - * /data - * /getDateList - * post - * get - * @author 暮光:城中城 - * @since 2018年5月26日 -*/ - -/** - * 把原始的json字符串转换成对象列表的方式,方便后续使用 - * @param json swagger的原始对象 - * @returns - */ -function createTreeViewByTree(json, keywords) { - var pathIndex = {}; - var paths = json.paths; - var domain = json.domainUrl;// 服务器代理会返回此属性 - if(isEmpty(domain)) { - domain = "http://" + json.host + json.basePath; - } - if(domain.endWith("/")) { - domain = domain.substring(0, domain.length - 1); - } - if (isEmptyObject(paths)) { - return; - } - //console.log(paths); - Object.keys(paths).forEach(function(key){ - //console.log(key, paths[key]); - if(!findInPathsValue(key, paths[key], keywords)) { - return; - } - var keyArr = key.split("/"); - var nowPathObj = null; - keyArr.forEach(function(val, index) { - //console.log(val, index); - if(isEmpty(val) && index == 0) { - return; - } - var nowPath = "/" + val; - if(nowPathObj == null) { - nowPathObj = {}; - nowPathObj[nowPath] = pathIndex[nowPath]; - if(nowPathObj[nowPath] == null) { - nowPathObj[nowPath] = {}; - pathIndex[nowPath] = nowPathObj[nowPath]; - } - } - var tempPathObj = nowPathObj[nowPath]; - if(isEmpty(tempPathObj)) { - tempPathObj = nowPathObj[nowPath] = {}; - } - nowPathObj = tempPathObj; - if(index == keyArr.length - 1) { - //get, head, post, put, patch, delete, options, trace - setRequestMethodForTree(domain, paths[key], tempPathObj, key, "get"); - setRequestMethodForTree(domain, paths[key], tempPathObj, key, "head"); - setRequestMethodForTree(domain, paths[key], tempPathObj, key, "post"); - setRequestMethodForTree(domain, paths[key], tempPathObj, key, "put"); - setRequestMethodForTree(domain, paths[key], tempPathObj, key, "patch"); - setRequestMethodForTree(domain, paths[key], tempPathObj, key, "delete"); - setRequestMethodForTree(domain, paths[key], tempPathObj, key, "options"); - setRequestMethodForTree(domain, paths[key], tempPathObj, key, "trace"); - } - }); - }); - var htmlStr = '
  • '; - htmlStr += ''+json.info.title+''; - htmlStr += '
      '; - htmlStr += getTreeHtmlForTree(pathIndex, projectTreeIdIndex); - htmlStr += '
    '; - htmlStr += '
  • '; - $('#apiPathTree .projects').append(htmlStr); - projectTreeIdIndex++; -} - -/** - * 设置对象的各种请求方式,存在则复制 - * @param source 资源,原始json的paths的指定对象 - * @param pathObj 当前的待赋值对象 - * @param url url绝对路径 - * @param method 请求方式,post、get... - * @returns - */ -function setRequestMethodForTree(domain, source, pathObj, url, method) { - if (isEmpty(source[method])) { - return; - } - var tempPath = projectTreeIdIndex + url + "." + method; - pathObj[method] = source[method]; - pathObj[method].path = tempPath; - pathObj[method].url = url; - pathObj[method].method = method; - pathObj[method].domain = domain; - treePathDataMap.set(tempPath, source[method]); -} - -/** - * 将对象列表递归的方式转换成文档格式html字符串 - * @param pathData 处理后的对象列表 - * @returns 生成的html字符串 - */ -function getTreeHtmlForTree(pathData, treeIdStr) { - var tempStr = ""; - var indexNow = 1; - Object.keys(pathData).forEach(function(key){ - var tempNode = pathData[key]; - var tempTreeId = treeIdStr + "_" + indexNow; - var nodeSub = getObjectFirstAttributeIfOnly(tempNode); - if(nodeSub != null && isNotEmpty(nodeSub.method)) { - //console.log(nodeSub); - nodeSub.treeId = tempTreeId; - var summary = isEmpty(nodeSub.summary) ? "" : "("+nodeSub.summary+")"; - if(summary.length > 10){ - summary = summary.substring(0, 10)+"...)";// 防止被撑得太长,只显示10个字 - } - tempStr += '
  • '+key+''+summary+'
  • '; - } else if(key.indexOf("/") < 0) { - //console.log(tempTreeId); - tempNode.treeId = tempTreeId; - var summary = isEmpty(tempNode.summary) ? "" : "("+tempNode.summary+")"; - if(summary.length > 10){ - summary = summary.substring(0, 10)+"...)";// 防止被撑得太长,只显示10个字 - } - tempStr += '
  • '+key+''+summary+'
  • '; - } else { - tempStr += '
  • '; - tempStr += ''+key+''; - tempStr += '
      '; - tempStr += getTreeHtmlForTree(tempNode, tempTreeId); - tempStr += '
    '; - tempStr += '
  • '; - } - indexNow++; - }); - return tempStr; -} - +/** + * 以树形方式生成并展示: + * /api + * /data + * /getDateList + * post + * get + * @author 暮光:城中城 + * @since 2018年5月26日 +*/ + +/** + * 把原始的json字符串转换成对象列表的方式,方便后续使用 + * @param json swagger的原始对象 + * @returns + */ +function createTreeViewByTree(json, keywords) { + var pathIndex = {}; + var paths = json.paths; + var domain = json.domainUrl;// 服务器代理会返回此属性 + var rewriteDomainUrl = json.rewriteDomainUrl;// 服务器代理会返回此属性 + if(isEmpty(domain)) { + domain = "http://" + json.host + json.basePath; + } + if(domain.endWith("/")) { + domain = domain.substring(0, domain.length - 1); + } + if (isEmptyObject(paths)) { + return; + } + //console.log(paths); + Object.keys(paths).forEach(function(key){ + //console.log(key, paths[key]); + if(!findInPathsValue(key, paths[key], keywords)) { + return; + } + var keyArr = key.split("/"); + var nowPathObj = null; + keyArr.forEach(function(val, index) { + //console.log(val, index); + if(isEmpty(val) && index == 0) { + return; + } + var nowPath = "/" + val; + if(nowPathObj == null) { + nowPathObj = {}; + nowPathObj[nowPath] = pathIndex[nowPath]; + if(nowPathObj[nowPath] == null) { + nowPathObj[nowPath] = {}; + pathIndex[nowPath] = nowPathObj[nowPath]; + } + } + var tempPathObj = nowPathObj[nowPath]; + if(isEmpty(tempPathObj)) { + tempPathObj = nowPathObj[nowPath] = {}; + } + nowPathObj = tempPathObj; + if(index == keyArr.length - 1) { + //get, head, post, put, patch, delete, options, trace + setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "get"); + setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "head"); + setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "post"); + setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "put"); + setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "patch"); + setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "delete"); + setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "options"); + setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "trace"); + } + }); + }); + var htmlStr = '
  • '; + htmlStr += ''+json.info.title+''; + htmlStr += '
      '; + htmlStr += getTreeHtmlForTree(pathIndex, projectTreeIdIndex); + htmlStr += '
    '; + htmlStr += '
  • '; + $('#apiPathTree .projects').append(htmlStr); + projectTreeIdIndex++; +} + +/** + * 设置对象的各种请求方式,存在则复制 + * @param source 资源,原始json的paths的指定对象 + * @param pathObj 当前的待赋值对象 + * @param url url绝对路径 + * @param method 请求方式,post、get... + * @returns + */ +function setRequestMethodForTree(rewriteDomainUrl, domain, source, pathObj, url, method) { + if (isEmpty(source[method])) { + return; + } + var tempPath = projectTreeIdIndex + url + "." + method; + pathObj[method] = source[method]; + pathObj[method].path = tempPath; + pathObj[method].url = url; + pathObj[method].method = method; + pathObj[method].domain = domain; + pathObj[method].rewriteDomainUrl = rewriteDomainUrl; + treePathDataMap.set(tempPath, source[method]); +} + +/** + * 将对象列表递归的方式转换成文档格式html字符串 + * @param pathData 处理后的对象列表 + * @returns 生成的html字符串 + */ +function getTreeHtmlForTree(pathData, treeIdStr) { + var tempStr = ""; + var indexNow = 1; + Object.keys(pathData).forEach(function(key){ + var tempNode = pathData[key]; + var tempTreeId = treeIdStr + "_" + indexNow; + var nodeSub = getObjectFirstAttributeIfOnly(tempNode); + if(nodeSub != null && isNotEmpty(nodeSub.method)) { + //console.log(nodeSub); + nodeSub.treeId = tempTreeId; + var summary = isEmpty(nodeSub.summary) ? "" : "("+nodeSub.summary+")"; + if(summary.length > 10){ + summary = summary.substring(0, 10)+"...)";// 防止被撑得太长,只显示10个字 + } + tempStr += '
  • '+key+''+summary+'
  • '; + } else if(key.indexOf("/") < 0) { + //console.log(tempTreeId); + tempNode.treeId = tempTreeId; + var summary = isEmpty(tempNode.summary) ? "" : "("+tempNode.summary+")"; + if(summary.length > 10){ + summary = summary.substring(0, 10)+"...)";// 防止被撑得太长,只显示10个字 + } + tempStr += '
  • '+key+''+summary+'
  • '; + } else { + tempStr += '
  • '; + tempStr += ''+key+''; + tempStr += '
      '; + tempStr += getTreeHtmlForTree(tempNode, tempTreeId); + tempStr += '
    '; + tempStr += '
  • '; + } + indexNow++; + }); + return tempStr; +} + 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 3017f53e..ffbe06ba 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 @@ -28,8 +28,9 @@ var defaultUserSettings = { autoFillParam : 0,// 自动填充参数,0=否 1=智能填充 2=全部填充 onlyUseLastParam : 0,// 是否仅使用上次请求参数 showParamType : 1,// 是否展示字段的类型 - catalogShowType : 1,// 目录的展示方式,1=url分成一层一层的展示、2=整个url显示为一层展示 + catalogShowType : 2,// 目录的展示方式,1=url分成一层一层的展示、2=整个url显示为一层展示 treeShowType : 1,// 树形菜单展示方式,1=tree-angles、2=tree-menu、3=默认,4=tree-folders、5=tree-chevrons + forceRewriteDomain: 0,// 强制重写域名 0=否 1=是 projects : [],// 所有的项目列表 removedProjects : [],// 被移除的项目列表 prevWNow : 360 @@ -331,7 +332,11 @@ $("#apiPathTree").on("click", ".show-doc", function(){ docInfo = getNotEmptyStr(data.summary); } // 处理在线调试 - $("#postUrlInput").val(data.domain + docUrl); + if (userSettings.forceRewriteDomain == 1 && isNotEmpty(data.rewriteDomainUrl)) { + $("#postUrlInput").val(data.rewriteDomainUrl + docUrl); + } else { + $("#postUrlInput").val(data.domain + docUrl); + } // 处理模拟返回 $("#simulationResultUrl").text(docUrl); $("#simulationResultUrlTest").text(data.domain + docUrl + "?zyplayerApiTest=1"); @@ -891,19 +896,6 @@ function documentLoadFinish() { $('#homePageDashboard').dashboard({draggable: false}); } -/** - * 修改用户的选项的显示 - * @param - * @returns - */ -function updateUserSettingsUi() { - $("input[name='treeShowType'][value='"+userSettings.treeShowType+"']").prop("checked",true); - $("input[name='catalogShowType'][value='"+userSettings.catalogShowType+"']").prop("checked",true); - $("input[name='showParamType'][value='"+userSettings.showParamType+"']").prop("checked",true); - $("input[name='onlyUseLastParam'][value='"+userSettings.onlyUseLastParam+"']").prop("checked",true); - $("input[name='autoFillParam'][value='"+userSettings.autoFillParam+"']").prop("checked",true); -} - /** * 修改树形菜单展示类型 * @param @@ -960,7 +952,6 @@ function initUserSettings() { } changeContentWidth(userSettings.prevWNow); updateTreeShowType(); - updateUserSettingsUi(); // 增加文档 getDocumentListByService(); }); diff --git a/zyplayer-doc-swagger/src/main/resources/webjars/zpages/docShowConfig.html b/zyplayer-doc-swagger/src/main/resources/webjars/zpages/docShowConfig.html index c6b5b67a..066a6258 100644 --- a/zyplayer-doc-swagger/src/main/resources/webjars/zpages/docShowConfig.html +++ b/zyplayer-doc-swagger/src/main/resources/webjars/zpages/docShowConfig.html @@ -56,12 +56,20 @@ 自动填充请求参数 - + 否:不填充,智能填充:只填充flag、time等后缀的参数,全部填充:对应不上类型的使用“我是默认字符串”填充 + + 强制重写域名 + + + + + 文档在本地,想调试线上接口就可以勾选此参数,“在线调试”处的请求地址强制改为:“文档地址管理”处配置的重写域名+接口地址 + @@ -77,25 +85,42 @@ var app = new Vue({ el: '#app', data: { - initCount: 5, + initCount: 6, catalogShowType: '', treeShowType: '', showParamType:'', onlyUseLastParam: '', autoFillParam: '', - userSettings: {} + forceRewriteDomain: '', + rewriteDomainUrl: '', + userSettings: {}, + // 默认用户的配置对象 + defaultUserSettings: { + autoFillParam : 0,// 自动填充参数,0=否 1=智能填充 2=全部填充 + onlyUseLastParam : 0,// 是否仅使用上次请求参数 + showParamType : 1,// 是否展示字段的类型 + catalogShowType : 2,// 目录的展示方式,1=url分成一层一层的展示、2=整个url显示为一层展示 + treeShowType : 1,// 树形菜单展示方式,1=tree-angles、2=tree-menu、3=默认,4=tree-folders、5=tree-chevrons + forceRewriteDomain: 0,// 强制重写域名 0=否 1=是 + projects : [],// 所有的项目列表 + removedProjects : [],// 被移除的项目列表 + prevWNow : 360 + } }, methods: { }, mounted: function(){ getStorage(cacheKeys.userSettings, function(data){ + var empty = isEmpty(data) || isEmptyObject(data); + data = empty ? app.defaultUserSettings : data; app.userSettings = data; app.catalogShowType = data.catalogShowType; app.treeShowType = data.treeShowType; app.showParamType = data.showParamType; app.onlyUseLastParam = data.onlyUseLastParam; app.autoFillParam = data.autoFillParam; + app.forceRewriteDomain = data.forceRewriteDomain; }); }, watch: { @@ -123,6 +148,10 @@ app.userSettings.autoFillParam = newVal; storeUserSettings(); }, + forceRewriteDomain: function(newVal, oldval){ + app.userSettings.forceRewriteDomain = newVal; + storeUserSettings(); + }, } }); diff --git a/zyplayer-doc-swagger/src/main/resources/webjars/zpages/docUrlConfig.html b/zyplayer-doc-swagger/src/main/resources/webjars/zpages/docUrlConfig.html index 1820cbf8..3a40fa44 100644 --- a/zyplayer-doc-swagger/src/main/resources/webjars/zpages/docUrlConfig.html +++ b/zyplayer-doc-swagger/src/main/resources/webjars/zpages/docUrlConfig.html @@ -14,6 +14,7 @@ 序号 地址 + 重写域名地址 持久化时间 操作 @@ -22,14 +23,16 @@ {{index+1}} {{item.url}} + {{item.rewriteDomainUrl}} {{item.lastSync}} + - + @@ -48,7 +51,14 @@