From 7dab8da699ae9f1c62bdf93d404579a3211b69e5 Mon Sep 17 00:00:00 2001 From: tanghc Date: Mon, 17 Aug 2020 16:51:33 +0800 Subject: [PATCH] 4.0.3 --- changelog.md | 5 ++ doc/docs/files/10041_编写文档.md | 6 +- sop-admin/sop-admin-server/pom.xml | 2 +- sop-auth/pom.xml | 2 +- sop-common/sop-bridge-eureka/pom.xml | 4 +- sop-common/sop-bridge-nacos/pom.xml | 4 +- sop-common/sop-gateway-common/pom.xml | 2 +- sop-common/sop-service-common/pom.xml | 2 +- .../sop/servercommon/annotation/BizCode.java | 37 ++++++++ .../sop/servercommon/annotation/Open.java | 5 ++ .../configuration/ServiceConfiguration.java | 15 ++++ .../CustomSwaggerParameterBuilder.java | 19 ++++ .../DocumentationPluginsManagerExt.java | 87 +++++++++++++++++++ sop-example/sop-springmvc/pom.xml | 2 +- sop-example/sop-story/pom.xml | 2 +- .../Example1001_BaseController.java | 13 ++- .../storyweb/controller/param/StoryParam.java | 2 + .../controller/result/StoryResult.java | 5 +- sop-gateway/pom.xml | 2 +- sop-website/pom.xml | 2 +- .../gitee/sop/websiteserver/bean/BizCode.java | 13 +++ .../gitee/sop/websiteserver/bean/DocItem.java | 1 + .../manager/SwaggerDocParser.java | 20 ++++- .../main/resources/public/pages/doc/doc.html | 23 +++++ .../resources/public/pages/doc/docEvent.js | 19 ++++ 25 files changed, 276 insertions(+), 18 deletions(-) create mode 100644 sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/BizCode.java create mode 100644 sop-website/src/main/java/com/gitee/sop/websiteserver/bean/BizCode.java diff --git a/changelog.md b/changelog.md index 27ea95c3..2fb8a76c 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,10 @@ # changelog +## 4.0.3 + +- 可定义业务错误码(见`@Open`注解中的`bizCode`属性) +- 文档参数可指定最大长度(使用`@Length(max = xx)`) + ## 4.0.2 - 支持swagger排序(position属性) diff --git a/doc/docs/files/10041_编写文档.md b/doc/docs/files/10041_编写文档.md index 25ad741e..c17cdb5f 100644 --- a/doc/docs/files/10041_编写文档.md +++ b/doc/docs/files/10041_编写文档.md @@ -84,7 +84,11 @@ public class StoryResult { * @return */ @ApiOperation(value = "获取故事信息", notes = "说明接口的详细信息,介绍,用途,注意事项等。") -@Open(value = "alipay.story.find") +@Open(value = "alipay.story.find", bizCode = { + // 定义业务错误码,用于文档显示 + @BizCode(code = "100001", msg = "姓名错误", solution = "填写正确的姓名"), + @BizCode(code = "100002", msg = "备注错误", solution = "填写正确备注"), + }) public StoryResult getStory2(StoryParam story) { log.info("获取故事信息参数, story: {}", story); // 获取其它参数 diff --git a/sop-admin/sop-admin-server/pom.xml b/sop-admin/sop-admin-server/pom.xml index f49439d7..54b00d40 100644 --- a/sop-admin/sop-admin-server/pom.xml +++ b/sop-admin/sop-admin-server/pom.xml @@ -24,7 +24,7 @@ com.gitee.sop sop-bridge-nacos - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT diff --git a/sop-auth/pom.xml b/sop-auth/pom.xml index c6406bf2..dde8a818 100644 --- a/sop-auth/pom.xml +++ b/sop-auth/pom.xml @@ -25,7 +25,7 @@ com.gitee.sop sop-service-common - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT diff --git a/sop-common/sop-bridge-eureka/pom.xml b/sop-common/sop-bridge-eureka/pom.xml index f367b7a9..a21ae837 100644 --- a/sop-common/sop-bridge-eureka/pom.xml +++ b/sop-common/sop-bridge-eureka/pom.xml @@ -10,7 +10,7 @@ 4.0.0 - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT sop-bridge-eureka @@ -18,7 +18,7 @@ com.gitee.sop sop-gateway-common - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT diff --git a/sop-common/sop-bridge-nacos/pom.xml b/sop-common/sop-bridge-nacos/pom.xml index 822b8234..21504e9e 100644 --- a/sop-common/sop-bridge-nacos/pom.xml +++ b/sop-common/sop-bridge-nacos/pom.xml @@ -10,7 +10,7 @@ 4.0.0 - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT sop-bridge-nacos @@ -18,7 +18,7 @@ com.gitee.sop sop-gateway-common - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT diff --git a/sop-common/sop-gateway-common/pom.xml b/sop-common/sop-gateway-common/pom.xml index 0346be41..3b4d5df7 100644 --- a/sop-common/sop-gateway-common/pom.xml +++ b/sop-common/sop-gateway-common/pom.xml @@ -11,7 +11,7 @@ 4.0.0 sop-gateway-common - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT jar diff --git a/sop-common/sop-service-common/pom.xml b/sop-common/sop-service-common/pom.xml index 91d00021..582ab35d 100644 --- a/sop-common/sop-service-common/pom.xml +++ b/sop-common/sop-service-common/pom.xml @@ -12,7 +12,7 @@ 4.0.0 sop-service-common - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT jar diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/BizCode.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/BizCode.java new file mode 100644 index 00000000..892df082 --- /dev/null +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/BizCode.java @@ -0,0 +1,37 @@ +package com.gitee.sop.servercommon.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 错误码 + * + * @author tanghc + */ +@Target(ElementType.ANNOTATION_TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface BizCode { + + /** + * 错误码 + * + * @return + */ + String code(); + + /** + * 错误描述 + * @return + */ + String msg(); + + /** + * 解决方案 + * @return + */ + String solution() default ""; +} diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/Open.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/Open.java index 661471fe..f2eb882d 100644 --- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/Open.java +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/Open.java @@ -44,4 +44,9 @@ public @interface Open { * 是否需要appAuthToken,设置为true,网关端会校验token是否存在 */ boolean needToken() default false; + + /** + * 定义业务错误码,用于文档显示 + */ + BizCode[] bizCode() default {}; } diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/configuration/ServiceConfiguration.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/configuration/ServiceConfiguration.java index 217a3614..adb68d04 100644 --- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/configuration/ServiceConfiguration.java +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/configuration/ServiceConfiguration.java @@ -59,6 +59,21 @@ public class ServiceConfiguration implements WebMvcConfigurer { registry.addInterceptor(new ServiceContextInterceptor()); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty("spring.cloud.nacos.discovery.server-addr") + public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties, ObjectProvider taskScheduler, Environment environment) { + Map metadata = nacosDiscoveryProperties.getMetadata(); + String contextPath = environment.getProperty("server.servlet.context-path"); + // 将context-path信息加入到metadata中 + if (contextPath != null) { + metadata.put("context-path", contextPath); + } + // 在元数据中新增启动时间,不能修改这个值,不然网关拉取接口会有问题 + metadata.put("time.startup", String.valueOf(System.currentTimeMillis())); + return new NacosWatch(nacosDiscoveryProperties, taskScheduler); + } + @Bean @ConditionalOnMissingBean GlobalExceptionHandler globalExceptionHandler() { diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/CustomSwaggerParameterBuilder.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/CustomSwaggerParameterBuilder.java index b3e4974b..e45ef2c3 100644 --- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/CustomSwaggerParameterBuilder.java +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/CustomSwaggerParameterBuilder.java @@ -6,9 +6,12 @@ import com.google.common.base.Strings; import com.google.common.collect.Lists; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiParam; +import org.hibernate.validator.constraints.Length; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.service.AllowableListValues; import springfox.documentation.service.AllowableValues; +import springfox.documentation.service.StringVendorExtension; +import springfox.documentation.service.VendorExtension; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.schema.EnumTypeDeterminer; import springfox.documentation.spi.service.ExpandedParameterBuilderPlugin; @@ -18,6 +21,7 @@ import springfox.documentation.swagger.common.SwaggerPluginSupport; import springfox.documentation.swagger.readers.parameter.Examples; import springfox.documentation.swagger.schema.ApiModelProperties; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -76,6 +80,8 @@ public class CustomSwaggerParameterBuilder implements ExpandedParameterBuilderPl .scalarExample(apiParam.example()) .complexExamples(Examples.examples(apiParam.examples())) .order(SWAGGER_PLUGIN_ORDER) + // 添加额外属性 + .vendorExtensions(this.getVendorExtension(context)) .build(); } @@ -94,9 +100,22 @@ public class CustomSwaggerParameterBuilder implements ExpandedParameterBuilderPl .scalarExample(apiModelProperty.example()) //源码这里是: SWAGGER_PLUGIN_ORDER,需要修正 .order(apiModelProperty.position()) + // 添加额外属性 + .vendorExtensions(this.getVendorExtension(context)) .build(); } + private List getVendorExtension(ParameterExpansionContext context) { + List vendorExtensions = new ArrayList<>(4); + Optional annotation = context.findAnnotation(Length.class); + if (annotation.isPresent()) { + Length length = annotation.get(); + vendorExtensions.add(new StringVendorExtension("maxLength", String.valueOf(length.max()))); + vendorExtensions.add(new StringVendorExtension("minLength", String.valueOf(length.min()))); + } + return vendorExtensions; + } + private ParameterBuilder maybeSetParameterName(ParameterExpansionContext context, String parameterName) { if (!Strings.isNullOrEmpty(parameterName)) { context.getParameterBuilder().name(parameterName); diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/DocumentationPluginsManagerExt.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/DocumentationPluginsManagerExt.java index a7ed04f3..c44c9d8a 100644 --- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/DocumentationPluginsManagerExt.java +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/DocumentationPluginsManagerExt.java @@ -1,10 +1,19 @@ package com.gitee.sop.servercommon.swagger; +import com.alibaba.fastjson.JSON; +import com.fasterxml.classmate.ResolvedType; +import com.fasterxml.classmate.members.RawField; +import com.gitee.sop.servercommon.annotation.BizCode; import com.gitee.sop.servercommon.annotation.Open; import com.gitee.sop.servercommon.bean.ServiceConfig; import com.google.common.base.Optional; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.Order; import springfox.documentation.service.Operation; import springfox.documentation.service.StringVendorExtension; @@ -12,7 +21,15 @@ import springfox.documentation.service.VendorExtension; import springfox.documentation.spi.service.contexts.OperationContext; import springfox.documentation.spring.web.plugins.DocumentationPluginsManager; +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @author tanghc @@ -23,6 +40,7 @@ public class DocumentationPluginsManagerExt extends DocumentationPluginsManager private static final String SOP_VERSION = "sop_version"; private static final String MODULE_ORDER = "module_order"; private static final String API_ORDER = "api_order"; + private static final String BIZ_CODE = "biz_code"; @Override public Operation operation(OperationContext operationContext) { @@ -40,6 +58,8 @@ public class DocumentationPluginsManagerExt extends DocumentationPluginsManager String version = buildVersion(open.version()); vendorExtensions.add(new StringVendorExtension(SOP_NAME, name)); vendorExtensions.add(new StringVendorExtension(SOP_VERSION, version)); + this.setBizCode(open, vendorExtensions); + this.setResultExtProperties(operationContext); } Optional apiOptional = operationContext.findControllerAnnotation(Api.class); int order = 0; @@ -60,6 +80,73 @@ public class DocumentationPluginsManagerExt extends DocumentationPluginsManager vendorExtensions.add(new StringVendorExtension(API_ORDER, String.valueOf(methodOrder))); } + /** + * 设置返回结果额外属性,如最大长度 + * @param operationContext + */ + private void setResultExtProperties(OperationContext operationContext) { + List vendorExtensions = operationContext.getDocumentationContext().getVendorExtentions(); + ResolvedType returnType = operationContext.getReturnType(); + Class erasedType = returnType.getErasedType(); + String className = erasedType.getSimpleName(); + boolean exist = vendorExtensions.stream().anyMatch(p -> Objects.equals(p.getName(), className)); + if (!exist) { + List memberFields = returnType.getMemberFields(); + Map> fieldProperties = new HashMap<>(16); + for (RawField memberField : memberFields) { + String key = memberField.getName(); + Length length = AnnotationUtils.findAnnotation(memberField.getRawMember(), Length.class); + if (length != null) { + Map properties = fieldProperties.computeIfAbsent(key, k -> new HashMap<>(16)); + properties.computeIfAbsent("maxLength", k -> length.max()); + properties.computeIfAbsent("minLength", k -> length.max()); + } + ApiModelProperty apiModelProperty = AnnotationUtils.findAnnotation(memberField.getRawMember(), ApiModelProperty.class); + if (apiModelProperty != null) { + Map properties = fieldProperties.computeIfAbsent(key, k -> new HashMap<>(16)); + boolean required = apiModelProperty.required(); + // 只有在必填的情况下设置 + if (required) { + properties.put("required", required); + } + } + } + vendorExtensions.add(new StringVendorExtension(className, JSON.toJSONString(fieldProperties))); + } + } + + private Class getGenericType(Field curField) { + // 当前集合的泛型类型 + Type genericType = curField.getGenericType(); + if (genericType instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) genericType; + // 得到泛型里的class类型对象 + return (Class) pt.getActualTypeArguments()[0]; + } + return null; + } + + /** + * 设置业务错误码 + * @param open + * @param vendorExtensions + */ + private void setBizCode(Open open, List vendorExtensions) { + BizCode[] bizCodes = open.bizCode(); + List codeObjList = Stream.of(bizCodes) + .map(bizCode -> new BizCodeObj(bizCode.code(), bizCode.msg(), bizCode.solution())) + .collect(Collectors.toList()); + vendorExtensions.add(new StringVendorExtension(BIZ_CODE, JSON.toJSONString(codeObjList))); + } + + @Data + @AllArgsConstructor + private static class BizCodeObj { + private String code; + private String msg; + private String solution; + } + private String buildVersion(String version) { if ("".equals(version)) { return ServiceConfig.getInstance().getDefaultVersion(); diff --git a/sop-example/sop-springmvc/pom.xml b/sop-example/sop-springmvc/pom.xml index 959313eb..23060d5d 100644 --- a/sop-example/sop-springmvc/pom.xml +++ b/sop-example/sop-springmvc/pom.xml @@ -26,7 +26,7 @@ com.gitee.sop sop-service-common - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT diff --git a/sop-example/sop-story/pom.xml b/sop-example/sop-story/pom.xml index e0fe48be..1a0afa2f 100644 --- a/sop-example/sop-story/pom.xml +++ b/sop-example/sop-story/pom.xml @@ -19,7 +19,7 @@ com.gitee.sop sop-service-common - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/Example1001_BaseController.java b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/Example1001_BaseController.java index a291d960..b2eb6e2c 100644 --- a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/Example1001_BaseController.java +++ b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/Example1001_BaseController.java @@ -1,5 +1,6 @@ package com.gitee.sop.storyweb.controller; +import com.gitee.sop.servercommon.annotation.BizCode; import com.gitee.sop.servercommon.annotation.Open; import com.gitee.sop.storyweb.controller.param.CategoryParam; import com.gitee.sop.storyweb.controller.param.LargeTextParam; @@ -42,7 +43,11 @@ public class Example1001_BaseController { // 基础用法 @ApiOperation(value = "获取故事信息(首位)", notes = "获取故事信息的详细信息", position = -100/* position默认0,值越小越靠前 */) - @Open("story.get") + @Open(value = "story.get", bizCode = { + // 定义业务错误码,用于文档显示 + @BizCode(code = "100001", msg = "姓名错误", solution = "填写正确的姓名"), + @BizCode(code = "100002", msg = "备注错误", solution = "填写正确备注"), + }) @RequestMapping("/get/v1") public StoryResult get_v1(StoryParam param) { StoryResult story = new StoryResult(); @@ -53,7 +58,11 @@ public class Example1001_BaseController { // 指定版本号 @ApiOperation(value = "获取故事信息", notes = "获取故事信息的详细信息") - @Open(value = "story.get", version = "2.0") + @Open(value = "story.get", version = "2.0", bizCode = { + // 定义业务错误码,用于文档显示 + @BizCode(code = "100001", msg = "姓名错误", solution = "填写正确的姓名"), + @BizCode(code = "100002", msg = "备注错误", solution = "填写正确备注"), + }) @RequestMapping("/get/v2") public StoryResult get_v2(StoryParam param) { StoryResult story = new StoryResult(); diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/param/StoryParam.java b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/param/StoryParam.java index 6095f7c9..84ae44ea 100644 --- a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/param/StoryParam.java +++ b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/param/StoryParam.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank; @Data @@ -17,5 +18,6 @@ public class StoryParam { private String name; @ApiModelProperty(value = "备注 (第二)", example = "xx", position = 2) + @Length(max = 64, message = "长度不能超过64") private String remark; } \ No newline at end of file diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/result/StoryResult.java b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/result/StoryResult.java index b3bf99ef..80f6f69b 100644 --- a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/result/StoryResult.java +++ b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/result/StoryResult.java @@ -12,10 +12,11 @@ import java.util.Date; */ @Data public class StoryResult { - @ApiModelProperty(value = "故事ID", example = "1") + @ApiModelProperty(value = "故事ID", required = true, example = "1") private Long id; - @ApiModelProperty(value = "故事名称", example = "海底小纵队") + @ApiModelProperty(value = "故事名称", required = true, example = "海底小纵队") + @Length(max = 20) private String name; @ApiModelProperty(value = "创建时间", example = "2019-04-14 19:02:12") diff --git a/sop-gateway/pom.xml b/sop-gateway/pom.xml index fb315931..2a3b5736 100644 --- a/sop-gateway/pom.xml +++ b/sop-gateway/pom.xml @@ -24,7 +24,7 @@ com.gitee.sop sop-bridge-nacos - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT diff --git a/sop-website/pom.xml b/sop-website/pom.xml index f51225ce..26c466e6 100644 --- a/sop-website/pom.xml +++ b/sop-website/pom.xml @@ -25,7 +25,7 @@ com.gitee.sop sop-bridge-nacos - 4.0.2-SNAPSHOT + 4.0.3-SNAPSHOT diff --git a/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/BizCode.java b/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/BizCode.java new file mode 100644 index 00000000..f158e4b5 --- /dev/null +++ b/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/BizCode.java @@ -0,0 +1,13 @@ +package com.gitee.sop.websiteserver.bean; + +import lombok.Data; + +/** + * @author tanghc + */ +@Data +public class BizCode { + private String code; + private String msg; + private String solution; +} diff --git a/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/DocItem.java b/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/DocItem.java index 5a6236b6..929d20ad 100644 --- a/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/DocItem.java +++ b/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/DocItem.java @@ -30,6 +30,7 @@ public class DocItem { List requestParameters; List responseParameters; + List bizCodeList; public String getNameVersion() { return name + version; diff --git a/sop-website/src/main/java/com/gitee/sop/websiteserver/manager/SwaggerDocParser.java b/sop-website/src/main/java/com/gitee/sop/websiteserver/manager/SwaggerDocParser.java index 95240efd..0f41da00 100644 --- a/sop-website/src/main/java/com/gitee/sop/websiteserver/manager/SwaggerDocParser.java +++ b/sop-website/src/main/java/com/gitee/sop/websiteserver/manager/SwaggerDocParser.java @@ -1,7 +1,9 @@ package com.gitee.sop.websiteserver.manager; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.gitee.sop.websiteserver.bean.BizCode; import com.gitee.sop.websiteserver.bean.DocInfo; import com.gitee.sop.websiteserver.bean.DocItem; import com.gitee.sop.websiteserver.bean.DocModule; @@ -121,6 +123,10 @@ public class SwaggerDocParser implements DocParser { docItem.setDescription(docInfo.getString("description")); docItem.setMultiple(docInfo.getString("multiple") != null); docItem.setProduces(docInfo.getJSONArray("produces").toJavaList(String.class)); + String bizCodeStr = docInfo.getString("biz_code"); + if (bizCodeStr != null) { + docItem.setBizCodeList(JSON.parseArray(bizCodeStr, BizCode.class)); + } docItem.setModuleOrder(NumberUtils.toInt(docInfo.getString("module_order"), 0)); docItem.setApiOrder(NumberUtils.toInt(docInfo.getString("api_order"), 0)); String moduleName = this.buildModuleName(docInfo, docRoot); @@ -208,6 +214,8 @@ public class SwaggerDocParser implements DocParser { protected List buildDocParameters(String ref, JSONObject docRoot, boolean doSubRef) { JSONObject responseObject = docRoot.getJSONObject("definitions").getJSONObject(ref); + String className = responseObject.getString("title"); + JSONObject extProperties = docRoot.getJSONObject(className); JSONObject properties = responseObject.getJSONObject("properties"); List docParameterList = new ArrayList<>(); if (properties == null) { @@ -224,10 +232,20 @@ public class SwaggerDocParser implements DocParser { JSONObject fieldInfo = properties.getJSONObject(fieldName); DocParameter docParameter = fieldInfo.toJavaObject(DocParameter.class); docParameter.setName(fieldName); + if (extProperties != null) { + JSONObject prop = extProperties.getJSONObject(fieldName); + if (prop != null) { + String maxLength = prop.getString("maxLength"); + docParameter.setMaxLength(maxLength == null ? "-" : maxLength); + String required = prop.getString("required"); + if (required != null) { + docParameter.setRequired(Boolean.parseBoolean(required)); + } + } + } docParameterList.add(docParameter); RefInfo refInfo = this.getRefInfo(fieldInfo); if (refInfo != null && doSubRef) { - // 如果是树状菜单的话,这里可能触发死循环 String subRef = refInfo.ref; boolean nextDoRef = !Objects.equals(ref, subRef); List refs = buildDocParameters(subRef, docRoot, nextDoRef); diff --git a/sop-website/src/main/resources/public/pages/doc/doc.html b/sop-website/src/main/resources/public/pages/doc/doc.html index 65d0b6d5..b89b55a7 100644 --- a/sop-website/src/main/resources/public/pages/doc/doc.html +++ b/sop-website/src/main/resources/public/pages/doc/doc.html @@ -367,6 +367,29 @@ +
+
+ 业务错误码 +
+
+
+

+ 公共错误码 +

+
+ + + + + + + + + + +
错误码错误描述解决方案
+
+
diff --git a/sop-website/src/main/resources/public/pages/doc/docEvent.js b/sop-website/src/main/resources/public/pages/doc/docEvent.js index 5f58b327..9f6c60d9 100644 --- a/sop-website/src/main/resources/public/pages/doc/docEvent.js +++ b/sop-website/src/main/resources/public/pages/doc/docEvent.js @@ -16,6 +16,7 @@ function selectItem(docItem, layui) { createRequestParameter(docItem); createResponseParameter(docItem); createResponseCode(docItem); + buildBizCode(docItem); var $li = $('#docItemTree').find('li[nameversion="'+nameVersion+'"]'); $li.addClass('layui-this').siblings().removeClass('layui-this'); @@ -124,3 +125,21 @@ function buildExample(parameter) { return '\"' + parameter.example + '\"'; } } + +function buildBizCode(docItem) { + var html = [] + var bizCodeList = docItem.bizCodeList; + if (bizCodeList && bizCodeList.length > 0) { + for (var i = 0; i < bizCodeList.length; i++) { + var bizCode = bizCodeList[i]; + html.push('') + html.push(''+bizCode.code+'') + html.push(''+bizCode.msg+'') + html.push(''+bizCode.solution+'') + html.push('') + } + $('#bizCode').find('tbody').html(html.join('')); + } else { + $('#bizCode').find('tbody').html('暂无数据'); + } +} \ No newline at end of file