文档增加强制重写域名功能

This commit is contained in:
暮光:城中城
2018-12-20 23:28:05 +08:00
parent 28b8b5e6d1
commit 1874d3ed26
8 changed files with 380 additions and 302 deletions

View File

@@ -2,7 +2,7 @@ body{width: 100%;height: 100%;margin: 0;padding: 0;}
a:focus{outline:none;} a:focus{outline:none;}
ul{list-style: none;list-style-type: none;} ul{list-style: none;list-style-type: none;}
.tree li a{white-space: nowrap;} .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 a{padding-left: 68px;}
.tree-menu li li li li li a{padding-left: 88px;} .tree-menu li li li li li a{padding-left: 88px;}
.tree-menu li li li li li li a{padding-left: 108px;} .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; font-size: 24px;float: right;margin: 18px 18px 0 0;color: #fff;cursor: pointer;
} }
.left-container{ .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; top: 60px; bottom: 0; left: 0; overflow-y: auto; padding: 10px;
} }
.left-container .projects{border: 0px; border-radius: 0px;} .left-container .projects{border: 0px; border-radius: 0px;}

View File

@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/** /**
* 文档控制器 * 文档控制器
@@ -76,16 +77,24 @@ public class MgDocumentController {
// 转成set防止重复 // 转成set防止重复
List<SwaggerResourcesInfoVo> resourcesSet = new LinkedList<>(); List<SwaggerResourcesInfoVo> resourcesSet = new LinkedList<>();
Set<String> swaggerDocsDeleteSet = new HashSet<>(); 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)) { if (StringUtils.isNotBlank(choiceDocList)) {
needRestorage = false;// 选择的则不再存入 needRestorage = false;// 选择的则不再存入
Map<String, SwaggerResourcesInfoVo> infoVoMap = resourcesList.stream().collect(Collectors.toMap(SwaggerResourcesInfoVo::getUrl, val -> val));
for (String url : choiceDocList.split(",")) { for (String url : choiceDocList.split(",")) {
resourcesSet.add(new SwaggerResourcesInfoVo(url)); SwaggerResourcesInfoVo resourcesInfoVo = infoVoMap.get(url);
if (resourcesInfoVo != null) {
resourcesSet.add(resourcesInfoVo);
}
} }
} else { } else {
String swaggerResourcesStr = storageService.get(StorageKeys.SWAGGER_RESOURCES_LIST); if (resourcesList.size() > 0) {
String swaggerDocsDeleteStr = storageService.get(StorageKeys.SWAGGER_DOCS_DELETE_LIST);
if (StringUtils.isNotBlank(swaggerResourcesStr)) {
List<SwaggerResourcesInfoVo> resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class);
resourcesSet.addAll(resourcesList); resourcesSet.addAll(resourcesList);
} else { } else {
// 默认加上自身的文档 // 默认加上自身的文档
@@ -172,9 +181,11 @@ public class MgDocumentController {
swaggerResourceList.add(jsonObject); swaggerResourceList.add(jsonObject);
// 本来想转对象之后赋值但是在此转成JSON字符串之后格式就不是之前的了所有不能转。。。 // 本来想转对象之后赋值但是在此转成JSON字符串之后格式就不是之前的了所有不能转。。。
// 直接字符串拼接,坑真多~ // 直接字符串拼接,坑真多~
String rewriteDomainUrl = Optional.ofNullable(resourcesInfoVo.getRewriteDomainUrl()).orElse("");
resourceStr = resourceStr.substring(1); resourceStr = resourceStr.substring(1);
resourceStr = "{\"fullUrl\":\"" + location + "\"," resourceStr = "{\"fullUrl\":\"" + location + "\","
+ "\"domainUrl\":\"" + resourcesUrl + "\"," + "\"domainUrl\":\"" + resourcesUrl + "\","
+ "\"rewriteDomainUrl\":\"" + rewriteDomainUrl + "\","
+ resourceStr; + resourceStr;
swaggerResourceStrList.add(resourceStr); swaggerResourceStrList.add(resourceStr);
} catch (Exception e) { } catch (Exception e) {
@@ -200,7 +211,7 @@ public class MgDocumentController {
* @return 添加结果 * @return 添加结果
*/ */
@PostMapping(value = "/addSwaggerResources") @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 swaggerResourcesStr = storageService.get(StorageKeys.SWAGGER_RESOURCES_LIST);
String swaggerDocsDeleteStr = storageService.get(StorageKeys.SWAGGER_DOCS_DELETE_LIST); String swaggerDocsDeleteStr = storageService.get(StorageKeys.SWAGGER_DOCS_DELETE_LIST);
Set<String> swaggerDocsDeleteSet = new HashSet<>(); Set<String> swaggerDocsDeleteSet = new HashSet<>();
@@ -209,9 +220,13 @@ public class MgDocumentController {
swaggerDocsDeleteSet.addAll(swaggerDocsDeleteList); swaggerDocsDeleteSet.addAll(swaggerDocsDeleteList);
} }
// 转成set防止重复 // 转成set防止重复
List<SwaggerResourcesInfoVo> resourcesList = null; List<SwaggerResourcesInfoVo> resourcesList = new LinkedList<>();
if (StringUtils.isNotBlank(swaggerResourcesStr)) { if (StringUtils.isNotBlank(swaggerResourcesStr)) {
resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class); resourcesList = JSON.parseArray(swaggerResourcesStr, SwaggerResourcesInfoVo.class);
// 如果是编辑,把之前的删除掉,再在后面添加
if (StringUtils.isNotBlank(oldUrl)) {
resourcesList = resourcesList.stream().filter(val -> !Objects.equals(val.getUrl(), oldUrl)).collect(Collectors.toList());
}
} }
try { try {
String resourcesStr = HttpRequest.get(resourcesUrl).timeout(3000).execute().body(); String resourcesStr = HttpRequest.get(resourcesUrl).timeout(3000).execute().body();
@@ -236,7 +251,9 @@ public class MgDocumentController {
location = resourcesDomain + location; location = resourcesDomain + location;
swaggerDocsDeleteSet.remove(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); AtomicInteger idIndex = new AtomicInteger(1);
resourcesList.forEach(val -> val.setId(idIndex.getAndIncrement())); resourcesList.forEach(val -> val.setId(idIndex.getAndIncrement()));
} catch (Exception e) { } catch (Exception e) {

View File

@@ -12,6 +12,7 @@ public class SwaggerResourcesInfoVo implements Serializable {
private Integer id; private Integer id;
private String url; private String url;
private String storageKey; private String storageKey;
private String rewriteDomainUrl;
private List<SwaggerResource> resourceList; private List<SwaggerResource> resourceList;
private Date creationTime; private Date creationTime;
private Date lastSync; private Date lastSync;
@@ -80,4 +81,12 @@ public class SwaggerResourcesInfoVo implements Serializable {
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
public String getRewriteDomainUrl() {
return rewriteDomainUrl;
}
public void setRewriteDomainUrl(String rewriteDomainUrl) {
this.rewriteDomainUrl = rewriteDomainUrl;
}
} }

View File

@@ -1,128 +1,130 @@
/** /**
* 以每个Tag方式生成并展示 * 以每个Tag方式生成并展示
* 核心信息控制器 * 核心信息控制器
* /api/data/getDataList * /api/data/getDataList
* /api/data/getDataDetail * /api/data/getDataDetail
* 跟进控制器 * 跟进控制器
* /api/track/getTrackList * /api/track/getTrackList
* /api/track/getTrackDetail * /api/track/getTrackDetail
* *
* 先把树形的写完了再写这个,, * 先把树形的写完了再写这个,,
* *
* @author 暮光:城中城 * @author 暮光:城中城
* @since 2018年5月26日 * @since 2018年5月26日
*/ */
function createTreeViewByTag(json, keywords) { function createTreeViewByTag(json, keywords) {
var pathIndex = {}; var pathIndex = {};
var paths = json.paths; var paths = json.paths;
var domain = json.domainUrl;// 服务器代理会返回此属性 var domain = json.domainUrl;// 服务器代理会返回此属性
if(isEmpty(domain)) { var rewriteDomainUrl = json.rewriteDomainUrl;// 服务器代理会返回此属性
domain = "http://" + json.host + json.basePath; if(isEmpty(domain)) {
} domain = "http://" + json.host + json.basePath;
if(domain.endWith("/")) { }
domain = domain.substring(0, domain.length - 1); if(domain.endWith("/")) {
} domain = domain.substring(0, domain.length - 1);
if (isEmptyObject(paths)) { }
return; if (isEmptyObject(paths)) {
} return;
//console.log(paths); }
Object.keys(paths).forEach(function(key){ //console.log(paths);
//console.log(key, paths[key]); Object.keys(paths).forEach(function(key){
if(!findInPathsValue(key, paths[key], keywords)) { //console.log(key, paths[key]);
return; if(!findInPathsValue(key, paths[key], keywords)) {
} return;
setRequestMethodForTag(domain, paths[key], pathIndex, key, "get"); }
setRequestMethodForTag(domain, paths[key], pathIndex, key, "head"); setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "get");
setRequestMethodForTag(domain, paths[key], pathIndex, key, "post"); setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "head");
setRequestMethodForTag(domain, paths[key], pathIndex, key, "put"); setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "post");
setRequestMethodForTag(domain, paths[key], pathIndex, key, "patch"); setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "put");
setRequestMethodForTag(domain, paths[key], pathIndex, key, "delete"); setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "patch");
setRequestMethodForTag(domain, paths[key], pathIndex, key, "options"); setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "delete");
setRequestMethodForTag(domain, paths[key], pathIndex, key, "trace"); setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "options");
}); setRequestMethodForTag(rewriteDomainUrl, domain, paths[key], pathIndex, key, "trace");
//console.log(pathIndex); });
var htmlStr = '<li>'; //console.log(pathIndex);
htmlStr += '<a href="#">'+json.info.title+'</a>'; var htmlStr = '<li>';
htmlStr += '<ul>'; htmlStr += '<a href="#">'+json.info.title+'</a>';
htmlStr += getTreeHtmlForTag(pathIndex, projectTreeIdIndex); htmlStr += '<ul>';
htmlStr += '</ul>'; htmlStr += getTreeHtmlForTag(pathIndex, projectTreeIdIndex);
htmlStr += '</li>'; htmlStr += '</ul>';
$('#apiPathTree .projects').append(htmlStr); htmlStr += '</li>';
projectTreeIdIndex++; $('#apiPathTree .projects').append(htmlStr);
} projectTreeIdIndex++;
}
/**
* 设置对象的各种请求方式,存在则复制 /**
* @param source 资源原始json的paths的指定对象 * 设置对象的各种请求方式,存在则复制
* @param pathObj 当前的待赋值对象 * @param source 资源原始json的paths的指定对象
* @param url url绝对路径 * @param pathObj 当前的待赋值对象
* @param method 请求方式post、get... * @param url url绝对路径
* @returns * @param method 请求方式post、get...
*/ * @returns
function setRequestMethodForTag(domain, source, pathObj, url, method) { */
if (isEmpty(source[method])) { function setRequestMethodForTag(rewriteDomainUrl, domain, source, pathObj, url, method) {
return; if (isEmpty(source[method])) {
} return;
source[method].tags.forEach(function(val, index) { }
var tempObj = pathObj[val]; source[method].tags.forEach(function(val, index) {
if(isEmpty(tempObj)) { var tempObj = pathObj[val];
tempObj = pathObj[val] = {}; if(isEmpty(tempObj)) {
} tempObj = pathObj[val] = {};
var tempUrlObj = tempObj[url]; }
if(isEmpty(tempUrlObj)) { var tempUrlObj = tempObj[url];
tempUrlObj = tempObj[url] = {}; if(isEmpty(tempUrlObj)) {
} tempUrlObj = tempObj[url] = {};
var tempPath = projectTreeIdIndex + url + "." + method; }
tempUrlObj[method] = source[method]; var tempPath = projectTreeIdIndex + url + "." + method;
tempUrlObj[method].path = tempPath; tempUrlObj[method] = source[method];
tempUrlObj[method].url = url; tempUrlObj[method].path = tempPath;
tempUrlObj[method].method = method; tempUrlObj[method].url = url;
tempUrlObj[method].domain = domain; tempUrlObj[method].method = method;
treePathDataMap.set(tempPath, source[method]); tempUrlObj[method].domain = domain;
}); tempUrlObj[method].rewriteDomainUrl = rewriteDomainUrl;
} treePathDataMap.set(tempPath, source[method]);
});
/** }
* 将对象列表递归的方式转换成文档格式html字符串
* @param pathData 处理后的对象列表 /**
* @returns 生成的html字符串 * 将对象列表递归的方式转换成文档格式html字符串
*/ * @param pathData 处理后的对象列表
function getTreeHtmlForTag(pathData, treeIdStr) { * @returns 生成的html字符串
var tempStr = ""; */
var indexNow = 1; function getTreeHtmlForTag(pathData, treeIdStr) {
// get, head, post, put, patch, delete, options, trace var tempStr = "";
var actionArrays = ["get", "head", "post", "put", "patch", "delete", "options", "trace"]; var indexNow = 1;
Object.keys(pathData).forEach(function(key){ // get, head, post, put, patch, delete, options, trace
var tempNode = pathData[key]; var actionArrays = ["get", "head", "post", "put", "patch", "delete", "options", "trace"];
var tempTreeId = treeIdStr + "_" + indexNow; Object.keys(pathData).forEach(function(key){
// 只有一个子元素而且有method元素说明是只有一个节点 var tempNode = pathData[key];
var nodeSub = getObjectFirstAttributeIfOnly(tempNode); var tempTreeId = treeIdStr + "_" + indexNow;
if(nodeSub != null && isNotEmpty(nodeSub.method)) { // 只有一个子元素而且有method元素说明是只有一个节点
var summary = isEmpty(nodeSub.summary) ? "" : "(" + nodeSub.summary + ")"; var nodeSub = getObjectFirstAttributeIfOnly(tempNode);
if(summary.length > 10){ if(nodeSub != null && isNotEmpty(nodeSub.method)) {
summary = summary.substring(0, 10)+"...)";// 防止被撑得太长只显示10个字 var summary = isEmpty(nodeSub.summary) ? "" : "(" + nodeSub.summary + ")";
} if(summary.length > 10){
nodeSub.treeId = tempTreeId; 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(haveString(actionArrays, key)) { nodeSub.treeId = tempTreeId;
//console.log(tempTreeId); tempStr += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+nodeSub.path+'">'+key+'<span>'+summary+'</span></a></li>';
tempNode.treeId = tempTreeId; } else if(haveString(actionArrays, key)) {
var summary = isEmpty(tempNode.summary) ? "" : "("+tempNode.summary+")"; //console.log(tempTreeId);
if(summary.length > 10){ tempNode.treeId = tempTreeId;
summary = summary.substring(0, 10)+"...)";// 防止被撑得太长只显示10个字 var summary = isEmpty(tempNode.summary) ? "" : "("+tempNode.summary+")";
} if(summary.length > 10){
tempStr += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+tempNode.path+'">'+key+'<span>'+summary+'</span></a></li>'; summary = summary.substring(0, 10)+"...)";// 防止被撑得太长只显示10个字
} else { }
tempStr += '<li>'; tempStr += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+tempNode.path+'">'+key+'<span>'+summary+'</span></a></li>';
tempStr += '<a href="#">'+key+'</a>'; } else {
tempStr += '<ul>'; tempStr += '<li>';
tempStr += getTreeHtmlForTag(tempNode, tempTreeId); tempStr += '<a href="#">'+key+'</a>';
tempStr += '</ul>'; tempStr += '<ul>';
tempStr += '</li>'; tempStr += getTreeHtmlForTag(tempNode, tempTreeId);
} tempStr += '</ul>';
indexNow++; tempStr += '</li>';
}); }
return tempStr; indexNow++;
} });
return tempStr;
}

View File

@@ -1,141 +1,143 @@
/** /**
* 以树形方式生成并展示: * 以树形方式生成并展示:
* /api * /api
* /data * /data
* /getDateList * /getDateList
* post * post
* get * get
* @author 暮光:城中城 * @author 暮光:城中城
* @since 2018年5月26日 * @since 2018年5月26日
*/ */
/** /**
* 把原始的json字符串转换成对象列表的方式方便后续使用 * 把原始的json字符串转换成对象列表的方式方便后续使用
* @param json swagger的原始对象 * @param json swagger的原始对象
* @returns * @returns
*/ */
function createTreeViewByTree(json, keywords) { function createTreeViewByTree(json, keywords) {
var pathIndex = {}; var pathIndex = {};
var paths = json.paths; var paths = json.paths;
var domain = json.domainUrl;// 服务器代理会返回此属性 var domain = json.domainUrl;// 服务器代理会返回此属性
if(isEmpty(domain)) { var rewriteDomainUrl = json.rewriteDomainUrl;// 服务器代理会返回此属性
domain = "http://" + json.host + json.basePath; if(isEmpty(domain)) {
} domain = "http://" + json.host + json.basePath;
if(domain.endWith("/")) { }
domain = domain.substring(0, domain.length - 1); if(domain.endWith("/")) {
} domain = domain.substring(0, domain.length - 1);
if (isEmptyObject(paths)) { }
return; if (isEmptyObject(paths)) {
} return;
//console.log(paths); }
Object.keys(paths).forEach(function(key){ //console.log(paths);
//console.log(key, paths[key]); Object.keys(paths).forEach(function(key){
if(!findInPathsValue(key, paths[key], keywords)) { //console.log(key, paths[key]);
return; if(!findInPathsValue(key, paths[key], keywords)) {
} return;
var keyArr = key.split("/"); }
var nowPathObj = null; var keyArr = key.split("/");
keyArr.forEach(function(val, index) { var nowPathObj = null;
//console.log(val, index); keyArr.forEach(function(val, index) {
if(isEmpty(val) && index == 0) { //console.log(val, index);
return; if(isEmpty(val) && index == 0) {
} return;
var nowPath = "/" + val; }
if(nowPathObj == null) { var nowPath = "/" + val;
nowPathObj = {}; if(nowPathObj == null) {
nowPathObj[nowPath] = pathIndex[nowPath]; nowPathObj = {};
if(nowPathObj[nowPath] == null) { nowPathObj[nowPath] = pathIndex[nowPath];
nowPathObj[nowPath] = {}; if(nowPathObj[nowPath] == null) {
pathIndex[nowPath] = nowPathObj[nowPath]; nowPathObj[nowPath] = {};
} pathIndex[nowPath] = nowPathObj[nowPath];
} }
var tempPathObj = nowPathObj[nowPath]; }
if(isEmpty(tempPathObj)) { var tempPathObj = nowPathObj[nowPath];
tempPathObj = nowPathObj[nowPath] = {}; if(isEmpty(tempPathObj)) {
} tempPathObj = nowPathObj[nowPath] = {};
nowPathObj = tempPathObj; }
if(index == keyArr.length - 1) { nowPathObj = tempPathObj;
//get, head, post, put, patch, delete, options, trace if(index == keyArr.length - 1) {
setRequestMethodForTree(domain, paths[key], tempPathObj, key, "get"); //get, head, post, put, patch, delete, options, trace
setRequestMethodForTree(domain, paths[key], tempPathObj, key, "head"); setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "get");
setRequestMethodForTree(domain, paths[key], tempPathObj, key, "post"); setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "head");
setRequestMethodForTree(domain, paths[key], tempPathObj, key, "put"); setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "post");
setRequestMethodForTree(domain, paths[key], tempPathObj, key, "patch"); setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "put");
setRequestMethodForTree(domain, paths[key], tempPathObj, key, "delete"); setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "patch");
setRequestMethodForTree(domain, paths[key], tempPathObj, key, "options"); setRequestMethodForTree(rewriteDomainUrl, domain, paths[key], tempPathObj, key, "delete");
setRequestMethodForTree(domain, paths[key], tempPathObj, key, "trace"); 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>'; var htmlStr = '<li>';
htmlStr += '<ul>'; htmlStr += '<a href="#">'+json.info.title+'</a>';
htmlStr += getTreeHtmlForTree(pathIndex, projectTreeIdIndex); htmlStr += '<ul>';
htmlStr += '</ul>'; htmlStr += getTreeHtmlForTree(pathIndex, projectTreeIdIndex);
htmlStr += '</li>'; htmlStr += '</ul>';
$('#apiPathTree .projects').append(htmlStr); htmlStr += '</li>';
projectTreeIdIndex++; $('#apiPathTree .projects').append(htmlStr);
} projectTreeIdIndex++;
}
/**
* 设置对象的各种请求方式,存在则复制 /**
* @param source 资源原始json的paths的指定对象 * 设置对象的各种请求方式,存在则复制
* @param pathObj 当前的待赋值对象 * @param source 资源原始json的paths的指定对象
* @param url url绝对路径 * @param pathObj 当前的待赋值对象
* @param method 请求方式post、get... * @param url url绝对路径
* @returns * @param method 请求方式post、get...
*/ * @returns
function setRequestMethodForTree(domain, source, pathObj, url, method) { */
if (isEmpty(source[method])) { function setRequestMethodForTree(rewriteDomainUrl, domain, source, pathObj, url, method) {
return; if (isEmpty(source[method])) {
} return;
var tempPath = projectTreeIdIndex + url + "." + method; }
pathObj[method] = source[method]; var tempPath = projectTreeIdIndex + url + "." + method;
pathObj[method].path = tempPath; pathObj[method] = source[method];
pathObj[method].url = url; pathObj[method].path = tempPath;
pathObj[method].method = method; pathObj[method].url = url;
pathObj[method].domain = domain; pathObj[method].method = method;
treePathDataMap.set(tempPath, source[method]); pathObj[method].domain = domain;
} pathObj[method].rewriteDomainUrl = rewriteDomainUrl;
treePathDataMap.set(tempPath, source[method]);
/** }
* 将对象列表递归的方式转换成文档格式html字符串
* @param pathData 处理后的对象列表 /**
* @returns 生成的html字符串 * 将对象列表递归的方式转换成文档格式html字符串
*/ * @param pathData 处理后的对象列表
function getTreeHtmlForTree(pathData, treeIdStr) { * @returns 生成的html字符串
var tempStr = ""; */
var indexNow = 1; function getTreeHtmlForTree(pathData, treeIdStr) {
Object.keys(pathData).forEach(function(key){ var tempStr = "";
var tempNode = pathData[key]; var indexNow = 1;
var tempTreeId = treeIdStr + "_" + indexNow; Object.keys(pathData).forEach(function(key){
var nodeSub = getObjectFirstAttributeIfOnly(tempNode); var tempNode = pathData[key];
if(nodeSub != null && isNotEmpty(nodeSub.method)) { var tempTreeId = treeIdStr + "_" + indexNow;
//console.log(nodeSub); var nodeSub = getObjectFirstAttributeIfOnly(tempNode);
nodeSub.treeId = tempTreeId; if(nodeSub != null && isNotEmpty(nodeSub.method)) {
var summary = isEmpty(nodeSub.summary) ? "" : "("+nodeSub.summary+")"; //console.log(nodeSub);
if(summary.length > 10){ nodeSub.treeId = tempTreeId;
summary = summary.substring(0, 10)+"...)";// 防止被撑得太长只显示10个字 var summary = isEmpty(nodeSub.summary) ? "" : "("+nodeSub.summary+")";
} if(summary.length > 10){
tempStr += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+nodeSub.path+'">'+key+'<span>'+summary+'</span></a></li>'; summary = summary.substring(0, 10)+"...)";// 防止被撑得太长只显示10个字
} else if(key.indexOf("/") < 0) { }
//console.log(tempTreeId); tempStr += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+nodeSub.path+'">'+key+'<span>'+summary+'</span></a></li>';
tempNode.treeId = tempTreeId; } else if(key.indexOf("/") < 0) {
var summary = isEmpty(tempNode.summary) ? "" : "("+tempNode.summary+")"; //console.log(tempTreeId);
if(summary.length > 10){ tempNode.treeId = tempTreeId;
summary = summary.substring(0, 10)+"...)";// 防止被撑得太长只显示10个字 var summary = isEmpty(tempNode.summary) ? "" : "("+tempNode.summary+")";
} if(summary.length > 10){
tempStr += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+tempNode.path+'">'+key+'<span>'+summary+'</span></a></li>'; summary = summary.substring(0, 10)+"...)";// 防止被撑得太长只显示10个字
} else { }
tempStr += '<li>'; tempStr += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+tempNode.path+'">'+key+'<span>'+summary+'</span></a></li>';
tempStr += '<a href="#">'+key+'</a>'; } else {
tempStr += '<ul>'; tempStr += '<li>';
tempStr += getTreeHtmlForTree(tempNode, tempTreeId); tempStr += '<a href="#">'+key+'</a>';
tempStr += '</ul>'; tempStr += '<ul>';
tempStr += '</li>'; tempStr += getTreeHtmlForTree(tempNode, tempTreeId);
} tempStr += '</ul>';
indexNow++; tempStr += '</li>';
}); }
return tempStr; indexNow++;
} });
return tempStr;
}

View File

@@ -28,8 +28,9 @@ var defaultUserSettings = {
autoFillParam : 0,// 自动填充参数0=否 1=智能填充 2=全部填充 autoFillParam : 0,// 自动填充参数0=否 1=智能填充 2=全部填充
onlyUseLastParam : 0,// 是否仅使用上次请求参数 onlyUseLastParam : 0,// 是否仅使用上次请求参数
showParamType : 1,// 是否展示字段的类型 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 treeShowType : 1,// 树形菜单展示方式1=tree-angles、2=tree-menu、3=默认4=tree-folders、5=tree-chevrons
forceRewriteDomain: 0,// 强制重写域名 0=否 1=是
projects : [],// 所有的项目列表 projects : [],// 所有的项目列表
removedProjects : [],// 被移除的项目列表 removedProjects : [],// 被移除的项目列表
prevWNow : 360 prevWNow : 360
@@ -331,7 +332,11 @@ $("#apiPathTree").on("click", ".show-doc", function(){
docInfo = getNotEmptyStr(data.summary); 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); $("#simulationResultUrl").text(docUrl);
$("#simulationResultUrlTest").text(data.domain + docUrl + "?zyplayerApiTest=1"); $("#simulationResultUrlTest").text(data.domain + docUrl + "?zyplayerApiTest=1");
@@ -891,19 +896,6 @@ function documentLoadFinish() {
$('#homePageDashboard').dashboard({draggable: false}); $('#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 * @param
@@ -960,7 +952,6 @@ function initUserSettings() {
} }
changeContentWidth(userSettings.prevWNow); changeContentWidth(userSettings.prevWNow);
updateTreeShowType(); updateTreeShowType();
updateUserSettingsUi();
// 增加文档 // 增加文档
getDocumentListByService(); getDocumentListByService();
}); });

View File

@@ -56,12 +56,20 @@
<tr> <tr>
<td class="info">自动填充请求参数</td> <td class="info">自动填充请求参数</td>
<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="1" v-model="autoFillParam">智能填充</label>
<label><input type="radio" name="autoFillParam" value="2" 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>
<td>不填充智能填充只填充flag、time等后缀的参数全部填充对应不上类型的使用“我是默认字符串”填充</td> <td>不填充智能填充只填充flag、time等后缀的参数全部填充对应不上类型的使用“我是默认字符串”填充</td>
</tr> </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> </tbody>
</table> </table>
</div> </div>
@@ -77,25 +85,42 @@
var app = new Vue({ var app = new Vue({
el: '#app', el: '#app',
data: { data: {
initCount: 5, initCount: 6,
catalogShowType: '', catalogShowType: '',
treeShowType: '', treeShowType: '',
showParamType:'', showParamType:'',
onlyUseLastParam: '', onlyUseLastParam: '',
autoFillParam: '', 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: { methods: {
}, },
mounted: function(){ mounted: function(){
getStorage(cacheKeys.userSettings, function(data){ getStorage(cacheKeys.userSettings, function(data){
var empty = isEmpty(data) || isEmptyObject(data);
data = empty ? app.defaultUserSettings : data;
app.userSettings = data; app.userSettings = data;
app.catalogShowType = data.catalogShowType; app.catalogShowType = data.catalogShowType;
app.treeShowType = data.treeShowType; app.treeShowType = data.treeShowType;
app.showParamType = data.showParamType; app.showParamType = data.showParamType;
app.onlyUseLastParam = data.onlyUseLastParam; app.onlyUseLastParam = data.onlyUseLastParam;
app.autoFillParam = data.autoFillParam; app.autoFillParam = data.autoFillParam;
app.forceRewriteDomain = data.forceRewriteDomain;
}); });
}, },
watch: { watch: {
@@ -123,6 +148,10 @@
app.userSettings.autoFillParam = newVal; app.userSettings.autoFillParam = newVal;
storeUserSettings(); storeUserSettings();
}, },
forceRewriteDomain: function(newVal, oldval){
app.userSettings.forceRewriteDomain = newVal;
storeUserSettings();
},
} }
}); });

View File

@@ -14,6 +14,7 @@
<tr> <tr>
<td style="width: 50px;">序号</td> <td style="width: 50px;">序号</td>
<td>地址</td> <td>地址</td>
<td>重写域名地址</td>
<td>持久化时间</td> <td>持久化时间</td>
<td>操作</td> <td>操作</td>
</tr> </tr>
@@ -22,14 +23,16 @@
<tr v-for="(item,index) in swaggerResourcesList" :key="item.id" :data-id="item.id" :data-index="index" > <tr v-for="(item,index) in swaggerResourcesList" :key="item.id" :data-id="item.id" :data-index="index" >
<td>{{index+1}}</td> <td>{{index+1}}</td>
<td>{{item.url}}</td> <td>{{item.url}}</td>
<td>{{item.rewriteDomainUrl}}</td>
<td>{{item.lastSync}}</td> <td>{{item.lastSync}}</td>
<td> <td>
<button class="btn btn-danger" type="button" v-on:click="deleteDocUrl($event)">删除</button> <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>--> <!--<button class="btn btn-danger" type="button" v-on:click="syncDocData($event)">持久化</button>-->
</td> </td>
</tr> </tr>
<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" type="button" v-on:click="btnRefreshList"> 刷新 </button>
<button class="btn btn-info" type="button" v-on:click="exportDocument">导出文档</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> <button class="btn btn-primary" type="button" v-on:click="addNewDocument">增加文档</button>
@@ -48,7 +51,14 @@
<h4 class="modal-title">输入文档地址</h4> <h4 class="modal-title">输入文档地址</h4>
</div> </div>
<div class="modal-body"> <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>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-primary" v-on:click="addNewDocumentBtn">保存</button> <button type="button" class="btn btn-primary" v-on:click="addNewDocumentBtn">保存</button>
@@ -71,7 +81,9 @@
el: '#app', el: '#app',
data: { data: {
swaggerResourcesList: [], swaggerResourcesList: [],
addNewDocumentInput: '' addNewDocumentInput: '',
rewriteDomainUrl: '',
oldUrl: ''
}, },
methods: { methods: {
btnRefreshList: function(){ btnRefreshList: function(){
@@ -84,7 +96,17 @@
app.swaggerResourcesList = data; 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(){ addNewDocument: function(){
app.oldUrl = '';
app.addNewDocumentInput = ''; app.addNewDocumentInput = '';
$('#addNewDocumentModal').modal({moveable:true}); $('#addNewDocumentModal').modal({moveable:true});
}, },
@@ -93,7 +115,12 @@
if(isEmpty(addNewDocumentInput)) { if(isEmpty(addNewDocumentInput)) {
Toast.error("地址不可以为空");return; 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)) { if(validateResult(json)) {
//window.parent.document.location.reload(); //window.parent.document.location.reload();
//app.swaggerResourcesList.push(addNewDocumentInput); //app.swaggerResourcesList.push(addNewDocumentInput);
@@ -144,6 +171,7 @@
<style> <style>
#app{padding-top: 10px;} #app{padding-top: 10px;}
.input-line{margin-bottom: 15px;}
</style> </style>
</html> </html>