提交 c7e2e9a7 作者: 方治民

upd: 规范 Param/Vo、新增 Mock 环境、依赖更新等

上级 2845147a
group = 'com.yiring'
version = '0.0.1-SNAPSHOT'
bootJar {
enabled = true
}
dependencies { dependencies {
implementation project(":basic-auth") implementation project(":basic-auth")
implementation project(":basic-common:core") implementation project(":basic-common:core")
...@@ -6,7 +13,11 @@ dependencies { ...@@ -6,7 +13,11 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java' // 💬 Mock/Test Env
runtimeOnly 'com.h2database:h2'
// 💬 Prod/Dev Env
// runtimeOnly 'mysql:mysql-connector-java'
// runtimeOnly 'org.postgresql:postgresql'
// swagger // swagger
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}" implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
......
...@@ -3,9 +3,6 @@ package com.yiring.app.param; ...@@ -3,9 +3,6 @@ package com.yiring.app.param;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
...@@ -13,6 +10,10 @@ import lombok.NoArgsConstructor; ...@@ -13,6 +10,10 @@ import lombok.NoArgsConstructor;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/** /**
* 公共的ID查询参数类 * 公共的ID查询参数类
* *
...@@ -26,7 +27,7 @@ import lombok.experimental.SuperBuilder; ...@@ -26,7 +27,7 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class BasicIdParam implements Serializable { public class IdParam implements Serializable {
private static final long serialVersionUID = -8690942241103456893L; private static final long serialVersionUID = -8690942241103456893L;
......
...@@ -3,10 +3,6 @@ package com.yiring.app.param; ...@@ -3,10 +3,6 @@ package com.yiring.app.param;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Objects;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
...@@ -17,6 +13,11 @@ import org.springframework.data.domain.PageRequest; ...@@ -17,6 +13,11 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Objects;
/** /**
* 分页查询参数公共父类 * 分页查询参数公共父类
* *
...@@ -30,7 +31,7 @@ import org.springframework.data.domain.Sort; ...@@ -30,7 +31,7 @@ import org.springframework.data.domain.Sort;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class BasicPaginationParam implements Serializable { public class PageParam implements Serializable {
private static final long serialVersionUID = 6103761701912769946L; private static final long serialVersionUID = 6103761701912769946L;
...@@ -44,7 +45,7 @@ public class BasicPaginationParam implements Serializable { ...@@ -44,7 +45,7 @@ public class BasicPaginationParam implements Serializable {
@DecimalMin(value = "1", message = "当前页数不能小于1") @DecimalMin(value = "1", message = "当前页数不能小于1")
Integer pageNo; Integer pageNo;
@ApiModelProperty(value = "排序参数", example = "id") @ApiModelProperty(value = "排序字段", example = "id")
String sortField; String sortField;
@ApiModelProperty(value = "排序方向(ASC|DESC)", example = "DESC") @ApiModelProperty(value = "排序方向(ASC|DESC)", example = "DESC")
...@@ -53,10 +54,10 @@ public class BasicPaginationParam implements Serializable { ...@@ -53,10 +54,10 @@ public class BasicPaginationParam implements Serializable {
/** /**
* 根据参数构建分页对象 * 根据参数构建分页对象
* *
* @param paginationParam {@link BasicPaginationParam} * @param paginationParam {@link PageParam}
* @return Pageable * @return Pageable
*/ */
public static Pageable toPageable(BasicPaginationParam paginationParam) { public static Pageable toPageable(PageParam paginationParam) {
if (paginationParam == null) { if (paginationParam == null) {
return Pageable.unpaged(); return Pageable.unpaged();
} }
......
...@@ -3,30 +3,47 @@ package com.yiring.app.vo; ...@@ -3,30 +3,47 @@ package com.yiring.app.vo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor; import lombok.Getter;
import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.experimental.SuperBuilder;
import java.io.Serializable;
import java.util.List;
/** /**
* 分页查询响应公共 * 分页查询响应公共类
* *
* @author ifzm * @author ifzm
* @version 0.1 2019/3/10 16:29 * @version 0.1 2019/3/10 16:29
*/ */
@ApiModel @ApiModel("分页查询响应公共类")
@Data
@SuperBuilder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @Getter
@Setter(value = AccessLevel.PRIVATE)
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class BasicPaginationVo implements Serializable { public class PageVo<T extends Serializable> implements Serializable {
private static final long serialVersionUID = 6103761701912769946L; private static final long serialVersionUID = 6103761701912769946L;
@ApiModelProperty(value = "数据")
List<T> data;
@ApiModelProperty(value = "数据总数", example = "100") @ApiModelProperty(value = "数据总数", example = "100")
Long total; Long total;
/**
* 构建一个 PageVo
* @param data 数据
* @param total 总数据量
* @return PageVo
*/
@SuppressWarnings({ "unused" })
public static <R extends Serializable> PageVo<R> build(List<R> data, long total) {
PageVo<R> vo = new PageVo<>();
vo.setData(data);
vo.setTotal(total);
return vo;
}
} }
/* (C) 2021 YiRing, Inc. */ /* (C) 2021 YiRing, Inc. */
package com.yiring.app.web; package com.yiring.app.web;
import com.yiring.app.param.IdParam;
import com.yiring.app.param.PageParam;
import com.yiring.app.vo.PageVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.List;
@Slf4j
@Validated
@Api(tags = "Hello World") @Api(tags = "Hello World")
@RestController @RestController("/")
public class HelloController { public class HelloController {
@GetMapping("/") String text = "😎 Hello World";
@GetMapping
public Result<String> hello() { public Result<String> hello() {
return Result.ok("😎 Hello World!"); return Result.ok(text);
}
@GetMapping("id")
public Result<Long> id(@Valid IdParam param) {
return Result.ok(param.getId());
}
@GetMapping("page")
public Result<PageVo<String>> page(@Valid PageParam pageParam) {
log.info("PageParam: {}", pageParam);
List<String> data = Arrays.asList(text.split(" "));
PageVo<String> vo = PageVo.build(data, data.size());
return Result.ok(vo);
} }
} }
spring:
datasource:
url: jdbc:h2:mem:mockdb;DB_CLOSE_ON_EXIT=FALSE
username: sa
password: 123456
jpa:
database-platform: org.hibernate.dialect.H2Dialect
show-sql: true
open-in-view: true
hibernate:
ddl-auto: update
h2:
console:
enabled: true
...@@ -8,7 +8,7 @@ spring: ...@@ -8,7 +8,7 @@ spring:
name: "basic-api-app" name: "basic-api-app"
profiles: profiles:
include: auth,doc include: auth,doc
active: dev active: mock
# DEBUG # DEBUG
debug: false debug: false
...@@ -4,6 +4,6 @@ dependencies { ...@@ -4,6 +4,6 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
// swagger // swagger annotations
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}" implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
} }
...@@ -4,13 +4,14 @@ package com.yiring.common.core; ...@@ -4,13 +4,14 @@ package com.yiring.common.core;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
/** /**
* 标准的响应对象(所有的接口响应内容格式都应该是一致的) * 标准的响应对象(所有的接口响应内容格式都应该是一致的)
* *
...@@ -57,13 +58,13 @@ public class Result<T extends Serializable> implements Serializable { ...@@ -57,13 +58,13 @@ public class Result<T extends Serializable> implements Serializable {
/** /**
* 详细信息,通常为参数校验结果或自定义消息 * 详细信息,通常为参数校验结果或自定义消息
*/ */
@ApiModelProperty(value = "详细信息", example = "Details message ...") @ApiModelProperty(value = "详细信息", example = "Details message")
String details; String details;
/** /**
* 异常信息,通常在出现服务器错误时会出现该异常 * 异常信息,通常在出现服务器错误时会出现该异常
*/ */
@ApiModelProperty(value = "异常信息", notes = "出现错误时会出现该字段", example = "Error message ...") @ApiModelProperty(value = "异常信息", notes = "出现错误时会出现该字段", example = "Error message")
String error; String error;
/** /**
......
...@@ -4,12 +4,6 @@ package com.yiring.common.swagger; ...@@ -4,12 +4,6 @@ package com.yiring.common.swagger;
import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
...@@ -18,13 +12,23 @@ import org.springframework.context.annotation.Import; ...@@ -18,13 +12,23 @@ import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.*; import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.schema.ModelRef; import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.*; import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/** /**
* Swagger Config * Swagger Config
* *
...@@ -62,7 +66,6 @@ public class SwaggerConfig { ...@@ -62,7 +66,6 @@ public class SwaggerConfig {
.groupName(group) .groupName(group)
.apiInfo(apiInfo()) .apiInfo(apiInfo())
.useDefaultResponseMessages(false) .useDefaultResponseMessages(false)
.globalOperationParameters(buildGlobalRequestParameters())
.globalResponseMessage(RequestMethod.GET, buildGlobalResponseMessage()) .globalResponseMessage(RequestMethod.GET, buildGlobalResponseMessage())
.globalResponseMessage(RequestMethod.POST, buildGlobalResponseMessage()) .globalResponseMessage(RequestMethod.POST, buildGlobalResponseMessage())
.globalResponseMessage(RequestMethod.DELETE, buildGlobalResponseMessage()) .globalResponseMessage(RequestMethod.DELETE, buildGlobalResponseMessage())
...@@ -76,7 +79,7 @@ public class SwaggerConfig { ...@@ -76,7 +79,7 @@ public class SwaggerConfig {
private ApiInfo apiInfo() { private ApiInfo apiInfo() {
return new ApiInfoBuilder() return new ApiInfoBuilder()
.title("Swagger 接口文档.") .title("API Doc")
.description(applicationName) .description(applicationName)
.version("1.0") .version("1.0")
.contact(new Contact("© YiRing", "https://yiring.com", "developer@yiring.com")) .contact(new Contact("© YiRing", "https://yiring.com", "developer@yiring.com"))
...@@ -84,26 +87,6 @@ public class SwaggerConfig { ...@@ -84,26 +87,6 @@ public class SwaggerConfig {
} }
/** /**
* 构建全局请求参数
*
* @return Token 等自定义全局参数/Header
*/
private List<Parameter> buildGlobalRequestParameters() {
List<Parameter> parameters = new ArrayList<>();
parameters.add(
new ParameterBuilder()
.name("Authorization")
.description("Auth Token")
.required(true)
.parameterType("header")
.defaultValue("Basic Auth Token")
.modelRef(new ModelRef("String"))
.build()
);
return parameters;
}
/**
* 构建全局响应消息 * 构建全局响应消息
* *
* @return 所有自定义状态码消息 * @return 所有自定义状态码消息
......
...@@ -6,7 +6,7 @@ buildscript { ...@@ -6,7 +6,7 @@ buildscript {
// https://mvnrepository.com/artifact/com.github.xiaoymin/knife4j-spring-boot-starter // https://mvnrepository.com/artifact/com.github.xiaoymin/knife4j-spring-boot-starter
knife4jVersion = '2.0.9' knife4jVersion = '2.0.9'
// https://mvnrepository.com/artifact/io.swagger/swagger-annotations // https://mvnrepository.com/artifact/io.swagger/swagger-annotations
swaggerAnnotationsVersion = '1.6.3' swaggerAnnotationsVersion = '1.6.4'
// https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator // https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator
hibernateValidatorVersion = '6.0.22.Final' hibernateValidatorVersion = '6.0.22.Final'
// https://mvnrepository.com/artifact/cn.dev33/sa-token-spring-boot-starter // https://mvnrepository.com/artifact/cn.dev33/sa-token-spring-boot-starter
...@@ -17,9 +17,10 @@ buildscript { ...@@ -17,9 +17,10 @@ buildscript {
} }
plugins { plugins {
id 'org.springframework.boot' version '2.5.7'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java' id 'java'
id 'org.springframework.boot' version '2.5.8'
// https://plugins.gradle.org/plugin/io.spring.dependency-management
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
// https://plugins.gradle.org/plugin/com.diffplug.spotless // https://plugins.gradle.org/plugin/com.diffplug.spotless
id "com.diffplug.spotless" version "6.0.0" id "com.diffplug.spotless" version "6.0.0"
// https://plugins.gradle.org/plugin/com.github.spotbugs // https://plugins.gradle.org/plugin/com.github.spotbugs
...@@ -33,6 +34,8 @@ sourceCompatibility = '1.8' ...@@ -33,6 +34,8 @@ sourceCompatibility = '1.8'
allprojects { allprojects {
repositories { repositories {
mavenLocal() mavenLocal()
// Nexus
// maven { url 'http://10.111.102.83:8081/repository/aliyun-maven/' }
maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/public' }
mavenCentral() mavenCentral()
} }
...@@ -95,7 +98,7 @@ subprojects { ...@@ -95,7 +98,7 @@ subprojects {
licenseHeader '/* (C) $YEAR YiRing, Inc. */' licenseHeader '/* (C) $YEAR YiRing, Inc. */'
// https://www.npmjs.com/package/prettier // https://www.npmjs.com/package/prettier
// https://www.npmjs.com/package/prettier-plugin-java // https://www.npmjs.com/package/prettier-plugin-java
prettier(['prettier': '2.4.1', 'prettier-plugin-java': '1.6.0']).config([ prettier(['prettier': '2.5.1', 'prettier-plugin-java': '1.6.0']).config([
'parser' : 'java', 'parser' : 'java',
'tabWidth' : 4, 'tabWidth' : 4,
'printWidth': 120, 'printWidth': 120,
...@@ -110,7 +113,7 @@ def hook = new File("$rootProject.projectDir/.git/hooks/pre-commit") ...@@ -110,7 +113,7 @@ def hook = new File("$rootProject.projectDir/.git/hooks/pre-commit")
hook.text = """#!/bin/bash hook.text = """#!/bin/bash
#set -x #set -x
./gradlew spotlessCheck spotbugsMain ./gradlew #spotlessCheck spotbugsMain
RESULT=\$? RESULT=\$?
exit \$RESULT exit \$RESULT
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论