diff --git a/backend/pom.xml b/backend/pom.xml index 3a5dc432..01f25323 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -174,13 +174,10 @@ guava 32.1.3-jre + - org.flywaydb - flyway-core - - - org.flywaydb - flyway-mysql + org.liquibase + liquibase-core org.junit.jupiter diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/api/NotificationChannelApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/api/NotificationChannelApiController.java new file mode 100644 index 00000000..cad06ae2 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/api/NotificationChannelApiController.java @@ -0,0 +1,88 @@ +package com.qqchen.deploy.backend.notification.api; + +import com.qqchen.deploy.backend.framework.api.Response; +import com.qqchen.deploy.backend.framework.controller.BaseController; +import com.qqchen.deploy.backend.notification.dto.NotificationChannelDTO; +import com.qqchen.deploy.backend.notification.dto.NotificationChannelQuery; +import com.qqchen.deploy.backend.notification.entity.NotificationChannel; +import com.qqchen.deploy.backend.notification.enums.NotificationChannelTypeEnum; +import com.qqchen.deploy.backend.notification.service.INotificationChannelService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 通知渠道API控制器 + * + * @author qqchen + * @since 2025-10-22 + */ +@Slf4j +@RestController +@RequestMapping("/api/v1/notification-channel") +@Tag(name = "通知渠道管理", description = "通知渠道管理相关接口") +public class NotificationChannelApiController + extends BaseController { + + @Resource + private INotificationChannelService notificationChannelService; + + @Operation(summary = "获取所有渠道类型") + @GetMapping("/types") + public Response>> getChannelTypes() { + List> types = Arrays.stream(NotificationChannelTypeEnum.values()) + .map(type -> { + Map map = new HashMap<>(); + map.put("code", type.name()); + map.put("label", type.getLabel()); + map.put("description", type.getDescription()); + return map; + }) + .collect(Collectors.toList()); + + return Response.success(types); + } + + @Operation(summary = "测试通知渠道连接") + @PostMapping("/{id}/test") + public Response testConnection( + @Parameter(description = "渠道ID", required = true) @PathVariable Long id + ) { + boolean result = notificationChannelService.testConnection(id); + return Response.success(result); + } + + @Operation(summary = "启用通知渠道") + @PostMapping("/{id}/enable") + public Response enable( + @Parameter(description = "渠道ID", required = true) @PathVariable Long id + ) { + notificationChannelService.enable(id); + return Response.success(); + } + + @Operation(summary = "禁用通知渠道") + @PostMapping("/{id}/disable") + public Response disable( + @Parameter(description = "渠道ID", required = true) @PathVariable Long id + ) { + notificationChannelService.disable(id); + return Response.success(); + } + + @Override + protected void exportData(HttpServletResponse response, List data) { + // TODO: 实现导出功能 + } +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/converter/NotificationChannelConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/converter/NotificationChannelConverter.java new file mode 100644 index 00000000..6138b366 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/converter/NotificationChannelConverter.java @@ -0,0 +1,17 @@ +package com.qqchen.deploy.backend.notification.converter; + +import com.qqchen.deploy.backend.framework.converter.BaseConverter; +import com.qqchen.deploy.backend.notification.dto.NotificationChannelDTO; +import com.qqchen.deploy.backend.notification.entity.NotificationChannel; +import org.mapstruct.Mapper; + +/** + * 通知渠道转换器 + * + * @author qqchen + * @since 2025-10-22 + */ +@Mapper(config = BaseConverter.class) +public interface NotificationChannelConverter extends BaseConverter { +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/dto/NotificationChannelDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/dto/NotificationChannelDTO.java new file mode 100644 index 00000000..6c5cba94 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/dto/NotificationChannelDTO.java @@ -0,0 +1,43 @@ +package com.qqchen.deploy.backend.notification.dto; + +import com.qqchen.deploy.backend.framework.dto.BaseDTO; +import com.qqchen.deploy.backend.notification.enums.NotificationChannelStatusEnum; +import com.qqchen.deploy.backend.notification.enums.NotificationChannelTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Map; + +/** + * 通知渠道DTO + * + * @author qqchen + * @since 2025-10-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "通知渠道DTO") +public class NotificationChannelDTO extends BaseDTO { + + @Schema(description = "渠道名称", example = "研发部企业微信群") + @NotBlank(message = "渠道名称不能为空") + private String name; + + @Schema(description = "渠道类型", example = "WEWORK") + @NotNull(message = "渠道类型不能为空") + private NotificationChannelTypeEnum channelType; + + @Schema(description = "渠道配置(JSON格式)", example = "{\"webhookUrl\":\"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx\"}") + @NotNull(message = "渠道配置不能为空") + private Map config; + + @Schema(description = "状态", example = "ENABLED") + private NotificationChannelStatusEnum status; + + @Schema(description = "描述", example = "研发部通知群,用于部署通知") + private String description; +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/dto/NotificationChannelQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/dto/NotificationChannelQuery.java new file mode 100644 index 00000000..1bd5c057 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/dto/NotificationChannelQuery.java @@ -0,0 +1,35 @@ +package com.qqchen.deploy.backend.notification.dto; + +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 com.qqchen.deploy.backend.notification.enums.NotificationChannelStatusEnum; +import com.qqchen.deploy.backend.notification.enums.NotificationChannelTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 通知渠道查询条件 + * + * @author qqchen + * @since 2025-10-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "通知渠道查询条件") +public class NotificationChannelQuery extends BaseQuery { + + @Schema(description = "渠道名称(模糊查询)") + @QueryField(field = "name", type = QueryType.LIKE) + private String name; + + @Schema(description = "渠道类型") + @QueryField(field = "channelType") + private NotificationChannelTypeEnum channelType; + + @Schema(description = "状态") + @QueryField(field = "status") + private NotificationChannelStatusEnum status; +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/entity/NotificationChannel.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/entity/NotificationChannel.java new file mode 100644 index 00000000..74be2f78 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/entity/NotificationChannel.java @@ -0,0 +1,61 @@ +package com.qqchen.deploy.backend.notification.entity; + +import com.qqchen.deploy.backend.framework.annotation.LogicDelete; +import com.qqchen.deploy.backend.framework.domain.Entity; +import com.qqchen.deploy.backend.notification.enums.NotificationChannelStatusEnum; +import com.qqchen.deploy.backend.notification.enums.NotificationChannelTypeEnum; +import com.vladmihalcea.hibernate.type.json.JsonType; +import jakarta.persistence.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.annotations.Type; + +import java.util.Map; + +/** + * 通知渠道实体 + * + * @author qqchen + * @since 2025-10-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@jakarta.persistence.Entity +@Table(name = "sys_notification_channel") +@LogicDelete +public class NotificationChannel extends Entity { + + /** + * 渠道名称 + */ + @Column(nullable = false, length = 100) + private String name; + + /** + * 渠道类型 + */ + @Enumerated(EnumType.STRING) + @Column(name = "channel_type", nullable = false, length = 50) + private NotificationChannelTypeEnum channelType; + + /** + * 渠道配置(JSON格式,不同渠道存储不同字段) + */ + @Type(JsonType.class) + @Column(nullable = false, columnDefinition = "JSON") + private Map config; + + /** + * 状态 + */ + @Enumerated(EnumType.STRING) + @Column(nullable = false, length = 20) + private NotificationChannelStatusEnum status = NotificationChannelStatusEnum.ENABLED; + + /** + * 描述 + */ + @Column(length = 500) + private String description; +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/enums/NotificationChannelStatusEnum.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/enums/NotificationChannelStatusEnum.java new file mode 100644 index 00000000..75ef93c7 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/enums/NotificationChannelStatusEnum.java @@ -0,0 +1,54 @@ +package com.qqchen.deploy.backend.notification.enums; + +import lombok.Getter; + +/** + * 通知渠道状态枚举 + * + * @author qqchen + * @since 2025-10-22 + */ +@Getter +public enum NotificationChannelStatusEnum { + + /** + * 启用 + */ + ENABLED("ENABLED", "启用"), + + /** + * 禁用 + */ + DISABLED("DISABLED", "禁用"); + + /** + * 状态编码 + */ + private final String code; + + /** + * 状态描述 + */ + private final String description; + + NotificationChannelStatusEnum(String code, String description) { + this.code = code; + this.description = description; + } + + /** + * 根据编码获取枚举 + * + * @param code 编码 + * @return 枚举实例 + */ + public static NotificationChannelStatusEnum fromCode(String code) { + for (NotificationChannelStatusEnum status : values()) { + if (status.getCode().equals(code)) { + return status; + } + } + throw new IllegalArgumentException("Invalid notification channel status code: " + code); + } +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/enums/NotificationChannelTypeEnum.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/enums/NotificationChannelTypeEnum.java new file mode 100644 index 00000000..244bfc3f --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/enums/NotificationChannelTypeEnum.java @@ -0,0 +1,74 @@ +package com.qqchen.deploy.backend.notification.enums; + +import lombok.Getter; + +/** + * 通知渠道类型枚举 + * + * @author qqchen + * @since 2025-10-22 + */ +@Getter +public enum NotificationChannelTypeEnum { + + /** + * 企业微信 + */ + WEWORK("企业微信", "通过企业微信群机器人发送消息"); + +// /** +// * 飞书 +// */ +// FEISHU("飞书", "通过飞书群机器人发送消息"), +// +// /** +// * 钉钉 +// */ +// DINGTALK("钉钉", "通过钉钉群机器人发送消息"), +// +// /** +// * 短信 +// */ +// SMS("短信", "通过短信平台发送消息"), +// +// /** +// * 邮件 +// */ +// EMAIL("邮件", "通过SMTP发送邮件"), +// +// /** +// * Slack +// */ +// SLACK("Slack", "通过Slack Webhook发送消息"); + + /** + * 渠道标签 + */ + private final String label; + + /** + * 渠道描述 + */ + private final String description; + + NotificationChannelTypeEnum(String label, String description) { + this.label = label; + this.description = description; + } + + /** + * 根据编码获取枚举 + * + * @param code 编码 + * @return 枚举实例 + */ + public static NotificationChannelTypeEnum fromCode(String code) { + for (NotificationChannelTypeEnum type : values()) { + if (type.name().equals(code)) { + return type; + } + } + throw new IllegalArgumentException("Invalid notification channel type code: " + code); + } +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/repository/INotificationChannelRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/repository/INotificationChannelRepository.java new file mode 100644 index 00000000..adb634aa --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/repository/INotificationChannelRepository.java @@ -0,0 +1,48 @@ +package com.qqchen.deploy.backend.notification.repository; + +import com.qqchen.deploy.backend.framework.repository.IBaseRepository; +import com.qqchen.deploy.backend.notification.entity.NotificationChannel; +import com.qqchen.deploy.backend.notification.enums.NotificationChannelStatusEnum; +import com.qqchen.deploy.backend.notification.enums.NotificationChannelTypeEnum; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 通知渠道Repository + * + * @author qqchen + * @since 2025-10-22 + */ +@Repository +public interface INotificationChannelRepository extends IBaseRepository { + + /** + * 根据名称和删除标记查询是否存在 + * + * @param name 渠道名称 + * @return 是否存在 + */ + boolean existsByNameAndDeletedFalse(String name); + + /** + * 根据渠道类型和状态查询渠道列表 + * + * @param channelType 渠道类型 + * @param status 状态 + * @return 渠道列表 + */ + List findByChannelTypeAndStatusAndDeletedFalse( + NotificationChannelTypeEnum channelType, + NotificationChannelStatusEnum status + ); + + /** + * 根据状态查询渠道列表 + * + * @param status 状态 + * @return 渠道列表 + */ + List findByStatusAndDeletedFalse(NotificationChannelStatusEnum status); +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/service/INotificationChannelService.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/service/INotificationChannelService.java new file mode 100644 index 00000000..fe1c1c83 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/service/INotificationChannelService.java @@ -0,0 +1,38 @@ +package com.qqchen.deploy.backend.notification.service; + +import com.qqchen.deploy.backend.framework.service.IBaseService; +import com.qqchen.deploy.backend.notification.dto.NotificationChannelDTO; +import com.qqchen.deploy.backend.notification.dto.NotificationChannelQuery; +import com.qqchen.deploy.backend.notification.entity.NotificationChannel; + +/** + * 通知渠道Service接口 + * + * @author qqchen + * @since 2025-10-22 + */ +public interface INotificationChannelService extends IBaseService { + + /** + * 测试通知渠道连接 + * + * @param id 渠道ID + * @return 测试结果 + */ + boolean testConnection(Long id); + + /** + * 启用渠道 + * + * @param id 渠道ID + */ + void enable(Long id); + + /** + * 禁用渠道 + * + * @param id 渠道ID + */ + void disable(Long id); +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/notification/service/impl/NotificationChannelServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/notification/service/impl/NotificationChannelServiceImpl.java new file mode 100644 index 00000000..ec3c74dd --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/notification/service/impl/NotificationChannelServiceImpl.java @@ -0,0 +1,85 @@ +package com.qqchen.deploy.backend.notification.service.impl; + +import com.qqchen.deploy.backend.framework.annotation.ServiceType; +import com.qqchen.deploy.backend.framework.enums.ResponseCode; +import com.qqchen.deploy.backend.framework.exception.BusinessException; +import com.qqchen.deploy.backend.framework.exception.UniqueConstraintException; +import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; +import com.qqchen.deploy.backend.notification.converter.NotificationChannelConverter; +import com.qqchen.deploy.backend.notification.dto.NotificationChannelDTO; +import com.qqchen.deploy.backend.notification.dto.NotificationChannelQuery; +import com.qqchen.deploy.backend.notification.entity.NotificationChannel; +import com.qqchen.deploy.backend.notification.enums.NotificationChannelStatusEnum; +import com.qqchen.deploy.backend.notification.repository.INotificationChannelRepository; +import com.qqchen.deploy.backend.notification.service.INotificationChannelService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import static com.qqchen.deploy.backend.framework.annotation.ServiceType.Type.DATABASE; + +/** + * 通知渠道Service实现 + * + * @author qqchen + * @since 2025-10-22 + */ +@Slf4j +@Service +@ServiceType(DATABASE) +public class NotificationChannelServiceImpl + extends BaseServiceImpl + implements INotificationChannelService { + + @Resource + private INotificationChannelRepository notificationChannelRepository; + + @Resource + private NotificationChannelConverter notificationChannelConverter; + + @Override + protected void validateUniqueConstraints(NotificationChannelDTO dto) { + // 检查渠道名称唯一性 + if (notificationChannelRepository.existsByNameAndDeletedFalse(dto.getName())) { + throw new UniqueConstraintException(ResponseCode.CONFLICT, "name", dto.getName()); + } + } + + @Override + @Transactional + public boolean testConnection(Long id) { + NotificationChannel channel = notificationChannelRepository.findById(id) + .orElseThrow(() -> new BusinessException(ResponseCode.DATA_NOT_FOUND)); + + // TODO: 实现实际的连接测试逻辑 + log.info("测试通知渠道连接: id={}, type={}", id, channel.getChannelType()); + + return true; + } + + @Override + @Transactional + public void enable(Long id) { + NotificationChannel channel = notificationChannelRepository.findById(id) + .orElseThrow(() -> new BusinessException(ResponseCode.DATA_NOT_FOUND)); + + channel.setStatus(NotificationChannelStatusEnum.ENABLED); + notificationChannelRepository.save(channel); + + log.info("启用通知渠道: id={}, name={}", id, channel.getName()); + } + + @Override + @Transactional + public void disable(Long id) { + NotificationChannel channel = notificationChannelRepository.findById(id) + .orElseThrow(() -> new BusinessException(ResponseCode.DATA_NOT_FOUND)); + + channel.setStatus(NotificationChannelStatusEnum.DISABLED); + notificationChannelRepository.save(channel); + + log.info("禁用通知渠道: id={}, name={}", id, channel.getName()); + } +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/workflow/OutputField.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/workflow/OutputField.java index 58814c17..632963a0 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/workflow/OutputField.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/workflow/OutputField.java @@ -1,5 +1,6 @@ package com.qqchen.deploy.backend.workflow.dto.definition.workflow; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.List; @@ -18,6 +19,11 @@ public class OutputField { private String description; + /** + * 枚举值列表 + * 注意:前端使用 "enum"(JSON关键字),Java中使用 enums 避免与 enum 关键字冲突 + */ + @JsonProperty("enum") private List enums; private Object example; 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 3ad27de4..c235a059 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 @@ -96,8 +96,8 @@ public enum NodeTypeEnums { NodeCategoryEnums.GATEWAY, "条件分支控制" ), - NOTIFICATION_NODE( - "NOTIFICATION_NODE", + NOTIFICATION( + "NOTIFICATION", "通知节点", NotificationNodeLocalVariables.class, NotificationNodePanelVariables.class, diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index cda468d1..3b6303fb 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -55,15 +55,12 @@ spring: always-use-message-format: false use-code-as-default-message: true cache-duration: 3600 - flyway: + liquibase: enabled: true - baseline-on-migrate: true - locations: classpath:db/migration - table: flyway_schema_history - baseline-version: 0 - validate-on-migrate: true - placeholderPrefix: "#{" - placeholderSuffix: "}" + change-log: classpath:db/changelog/db.changelog-master.yaml + drop-first: false + default-schema: deploy-ease-platform + contexts: default flowable: database-schema-update: true # id-generator: org.flowable.common.engine.impl.db.DbIdGenerator diff --git a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql b/backend/src/main/resources/db/changelog/archive/V1.0.0__init_schema.sql similarity index 96% rename from backend/src/main/resources/db/migration/V1.0.0__init_schema.sql rename to backend/src/main/resources/db/changelog/archive/V1.0.0__init_schema.sql index 5e024509..99286eef 100644 --- a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql +++ b/backend/src/main/resources/db/changelog/archive/V1.0.0__init_schema.sql @@ -665,3 +665,28 @@ CREATE TABLE deploy_app_config deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除' ); +-- -------------------------------------------------------------------------------------- +-- 通知渠道表 +-- -------------------------------------------------------------------------------------- + +-- 通知渠道配置表 +CREATE TABLE sys_notification_channel ( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + name VARCHAR(100) NOT NULL COMMENT '渠道名称(如:研发部企业微信群)', + channel_type VARCHAR(50) NOT NULL COMMENT '渠道类型(WEWORK, FEISHU, DINGTALK, SMS, EMAIL, SLACK)', + config JSON NOT NULL COMMENT '渠道配置(JSON格式,不同渠道存储不同字段)', + status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '状态(ENABLED-启用, DISABLED-禁用)', + description VARCHAR(500) NULL COMMENT '描述说明', + + INDEX idx_channel_type (channel_type), + INDEX idx_status (status), + INDEX idx_deleted (deleted) +) 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/changelog/archive/V1.0.1__init_data.sql similarity index 95% rename from backend/src/main/resources/db/migration/V1.0.1__init_data.sql rename to backend/src/main/resources/db/changelog/archive/V1.0.1__init_data.sql index 7d6cbc39..acafabfc 100644 --- a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql +++ b/backend/src/main/resources/db/changelog/archive/V1.0.1__init_data.sql @@ -801,4 +801,30 @@ INSERT INTO workflow_node_definition ( # 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 +# ); + +-- -------------------------------------------------------------------------------------- +-- 初始化通知渠道数据 +-- -------------------------------------------------------------------------------------- + +-- 企业微信通知渠道示例 +INSERT INTO sys_notification_channel +(name, channel_type, config, status, description, create_by, create_time, update_by, update_time, version, deleted) +VALUES +('研发部企业微信群', 'WEWORK', + '{"webhookUrl":"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=example-key-please-replace"}', + 'DISABLED', + '研发部通知群,用于部署通知(示例数据,请修改为实际的Webhook地址)', + 'admin', NOW(), 'admin', NOW(), 0, 0), + +('运维飞书告警群', 'FEISHU', + '{"webhookUrl":"https://open.feishu.cn/open-apis/bot/v2/hook/example-hook-id","secret":"example-secret"}', + 'DISABLED', + '运维团队告警通知(示例数据,请修改为实际配置)', + 'admin', NOW(), 'admin', NOW(), 0, 0), + +('管理员邮件通知', 'EMAIL', + '{"smtpHost":"smtp.qq.com","smtpPort":465,"username":"notify@example.com","password":"example-password","fromEmail":"notify@example.com","ssl":true}', + 'DISABLED', + '管理员邮件通知渠道(示例数据,请修改为实际配置)', + 'admin', NOW(), 'admin', NOW(), 0, 0); diff --git a/backend/src/main/resources/db/changelog/changes/v1.0.0-data.sql b/backend/src/main/resources/db/changelog/changes/v1.0.0-data.sql new file mode 100644 index 00000000..9cf72719 --- /dev/null +++ b/backend/src/main/resources/db/changelog/changes/v1.0.0-data.sql @@ -0,0 +1,833 @@ +-- -------------------------------------------------------------------------------------- +-- 初始化系统基础数据 +-- -------------------------------------------------------------------------------------- + +-- 初始化租户数据 +INSERT INTO sys_tenant (id, create_time, code, name, address, contact_name, contact_phone, email, enabled) +VALUES (1, NOW(), 'admin', '系统管理租户', '北京市朝阳区', '管理员', '13800138000', 'admin@system.com', 1); + +-- 初始化部门数据 +INSERT INTO sys_department (id, create_time, code, name, description, sort, enabled) +VALUES (1, NOW(), 'ROOT', '根部门', '系统根部门', 0, 1); + +INSERT INTO sys_department (id, create_time, code, name, description, parent_id, sort, enabled) +VALUES +(2, NOW(), 'IT', '信息技术部', '负责公司IT系统的规划、建设和运维', 1, 1, 1), +(3, NOW(), 'DEV', '研发部', '负责产品研发和技术创新', 1, 2, 1), +(4, NOW(), 'OPS', '运维部', '负责系统运维和技术支持', 1, 3, 1); + +-- 初始化用户数据(密码统一为:123456) +INSERT INTO sys_user (id, create_time, username, password, nickname, email, phone, department_id, enabled) +VALUES +(1, NOW(), 'admin', '$2a$10$viWVqfZwQxViLQDk7hhVg.ENYT.3zUFf.aBetlarImKPSS0V2gbSa', '超级管理员', 'admin@system.com', '13800138000', 1, 1), +(2, NOW(), 'it_manager', '$2a$10$viWVqfZwQxViLQDk7hhVg.ENYT.3zUFf.aBetlarImKPSS0V2gbSa', 'IT经理', 'it@system.com', '13800138001', 2, 1), +(3, NOW(), 'dev_manager', '$2a$10$viWVqfZwQxViLQDk7hhVg.ENYT.3zUFf.aBetlarImKPSS0V2gbSa', '研发经理', 'dev@system.com', '13800138002', 3, 1), +(4, NOW(), 'ops_manager', '$2a$10$viWVqfZwQxViLQDk7hhVg.ENYT.3zUFf.aBetlarImKPSS0V2gbSa', '运维经理', 'ops@system.com', '13800138003', 4, 1); + +-- 初始化系统参数 +INSERT INTO sys_param (id, create_time, code, name, value, type, description, enabled) +VALUES +(1, NOW(), 'SYSTEM_NAME', '系统名称', 'Deploy Ease Platform', 'STRING', '系统显示名称', 1), +(2, NOW(), 'SYSTEM_LOGO', '系统Logo', '/static/logo.png', 'STRING', '系统Logo路径', 1), +(3, NOW(), 'LOGIN_BACKGROUND', '登录背景', '/static/login-bg.jpg', 'STRING', '登录页面背景图片', 1); + +-- -------------------------------------------------------------------------------------- +-- 初始化权限管理数据 +-- -------------------------------------------------------------------------------------- + +-- -------------------------------------------------------------------------------------- +-- 初始化权限管理数据 +-- -------------------------------------------------------------------------------------- + +-- -------------------------------------------------------------------------------------- +-- 初始化权限管理数据 +-- -------------------------------------------------------------------------------------- + +-- 先清理已有数据 +DELETE FROM sys_menu; + +INSERT INTO sys_menu (id, name, path, component, icon, type, parent_id, sort, hidden, enabled, create_by, create_time, version, deleted) +VALUES +-- 首页 +(99, '工作台', '/dashboard', '/src/pages/dashboard/index', 'DashboardOutlined', 2, NULL, 0, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), + +-- 系统管理 +(1, '系统管理', '/system', 'Layout', 'SettingOutlined', 1, NULL, 1, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), +-- 用户管理 +(2, '用户管理', '/system/user', '/src/pages/system/user/index', 'UserOutlined', 2, 1, 10, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), +-- 角色管理 +(3, '角色管理', '/system/role', '/src/pages/system/role/index', 'TeamOutlined', 2, 1, 20, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), +-- 菜单管理 +(4, '菜单管理', '/system/menu', '/src/pages/system/menu/index', 'MenuOutlined', 2, 1, 30, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), +-- 部门管理 +(5, '部门管理', '/system/department', '/src/pages/system/department/index', 'ApartmentOutlined', 2, 1, 40, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), + +-- 工作流管理 +(100, '工作流管理', '/workflow', 'Layout', 'DeploymentUnitOutlined', 1, NULL, 2, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), +-- 工作流设计 +(101, '工作流设计', '/workflow/definition', '/src/pages/workflow/definition/index', 'EditOutlined', 2, 100, 10, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), +-- 工作流实例 +(102, '工作流实例', '/workflow/instance', '/src/pages/workflow/instance/index', 'BranchesOutlined', 2, 100, 20, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), +-- 节点管理 +(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), + +(200, '运维管理', '/deploy', '', 'DeploymentUnitOutlined', 2, 0, 50, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), + +(201, '项目组管理', '/deploy/project-group', '/src/pages/Deploy/ProjectGroup/List/index', 'ProjectOutlined', 2, 200, 1, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), + +(202, '应用管理', '/deploy/applications', '/src/pages/Deploy/Application/List/index', 'AppstoreOutlined', 2, 200, 2, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), + +(203, '环境管理', '/deploy/environments', '/src/pages/Deploy/Environment/List/index', 'CloudOutlined', 2, 200, 3, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), + +(204, '部署配置管理', '/deploy/deployment', '/src/pages/Deploy/Deployment/List/index', 'CloudOutlined', 2, 200, 4, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), + +(205, 'Jenkins管理', '/deploy/jenkins-manager', '/src/pages/Deploy/JenkinsManager/List', 'CloudOutlined', 2, 200, 5, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), + +(206, 'Git管理', '/deploy/git-manager', '/src/pages/Deploy/GitManager/List', 'CloudOutlined', 2, 200, 6, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE), +-- 三方系统 +(207, '三方系统管理', '/deploy/external', '/src/pages/Deploy/external/index', 'ApiOutlined', 2, 200, 7, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE); + +-- 初始化角色数据 +INSERT INTO sys_role (id, create_time, code, name, type, description, sort) +VALUES +(1, NOW(), 'SUPER_ADMIN', '超级管理员', 1, '系统超级管理员,拥有所有权限', 1), +(2, NOW(), 'SYSTEM_ADMIN', '系统管理员', 1, '系统管理员,拥有大部分系统管理权限', 2), +(3, NOW(), 'COMMON_USER', '普通用户', 2, '普通用,仅拥有基本操作权限', 3); + +-- 初始化角色标签 +INSERT INTO sys_role_tag (id, create_time, name, color) +VALUES +(1, NOW(), '系统内置', '#ff4d4f'), +(2, NOW(), '重要角色', '#ffa940'), +(3, NOW(), '普通角色', '#73d13d'); + +-- 初始化角色标签关联 +INSERT INTO sys_role_tag_relation (role_id, tag_id) +VALUES +(1, 1), +(2, 1), +(2, 2), +(3, 3); + +-- 初始化用户角色关联 +INSERT INTO sys_user_role (user_id, role_id) +VALUES +( 1, 1), +( 2, 2), +(3, 2), +(4, 3); + +-- 初始化角色菜单关联 +INSERT INTO sys_role_menu (role_id, menu_id) +SELECT 1, id FROM sys_menu; -- 超级管理员拥有所有菜单权限 + +INSERT INTO sys_role_menu (role_id, menu_id) +VALUES +(2, 1), (2, 2), (2, 3), (2, 4), (2, 5), -- 系统管理员拥有系统管理相关权限 +(3, 205); -- 普通用户拥有三方系统权限 + +-- 初始化权限模板 +INSERT INTO sys_permission_template (id, create_time, code, name, type, description, enabled) +VALUES +(1, NOW(), 'FULL_PERMISSION', '完整权限模板', 1, '包含所有系统权限的模板', 1), +(2, NOW(), 'BASIC_PERMISSION', '基础权限模板', 1, '包含基本操作权限的模板', 1); + +-- 初始化模板菜单关联 +INSERT INTO sys_template_menu (template_id, menu_id) +SELECT 1, id FROM sys_menu; -- 完整权限模板关联所有菜单 + +INSERT INTO sys_template_menu (template_id, menu_id) +VALUES (2, 205); -- 基础权限模板关联三方系统菜单 + +-- 初始化权限数据 +INSERT INTO sys_permission (id, create_time, menu_id, code, name, type, sort) +VALUES +-- 用户管理权限 +(1, NOW(), 2, 'system:user:list', '用户列表', 'FUNCTION', 1), +(2, NOW(), 2, 'system:user:create', '用户创建', 'FUNCTION', 2), +(3, NOW(), 2, 'system:user:update', '用户修改', 'FUNCTION', 3), +(4, NOW(), 2, 'system:user:delete', '用户删除', 'FUNCTION', 4), + +-- 角色管理权限 +(5, NOW(), 3, 'system:role:list', '角色列表', 'FUNCTION', 1), +(6, NOW(), 3, 'system:role:create', '角色创建', 'FUNCTION', 2), +(7, NOW(), 3, 'system:role:update', '角色修改', 'FUNCTION', 3), +(8, NOW(), 3, 'system:role:delete', '角色删除', 'FUNCTION', 4), + +-- 三方系统权限 +(9, NOW(), 205, 'system:external:list', '三方系统列表', 'FUNCTION', 1), +(10, NOW(), 205, 'system:external:create', '三方系统创建', 'FUNCTION', 2), +(11, NOW(), 205, 'system:external:update', '三方系统修改', 'FUNCTION', 3), +(12, NOW(), 205, 'system:external:delete', '三方系统删除', 'FUNCTION', 4), +(13, NOW(), 205, 'system:external:test', '连接测试', 'FUNCTION', 5), +(14, NOW(), 205, 'system:external:sync', '数据同步', 'FUNCTION', 6); + +-- -------------------------------------------------------------------------------------- +-- 初始化外部系统数据 +-- -------------------------------------------------------------------------------------- + +-- 初始化外部系统 +INSERT INTO sys_external_system ( + id, create_by, create_time, deleted, update_by, update_time, version, + name, type, url, remark, sort, enabled, auth_type, username, password, token, + sync_status, last_sync_time, last_connect_time, config +) VALUES ( + 1, 'admin', '2023-12-01 00:00:00', 0, 'admin', '2023-12-01 00:00:00', 0, + '链宇JENKINS', 'JENKINS', 'https://ly-jenkins.iscmtech.com', '链宇JENKINS', 1, 1, + 'BASIC', 'admin', 'Lianyu!@#~123456', NULL, + 'SUCCESS', '2023-12-01 00:00:00', '2023-12-01 00:00:00', '{}' +), ( + 2, 'admin', '2023-12-01 00:00:00', 0, 'admin', '2023-12-01 00:00:00', 0, + 'GitLab测试环境', 'GIT', 'http://gitlab.test.com', '测试环境GitLab服务器', 2, 1, + 'TOKEN', NULL, NULL, 'test-token', + 'SUCCESS', '2023-12-01 00:00:00', '2023-12-01 00:00:00', '{}' +), ( + 3, 'admin', '2024-12-03 10:35:58.932966', 0, 'admin', '2024-12-03 10:35:58.932966', 0, + '链宇GIT', 'GIT', 'http://119.3.203.210:8088/', NULL, 1, 1, + 'TOKEN', NULL, NULL, 'cNSud7D1GmYQKEMco7s5', + NULL, NULL, NULL, '{}' +); + +-- -------------------------------------------------------------------------------------- +-- 初始化工作流相关数据 +-- -------------------------------------------------------------------------------------- +-- 工作流定义测试数据 +INSERT INTO workflow_definition ( + -- 基础信息 + name, `key`, process_definition_id, flow_version, description, category, triggers, + -- 流程配置 + graph, local_variables_schema, tags, + -- 流程属性 + status, is_executable, target_namespace, + -- 审计字段 + created_at, updated_at, created_by, updated_by, is_deleted +) VALUES +-- 简单脚本流程:开始 -> 脚本任务 -> 结束 +( + '简单脚本流程', 'simple_script_flow', null, 1, '一个包含脚本任务的简单流程', 'SCRIPT_EXECUTION', null, + '{ + "nodes" : [ { + "id" : "startEvent1", + "code" : "START_EVENT", + "type" : "START_EVENT", + "name" : "开始", + "graph" : { + "shape" : "circle", + "size" : { + "width" : 40, + "height" : 40 + }, + "style" : { + "fill" : "#e8f7ff", + "stroke" : "#1890ff", + "icon" : "play-circle", + "iconColor" : "#1890ff", + "strokeWidth" : 2 + }, + "ports" : { + "groups" : { + "out" : { + "position" : "right", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + } + }, + "types" : [ "out" ] + }, + "position" : { + "x" : 100, + "y" : 100 + } + }, + "config" : { + "name" : "开始节点", + "description" : "启动流程" + } + }, { + "id" : "scriptTask1", + "code" : "SCRIPT_TASK", + "type" : "SCRIPT_TASK", + "name" : "执行脚本", + "graph" : { + "shape" : "rect", + "size" : { + "width" : 40, + "height" : 40 + }, + "style" : { + "fill" : "#fff1f0", + "stroke" : "#ff4d4f", + "icon" : "code", + "iconColor" : "#ff4d4f", + "strokeWidth" : 2 + }, + "ports" : { + "groups" : { + "in" : { + "position" : "left", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + }, + "out" : { + "position" : "right", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + } + }, + "types" : [ "in", "out" ] + }, + "position" : { + "x" : 300, + "y" : 100 + } + }, + "config" : { + "name" : "脚本任务", + "description" : "执行一个简单的Shell脚本", + "language" : "shell", + "script" : "echo ''Hello World''" + } + }, { + "id" : "endEvent1", + "code" : "END_EVENT", + "type" : "END_EVENT", + "name" : "结束", + "graph" : { + "shape" : "circle", + "size" : { + "width" : 40, + "height" : 40 + }, + "style" : { + "fill" : "#fff1f0", + "stroke" : "#ff4d4f", + "icon" : "stop", + "iconColor" : "#ff4d4f", + "strokeWidth" : 2 + }, + "ports" : { + "groups" : { + "in" : { + "position" : "left", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + } + }, + "types" : [ "in" ] + }, + "position" : { + "x" : 500, + "y" : 100 + } + }, + "config" : { + "name" : "结束节点", + "description" : "流程结束" + } + } ], + "edges" : [ { + "id" : "flow1", + "from" : "startEvent1", + "to" : "scriptTask1", + "name" : "开始到脚本", + "config" : { + "type" : "sequence" + }, + "properties" : null + }, { + "id" : "flow2", + "from" : "scriptTask1", + "to" : "endEvent1", + "name" : "脚本到结束", + "config" : { + "type" : "sequence" + }, + "properties" : null + } ] +}', + '{"formItems":[]}', + '["simple","script","test"]', + 'DRAFT', TRUE, 'http://www.flowable.org/test', + NOW(), NOW(), 1, 1, FALSE +), + +-- 复杂业务流程:开始 -> 脚本任务A -> 脚本任务B -> 结束 +( + '复杂业务流程', 'complex_business_flow', null, 1, '包含多个脚本任务节点的业务流程', 'SCRIPT_EXECUTION', null, + '{ + "nodes" : [ { + "id" : "startEvent1", + "code" : "START_EVENT", + "type" : "START_EVENT", + "name" : "开始", + "graph" : { + "shape" : "circle", + "size" : { + "width" : 40, + "height" : 40 + }, + "style" : { + "fill" : "#e8f7ff", + "stroke" : "#1890ff", + "icon" : "play-circle", + "iconColor" : "#1890ff", + "strokeWidth" : 2 + }, + "ports" : { + "groups" : { + "out" : { + "position" : "right", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + } + }, + "types" : [ "out" ] + }, + "position" : { + "x" : 100, + "y" : 100 + } + }, + "config" : { + "name" : "开始节点", + "description" : "启动流程" + } + }, { + "id" : "scriptTask1", + "code" : "SCRIPT_TASK", + "type" : "SCRIPT_TASK", + "name" : "数据处理", + "graph" : { + "shape" : "rect", + "size" : { + "width" : 40, + "height" : 40 + }, + "style" : { + "fill" : "#fff1f0", + "stroke" : "#ff4d4f", + "icon" : "code", + "iconColor" : "#ff4d4f", + "strokeWidth" : 2 + }, + "ports" : { + "groups" : { + "in" : { + "position" : "left", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + }, + "out" : { + "position" : "right", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + } + }, + "types" : [ "in", "out" ] + }, + "position" : { + "x" : 300, + "y" : 100 + } + }, + "config" : { + "name" : "脚本任务A", + "description" : "数据处理", + "language" : "shell", + "script" : "process_data.sh" + } + }, { + "id" : "scriptTask2", + "code" : "SCRIPT_TASK", + "type" : "SCRIPT_TASK", + "name" : "生成报告", + "graph" : { + "shape" : "rect", + "size" : { + "width" : 40, + "height" : 40 + }, + "style" : { + "fill" : "#fff1f0", + "stroke" : "#ff4d4f", + "icon" : "code", + "iconColor" : "#ff4d4f", + "strokeWidth" : 2 + }, + "ports" : { + "groups" : { + "in" : { + "position" : "left", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + }, + "out" : { + "position" : "right", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + } + }, + "types" : [ "in", "out" ] + }, + "position" : { + "x" : 500, + "y" : 100 + } + }, + "config" : { + "name" : "脚本任务B", + "description" : "生成报告", + "language" : "shell", + "script" : "generate_report.sh" + } + }, { + "id" : "endEvent1", + "code" : "END_EVENT", + "type" : "END_EVENT", + "name" : "结束", + "graph" : { + "shape" : "circle", + "size" : { + "width" : 40, + "height" : 40 + }, + "style" : { + "fill" : "#fff1f0", + "stroke" : "#ff4d4f", + "icon" : "stop", + "iconColor" : "#ff4d4f", + "strokeWidth" : 2 + }, + "ports" : { + "groups" : { + "in" : { + "position" : "left", + "attrs" : { + "circle" : { + "r" : 4, + "fill" : "#ffffff", + "stroke" : "#1890ff" + } + } + } + }, + "types" : [ "in" ] + }, + "position" : { + "x" : 700, + "y" : 100 + } + }, + "config" : { + "name" : "结束节点", + "description" : "流程结束" + } + } ], + "edges" : [ { + "id" : "flow1", + "from" : "startEvent1", + "to" : "scriptTask1", + "name" : "开始到处理", + "config" : { + "type" : "sequence" + }, + "properties" : null + }, { + "id" : "flow2", + "from" : "scriptTask1", + "to" : "scriptTask2", + "name" : "处理到报告", + "config" : { + "type" : "sequence" + }, + "properties" : null + }, { + "id" : "flow3", + "from" : "scriptTask2", + "to" : "endEvent1", + "name" : "报告到结束", + "config" : { + "type" : "sequence" + }, + "properties" : null + } ] +}', + '{"formItems":[{"type":"input","label":"业务参数","name":"businessParam","required":true}]}', + '["complex","business","multi-task"]', + 'DRAFT', TRUE, 'http://www.flowable.org/test', + NOW(), NOW(), 1, 1, FALSE +); + + +-- -------------------------------------------------------------------------------------- +-- 初始化工作流节点定义数据 +-- -------------------------------------------------------------------------------------- +-- 初始化工作流节点定义数据 +INSERT INTO workflow_node_definition ( + node_type, node_code, node_name, description, category, + ui_variables, panel_variables_schema, local_variables_schema, + form_variables_schema, enabled, + create_time, create_by, update_time, update_by, version, deleted +) VALUES +-- 开始节点 +( + 'START_EVENT', 'START_EVENT', '开始节点', '工作流的起点', 'EVENT', + '{ + "shape": "circle", + "size": {"width": 40, "height": 40}, + "style": { + "fill": "#e8f7ff", + "stroke": "#1890ff", + "strokeWidth": 2, + "icon": "play-circle", + "iconColor": "#1890ff" + }, + "ports": { + "groups": { + "out": { + "position": "right", + "attrs": { + "circle": {"r": 4, "fill": "#ffffff", "stroke": "#1890ff"} + } + } + } + } + }', + '{ + "type": "object", + "properties": { + "code": {"type": "string", "title": "节点Code"}, + "name": {"type": "string", "title": "节点名称"}, + "description": {"type": "string", "title": "节点描述"} + }, + "required": ["code", "name"] + }', + '{}', + '{"formItems": []}', + 1, + NOW(), 'system', NOW(), 'system', 1, 0 +), +-- 结束节点 +( + 'END_EVENT', 'END_EVENT', '结束节点', '工作流的终点', 'EVENT', + '{ + "shape": "circle", + "size": {"width": 40, "height": 40}, + "style": { + "fill": "#fff1f0", + "stroke": "#ff4d4f", + "strokeWidth": 2, + "icon": "stop", + "iconColor": "#ff4d4f" + }, + "ports": { + "groups": { + "in": { + "position": "left", + "attrs": { + "circle": {"r": 4, "fill": "#ffffff", "stroke": "#1890ff"} + } + } + } + } + }', + '{ + "type": "object", + "properties": { + "code": {"type": "string", "title": "节点Code"}, + "name": {"type": "string", "title": "节点名称"}, + "description": {"type": "string", "title": "节点描述"} + }, + "required": ["code", "name"] + }', + '{}', + '{"formItems": []}', + 1, + NOW(), 'system', NOW(), 'system', 1, 0 +), +-- 脚本任务节点 +( + 'SCRIPT_TASK', 'SCRIPT_TASK', '脚本任务', '脚本执行任务', 'TASK', + '{ + "shape": "rect", + "size": {"width": 120, "height": 60}, + "style": { + "fill": "#ffffff", + "stroke": "#1890ff", + "strokeWidth": 2, + "icon": "code", + "iconColor": "#1890ff" + }, + "ports": { + "groups": { + "in": { + "position": "left", + "attrs": { + "circle": {"r": 4, "fill": "#ffffff", "stroke": "#1890ff"} + } + }, + "out": { + "position": "right", + "attrs": { + "circle": {"r": 4, "fill": "#ffffff", "stroke": "#1890ff"} + } + } + } + } + }', + '{ + "type": "object", + "properties": { + "code": {"type": "string", "title": "节点Code"}, + "name": {"type": "string", "title": "节点名称"}, + "description": {"type": "string", "title": "节点描述"}, + "script": { + "type": "string", + "title": "脚本内容", + "format": "textarea", + "description": "需要执行的脚本内容" + }, + "language": { + "type": "string", + "title": "脚本语言", + "default": "shell", + "enum": ["shell", "python", "javascript"], + "enumNames": ["Shell脚本", "Python脚本", "JavaScript脚本"] + }, + "interpreter": { + "type": "string", + "title": "解释器路径", + "description": "脚本解释器的路径,例如:/bin/bash" + }, + "workingDirectory": { + "type": "string", + "title": "工作目录", + "default": "/tmp" + }, + "delegate": { + "type": "string", + "title": "执行委派者", + "default": "${shellTaskDelegate}" + } + }, + "required": ["code", "name", "script", "language", "delegate"] + }', + '{ + "environment": {"type": "object", "additionalProperties": {"type": "string"}} + }', + '{"formItems": []}', + 1, + NOW(), 'system', NOW(), 'system', 1, 0 +); + +-- -------------------------------------------------------------------------------------- +-- 初始化项目管理数据 +-- -------------------------------------------------------------------------------------- + +-- 初始化项目组数据 +-- 注意:以下数据已注释,需要时请取消注释并修改为实际数据 +-- INSERT INTO deploy_project_group (id, create_by, create_time, tenant_code, type, project_group_code, project_group_name, project_group_desc, enabled, sort) +-- VALUES +-- (1, 'admin', NOW(), 'admin', 'PRODUCT', 'DEMO', '示例项目组', '用于演示的项目组', 1, 1), +-- (2, 'admin', NOW(), 'admin', 'PRODUCT', 'PLATFORM', '平台项目组', '平台相关的项目组', 1, 2); + +-- 初始化应用数据 +-- 注意:以下数据已注释,需要时请取消注释并修改为实际数据 +-- INSERT INTO deploy_application ( +-- id, create_by, create_time, +-- project_group_id, app_code, app_name, app_desc, enabled, +-- repo_url, repo_branch, repo_type, build_type, dev_language, dev_framework, sort +-- ) +-- VALUES +-- ( +-- 1, 'admin', NOW(), +-- 1, 'DEMO-APP', '示例应用', '用于演示的应用', 1, +-- 'https://github.com/demo/demo-app.git', 'main', 'GIT', 'MAVEN', 'JAVA', 'SPRING_BOOT', 1 +-- ), +-- ( +-- 2, 'admin', NOW(), +-- 1, 'DEMO-WEB', '示例前端', '用于演示的前端应用', 1, +-- 'https://github.com/demo/demo-web.git', 'main', 'GIT', 'NPM', 'NODEJS', 'VUE', 2 +-- ), +-- ( +-- 3, 'admin', NOW(), +-- 2, 'PLATFORM-API', '平台API', '平台后端服务', 1, +-- 'https://github.com/platform/platform-api.git', 'main', 'GIT', 'MAVEN', 'JAVA', 'SPRING_BOOT', 1 +-- ), +-- ( +-- 4, 'admin', NOW(), +-- 2, 'PLATFORM-WEB', '平台前端', '平台前端应用', 1, +-- 'https://github.com/platform/platform-web.git', 'main', 'GIT', 'NPM', 'NODEJS', 'VUE', 2 +-- ); + +-- -------------------------------------------------------------------------------------- +-- 初始化通知渠道数据 +-- -------------------------------------------------------------------------------------- + +-- 企业微信通知渠道示例 +INSERT INTO sys_notification_channel +(name, channel_type, config, status, description, create_by, create_time, update_by, update_time, version, deleted) +VALUES +('研发部企业微信群', 'WEWORK', + '{"webhookUrl":"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=example-key-please-replace"}', + 'DISABLED', + '研发部通知群,用于部署通知(示例数据,请修改为实际的Webhook地址)', + 'admin', NOW(), 'admin', NOW(), 0, 0); + +-- 飞书、邮件等其他渠道类型暂未启用,等后续开启相应枚举后再添加示例数据 +-- ('运维飞书告警群', 'FEISHU', +-- '{"webhookUrl":"https://open.feishu.cn/open-apis/bot/v2/hook/example-hook-id","secret":"example-secret"}', +-- 'DISABLED', +-- '运维团队告警通知(示例数据,请修改为实际配置)', +-- 'admin', NOW(), 'admin', NOW(), 0, 0), +-- +-- ('管理员邮件通知', 'EMAIL', +-- '{"smtpHost":"smtp.qq.com","smtpPort":465,"username":"notify@example.com","password":"example-password","fromEmail":"notify@example.com","ssl":true}', +-- 'DISABLED', +-- '管理员邮件通知渠道(示例数据,请修改为实际配置)', +-- 'admin', NOW(), 'admin', NOW(), 0, 0); diff --git a/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql b/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql new file mode 100644 index 00000000..99286eef --- /dev/null +++ b/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql @@ -0,0 +1,692 @@ +-- -------------------------------------------------------------------------------------- +-- 系统基础表 +-- -------------------------------------------------------------------------------------- + +-- 租户表 +CREATE TABLE sys_tenant ( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(50) NOT NULL COMMENT '租户编码', + name VARCHAR(100) NOT NULL COMMENT '租户名称', + address VARCHAR(255) NULL COMMENT '租户地址', + contact_name VARCHAR(50) NULL COMMENT '联系人姓名', + contact_phone VARCHAR(20) NULL COMMENT '联系人电话', + email VARCHAR(100) NULL COMMENT '联系人邮箱', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_tenant_code UNIQUE (code) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租户表'; + + +-- 部门表 +CREATE TABLE sys_department +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(50) NOT NULL COMMENT '部门编码', + name VARCHAR(100) NOT NULL COMMENT '部门名称', + description VARCHAR(255) NULL COMMENT '部门描述', + leader_id BIGINT NULL COMMENT '部门负责人ID', + leader_name VARCHAR(50) NULL COMMENT '部门负责人姓名', + parent_id BIGINT NULL COMMENT '父部门ID', + sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_department_code UNIQUE (code) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门表'; + +-- 用户表 +CREATE TABLE sys_user ( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + username VARCHAR(50) NOT NULL COMMENT '用户名', + password VARCHAR(255) NOT NULL COMMENT '密码', + nickname VARCHAR(50) NULL COMMENT '昵称', + email VARCHAR(100) NULL COMMENT '邮箱', + phone VARCHAR(20) NULL COMMENT '手机号', + department_id BIGINT NULL COMMENT '所属部门ID', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_user_username UNIQUE (username), + CONSTRAINT FK_user_department FOREIGN KEY (department_id) REFERENCES sys_department(id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'; + +-- 系统参数表 +CREATE TABLE sys_param +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(100) NOT NULL COMMENT '参数编码', + name VARCHAR(100) NOT NULL COMMENT '参数名称', + value TEXT COMMENT '参数值', + type VARCHAR(50) NOT NULL COMMENT '参数类型', + description VARCHAR(255) NULL COMMENT '参数描述', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_sys_param_code UNIQUE (code) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统参数表'; + +-- -------------------------------------------------------------------------------------- +-- 权限管理相关表 +-- -------------------------------------------------------------------------------------- + +-- 菜单表 +CREATE TABLE sys_menu +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + name VARCHAR(100) NOT NULL COMMENT '菜单名称', + path VARCHAR(200) NULL COMMENT '路由路径', + component VARCHAR(255) NULL COMMENT '组件路径', + icon VARCHAR(100) NULL COMMENT '菜单图标', + permission VARCHAR(100) NULL COMMENT '权限标识', + type TINYINT NOT NULL COMMENT '菜单类型(1:目录 2:菜单 3:按钮)', + parent_id BIGINT NULL COMMENT '父菜单ID', + sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', + hidden BIT NOT NULL DEFAULT 0 COMMENT '是否隐藏(0:显示,1:隐藏)', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + INDEX IDX_parent_id (parent_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='菜单表'; + +-- 角色表 +CREATE TABLE sys_role +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(100) NOT NULL COMMENT '角色编码', + name VARCHAR(100) NOT NULL COMMENT '角色名称', + type TINYINT NOT NULL DEFAULT 2 COMMENT '角色类型(1:系统角色,2:自定义角色)', + description VARCHAR(255) NULL COMMENT '角色描述', + sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', + + CONSTRAINT UK_role_code UNIQUE (code) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表'; + +-- 角色标签表 +CREATE TABLE sys_role_tag +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + name VARCHAR(50) NOT NULL COMMENT '标签名称', + color VARCHAR(20) NULL COMMENT '标签颜色' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色标签表'; + +-- 角色标签关联表 +CREATE TABLE sys_role_tag_relation +( + role_id BIGINT NOT NULL COMMENT '角色ID', + tag_id BIGINT NOT NULL COMMENT '标签ID', + + PRIMARY KEY (role_id, tag_id), + CONSTRAINT FK_role_tag_role FOREIGN KEY (role_id) REFERENCES sys_role (id), + CONSTRAINT FK_role_tag_tag FOREIGN KEY (tag_id) REFERENCES sys_role_tag (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色标签关联表'; + +-- 用户角色关联表 +CREATE TABLE sys_user_role +( + + user_id BIGINT NOT NULL COMMENT '用户ID', + role_id BIGINT NOT NULL COMMENT '角色ID', + + CONSTRAINT UK_user_role UNIQUE (user_id, role_id), + CONSTRAINT FK_user_role_user FOREIGN KEY (user_id) REFERENCES sys_user (id), + CONSTRAINT FK_user_role_role FOREIGN KEY (role_id) REFERENCES sys_role (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表'; + +-- 角色菜单关联表 +CREATE TABLE sys_role_menu +( + role_id BIGINT NOT NULL COMMENT '角色ID', + menu_id BIGINT NOT NULL COMMENT '菜单ID', + + PRIMARY KEY (role_id, menu_id), + CONSTRAINT FK_role_menu_role FOREIGN KEY (role_id) REFERENCES sys_role (id), + CONSTRAINT FK_role_menu_menu FOREIGN KEY (menu_id) REFERENCES sys_menu (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色菜单关联表'; + +-- 权限模板表 +CREATE TABLE sys_permission_template +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(100) NOT NULL COMMENT '模板编码', + name VARCHAR(100) NOT NULL COMMENT '模板名称', + type TINYINT NOT NULL DEFAULT 1 COMMENT '模板类型(1:系统模板,2:自定义模板)', + description VARCHAR(255) NULL COMMENT '模板描述', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_template_code UNIQUE (code) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限模板表'; + +-- 模板菜单关联表 +CREATE TABLE sys_template_menu +( + template_id BIGINT NOT NULL COMMENT '模板ID', + menu_id BIGINT NOT NULL COMMENT '菜单ID', + + PRIMARY KEY (template_id, menu_id), + CONSTRAINT FK_template_menu_template FOREIGN KEY (template_id) REFERENCES sys_permission_template (id), + CONSTRAINT FK_template_menu_menu FOREIGN KEY (menu_id) REFERENCES sys_menu (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='模板菜单关联表'; + +-- 权限表 +CREATE TABLE sys_permission +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + menu_id BIGINT NOT NULL COMMENT '关联的菜单ID', + code VARCHAR(100) NOT NULL COMMENT '权限编码', + name VARCHAR(100) NOT NULL COMMENT '权限名称', + type VARCHAR(50) NOT NULL DEFAULT 'FUNCTION' COMMENT '权限类型(MENU:菜单,FUNCTION:功能,API:接口)', + sort INT NULL DEFAULT 0 COMMENT '排序', + + CONSTRAINT UK_permission_code UNIQUE (code), + CONSTRAINT FK_permission_menu FOREIGN KEY (menu_id) REFERENCES sys_menu (id), + INDEX IDX_menu_id (menu_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统权限表'; + +-- -------------------------------------------------------------------------------------- +-- 外部系统集成相关表 +-- -------------------------------------------------------------------------------------- + +-- 外部系统表 +CREATE TABLE sys_external_system +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + name VARCHAR(100) NOT NULL COMMENT '系统名称', + type VARCHAR(50) NOT NULL COMMENT '系统类型(JENKINS/GIT/ZENTAO等)', + url VARCHAR(255) NOT NULL COMMENT '系统访问地址', + remark TEXT NULL COMMENT '备注说明', + sort INT NULL DEFAULT 0 COMMENT '排序', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + auth_type VARCHAR(50) NOT NULL COMMENT '认证方式(BASIC/TOKEN/OAUTH等)', + username VARCHAR(100) NULL COMMENT '用户名', + password VARCHAR(255) NULL COMMENT '密码', + token VARCHAR(255) NULL COMMENT '访问令牌', + sync_status VARCHAR(50) NULL COMMENT '同步状态(SUCCESS/FAILED/RUNNING)', + last_sync_time DATETIME(6) NULL COMMENT '最后同步时间', + last_connect_time DATETIME(6) NULL COMMENT '最近连接成功时间', + config JSON NULL COMMENT '系统特有配置', + + CONSTRAINT UK_external_system_name UNIQUE (name), + CONSTRAINT UK_external_system_type_url UNIQUE (type, url) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='外部系统表'; + +-- 代码仓库组表 + +CREATE TABLE deploy_repo_group +( + -- 基础字段 + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + -- 业务字段 + name VARCHAR(100) NOT NULL COMMENT '仓库组名', + description VARCHAR(500) NULL COMMENT '仓库组描述', + parent_id BIGINT NULL COMMENT '父级仓库组ID', + full_name VARCHAR(255) NULL COMMENT '完整名称(包含层级关系)', + full_path VARCHAR(255) NULL COMMENT '完整路径', + path VARCHAR(200) NOT NULL COMMENT '仓库组路径', + external_system_id BIGINT NOT NULL COMMENT '外部系统ID', + avatar_url VARCHAR(255) NULL COMMENT '头像URL', + web_url VARCHAR(255) NULL COMMENT '网页URL', + visibility ENUM('private', 'internal', 'public') NOT NULL DEFAULT 'private' COMMENT '可见性:private-私有,internal-内部,public-公开', + sort INT DEFAULT 0 COMMENT '排序号', + repo_group_id BIGINT NOT NULL COMMENT 'Git系统中的组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-已删除' + +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='代码仓库组表'; + +-- 代码仓库项目表 +CREATE TABLE deploy_repo_project +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + + name VARCHAR(255) NOT NULL COMMENT '项目名称', + path VARCHAR(255) NOT NULL COMMENT '项目路径', + description TEXT NULL COMMENT '项目描述', + visibility VARCHAR(50) NULL COMMENT '可见性', + default_branch VARCHAR(100) NULL COMMENT '默认分支', + web_url VARCHAR(500) NULL COMMENT 'Web URL', + ssh_url VARCHAR(500) NULL COMMENT 'SSH URL', + http_url VARCHAR(500) NULL COMMENT 'HTTP URL', + last_activity_at DATETIME(6) NULL COMMENT '最后活动时间', + name_with_namespace VARCHAR(500) NULL COMMENT '带命名空间的名称', + path_with_namespace VARCHAR(500) NULL COMMENT '带命名空间的路径', + created_at DATETIME(6) NULL COMMENT '创建时间', + + external_system_id BIGINT NOT NULL COMMENT '外部系统ID', + repo_group_id BIGINT NOT NULL COMMENT '项目ID', + repo_project_id BIGINT NOT NULL COMMENT '项目ID', + + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + CONSTRAINT FK_repo_project_external_system FOREIGN KEY (external_system_id) REFERENCES sys_external_system (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Git仓库项目表'; + +-- 代码仓库分支表 +CREATE TABLE deploy_repo_branch +( + -- 基础字段 + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + -- 业务字段 + name VARCHAR(100) NOT NULL COMMENT '分支名称', + is_default_branch BIT DEFAULT 0 COMMENT '是否为默认分支:0-否,1-是', + can_push BIT DEFAULT 1 COMMENT '是否可推送:0-否,1-是', + developers_can_push BIT DEFAULT 1 COMMENT '开发者是否可推送:0-否,1-是', + developers_can_merge BIT DEFAULT 1 COMMENT '开发者是否可合并:0-否,1-是', + last_commit_id VARCHAR(64) NULL COMMENT '最新提交ID', + commit_message TEXT NULL COMMENT '最新提交信息', + commit_author VARCHAR(100) NULL COMMENT '最新提交作者', + commit_date DATETIME(6) NULL COMMENT '最新提交时间', + last_update_time DATETIME(6) NULL COMMENT '分支最后更新时间', + last_commit_time DATETIME(6) NULL COMMENT '分支最后提交时间', + web_url VARCHAR(255) NULL COMMENT '网页URL', + project_id BIGINT NOT NULL COMMENT '所属项目ID', + external_system_id BIGINT NOT NULL COMMENT '外部系统ID', + repo_project_id BIGINT NOT NULL COMMENT 'GitLab的真实project_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-已删除' + +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='代码仓库分支表'; + +-- -------------------------------------------------------------------------------------- +-- 工作流相关表 +-- -------------------------------------------------------------------------------------- + +-- 工作流定义表 +CREATE TABLE workflow_definition +( + -- 主键 + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + + -- 基础信息 + name VARCHAR(255) NOT NULL COMMENT '流程名称', + `key` VARCHAR(255) NOT NULL COMMENT '流程标识', + category VARCHAR(100) COMMENT '流程分类', + triggers VARCHAR(200) COMMENT '流程分类', + process_definition_id VARCHAR(100) NULL COMMENT '工作流定义ID', + flow_version INT NOT NULL COMMENT '流程版本', + description TEXT COMMENT '流程描述', + + -- 流程配置 + bpmn_xml TEXT COMMENT 'BPMN XML内容', + graph JSON COMMENT '流程图数据,包含节点和连线的位置、样式等信息', + local_variables_schema JSON COMMENT '节点变量Schema', + tags JSON COMMENT '流程标签', + + -- 流程属性 + status VARCHAR(50) NOT NULL COMMENT '流程状态(DRAFT-草稿、PUBLISHED-已发布、DISABLED-已禁用)', + is_executable BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否可执行', + target_namespace VARCHAR(255) DEFAULT 'http://www.flowable.org/test' COMMENT '目标命名空间', + + -- 审计字段 + created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间', + updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间', + created_by BIGINT COMMENT '创建人', + updated_by BIGINT COMMENT '更新人', + is_deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否删除', + + -- 约束 + UNIQUE KEY uk_key_version (`key`, flow_version) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_unicode_ci COMMENT ='工作流定义表'; + +-- 创建工作流节点定义表 +CREATE TABLE workflow_node_definition +( + id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + node_type VARCHAR(50) NOT NULL COMMENT '节点类型', + node_code VARCHAR(50) NOT NULL COMMENT '节点编码', + node_name VARCHAR(100) NOT NULL COMMENT '节点名称', + description VARCHAR(500) COMMENT '节点描述', + category VARCHAR(50) COMMENT '节点分类', + ui_variables JSON NOT NULL COMMENT '节点UI', + panel_variables_schema JSON NOT NULL COMMENT '节点属性', + local_variables_schema JSON NOT NULL COMMENT '节点环境变量', + form_variables_schema JSON COMMENT '节点表单', + enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用', + + create_time DATETIME NOT NULL COMMENT '创建时间', + create_by VARCHAR(50) NOT NULL COMMENT '创建人', + update_time DATETIME NOT NULL COMMENT '更新时间', + update_by VARCHAR(50) NOT NULL COMMENT '更新人', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY (id), + UNIQUE KEY uk_node_type (node_type) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_unicode_ci COMMENT ='工作流节点定义表'; + +-- 工作流实例表 +CREATE TABLE workflow_instance +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + process_instance_id VARCHAR(64) NOT NULL COMMENT '流程实例ID', + process_definition_id VARCHAR(64) NOT NULL COMMENT '流程定义ID', + workflow_definition_id BIGINT NOT NULL COMMENT '工作流定义ID', + business_key VARCHAR(64) NULL COMMENT '业务标识', + status VARCHAR(100) NOT NULL COMMENT '实例状态', + variables TEXT NULL COMMENT '流程变量(JSON)', + start_time DATETIME(6) NULL COMMENT '开始时间', + end_time DATETIME(6) NULL COMMENT '结束时间' + +-- CONSTRAINT FK_workflow_instance_definition FOREIGN KEY (process_definition_id) REFERENCES workflow_definition(id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流实例表'; + +-- 工作流节点实例表 +CREATE TABLE workflow_node_instance +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + workflow_definition_id BIGINT NOT NULL COMMENT '工作流定义ID', + workflow_instance_id BIGINT NOT NULL COMMENT '工作流实例ID', + process_instance_id VARCHAR(64) NOT NULL COMMENT '流程实例ID', + execution_id VARCHAR(100) NOT NULL COMMENT '执行实例ID', + node_id VARCHAR(64) NOT NULL COMMENT '节点ID', + node_name VARCHAR(100) NOT NULL COMMENT '节点名称', + node_type VARCHAR(32) NOT NULL COMMENT '节点类型', + status VARCHAR(32) NOT NULL COMMENT '节点状态', + start_time DATETIME(6) NULL COMMENT '开始时间', + end_time DATETIME(6) NULL COMMENT '结束时间', + variables TEXT NULL COMMENT '节点变量(JSON)', + error_message TEXT NULL COMMENT '错误信息', + + CONSTRAINT FK_workflow_node_instance_instance FOREIGN KEY (workflow_instance_id) REFERENCES workflow_instance (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流节点实例表'; + +-- 工作流日志表 +CREATE TABLE workflow_log +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + workflow_instance_id BIGINT NULL COMMENT '工作流实例ID', + node_instance_id BIGINT NULL COMMENT '节点实例ID', + log_type VARCHAR(32) NOT NULL COMMENT '日志类型', + log_level VARCHAR(32) NOT NULL COMMENT '日志级别', + content TEXT NOT NULL COMMENT '日志内容', + + CONSTRAINT FK_workflow_log_instance FOREIGN KEY (workflow_instance_id) REFERENCES workflow_instance (id), + 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_group +( + -- 基础字段 + 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_code VARCHAR(50) DEFAULT NULL COMMENT '租户CODE', + type VARCHAR(50) NULL COMMENT '项目组类型', + project_group_code VARCHAR(50) NOT NULL COMMENT '项目组编码', + project_group_name VARCHAR(100) NOT NULL COMMENT '项目组名称', + project_group_desc VARCHAR(255) NULL COMMENT '项目组描述', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + sort INT NOT NULL DEFAULT 0 COMMENT '排序号' +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_unicode_ci COMMENT ='项目组表'; + +-- 应用表 +CREATE TABLE deploy_application +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + -- 业务字段 + app_code VARCHAR(50) NOT NULL COMMENT '应用编码', + app_name VARCHAR(100) NOT NULL COMMENT '应用名称', + app_desc VARCHAR(255) NULL COMMENT '应用描述', + language VARCHAR(50) NULL COMMENT '开发语言:JAVA、PYTHON、NODEJS', + repo_group_id BIGINT NOT NULL COMMENT '代码仓库项目ID', + repo_project_id BIGINT NOT NULL COMMENT '代码仓库项目ID', + project_group_id BIGINT NOT NULL COMMENT '所属项目组ID', + external_system_id BIGINT NOT NULL COMMENT '外部系统ID', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + sort INT NOT NULL DEFAULT 0 COMMENT '排序号', + -- 基础字段 + 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-已删除', + + -- 索引 + INDEX idx_project_group_id (project_group_id) COMMENT '项目ID索引', + UNIQUE INDEX uk_app_code (project_group_id, app_code) COMMENT '项目下应用编码唯一', + + -- 外键约束 + CONSTRAINT fk_application_project_group FOREIGN KEY (project_group_id) REFERENCES deploy_project_group (id) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_unicode_ci COMMENT ='应用表'; + +-- 环境表 +CREATE TABLE deploy_environment +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + -- 业务字段 + tenant_code VARCHAR(50) DEFAULT NULL COMMENT '租户编码', + env_code VARCHAR(50) NOT NULL COMMENT '环境编码', + env_name VARCHAR(100) NOT NULL COMMENT '环境名称', + env_desc VARCHAR(255) NULL COMMENT '环境描述', + build_type VARCHAR(100) NULL COMMENT '构建类型:JENKINS-Jenkins构建,GITLAB_RUNNER-GitLab Runner构建,GITHUB_ACTION-GitHub Action构建', + deploy_type VARCHAR(100) NULL COMMENT '部署方式:K8S-Kubernetes集群部署, DOCKER-Docker容器部署, VM-虚拟机部署', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + sort INT NOT NULL DEFAULT 0 COMMENT '排序号', + + -- 基础字段 + 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 '是否删除', + + -- 索引 + UNIQUE INDEX uk_env_code (env_code) COMMENT '环境编码唯一' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='环境表'; + +-- 项目环境关联表 +CREATE TABLE deploy_project_group_environment +( + -- 业务字段 + project_group_id BIGINT NOT NULL COMMENT '项目ID', + environment_id BIGINT NOT NULL COMMENT '环境ID', + + -- 基础字段 + 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 '是否删除', + + -- 索引 + UNIQUE INDEX uk_project_group_environment (project_group_id, environment_id) COMMENT '项目组环境关联唯一', + + -- 外键约束 + CONSTRAINT fk_project_env_project FOREIGN KEY (project_group_id) + REFERENCES deploy_project_group (id), + CONSTRAINT fk_project_env_environment FOREIGN KEY (environment_id) + REFERENCES deploy_environment (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目组环境关联表'; + + +CREATE TABLE deploy_log +( + -- 基础字段 + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + -- 业务字段 + workflow_instance_id BIGINT NULL COMMENT '工作流实例ID', + environment_id BIGINT NOT NULL COMMENT '环境ID', + application_id BIGINT NOT NULL COMMENT '应用ID', + deploy_version VARCHAR(100) NOT NULL COMMENT '部署版本号', + form_variables TEXT NULL COMMENT '部署参数(JSON)', + deploy_variables TEXT NULL COMMENT '部署参数(JSON)', + + 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-已删除' +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='部署日志表'; + + +CREATE TABLE deploy_app_config +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + + build_type VARCHAR(50) NOT NULL, + build_variables TEXT NOT NULL, + form_variables_schema TEXT NULL, + language_type VARCHAR(50) NOT NULL, + workflow_definition_id BIGINT NOT NULL, + + environment_id BIGINT NOT NULL, + application_id BIGINT NOT NULL, + enabled BIT NOT NULL, + + 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-已删除' +); + +-- -------------------------------------------------------------------------------------- +-- 通知渠道表 +-- -------------------------------------------------------------------------------------- + +-- 通知渠道配置表 +CREATE TABLE sys_notification_channel ( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + name VARCHAR(100) NOT NULL COMMENT '渠道名称(如:研发部企业微信群)', + channel_type VARCHAR(50) NOT NULL COMMENT '渠道类型(WEWORK, FEISHU, DINGTALK, SMS, EMAIL, SLACK)', + config JSON NOT NULL COMMENT '渠道配置(JSON格式,不同渠道存储不同字段)', + status VARCHAR(20) NOT NULL DEFAULT 'ENABLED' COMMENT '状态(ENABLED-启用, DISABLED-禁用)', + description VARCHAR(500) NULL COMMENT '描述说明', + + INDEX idx_channel_type (channel_type), + INDEX idx_status (status), + INDEX idx_deleted (deleted) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知渠道配置表'; + diff --git a/backend/src/main/resources/db/changelog/db.changelog-master.yaml b/backend/src/main/resources/db/changelog/db.changelog-master.yaml new file mode 100644 index 00000000..1ae21255 --- /dev/null +++ b/backend/src/main/resources/db/changelog/db.changelog-master.yaml @@ -0,0 +1,30 @@ +databaseChangeLog: + - changeSet: + id: v1.0.0-schema + author: qqchen + runOnChange: false + failOnError: true + comment: "初始化数据库表结构" + sqlFile: + path: db/changelog/changes/v1.0.0-schema.sql + stripComments: false + splitStatements: true + endDelimiter: ";" + rollback: + - empty + + - changeSet: + id: v1.0.0-data + author: qqchen + runOnChange: false + failOnError: true + comment: "初始化基础数据" + context: "!test" + sqlFile: + path: db/changelog/changes/v1.0.0-data.sql + stripComments: false + splitStatements: true + endDelimiter: ";" + rollback: + - empty + diff --git a/backend/src/main/resources/messages_zh_CN.properties b/backend/src/main/resources/messages_zh_CN.properties index 36949c3c..6d66560a 100644 --- a/backend/src/main/resources/messages_zh_CN.properties +++ b/backend/src/main/resources/messages_zh_CN.properties @@ -132,4 +132,11 @@ workflow.dependency.not.satisfied=工作流依赖条件未满足 workflow.circular.dependency=工作流存在循环依赖 workflow.schedule.invalid=工作流调度配置无效 workflow.concurrent.limit.exceeded=工作流并发限制超出 -workflow.config.error=工作流配置错误:{0} \ No newline at end of file +workflow.config.error=工作流配置错误:{0} + +# 通知渠道相关错误码 (5000-5099) +notification.channel.not.found=通知渠道不存在 +notification.channel.name.exists=通知渠道名称已存在 +notification.channel.disabled=通知渠道已禁用 +notification.channel.connection.failed=通知渠道连接测试失败 +notification.send.failed=消息发送失败:{0} \ No newline at end of file