From 66a59ad03978f5885359a3d149509769065ff4eb Mon Sep 17 00:00:00 2001 From: dengqichen Date: Mon, 23 Dec 2024 13:50:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deploy/api/ApplicationApiController.java | 23 ++++++ .../deploy/api/ProjectApiController.java | 23 ++++++ .../converter/ApplicationConverter.java | 10 +++ .../deploy/converter/ProjectConverter.java | 10 +++ .../backend/deploy/dto/ApplicationDTO.java | 41 ++++++++++ .../deploy/backend/deploy/dto/ProjectDTO.java | 29 ++++++++ .../backend/deploy/entity/Application.java | 50 +++++++++++++ .../deploy/backend/deploy/entity/Project.java | 53 +++++++++++++ .../deploy/query/ApplicationQuery.java | 33 +++++++++ .../backend/deploy/query/ProjectQuery.java | 24 ++++++ .../repository/IApplicationRepository.java | 10 +++ .../deploy/repository/IProjectRepository.java | 10 +++ .../deploy/service/IApplicationService.java | 8 ++ .../deploy/service/IProjectService.java | 8 ++ .../service/impl/ApplicationServiceImpl.java | 12 +++ .../service/impl/ProjectServiceImpl.java | 12 +++ .../workflow/annotation/SchemaProperty.java | 56 +++++++++++--- .../annotation/SchemaPropertyDataSource.java | 74 +++++++++++++++++++ .../SchemaPropertyDataSourceParam.java | 45 +++++++++++ ...te.java => JenkinsJobTriggerDelegate.java} | 2 +- .../dto/WorkflowNodeDefinitionDTO.java | 1 - .../fromVariables/BaseNodeFormVariables.java | 7 +- .../JenkinsJobTriggerNodeFormVariables.java | 61 +++++++++++++++ ... JenkinsJobTriggerNodeLocalVariables.java} | 4 +- .../JenkinsJobTriggerNodePanelVariables.java | 35 +++++++++ .../JenkinsNodePanelVariables.java | 66 ----------------- .../dto/definition/node/uiVariables/Size.java | 8 +- .../backend/workflow/enums/NodeTypeEnums.java | 19 ++++- .../workflow/util/SchemaGenerator.java | 47 ++++++++++-- .../db/migration/V1.0.0__init_schema.sql | 68 +++++++++++++++++ .../db/migration/V1.0.1__init_data.sql | 51 +++++++++++-- 31 files changed, 799 insertions(+), 101 deletions(-) create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ProjectApiController.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ApplicationConverter.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ProjectConverter.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationDTO.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ProjectDTO.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Application.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Project.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ApplicationQuery.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ProjectQuery.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IProjectRepository.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationService.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IProjectService.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ProjectServiceImpl.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaPropertyDataSource.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaPropertyDataSourceParam.java rename backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/{JenkinsNodeDelegate.java => JenkinsJobTriggerDelegate.java} (98%) create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/JenkinsJobTriggerNodeFormVariables.java rename backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/{JenkinsNodeLocalVariables.java => JenkinsJobTriggerNodeLocalVariables.java} (74%) create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/JenkinsJobTriggerNodePanelVariables.java delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/JenkinsNodePanelVariables.java diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java new file mode 100644 index 00000000..11af320a --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java @@ -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 { + + @Override + protected void exportData(HttpServletResponse response, List data) { + // TODO: 实现导出逻辑 + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ProjectApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ProjectApiController.java new file mode 100644 index 00000000..46c3e33d --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ProjectApiController.java @@ -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 { + + @Override + protected void exportData(HttpServletResponse response, List data) { + // TODO: 实现导出逻辑 + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ApplicationConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ApplicationConverter.java new file mode 100644 index 00000000..df1de14a --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ApplicationConverter.java @@ -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 { +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ProjectConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ProjectConverter.java new file mode 100644 index 00000000..502cf312 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ProjectConverter.java @@ -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 { +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationDTO.java new file mode 100644 index 00000000..d531a280 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationDTO.java @@ -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; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ProjectDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ProjectDTO.java new file mode 100644 index 00000000..ac1a02fa --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ProjectDTO.java @@ -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; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Application.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Application.java new file mode 100644 index 00000000..2727445f --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Application.java @@ -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 { + + @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; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Project.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Project.java new file mode 100644 index 00000000..7b12e871 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Project.java @@ -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 { + + /** + * 租户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; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ApplicationQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ApplicationQuery.java new file mode 100644 index 00000000..136ceff8 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ApplicationQuery.java @@ -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; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ProjectQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ProjectQuery.java new file mode 100644 index 00000000..6819052b --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ProjectQuery.java @@ -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; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java new file mode 100644 index 00000000..500bd038 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java @@ -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 { + boolean existsByAppCodeAndProjectIdAndDeletedFalse(String appCode, Long projectId); +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IProjectRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IProjectRepository.java new file mode 100644 index 00000000..cd69bfc7 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IProjectRepository.java @@ -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 { + boolean existsByProjectCodeAndTenantIdAndDeletedFalse(String projectCode, Long tenantId); +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationService.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationService.java new file mode 100644 index 00000000..4057a1f9 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationService.java @@ -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 { +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IProjectService.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IProjectService.java new file mode 100644 index 00000000..2e3d4403 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IProjectService.java @@ -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 { +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java new file mode 100644 index 00000000..c9bc584e --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java @@ -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 implements IApplicationService { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ProjectServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ProjectServiceImpl.java new file mode 100644 index 00000000..347e9f3f --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ProjectServiceImpl.java @@ -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 implements IProjectService { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaProperty.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaProperty.java index 7f4a889c..3df1fa6f 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaProperty.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaProperty.java @@ -6,7 +6,34 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * Schema属性注解 + * Schema属性注解,用于定义工作流节点表单字段的属性 + * + *

使用示例: + *

+ * {@code
+ * @SchemaProperty(
+ *     title = "项目",
+ *     description = "选择项目",
+ *     required = true,
+ *     dataSource = @SchemaPropertyDataSource(
+ *         type = "api",
+ *         url = "/api/v1/projects",
+ *         valueField = "id",
+ *         labelField = "name"
+ *     )
+ * )
+ * private String projectId;
+ * }
+ * 
+ * + *

支持的功能: + *

    + *
  • 基本属性:标题、描述、是否必填等
  • + *
  • 数据源配置:支持动态数据源,如API调用
  • + *
  • 数值范围:支持最大值和最小值限制
  • + *
  • 枚举值:支持固定选项及其显示名称
  • + *
  • 字段显示控制:支持隐藏字段
  • + *
*/ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @@ -15,42 +42,53 @@ public @interface SchemaProperty { * 字段标题 */ String title() default ""; - + /** * 字段描述 */ String description() default ""; - + /** * 是否必填 */ boolean required() default false; - + /** * 字段格式 */ String format() default ""; - + + /** + * 控制字段是否在表单中显示 + */ + boolean hidden() default false; + + /** + * 数据源配置,用于定义字段的数据来源 + * @see SchemaPropertyDataSource + */ + SchemaPropertyDataSource dataSource() default @SchemaPropertyDataSource(type = ""); + /** * 默认值 */ String defaultValue() default ""; - + /** * 最小值(用于数值类型) */ int minimum() default Integer.MIN_VALUE; - + /** * 最大值(用于数值类型) */ int maximum() default Integer.MAX_VALUE; - + /** * 枚举值(用于字符串类型) */ String[] enumValues() default {}; - + /** * 枚举值显示名称 */ diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaPropertyDataSource.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaPropertyDataSource.java new file mode 100644 index 00000000..c7498572 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaPropertyDataSource.java @@ -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属性的数据源配置注解,用于定义表单字段的数据来源 + * + *

主要用途: + *

    + *
  • 定义动态数据源,如API接口
  • + *
  • 配置数据字段映射关系
  • + *
  • 设置字段间的依赖关系
  • + *
  • 配置请求参数
  • + *
+ * + *

使用示例: + *

+ * {@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;
+ * }
+ * 
+ */ +@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 {}; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaPropertyDataSourceParam.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaPropertyDataSourceParam.java new file mode 100644 index 00000000..92b65421 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/annotation/SchemaPropertyDataSourceParam.java @@ -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请求参数 + * + *

主要用途: + *

    + *
  • 配置API请求参数的名称和值
  • + *
  • 支持动态参数值,使用${fieldName}引用其他字段的值
  • + *
+ * + *

使用示例: + *

+ * {@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;
+ * }
+ * 
+ */ +@Target({}) +@Retention(RetentionPolicy.RUNTIME) +public @interface SchemaPropertyDataSourceParam { + /** + * 参数名称 + */ + String name(); + + /** + * 参数值,支持使用${fieldName}引用其他字段的值 + */ + String value(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsNodeDelegate.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsJobTriggerDelegate.java similarity index 98% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsNodeDelegate.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsJobTriggerDelegate.java index ade727b6..4c88fbc4 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsNodeDelegate.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsJobTriggerDelegate.java @@ -24,7 +24,7 @@ import java.util.concurrent.ConcurrentHashMap; */ @Slf4j @Component -public class JenkinsNodeDelegate extends BaseNodeDelegate { +public class JenkinsJobTriggerDelegate extends BaseNodeDelegate { @Resource private ApplicationEventPublisher eventPublisher; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowNodeDefinitionDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowNodeDefinitionDTO.java index 3d767d09..a15be830 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowNodeDefinitionDTO.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowNodeDefinitionDTO.java @@ -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; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/BaseNodeFormVariables.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/BaseNodeFormVariables.java index daf74492..1a4aaa0b 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/BaseNodeFormVariables.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/BaseNodeFormVariables.java @@ -9,11 +9,6 @@ import lombok.Data; @Data public class BaseNodeFormVariables { - @SchemaProperty( - title = "委派者", - description = "委派者", - required = true - ) - private String delegate; + } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/JenkinsJobTriggerNodeFormVariables.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/JenkinsJobTriggerNodeFormVariables.java new file mode 100644 index 00000000..c93e4963 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/JenkinsJobTriggerNodeFormVariables.java @@ -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; + +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/JenkinsNodeLocalVariables.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/JenkinsJobTriggerNodeLocalVariables.java similarity index 74% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/JenkinsNodeLocalVariables.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/JenkinsJobTriggerNodeLocalVariables.java index 7a2b6b16..3632e531 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/JenkinsNodeLocalVariables.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/JenkinsJobTriggerNodeLocalVariables.java @@ -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; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/JenkinsJobTriggerNodePanelVariables.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/JenkinsJobTriggerNodePanelVariables.java new file mode 100644 index 00000000..485fb561 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/JenkinsJobTriggerNodePanelVariables.java @@ -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; + +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/JenkinsNodePanelVariables.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/JenkinsNodePanelVariables.java deleted file mode 100644 index 569f5a6c..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/JenkinsNodePanelVariables.java +++ /dev/null @@ -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 supportedLanguages; - -} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/uiVariables/Size.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/uiVariables/Size.java index 413c9630..2f62a20c 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/uiVariables/Size.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/uiVariables/Size.java @@ -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; } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnums.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnums.java index 5278d11e..7b45caf2 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnums.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnums.java @@ -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 ); // // /** diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/SchemaGenerator.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/SchemaGenerator.java index 7955a0ef..7d5b20f9 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/SchemaGenerator.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/SchemaGenerator.java @@ -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(); - // 设置基本信息 + // 设置基本信�� 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) + * 处理基础字���(code、name、description) */ private static void processBaseFields(ObjectNode properties, List 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()) { diff --git a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql index 40a90e37..af67adff 100644 --- a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql +++ b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql @@ -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='应用表'; + diff --git a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql index a65658d7..07ea914b 100644 --- a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql +++ b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql @@ -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) @@ -846,4 +849,42 @@ INSERT INTO workflow_definition ( # } # } # } -# }', 1); \ No newline at end of file +# }', 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 +); \ No newline at end of file