refactor(module): 重构格式化,并添加菜单一键复制功能

This commit is contained in:
2025-07-30 21:12:14 +08:00
parent 9d49d8a7e9
commit 46f3642aed
172 changed files with 1991 additions and 1042 deletions
+1
View File
@@ -36,6 +36,7 @@ https://github.com/odboy-tianjun/cutejava
- 对一些常用地前端组件封装:表格数据请求、数据字典等 - 对一些常用地前端组件封装:表格数据请求、数据字典等
- 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断 - 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断
- 支持在线用户管理与服务器性能监控,支持限制单用户登录 - 支持在线用户管理与服务器性能监控,支持限制单用户登录
- 支持一键复制菜单项,避免菜单繁琐配置
#### 系统功能 #### 系统功能
View File
@@ -68,14 +68,14 @@
<script> <script>
import CutePipelineNode from '@/views/components/dev/CutePipelineNode' import CutePipelineNode from '@/views/components/dev/CutePipelineNode'
import { getPipelineTemplate } from '@/api/devops/pipelineTemplate' import { getPipelineTemplate } from '@/api/pipeline/pipelineTemplate'
import { import {
queryLastPipelineDetailWs, queryLastPipelineDetailWs,
restartPipeline, restartPipeline,
retryPipeline, retryPipeline,
startPipeline, startPipeline,
stopPipeline stopPipeline
} from '@/api/devops/pipelineInstance' } from '@/api/pipeline/pipelineInstance'
import { CountArraysObjectByPropKey } from '@/utils/CsUtil' import { CountArraysObjectByPropKey } from '@/utils/CsUtil'
import CsMessage from '@/utils/elementui/CsMessage' import CsMessage from '@/utils/elementui/CsMessage'
import CsWsClient from '@/utils/CsWsClient' import CsWsClient from '@/utils/CsWsClient'
@@ -22,9 +22,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*; import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code DELETE} requests onto specific handler * Annotation for mapping HTTP {@code DELETE} requests onto specific handler methods. 支持匿名访问 DeleteMapping
* methods.
* 支持匿名访问 DeleteMapping
* *
* @see AnonymousGetMapping * @see AnonymousGetMapping
* @see AnonymousPostMapping * @see AnonymousPostMapping
@@ -42,43 +40,36 @@ public @interface AnonymousDeleteMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String name() default "";
String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] value() default {};
String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] path() default {};
String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] params() default {};
String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
String[] produces() default {};
} }
@@ -22,8 +22,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*; import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code GET} requests onto specific handler * Annotation for mapping HTTP {@code GET} requests onto specific handler methods.
* methods.
* <p> * <p>
* 支持匿名访问 GetMapping * 支持匿名访问 GetMapping
* *
@@ -39,45 +38,38 @@ public @interface AnonymousGetMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String name() default "";
String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] value() default {};
String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] path() default {};
String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] params() default {};
String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
* *
* @since 4.3.5 * @since 4.3.5
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
String[] produces() default {};
} }
@@ -22,9 +22,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*; import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code PATCH} requests onto specific handler * Annotation for mapping HTTP {@code PATCH} requests onto specific handler methods. 支持匿名访问 PatchMapping
* methods.
* 支持匿名访问 PatchMapping
* *
* @see AnonymousGetMapping * @see AnonymousGetMapping
* @see AnonymousPostMapping * @see AnonymousPostMapping
@@ -42,43 +40,36 @@ public @interface AnonymousPatchMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String name() default "";
String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] value() default {};
String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] path() default {};
String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] params() default {};
String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
String[] produces() default {};
} }
@@ -22,9 +22,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*; import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code POST} requests onto specific handler * Annotation for mapping HTTP {@code POST} requests onto specific handler methods. 支持匿名访问 PostMapping
* methods.
* 支持匿名访问 PostMapping
* *
* @see AnonymousGetMapping * @see AnonymousGetMapping
* @see AnonymousPostMapping * @see AnonymousPostMapping
@@ -42,43 +40,36 @@ public @interface AnonymousPostMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String name() default "";
String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] value() default {};
String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] path() default {};
String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] params() default {};
String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
String[] produces() default {};
} }
@@ -22,9 +22,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.*; import java.lang.annotation.*;
/** /**
* Annotation for mapping HTTP {@code PUT} requests onto specific handler * Annotation for mapping HTTP {@code PUT} requests onto specific handler methods. 支持匿名访问 PutMapping
* methods.
* 支持匿名访问 PutMapping
* *
* @see AnonymousGetMapping * @see AnonymousGetMapping
* @see AnonymousPostMapping * @see AnonymousPostMapping
@@ -42,43 +40,36 @@ public @interface AnonymousPutMapping {
/** /**
* Alias for {@link RequestMapping#name}. * Alias for {@link RequestMapping#name}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String name() default "";
String name() default "";
/** /**
* Alias for {@link RequestMapping#value}. * Alias for {@link RequestMapping#value}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] value() default {};
String[] value() default {};
/** /**
* Alias for {@link RequestMapping#path}. * Alias for {@link RequestMapping#path}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] path() default {};
String[] path() default {};
/** /**
* Alias for {@link RequestMapping#params}. * Alias for {@link RequestMapping#params}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] params() default {};
String[] params() default {};
/** /**
* Alias for {@link RequestMapping#headers}. * Alias for {@link RequestMapping#headers}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] headers() default {};
String[] headers() default {};
/** /**
* Alias for {@link RequestMapping#consumes}. * Alias for {@link RequestMapping#consumes}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};
String[] consumes() default {};
/** /**
* Alias for {@link RequestMapping#produces}. * Alias for {@link RequestMapping#produces}.
*/ */
@AliasFor(annotation = RequestMapping.class) @AliasFor(annotation = RequestMapping.class) String[] produces() default {};
String[] produces() default {};
} }
@@ -0,0 +1,34 @@
/*
* Copyright 2021-2025 Odboy
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
@Getter
@Setter
@EqualsAndHashCode(callSuper = false)
public class CsBaseCreateTimeTb extends CsObject {
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
}
@@ -0,0 +1,38 @@
/*
* Copyright 2021-2025 Odboy
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
@Getter
@Setter
@EqualsAndHashCode(callSuper = false)
public class CsBaseTimeTb extends CsObject {
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime;
}
@@ -0,0 +1,34 @@
/*
* Copyright 2021-2025 Odboy
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
@Getter
@Setter
@EqualsAndHashCode(callSuper = false)
public class CsBaseUpdateTimeTb extends CsObject {
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime;
}
@@ -21,11 +21,9 @@ import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedBy;
import java.lang.reflect.Field;
import java.util.Date; import java.util.Date;
/** /**
@@ -55,27 +53,4 @@ public class CsBaseUserTimeLogicTb extends CsObject {
@TableLogic @TableLogic
@TableField("available") @TableField("available")
private Integer available; private Integer available;
/* 分组校验 */
public @interface Create {
}
/* 分组校验 */
public @interface Update {
}
@Override
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this);
Field[] fields = this.getClass().getDeclaredFields();
try {
for (Field f : fields) {
f.setAccessible(true);
builder.append(f.getName(), f.get(this)).append("\n");
}
} catch (Exception e) {
builder.append("toString builder encounter an error");
}
return builder.toString();
}
} }
@@ -28,7 +28,6 @@ import org.springframework.data.annotation.LastModifiedBy;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Date; import java.util.Date;
@Getter @Getter
@Setter @Setter
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@@ -15,6 +15,7 @@
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -30,14 +31,21 @@ import java.util.List;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class CsResultVo<T> extends CsObject { public class CsPageResultVo<T> extends CsObject {
private T content; private T content;
private long totalElements; private long totalElements;
public static <T> CsResultVo<List<T>> emptyListData() { public static <T> CsPageResultVo<List<T>> emptyListData() {
CsResultVo<List<T>> result = new CsResultVo<>(); CsPageResultVo<List<T>> result = new CsPageResultVo<>();
result.setTotalElements(0); result.setTotalElements(0);
result.setContent(new ArrayList<>()); result.setContent(new ArrayList<>());
return result; return result;
} }
public static <T> CsPageResultVo<List<T>> listData(IPage<T> page) {
CsPageResultVo<List<T>> result = new CsPageResultVo<>();
result.setTotalElements(page.getTotal());
result.setContent(page.getRecords());
return result;
}
} }
@@ -22,11 +22,7 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum FileTypeEnum { public enum FileTypeEnum {
/* 文件类型 */ /* 文件类型 */
IMAGE("image", "图片"), IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他");
DOC("doc", "文档"),
VOICE("voice", "音频"),
VIDEO("video", "视频"),
OTHER("other", "其他");
private final String code; private final String code;
private final String description; private final String description;
@@ -43,11 +43,6 @@ public class BootApplication {
String port = env.getProperty("server.port"); String port = env.getProperty("server.port");
String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? "" : env.getProperty("config.servlet.context-path"); String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? "" : env.getProperty("config.servlet.context-path");
log.info( log.info(
"\n----------------------------------------------------------\n\t" "\n----------------------------------------------------------\n\t" + "Application is running! Access URLs:\n\t" + "Local: \t\thttp://localhost:" + port + path + "/\n\t" + "External: \thttp://" + ip + ":" + port + path + "/\n\t" + "Swagger文档: \thttp://" + ip + ":" + port + path + "/doc.html\n" + "----------------------------------------------------------");
+ "Application is running! Access URLs:\n\t"
+ "Local: \t\thttp://localhost:" + port + path + "/\n\t"
+ "External: \thttp://" + ip + ":" + port + path + "/\n\t"
+ "Swagger文档: \thttp://" + ip + ":" + port + path + "/doc.html\n"
+ "----------------------------------------------------------");
} }
} }
@@ -27,7 +27,6 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@Slf4j @Slf4j
@SuppressWarnings({"unchecked", "all"}) @SuppressWarnings({"unchecked", "all"})
public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBean { public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBean {
@@ -37,8 +36,7 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
private static boolean addCallback = true; private static boolean addCallback = true;
/** /**
* 针对 某些初始化方法, 在SpringContextHolder 未初始化时 提交回调方法。 * 针对 某些初始化方法, 在SpringContextHolder 未初始化时 提交回调方法。 在SpringContextHolder 初始化后, 进行回调使用
* 在SpringContextHolder 初始化后, 进行回调使用
* *
* @param callBack 回调函数 * @param callBack 回调函数
*/ */
@@ -110,7 +108,8 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
*/ */
private static void assertContextInjected() { private static void assertContextInjected() {
if (applicationContext == null) { if (applicationContext == null) {
throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext" + ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder."); throw new IllegalStateException(
"applicaitonContext属性未注入, 请在applicationContext" + ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");
} }
} }
@@ -58,25 +58,14 @@ public class SwaggerConfig {
@Bean @Bean
public Docket createRestApi() { public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2) return new Docket(DocumentationType.SWAGGER_2).enable(properties.getSwagger().getEnabled()).pathMapping("/").apiInfo(apiInfo()).select()
.enable(properties.getSwagger().getEnabled()) .paths(PathSelectors.regex("^(?!/error).*")).paths(PathSelectors.any()).build()
.pathMapping("/")
.apiInfo(apiInfo())
.select()
.paths(PathSelectors.regex("^(?!/error).*"))
.paths(PathSelectors.any())
.build()
//添加登陆认证 //添加登陆认证
.securitySchemes(securitySchemes()) .securitySchemes(securitySchemes()).securityContexts(securityContexts());
.securityContexts(securityContexts());
} }
private ApiInfo apiInfo() { private ApiInfo apiInfo() {
return new ApiInfoBuilder() return new ApiInfoBuilder().description("一个简单且易上手的 Spring boot 后台管理框架").title("CuteJava 接口文档").version("1.4.1").build();
.description("一个简单且易上手的 Spring boot 后台管理框架")
.title("CuteJava 接口文档")
.version("1.4.1")
.build();
} }
private List<SecurityScheme> securitySchemes() { private List<SecurityScheme> securitySchemes() {
@@ -98,12 +87,9 @@ public class SwaggerConfig {
Set<String> urls = CsAnonTagUtil.getAllAnonymousUrl(applicationContext); Set<String> urls = CsAnonTagUtil.getAllAnonymousUrl(applicationContext);
urls = urls.stream().filter(url -> !"/".equals(url)).collect(Collectors.toSet()); urls = urls.stream().filter(url -> !"/".equals(url)).collect(Collectors.toSet());
String regExp = "^(?!" + apiPath + String.join("|" + apiPath, urls) + ").*$"; String regExp = "^(?!" + apiPath + String.join("|" + apiPath, urls) + ").*$";
return SecurityContext.builder() return SecurityContext.builder().securityReferences(defaultAuth()).operationSelector(o -> o.requestMappingPattern()
.securityReferences(defaultAuth())
.operationSelector(o -> o.requestMappingPattern()
// 排除不需要认证的接口 // 排除不需要认证的接口
.matches(regExp)) .matches(regExp)).build();
.build();
} }
private List<SecurityReference> defaultAuth() { private List<SecurityReference> defaultAuth() {
@@ -134,9 +120,7 @@ public class SwaggerConfig {
} }
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) { private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
List<T> filteredMappings = mappings.stream() List<T> filteredMappings = mappings.stream().filter(mapping -> mapping.getPatternParser() == null).collect(Collectors.toList());
.filter(mapping -> mapping.getPatternParser() == null)
.collect(Collectors.toList());
mappings.clear(); mappings.clear();
mappings.addAll(filteredMappings); mappings.addAll(filteredMappings);
} }
@@ -17,7 +17,6 @@ package cn.odboy.framework.exception.handler;
import lombok.Data; import lombok.Data;
@Data @Data
public final class ApiError { public final class ApiError {
@@ -60,13 +60,7 @@ public class MpCustomP6SpyLogger implements MessageFormattingStrategy {
sql = sql.replaceAll("\\s+", " ").trim(); sql = sql.replaceAll("\\s+", " ").trim();
} }
// 格式化并加上颜色 // 格式化并加上颜色
return String.format( return String.format("CuteJava - %s%s%s %s[%s] %sREVIEW_SQL [Interval: %dms]%s -> %s;", RED, now, RESET, GREEN, Thread.currentThread().getName(), BLUE,
"CuteJava - %s%s%s %s[%s] %sREVIEW_SQL [Interval: %dms]%s -> %s;", elapsed, RESET, sql);
RED, now, RESET,
GREEN, Thread.currentThread().getName(),
BLUE,
elapsed, RESET,
sql
);
} }
} }
@@ -34,13 +34,11 @@ import java.io.IOException;
@SuppressWarnings({"unchecked", "all"}) @SuppressWarnings({"unchecked", "all"})
@ConditionalOnWebApplication @ConditionalOnWebApplication
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class) @AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", @ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true", matchIfMissing = true)
havingValue = "true", matchIfMissing = true)
public class RemoveDruidAdConfig { public class RemoveDruidAdConfig {
/** /**
* 方法名: removeDruidAdFilterRegistrationBean * 方法名: removeDruidAdFilterRegistrationBean 方法描述 除去页面底部的广告
* 方法描述 除去页面底部的广告
* *
* @param properties com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties * @param properties com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties
* @return org.springframework.boot.web.servlet.FilterRegistrationBean * @return org.springframework.boot.web.servlet.FilterRegistrationBean
@@ -18,7 +18,6 @@ package cn.odboy.framework.mybatisplus.core;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.odboy.base.CsBaseUserTimeTb; import cn.odboy.base.CsBaseUserTimeTb;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.util.CsFileUtil;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*; import com.baomidou.mybatisplus.generator.config.*;
@@ -74,9 +73,8 @@ public class CsMpCmdGenUtil {
public void gen(String moduleName, String tablePrefix, List<String> tableNames) { public void gen(String moduleName, String tablePrefix, List<String> tableNames) {
this.parentModuleName = moduleName; this.parentModuleName = moduleName;
// 1.数据库配置 // 1.数据库配置
DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig DataSourceConfig.Builder dataSourceConfigBuilder =
.Builder(this.databaseUrl, this.databaseUsername, this.databasePassword) new DataSourceConfig.Builder(this.databaseUrl, this.databaseUsername, this.databasePassword).driverClassName(this.driverClassName);
.driverClassName(this.driverClassName);
dataSourceConfigBuilder.dbQuery(DB_QUERY); dataSourceConfigBuilder.dbQuery(DB_QUERY);
dataSourceConfigBuilder.keyWordsHandler(new MySqlKeyWordsHandler()); dataSourceConfigBuilder.keyWordsHandler(new MySqlKeyWordsHandler());
// 1.1.快速生成器 // 1.1.快速生成器
@@ -103,8 +101,7 @@ public class CsMpCmdGenUtil {
// 5.策略配置 // 5.策略配置
// 设置需要生成的表名 // 设置需要生成的表名
// 设置过滤表前缀 // 设置过滤表前缀
fastAutoGenerator.strategyConfig(getStrategyConfigConsumer(tableNames) fastAutoGenerator.strategyConfig(getStrategyConfigConsumer(tableNames));
);
if (tablePrefix != null) { if (tablePrefix != null) {
// 表前缀, 可多个 // 表前缀, 可多个
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.addTablePrefix(tablePrefix)); fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.addTablePrefix(tablePrefix));
@@ -119,10 +116,8 @@ public class CsMpCmdGenUtil {
// 开启生成@RestController控制器 // 开启生成@RestController控制器
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle()); fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle());
// 如果不需要生成Controller, fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3.Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I // 如果不需要生成Controller, fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3.Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder fastAutoGenerator.strategyConfig(
.serviceBuilder() strategyConfigBuilder -> strategyConfigBuilder.serviceBuilder().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl"));
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImpl"));
// 5.4.Mapper策略配置 // 5.4.Mapper策略配置
// 格式化 mapper文件名,格式化xml实现类文件名称 // 格式化 mapper文件名,格式化xml实现类文件名称
fastAutoGenerator.strategyConfig(getStrategyConfigConsumer()); fastAutoGenerator.strategyConfig(getStrategyConfigConsumer());
@@ -131,31 +126,19 @@ public class CsMpCmdGenUtil {
} }
private static Consumer<StrategyConfig.Builder> getEntityConfigConsumer() { private static Consumer<StrategyConfig.Builder> getEntityConfigConsumer() {
return strategyConfigBuilder -> strategyConfigBuilder return strategyConfigBuilder -> strategyConfigBuilder.entityBuilder().enableLombok()
.entityBuilder()
.enableLombok()
// 如果不需要生成注解, 去掉.enableTableFieldAnnotation() // 如果不需要生成注解, 去掉.enableTableFieldAnnotation()
.enableTableFieldAnnotation() .enableTableFieldAnnotation().enableFileOverride().naming(NamingStrategy.underline_to_camel).columnNaming(NamingStrategy.underline_to_camel)
.enableFileOverride()
.naming(NamingStrategy.underline_to_camel)
.columnNaming(NamingStrategy.underline_to_camel)
.idType(IdType.AUTO); .idType(IdType.AUTO);
} }
private static Consumer<StrategyConfig.Builder> getStrategyConfigConsumer(List<String> tableNames) { private static Consumer<StrategyConfig.Builder> getStrategyConfigConsumer(List<String> tableNames) {
return strategyConfigBuilder -> strategyConfigBuilder return strategyConfigBuilder -> strategyConfigBuilder.enableCapitalMode().enableSkipView().disableSqlFilter().addInclude(tableNames)
.enableCapitalMode()
.enableSkipView()
.disableSqlFilter()
.addInclude(tableNames)
// 实体类生成策略 // 实体类生成策略
.entityBuilder() .entityBuilder().superClass(CsBaseUserTimeTb.class).addIgnoreColumns("create_time", "update_time", "create_by", "update_by")
.superClass(CsBaseUserTimeTb.class)
.addIgnoreColumns("create_time", "update_time", "create_by", "update_by")
// 开启生成实体时生成字段注解。 // 开启生成实体时生成字段注解。
// 会在实体类的属性前,添加[@TableField("nickname")] // 会在实体类的属性前,添加[@TableField("nickname")]
.enableTableFieldAnnotation() .enableTableFieldAnnotation().disableSerialVersionUID()
.disableSerialVersionUID()
// 阶段2:Mapper策略配置 // 阶段2:Mapper策略配置
.mapperBuilder() .mapperBuilder()
// 开启 @Mapper 注解。 // 开启 @Mapper 注解。
@@ -172,8 +155,7 @@ public class CsMpCmdGenUtil {
// 会在控制类中加[@RestController]注解。 // 会在控制类中加[@RestController]注解。
.enableRestStyle() .enableRestStyle()
// 开启驼峰转连字符 // 开启驼峰转连字符
.enableHyphenStyle() .enableHyphenStyle().build();
.build();
} }
private Consumer<PackageConfig.Builder> getPackageConfigConsumer() { private Consumer<PackageConfig.Builder> getPackageConfigConsumer() {
@@ -181,33 +163,20 @@ public class CsMpCmdGenUtil {
if (StrUtil.isBlank(this.parentModuleName)) { if (StrUtil.isBlank(this.parentModuleName)) {
throw new BadRequestException("模块名称必填"); throw new BadRequestException("模块名称必填");
} }
return packageConfigBuilder -> packageConfigBuilder return packageConfigBuilder -> packageConfigBuilder.parent(this.parentPackageName).moduleName(this.parentModuleName).entity("dal.dataobject")
.parent(this.parentPackageName) .mapper("dal.mysql").service("service").serviceImpl("service.impl").controller("controller")
.moduleName(this.parentModuleName)
.entity("dal.dataobject")
.mapper("dal.mysql")
.service("service")
.serviceImpl("service.impl")
.controller("rest")
.pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath)); .pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath));
} }
private static Consumer<GlobalConfig.Builder> getGlobalConfigConsumer() { private static Consumer<GlobalConfig.Builder> getGlobalConfigConsumer() {
String outputDir = CsFileUtil.getTmpDirPath() + "CodeGen"; String outputDir = projectRootPath + "CodeGen";
return globalConfigBuilder -> globalConfigBuilder return globalConfigBuilder -> globalConfigBuilder.enableSwagger().outputDir(outputDir).author("codegen").commentDate("yyyy-MM-dd")
.enableSwagger()
.outputDir(outputDir)
.author("codegen")
.commentDate("yyyy-MM-dd")
.dateType(DateType.TIME_PACK); .dateType(DateType.TIME_PACK);
} }
private static Consumer<StrategyConfig.Builder> getStrategyConfigConsumer() { private static Consumer<StrategyConfig.Builder> getStrategyConfigConsumer() {
return strategyConfigBuilder -> strategyConfigBuilder return strategyConfigBuilder -> strategyConfigBuilder.mapperBuilder().mapperAnnotation(Mapper.class).formatMapperFileName("%sMapper")
.mapperBuilder() .formatXmlFileName("%sMapper").entityBuilder().formatFileName("%sTb");
.mapperAnnotation(Mapper.class)
.formatMapperFileName("%sMapper")
.formatXmlFileName("%sMapper");
} }
private static Consumer<DataSourceConfig.Builder> getDataSourceConfigConsumer() { private static Consumer<DataSourceConfig.Builder> getDataSourceConfigConsumer() {
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.framework.mybatisplus.core.interfaces; package cn.odboy.framework.mybatisplus.core.interfaces;
import cn.odboy.base.CsResultVo; import cn.odboy.base.CsPageResultVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
@@ -56,13 +56,13 @@ public interface CsMpEasyService<T> extends IService<T> {
<G> List<G> queryFeatureClazzListByArgs(LambdaQueryWrapper<T> wrapper, Class<G> targetClazz); <G> List<G> queryFeatureClazzListByArgs(LambdaQueryWrapper<T> wrapper, Class<G> targetClazz);
CsResultVo<List<T>> queryClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable); CsPageResultVo<List<T>> queryClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable);
<G> CsResultVo<List<G>> queryFeatureClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable, Class<G> targetClazz); <G> CsPageResultVo<List<G>> queryFeatureClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable, Class<G> targetClazz);
<G, Q> CsResultVo<List<G>> queryFeatureClazzPageByArgs(Q criteria, IPage<T> pageable, Class<G> targetClazz); <G, Q> CsPageResultVo<List<G>> queryFeatureClazzPageByArgs(Q criteria, IPage<T> pageable, Class<G> targetClazz);
<Q> CsResultVo<List<T>> queryClazzPageByArgs(Q criteria, IPage<T> pageable); <Q> CsPageResultVo<List<T>> queryClazzPageByArgs(Q criteria, IPage<T> pageable);
int modifyClazzByArgs(LambdaQueryWrapper<T> wrapper, T entity); int modifyClazzByArgs(LambdaQueryWrapper<T> wrapper, T entity);
@@ -18,7 +18,7 @@ package cn.odboy.framework.mybatisplus.core.interfaces;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import cn.odboy.base.CsResultVo; import cn.odboy.base.CsPageResultVo;
import cn.odboy.util.CsPageUtil; import cn.odboy.util.CsPageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -136,16 +136,16 @@ public interface CsMpMapper<E> extends BaseMapper<E> {
* @param clazz 期望的对象类型 * @param clazz 期望的对象类型
* @return IPage<T> * @return IPage<T>
*/ */
default <T> CsResultVo<List<T>> queryFeatureClazzPage(Pageable pageable, LambdaQueryWrapper<E> wrapper, Class<T> clazz) { default <T> CsPageResultVo<List<T>> queryFeatureClazzPage(Pageable pageable, LambdaQueryWrapper<E> wrapper, Class<T> clazz) {
int pageNumber = pageable.getPageNumber(); int pageNumber = pageable.getPageNumber();
int pageSize = pageable.getPageSize(); int pageSize = pageable.getPageSize();
pageNumber = pageNumber <= 0 ? 1 : pageNumber; pageNumber = pageNumber <= 0 ? 1 : pageNumber;
pageSize = pageSize <= 0 ? 10 : pageSize; pageSize = pageSize <= 0 ? 10 : pageSize;
IPage<E> pageInfo = this.selectPage(new Page<>(pageNumber, pageSize), wrapper); IPage<E> pageInfo = this.selectPage(new Page<>(pageNumber, pageSize), wrapper);
if (CollUtil.isEmpty(pageInfo.getRecords())) { if (CollUtil.isEmpty(pageInfo.getRecords())) {
return new CsResultVo<>(new ArrayList<>(), pageInfo.getTotal()); return new CsPageResultVo<>(new ArrayList<>(), pageInfo.getTotal());
} }
return new CsResultVo<>(BeanUtil.copyToList(pageInfo.getRecords(), clazz), pageInfo.getTotal()); return new CsPageResultVo<>(BeanUtil.copyToList(pageInfo.getRecords(), clazz), pageInfo.getTotal());
} }
/** /**
@@ -156,7 +156,7 @@ public interface CsMpMapper<E> extends BaseMapper<E> {
* @param clazz 期望的对象类型 * @param clazz 期望的对象类型
* @return IPage<T> * @return IPage<T>
*/ */
default <T> CsResultVo<List<T>> queryFeatureClazzPage(Pageable pageable, LambdaQueryChainWrapper<E> wrapper, Class<T> clazz) { default <T> CsPageResultVo<List<T>> queryFeatureClazzPage(Pageable pageable, LambdaQueryChainWrapper<E> wrapper, Class<T> clazz) {
int pageNumber = pageable.getPageNumber(); int pageNumber = pageable.getPageNumber();
int pageSize = pageable.getPageSize(); int pageSize = pageable.getPageSize();
pageNumber = pageNumber <= 0 ? 1 : pageNumber; pageNumber = pageNumber <= 0 ? 1 : pageNumber;
@@ -165,7 +165,7 @@ public interface CsMpMapper<E> extends BaseMapper<E> {
if (CollUtil.isEmpty(pageInfo.getRecords())) { if (CollUtil.isEmpty(pageInfo.getRecords())) {
return CsPageUtil.emptyListData(); return CsPageUtil.emptyListData();
} }
return new CsResultVo<>(BeanUtil.copyToList(pageInfo.getRecords(), clazz), pageInfo.getTotal()); return new CsPageResultVo<>(BeanUtil.copyToList(pageInfo.getRecords(), clazz), pageInfo.getTotal());
} }
/** /**
@@ -17,7 +17,7 @@ package cn.odboy.framework.mybatisplus.core.interfaces;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.odboy.base.CsResultVo; import cn.odboy.base.CsPageResultVo;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.framework.mybatisplus.core.CsMpQUtil; import cn.odboy.framework.mybatisplus.core.CsMpQUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -193,12 +193,12 @@ public class CsMpServiceImpl<M extends CsMpMapper<T>, T> extends ServiceImpl<M,
* @param wrapper 制造条件 * @param wrapper 制造条件
* @param pageable 分页参数 * @param pageable 分页参数
*/ */
public CsResultVo<List<T>> queryClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable) { public CsPageResultVo<List<T>> queryClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable) {
if (wrapper == null) { if (wrapper == null) {
wrapper = new LambdaQueryWrapper<>(); wrapper = new LambdaQueryWrapper<>();
} }
IPage<T> originPageData = baseMapper.selectPage(pageable, wrapper); IPage<T> originPageData = baseMapper.selectPage(pageable, wrapper);
return new CsResultVo<>(originPageData.getRecords(), originPageData.getTotal()); return new CsPageResultVo<>(originPageData.getRecords(), originPageData.getTotal());
} }
/** /**
@@ -208,24 +208,24 @@ public class CsMpServiceImpl<M extends CsMpMapper<T>, T> extends ServiceImpl<M,
* @param pageable 分页参数 * @param pageable 分页参数
* @param targetClazz 目标类型 * @param targetClazz 目标类型
*/ */
public <G> CsResultVo<List<G>> queryFeatureClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable, Class<G> targetClazz) { public <G> CsPageResultVo<List<G>> queryFeatureClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable, Class<G> targetClazz) {
if (wrapper == null) { if (wrapper == null) {
wrapper = new LambdaQueryWrapper<>(); wrapper = new LambdaQueryWrapper<>();
} }
IPage<T> originPageData = baseMapper.selectPage(pageable, wrapper); IPage<T> originPageData = baseMapper.selectPage(pageable, wrapper);
return new CsResultVo<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), originPageData.getTotal()); return new CsPageResultVo<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), originPageData.getTotal());
} }
public <G, Q> CsResultVo<List<G>> queryFeatureClazzPageByArgs(Q criteria, IPage<T> pageable, Class<G> targetClazz) { public <G, Q> CsPageResultVo<List<G>> queryFeatureClazzPageByArgs(Q criteria, IPage<T> pageable, Class<G> targetClazz) {
QueryWrapper<T> wrapper = CsMpQUtil.build(criteria); QueryWrapper<T> wrapper = CsMpQUtil.build(criteria);
IPage<T> originPageData = baseMapper.selectPage(pageable, wrapper); IPage<T> originPageData = baseMapper.selectPage(pageable, wrapper);
return new CsResultVo<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), originPageData.getTotal()); return new CsPageResultVo<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), originPageData.getTotal());
} }
public <Q> CsResultVo<List<T>> queryClazzPageByArgs(Q criteria, IPage<T> pageable) { public <Q> CsPageResultVo<List<T>> queryClazzPageByArgs(Q criteria, IPage<T> pageable) {
QueryWrapper<T> wrapper = CsMpQUtil.build(criteria); QueryWrapper<T> wrapper = CsMpQUtil.build(criteria);
IPage<T> originPageData = baseMapper.selectPage(pageable, wrapper); IPage<T> originPageData = baseMapper.selectPage(pageable, wrapper);
return new CsResultVo<>(originPageData.getRecords(), originPageData.getTotal()); return new CsPageResultVo<>(originPageData.getRecords(), originPageData.getTotal());
} }
/** /**
@@ -50,28 +50,21 @@ import java.util.Map;
@AutoConfigureBefore(RedisAutoConfiguration.class) @AutoConfigureBefore(RedisAutoConfiguration.class)
public class RedisConfiguration extends CachingConfigurerSupport { public class RedisConfiguration extends CachingConfigurerSupport {
/** /**
* 自动识别json对象白名单配置(仅允许解析的包名, 范围越小越安全)<br/> * 自动识别json对象白名单配置(仅允许解析的包名, 范围越小越安全)<br/> 未配置可能导致, 登录失败, 反复登录等问题
* 未配置可能导致, 登录失败, 反复登录等问题
*/ */
private static final String[] WHITELIST_STR = { private static final String[] WHITELIST_STR =
"org.springframework", {"org.springframework", "cn.odboy.system.dal.dataobject", "cn.odboy.system.dal.model", "cn.odboy.pipeline.dal.dataobject",
"cn.odboy.system.dal.dataobject", "cn.odboy.pipeline.dal.model", "cn.odboy.pipeline.framework.pipeline.model"};
"cn.odboy.system.dal.model",
"cn.odboy.pipeline.dal.dataobject",
"cn.odboy.pipeline.dal.model",
"cn.odboy.devops.framework.pipeline.model",
};
/** /**
* 设置 redis 数据默认过期时间,默认2小时 * 设置 redis 数据默认过期时间,默认2小时 设置@cacheable 序列化方式
* 设置@cacheable 序列化方式
*/ */
@Bean @Bean
public RedisCacheConfiguration redisCacheConfiguration() { public RedisCacheConfiguration redisCacheConfiguration() {
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig(); RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
configuration = configuration.serializeValuesWith(RedisSerializationContext. configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer))
SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofHours(2)); .entryTtl(Duration.ofHours(2));
return configuration; return configuration;
} }
@@ -103,9 +96,7 @@ public class RedisConfiguration extends CachingConfigurerSupport {
@Bean @Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration config = redisCacheConfiguration(); RedisCacheConfiguration config = redisCacheConfiguration();
return RedisCacheManager.builder(redisConnectionFactory) return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();
.cacheDefaults(config)
.build();
} }
/** /**
@@ -202,8 +202,8 @@ public class RedisHelper {
public void scanDel(String pattern) { public void scanDel(String pattern) {
ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); ScanOptions options = ScanOptions.scanOptions().match(pattern).build();
try (Cursor<byte[]> cursor = redisTemplate.executeWithStickyConnection( try (Cursor<byte[]> cursor = redisTemplate.executeWithStickyConnection(
(RedisCallback<Cursor<byte[]>>) connection -> (Cursor<byte[]>) new ConvertingCursor<>( (RedisCallback<Cursor<byte[]>>)connection -> (Cursor<byte[]>)new ConvertingCursor<>(connection.scan(options),
connection.scan(options), redisTemplate.getKeySerializer()::deserialize))) { redisTemplate.getKeySerializer()::deserialize))) {
while (cursor.hasNext()) { while (cursor.hasNext()) {
redisTemplate.delete(cursor.next()); redisTemplate.delete(cursor.next());
} }
@@ -265,7 +265,6 @@ public class RedisHelper {
return null; return null;
} }
/** /**
* 普通缓存获取 * 普通缓存获取
* *
@@ -55,12 +55,8 @@ public class RedissonConfiguration {
@Bean @Bean
public RedissonClient redissonClient() { public RedissonClient redissonClient() {
Config config = new Config(); Config config = new Config();
config.useSingleServer() config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort).setDatabase(redisDatabase).setTimeout(timeout)
.setAddress("redis://" + redisHost + ":" + redisPort) .setConnectionPoolSize(connectionPoolSize).setConnectionMinimumIdleSize(connectionMinimumIdleSize);
.setDatabase(redisDatabase)
.setTimeout(timeout)
.setConnectionPoolSize(connectionPoolSize)
.setConnectionMinimumIdleSize(connectionMinimumIdleSize);
if (StrUtil.isNotBlank(redisPassword)) { if (StrUtil.isNotBlank(redisPassword)) {
config.useSingleServer().setPassword(redisPassword); config.useSingleServer().setPassword(redisPassword);
} }
@@ -48,7 +48,8 @@ public class AsyncTheadPoolConfig implements AsyncConfigurer {
// 自定义工厂 // 自定义工厂
ThreadFactory factory = r -> new Thread(r, "default-async-" + new AtomicInteger(1).getAndIncrement()); ThreadFactory factory = r -> new Thread(r, "default-async-" + new AtomicInteger(1).getAndIncrement());
// 自定义线程池 // 自定义线程池
return new ThreadPoolExecutor(asyncTaskPool.getCorePoolSize(), asyncTaskPool.getMaxPoolSize(), asyncTaskPool.getKeepAliveSeconds(), TimeUnit.SECONDS, new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()), factory, new ThreadPoolExecutor.CallerRunsPolicy()); return new ThreadPoolExecutor(asyncTaskPool.getCorePoolSize(), asyncTaskPool.getMaxPoolSize(), asyncTaskPool.getKeepAliveSeconds(), TimeUnit.SECONDS,
new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()), factory, new ThreadPoolExecutor.CallerRunsPolicy());
} }
/** /**
@@ -35,14 +35,12 @@ public class DateStringArraysToListDateConverter implements Converter<String[],
if (source.length == 0) { if (source.length == 0) {
return Collections.emptyList(); return Collections.emptyList();
} }
return Arrays.stream(source) return Arrays.stream(source).map(s -> {
.map(s -> {
try { try {
return sdf.parse(s); return sdf.parse(s);
} catch (ParseException e) { } catch (ParseException e) {
throw new IllegalArgumentException("Invalid date string: " + s); throw new IllegalArgumentException("Invalid date string: " + s);
} }
}) }).collect(Collectors.toList());
.collect(Collectors.toList());
} }
} }
@@ -19,7 +19,6 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter; import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration @Configuration
public class WsConfig { public class WsConfig {
@@ -22,8 +22,7 @@ import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
* 解决启动io.undertow.websockets.jsr UT026010: Buffer pool was not * 解决启动io.undertow.websockets.jsr UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used的警告
* set on WebSocketDeploymentInfo, the default pool will be used的警告
* *
* @date 2024-06-07 * @date 2024-06-07
*/ */
@@ -28,7 +28,6 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@Slf4j @Slf4j
@Component @Component
@ServerEndpoint("/websocket/{sid}") @ServerEndpoint("/websocket/{sid}")
@@ -160,10 +160,7 @@ public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
* @return / * @return /
*/ */
public static BigDecimal streamBigDecimalMax(List<BigDecimal> data) { public static BigDecimal streamBigDecimalMax(List<BigDecimal> data) {
return data.stream() return data.stream().filter(Objects::nonNull).reduce(BigDecimal::max).orElse(null);
.filter(Objects::nonNull)
.reduce(BigDecimal::max)
.orElse(null);
} }
/** /**
@@ -175,10 +172,7 @@ public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
* @return / * @return /
*/ */
public static BigDecimal streamBigDecimalMin(List<BigDecimal> data) { public static BigDecimal streamBigDecimalMin(List<BigDecimal> data) {
return data.stream() return data.stream().filter(Objects::nonNull).reduce(BigDecimal::min).orElse(null);
.filter(Objects::nonNull)
.reduce(BigDecimal::min)
.orElse(null);
} }
/** /**
@@ -190,10 +184,7 @@ public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
* @return / * @return /
*/ */
public static BigDecimal streamBigDecimalAvg(List<BigDecimal> data) { public static BigDecimal streamBigDecimalAvg(List<BigDecimal> data) {
return data.stream() return data.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(data.size()), 6, RoundingMode.FLOOR);
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(BigDecimal.valueOf(data.size()), 6, RoundingMode.FLOOR);
} }
public static void main(String[] args) { public static void main(String[] args) {
@@ -144,17 +144,12 @@ public final class CsDistributedIdUtil {
// 序列号溢出,等待下一毫秒 // 序列号溢出,等待下一毫秒
currentTimestamp = waitNextMillis(lastTimestampValue); currentTimestamp = waitNextMillis(lastTimestampValue);
} }
return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift) | seq;
(dataCenterId << dataCenterIdShift) |
(workerId << workerIdShift) |
seq;
} else { } else {
// 时间戳改变,重置序列号 // 时间戳改变,重置序列号
sequence.set(0L); sequence.set(0L);
lastTimestamp.set(currentTimestamp); lastTimestamp.set(currentTimestamp);
return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift);
(dataCenterId << dataCenterIdShift) |
(workerId << workerIdShift);
} }
} }
@@ -54,9 +54,7 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
/** /**
* 系统临时目录 * 系统临时目录
* <br> * <br>
* windows 包含路径分割符, 但Linux 不包含, * windows 包含路径分割符, 但Linux 不包含, 在windows \\==\ 前提下, 为安全起见 同意拼装 路径分割符,
* 在windows \\==\ 前提下,
* 为安全起见 同意拼装 路径分割符,
* <pre> * <pre>
* java.io.tmpdir * java.io.tmpdir
* windows : C:\Users/xxx\AppData\Local\Temp\ * windows : C:\Users/xxx\AppData\Local\Temp\
@@ -192,8 +190,8 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
if (value instanceof String) { if (value instanceof String) {
String strValue = (String)value; String strValue = (String)value;
// 检查并处理以特殊字符开头的值 // 检查并处理以特殊字符开头的值
if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD) if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD) || strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith(
|| strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith(SYMBOL_AT)) { SYMBOL_AT)) {
// 添加单引号前缀 // 添加单引号前缀
strValue = "'" + strValue; strValue = "'" + strValue;
} }
@@ -382,8 +380,7 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
fileName = fileName.replaceAll("^\\.+/", ""); fileName = fileName.replaceAll("^\\.+/", "");
// 保留文件名中最后一个 "." 字符,过滤掉其他 "." // 保留文件名中最后一个 "." 字符,过滤掉其他 "."
fileName = fileName.replaceAll("^(.*)(\\.[^.]*)$", "$1").replaceAll("\\.", "") + fileName = fileName.replaceAll("^(.*)(\\.[^.]*)$", "$1").replaceAll("\\.", "") + fileName.replaceAll("^(.*)(\\.[^.]*)$", "$2");
fileName.replaceAll("^(.*)(\\.[^.]*)$", "$2");
return fileName; return fileName;
} }
@@ -45,7 +45,6 @@ public final class CsIPUtil {
return null; return null;
} }
/** /**
* 获取当前机器的IP * 获取当前机器的IP
* *
@@ -39,16 +39,13 @@ public final class CsListUtil {
* @param classifier 对象T属性表达式, 比如: User::getName * @param classifier 对象T属性表达式, 比如: User::getName
*/ */
public static <T, K> List<T> distinctByArgs(List<T> items, Function<? super T, ? extends K> classifier) { public static <T, K> List<T> distinctByArgs(List<T> items, Function<? super T, ? extends K> classifier) {
return items.stream() return items.stream().collect(Collectors.groupingBy(classifier)).values().stream().map(monitorItem -> monitorItem.iterator().next())
.collect(Collectors.groupingBy(classifier))
.values().stream()
.map(monitorItem -> monitorItem.iterator().next())
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
/** /**
* list转map, 保留新值 -> Map<String, User> userMap = items.stream().collect(Collectors.toMap(User::getName, user -> user)) <br> * list转map, 保留新值 -> Map<String, User> userMap = items.stream().collect(Collectors.toMap(User::getName, user -> user)) <br> list转map, 保留旧值 -> Map<String,
* list转map, 保留旧值 -> Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getName, user -> user, (existing, replacement) -> existing)); * User> userMap = users.stream().collect(Collectors.toMap(User::getName, user -> user, (existing, replacement) -> existing));
*/ */
public static void main(String[] args) { public static void main(String[] args) {
List<CsBaseUserTimeTb> entities = new ArrayList<>(); List<CsBaseUserTimeTb> entities = new ArrayList<>();
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.util; package cn.odboy.util;
import cn.odboy.base.CsResultVo; import cn.odboy.base.CsPageResultVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -52,36 +52,36 @@ public final class CsPageUtil extends cn.hutool.core.util.PageUtil {
/** /**
* Page 数据处理 * Page 数据处理
*/ */
public static <T> CsResultVo<List<T>> toPage(IPage<T> page) { public static <T> CsPageResultVo<List<T>> toPage(IPage<T> page) {
return new CsResultVo<>(page.getRecords(), page.getTotal()); return new CsPageResultVo<>(page.getRecords(), page.getTotal());
} }
/** /**
* 自定义分页 * 自定义分页
*/ */
public static <T> CsResultVo<List<T>> toPage(List<T> list) { public static <T> CsPageResultVo<List<T>> toPage(List<T> list) {
return new CsResultVo<>(list, list.size()); return new CsPageResultVo<>(list, list.size());
} }
/** /**
* 返回空数据 * 返回空数据
*/ */
public static <T> CsResultVo<List<T>> emptyListData() { public static <T> CsPageResultVo<List<T>> emptyListData() {
return new CsResultVo<>(new ArrayList<>(), 0); return new CsPageResultVo<>(new ArrayList<>(), 0);
} }
/** /**
* 返回空数据 * 返回空数据
*/ */
public static <T> CsResultVo<T> emptyData() { public static <T> CsPageResultVo<T> emptyData() {
return new CsResultVo<>(null, 0); return new CsPageResultVo<>(null, 0);
} }
/** /**
* 自定义分页 * 自定义分页
*/ */
public static <T> CsResultVo<List<T>> toPage(List<T> list, long totalElements) { public static <T> CsPageResultVo<List<T>> toPage(List<T> list, long totalElements) {
return new CsResultVo<>(list, totalElements); return new CsPageResultVo<>(list, totalElements);
} }
public static <T> Page<T> getCount(BaseMapper<T> baseMapper) { public static <T> Page<T> getCount(BaseMapper<T> baseMapper) {
@@ -189,7 +189,6 @@ public final class CsRsaEncryptUtil {
return new RsaKeyPair(publicKeyString, privateKeyString); return new RsaKeyPair(publicKeyString, privateKeyString);
} }
/** /**
* RSA密钥对对象 * RSA密钥对对象
*/ */
@@ -18,9 +18,7 @@ public final class CsStringUtil extends org.apache.commons.lang3.StringUtils {
/** /**
* 驼峰命名法工具 * 驼峰命名法工具
* *
* @return toCamelCase(" hello_world ") == "helloWorld" * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" toUnderScoreCase("helloWorld") = "hello_world"
* toCapitalizeCamelCase("hello_world") == "HelloWorld"
* toUnderScoreCase("helloWorld") = "hello_world"
*/ */
public static String toCamelCase(String s) { public static String toCamelCase(String s) {
if (s == null) { if (s == null) {
@@ -50,9 +48,7 @@ public final class CsStringUtil extends org.apache.commons.lang3.StringUtils {
/** /**
* 驼峰命名法工具 * 驼峰命名法工具
* *
* @return toCamelCase(" hello_world ") == "helloWorld" * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" toUnderScoreCase("helloWorld") = "hello_world"
* toCapitalizeCamelCase("hello_world") == "HelloWorld"
* toUnderScoreCase("helloWorld") = "hello_world"
*/ */
public static String toCapitalizeCamelCase(String s) { public static String toCapitalizeCamelCase(String s) {
if (s == null) { if (s == null) {
@@ -65,9 +61,7 @@ public final class CsStringUtil extends org.apache.commons.lang3.StringUtils {
/** /**
* 驼峰命名法工具 * 驼峰命名法工具
* *
* @return toCamelCase(" hello_world ") == "helloWorld" * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" toUnderScoreCase("helloWorld") = "hello_world"
* toCapitalizeCamelCase("hello_world") == "HelloWorld"
* toUnderScoreCase("helloWorld") = "hello_world"
*/ */
public static String toUnderScoreCase(String s) { public static String toUnderScoreCase(String s) {
if (s == null) { if (s == null) {
@@ -100,7 +94,6 @@ public final class CsStringUtil extends org.apache.commons.lang3.StringUtils {
return sb.toString(); return sb.toString();
} }
/** /**
* 获得当天是周几 * 获得当天是周几
*/ */
@@ -44,11 +44,7 @@ public final class CsValidUtil {
public static <T> void validate(T object) { public static <T> void validate(T object) {
Set<ConstraintViolation<T>> violations = VALIDATOR.validate(object, Default.class); Set<ConstraintViolation<T>> violations = VALIDATOR.validate(object, Default.class);
if (!violations.isEmpty()) { if (!violations.isEmpty()) {
throw new IllegalArgumentException(violations throw new IllegalArgumentException(violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(",")));
.stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.joining(","))
);
} }
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>cutejava-module-pipeline</artifactId> <artifactId>cutejava-module-pipeline</artifactId>
<name>devops应用模块</name> <name>pipeline模块</name>
<dependencies> <dependencies>
<dependency> <dependency>
@@ -16,7 +16,7 @@
package cn.odboy.devops.dal.dataobject; package cn.odboy.devops.dal.dataobject;
import cn.odboy.base.CsObject; import cn.odboy.base.CsObject;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeOperateButtonVo; import cn.odboy.devops.framework.pipeline.model.PipelineNodeOperateButtonVo;
import com.alibaba.fastjson2.annotation.JSONField; import com.alibaba.fastjson2.annotation.JSONField;
import com.anwen.mongo.annotation.ID; import com.anwen.mongo.annotation.ID;
@@ -21,7 +21,6 @@ import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class StartPipelineResultVo extends CsObject { public class StartPipelineResultVo extends CsObject {
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.dal.redis; package cn.odboy.devops.dal.redis;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
import cn.odboy.framework.redis.RedisHelper; import cn.odboy.framework.redis.RedisHelper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.framework.pipeline; package cn.odboy.devops.framework.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.service.core.PipelineInstanceNodeDetailService; import cn.odboy.devops.service.core.PipelineInstanceNodeDetailService;
import cn.odboy.devops.service.core.PipelineInstanceNodeService; import cn.odboy.devops.service.core.PipelineInstanceNodeService;
@@ -33,7 +33,8 @@ public abstract class AbstractPipelineNodeJobService {
return pipelineInstanceNodeService.getPipelineInstanceNodeByArgs(instanceId, code); return pipelineInstanceNodeService.getPipelineInstanceNodeByArgs(instanceId, code);
} }
public void addPipelineInstanceNodeDetailLog(PipelineInstanceNodeTb pipelineInstanceNode, String stepName, PipelineStatusEnum stepStatus, String stepMsg, Date finishTime) { public void addPipelineInstanceNodeDetailLog(PipelineInstanceNodeTb pipelineInstanceNode, String stepName, PipelineStatusEnum stepStatus, String stepMsg,
Date finishTime) {
if (pipelineInstanceNode != null) { if (pipelineInstanceNode != null) {
pipelineInstanceNodeDetailService.addLog(pipelineInstanceNode.getId(), pipelineInstanceNode.getCode(), stepName, stepStatus, stepMsg, finishTime); pipelineInstanceNodeDetailService.addLog(pipelineInstanceNode.getId(), pipelineInstanceNode.getCode(), stepName, stepStatus, stepMsg, finishTime);
} }
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.devops.constant.pipeline; package cn.odboy.devops.framework.pipeline.constant;
/** /**
* 流水线 常量 * 流水线 常量
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.devops.constant.pipeline; package cn.odboy.devops.framework.pipeline.constant;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -24,9 +24,7 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum PipelineStatusEnum { public enum PipelineStatusEnum {
PENDING("pending", "#C0C4CC", "未开始"), PENDING("pending", "#C0C4CC", "未开始"), RUNNING("running", "#409EFF", "运行中"), SUCCESS("success", "#67C23A", "执行成功"),
RUNNING("running", "#409EFF", "运行中"),
SUCCESS("success", "#67C23A", "执行成功"),
FAIL("fail", "#F56C6C", "执行失败"); FAIL("fail", "#F56C6C", "执行失败");
/** /**
* 状态码 * 状态码
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.devops.constant.pipeline; package cn.odboy.devops.framework.pipeline.constant;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -24,11 +24,7 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum PipelineTypeEnum { public enum PipelineTypeEnum {
BACKEND("backend", "后端"), BACKEND("backend", "后端"), FRONT("front", "前端"), MOBILE("mobile", "移动端"), ANDROID("pc", "PC端"), UN_SUPPORT("un_support", "不支持的类型");
FRONT("front", "前端"),
MOBILE("mobile", "移动端"),
ANDROID("pc", "PC端"),
UN_SUPPORT("un_support", "不支持的类型");
/** /**
* 类型编码 * 类型编码
*/ */
@@ -17,8 +17,8 @@ package cn.odboy.devops.framework.pipeline.core;
import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
import cn.odboy.devops.dal.mysql.PipelineInstanceMapper; import cn.odboy.devops.dal.mysql.PipelineInstanceMapper;
@@ -156,7 +156,8 @@ public class PipelineJobBean implements InterruptableJob {
} }
// 检查实例节点状态 // 检查实例节点状态
ThreadUtil.safeSleep(3000); ThreadUtil.safeSleep(3000);
PipelineInstanceNodeTb runningInstanceNode = pipelineInstanceNodeService.getPipelineInstanceNodeByArgs(instanceId, pipelineNodeTemplateVo.getCode()); PipelineInstanceNodeTb runningInstanceNode =
pipelineInstanceNodeService.getPipelineInstanceNodeByArgs(instanceId, pipelineNodeTemplateVo.getCode());
if (PipelineStatusEnum.SUCCESS.getCode().equals(runningInstanceNode.getCurrentNodeStatus())) { if (PipelineStatusEnum.SUCCESS.getCode().equals(runningInstanceNode.getCurrentNodeStatus())) {
pipelineStatusEnum = PipelineStatusEnum.SUCCESS; pipelineStatusEnum = PipelineStatusEnum.SUCCESS;
pipelineInstanceTb.setCurrentNodeStatus(pipelineStatusEnum.getCode()); pipelineInstanceTb.setCurrentNodeStatus(pipelineStatusEnum.getCode());
@@ -236,13 +237,8 @@ public class PipelineJobBean implements InterruptableJob {
pipelineInstanceTb.setCurrentNodeStatus(PipelineStatusEnum.FAIL.getCode()); pipelineInstanceTb.setCurrentNodeStatus(PipelineStatusEnum.FAIL.getCode());
// 更新节点状态 // 更新节点状态
PipelineInstanceNodeService pipelineInstanceNodeService = CsSpringBeanHolder.getBean(PipelineInstanceNodeService.class); PipelineInstanceNodeService pipelineInstanceNodeService = CsSpringBeanHolder.getBean(PipelineInstanceNodeService.class);
pipelineInstanceNodeService.finishPipelineInstanceNodeByArgs( pipelineInstanceNodeService.finishPipelineInstanceNodeByArgs(this.currentInstanceId, this.currentNodeCode, PipelineStatusEnum.FAIL,
this.currentInstanceId, "用户主动停止", new Date());
this.currentNodeCode,
PipelineStatusEnum.FAIL,
"用户主动停止",
new Date()
);
} }
pipelineInstanceTb.setStatus(PipelineStatusEnum.FAIL.getCode()); pipelineInstanceTb.setStatus(PipelineStatusEnum.FAIL.getCode());
// 更新实例状态 // 更新实例状态
@@ -16,7 +16,7 @@
package cn.odboy.devops.framework.pipeline.core; package cn.odboy.devops.framework.pipeline.core;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -85,8 +85,7 @@ public class PipelineJobManage {
} }
/** /**
* 中断正在执行的任务<br/> * 中断正在执行的任务<br/> 任务终止需要配合响应中断或停止信号
* 任务终止需要配合响应中断或停止信号
*/ */
public void interruptJob(Long instanceId) throws SchedulerException { public void interruptJob(Long instanceId) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(String.format(JOB_KEY, instanceId)); JobKey jobKey = JobKey.jobKey(String.format(JOB_KEY, instanceId));
@@ -15,8 +15,8 @@
*/ */
package cn.odboy.devops.framework.pipeline.core; package cn.odboy.devops.framework.pipeline.core;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeJobExecuteResult; import cn.odboy.devops.framework.pipeline.model.PipelineNodeJobExecuteResult;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo; import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo;
import cn.odboy.devops.service.core.PipelineInstanceNodeService; import cn.odboy.devops.service.core.PipelineInstanceNodeService;
@@ -50,16 +50,19 @@ public class PipelineNodeJobBean implements Job {
try { try {
String serviceName = PipelineConst.EXECUTOR_PREFIX + nodeCode; String serviceName = PipelineConst.EXECUTOR_PREFIX + nodeCode;
PipelineNodeJobExecutor pipelineNodeJobExecutor = CsSpringBeanHolder.getBean(serviceName); PipelineNodeJobExecutor pipelineNodeJobExecutor = CsSpringBeanHolder.getBean(serviceName);
pipelineInstanceNodeService.updatePipelineInstanceNodeByArgs(instanceId, nodeCode, PipelineStatusEnum.RUNNING, PipelineStatusEnum.RUNNING.getDesc()); pipelineInstanceNodeService.updatePipelineInstanceNodeByArgs(instanceId, nodeCode, PipelineStatusEnum.RUNNING,
PipelineStatusEnum.RUNNING.getDesc());
PipelineNodeJobExecuteResult executeResult = pipelineNodeJobExecutor.execute(jobDataMap); PipelineNodeJobExecuteResult executeResult = pipelineNodeJobExecutor.execute(jobDataMap);
jobExecutionContext.getMergedJobDataMap().put(PipelineConst.LAST_NODE_RESULT, executeResult); jobExecutionContext.getMergedJobDataMap().put(PipelineConst.LAST_NODE_RESULT, executeResult);
pipelineInstanceNodeService.finishPipelineInstanceNodeByArgs(instanceId, nodeCode, PipelineStatusEnum.SUCCESS, PipelineStatusEnum.SUCCESS.getDesc(), new Date()); pipelineInstanceNodeService.finishPipelineInstanceNodeByArgs(instanceId, nodeCode, PipelineStatusEnum.SUCCESS, PipelineStatusEnum.SUCCESS.getDesc(),
new Date());
} catch (BadRequestException e) { } catch (BadRequestException e) {
log.error("流水线节点执行异常", e); log.error("流水线节点执行异常", e);
pipelineInstanceNodeService.finishPipelineInstanceNodeByArgs(instanceId, nodeCode, PipelineStatusEnum.FAIL, e.getMessage(), new Date()); pipelineInstanceNodeService.finishPipelineInstanceNodeByArgs(instanceId, nodeCode, PipelineStatusEnum.FAIL, e.getMessage(), new Date());
} catch (Exception e) { } catch (Exception e) {
log.error("流水线节点执行异常", e); log.error("流水线节点执行异常", e);
pipelineInstanceNodeService.finishPipelineInstanceNodeByArgs(instanceId, nodeCode, PipelineStatusEnum.FAIL, PipelineStatusEnum.FAIL.getDesc(), new Date()); pipelineInstanceNodeService.finishPipelineInstanceNodeByArgs(instanceId, nodeCode, PipelineStatusEnum.FAIL, PipelineStatusEnum.FAIL.getDesc(),
new Date());
} }
} }
} }
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.framework.pipeline.core; package cn.odboy.devops.framework.pipeline.core;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo; import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
@@ -49,16 +49,10 @@ public class PipelineNodeJobManage {
String keyName = String.format(JOB_KEY, instanceId, pipelineNodeTemplate.getCode()); String keyName = String.format(JOB_KEY, instanceId, pipelineNodeTemplate.getCode());
// 构建 JobDetail // 构建 JobDetail
JobKey jobKey = JobKey.jobKey(keyName); JobKey jobKey = JobKey.jobKey(keyName);
JobDetail jobDetail = JobBuilder JobDetail jobDetail = JobBuilder.newJob(PipelineNodeJobBean.class).withIdentity(jobKey).build();
.newJob(PipelineNodeJobBean.class)
.withIdentity(jobKey)
.build();
// 构建Trigger // 构建Trigger
TriggerKey triggerKey = TriggerKey.triggerKey(keyName); TriggerKey triggerKey = TriggerKey.triggerKey(keyName);
Trigger cronTrigger = TriggerBuilder.newTrigger() Trigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).startNow().build();
.withIdentity(triggerKey)
.startNow()
.build();
// 任务参数 // 任务参数
JobDataMap jobDataMap = cronTrigger.getJobDataMap(); JobDataMap jobDataMap = cronTrigger.getJobDataMap();
jobDataMap.put(PipelineConst.INSTANCE_ID, pipelineInstance.getInstanceId()); jobDataMap.put(PipelineConst.INSTANCE_ID, pipelineInstance.getInstanceId());
@@ -94,8 +88,7 @@ public class PipelineNodeJobManage {
} }
/** /**
* 中断正在执行的任务<br/> * 中断正在执行的任务<br/> 任务终止需要配合响应中断或停止信号
* 任务终止需要配合响应中断或停止信号
*/ */
public void interruptJob(@NotNull String instanceId, @NotNull String nodeCode) throws SchedulerException { public void interruptJob(@NotNull String instanceId, @NotNull String nodeCode) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(String.format(JOB_KEY, instanceId, nodeCode)); JobKey jobKey = JobKey.jobKey(String.format(JOB_KEY, instanceId, nodeCode));
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.framework.pipeline.log; package cn.odboy.devops.framework.pipeline.log;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
@@ -66,9 +66,11 @@ public class PipelineNodeStepLogAspect extends AbstractPipelineNodeJobService {
} }
PipelineNodeStepLog pipelineNodeStepLog = method.getAnnotation(PipelineNodeStepLog.class); PipelineNodeStepLog pipelineNodeStepLog = method.getAnnotation(PipelineNodeStepLog.class);
try { try {
addPipelineInstanceNodeDetailLog(currentNodeInfo, pipelineNodeStepLog.value(), PipelineStatusEnum.RUNNING, PipelineStatusEnum.RUNNING.getDesc(), null); addPipelineInstanceNodeDetailLog(currentNodeInfo, pipelineNodeStepLog.value(), PipelineStatusEnum.RUNNING, PipelineStatusEnum.RUNNING.getDesc(),
null);
Object result = joinPoint.proceed(); Object result = joinPoint.proceed();
addPipelineInstanceNodeDetailLog(currentNodeInfo, pipelineNodeStepLog.value(), PipelineStatusEnum.SUCCESS, PipelineStatusEnum.SUCCESS.getDesc(), new Date()); addPipelineInstanceNodeDetailLog(currentNodeInfo, pipelineNodeStepLog.value(), PipelineStatusEnum.SUCCESS, PipelineStatusEnum.SUCCESS.getDesc(),
new Date());
return result; return result;
} catch (BadRequestException e) { } catch (BadRequestException e) {
log.error("执行失败", e); log.error("执行失败", e);
@@ -76,7 +78,8 @@ public class PipelineNodeStepLogAspect extends AbstractPipelineNodeJobService {
throw e; throw e;
} catch (Throwable e) { } catch (Throwable e) {
log.error("执行失败", e); log.error("执行失败", e);
addPipelineInstanceNodeDetailLog(currentNodeInfo, pipelineNodeStepLog.value(), PipelineStatusEnum.FAIL, PipelineStatusEnum.FAIL.getDesc(), new Date()); addPipelineInstanceNodeDetailLog(currentNodeInfo, pipelineNodeStepLog.value(), PipelineStatusEnum.FAIL, PipelineStatusEnum.FAIL.getDesc(),
new Date());
throw e; throw e;
} }
} }
@@ -16,7 +16,7 @@
package cn.odboy.devops.framework.pipeline.model; package cn.odboy.devops.framework.pipeline.model;
import cn.odboy.base.CsObject; import cn.odboy.base.CsObject;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -57,9 +57,7 @@ public class PipelineNodeTemplateVo extends CsObject {
*/ */
protected String detailType = ""; protected String detailType = "";
/** /**
* 默认参数<br/> * 默认参数<br/> execute: 执行调用 describe: 明细调用
* execute: 执行调用
* describe: 明细调用
*/ */
protected Map<String, Object> parameters = new HashMap<>(); protected Map<String, Object> parameters = new HashMap<>();
/** /**
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.core; package cn.odboy.devops.service.core;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeDetailTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeDetailTb;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import com.anwen.mongo.service.IService; import com.anwen.mongo.service.IService;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.core; package cn.odboy.devops.service.core;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
import com.anwen.mongo.service.IService; import com.anwen.mongo.service.IService;
@@ -16,7 +16,7 @@
package cn.odboy.devops.service.core.impl; package cn.odboy.devops.service.core.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeDetailTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeDetailTb;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.service.core.PipelineInstanceNodeDetailService; import cn.odboy.devops.service.core.PipelineInstanceNodeDetailService;
@@ -55,28 +55,22 @@ public class PipelineInstanceNodeDetailServiceImpl extends ServiceImpl<PipelineI
@Override @Override
public PipelineInstanceNodeDetailTb getPipelineInstanceNodeDetailByArgs(Long nodeId, String nodeCode, String stepName) { public PipelineInstanceNodeDetailTb getPipelineInstanceNodeDetailByArgs(Long nodeId, String nodeCode, String stepName) {
return one(new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeDetailTb.class) return one(new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeDetailTb.class).eq(PipelineInstanceNodeDetailTb::getNodeId, nodeId)
.eq(PipelineInstanceNodeDetailTb::getNodeId, nodeId).eq(PipelineInstanceNodeDetailTb::getNodeCode, nodeCode) .eq(PipelineInstanceNodeDetailTb::getNodeCode, nodeCode).eq(PipelineInstanceNodeDetailTb::getStepName, stepName));
.eq(PipelineInstanceNodeDetailTb::getStepName, stepName)
);
} }
@Override @Override
public void removeByNodeIds(List<Long> nodeIds) { public void removeByNodeIds(List<Long> nodeIds) {
if (CollUtil.isNotEmpty(nodeIds)) { if (CollUtil.isNotEmpty(nodeIds)) {
remove(new LambdaUpdateChainWrapper<>(getBaseMapper(), PipelineInstanceNodeDetailTb.class) remove(new LambdaUpdateChainWrapper<>(getBaseMapper(), PipelineInstanceNodeDetailTb.class).in(PipelineInstanceNodeDetailTb::getNodeId, nodeIds));
.in(PipelineInstanceNodeDetailTb::getNodeId, nodeIds)
);
} }
} }
@Override @Override
public PipelineInstanceNodeDetailTb getLastPipelineInstanceNodeDetailByArgs(PipelineInstanceNodeTb instanceNode) { public PipelineInstanceNodeDetailTb getLastPipelineInstanceNodeDetailByArgs(PipelineInstanceNodeTb instanceNode) {
List<PipelineInstanceNodeDetailTb> pipelineInstanceNodeDetailList = list(new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeDetailTb.class) List<PipelineInstanceNodeDetailTb> pipelineInstanceNodeDetailList = list(
.eq(PipelineInstanceNodeDetailTb::getNodeId, instanceNode.getId()) new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeDetailTb.class).eq(PipelineInstanceNodeDetailTb::getNodeId, instanceNode.getId())
.eq(PipelineInstanceNodeDetailTb::getNodeCode, instanceNode.getCode()) .eq(PipelineInstanceNodeDetailTb::getNodeCode, instanceNode.getCode()).orderByDesc(PipelineInstanceNodeDetailTb::getStartTime));
.orderByDesc(PipelineInstanceNodeDetailTb::getStartTime)
);
// 明细为空,返回节点状态 // 明细为空,返回节点状态
if (pipelineInstanceNodeDetailList.isEmpty()) { if (pipelineInstanceNodeDetailList.isEmpty()) {
PipelineInstanceNodeDetailTb pipelineInstanceNodeDetailTb = new PipelineInstanceNodeDetailTb(); PipelineInstanceNodeDetailTb pipelineInstanceNodeDetailTb = new PipelineInstanceNodeDetailTb();
@@ -110,10 +104,8 @@ public class PipelineInstanceNodeDetailServiceImpl extends ServiceImpl<PipelineI
@Override @Override
public List<PipelineInstanceNodeDetailTb> queryPipelineInstanceNodeDetailByArgs(PipelineInstanceNodeTb instanceNode) { public List<PipelineInstanceNodeDetailTb> queryPipelineInstanceNodeDetailByArgs(PipelineInstanceNodeTb instanceNode) {
return list(new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeDetailTb.class) return list(
.eq(PipelineInstanceNodeDetailTb::getNodeId, instanceNode.getId()) new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeDetailTb.class).eq(PipelineInstanceNodeDetailTb::getNodeId, instanceNode.getId())
.eq(PipelineInstanceNodeDetailTb::getNodeCode, instanceNode.getCode()) .eq(PipelineInstanceNodeDetailTb::getNodeCode, instanceNode.getCode()).orderByAsc(PipelineInstanceNodeDetailTb::getStartTime));
.orderByAsc(PipelineInstanceNodeDetailTb::getStartTime)
);
} }
} }
@@ -16,7 +16,7 @@
package cn.odboy.devops.service.core.impl; package cn.odboy.devops.service.core.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo; import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo;
@@ -75,10 +75,8 @@ public class PipelineInstanceNodeServiceImpl extends ServiceImpl<PipelineInstanc
} }
public PipelineInstanceNodeTb getPipelineInstanceNodeByArgs(Long instanceId, String code) { public PipelineInstanceNodeTb getPipelineInstanceNodeByArgs(Long instanceId, String code) {
return one(new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeTb.class) return one(new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeTb.class).eq(PipelineInstanceNodeTb::getInstanceId, instanceId)
.eq(PipelineInstanceNodeTb::getInstanceId, instanceId) .eq(PipelineInstanceNodeTb::getCode, code));
.eq(PipelineInstanceNodeTb::getCode, code)
);
} }
@Override @Override
@@ -93,10 +91,9 @@ public class PipelineInstanceNodeServiceImpl extends ServiceImpl<PipelineInstanc
} }
} }
// 更新节点状态 // 更新节点状态
List<PipelineInstanceNodeTb> instanceNodeList = list(new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeTb.class) List<PipelineInstanceNodeTb> instanceNodeList = list(
.eq(PipelineInstanceNodeTb::getInstanceId, pipelineInstanceTb.getInstanceId()) new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeTb.class).eq(PipelineInstanceNodeTb::getInstanceId,
.eq(PipelineInstanceNodeTb::getCode, penddingNodeList) pipelineInstanceTb.getInstanceId()).eq(PipelineInstanceNodeTb::getCode, penddingNodeList));
);
if (CollUtil.isNotEmpty(instanceNodeList)) { if (CollUtil.isNotEmpty(instanceNodeList)) {
Date nowTime = new Date(); Date nowTime = new Date();
for (PipelineInstanceNodeTb pipelineInstanceNodeTb : instanceNodeList) { for (PipelineInstanceNodeTb pipelineInstanceNodeTb : instanceNodeList) {
@@ -107,20 +104,15 @@ public class PipelineInstanceNodeServiceImpl extends ServiceImpl<PipelineInstanc
} }
updateBatchByIds(instanceNodeList); updateBatchByIds(instanceNodeList);
// 删除节点明细数据 // 删除节点明细数据
List<Long> nodeIds = instanceNodeList.stream() List<Long> nodeIds = instanceNodeList.stream().map(PipelineInstanceNodeTb::getId).distinct().collect(Collectors.toList());
.map(PipelineInstanceNodeTb::getId)
.distinct()
.collect(Collectors.toList());
pipelineInstanceNodeDetailService.removeByNodeIds(nodeIds); pipelineInstanceNodeDetailService.removeByNodeIds(nodeIds);
} }
} }
@Override @Override
public List<PipelineInstanceNodeTb> queryPipelineInstanceNodeListByInstanceId(Long instanceId) { public List<PipelineInstanceNodeTb> queryPipelineInstanceNodeListByInstanceId(Long instanceId) {
return list(new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeTb.class) return list(new LambdaQueryChainWrapper<>(getBaseMapper(), PipelineInstanceNodeTb.class).eq(PipelineInstanceNodeTb::getInstanceId, instanceId)
.eq(PipelineInstanceNodeTb::getInstanceId, instanceId) .orderByAsc(PipelineInstanceNodeTb::getId));
.orderByAsc(PipelineInstanceNodeTb::getId)
);
} }
@Override @Override
@@ -18,8 +18,8 @@ package cn.odboy.devops.service.core.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.constant.pipeline.PipelineStatusEnum; import cn.odboy.devops.framework.pipeline.constant.PipelineStatusEnum;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeDetailTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeDetailTb;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.dal.dataobject.PipelineInstanceTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceTb;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.dal.dataobject.PipelineTemplateTb; import cn.odboy.devops.dal.dataobject.PipelineTemplateTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.dal.dataobject.PipelineTemplateTb; import cn.odboy.devops.dal.dataobject.PipelineTemplateTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -15,7 +15,7 @@
*/ */
package cn.odboy.devops.service.pipeline; package cn.odboy.devops.service.pipeline;
import cn.odboy.devops.constant.pipeline.PipelineConst; import cn.odboy.devops.framework.pipeline.constant.PipelineConst;
import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb; import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService; import cn.odboy.devops.framework.pipeline.AbstractPipelineNodeJobService;
import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor; import cn.odboy.devops.framework.pipeline.core.PipelineNodeJobExecutor;
@@ -30,22 +30,26 @@ import java.util.List;
public class PipelineNodeBuildJavaBiz { public class PipelineNodeBuildJavaBiz {
@PipelineNodeStepLog("构建开始") @PipelineNodeStepLog("构建开始")
public void buildJavaStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void buildJavaStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(1000); ThreadUtil.safeSleep(1000);
} }
@PipelineNodeStepLog("构建中") @PipelineNodeStepLog("构建中")
public void startGitlabPipeline(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void startGitlabPipeline(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(2000); ThreadUtil.safeSleep(2000);
} }
@PipelineNodeStepLog("上传包到OSS") @PipelineNodeStepLog("上传包到OSS")
public void uploadPackageToOss(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void uploadPackageToOss(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(2000); ThreadUtil.safeSleep(2000);
} }
@PipelineNodeStepLog("构建完成") @PipelineNodeStepLog("构建完成")
public void buildJavaFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void buildJavaFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(1000); ThreadUtil.safeSleep(1000);
} }
} }
@@ -30,12 +30,14 @@ import java.util.List;
public class PipelineNodeDemoBiz { public class PipelineNodeDemoBiz {
@PipelineNodeStepLog("开始") @PipelineNodeStepLog("开始")
public void start(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void start(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(2000); ThreadUtil.safeSleep(2000);
} }
@PipelineNodeStepLog("完成") @PipelineNodeStepLog("完成")
public void finish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void finish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(2000); ThreadUtil.safeSleep(2000);
} }
} }
@@ -30,17 +30,20 @@ import java.util.List;
@Service @Service
public class PipelineNodeDeployJavaBiz { public class PipelineNodeDeployJavaBiz {
@PipelineNodeStepLog("部署开始") @PipelineNodeStepLog("部署开始")
public void deployStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void deployStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(1000); ThreadUtil.safeSleep(1000);
} }
@PipelineNodeStepLog("部署中") @PipelineNodeStepLog("部署中")
public void deployJavaByWithContextName(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult, PipelineTemplateTb templateType) { public void deployJavaByWithContextName(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env,
List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult, PipelineTemplateTb templateType) {
ThreadUtil.safeSleep(2000); ThreadUtil.safeSleep(2000);
} }
@PipelineNodeStepLog("部署完成") @PipelineNodeStepLog("部署完成")
public void deployFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void deployFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(1000); ThreadUtil.safeSleep(1000);
} }
} }
@@ -29,22 +29,26 @@ import java.util.List;
@Service @Service
public class PipelineNodeInitBiz { public class PipelineNodeInitBiz {
@PipelineNodeStepLog("初始化开始") @PipelineNodeStepLog("初始化开始")
public void initStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void initStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(1000); ThreadUtil.safeSleep(1000);
} }
@PipelineNodeStepLog("Master分支合并到Release分支") @PipelineNodeStepLog("Master分支合并到Release分支")
public void mergeMasterToRelease(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void mergeMasterToRelease(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(2000); ThreadUtil.safeSleep(2000);
} }
@PipelineNodeStepLog("新建Release分支") @PipelineNodeStepLog("新建Release分支")
public void createReleaseBranch(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void createReleaseBranch(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(2000); ThreadUtil.safeSleep(2000);
} }
@PipelineNodeStepLog("初始化完成") @PipelineNodeStepLog("初始化完成")
public void initFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void initFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(1000); ThreadUtil.safeSleep(1000);
} }
} }
@@ -20,7 +20,6 @@ import cn.odboy.devops.dal.dataobject.PipelineInstanceNodeTb;
import cn.odboy.devops.framework.pipeline.log.PipelineNodeStepLog; import cn.odboy.devops.framework.pipeline.log.PipelineNodeStepLog;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeJobExecuteResult; import cn.odboy.devops.framework.pipeline.model.PipelineNodeJobExecuteResult;
import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo; import cn.odboy.devops.framework.pipeline.model.PipelineNodeTemplateVo;
import cn.odboy.framework.exception.BadRequestException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -30,17 +29,20 @@ import java.util.List;
@Service @Service
public class PipelineNodeMergeBranchBiz { public class PipelineNodeMergeBranchBiz {
@PipelineNodeStepLog("分支合并开始") @PipelineNodeStepLog("分支合并开始")
public void mergeBranchStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void mergeBranchStart(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(1000); ThreadUtil.safeSleep(1000);
} }
@PipelineNodeStepLog("集成区分支合并到release分支") @PipelineNodeStepLog("集成区分支合并到release分支")
public void integrationAreaBranchMergeRelease(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void integrationAreaBranchMergeRelease(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env,
List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(2000); ThreadUtil.safeSleep(2000);
} }
@PipelineNodeStepLog("分支合并完成") @PipelineNodeStepLog("分支合并完成")
public void mergeBranchFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList, PipelineNodeJobExecuteResult lastNodeResult) { public void mergeBranchFinish(PipelineInstanceNodeTb pipelineInstanceNode, String contextName, String env, List<PipelineNodeTemplateVo> templateList,
PipelineNodeJobExecuteResult lastNodeResult) {
ThreadUtil.safeSleep(1000); ThreadUtil.safeSleep(1000);
} }
} }
@@ -1,7 +1,7 @@
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.CsPageArgs; import cn.odboy.base.CsPageArgs;
import cn.odboy.base.CsResultVo; import cn.odboy.base.CsPageResultVo;
import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemDeptTb;
import cn.odboy.system.dal.model.SystemCreateDeptArgs; import cn.odboy.system.dal.model.SystemCreateDeptArgs;
import cn.odboy.system.dal.model.SystemQueryDeptArgs; import cn.odboy.system.dal.model.SystemQueryDeptArgs;
@@ -40,7 +40,7 @@ public class SystemDeptController {
@ApiOperation("查询部门") @ApiOperation("查询部门")
@PostMapping @PostMapping
@PreAuthorize("@el.check('user:list','dept:list')") @PreAuthorize("@el.check('user:list','dept:list')")
public ResponseEntity<CsResultVo<List<SystemDeptTb>>> queryDept(@Validated @RequestBody CsPageArgs<SystemQueryDeptArgs> args) throws Exception { public ResponseEntity<CsPageResultVo<List<SystemDeptTb>>> queryDept(@Validated @RequestBody CsPageArgs<SystemQueryDeptArgs> args) throws Exception {
SystemQueryDeptArgs criteria = args.getArgs(); SystemQueryDeptArgs criteria = args.getArgs();
List<SystemDeptTb> depts = systemDeptService.queryAllDept(criteria, true); List<SystemDeptTb> depts = systemDeptService.queryAllDept(criteria, true);
return new ResponseEntity<>(CsPageUtil.toPage(depts), HttpStatus.OK); return new ResponseEntity<>(CsPageUtil.toPage(depts), HttpStatus.OK);
@@ -49,7 +49,8 @@ public class SystemDeptController {
@ApiOperation("查询部门:根据ID获取同级与上级数据") @ApiOperation("查询部门:根据ID获取同级与上级数据")
@PostMapping("/queryDeptSuperiorTree") @PostMapping("/queryDeptSuperiorTree")
@PreAuthorize("@el.check('user:list','dept:list')") @PreAuthorize("@el.check('user:list','dept:list')")
public ResponseEntity<CsResultVo<Set<SystemDeptTb>>> queryDeptSuperiorTree(@RequestBody List<Long> ids, @RequestParam(defaultValue = "false") Boolean exclude) { public ResponseEntity<CsPageResultVo<Set<SystemDeptTb>>> queryDeptSuperiorTree(@RequestBody List<Long> ids,
@RequestParam(defaultValue = "false") Boolean exclude) {
Set<SystemDeptTb> deptSet = new LinkedHashSet<>(); Set<SystemDeptTb> deptSet = new LinkedHashSet<>();
for (Long id : ids) { for (Long id : ids) {
// 同级数据 // 同级数据
@@ -1,7 +1,7 @@
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.CsPageArgs; import cn.odboy.base.CsPageArgs;
import cn.odboy.base.CsResultVo; import cn.odboy.base.CsPageResultVo;
import cn.odboy.system.dal.dataobject.SystemDictTb; import cn.odboy.system.dal.dataobject.SystemDictTb;
import cn.odboy.system.dal.model.SystemCreateDictArgs; import cn.odboy.system.dal.model.SystemCreateDictArgs;
import cn.odboy.system.dal.model.SystemQueryDictArgs; import cn.odboy.system.dal.model.SystemQueryDictArgs;
@@ -45,7 +45,7 @@ public class SystemDictController {
@ApiOperation("查询字典") @ApiOperation("查询字典")
@PostMapping @PostMapping
@PreAuthorize("@el.check('dict:list')") @PreAuthorize("@el.check('dict:list')")
public ResponseEntity<CsResultVo<List<SystemDictTb>>> queryDictByArgs(@Validated @RequestBody CsPageArgs<SystemQueryDictArgs> args) { public ResponseEntity<CsPageResultVo<List<SystemDictTb>>> queryDictByArgs(@Validated @RequestBody CsPageArgs<SystemQueryDictArgs> args) {
Page<SystemDictTb> page; Page<SystemDictTb> page;
SystemQueryDictArgs criteria = args.getArgs(); SystemQueryDictArgs criteria = args.getArgs();
if (args.getSize() != null) { if (args.getSize() != null) {
@@ -1,7 +1,7 @@
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.CsPageArgs; import cn.odboy.base.CsPageArgs;
import cn.odboy.base.CsResultVo; import cn.odboy.base.CsPageResultVo;
import cn.odboy.system.dal.dataobject.SystemDictDetailTb; import cn.odboy.system.dal.dataobject.SystemDictDetailTb;
import cn.odboy.system.dal.model.SystemCreateDictDetailArgs; import cn.odboy.system.dal.model.SystemCreateDictDetailArgs;
import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; import cn.odboy.system.dal.model.SystemQueryDictDetailArgs;
@@ -29,13 +29,13 @@ public class SystemDictDetailController {
@ApiOperation("查询字典详情") @ApiOperation("查询字典详情")
@PostMapping @PostMapping
public ResponseEntity<CsResultVo<List<SystemDictDetailTb>>> queryDictDetailByCrud(@Validated @RequestBody CsPageArgs<SystemQueryDictDetailArgs> args) { public ResponseEntity<CsPageResultVo<List<SystemDictDetailTb>>> queryDictDetailByCrud(@Validated @RequestBody CsPageArgs<SystemQueryDictDetailArgs> args) {
return queryDictDetailByArgs(args); return queryDictDetailByArgs(args);
} }
@ApiOperation("查询字典详情") @ApiOperation("查询字典详情")
@PostMapping(value = "/queryDictDetailByArgs") @PostMapping(value = "/queryDictDetailByArgs")
public ResponseEntity<CsResultVo<List<SystemDictDetailTb>>> queryDictDetailByArgs(@Validated @RequestBody CsPageArgs<SystemQueryDictDetailArgs> args) { public ResponseEntity<CsPageResultVo<List<SystemDictDetailTb>>> queryDictDetailByArgs(@Validated @RequestBody CsPageArgs<SystemQueryDictDetailArgs> args) {
SystemQueryDictDetailArgs criteria = args.getArgs(); SystemQueryDictDetailArgs criteria = args.getArgs();
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize()); Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(systemDictDetailService.queryDictDetailByArgs(criteria, page), HttpStatus.OK); return new ResponseEntity<>(systemDictDetailService.queryDictDetailByArgs(criteria, page), HttpStatus.OK);
@@ -1,7 +1,7 @@
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.CsPageArgs; import cn.odboy.base.CsPageArgs;
import cn.odboy.base.CsResultVo; import cn.odboy.base.CsPageResultVo;
import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemJobTb;
import cn.odboy.system.dal.model.SystemCreateJobArgs; import cn.odboy.system.dal.model.SystemCreateJobArgs;
import cn.odboy.system.dal.model.SystemQueryJobArgs; import cn.odboy.system.dal.model.SystemQueryJobArgs;
@@ -21,7 +21,6 @@ import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@Api(tags = "系统:岗位管理") @Api(tags = "系统:岗位管理")
@@ -39,7 +38,7 @@ public class SystemJobController {
@ApiOperation("查询岗位") @ApiOperation("查询岗位")
@PostMapping(value = "/queryAllEnableJob") @PostMapping(value = "/queryAllEnableJob")
@PreAuthorize("@el.check('job:list','user:list')") @PreAuthorize("@el.check('job:list','user:list')")
public ResponseEntity<CsResultVo<List<SystemJobTb>>> queryJobByArgs(@Validated @RequestBody CsPageArgs<SystemQueryJobArgs> args) { public ResponseEntity<CsPageResultVo<List<SystemJobTb>>> queryJobByArgs(@Validated @RequestBody CsPageArgs<SystemQueryJobArgs> args) {
SystemQueryJobArgs criteria = args.getArgs(); SystemQueryJobArgs criteria = args.getArgs();
Page<SystemJobTb> page = new Page<>(criteria.getPage(), criteria.getSize()); Page<SystemJobTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(systemJobService.queryJobByArgs(criteria, page), HttpStatus.OK); return new ResponseEntity<>(systemJobService.queryJobByArgs(criteria, page), HttpStatus.OK);
@@ -48,7 +47,7 @@ public class SystemJobController {
@ApiOperation("查询岗位") @ApiOperation("查询岗位")
@PostMapping @PostMapping
@PreAuthorize("@el.check('job:list','user:list')") @PreAuthorize("@el.check('job:list','user:list')")
public ResponseEntity<CsResultVo<List<SystemJobTb>>> queryJobByCrud(@Validated @RequestBody CsPageArgs<SystemQueryJobArgs> args) { public ResponseEntity<CsPageResultVo<List<SystemJobTb>>> queryJobByCrud(@Validated @RequestBody CsPageArgs<SystemQueryJobArgs> args) {
return queryJobByArgs(args); return queryJobByArgs(args);
} }
@@ -1,7 +1,7 @@
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.CsPageArgs; import cn.odboy.base.CsPageArgs;
import cn.odboy.base.CsResultVo; import cn.odboy.base.CsPageResultVo;
import cn.odboy.constant.FileTypeEnum; import cn.odboy.constant.FileTypeEnum;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.system.dal.dataobject.SystemLocalStorageTb; import cn.odboy.system.dal.dataobject.SystemLocalStorageTb;
@@ -33,7 +33,7 @@ public class SystemLocalStorageController {
@ApiOperation("查询文件") @ApiOperation("查询文件")
@PostMapping @PostMapping
@PreAuthorize("@el.check('storage:list')") @PreAuthorize("@el.check('storage:list')")
public ResponseEntity<CsResultVo<List<SystemLocalStorageTb>>> queryLocalStorage(@Validated @RequestBody CsPageArgs<SystemQueryStorageArgs> args) { public ResponseEntity<CsPageResultVo<List<SystemLocalStorageTb>>> queryLocalStorage(@Validated @RequestBody CsPageArgs<SystemQueryStorageArgs> args) {
SystemQueryStorageArgs criteria = args.getArgs(); SystemQueryStorageArgs criteria = args.getArgs();
Page<SystemLocalStorageTb> page = new Page<>(criteria.getPage(), criteria.getSize()); Page<SystemLocalStorageTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(localStorageService.queryLocalStorage(criteria, page), HttpStatus.OK); return new ResponseEntity<>(localStorageService.queryLocalStorage(criteria, page), HttpStatus.OK);

Some files were not shown because too many files have changed in this diff Show More