文档增加强制重写域名功能
This commit is contained in:
@@ -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;}
|
||||
|
||||
@@ -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<SwaggerResourcesInfoVo> resourcesSet = new LinkedList<>();
|
||||
Set<String> swaggerDocsDeleteSet = new HashSet<>();
|
||||
|
||||
List<SwaggerResourcesInfoVo> 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<String, SwaggerResourcesInfoVo> 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<SwaggerResourcesInfoVo> 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<Object> addSwaggerResources(String resourcesUrl) {
|
||||
public ResponseJson<Object> 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<String> swaggerDocsDeleteSet = new HashSet<>();
|
||||
@@ -209,9 +220,13 @@ public class MgDocumentController {
|
||||
swaggerDocsDeleteSet.addAll(swaggerDocsDeleteList);
|
||||
}
|
||||
// 转成set,防止重复
|
||||
List<SwaggerResourcesInfoVo> resourcesList = null;
|
||||
List<SwaggerResourcesInfoVo> 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) {
|
||||
|
||||
@@ -12,6 +12,7 @@ public class SwaggerResourcesInfoVo implements Serializable {
|
||||
private Integer id;
|
||||
private String url;
|
||||
private String storageKey;
|
||||
private String rewriteDomainUrl;
|
||||
private List<SwaggerResource> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = '<li>';
|
||||
htmlStr += '<a href="#">'+json.info.title+'</a>';
|
||||
htmlStr += '<ul>';
|
||||
htmlStr += getTreeHtmlForTag(pathIndex, projectTreeIdIndex);
|
||||
htmlStr += '</ul>';
|
||||
htmlStr += '</li>';
|
||||
$('#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 += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+nodeSub.path+'">'+key+'<span>'+summary+'</span></a></li>';
|
||||
} 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 += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+tempNode.path+'">'+key+'<span>'+summary+'</span></a></li>';
|
||||
} else {
|
||||
tempStr += '<li>';
|
||||
tempStr += '<a href="#">'+key+'</a>';
|
||||
tempStr += '<ul>';
|
||||
tempStr += getTreeHtmlForTag(tempNode, tempTreeId);
|
||||
tempStr += '</ul>';
|
||||
tempStr += '</li>';
|
||||
}
|
||||
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 = '<li>';
|
||||
htmlStr += '<a href="#">'+json.info.title+'</a>';
|
||||
htmlStr += '<ul>';
|
||||
htmlStr += getTreeHtmlForTag(pathIndex, projectTreeIdIndex);
|
||||
htmlStr += '</ul>';
|
||||
htmlStr += '</li>';
|
||||
$('#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 += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+nodeSub.path+'">'+key+'<span>'+summary+'</span></a></li>';
|
||||
} 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 += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+tempNode.path+'">'+key+'<span>'+summary+'</span></a></li>';
|
||||
} else {
|
||||
tempStr += '<li>';
|
||||
tempStr += '<a href="#">'+key+'</a>';
|
||||
tempStr += '<ul>';
|
||||
tempStr += getTreeHtmlForTag(tempNode, tempTreeId);
|
||||
tempStr += '</ul>';
|
||||
tempStr += '</li>';
|
||||
}
|
||||
indexNow++;
|
||||
});
|
||||
return tempStr;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 = '<li>';
|
||||
htmlStr += '<a href="#">'+json.info.title+'</a>';
|
||||
htmlStr += '<ul>';
|
||||
htmlStr += getTreeHtmlForTree(pathIndex, projectTreeIdIndex);
|
||||
htmlStr += '</ul>';
|
||||
htmlStr += '</li>';
|
||||
$('#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 += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+nodeSub.path+'">'+key+'<span>'+summary+'</span></a></li>';
|
||||
} 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 += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+tempNode.path+'">'+key+'<span>'+summary+'</span></a></li>';
|
||||
} else {
|
||||
tempStr += '<li>';
|
||||
tempStr += '<a href="#">'+key+'</a>';
|
||||
tempStr += '<ul>';
|
||||
tempStr += getTreeHtmlForTree(tempNode, tempTreeId);
|
||||
tempStr += '</ul>';
|
||||
tempStr += '</li>';
|
||||
}
|
||||
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 = '<li>';
|
||||
htmlStr += '<a href="#">'+json.info.title+'</a>';
|
||||
htmlStr += '<ul>';
|
||||
htmlStr += getTreeHtmlForTree(pathIndex, projectTreeIdIndex);
|
||||
htmlStr += '</ul>';
|
||||
htmlStr += '</li>';
|
||||
$('#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 += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+nodeSub.path+'">'+key+'<span>'+summary+'</span></a></li>';
|
||||
} 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 += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+tempNode.path+'">'+key+'<span>'+summary+'</span></a></li>';
|
||||
} else {
|
||||
tempStr += '<li>';
|
||||
tempStr += '<a href="#">'+key+'</a>';
|
||||
tempStr += '<ul>';
|
||||
tempStr += getTreeHtmlForTree(tempNode, tempTreeId);
|
||||
tempStr += '</ul>';
|
||||
tempStr += '</li>';
|
||||
}
|
||||
indexNow++;
|
||||
});
|
||||
return tempStr;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
@@ -56,12 +56,20 @@
|
||||
<tr>
|
||||
<td class="info">自动填充请求参数</td>
|
||||
<td>
|
||||
<label><input type="radio" name="autoFillParam" value="0" v-model="autoFillParam">否</label>
|
||||
<label><input type="radio" name="autoFillParam" value="1" v-model="autoFillParam">智能填充</label>
|
||||
<label><input type="radio" name="autoFillParam" value="2" v-model="autoFillParam">全部填充</label>
|
||||
<label><input type="radio" name="autoFillParam" value="0" v-model="autoFillParam">否</label>
|
||||
</td>
|
||||
<td>否:不填充,智能填充:只填充flag、time等后缀的参数,全部填充:对应不上类型的使用“我是默认字符串”填充</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="info">强制重写域名</td>
|
||||
<td>
|
||||
<label><input type="radio" name="forceRewriteDomain" value="1" v-model="forceRewriteDomain">是</label>
|
||||
<label><input type="radio" name="forceRewriteDomain" value="0" v-model="forceRewriteDomain">否</label>
|
||||
</td>
|
||||
<td>文档在本地,想调试线上接口就可以勾选此参数,“在线调试”处的请求地址强制改为:“文档地址管理”处配置的重写域名+接口地址</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -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();
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
<tr>
|
||||
<td style="width: 50px;">序号</td>
|
||||
<td>地址</td>
|
||||
<td>重写域名地址</td>
|
||||
<td>持久化时间</td>
|
||||
<td>操作</td>
|
||||
</tr>
|
||||
@@ -22,14 +23,16 @@
|
||||
<tr v-for="(item,index) in swaggerResourcesList" :key="item.id" :data-id="item.id" :data-index="index" >
|
||||
<td>{{index+1}}</td>
|
||||
<td>{{item.url}}</td>
|
||||
<td>{{item.rewriteDomainUrl}}</td>
|
||||
<td>{{item.lastSync}}</td>
|
||||
<td>
|
||||
<button class="btn btn-danger" type="button" v-on:click="deleteDocUrl($event)">删除</button>
|
||||
<button class="btn btn-info" type="button" v-on:click="editDocUrl($event)">编辑</button>
|
||||
<!--<button class="btn btn-danger" type="button" v-on:click="syncDocData($event)">持久化</button>-->
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" align="center">
|
||||
<td colspan="5" align="center">
|
||||
<button class="btn" type="button" v-on:click="btnRefreshList"> 刷新 </button>
|
||||
<button class="btn btn-info" type="button" v-on:click="exportDocument">导出文档</button>
|
||||
<button class="btn btn-primary" type="button" v-on:click="addNewDocument">增加文档</button>
|
||||
@@ -48,7 +51,14 @@
|
||||
<h4 class="modal-title">输入文档地址</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input v-model="addNewDocumentInput" type="text" class="form-control" placeholder="例:http://192.168.0.172/swagger-resources">
|
||||
<div class="input-line">
|
||||
地址:
|
||||
<input v-model="addNewDocumentInput" type="text" class="form-control" placeholder="例:http://192.168.0.172/swagger-resources">
|
||||
</div>
|
||||
<div class="input-line">
|
||||
重写域名地址:
|
||||
<input v-model="rewriteDomainUrl" type="text" name="rewriteDomainUrl" class="form-control" placeholder="文档展示配置页 勾选“重写域名”重写的地址">
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" v-on:click="addNewDocumentBtn">保存</button>
|
||||
@@ -71,7 +81,9 @@
|
||||
el: '#app',
|
||||
data: {
|
||||
swaggerResourcesList: [],
|
||||
addNewDocumentInput: ''
|
||||
addNewDocumentInput: '',
|
||||
rewriteDomainUrl: '',
|
||||
oldUrl: ''
|
||||
},
|
||||
methods: {
|
||||
btnRefreshList: function(){
|
||||
@@ -84,7 +96,17 @@
|
||||
app.swaggerResourcesList = data;
|
||||
});
|
||||
},
|
||||
editDocUrl: function(event){
|
||||
var tr = $(event.currentTarget).parents("tr");
|
||||
var index = tr.data("index");
|
||||
var item = app.swaggerResourcesList[index];
|
||||
app.oldUrl = item.url;
|
||||
app.addNewDocumentInput = item.url;
|
||||
app.rewriteDomainUrl = item.rewriteDomainUrl;
|
||||
$('#addNewDocumentModal').modal({moveable:true});
|
||||
},
|
||||
addNewDocument: function(){
|
||||
app.oldUrl = '';
|
||||
app.addNewDocumentInput = '';
|
||||
$('#addNewDocumentModal').modal({moveable:true});
|
||||
},
|
||||
@@ -93,7 +115,12 @@
|
||||
if(isEmpty(addNewDocumentInput)) {
|
||||
Toast.error("地址不可以为空");return;
|
||||
}
|
||||
ajaxTemp(urlBase + "swagger-mg-ui/document/addSwaggerResources", "post", "json", {resourcesUrl: addNewDocumentInput}, function(json){
|
||||
var param = {
|
||||
resourcesUrl: addNewDocumentInput,
|
||||
rewriteDomainUrl: app.rewriteDomainUrl,
|
||||
oldUrl: app.oldUrl
|
||||
};
|
||||
ajaxTemp(urlBase + "swagger-mg-ui/document/addSwaggerResources", "post", "json", param, function(json){
|
||||
if(validateResult(json)) {
|
||||
//window.parent.document.location.reload();
|
||||
//app.swaggerResourcesList.push(addNewDocumentInput);
|
||||
@@ -144,6 +171,7 @@
|
||||
|
||||
<style>
|
||||
#app{padding-top: 10px;}
|
||||
.input-line{margin-bottom: 15px;}
|
||||
</style>
|
||||
</html>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user