反序列化问题。
This commit is contained in:
parent
0e430c3036
commit
66a59ad039
@ -0,0 +1,23 @@
|
||||
package com.qqchen.deploy.backend.deploy.api;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.dto.ApplicationDTO;
|
||||
import com.qqchen.deploy.backend.deploy.entity.Application;
|
||||
import com.qqchen.deploy.backend.deploy.query.ApplicationQuery;
|
||||
import com.qqchen.deploy.backend.framework.controller.BaseController;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Tag(name = "应用管理", description = "应用管理相关接口")
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/application")
|
||||
public class ApplicationApiController extends BaseController<Application, ApplicationDTO, Long, ApplicationQuery> {
|
||||
|
||||
@Override
|
||||
protected void exportData(HttpServletResponse response, List<ApplicationDTO> data) {
|
||||
// TODO: 实现导出逻辑
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
package com.qqchen.deploy.backend.deploy.api;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.dto.ProjectDTO;
|
||||
import com.qqchen.deploy.backend.deploy.entity.Project;
|
||||
import com.qqchen.deploy.backend.deploy.query.ProjectQuery;
|
||||
import com.qqchen.deploy.backend.framework.controller.BaseController;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Tag(name = "项目管理", description = "项目管理相关接口")
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/project")
|
||||
public class ProjectApiController extends BaseController<Project, ProjectDTO, Long, ProjectQuery> {
|
||||
|
||||
@Override
|
||||
protected void exportData(HttpServletResponse response, List<ProjectDTO> data) {
|
||||
// TODO: 实现导出逻辑
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
package com.qqchen.deploy.backend.deploy.converter;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.dto.ApplicationDTO;
|
||||
import com.qqchen.deploy.backend.deploy.entity.Application;
|
||||
import com.qqchen.deploy.backend.framework.converter.BaseConverter;
|
||||
import org.mapstruct.Mapper;
|
||||
|
||||
@Mapper(config = BaseConverter.class)
|
||||
public interface ApplicationConverter extends BaseConverter<Application, ApplicationDTO> {
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
package com.qqchen.deploy.backend.deploy.converter;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.dto.ProjectDTO;
|
||||
import com.qqchen.deploy.backend.deploy.entity.Project;
|
||||
import com.qqchen.deploy.backend.framework.converter.BaseConverter;
|
||||
import org.mapstruct.Mapper;
|
||||
|
||||
@Mapper(config = BaseConverter.class)
|
||||
public interface ProjectConverter extends BaseConverter<Project, ProjectDTO> {
|
||||
}
|
||||
@ -0,0 +1,41 @@
|
||||
package com.qqchen.deploy.backend.deploy.dto;
|
||||
|
||||
import com.qqchen.deploy.backend.framework.dto.BaseDTO;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class ApplicationDTO extends BaseDTO {
|
||||
|
||||
@NotNull(message = "项目ID不能为空")
|
||||
private Long projectId;
|
||||
|
||||
@NotBlank(message = "应用编码不能为空")
|
||||
private String appCode;
|
||||
|
||||
@NotBlank(message = "应用名称不能为空")
|
||||
private String appName;
|
||||
|
||||
private String appDesc;
|
||||
|
||||
@NotBlank(message = "应用状态不能为空")
|
||||
private String appStatus;
|
||||
|
||||
private String repoUrl;
|
||||
|
||||
private String repoBranch;
|
||||
|
||||
private String repoType;
|
||||
|
||||
private String buildType;
|
||||
|
||||
private String devLanguage;
|
||||
|
||||
private String devFramework;
|
||||
|
||||
@NotNull(message = "排序号不能为空")
|
||||
private Integer sort;
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
package com.qqchen.deploy.backend.deploy.dto;
|
||||
|
||||
import com.qqchen.deploy.backend.framework.dto.BaseDTO;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class ProjectDTO extends BaseDTO {
|
||||
|
||||
@NotNull(message = "租户ID不能为空")
|
||||
private Long tenantId;
|
||||
|
||||
@NotBlank(message = "项目编码不能为空")
|
||||
private String projectCode;
|
||||
|
||||
@NotBlank(message = "项目名称不能为空")
|
||||
private String projectName;
|
||||
|
||||
private String projectDesc;
|
||||
|
||||
@NotBlank(message = "项目状态不能为空")
|
||||
private String projectStatus;
|
||||
|
||||
@NotNull(message = "排序号不能为空")
|
||||
private Integer sort;
|
||||
}
|
||||
@ -0,0 +1,50 @@
|
||||
package com.qqchen.deploy.backend.deploy.entity;
|
||||
|
||||
import com.qqchen.deploy.backend.framework.domain.Entity;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Table;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@jakarta.persistence.Entity
|
||||
@Table(name = "deploy_application")
|
||||
public class Application extends Entity<Long> {
|
||||
|
||||
@Column(name = "project_id", nullable = false)
|
||||
private Long projectId;
|
||||
|
||||
@Column(name = "app_code", nullable = false)
|
||||
private String appCode;
|
||||
|
||||
@Column(name = "app_name", nullable = false)
|
||||
private String appName;
|
||||
|
||||
@Column(name = "app_desc")
|
||||
private String appDesc;
|
||||
|
||||
@Column(name = "app_status", nullable = false)
|
||||
private String appStatus;
|
||||
|
||||
@Column(name = "repo_url")
|
||||
private String repoUrl;
|
||||
|
||||
@Column(name = "repo_branch")
|
||||
private String repoBranch;
|
||||
|
||||
@Column(name = "repo_type")
|
||||
private String repoType;
|
||||
|
||||
@Column(name = "build_type")
|
||||
private String buildType;
|
||||
|
||||
@Column(name = "dev_language")
|
||||
private String devLanguage;
|
||||
|
||||
@Column(name = "dev_framework")
|
||||
private String devFramework;
|
||||
|
||||
@Column(name = "sort", nullable = false)
|
||||
private Integer sort;
|
||||
}
|
||||
@ -0,0 +1,53 @@
|
||||
package com.qqchen.deploy.backend.deploy.entity;
|
||||
|
||||
import com.qqchen.deploy.backend.framework.domain.Entity;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Table;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* 项目组实体
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@jakarta.persistence.Entity
|
||||
@Table(name = "deploy_project")
|
||||
public class Project extends Entity<Long> {
|
||||
|
||||
/**
|
||||
* 租户ID
|
||||
*/
|
||||
@Column(name = "tenant_id", nullable = false)
|
||||
private Long tenantId;
|
||||
|
||||
/**
|
||||
* 项目编码
|
||||
*/
|
||||
@Column(name = "project_code", nullable = false)
|
||||
private String projectCode;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
@Column(name = "project_name", nullable = false)
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 项目描述
|
||||
*/
|
||||
@Column(name = "project_desc")
|
||||
private String projectDesc;
|
||||
|
||||
/**
|
||||
* 项目状态
|
||||
*/
|
||||
@Column(name = "project_status", nullable = false)
|
||||
private String projectStatus;
|
||||
|
||||
/**
|
||||
* 排序号
|
||||
*/
|
||||
@Column(name = "sort", nullable = false)
|
||||
private Integer sort;
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
package com.qqchen.deploy.backend.deploy.query;
|
||||
|
||||
import com.qqchen.deploy.backend.framework.annotation.QueryField;
|
||||
import com.qqchen.deploy.backend.framework.enums.QueryType;
|
||||
import com.qqchen.deploy.backend.framework.query.BaseQuery;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class ApplicationQuery extends BaseQuery {
|
||||
|
||||
@QueryField(field = "appCode", type = QueryType.LIKE)
|
||||
private String appCode;
|
||||
|
||||
@QueryField(field = "appName", type = QueryType.LIKE)
|
||||
private String appName;
|
||||
|
||||
@QueryField(field = "appStatus")
|
||||
private String appStatus;
|
||||
|
||||
@QueryField(field = "projectId")
|
||||
private Long projectId;
|
||||
|
||||
@QueryField(field = "repoType")
|
||||
private String repoType;
|
||||
|
||||
@QueryField(field = "buildType")
|
||||
private String buildType;
|
||||
|
||||
@QueryField(field = "devLanguage")
|
||||
private String devLanguage;
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
package com.qqchen.deploy.backend.deploy.query;
|
||||
|
||||
import com.qqchen.deploy.backend.framework.annotation.QueryField;
|
||||
import com.qqchen.deploy.backend.framework.enums.QueryType;
|
||||
import com.qqchen.deploy.backend.framework.query.BaseQuery;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class ProjectQuery extends BaseQuery {
|
||||
|
||||
@QueryField(field = "projectCode", type = QueryType.LIKE)
|
||||
private String projectCode;
|
||||
|
||||
@QueryField(field = "projectName", type = QueryType.LIKE)
|
||||
private String projectName;
|
||||
|
||||
@QueryField(field = "projectStatus")
|
||||
private String projectStatus;
|
||||
|
||||
@QueryField(field = "tenantId")
|
||||
private Long tenantId;
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
package com.qqchen.deploy.backend.deploy.repository;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.entity.Application;
|
||||
import com.qqchen.deploy.backend.framework.repository.IBaseRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface IApplicationRepository extends IBaseRepository<Application, Long> {
|
||||
boolean existsByAppCodeAndProjectIdAndDeletedFalse(String appCode, Long projectId);
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
package com.qqchen.deploy.backend.deploy.repository;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.entity.Project;
|
||||
import com.qqchen.deploy.backend.framework.repository.IBaseRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface IProjectRepository extends IBaseRepository<Project, Long> {
|
||||
boolean existsByProjectCodeAndTenantIdAndDeletedFalse(String projectCode, Long tenantId);
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
package com.qqchen.deploy.backend.deploy.service;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.dto.ApplicationDTO;
|
||||
import com.qqchen.deploy.backend.deploy.entity.Application;
|
||||
import com.qqchen.deploy.backend.framework.service.IBaseService;
|
||||
|
||||
public interface IApplicationService extends IBaseService<Application, ApplicationDTO, Long> {
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
package com.qqchen.deploy.backend.deploy.service;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.dto.ProjectDTO;
|
||||
import com.qqchen.deploy.backend.deploy.entity.Project;
|
||||
import com.qqchen.deploy.backend.framework.service.IBaseService;
|
||||
|
||||
public interface IProjectService extends IBaseService<Project, ProjectDTO, Long> {
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
package com.qqchen.deploy.backend.deploy.service.impl;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.dto.ApplicationDTO;
|
||||
import com.qqchen.deploy.backend.deploy.entity.Application;
|
||||
import com.qqchen.deploy.backend.deploy.service.IApplicationService;
|
||||
import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class ApplicationServiceImpl extends BaseServiceImpl<Application, ApplicationDTO, Long> implements IApplicationService {
|
||||
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
package com.qqchen.deploy.backend.deploy.service.impl;
|
||||
|
||||
import com.qqchen.deploy.backend.deploy.dto.ProjectDTO;
|
||||
import com.qqchen.deploy.backend.deploy.entity.Project;
|
||||
import com.qqchen.deploy.backend.deploy.service.IProjectService;
|
||||
import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class ProjectServiceImpl extends BaseServiceImpl<Project, ProjectDTO, Long> implements IProjectService {
|
||||
|
||||
}
|
||||
@ -6,7 +6,34 @@ import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Schema属性注解
|
||||
* Schema属性注解,用于定义工作流节点表单字段的属性
|
||||
*
|
||||
* <p>使用示例:
|
||||
* <pre>
|
||||
* {@code
|
||||
* @SchemaProperty(
|
||||
* title = "项目",
|
||||
* description = "选择项目",
|
||||
* required = true,
|
||||
* dataSource = @SchemaPropertyDataSource(
|
||||
* type = "api",
|
||||
* url = "/api/v1/projects",
|
||||
* valueField = "id",
|
||||
* labelField = "name"
|
||||
* )
|
||||
* )
|
||||
* private String projectId;
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* <p>支持的功能:
|
||||
* <ul>
|
||||
* <li>基本属性:标题、描述、是否必填等</li>
|
||||
* <li>数据源配置:支持动态数据源,如API调用</li>
|
||||
* <li>数值范围:支持最大值和最小值限制</li>
|
||||
* <li>枚举值:支持固定选项及其显示名称</li>
|
||||
* <li>字段显示控制:支持隐藏字段</li>
|
||||
* </ul>
|
||||
*/
|
||||
@Target(ElementType.FIELD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@ -31,6 +58,17 @@ public @interface SchemaProperty {
|
||||
*/
|
||||
String format() default "";
|
||||
|
||||
/**
|
||||
* 控制字段是否在表单中显示
|
||||
*/
|
||||
boolean hidden() default false;
|
||||
|
||||
/**
|
||||
* 数据源配置,用于定义字段的数据来源
|
||||
* @see SchemaPropertyDataSource
|
||||
*/
|
||||
SchemaPropertyDataSource dataSource() default @SchemaPropertyDataSource(type = "");
|
||||
|
||||
/**
|
||||
* 默认值
|
||||
*/
|
||||
|
||||
@ -0,0 +1,74 @@
|
||||
package com.qqchen.deploy.backend.workflow.annotation;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Schema属性的数据源配置注解,用于定义表单字段的数据来源
|
||||
*
|
||||
* <p>主要用途:
|
||||
* <ul>
|
||||
* <li>定义动态数据源,如API接口</li>
|
||||
* <li>配置数据字段映射关系</li>
|
||||
* <li>设置字段间的依赖关系</li>
|
||||
* <li>配置请求参数</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p>使用示例:
|
||||
* <pre>
|
||||
* {@code
|
||||
* @SchemaProperty(
|
||||
* title = "Jenkins视图",
|
||||
* description = "Jenkins视图名称",
|
||||
* required = true,
|
||||
* dataSource = @SchemaPropertyDataSource(
|
||||
* type = "api",
|
||||
* url = "/api/v1/jenkins/views",
|
||||
* valueField = "name",
|
||||
* labelField = "name",
|
||||
* dependsOn = {"projectId"},
|
||||
* params = {
|
||||
* @SchemaPropertyDataSourceParam(name = "projectId", value = "${projectId}")
|
||||
* }
|
||||
* )
|
||||
* )
|
||||
* private String view;
|
||||
* }
|
||||
* </pre>
|
||||
*/
|
||||
@Target({})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface SchemaPropertyDataSource {
|
||||
/**
|
||||
* 数据源类型,如 "api"、"enum" 等
|
||||
*/
|
||||
String type() default "";
|
||||
|
||||
/**
|
||||
* 数据源URL,当type为"api"时使用
|
||||
*/
|
||||
String url() default "";
|
||||
|
||||
/**
|
||||
* 值字段名称,用于指定选项值的来源字段
|
||||
*/
|
||||
String valueField() default "value";
|
||||
|
||||
/**
|
||||
* 标签字段名称,用于指定选项显示文本的来源字段
|
||||
*/
|
||||
String labelField() default "label";
|
||||
|
||||
/**
|
||||
* 依赖字段列表,用于指定当前字段依赖的其他字段
|
||||
* 当依赖字段值变化时,需要重新获取当前字段的选项数据
|
||||
*/
|
||||
String[] dependsOn() default {};
|
||||
|
||||
/**
|
||||
* 请求参数配置,用于API调用时传递参数
|
||||
* @see SchemaPropertyDataSourceParam
|
||||
*/
|
||||
SchemaPropertyDataSourceParam[] params() default {};
|
||||
}
|
||||
@ -0,0 +1,45 @@
|
||||
package com.qqchen.deploy.backend.workflow.annotation;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Schema属性数据源的参数配置注解,用于定义API请求参数
|
||||
*
|
||||
* <p>主要用途:
|
||||
* <ul>
|
||||
* <li>配置API请求参数的名称和值</li>
|
||||
* <li>支持动态参数值,使用${fieldName}引用其他字段的值</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p>使用示例:
|
||||
* <pre>
|
||||
* {@code
|
||||
* @SchemaProperty(
|
||||
* dataSource = @SchemaPropertyDataSource(
|
||||
* type = "api",
|
||||
* url = "/api/v1/jenkins/jobs",
|
||||
* params = {
|
||||
* @SchemaPropertyDataSourceParam(name = "projectId", value = "${projectId}"),
|
||||
* @SchemaPropertyDataSourceParam(name = "view", value = "${view}")
|
||||
* }
|
||||
* )
|
||||
* )
|
||||
* private String job;
|
||||
* }
|
||||
* </pre>
|
||||
*/
|
||||
@Target({})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface SchemaPropertyDataSourceParam {
|
||||
/**
|
||||
* 参数名称
|
||||
*/
|
||||
String name();
|
||||
|
||||
/**
|
||||
* 参数值,支持使用${fieldName}引用其他字段的值
|
||||
*/
|
||||
String value();
|
||||
}
|
||||
@ -24,7 +24,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class JenkinsNodeDelegate extends BaseNodeDelegate<ScriptNodePanelVariables, ScriptNodeLocalVariables> {
|
||||
public class JenkinsJobTriggerDelegate extends BaseNodeDelegate<ScriptNodePanelVariables, ScriptNodeLocalVariables> {
|
||||
|
||||
@Resource
|
||||
private ApplicationEventPublisher eventPublisher;
|
||||
@ -3,7 +3,6 @@ package com.qqchen.deploy.backend.workflow.dto;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.qqchen.deploy.backend.framework.dto.BaseDTO;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.uiVariables.NodeUiVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.workflow.WorkflowNodeGraph;
|
||||
import com.qqchen.deploy.backend.workflow.enums.NodeCategoryEnums;
|
||||
import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnums;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
@ -9,11 +9,6 @@ import lombok.Data;
|
||||
@Data
|
||||
public class BaseNodeFormVariables {
|
||||
|
||||
@SchemaProperty(
|
||||
title = "委派者",
|
||||
description = "委派者",
|
||||
required = true
|
||||
)
|
||||
private String delegate;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,61 @@
|
||||
package com.qqchen.deploy.backend.workflow.dto.definition.node.fromVariables;
|
||||
|
||||
import com.qqchen.deploy.backend.workflow.annotation.SchemaProperty;
|
||||
import com.qqchen.deploy.backend.workflow.annotation.SchemaPropertyDataSource;
|
||||
import com.qqchen.deploy.backend.workflow.annotation.SchemaPropertyDataSourceParam;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class JenkinsJobTriggerNodeFormVariables extends BaseNodeFormVariables {
|
||||
|
||||
@SchemaProperty(
|
||||
title = "项目",
|
||||
description = "选择项目",
|
||||
required = true,
|
||||
dataSource = @SchemaPropertyDataSource(
|
||||
type = "api",
|
||||
url = "/api/v1/projects",
|
||||
valueField = "id",
|
||||
labelField = "name"
|
||||
)
|
||||
)
|
||||
private String projectId;
|
||||
|
||||
@SchemaProperty(
|
||||
title = "Jenkins视图",
|
||||
description = "Jenkins视图名称",
|
||||
required = true,
|
||||
dataSource = @SchemaPropertyDataSource(
|
||||
type = "api",
|
||||
url = "/api/v1/jenkins/views",
|
||||
valueField = "name",
|
||||
labelField = "name",
|
||||
dependsOn = {"projectId"},
|
||||
params = {
|
||||
@SchemaPropertyDataSourceParam(name = "projectId", value = "${projectId}")
|
||||
}
|
||||
)
|
||||
)
|
||||
private String view;
|
||||
|
||||
@SchemaProperty(
|
||||
title = "Jenkins任务",
|
||||
description = "Jenkins任务名称",
|
||||
required = true,
|
||||
dataSource = @SchemaPropertyDataSource(
|
||||
type = "api",
|
||||
url = "/api/v1/jenkins/jobs",
|
||||
valueField = "name",
|
||||
labelField = "name",
|
||||
dependsOn = {"projectId", "view"},
|
||||
params = {
|
||||
@SchemaPropertyDataSourceParam(name = "projectId", value = "${projectId}"),
|
||||
@SchemaPropertyDataSourceParam(name = "view", value = "${view}")
|
||||
}
|
||||
)
|
||||
)
|
||||
private String job;
|
||||
|
||||
}
|
||||
@ -6,12 +6,12 @@ import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class JenkinsNodeLocalVariables extends BaseNodeLocalVariables {
|
||||
public class JenkinsJobTriggerNodeLocalVariables extends BaseNodeLocalVariables {
|
||||
|
||||
@SchemaProperty(
|
||||
title = "委派者",
|
||||
description = "委派者",
|
||||
defaultValue = "${jenkinsNodeDelegate}",
|
||||
defaultValue = "${jenkinsJobTriggerDelegate}",
|
||||
required = true
|
||||
)
|
||||
private String delegate;
|
||||
@ -0,0 +1,35 @@
|
||||
package com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables;
|
||||
|
||||
import com.qqchen.deploy.backend.workflow.annotation.SchemaProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 脚本执行器配置
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class JenkinsJobTriggerNodePanelVariables extends BaseNodePanelVariables {
|
||||
|
||||
// @SchemaProperty(
|
||||
// title = "环境",
|
||||
// description = "环境",
|
||||
// required = true
|
||||
// )
|
||||
// private String environment;
|
||||
//
|
||||
// /**
|
||||
// * 脚本语言
|
||||
// */
|
||||
// @SchemaProperty(
|
||||
// title = "任务名",
|
||||
// description = "任务名",
|
||||
// required = true,
|
||||
// enumNames = {"Shell脚本 (已支持)", "Python脚本 (开发中)", "JavaScript脚本 (开发中)", "Groovy脚本 (开发中)"},
|
||||
// defaultValue = "shell"
|
||||
// )
|
||||
// private String job;
|
||||
|
||||
}
|
||||
@ -1,66 +0,0 @@
|
||||
package com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables;
|
||||
|
||||
import com.qqchen.deploy.backend.workflow.annotation.SchemaProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 脚本执行器配置
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class JenkinsNodePanelVariables extends BaseNodePanelVariables {
|
||||
|
||||
|
||||
@SchemaProperty(
|
||||
title = "脚本代码",
|
||||
description = "脚本代码",
|
||||
required = true
|
||||
)
|
||||
private String script;
|
||||
|
||||
/**
|
||||
* 脚本语言
|
||||
*/
|
||||
@SchemaProperty(
|
||||
title = "脚本语言",
|
||||
description = "脚本语言类型",
|
||||
required = true,
|
||||
enumValues = {"shell", "python", "javascript", "groovy"},
|
||||
enumNames = {"Shell脚本 (已支持)", "Python脚本 (开发中)", "JavaScript脚本 (开发中)", "Groovy脚本 (开发中)"},
|
||||
defaultValue = "shell"
|
||||
)
|
||||
private String language;
|
||||
|
||||
/**
|
||||
* 解释器路径
|
||||
*/
|
||||
@SchemaProperty(
|
||||
title = "解释器路径",
|
||||
description = "脚本解释器的路径,例如:/bin/bash, /usr/bin/python3",
|
||||
required = true
|
||||
)
|
||||
private String interpreter;
|
||||
|
||||
/**
|
||||
* 成功退出码
|
||||
*/
|
||||
@SchemaProperty(
|
||||
title = "成功标识",
|
||||
description = "脚本执行成功时的标识",
|
||||
required = true
|
||||
)
|
||||
private Integer successExitCode;
|
||||
|
||||
/**
|
||||
* 支持的脚本语言列表
|
||||
*/
|
||||
@SchemaProperty(
|
||||
title = "支持的脚本语言",
|
||||
enumValues = {"shell", "python", "javascript", "groovy"}
|
||||
)
|
||||
private List<String> supportedLanguages;
|
||||
|
||||
}
|
||||
@ -9,16 +9,16 @@ public class Size {
|
||||
@SchemaProperty(
|
||||
title = "宽度",
|
||||
description = "节点的宽度",
|
||||
required = true,
|
||||
defaultValue = "120"
|
||||
required = true
|
||||
// defaultValue = "120"
|
||||
)
|
||||
private Integer width;
|
||||
|
||||
@SchemaProperty(
|
||||
title = "高度",
|
||||
description = "节点的高度",
|
||||
required = true,
|
||||
defaultValue = "60"
|
||||
required = true
|
||||
// defaultValue = "60"
|
||||
)
|
||||
private Integer height;
|
||||
}
|
||||
@ -1,9 +1,12 @@
|
||||
package com.qqchen.deploy.backend.workflow.enums;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonValue;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.fromVariables.JenkinsJobTriggerNodeFormVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.fromVariables.ScriptNodeFormVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.JenkinsJobTriggerNodeLocalVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.ScriptNodeLocalVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.EndNodePanelVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.JenkinsJobTriggerNodePanelVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.ScriptNodePanelVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.StartNodePanelVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.uiVariables.NodeUiVariables;
|
||||
@ -66,8 +69,8 @@ public enum NodeTypeEnums {
|
||||
.setStyle("#fff1f0", "#ff4d4f", "stop")
|
||||
.configPorts(Arrays.asList("in"))
|
||||
),
|
||||
SCRIPT_TASK(
|
||||
"SCRIPT_TASK",
|
||||
SCRIPT_NODE(
|
||||
"SCRIPT_NODE",
|
||||
"脚本任务",
|
||||
ScriptNodeLocalVariables.class,
|
||||
ScriptNodePanelVariables.class,
|
||||
@ -81,6 +84,18 @@ public enum NodeTypeEnums {
|
||||
.setSize(120, 60)
|
||||
.setStyle("#ffffff", "#1890ff", "code")
|
||||
.configPorts(Arrays.asList("in", "out"))
|
||||
),
|
||||
JENKINS_NODE(
|
||||
"JENKINS_JOB_TRIGGER",
|
||||
"JENKINS任务触发",
|
||||
JenkinsJobTriggerNodeLocalVariables.class,
|
||||
JenkinsJobTriggerNodePanelVariables.class,
|
||||
JenkinsJobTriggerNodeFormVariables.class,
|
||||
NodeUiVariables.class,
|
||||
BpmnNodeTypeEnums.SERVICE_TASK,
|
||||
NodeCategoryEnums.TASK,
|
||||
"JENKINS任务触发",
|
||||
null
|
||||
);
|
||||
//
|
||||
// /**
|
||||
|
||||
@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.qqchen.deploy.backend.workflow.annotation.SchemaProperty;
|
||||
import com.qqchen.deploy.backend.workflow.annotation.SchemaPropertyDataSource;
|
||||
import com.qqchen.deploy.backend.workflow.annotation.SchemaPropertyDataSourceParam;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.BaseNodePanelVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.EndNodePanelVariables;
|
||||
import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.ScriptNodePanelVariables;
|
||||
@ -34,7 +36,7 @@ public class SchemaGenerator {
|
||||
return StartNodePanelVariables.class;
|
||||
case END_EVENT:
|
||||
return EndNodePanelVariables.class;
|
||||
case SCRIPT_TASK:
|
||||
case SCRIPT_NODE:
|
||||
return ScriptNodePanelVariables.class;
|
||||
// 其他节点类型的配置类
|
||||
// case USER_TASK:
|
||||
@ -60,7 +62,7 @@ public class SchemaGenerator {
|
||||
for (NodeTypeEnums nodeType : NodeTypeEnums.values()) {
|
||||
// 获取节点类型对应的配置类
|
||||
Class<?> configClass = getConfigClassForNodeType(nodeType);
|
||||
// 生成该节点类型的schema
|
||||
// 生成该节点的schema
|
||||
ObjectNode nodeSchema = generateNodeSchema(nodeType, configClass);
|
||||
schemas.add(nodeSchema);
|
||||
}
|
||||
@ -74,7 +76,7 @@ public class SchemaGenerator {
|
||||
private static ObjectNode generateNodeSchema(NodeTypeEnums nodeType, Class<?> configClass) {
|
||||
ObjectNode node = mapper.createObjectNode();
|
||||
|
||||
// 设置基本信息
|
||||
// 设置基本信<EFBFBD><EFBFBD>
|
||||
node.put("code", nodeType.getCode());
|
||||
node.put("name", nodeType.getName());
|
||||
// node.put("description", nodeType.getShortDesc());
|
||||
@ -178,7 +180,7 @@ public class SchemaGenerator {
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理基础字段(code、name、description)
|
||||
* 处理基础字<EFBFBD><EFBFBD><EFBFBD>(code、name、description)
|
||||
*/
|
||||
private static void processBaseFields(ObjectNode properties, List<String> required, Class<?> configClass) {
|
||||
String[] baseFields = {"code", "name", "description"};
|
||||
@ -238,6 +240,41 @@ public class SchemaGenerator {
|
||||
fieldSchema.put("description", annotation.description());
|
||||
}
|
||||
|
||||
// 处理hidden属性
|
||||
if (annotation.hidden()) {
|
||||
fieldSchema.put("hidden", true);
|
||||
}
|
||||
|
||||
// 处理数据源属性
|
||||
SchemaPropertyDataSource dataSource = annotation.dataSource();
|
||||
if (!dataSource.type().isEmpty()) {
|
||||
ObjectNode dataSourceNode = fieldSchema.putObject("x-data-source");
|
||||
dataSourceNode.put("type", dataSource.type());
|
||||
|
||||
if (!dataSource.url().isEmpty()) {
|
||||
dataSourceNode.put("url", dataSource.url());
|
||||
}
|
||||
|
||||
dataSourceNode.put("valueField", dataSource.valueField());
|
||||
dataSourceNode.put("labelField", dataSource.labelField());
|
||||
|
||||
// 处理依赖字段
|
||||
if (dataSource.dependsOn().length > 0) {
|
||||
ArrayNode dependsOn = dataSourceNode.putArray("dependsOn");
|
||||
for (String dep : dataSource.dependsOn()) {
|
||||
dependsOn.add(dep);
|
||||
}
|
||||
}
|
||||
|
||||
// 处理参数
|
||||
if (dataSource.params().length > 0) {
|
||||
ObjectNode params = dataSourceNode.putObject("params");
|
||||
for (SchemaPropertyDataSourceParam param : dataSource.params()) {
|
||||
params.put(param.name(), param.value());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 处理format
|
||||
if (!annotation.format().isEmpty()) {
|
||||
fieldSchema.put("format", annotation.format());
|
||||
@ -274,7 +311,7 @@ public class SchemaGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
// 处理数组类型
|
||||
// 处理数类型
|
||||
if (jsonType.equals("array")) {
|
||||
ObjectNode items = fieldSchema.putObject("items");
|
||||
if (field.getType().isArray()) {
|
||||
|
||||
@ -535,3 +535,71 @@ CREATE TABLE workflow_log
|
||||
CONSTRAINT FK_workflow_log_node_instance FOREIGN KEY (node_instance_id) REFERENCES workflow_node_instance (id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流日志表';
|
||||
|
||||
-- --------------------------------------------------------------------------------------
|
||||
-- 项目管理相关表
|
||||
-- --------------------------------------------------------------------------------------
|
||||
|
||||
-- 项目组表
|
||||
CREATE TABLE deploy_project
|
||||
(
|
||||
-- 基础字段
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||||
create_by VARCHAR(100) NULL COMMENT '创建人',
|
||||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||||
update_by VARCHAR(100) NULL COMMENT '更新人',
|
||||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||||
version INT NOT NULL DEFAULT 1 COMMENT '版本号',
|
||||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除',
|
||||
|
||||
-- 业务字段
|
||||
tenant_id BIGINT NOT NULL COMMENT '租户ID',
|
||||
project_code VARCHAR(50) NOT NULL COMMENT '项目编码',
|
||||
project_name VARCHAR(100) NOT NULL COMMENT '项目名称',
|
||||
project_desc VARCHAR(255) NULL COMMENT '项目描述',
|
||||
project_status VARCHAR(50) NOT NULL DEFAULT 'ENABLED' COMMENT '项目状态:ENABLED-启用,DISABLED-禁用',
|
||||
sort INT NOT NULL DEFAULT 0 COMMENT '排序号',
|
||||
|
||||
-- 索引
|
||||
INDEX idx_tenant_id (tenant_id) COMMENT '租户ID索引',
|
||||
UNIQUE INDEX uk_project_code (tenant_id, project_code) COMMENT '租户下项目编码唯一',
|
||||
|
||||
-- 外键约束
|
||||
CONSTRAINT fk_project_tenant FOREIGN KEY (tenant_id)
|
||||
REFERENCES sys_tenant (id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目组表';
|
||||
|
||||
-- 应用表
|
||||
CREATE TABLE deploy_application
|
||||
(
|
||||
-- 基础字段
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
||||
create_by VARCHAR(100) NULL COMMENT '创建人',
|
||||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
||||
update_by VARCHAR(100) NULL COMMENT '更新人',
|
||||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
||||
version INT NOT NULL DEFAULT 1 COMMENT '版本号',
|
||||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除',
|
||||
|
||||
-- 业务字段
|
||||
project_id BIGINT NOT NULL COMMENT '所属项目ID',
|
||||
app_code VARCHAR(50) NOT NULL COMMENT '应用编码',
|
||||
app_name VARCHAR(100) NOT NULL COMMENT '应用名称',
|
||||
app_desc VARCHAR(255) NULL COMMENT '应用描述',
|
||||
app_status VARCHAR(50) NOT NULL DEFAULT 'ENABLED' COMMENT '应用状态:ENABLED-启用,DISABLED-禁用',
|
||||
repo_url VARCHAR(255) NULL COMMENT '代码仓库地址',
|
||||
repo_branch VARCHAR(100) NULL COMMENT '代码仓库分支',
|
||||
repo_type VARCHAR(50) NULL COMMENT '代码仓库类型:GIT、SVN',
|
||||
build_type VARCHAR(50) NULL COMMENT '构建类型:MAVEN、GRADLE、NPM',
|
||||
dev_language VARCHAR(50) NULL COMMENT '开发语言:JAVA、PYTHON、NODEJS',
|
||||
dev_framework VARCHAR(50) NULL COMMENT '开发框架:SPRING_BOOT、DJANGO、EXPRESS',
|
||||
sort INT NOT NULL DEFAULT 0 COMMENT '排序号',
|
||||
|
||||
-- 索引
|
||||
INDEX idx_project_id (project_id) COMMENT '项目ID索引',
|
||||
UNIQUE INDEX uk_app_code (project_id, app_code) COMMENT '项目下应用编码唯一',
|
||||
|
||||
-- 外键约束
|
||||
CONSTRAINT fk_application_project FOREIGN KEY (project_id)
|
||||
REFERENCES deploy_project (id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应用表';
|
||||
|
||||
|
||||
@ -73,12 +73,15 @@ VALUES
|
||||
-- 节点管理
|
||||
(103, '节点管理', '/workflow/node-design', '/src/pages/workflow/nodedesign/design/index', 'ControlOutlined', 2, 100, 40, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
|
||||
|
||||
-- 项目管理
|
||||
(300, '项目管理', '/project', 'Layout', 'ProjectOutlined', 1, NULL, 4, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
|
||||
-- 项目组列表
|
||||
(301, '项目组列表', '/project/list', '/src/pages/project/list/index', 'UnorderedListOutlined', 2, 300, 10, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
|
||||
|
||||
-- 应用管理
|
||||
(200, '应用管理', '/application', 'Layout', 'AppstoreOutlined', 1, NULL, 3, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
|
||||
(400, '应用管理', '/application', 'Layout', 'AppstoreOutlined', 1, NULL, 5, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
|
||||
-- 应用列表
|
||||
(201, '应用列表', '/application/list', '/src/pages/application/list/index', 'UnorderedListOutlined', 2, 200, 10, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
|
||||
-- 环境管理
|
||||
(202, '环境管理', '/application/environment', '/src/pages/application/environment/index', 'CloudOutlined', 2, 200, 20, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE);
|
||||
(401, '应用列表', '/application/list', '/src/pages/application/list/index', 'UnorderedListOutlined', 2, 400, 10, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE);
|
||||
|
||||
-- 初始化角色数据
|
||||
INSERT INTO sys_role (id, create_time, code, name, type, description, sort)
|
||||
@ -847,3 +850,41 @@ INSERT INTO workflow_definition (
|
||||
# }
|
||||
# }
|
||||
# }', 1);
|
||||
|
||||
-- --------------------------------------------------------------------------------------
|
||||
-- 初始化项目管理数据
|
||||
-- --------------------------------------------------------------------------------------
|
||||
|
||||
-- 初始化项目组数据
|
||||
INSERT INTO deploy_project (id, create_by, create_time, tenant_id, project_code, project_name, project_desc, project_status, sort)
|
||||
VALUES
|
||||
(1, 'admin', NOW(), 1, 'DEMO', '示例项目组', '用于演示的项目组', 'ENABLED', 1),
|
||||
(2, 'admin', NOW(), 1, 'PLATFORM', '平台项目组', '平台相关的项目组', 'ENABLED', 2);
|
||||
|
||||
-- 初始化应用数据
|
||||
INSERT INTO deploy_application (
|
||||
id, create_by, create_time,
|
||||
project_id, app_code, app_name, app_desc, app_status,
|
||||
repo_url, repo_branch, repo_type, build_type, dev_language, dev_framework, sort
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
1, 'admin', NOW(),
|
||||
1, 'DEMO-APP', '示例应用', '用于演示的应用', 'ENABLED',
|
||||
'https://github.com/demo/demo-app.git', 'main', 'GIT', 'MAVEN', 'JAVA', 'SPRING_BOOT', 1
|
||||
),
|
||||
(
|
||||
2, 'admin', NOW(),
|
||||
1, 'DEMO-WEB', '示例前端', '用于演示的前端应用', 'ENABLED',
|
||||
'https://github.com/demo/demo-web.git', 'main', 'GIT', 'NPM', 'NODEJS', 'VUE', 2
|
||||
),
|
||||
(
|
||||
3, 'admin', NOW(),
|
||||
2, 'PLATFORM-API', '平台API', '平台后端服务', 'ENABLED',
|
||||
'https://github.com/platform/platform-api.git', 'main', 'GIT', 'MAVEN', 'JAVA', 'SPRING_BOOT', 1
|
||||
),
|
||||
(
|
||||
4, 'admin', NOW(),
|
||||
2, 'PLATFORM-WEB', '平台前端', '平台前端应用', 'ENABLED',
|
||||
'https://github.com/platform/platform-web.git', 'main', 'GIT', 'NPM', 'NODEJS', 'VUE', 2
|
||||
);
|
||||
Loading…
Reference in New Issue
Block a user