添加通知管理功能

This commit is contained in:
dengqichen 2025-10-22 16:28:43 +08:00
parent ff88de9aa8
commit 541a7f821a
20 changed files with 2174 additions and 18 deletions

View File

@ -174,13 +174,10 @@
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>
<!-- Liquibase -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>

View File

@ -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<NotificationChannel, NotificationChannelDTO, Long, NotificationChannelQuery> {
@Resource
private INotificationChannelService notificationChannelService;
@Operation(summary = "获取所有渠道类型")
@GetMapping("/types")
public Response<List<Map<String, Object>>> getChannelTypes() {
List<Map<String, Object>> types = Arrays.stream(NotificationChannelTypeEnum.values())
.map(type -> {
Map<String, Object> 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<Boolean> 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<Void> enable(
@Parameter(description = "渠道ID", required = true) @PathVariable Long id
) {
notificationChannelService.enable(id);
return Response.success();
}
@Operation(summary = "禁用通知渠道")
@PostMapping("/{id}/disable")
public Response<Void> disable(
@Parameter(description = "渠道ID", required = true) @PathVariable Long id
) {
notificationChannelService.disable(id);
return Response.success();
}
@Override
protected void exportData(HttpServletResponse response, List<NotificationChannelDTO> data) {
// TODO: 实现导出功能
}
}

View File

@ -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<NotificationChannel, NotificationChannelDTO> {
}

View File

@ -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<String, Object> config;
@Schema(description = "状态", example = "ENABLED")
private NotificationChannelStatusEnum status;
@Schema(description = "描述", example = "研发部通知群,用于部署通知")
private String description;
}

View File

@ -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;
}

View File

@ -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<Long> {
/**
* 渠道名称
*/
@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<String, Object> config;
/**
* 状态
*/
@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 20)
private NotificationChannelStatusEnum status = NotificationChannelStatusEnum.ENABLED;
/**
* 描述
*/
@Column(length = 500)
private String description;
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<NotificationChannel, Long> {
/**
* 根据名称和删除标记查询是否存在
*
* @param name 渠道名称
* @return 是否存在
*/
boolean existsByNameAndDeletedFalse(String name);
/**
* 根据渠道类型和状态查询渠道列表
*
* @param channelType 渠道类型
* @param status 状态
* @return 渠道列表
*/
List<NotificationChannel> findByChannelTypeAndStatusAndDeletedFalse(
NotificationChannelTypeEnum channelType,
NotificationChannelStatusEnum status
);
/**
* 根据状态查询渠道列表
*
* @param status 状态
* @return 渠道列表
*/
List<NotificationChannel> findByStatusAndDeletedFalse(NotificationChannelStatusEnum status);
}

View File

@ -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<NotificationChannel, NotificationChannelDTO, NotificationChannelQuery, Long> {
/**
* 测试通知渠道连接
*
* @param id 渠道ID
* @return 测试结果
*/
boolean testConnection(Long id);
/**
* 启用渠道
*
* @param id 渠道ID
*/
void enable(Long id);
/**
* 禁用渠道
*
* @param id 渠道ID
*/
void disable(Long id);
}

View File

@ -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<NotificationChannel, NotificationChannelDTO, NotificationChannelQuery, Long>
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());
}
}

View File

@ -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<String> enums;
private Object example;

View File

@ -96,8 +96,8 @@ public enum NodeTypeEnums {
NodeCategoryEnums.GATEWAY,
"条件分支控制"
),
NOTIFICATION_NODE(
"NOTIFICATION_NODE",
NOTIFICATION(
"NOTIFICATION",
"通知节点",
NotificationNodeLocalVariables.class,
NotificationNodePanelVariables.class,

View File

@ -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

View File

@ -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='通知渠道配置表';

View File

@ -802,3 +802,29 @@ INSERT INTO workflow_node_definition (
# 2, 'PLATFORM-WEB', '平台前端', '平台前端应用', 'ENABLED',
# '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);

View File

@ -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);

View File

@ -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='通知渠道配置表';

View File

@ -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

View File

@ -133,3 +133,10 @@ workflow.circular.dependency=工作流存在循环依赖
workflow.schedule.invalid=工作流调度配置无效
workflow.concurrent.limit.exceeded=工作流并发限制超出
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}