diff --git a/opsli-api/pom.xml b/opsli-api/pom.xml new file mode 100644 index 00000000..edebfef6 --- /dev/null +++ b/opsli-api/pom.xml @@ -0,0 +1,59 @@ + + + + opsli-boot-parent + org.opsliframework.boot + 1.0.0 + + + 4.0.0 + opsli-api + ${project.parent.version} + + + + + org.opsliframework.boot + opsli-common + ${version} + + + + + + io.springfox + springfox-swagger2 + 2.9.2 + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + com.github.xiaoymin + swagger-bootstrap-ui + 1.9.3 + + + io.springfox + springfox-bean-validators + 2.9.2 + + + + io.swagger + swagger-annotations + 1.5.22 + + + io.swagger + swagger-models + 1.5.22 + + + + + \ No newline at end of file diff --git a/opsli-common/src/main/java/org/opsli/common/api/ResultVo.java b/opsli-api/src/main/java/org/opsli/api/base/result/ResultVo.java similarity index 96% rename from opsli-common/src/main/java/org/opsli/common/api/ResultVo.java rename to opsli-api/src/main/java/org/opsli/api/base/result/ResultVo.java index 4c5f0f25..37739404 100644 --- a/opsli-common/src/main/java/org/opsli/common/api/ResultVo.java +++ b/opsli-api/src/main/java/org/opsli/api/base/result/ResultVo.java @@ -1,8 +1,7 @@ -package org.opsli.common.api; +package org.opsli.api.base.result; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import org.springframework.http.HttpStatus; import java.io.Serializable; diff --git a/opsli-core/src/main/java/org/opsli/core/base/entity/BaseEntity.java b/opsli-api/src/main/java/org/opsli/api/base/warpper/ApiWrapper.java similarity index 69% rename from opsli-core/src/main/java/org/opsli/core/base/entity/BaseEntity.java rename to opsli-api/src/main/java/org/opsli/api/base/warpper/ApiWrapper.java index ad944756..6914728a 100644 --- a/opsli-core/src/main/java/org/opsli/core/base/entity/BaseEntity.java +++ b/opsli-api/src/main/java/org/opsli/api/base/warpper/ApiWrapper.java @@ -1,7 +1,6 @@ -package org.opsli.core.base.entity; +package org.opsli.api.base.warpper; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -14,7 +13,14 @@ import java.util.Date; /** * - * Entity 基础类 + * Api 基础类 + * + * 尽量 与本地 服务的 entity 保持一致(除去不想要暴露给 web的字段) + * + * api层级的 wrapper 也是对于数据安全性的一次包装 + * + * Entity 增加的 deleted 字段, 不需要同步更新到 Wrapper的Model中 + * Wrapper的Model 只是用于 对外展示 * * @author Parker * @date 2019-05-11 @@ -23,12 +29,12 @@ import java.util.Date; @Data @Accessors(chain = true) @EqualsAndHashCode(callSuper = false) -public abstract class BaseEntity implements Serializable { +public abstract class ApiWrapper implements Serializable { private static final long serialVersionUID = 1L; /** ID */ - @TableId(type = IdType.ASSIGN_ID) + @TableId @ApiModelProperty(value = "ID") private String id; @@ -53,6 +59,8 @@ public abstract class BaseEntity implements Serializable { private Date updateTime; /** 乐观锁 版本 */ + @ApiModelProperty(value = "版本") + @Version private Integer version; } diff --git a/opsli-core/src/main/java/org/opsli/core/conf/SwaggerConfig.java b/opsli-api/src/main/java/org/opsli/api/conf/SpringWebMvcConfig.java similarity index 73% rename from opsli-core/src/main/java/org/opsli/core/conf/SwaggerConfig.java rename to opsli-api/src/main/java/org/opsli/api/conf/SpringWebMvcConfig.java index 1c23516a..2008a21c 100644 --- a/opsli-core/src/main/java/org/opsli/core/conf/SwaggerConfig.java +++ b/opsli-api/src/main/java/org/opsli/api/conf/SpringWebMvcConfig.java @@ -1,11 +1,13 @@ -package org.opsli.core.conf; +package org.opsli.api.conf; import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.opsli.api.conf.prop.ApiPathProperties; +import org.opsli.common.annotation.ApiRestController; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import springfox.documentation.builders.ApiInfoBuilder; @@ -16,24 +18,33 @@ import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; +import javax.annotation.Resource; + /** - * @Author parker - * - * swagger配置 - * - * spring 条件 如果 enable为fasle 则不会自动注入该类 + * 配置统一的后台接口访问路径的前缀 + * @author parker */ @Slf4j @Configuration @EnableSwagger2 @EnableSwaggerBootstrapUI -@ConditionalOnProperty(name = "swagger.enable", havingValue = "true") -public class SwaggerConfig implements WebMvcConfigurer { +public class SpringWebMvcConfig implements WebMvcConfigurer { + + @Resource + private ApiPathProperties apiPathProperties; + + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + configurer + .addPathPrefix(apiPathProperties.getGlobalPrefix(),c -> c.isAnnotationPresent(ApiRestController.class)); + } + + // ========================= Swagger ========================= /** * * 显示swagger-ui.html文档展示页,还必须注入swagger资源: - * + * * @param registry */ @Override @@ -54,13 +65,13 @@ public class SwaggerConfig implements WebMvcConfigurer { .apiInfo(apiInfo()) .select() //此包路径下的类,才生成接口文档 - .apis(RequestHandlerSelectors.basePackage("org.opsli.modulars")) + .apis(RequestHandlerSelectors.basePackage("org.opsli")) //加了ApiOperation注解的类,才生成接口文档 - .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(PathSelectors.any()) .build(); - //.securitySchemes(Collections.singletonList(securityScheme())); - //.globalOperationParameters(setHeaderToken()); + //.securitySchemes(Collections.singletonList(securityScheme())); + //.globalOperationParameters(setHeaderToken()); } /*** @@ -101,9 +112,9 @@ public class SwaggerConfig implements WebMvcConfigurer { .description("后台API接口") // 作者 .contact("Parker") - .license("The Apache License, Version 2.0") - .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") + .license("The Apache License, Version 2.0") + .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") .build(); } - + } diff --git a/opsli-core/src/main/java/org/opsli/core/prop/ApiPathProperties.java b/opsli-api/src/main/java/org/opsli/api/conf/prop/ApiPathProperties.java similarity index 86% rename from opsli-core/src/main/java/org/opsli/core/prop/ApiPathProperties.java rename to opsli-api/src/main/java/org/opsli/api/conf/prop/ApiPathProperties.java index 4d7e2e4c..205831e5 100644 --- a/opsli-core/src/main/java/org/opsli/core/prop/ApiPathProperties.java +++ b/opsli-api/src/main/java/org/opsli/api/conf/prop/ApiPathProperties.java @@ -1,4 +1,4 @@ -package org.opsli.core.prop; +package org.opsli.api.conf.prop; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -6,7 +6,7 @@ import org.springframework.stereotype.Component; /** * 接口路径前缀配置 - * @author C西 + * @author parker */ @Component @ConfigurationProperties(prefix = "server.servlet.api.path") diff --git a/opsli-api/src/main/java/org/opsli/api/web/test/ITestApi.java b/opsli-api/src/main/java/org/opsli/api/web/test/ITestApi.java new file mode 100644 index 00000000..38b0aa56 --- /dev/null +++ b/opsli-api/src/main/java/org/opsli/api/web/test/ITestApi.java @@ -0,0 +1,96 @@ +package org.opsli.api.web.test; + +import io.swagger.annotations.ApiOperation; +import org.opsli.api.base.result.ResultVo; +import org.opsli.api.wrapper.test.TestModel; +import org.opsli.common.annotation.ApiRestController; +import org.springframework.web.bind.annotation.GetMapping; + + +/** + * @BelongsProject: opsli-boot + * @BelongsPackage: org.opsli.modulars.test.web + * @Author: Parker + * @CreateTime: 2020-09-13 17:40 + * @Description: 测试类 + */ +@ApiRestController("/test") +public interface ITestApi { + + + @ApiOperation(value = "发送邮件", notes = "发送邮件") + @GetMapping("/sendMail") + ResultVo sendMail(); + + + /** + * 发送 Redis 订阅消息 + * @return + */ + @ApiOperation(value = "发送 Redis 订阅消息", notes = "发送 Redis 订阅消息") + @GetMapping("/sendMsg") + ResultVo sendMsg(); + + + /** + * 发送 Redis 订阅消息 + * @return + */ + @ApiOperation(value = "发送 Redis 测试", notes = "发送 Redis 测试") + @GetMapping("/redisTest") + ResultVo redisTest(); + + + /** + * 发起 Redis 分布式锁 + * @return + */ + @ApiOperation(value = "发起 Redis 分布式锁", notes = "发起 Redis 分布式锁") + @GetMapping("/testLock") + ResultVo testLock(); + + /** + * 新增数据 + * @return + */ + @ApiOperation(value = "新增数据", notes = "新增数据") + @GetMapping("/insert") + ResultVo insert(TestModel entity); + + /** + * 修改数据 + * @return + */ + @ApiOperation(value = "修改数据", notes = "修改数据") + @GetMapping("/update") + ResultVo update(TestModel entity); + + + /** + * 查看对象 + * @return + */ + @ApiOperation(value = "查看对象", notes = "查看对象") + @GetMapping("/get") + ResultVo get(TestModel entity); + + + /** + * 删除对象 + * @return + */ + @ApiOperation(value = "删除对象", notes = "删除对象") + @GetMapping("/del") + ResultVo del(String id); + + + /** + * 删除全部对象 + * @return + */ + @ApiOperation(value = "删除全部对象", notes = "删除全部对象") + @GetMapping("/delAll") + ResultVo delAll(); + + +} diff --git a/opsli-api/src/main/java/org/opsli/api/wrapper/test/TestModel.java b/opsli-api/src/main/java/org/opsli/api/wrapper/test/TestModel.java new file mode 100644 index 00000000..b28319e7 --- /dev/null +++ b/opsli-api/src/main/java/org/opsli/api/wrapper/test/TestModel.java @@ -0,0 +1,23 @@ +package org.opsli.api.wrapper.test; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.opsli.api.base.warpper.ApiWrapper; + +/** + * @BelongsProject: opsli-boot + * @BelongsPackage: org.opsli.modulars.test.entity + * @Author: Parker + * @CreateTime: 2020-09-16 17:33 + * @Description: 测试类 + */ +@Data +public class TestModel extends ApiWrapper { + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "备注") + private String remark; + +}