动态路由

This commit is contained in:
dengqichen 2025-10-31 15:50:51 +08:00
parent 8a9c7113e9
commit 99cc4f3e7e
18 changed files with 22 additions and 727 deletions

View File

@ -1,55 +0,0 @@
package com.qqchen.deploy.backend.deploy.api;
import com.qqchen.deploy.backend.deploy.dto.BuildConfigDefinedDTO;
import com.qqchen.deploy.backend.deploy.dto.DeployAppBuildDTO;
import com.qqchen.deploy.backend.deploy.dto.DeployAppConfigDTO;
import com.qqchen.deploy.backend.deploy.entity.DeployAppConfig;
import com.qqchen.deploy.backend.deploy.query.DeployAppConfigQuery;
import com.qqchen.deploy.backend.deploy.service.IDeployAppConfigService;
import com.qqchen.deploy.backend.framework.api.Response;
import com.qqchen.deploy.backend.framework.controller.BaseController;
import io.swagger.v3.oas.annotations.Operation;
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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 应用配置控制器
*/
@Slf4j
@RestController
@RequestMapping("/api/v1/deploy-app-config")
@Tag(name = "应用配置管理", description = "应用配置管理相关接口")
public class DeployAppConfigApiController extends BaseController<DeployAppConfig, DeployAppConfigDTO, Long, DeployAppConfigQuery> {
@Resource
private IDeployAppConfigService deployAppConfigService;
@Operation(summary = "获取构建类型Schema定义")
@GetMapping("/defined")
public Response<List<BuildConfigDefinedDTO>> defined() {
return Response.success(deployAppConfigService.defined());
}
@Override
protected void exportData(HttpServletResponse response, List<DeployAppConfigDTO> data) {
}
@Operation(summary = "部署服务")
@PostMapping("/deploy")
public Response<Void> deploy(@Validated @RequestBody DeployAppBuildDTO dto) {
deployAppConfigService.deploy(dto);
return Response.success();
}
}

View File

@ -1,29 +0,0 @@
package com.qqchen.deploy.backend.deploy.api;
import com.qqchen.deploy.backend.framework.controller.BaseController;
import com.qqchen.deploy.backend.deploy.entity.DeployLog;
import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO;
import com.qqchen.deploy.backend.deploy.query.DeployLogQuery;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 部署日志 Controller
*/
@Slf4j
@RestController
@RequestMapping("/api/v1/deploy-log")
@Tag(name = "部署日志管理", description = "部署日志管理相关接口")
public class DeployLogApiController extends BaseController<DeployLog, DeployLogDTO, Long, DeployLogQuery> {
@Override
protected void exportData(HttpServletResponse response, List<DeployLogDTO> data) {
// TODO: 实现导出逻辑
log.info("导出部署日志数据,数据量:{}", data.size());
}
}

View File

@ -1,20 +0,0 @@
package com.qqchen.deploy.backend.deploy.converter;
import com.qqchen.deploy.backend.deploy.dto.DeployAppConfigDTO;
import com.qqchen.deploy.backend.deploy.entity.DeployAppConfig;
import com.qqchen.deploy.backend.framework.converter.BaseConverter;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.NullValuePropertyMappingStrategy;
/**
* 应用配置转换器
*/
@Mapper(config = BaseConverter.class, nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface DeployAppConfigConverter extends BaseConverter<DeployAppConfig, DeployAppConfigDTO> {
@Override
@Mapping(target = "formVariablesSchema", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void updateEntity(@MappingTarget DeployAppConfig entity, DeployAppConfigDTO dto);
}

View File

@ -1,13 +0,0 @@
package com.qqchen.deploy.backend.deploy.converter;
import com.qqchen.deploy.backend.framework.converter.BaseConverter;
import com.qqchen.deploy.backend.deploy.entity.DeployLog;
import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO;
import org.mapstruct.Mapper;
/**
* 部署日志 Converter
*/
@Mapper(config = BaseConverter.class)
public interface DeployLogConverter extends BaseConverter<DeployLog, DeployLogDTO> {
}

View File

@ -1,67 +0,0 @@
package com.qqchen.deploy.backend.deploy.dto;
import com.fasterxml.jackson.databind.JsonNode;
import com.qqchen.deploy.backend.deploy.enums.BuildTypeEnum;
import com.qqchen.deploy.backend.deploy.enums.DevelopmentLanguageTypeEnum;
import com.qqchen.deploy.backend.framework.dto.BaseDTO;
import com.qqchen.deploy.backend.workflow.dto.WorkflowDefinitionDTO;
import com.qqchen.deploy.backend.workflow.enums.WorkflowInstanceStatusEnums;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 应用配置DTO
*/
@Data
@Schema(description = "应用配置")
@EqualsAndHashCode(callSuper = true)
public class DeployAppConfigDTO extends BaseDTO {
@Schema(description = "应用")
private ApplicationDTO application;
@Schema(description = "构建类型")
@NotNull(message = "构建类型不能为空")
private BuildTypeEnum buildType;
@NotNull(message = "应用语言不能为空")
private DevelopmentLanguageTypeEnum languageType;
@Schema(description = "已发布的流程定义")
private WorkflowDefinitionDTO publishedWorkflowDefinition;
@Schema(description = "最后一次部署状态")
private WorkflowInstanceStatusEnums lastBuildStatus;
@Schema(description = "最后一次部署开始时间")
private LocalDateTime lastBuildStartTime;
@Schema(description = "最后一次部署结束时间")
private LocalDateTime LastBuildEndTime;
@Schema(description = "表单配置")
private JsonNode formVariablesSchema;
@Schema(description = "构建配置")
@NotNull(message = "构建配置不能为空")
private JsonNode buildVariables;
@Schema(description = "环境ID")
@NotNull(message = "环境ID不能为空")
private Long environmentId;
@Schema(description = "应用ID")
@NotNull(message = "应用ID不能为空")
private Long applicationId;
@NotNull(message = "已发布的流程定义ID")
private Long workflowDefinitionId;
@NotNull(message = "启用字段不能为空")
private Boolean enabled = true;
}

View File

@ -1,49 +0,0 @@
package com.qqchen.deploy.backend.deploy.dto;
import com.fasterxml.jackson.databind.JsonNode;
import com.qqchen.deploy.backend.deploy.enums.DeployStatusEnum;
import com.qqchen.deploy.backend.framework.dto.BaseDTO;
import com.vladmihalcea.hibernate.type.json.JsonType;
import jakarta.persistence.Column;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
import java.time.LocalDateTime;
/**
* 部署日志 DTO
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DeployLogDTO extends BaseDTO {
/**
* 环境ID
*/
private Long workflowInstanceId;
/**
* 环境ID
*/
private Long environmentId;
/**
* 应用ID
*/
private Long applicationId;
/**
* 部署版本号
*/
private String deployVersion;
private JsonNode variables;
private JsonNode formVariables;
/**
* 部署参数(JSON)
*/
private JsonNode deployVariables;
}

View File

@ -1,51 +0,0 @@
package com.qqchen.deploy.backend.deploy.entity;
import com.fasterxml.jackson.databind.JsonNode;
import com.qqchen.deploy.backend.deploy.enums.BuildTypeEnum;
import com.qqchen.deploy.backend.deploy.enums.DevelopmentLanguageTypeEnum;
import com.qqchen.deploy.backend.framework.annotation.LogicDelete;
import com.qqchen.deploy.backend.framework.domain.Entity;
import com.vladmihalcea.hibernate.type.json.JsonType;
import jakarta.persistence.Column;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Table;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
@Data
@EqualsAndHashCode(callSuper = true)
@jakarta.persistence.Entity
@Table(name = "deploy_app_config")
public class DeployAppConfig extends Entity<Long> {
@Column(name = "build_type", nullable = false)
@Enumerated(EnumType.STRING)
private BuildTypeEnum buildType;
@Column(name = "language_type", nullable = false)
@Enumerated(EnumType.STRING)
private DevelopmentLanguageTypeEnum languageType;
@Type(JsonType.class)
@Column(name = "form_variables_schema", columnDefinition = "text")
private JsonNode formVariablesSchema;
@Type(JsonType.class)
@Column(name = "build_variables", columnDefinition = "text", nullable = false)
private JsonNode buildVariables;
@Column(name = "environment_id", nullable = false)
private Long environmentId;
@Column(name = "application_id", nullable = false)
private Long applicationId;
@Column(name = "workflow_definition_id", nullable = false)
private Long workflowDefinitionId;
@Column(name = "enabled", nullable = false)
private Boolean enabled;
}

View File

@ -1,59 +0,0 @@
package com.qqchen.deploy.backend.deploy.entity;
import com.fasterxml.jackson.databind.JsonNode;
import com.qqchen.deploy.backend.deploy.enums.DeployStatusEnum;
import com.qqchen.deploy.backend.framework.domain.Entity;
import com.vladmihalcea.hibernate.type.json.JsonType;
import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
import java.time.LocalDateTime;
/**
* 部署日志实体
*/
@Data
@EqualsAndHashCode(callSuper = true)
@jakarta.persistence.Entity
@Table(name = "deploy_log")
public class DeployLog extends Entity<Long> {
/**
* 环境ID
*/
@Column(name = "workflow_instance_id", nullable = false)
private Long workflowInstanceId;
/**
* 环境ID
*/
@Column(name = "environment_id", nullable = false)
private Long environmentId;
/**
* 应用ID
*/
@Column(name = "application_id", nullable = false)
private Long applicationId;
/**
* 部署版本号
*/
@Column(name = "deploy_version", nullable = false)
private String deployVersion;
@Type(JsonType.class)
@Column(name = "form_variables", columnDefinition = "text", nullable = false)
private JsonNode formVariables;
/**
* 部署参数(JSON)
*/
@Type(JsonType.class)
@Column(name = "deploy_variables", columnDefinition = "text", nullable = false)
private JsonNode deployVariables;
}

View File

@ -1,34 +0,0 @@
package com.qqchen.deploy.backend.deploy.query;
import com.qqchen.deploy.backend.deploy.enums.BuildTypeEnum;
import com.qqchen.deploy.backend.deploy.enums.DevelopmentLanguageTypeEnum;
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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 应用配置查询对象
*/
@Data
@Schema(description = "应用配置查询")
@EqualsAndHashCode(callSuper = true)
public class DeployAppConfigQuery extends BaseQuery {
@Schema(description = "环境ID")
@QueryField(field = "environmentId")
private Long environmentId;
@Schema(description = "应用ID")
@QueryField(field = "applicationId")
private Long applicationId;
@Schema(description = "构建类型")
@QueryField(field = "buildType")
private BuildTypeEnum buildType;
@QueryField(field = "languageType", type = QueryType.EQUAL)
private DevelopmentLanguageTypeEnum languageType;
}

View File

@ -1,18 +0,0 @@
package com.qqchen.deploy.backend.deploy.query;
import com.qqchen.deploy.backend.framework.annotation.QueryField;
import com.qqchen.deploy.backend.framework.enums.QueryType;
import com.qqchen.deploy.backend.framework.query.BaseQuery;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 部署日志查询对象
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DeployLogQuery extends BaseQuery {
}

View File

@ -1,13 +0,0 @@
package com.qqchen.deploy.backend.deploy.repository;
import com.qqchen.deploy.backend.deploy.entity.DeployAppConfig;
import com.qqchen.deploy.backend.framework.repository.IBaseRepository;
import org.springframework.stereotype.Repository;
/**
* 应用配置仓库接口
*/
@Repository
public interface IDeployAppConfigRepository extends IBaseRepository<DeployAppConfig, Long> {
}

View File

@ -1,16 +0,0 @@
package com.qqchen.deploy.backend.deploy.repository;
import com.qqchen.deploy.backend.framework.repository.IBaseRepository;
import com.qqchen.deploy.backend.deploy.entity.DeployLog;
import org.springframework.stereotype.Repository;
import java.util.Optional;
/**
* 部署日志 Repository
*/
@Repository
public interface IDeployLogRepository extends IBaseRepository<DeployLog, Long> {
Optional<DeployLog> findTop1ByApplicationIdOrderByCreateTimeDesc(Long id);
}

View File

@ -1,26 +0,0 @@
package com.qqchen.deploy.backend.deploy.service;
import com.qqchen.deploy.backend.deploy.dto.BuildConfigDefinedDTO;
import com.qqchen.deploy.backend.deploy.dto.DeployAppBuildDTO;
import com.qqchen.deploy.backend.deploy.dto.DeployAppConfigDTO;
import com.qqchen.deploy.backend.deploy.entity.DeployAppConfig;
import com.qqchen.deploy.backend.deploy.query.DeployAppConfigQuery;
import com.qqchen.deploy.backend.framework.service.IBaseService;
import com.qqchen.deploy.backend.workflow.dto.WorkflowNodeTypeDefinedDTO;
import java.util.List;
/**
* 应用配置服务接口
*/
public interface IDeployAppConfigService extends IBaseService<DeployAppConfig, DeployAppConfigDTO, DeployAppConfigQuery, Long> {
/**
* 获取构建类型Schema定义
*
* @return Schema定义列表
*/
List<BuildConfigDefinedDTO> defined();
void deploy(DeployAppBuildDTO dto);
}

View File

@ -1,12 +0,0 @@
package com.qqchen.deploy.backend.deploy.service;
import com.qqchen.deploy.backend.framework.service.IBaseService;
import com.qqchen.deploy.backend.deploy.entity.DeployLog;
import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO;
import com.qqchen.deploy.backend.deploy.query.DeployLogQuery;
/**
* 部署日志 Service接口
*/
public interface IDeployLogService extends IBaseService<DeployLog, DeployLogDTO, DeployLogQuery, Long> {
}

View File

@ -1,183 +0,0 @@
package com.qqchen.deploy.backend.deploy.service.impl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qqchen.deploy.backend.deploy.converter.ApplicationConverter;
import com.qqchen.deploy.backend.deploy.converter.DeployLogConverter;
import com.qqchen.deploy.backend.deploy.dto.BuildConfigDefinedDTO;
import com.qqchen.deploy.backend.deploy.dto.DeployAppBuildDTO;
import com.qqchen.deploy.backend.deploy.dto.DeployAppConfigDTO;
import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO;
import com.qqchen.deploy.backend.deploy.entity.Application;
import com.qqchen.deploy.backend.deploy.entity.DeployAppConfig;
import com.qqchen.deploy.backend.deploy.entity.DeployLog;
import com.qqchen.deploy.backend.deploy.entity.Environment;
import com.qqchen.deploy.backend.deploy.enums.BuildTypeEnum;
import com.qqchen.deploy.backend.deploy.enums.DevelopmentLanguageTypeEnum;
import com.qqchen.deploy.backend.deploy.query.DeployAppConfigQuery;
import com.qqchen.deploy.backend.deploy.repository.IApplicationRepository;
import com.qqchen.deploy.backend.deploy.repository.IDeployLogRepository;
import com.qqchen.deploy.backend.deploy.repository.IEnvironmentRepository;
import com.qqchen.deploy.backend.deploy.service.IDeployAppConfigService;
import com.qqchen.deploy.backend.deploy.service.IDeployLogService;
import com.qqchen.deploy.backend.framework.annotation.formily.FormilySchemaFactory;
import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl;
import com.qqchen.deploy.backend.workflow.converter.WorkflowDefinitionConverter;
import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO;
import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceStartRequest;
import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition;
import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance;
import com.qqchen.deploy.backend.workflow.repository.IWorkflowDefinitionRepository;
import com.qqchen.deploy.backend.workflow.repository.IWorkflowInstanceRepository;
import com.qqchen.deploy.backend.workflow.service.IWorkflowInstanceService;
import com.qqchen.deploy.backend.workflow.util.GenerateSchemaUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static java.util.stream.Collectors.toList;
/**
* 应用配置服务实现类
*/
@Slf4j
@Service
public class DeployAppConfigServiceImpl extends BaseServiceImpl<DeployAppConfig, DeployAppConfigDTO, DeployAppConfigQuery, Long> implements IDeployAppConfigService {
@Resource
private IApplicationRepository applicationRepository;
@Resource
private ApplicationConverter applicationConverter;
@Resource
private IWorkflowDefinitionRepository workflowDefinitionRepository;
@Resource
private IWorkflowInstanceService workflowInstanceService;
@Resource
private WorkflowDefinitionConverter workflowDefinitionConverter;
@Resource
private IEnvironmentRepository environmentRepository;
@Resource
private IDeployLogService deployLogService;
@Resource
private IDeployLogRepository deployLogRepository;
@Resource
private DeployLogConverter deployLogConverter;
@Resource
private IWorkflowInstanceRepository workflowInstanceRepository;
@Resource
private ObjectMapper objectMapper;
@Override
public Page<DeployAppConfigDTO> page(DeployAppConfigQuery query) {
Page<DeployAppConfigDTO> page = super.page(query);
List<DeployAppConfigDTO> result = page.getContent().stream().peek(deployAppConfig -> {
Optional<WorkflowDefinition> optionalWorkflowDefinition = workflowDefinitionRepository.findById(deployAppConfig.getWorkflowDefinitionId());
optionalWorkflowDefinition.ifPresent(workflowDefinition -> deployAppConfig.setPublishedWorkflowDefinition(workflowDefinitionConverter.toDto(workflowDefinition)));
Optional<Application> optionalApplication = applicationRepository.findById(deployAppConfig.getApplicationId());
if (optionalApplication.isPresent()) {
Application application = optionalApplication.get();
deployAppConfig.setApplication(applicationConverter.toDto(application));
Optional<DeployLog> lastDeployLogOptional = deployLogRepository.findTop1ByApplicationIdOrderByCreateTimeDesc(application.getId());
if (lastDeployLogOptional.isEmpty()) {
return;
}
DeployLog lastDeployLog = lastDeployLogOptional.get();
Optional<WorkflowInstance> optionalWorkflowInstance = workflowInstanceRepository.findById(lastDeployLog.getWorkflowInstanceId());
if (optionalWorkflowInstance.isEmpty()) {
return;
}
WorkflowInstance workflowInstance = optionalWorkflowInstance.get();
deployAppConfig.setLastBuildStatus(workflowInstance.getStatus());
deployAppConfig.setLastBuildStartTime(workflowInstance.getStartTime());
deployAppConfig.setLastBuildEndTime(workflowInstance.getEndTime());
}
}).collect(toList());
return new PageImpl<>(result, page.getPageable(), page.getTotalElements());
}
@Override
public List<BuildConfigDefinedDTO> defined() {
List<BuildConfigDefinedDTO> result = new ArrayList<>();
for (BuildTypeEnum buildType : BuildTypeEnum.values()) {
try {
// 获取支持的语言和对应的构建变量类
DevelopmentLanguageTypeEnum[] languages = buildType.getSupportedLanguages();
Class<?>[] buildVariablesClasses = buildType.getBuildVariables();
// 如果支持的语言不为空则处理每种语言对应的Schema
if (languages != null && buildVariablesClasses != null) {
for (int i = 0; i < languages.length; i++) {
if (buildVariablesClasses[i] != null) {
BuildConfigDefinedDTO definedDTO = new BuildConfigDefinedDTO();
definedDTO.setCode(buildType.getCode());
definedDTO.setName(buildType.getName());
definedDTO.setBuildType(buildType);
definedDTO.setLanguageType(languages[i]);
// 使用新的FormilySchemaFactory生成Schema
JsonNode schema = FormilySchemaFactory.generateSchema(buildVariablesClasses[i]);
definedDTO.setBuildVariablesSchema(schema);
result.add(definedDTO);
}
}
}
} catch (Exception e) {
log.error("Error processing build type: " + buildType, e);
}
}
return result;
}
@Override
@Transactional
public void deploy(DeployAppBuildDTO dto) {
WorkflowDefinition workflowDefinition = workflowDefinitionRepository.findById(dto.getWorkflowDefinitionId()).orElseThrow(() -> new RuntimeException("Workflow definition not found: " + dto.getWorkflowDefinitionId()));
Environment environment = environmentRepository.findById(dto.getEnvironmentId()).orElseThrow(() -> new RuntimeException("Environment not found: " + dto.getEnvironmentId()));
Application application = applicationRepository.findById(dto.getApplicationId()).orElseThrow(() -> new RuntimeException("Application not found: " + dto.getApplicationId()));
WorkflowInstanceStartRequest request = new WorkflowInstanceStartRequest();
request.setProcessKey(workflowDefinition.getKey());
request.setBusinessKey(environment.getEnvCode() + "_" + application.getAppCode() + "_" + System.currentTimeMillis() / 1000);
request.setFormData(objectMapper.convertValue(dto.getBuildVariables(), new TypeReference<>() {
}));
WorkflowInstanceDTO workflowInstanceDTO = workflowInstanceService.startWorkflow(request);
buildAndSaveDeployLog(dto, environment, application, workflowInstanceDTO);
}
private void buildAndSaveDeployLog(DeployAppBuildDTO deployAppBuild, Environment environment, Application application, WorkflowInstanceDTO workflowInstance) {
DeployLogDTO deployLog = new DeployLogDTO();
deployLog.setEnvironmentId(environment.getId());
deployLog.setApplicationId(application.getId());
deployLog.setWorkflowInstanceId(workflowInstance.getId());
deployLog.setVariables(deployAppBuild.getBuildVariables());
deployLog.setDeployVersion(application.getAppCode() + "_" + System.currentTimeMillis() / 1000);
deployLog.setDeployVariables(deployAppBuild.getBuildVariables());
deployLog.setFormVariables(deployAppBuild.getFormVariables());
deployLogService.create(deployLog);
}
@Override
public DeployAppConfigDTO create(DeployAppConfigDTO dto) {
DeployAppConfig entity = converter.toEntity(dto);
// 使用新的FormilySchemaFactory生成Schema
entity.setFormVariablesSchema(GenerateSchemaUtils.generateSchema(dto.getBuildType().getFormVariablesSchema()));
this.repository.save(entity);
return converter.toDto(entity);
}
}

View File

@ -1,17 +0,0 @@
package com.qqchen.deploy.backend.deploy.service.impl;
import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl;
import com.qqchen.deploy.backend.deploy.entity.DeployLog;
import com.qqchen.deploy.backend.deploy.dto.DeployLogDTO;
import com.qqchen.deploy.backend.deploy.query.DeployLogQuery;
import com.qqchen.deploy.backend.deploy.service.IDeployLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 部署日志 Service实现
*/
@Slf4j
@Service
public class DeployLogServiceImpl extends BaseServiceImpl<DeployLog, DeployLogDTO, DeployLogQuery, Long> implements IDeployLogService {
}

View File

@ -49,48 +49,48 @@ 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),
(99, '工作台', '/dashboard', 'Dashboard', 'DashboardOutlined', 2, NULL, 0, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 工作流管理
(100, '工作流管理', '/workflow', 'Layout', 'DeploymentUnitOutlined', 1, NULL, 1, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(100, '工作流管理', '/workflow', NULL, 'DeploymentUnitOutlined', 1, NULL, 1, 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),
(101, '工作流设计', '/workflow/definitions', 'Workflow/Definition', '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),
(102, '工作流实例', '/workflow/instances', 'Workflow/Instance', 'BranchesOutlined', 2, 100, 20, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 表单管理
(104, '表单管理', '/workflow/form', '/src/pages/workflow/form/index', 'FormOutlined', 2, 100, 30, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(104, '表单管理', '/workflow/form', 'Form/Definition', 'FormOutlined', 2, 100, 30, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 运维管理
(200, '运维管理', '/deploy', 'Layout', 'DeploymentUnitOutlined', 1, NULL, 2, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(200, '运维管理', '/deploy', NULL, 'DeploymentUnitOutlined', 1, NULL, 2, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 团队管理
(201, '团队管理', '/deploy/teams', '/src/pages/Deploy/Team/List/index', 'TeamOutlined', 2, 200, 1, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(201, '团队管理', '/deploy/teams', 'Deploy/Team/List', 'TeamOutlined', 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),
(202, '应用管理', '/deploy/applications', 'Deploy/Application/List', 'AppstoreOutlined', 2, 200, 2, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 定时任务管理
(203, '定时任务管理', '/deploy/schedule-jobs', '/src/pages/Deploy/ScheduleJob/List/index', 'ClockCircleOutlined', 2, 200, 3, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 服务器管理
(204, '服务器管理', '/deploy/servers', '/src/pages/Deploy/Server/List/index', 'CloudServerOutlined', 2, 200, 4, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(203, '定时任务管理', '/deploy/schedule-jobs', 'Deploy/ScheduleJob/List', 'ClockCircleOutlined', 2, 200, 3, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 环境管理
(204, '环境管理', '/deploy/environments', 'Deploy/Environment/List', 'CloudOutlined', 2, 200, 4, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 资源管理
(300, '资源管理', '/resource', 'Layout', 'DatabaseOutlined', 1, NULL, 3, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 环境管理
(301, '环境管理', '/resource/environments', '/src/pages/Deploy/Environment/List/index', 'CloudOutlined', 2, 300, 1, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(300, '资源管理', '/resource', NULL, 'DatabaseOutlined', 1, NULL, 3, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 服务器管理
(301, '服务器管理', '/resource/servers', 'Deploy/Server/List', 'CloudServerOutlined', 2, 300, 1, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- Jenkins管理
(302, 'Jenkins管理', '/resource/jenkins-manager', '/src/pages/Deploy/JenkinsManager/List', 'BuildOutlined', 2, 300, 2, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(302, 'Jenkins管理', '/resource/jenkins', 'Deploy/JenkinsManager/List', 'BuildOutlined', 2, 300, 2, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- Git管理
(303, 'Git管理', '/resource/git-manager', '/src/pages/Deploy/GitManager/List', 'GithubOutlined', 2, 300, 3, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(303, 'Git管理', '/resource/git', 'Deploy/GitManager/List', 'GithubOutlined', 2, 300, 3, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 三方系统管理
(304, '三方系统管理', '/resource/external', '/src/pages/Deploy/external/index', 'ApiOutlined', 2, 300, 4, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(304, '三方系统管理', '/resource/external', 'Deploy/External', 'ApiOutlined', 2, 300, 4, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
-- 系统管理
(1, '系统管理', '/system', 'Layout', 'SettingOutlined', 1, NULL, 99, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE),
(1, '系统管理', '/system', NULL, 'SettingOutlined', 1, NULL, 99, 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),
(2, '用户管理', '/system/users', 'System/User', '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),
(3, '角色管理', '/system/roles', 'System/Role', '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),
(4, '菜单管理', '/system/menus', 'System/Menu', '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);
(5, '部门管理', '/system/departments', 'System/Department', 'ApartmentOutlined', 2, 1, 40, FALSE, TRUE, 'system', '2024-01-01 00:00:00', 0, FALSE);
-- 初始化角色数据
INSERT INTO sys_role (id, create_time, code, name, type, description, sort)

View File

@ -851,49 +851,6 @@ CREATE TABLE deploy_team_config
CONSTRAINT fk_team_config_team FOREIGN KEY (team_id) REFERENCES deploy_team(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-已删除'
);
-- --------------------------------------------------------------------------------------
-- 通知渠道表
-- --------------------------------------------------------------------------------------