cantEditColumnList;
```
#### 12.时间必须是过去的时间
```java
/**
* 应用发布时间
*/
@Matcher(range = "past")
@ApiModelProperty(value = "应用发布时间")
private Date createTime;
```
#### 13.分页数据必须满足>0
```java
@Matcher(range = "[0, )", errMsg = "分页数据不满足")
private Integer pageNo;
@Matcher(range = "[0, )", errMsg = "pageSize数据不满足")
private Integer pageSize;
```
#### 14.【复杂场景】应用id在不同的场景下处理方式不同
1. 在启动构建时候,状态必须在“开始”阶段
1. 在测试完成动作,状态必须在‘测试中’阶段
1. 在启动发布动作,状态必须在“测试完成”阶段
1. 在停止动作,状态必须在“部署”状态之前
1. 退出动作,要保证应用在“部署”状态之前
此外最基本的就是应用id不可为空,而且在db中必须存在。上面的几个动作都是不同的接口,但是所有的参数都相同,那么用group是最好的方式。其中group里面可以添加多个分组,其中group相同的,则表示两个@Mather之间是与的关系
```java
@Data
public class AppIdReq {
@Matchers({
@Matcher(notNull = "true"),
@Matcher(group = {MkConstant.DEFAULT_GROUP, "startBuild", "finishTest", "startDeploy", "stop", "quite"}, customize = "com.xxx.yyy.ExistMatch#appIdExist", errMsg = "应用id: #current 不存在"),
// 启动构建 动作的状态核查
@Matcher(group = "startBuild", customize = "com.xxx.yyy.DeployStatusMatch#startBuild", errMsg = "应用id: #current 不在阶段'未编译',请先退出"),
// 测试完成 动作的状态核查
@Matcher(group = "finishTest", customize = "com.xxx.yyy.DeployStatusMatch#finishTest", errMsg = "应用id: #current 不在阶段'测试中'"),
// 启动发布 动作的状态核查
@Matcher(group = "startDeploy", customize = "com.xxx.yyy.DeployStatusMatch#startDeploy", errMsg = "应用id: #current 不在阶段'测试完成'"),
// 停止 动作的状态核查
@Matcher(group = "stop", customize = "com.xxx.yyy.DeployStatusMatch#stopDeploy", errMsg = "停止的动作需要保证应用 #current 在部署状态之前"),
// 退出 动作的状态核查
@Matcher(group = "quite", customize = "com.xxx.yyy.DeployStatusMatch#stopDeploy", errMsg = "退出的动作需要保证应用 #current 在部署状态之前")
})
@ApiModelProperty(value = "应用id", example = "42342354")
private Long appId;
}
```
对应的接口使用
```java
@AutoCheck
@RequestMapping("${api-prefix}/deploy")
@RestController
public class DeployController {
...
/**
* 启动构建
*/
@AutoCheck("startBuild")
@PutMapping("startBuild")
public Integer startBuild(@RequestBody AppIdReq appIdReq) {
Long appId = appIdReq.getAppId();
devopsService.startBuild(appId);
return 1;
}
/**
* 完成测试
*/
@AutoCheck("finishTest")
@PutMapping("finishTest")
public Integer finishTest(@RequestBody AppIdReq appIdReq) {
Long appId = appIdReq.getAppId();
appService.chgDeployStatus(appId, DeployStatusEnum.TEST_FINISH);
return 1;
}
/**
* 启动发布
*/
@AutoCheck("startDeploy")
@PutMapping("startDeploy")
public Integer startDeploy(@RequestBody AppIdReq appIdReq) {
Long appId = appIdReq.getAppId();
appService.startDeploy(appId, UserInfoContext.getUserContext().getUserId());
return 1;
}
/**
* 停止
* 只有在发布之前,停止按钮可见
*/
@AutoCheck("stop")
@PutMapping("stop")
public Integer stop(@RequestBody AppIdReq appIdReq) {
appService.stopApp(appIdReq.getAppId());
return 1;
}
/**
* 退出
*
如果已经进行过“发布”,则不可退出,而且该退出按钮只有在停止后才能退出
*/
@AutoCheck("quite")
@PutMapping("quite")
public Integer quite(@RequestBody AppIdReq appIdReq) {
appService.quite(appIdReq.getAppId());
return 1;
}
}
```
#### 15.核查参数
version >= v1.2.3
注解`@Matcher`和`@Matchers`除了可以修饰Field类型外,也可以修饰函数的入参
如下示例
```java
@Slf4j
@AutoCheck
@RequestMapping("/api/test/mikilin")
@RestController
public class TestController {
@PostMapping("fun1")
public String fun1(
@Matcher(value = {"song", "zhou"}) String name,
@Matcher(range = "[0, 3]") Integer age
) {
return name + "-" + age;
}
}
```
#### 16.时间的计算
version >= v1.2.3
就是对range属性修饰的时间的扩充,比如匹配前3天2小时这种,就可以使用range="(-3d2h,)",表示匹配当前时间往前推3天两个小时后的所有时间
如下示例
```java
@Data
@Accessors(chain = true)
public class RangeTimeEntity1 {
// 过去四年2月5天3小时2分钟3秒
@Matcher(range = "(-4y2M5d3h2m3s,)")
private Date date;
}
```
# 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request