From a843964b5e8bdbe37a6d9ecb2648611d8bc1fb0a Mon Sep 17 00:00:00 2001 From: Forget <1771761586@qq.com> Date: Mon, 26 Apr 2021 13:20:10 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8DrequestAdvice=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/power/doc/template/SpringBootDocBuildTemplate.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java b/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java index 3d92c3d..3150b67 100644 --- a/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java +++ b/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java @@ -368,14 +368,12 @@ public class SpringBootDocBuildTemplate implements IDocBuildTemplate { if (Objects.nonNull(configBuilder.getApiConfig().getRequestBodyAdvice()) && Objects.isNull(method.getTagByName(IGNORE_REQUEST_BODY_ADVICE))) { String requestBodyAdvice = configBuilder.getApiConfig().getRequestBodyAdvice().getClassName(); + typeName = configBuilder.getApiConfig().getRequestBodyAdvice().getClassName(); gicTypeName = new StringBuffer() .append(requestBodyAdvice) .append("<") .append(gicTypeName).append(">").toString(); - typeName = new StringBuffer() - .append(requestBodyAdvice) - .append("<") - .append(typeName).append(">").toString(); + } if (JavaClassValidateUtil.isPrimitive(simpleTypeName)) { From a45e890fc8d63904b63580fdc7b74871ac0e08cd Mon Sep 17 00:00:00 2001 From: oppofind <836575280@qq.com> Date: Tue, 27 Apr 2021 22:38:36 +0800 Subject: [PATCH 2/5] ignore HttpHeaders --- src/main/java/com/power/doc/utils/JavaClassValidateUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/power/doc/utils/JavaClassValidateUtil.java b/src/main/java/com/power/doc/utils/JavaClassValidateUtil.java index e563950..f45cc8a 100644 --- a/src/main/java/com/power/doc/utils/JavaClassValidateUtil.java +++ b/src/main/java/com/power/doc/utils/JavaClassValidateUtil.java @@ -235,6 +235,7 @@ public class JavaClassValidateUtil { case "javax.servlet.http.HttpServletResponse": case "org.springframework.web.reactive.function.server.ServerRequest": case "org.springframework.web.multipart.MultipartHttpServletRequest": + case "org.springframework.http.HttpHeaders": return true; default: return false; From f4869361ef819a6a72468122372e02fda1b0f4ab Mon Sep 17 00:00:00 2001 From: Forget <1771761586@qq.com> Date: Wed, 5 May 2021 15:37:46 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E2=80=9Cm=E6=B7=BB=E5=8A=A0=E6=8E=A8?= =?UTF-8?q?=E9=80=81dubbo=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/power/doc/builder/TornaBuilder.java | 196 +------------ .../doc/builder/rpc/RpcTornaBuilder.java | 86 ++++++ .../java/com/power/doc/model/ApiConfig.java | 2 +- .../java/com/power/doc/model/torna/Apis.java | 9 + .../com/power/doc/model/torna/DubboInfo.java | 72 +++++ .../java/com/power/doc/utils/TornaUtil.java | 273 ++++++++++++++++++ 6 files changed, 446 insertions(+), 192 deletions(-) create mode 100644 src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java create mode 100644 src/main/java/com/power/doc/model/torna/DubboInfo.java create mode 100644 src/main/java/com/power/doc/utils/TornaUtil.java diff --git a/src/main/java/com/power/doc/builder/TornaBuilder.java b/src/main/java/com/power/doc/builder/TornaBuilder.java index ed021f7..b42a1a2 100644 --- a/src/main/java/com/power/doc/builder/TornaBuilder.java +++ b/src/main/java/com/power/doc/builder/TornaBuilder.java @@ -34,6 +34,7 @@ import com.power.doc.constants.TornaConstants; import com.power.doc.model.*; import com.power.doc.model.torna.*; import com.power.doc.template.SpringBootDocBuildTemplate; +import com.power.doc.utils.TornaUtil; import com.thoughtworks.qdox.JavaProjectBuilder; import okhttp3.*; import org.apache.commons.lang3.StringUtils; @@ -47,6 +48,7 @@ import java.util.concurrent.TimeUnit; import static com.power.doc.constants.TornaConstants.CATEGORY_CREATE; import static com.power.doc.constants.TornaConstants.PUSH; +import static com.power.doc.utils.TornaUtil.*; /** @@ -87,212 +89,24 @@ public class TornaBuilder { * @param apiConfig ApiConfig */ public static void buildTorna(List apiDocs, ApiConfig apiConfig) { - - //是否设置测试环境 - boolean hasDebugEnv = StringUtils.isNotBlank(apiConfig.getDebugEnvName()) - && - StringUtils.isNotBlank(apiConfig.getDebugEnvUrl()); - - if (apiConfig.isTornaDebug()) { - String sb = "配置信息列表: \n" + - "OpenUrl: " + - apiConfig.getOpenUrl() + - "\n" + - "appToken: " + - apiConfig.getAppToken() + - "\n" + - "appKey: " + - apiConfig.getAppKey() + - "\n" + - "Secret: " + - apiConfig.getSecret() + - "\n"; - System.out.println(sb); - } TornaApi tornaApi = new TornaApi(); - //设置测试环境 - List debugEnvs = new ArrayList<>(); - if (hasDebugEnv) { - DebugEnv debugEnv = new DebugEnv(); - debugEnv.setName(apiConfig.getDebugEnvName()); - debugEnv.setUrl(apiConfig.getDebugEnvUrl()); - debugEnvs.add(debugEnv); - - } - // Apis api; List apisList = new ArrayList<>(); //添加接口数据 for (ApiDoc a : apiDocs) { api = new Apis(); api.setName(StringUtils.isBlank(a.getDesc()) ? a.getName() : a.getDesc()); - api.setItems(buildApis(a, hasDebugEnv)); + api.setItems(buildApis(a.getList(), TornaUtil.setDebugEnv(apiConfig,tornaApi))); api.setIsFolder(TornaConstants.YES); apisList.add(api); } - tornaApi.setDebugEnvs(debugEnvs); tornaApi.setApis(apisList); //推送文档信息 - Map requestJson = - TornaConstants.buildParams(PUSH, new Gson().toJson(tornaApi), apiConfig); + Map requestJson = TornaConstants.buildParams(PUSH, new Gson().toJson(tornaApi), apiConfig); //获取返回结果 String responseMsg = OkHttp3Util.syncPostJson(apiConfig.getOpenUrl(), new Gson().toJson(requestJson)); //开启调试时打印请求信息 - if (apiConfig.isTornaDebug()) { - JsonElement element = JsonParser.parseString(responseMsg); - TornaRequestInfo info = new TornaRequestInfo() - .of() - .setCategory(PUSH) - .setCode(element.getAsJsonObject().get(TornaConstants.CODE).getAsString()) - .setMessage(element.getAsJsonObject().get(TornaConstants.MESSAGE).getAsString()) - .setRequestInfo(requestJson) - .setResponseInfo(responseMsg); - System.out.println(info.buildInfo()); - } + TornaUtil.printDebugInfo(apiConfig,responseMsg,requestJson); } - - /** - * build apis - * @param a api - * @param hasDebugEnv has debug environment - * @return List of Api - */ - public static List buildApis(ApiDoc a, boolean hasDebugEnv) { - List apiMethodDocs = a.getList(); - //参数列表 - List apis = new ArrayList<>(); - Apis methodApi; - //遍历分类接口 - for (ApiMethodDoc apiMethodDoc : apiMethodDocs) { - /** - * "name": "获取商品信息", - * "description": "获取商品信息", - * "url": "/goods/get", - * "httpMethod": "GET", - * "contentType": "application/json", - * "isFolder": "1", - * "parentId": "", - * "isShow": "1", - */ - methodApi = new Apis(); - methodApi.setIsFolder(TornaConstants.NO); - methodApi.setName(apiMethodDoc.getDesc()); - methodApi.setUrl(hasDebugEnv ? apiMethodDoc.getPath() : apiMethodDoc.getUrl()); - methodApi.setHttpMethod(apiMethodDoc.getType()); - methodApi.setContentType(apiMethodDoc.getContentType()); - methodApi.setDescription(apiMethodDoc.getDetail()); - methodApi.setIsShow(TornaConstants.YES); - - /** - * { - * "name": "goodsName", - * "type": "string", - * "required": "1", - * "maxLength": "128", - * "example": "iphone12", - * "description": "商品名称描述", - * "parentId": "", - * "enumInfo": { - * "name": "支付枚举", - * "description": "支付状态", - * "items": [ - * { - * "name": "WAIT_PAY", - * "type": "string", - * "value": "0", - * "description": "未支付" - * } - * ] - * } - * } - */ - methodApi.setHeaderParams(buildHerder(apiMethodDoc.getRequestHeaders())); - methodApi.setResponseParams(buildParams(apiMethodDoc.getResponseParams())); - //Path - if (CollectionUtil.isNotEmpty(apiMethodDoc.getPathParams())) { - methodApi.setPathParams(buildParams(apiMethodDoc.getPathParams())); - } - //formData - if (CollectionUtil.isNotEmpty(apiMethodDoc.getQueryParams())) { - methodApi.setRequestParams(buildParams(apiMethodDoc.getQueryParams())); - } - //Json - if (CollectionUtil.isNotEmpty(apiMethodDoc.getRequestParams())) { - methodApi.setRequestParams(buildParams(apiMethodDoc.getRequestParams())); - } - apis.add(methodApi); - } - return apis; - } - - /** - * build request header - * - * @param apiReqHeaders 请求头参数列表 - * @return List of HttpParam - */ - public static List buildHerder(List apiReqHeaders) { - /** - * name": "token", - * "required": "1", - * "example": "iphone12", - * "description": "商品名称描述" - */ - HttpParam httpParam; - List headers = new ArrayList<>(); - for (ApiReqHeader header : apiReqHeaders) { - httpParam = new HttpParam(); - httpParam.setName(header.getName()); - httpParam.setRequired(header.isRequired() ? TornaConstants.YES : TornaConstants.NO); - httpParam.setExample(StringUtil.removeQuotes(header.getValue())); - httpParam.setDescription(header.getDesc()); - headers.add(httpParam); - } - return headers; - } - - /** - * build request response params - * - * @param apiParams 参数列表 - * @return List of HttpParam - */ - public static List buildParams(List apiParams) { - HttpParam httpParam; - List bodies = new ArrayList<>(); - /** - * "name": "goodsName", - * "type": "string", - * "required": "1", - * "maxLength": "128", - * "example": "iphone12", - * "description": "商品名称描述", - * "parentId": "", - * "enumInfo": { - * "name": "支付枚举", - * "description": "支付状态", - * "items": [ - * { - * "name": "WAIT_PAY", - * "type": "string", - * "value": "0", - * "description": "未支付" - */ - for (ApiParam apiParam : apiParams) { - httpParam = new HttpParam(); - httpParam.setName(apiParam.getField()); - httpParam.setMaxLength(apiParam.getMaxLength()); - httpParam.setType(apiParam.getType()); - httpParam.setRequired(apiParam.isRequired() ? TornaConstants.YES : TornaConstants.NO); - httpParam.setExample(StringUtil.removeQuotes(apiParam.getValue())); - httpParam.setDescription(apiParam.getDesc()); - if (apiParam.getChildren() != null) { - httpParam.setChildren(buildParams(apiParam.getChildren())); - } - bodies.add(httpParam); - } - return bodies; - } - } diff --git a/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java b/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java new file mode 100644 index 0000000..a91c6fb --- /dev/null +++ b/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java @@ -0,0 +1,86 @@ +package com.power.doc.builder.rpc; + +import com.google.gson.Gson; +import com.power.common.util.OkHttp3Util; +import com.power.doc.builder.DocBuilderTemplate; +import com.power.doc.builder.ProjectDocConfigBuilder; +import com.power.doc.constants.TornaConstants; +import com.power.doc.model.ApiConfig; +import com.power.doc.model.ApiDoc; +import com.power.doc.model.rpc.RpcApiDoc; +import com.power.doc.model.torna.Apis; +import com.power.doc.model.torna.DubboInfo; +import com.power.doc.model.torna.TornaApi; +import com.power.doc.template.RpcDocBuildTemplate; +import com.power.doc.template.SpringBootDocBuildTemplate; +import com.power.doc.utils.TornaUtil; +import com.thoughtworks.qdox.JavaProjectBuilder; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static com.power.doc.constants.TornaConstants.PUSH; +import static com.power.doc.utils.TornaUtil.buildApis; +import static com.power.doc.utils.TornaUtil.buildDubboApis; + +/** + * @author xingzi + * @date 2021/4/28 16:14 + **/ +public class RpcTornaBuilder { + /** + * build controller api + * + * @param config config + */ + public static void buildApiDoc(ApiConfig config) { + JavaProjectBuilder javaProjectBuilder = new JavaProjectBuilder(); + buildApiDoc(config, javaProjectBuilder); + } + + + /** + * Only for smart-doc maven plugin and gradle plugin. + * + * @param config ApiConfig + * @param javaProjectBuilder ProjectDocConfigBuilder + */ + public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectBuilder) { + config.setParamsDataToTree(true); + RpcDocBuilderTemplate builderTemplate = new RpcDocBuilderTemplate(); + builderTemplate.checkAndInit(config); + ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder); + RpcDocBuildTemplate docBuildTemplate = new RpcDocBuildTemplate(); + List apiDocList = docBuildTemplate.getApiData(configBuilder); + buildTorna(apiDocList, config); + } + + public static void buildTorna(List apiDocs, ApiConfig apiConfig) { + TornaApi tornaApi = new TornaApi(); + Apis api; + List apisList = new ArrayList<>(); + //添加接口数据 + for (RpcApiDoc a : apiDocs) { + api = new Apis(); + api.setName(StringUtils.isBlank(a.getDesc()) ? a.getName() : a.getDesc()); + TornaUtil.setDebugEnv(apiConfig,tornaApi); + api.setItems(buildDubboApis(a.getList())); + api.setIsFolder(TornaConstants.YES); + api.setDubboInfo(new DubboInfo().builder() + .setAuthor(a.getAuthor()) + .setProtocol(a.getProtocol()) + .setVersion(a.getVersion()) + .setInterfaceName(a.getName())); + apisList.add(api); + } + tornaApi.setApis(apisList); + //推送文档信息 + Map requestJson = TornaConstants.buildParams(PUSH, new Gson().toJson(tornaApi), apiConfig); + //获取返回结果 + String responseMsg = OkHttp3Util.syncPostJson(apiConfig.getOpenUrl(), new Gson().toJson(requestJson)); + //开启调试时打印请求信息 + TornaUtil.printDebugInfo(apiConfig,responseMsg,requestJson); + } +} diff --git a/src/main/java/com/power/doc/model/ApiConfig.java b/src/main/java/com/power/doc/model/ApiConfig.java index 517c670..440d517 100644 --- a/src/main/java/com/power/doc/model/ApiConfig.java +++ b/src/main/java/com/power/doc/model/ApiConfig.java @@ -321,7 +321,7 @@ public class ApiConfig { /** * torna调试开关 */ - private boolean tornaDebug; + private boolean tornaDebug = true; /** * 是否为dubbo */ diff --git a/src/main/java/com/power/doc/model/torna/Apis.java b/src/main/java/com/power/doc/model/torna/Apis.java index debec17..6055440 100644 --- a/src/main/java/com/power/doc/model/torna/Apis.java +++ b/src/main/java/com/power/doc/model/torna/Apis.java @@ -36,6 +36,7 @@ public class Apis { private String isFolder; private String parentId; private String isShow; + private DubboInfo dubboInfo; private List headerParams; private List pathParams; private List requestParams; @@ -153,6 +154,14 @@ public class Apis { return items; } + public DubboInfo getDubboInfo() { + return dubboInfo; + } + + public void setDubboInfo(DubboInfo dubboInfo) { + this.dubboInfo = dubboInfo; + } + public void setItems(List items) { this.items = items; } diff --git a/src/main/java/com/power/doc/model/torna/DubboInfo.java b/src/main/java/com/power/doc/model/torna/DubboInfo.java new file mode 100644 index 0000000..1856319 --- /dev/null +++ b/src/main/java/com/power/doc/model/torna/DubboInfo.java @@ -0,0 +1,72 @@ +package com.power.doc.model.torna; + +/** + * @author xingzi + * @date 2021/4/28 12:54 + **/ +public class DubboInfo { + private String interfaceName; + private String author; + private String version; + private String protocol; + private String dependency; + + public DubboInfo builder(){ + return new DubboInfo(); + } + public String getInterfaceName() { + return interfaceName; + } + + public DubboInfo setInterfaceName(String interfaceName) { + this.interfaceName = interfaceName; + return this; + } + + public String getAuthor() { + return author; + } + + public DubboInfo setAuthor(String author) { + this.author = author; + return this; + } + + public String getVersion() { + return version; + } + + public DubboInfo setVersion(String version) { + this.version = version; + return this; + } + + public String getProtocol() { + return protocol; + } + + public DubboInfo setProtocol(String protocol) { + this.protocol = protocol; + return this; + } + + public String getDependency() { + return dependency; + } + + public DubboInfo setDependency(String dependency) { + this.dependency = dependency; + return this; + } + + @Override + public String toString() { + return "DubboInfo{" + + "interfaceName='" + interfaceName + '\'' + + ", author='" + author + '\'' + + ", version='" + version + '\'' + + ", protocol='" + protocol + '\'' + + ", dependency='" + dependency + '\'' + + '}'; + } +} diff --git a/src/main/java/com/power/doc/utils/TornaUtil.java b/src/main/java/com/power/doc/utils/TornaUtil.java new file mode 100644 index 0000000..6d5e043 --- /dev/null +++ b/src/main/java/com/power/doc/utils/TornaUtil.java @@ -0,0 +1,273 @@ +package com.power.doc.utils; + +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.power.common.util.CollectionUtil; +import com.power.common.util.StringUtil; +import com.power.doc.constants.TornaConstants; +import com.power.doc.model.*; +import com.power.doc.model.torna.*; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static com.power.doc.constants.TornaConstants.PUSH; + +/** + * @author xingzi + * @date 2021/4/28 16:15 + **/ +public class TornaUtil { + + public static boolean setDebugEnv(ApiConfig apiConfig, TornaApi tornaApi) { + //是否设置测试环境 + boolean hasDebugEnv = StringUtils.isNotBlank(apiConfig.getDebugEnvName()) + && + StringUtils.isNotBlank(apiConfig.getDebugEnvUrl()); + //设置测试环境 + List debugEnvs = new ArrayList<>(); + if (hasDebugEnv) { + DebugEnv debugEnv = new DebugEnv(); + debugEnv.setName(apiConfig.getDebugEnvName()); + debugEnv.setUrl(apiConfig.getDebugEnvUrl()); + debugEnvs.add(debugEnv); + } + tornaApi.setDebugEnvs(debugEnvs); + return hasDebugEnv; + } + + public static void printDebugInfo(ApiConfig apiConfig , String responseMsg, Map requestJson) { + if (apiConfig.isTornaDebug()) { + String sb = "配置信息列表: \n" + + "OpenUrl: " + + apiConfig.getOpenUrl() + + "\n" + + "appToken: " + + apiConfig.getAppToken() + + "\n" + + "appKey: " + + apiConfig.getAppKey() + + "\n" + + "Secret: " + + apiConfig.getSecret() + + "\n"; + System.out.println(sb); + JsonElement element = JsonParser.parseString(responseMsg); + TornaRequestInfo info = new TornaRequestInfo() + .of() + .setCategory(PUSH) + .setCode(element.getAsJsonObject().get(TornaConstants.CODE).getAsString()) + .setMessage(element.getAsJsonObject().get(TornaConstants.MESSAGE).getAsString()) + .setRequestInfo(requestJson) + .setResponseInfo(responseMsg); + System.out.println(info.buildInfo()); + } + } + + /** + * build apis + * + * @param apiMethodDocs apiMethodDocs + * @param hasDebugEnv has debug environment + * @return List of Api + */ + public static List buildApis(List apiMethodDocs, boolean hasDebugEnv) { + //参数列表 + List apis = new ArrayList<>(); + Apis methodApi; + //遍历分类接口 + for (ApiMethodDoc apiMethodDoc : apiMethodDocs) { + /** + * "name": "获取商品信息", + * "description": "获取商品信息", + * "url": "/goods/get", + * "httpMethod": "GET", + * "contentType": "application/json", + * "isFolder": "1", + * "parentId": "", + * "isShow": "1", + */ + methodApi = new Apis(); + methodApi.setIsFolder(TornaConstants.NO); + methodApi.setName(apiMethodDoc.getDesc()); + methodApi.setUrl(hasDebugEnv ? apiMethodDoc.getPath() : apiMethodDoc.getUrl()); + methodApi.setHttpMethod(apiMethodDoc.getType()); + methodApi.setContentType(apiMethodDoc.getContentType()); + methodApi.setDescription(apiMethodDoc.getDetail()); + methodApi.setIsShow(TornaConstants.YES); + + /** + * { + * "name": "goodsName", + * "type": "string", + * "required": "1", + * "maxLength": "128", + * "example": "iphone12", + * "description": "商品名称描述", + * "parentId": "", + * "enumInfo": { + * "name": "支付枚举", + * "description": "支付状态", + * "items": [ + * { + * "name": "WAIT_PAY", + * "type": "string", + * "value": "0", + * "description": "未支付" + * } + * ] + * } + * } + */ + methodApi.setHeaderParams(buildHerder(apiMethodDoc.getRequestHeaders())); + methodApi.setResponseParams(buildParams(apiMethodDoc.getResponseParams())); + //Path + if (CollectionUtil.isNotEmpty(apiMethodDoc.getPathParams())) { + methodApi.setPathParams(buildParams(apiMethodDoc.getPathParams())); + } + //formData + if (CollectionUtil.isNotEmpty(apiMethodDoc.getQueryParams())) { + methodApi.setRequestParams(buildParams(apiMethodDoc.getQueryParams())); + } + //Json + if (CollectionUtil.isNotEmpty(apiMethodDoc.getRequestParams())) { + methodApi.setRequestParams(buildParams(apiMethodDoc.getRequestParams())); + } + apis.add(methodApi); + } + return apis; + } + + /** + * build apis + * + * @param apiMethodDocs apiMethodDocs + * @return List of Api + */ + public static List buildDubboApis(List apiMethodDocs) { + //参数列表 + List apis = new ArrayList<>(); + Apis methodApi; + //遍历分类接口 + for (JavaMethodDoc apiMethodDoc : apiMethodDocs) { + /** + * "name": "获取商品信息", + * "description": "获取商品信息", + * "url": "/goods/get", + * "httpMethod": "GET", + * "contentType": "application/json", + * "isFolder": "1", + * "parentId": "", + * "isShow": "1", + */ + methodApi = new Apis(); + methodApi.setIsFolder(TornaConstants.NO); + methodApi.setName(apiMethodDoc.getDesc()); + methodApi.setDescription(apiMethodDoc.getDetail()); + methodApi.setIsShow(TornaConstants.YES); + methodApi.setUrl(apiMethodDoc.getMethodDefinition()); + + /** + * { + * "name": "goodsName", + * "type": "string", + * "required": "1", + * "maxLength": "128", + * "example": "iphone12", + * "description": "商品名称描述", + * "parentId": "", + * "enumInfo": { + * "name": "支付枚举", + * "description": "支付状态", + * "items": [ + * { + * "name": "WAIT_PAY", + * "type": "string", + * "value": "0", + * "description": "未支付" + * } + * ] + * } + * } + */ + methodApi.setResponseParams(buildParams(apiMethodDoc.getResponseParams())); + //Json + if (CollectionUtil.isNotEmpty(apiMethodDoc.getRequestParams())) { + methodApi.setRequestParams(buildParams(apiMethodDoc.getRequestParams())); + } + apis.add(methodApi); + } + return apis; + } + + /** + * build request header + * + * @param apiReqHeaders 请求头参数列表 + * @return List of HttpParam + */ + public static List buildHerder(List apiReqHeaders) { + /** + * name": "token", + * "required": "1", + * "example": "iphone12", + * "description": "商品名称描述" + */ + HttpParam httpParam; + List headers = new ArrayList<>(); + for (ApiReqHeader header : apiReqHeaders) { + httpParam = new HttpParam(); + httpParam.setName(header.getName()); + httpParam.setRequired(header.isRequired() ? TornaConstants.YES : TornaConstants.NO); + httpParam.setExample(StringUtil.removeQuotes(header.getValue())); + httpParam.setDescription(header.getDesc()); + headers.add(httpParam); + } + return headers; + } + + /** + * build request response params + * + * @param apiParams 参数列表 + * @return List of HttpParam + */ + public static List buildParams(List apiParams) { + HttpParam httpParam; + List bodies = new ArrayList<>(); + /** + * "name": "goodsName", + * "type": "string", + * "required": "1", + * "maxLength": "128", + * "example": "iphone12", + * "description": "商品名称描述", + * "parentId": "", + * "enumInfo": { + * "name": "支付枚举", + * "description": "支付状态", + * "items": [ + * { + * "name": "WAIT_PAY", + * "type": "string", + * "value": "0", + * "description": "未支付" + */ + for (ApiParam apiParam : apiParams) { + httpParam = new HttpParam(); + httpParam.setName(apiParam.getField()); + httpParam.setMaxLength(apiParam.getMaxLength()); + httpParam.setType(apiParam.getType()); + httpParam.setRequired(apiParam.isRequired() ? TornaConstants.YES : TornaConstants.NO); + httpParam.setExample(StringUtil.removeQuotes(apiParam.getValue())); + httpParam.setDescription(apiParam.getDesc()); + if (apiParam.getChildren() != null) { + httpParam.setChildren(buildParams(apiParam.getChildren())); + } + bodies.add(httpParam); + } + return bodies; + } +} From 302e12b03e2ee833c4fdfe08ea97cee670d2e2ce Mon Sep 17 00:00:00 2001 From: Forget <1771761586@qq.com> Date: Wed, 5 May 2021 20:20:34 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9requestAdvice=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=A0=B7=E4=BE=8B=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doc/builder/rpc/RpcTornaBuilder.java | 1 + .../power/doc/model/rpc/RpcApiDependency.java | 9 +++++ .../template/SpringBootDocBuildTemplate.java | 11 +++--- .../com/power/doc/utils/JavaClassUtil.java | 3 +- .../java/com/power/doc/utils/TornaUtil.java | 14 +++++++- src/test/java/com/power/doc/ApiDocTest.java | 35 ++++++++++++------- 6 files changed, 55 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java b/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java index a91c6fb..d63e2eb 100644 --- a/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java +++ b/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java @@ -72,6 +72,7 @@ public class RpcTornaBuilder { .setAuthor(a.getAuthor()) .setProtocol(a.getProtocol()) .setVersion(a.getVersion()) + .setDependency(TornaUtil.buildDependencies(apiConfig.getRpcApiDependencies())) .setInterfaceName(a.getName())); apisList.add(api); } diff --git a/src/main/java/com/power/doc/model/rpc/RpcApiDependency.java b/src/main/java/com/power/doc/model/rpc/RpcApiDependency.java index 36e4fb9..0dc581e 100644 --- a/src/main/java/com/power/doc/model/rpc/RpcApiDependency.java +++ b/src/main/java/com/power/doc/model/rpc/RpcApiDependency.java @@ -63,4 +63,13 @@ public class RpcApiDependency { this.version = version; return this; } + + @Override + public String toString() { + return ""+"\r"+ + "\t"+"" + groupId + "" +"\n"+ + "\t"+"" + artifactId + "" +"\n"+ + "\t"+ "" + version + "" +""+ + "\r"+""; + } } diff --git a/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java b/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java index 3150b67..b92bd68 100644 --- a/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java +++ b/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java @@ -369,10 +369,7 @@ public class SpringBootDocBuildTemplate implements IDocBuildTemplate { && Objects.isNull(method.getTagByName(IGNORE_REQUEST_BODY_ADVICE))) { String requestBodyAdvice = configBuilder.getApiConfig().getRequestBodyAdvice().getClassName(); typeName = configBuilder.getApiConfig().getRequestBodyAdvice().getClassName(); - gicTypeName = new StringBuffer() - .append(requestBodyAdvice) - .append("<") - .append(gicTypeName).append(">").toString(); + gicTypeName = requestBodyAdvice + "<" + gicTypeName + ">"; } @@ -661,6 +658,12 @@ public class SpringBootDocBuildTemplate implements IDocBuildTemplate { throw new RuntimeException("You have use @RequestBody Passing multiple variables for method " + javaMethod.getName() + " in " + className + ",@RequestBody annotation could only bind one variables."); } + if (Objects.nonNull(builder.getApiConfig().getRequestBodyAdvice()) + && Objects.isNull(javaMethod.getTagByName(IGNORE_REQUEST_BODY_ADVICE))) { + String requestBodyAdvice = builder.getApiConfig().getRequestBodyAdvice().getClassName(); + fullTypeName = typeName = requestBodyAdvice + "<" + typeName + ">"; + + } requestBodyCounter++; isRequestBody = true; } diff --git a/src/main/java/com/power/doc/utils/JavaClassUtil.java b/src/main/java/com/power/doc/utils/JavaClassUtil.java index b6a7704..cd81a42 100644 --- a/src/main/java/com/power/doc/utils/JavaClassUtil.java +++ b/src/main/java/com/power/doc/utils/JavaClassUtil.java @@ -508,7 +508,8 @@ public class JavaClassUtil { c = c.getSuperclass(); } } catch (ClassNotFoundException e) { - e.printStackTrace(); + e.getMessage(); + return false; } return false; } diff --git a/src/main/java/com/power/doc/utils/TornaUtil.java b/src/main/java/com/power/doc/utils/TornaUtil.java index 6d5e043..9fa5442 100644 --- a/src/main/java/com/power/doc/utils/TornaUtil.java +++ b/src/main/java/com/power/doc/utils/TornaUtil.java @@ -6,6 +6,7 @@ import com.power.common.util.CollectionUtil; import com.power.common.util.StringUtil; import com.power.doc.constants.TornaConstants; import com.power.doc.model.*; +import com.power.doc.model.rpc.RpcApiDependency; import com.power.doc.model.torna.*; import org.apache.commons.lang3.StringUtils; @@ -38,7 +39,7 @@ public class TornaUtil { return hasDebugEnv; } - public static void printDebugInfo(ApiConfig apiConfig , String responseMsg, Map requestJson) { + public static void printDebugInfo(ApiConfig apiConfig, String responseMsg, Map requestJson) { if (apiConfig.isTornaDebug()) { String sb = "配置信息列表: \n" + "OpenUrl: " + @@ -270,4 +271,15 @@ public class TornaUtil { } return bodies; } + + public static String buildDependencies(List dependencies) { + StringBuilder s = new StringBuilder(); + if (CollectionUtil.isNotEmpty(dependencies)) { + for (RpcApiDependency r : dependencies) { + s.append(r.toString()) + .append("\n\n"); + } + } + return s.toString(); + } } diff --git a/src/test/java/com/power/doc/ApiDocTest.java b/src/test/java/com/power/doc/ApiDocTest.java index 4d44f54..a6fdd60 100644 --- a/src/test/java/com/power/doc/ApiDocTest.java +++ b/src/test/java/com/power/doc/ApiDocTest.java @@ -5,8 +5,11 @@ import com.power.doc.builder.HtmlApiDocBuilder; import com.power.doc.builder.OpenApiBuilder; import com.power.doc.builder.PostmanJsonBuilder; import com.power.doc.builder.TornaBuilder; +import com.power.doc.builder.rpc.RpcHtmlBuilder; +import com.power.doc.builder.rpc.RpcTornaBuilder; import com.power.doc.enums.OrderEnum; import com.power.doc.model.*; +import com.power.doc.model.rpc.RpcApiDependency; import org.junit.Test; import java.io.UnsupportedEncodingException; @@ -30,15 +33,15 @@ public class ApiDocTest { list.add("aa"); list.contains("aa"); ApiConfig config = new ApiConfig(); - config.setServerUrl("http://localhost:8080"); + config.setServerUrl("http://127.0.0.1:8899"); //config.setStrict(true); - config.setOpenUrl("http://torna.opensphere.cn/api/"); + config.setOpenUrl("http://127.0.0.1:8899/api"); config.setAppKey("20201216788835306945118208"); - config.setAppToken("2f9a7d3858a147b7845ebb48785d4dc7"); + config.setAppToken("c16931fa6590483fb7a4e85340fcbfef"); config.setSecret("W.ZyGMOB9Q0UqujVxnfi@.I#V&tUUYZR"); config.setDebugEnvName("测试环境"); config.setDebugEnvUrl("http://127.0.0.1"); - config.setTornaDebug(true); + //config.setTornaDebug(true); config.setAllInOne(true); config.setOutPath("d:\\md3"); @@ -51,7 +54,7 @@ public class ApiDocTest { //SourcePath.path().setPath("F:\\Personal\\project\\smart\\src\\main\\java") //SourcePath.path().setDesc("加载项目外代码").setPath("E:\\ApplicationPower\\ApplicationPower\\Common-util\\src\\main\\java") ); - config.setPackageFilters("com.power.doc.controller.UserController"); + config.setPackageFilters("com.power.doc.dubbo.*"); config.setDataDictionaries( ApiDataDictionary.builder().setTitle("订单字典").setEnumClass(OrderEnum.class).setCodeField("code").setDescField("desc") ); @@ -78,23 +81,31 @@ public class ApiDocTest { ); - config.setPackageFilters("com.power.doc.controller.UserController"); + config.setPackageFilters("com.power.doc.dubbo.*,com.power.doc.controller.UserController"); //非必须只有当setAllInOne设置为true时文档变更记录才生效,https://gitee.com/sunyurepository/ApplicationPower/issues/IPS4O config.setRevisionLogs( RevisionLog.builder().setRevisionTime("2018/12/15").setAuthor("chen").setRemarks("测试").setStatus("创建").setVersion("V1.0"), RevisionLog.builder().setRevisionTime("2018/12/16").setAuthor("chen2").setRemarks("测试2").setStatus("修改").setVersion("V2.0") ); -// config.setResponseBodyAdvice(ResponseBodyAdvice.builder() -// .setDataField("data") -// .setDataField("dadada") -// .setClassName("com.power.common.model.CommonResult")); - - + config.setResponseBodyAdvice(BodyAdvice.builder() + .setDataField("data") + .setDataField("dadada") + .setClassName("com.power.common.model.CommonResult")); + config.setRequestBodyAdvice(BodyAdvice.builder() + .setDataField("data") + .setDataField("dadada") + .setClassName("com.power.common.model.CommonResult")); + config.setRpcApiDependencies(RpcApiDependency.builder().setGroupId("com.test").setArtifactId("test1").setVersion("1.0"), + RpcApiDependency.builder().setGroupId("com.smart").setArtifactId("test").setVersion("1.1.1") + ); long start = System.currentTimeMillis(); //TornaBuilder.buildApiDoc(config); //OpenApiBuilder.buildOpenApi(config); HtmlApiDocBuilder.buildApiDoc(config); + //RpcTornaBuilder.buildApiDoc(config); + TornaBuilder.buildApiDoc(config); + // RpcHtmlBuilder.buildApiDoc(config); long end = System.currentTimeMillis(); DateTimeUtil.printRunTime(end, start); } From a696a247c28beebb3847dce1092b2d4f94a01cff Mon Sep 17 00:00:00 2001 From: oppofind <836575280@qq.com> Date: Wed, 5 May 2021 22:16:06 +0800 Subject: [PATCH 5/5] release 2.1.5 --- CHANGELOG.md | 5 +++++ pom.xml | 2 +- .../java/com/power/doc/builder/rpc/RpcTornaBuilder.java | 8 ++------ src/main/java/com/power/doc/model/torna/DubboInfo.java | 3 +-- src/main/java/com/power/doc/utils/TornaUtil.java | 3 +-- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d839a86..50dd3b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ ## smart-doc版本 版本小于1.0都属于试用,正式1.0起始发布将会等到文中提到的问题解决后才发布。 +#### 版本号:2.1.5 +- 更新日期: 2020-05-05 +- 更新内容: + 1. 修复requestBodyAdvice请求样例丢之。 + 2. 添加dubbo文档到torna的推送。 #### 版本号:2.1.4 - 更新日期: 2020-04-24 - 更新内容: diff --git a/pom.xml b/pom.xml index bb529aa..54ec7f3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 smart-doc jar - 2.1.4 + 2.1.5 smart-doc https://github.com/smart-doc-group/smart-doc.git diff --git a/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java b/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java index d63e2eb..05ee855 100644 --- a/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java +++ b/src/main/java/com/power/doc/builder/rpc/RpcTornaBuilder.java @@ -2,17 +2,14 @@ package com.power.doc.builder.rpc; import com.google.gson.Gson; import com.power.common.util.OkHttp3Util; -import com.power.doc.builder.DocBuilderTemplate; import com.power.doc.builder.ProjectDocConfigBuilder; import com.power.doc.constants.TornaConstants; import com.power.doc.model.ApiConfig; -import com.power.doc.model.ApiDoc; import com.power.doc.model.rpc.RpcApiDoc; import com.power.doc.model.torna.Apis; import com.power.doc.model.torna.DubboInfo; import com.power.doc.model.torna.TornaApi; import com.power.doc.template.RpcDocBuildTemplate; -import com.power.doc.template.SpringBootDocBuildTemplate; import com.power.doc.utils.TornaUtil; import com.thoughtworks.qdox.JavaProjectBuilder; import org.apache.commons.lang3.StringUtils; @@ -22,14 +19,13 @@ import java.util.List; import java.util.Map; import static com.power.doc.constants.TornaConstants.PUSH; -import static com.power.doc.utils.TornaUtil.buildApis; import static com.power.doc.utils.TornaUtil.buildDubboApis; /** - * @author xingzi - * @date 2021/4/28 16:14 + * @author xingzi 2021/4/28 16:14 **/ public class RpcTornaBuilder { + /** * build controller api * diff --git a/src/main/java/com/power/doc/model/torna/DubboInfo.java b/src/main/java/com/power/doc/model/torna/DubboInfo.java index 1856319..bec357d 100644 --- a/src/main/java/com/power/doc/model/torna/DubboInfo.java +++ b/src/main/java/com/power/doc/model/torna/DubboInfo.java @@ -1,8 +1,7 @@ package com.power.doc.model.torna; /** - * @author xingzi - * @date 2021/4/28 12:54 + * @author xingzi 2021/4/28 12:54 **/ public class DubboInfo { private String interfaceName; diff --git a/src/main/java/com/power/doc/utils/TornaUtil.java b/src/main/java/com/power/doc/utils/TornaUtil.java index 9fa5442..fa06ba5 100644 --- a/src/main/java/com/power/doc/utils/TornaUtil.java +++ b/src/main/java/com/power/doc/utils/TornaUtil.java @@ -17,8 +17,7 @@ import java.util.Map; import static com.power.doc.constants.TornaConstants.PUSH; /** - * @author xingzi - * @date 2021/4/28 16:15 + * @author xingzi 2021/4/28 16:15 **/ public class TornaUtil {