diff --git a/pom.xml b/pom.xml index 8ce166e..04fe2db 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,7 @@ srt-data-development srt-cloud-data-governance srt-cloud-data-service + srt-cloud-data-assets diff --git a/srt-cloud-data-assets/.gitignore b/srt-cloud-data-assets/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/srt-cloud-data-assets/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/srt-cloud-data-assets/pom.xml b/srt-cloud-data-assets/pom.xml new file mode 100644 index 0000000..dd97b8d --- /dev/null +++ b/srt-cloud-data-assets/pom.xml @@ -0,0 +1,220 @@ + + + 4.0.0 + + net.srt + srt-cloud + 2.0.0 + + + srt-cloud-data-assets + + + 8 + 8 + UTF-8 + + + + + net.srt + srt-cloud-api + 2.0.0 + + + + org.springframework.boot + spring-boot-starter-log4j2 + + + net.srt + srt-cloud-mybatis + 2.0.0 + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + spring-boot-starter-logging + org.springframework.boot + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + com.github.whvcse + easy-captcha + + + com.github.xiaoymin + knife4j-springdoc-ui + + + com.aliyun.oss + aliyun-sdk-oss + + + com.qcloud + cos_api + + + com.qiniu + qiniu-java-sdk + + + com.huaweicloud + esdk-obs-java-bundle + + + io.minio + minio + + + + + + + + org.codehaus.mojo + appassembler-maven-plugin + 2.1.0 + + + + + generate-jsw-scripts + package + + generate-daemons + + + + + + + flat + + src/main/resources + true + + true + + conf + + lib + + bin + UTF-8 + logs + + + + ${project.artifactId} + net.srt.SystemApplication + + jsw + + + + jsw + + linux-x86-32 + linux-x86-64 + windows-x86-32 + windows-x86-64 + + + + configuration.directory.in.classpath.first + conf + + + wrapper.ping.timeout + 120 + + + set.default.REPO_DIR + lib + + + wrapper.logfile + logs/wrapper.log + + + + + + + + + -server + -Dfile.encoding=utf-8 + -Xms128m + -Xmx1024m + -XX:+PrintGCDetails + -XX:+PrintGCDateStamps + -Xloggc:logs/gc.log + + + + + + + net.srt.SystemApplication + ${project.artifactId} + + + + + + + + maven-assembly-plugin + + + ${project.parent.basedir}/assembly/assembly-win.xml + ${project.parent.basedir}/assembly/assembly-linux.xml + + + + + make-assembly + package + + single + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + + + diff --git a/srt-cloud-data-service/src/main/java/net/srt/ServiceApplication.java b/srt-cloud-data-assets/src/main/java/net/srt/AssetsApplication.java similarity index 79% rename from srt-cloud-data-service/src/main/java/net/srt/ServiceApplication.java rename to srt-cloud-data-assets/src/main/java/net/srt/AssetsApplication.java index e8876e7..2ba74cb 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/ServiceApplication.java +++ b/srt-cloud-data-assets/src/main/java/net/srt/AssetsApplication.java @@ -9,13 +9,13 @@ import org.springframework.cloud.openfeign.EnableFeignClients; * @ClassName : ${NAME} * @Description : ${description} * @Author : FJJ - * @Date: 2023-12-22 20:44 + * @Date: 2023-12-27 21:47 */ @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication -public class ServiceApplication { +public class AssetsApplication { public static void main(String[] args) { - SpringApplication.run(ServiceApplication.class, args); + SpringApplication.run(AssetsApplication.class, args); } } diff --git a/srt-cloud-data-assets/src/main/resources/auth.yml b/srt-cloud-data-assets/src/main/resources/auth.yml new file mode 100644 index 0000000..0e6a006 --- /dev/null +++ b/srt-cloud-data-assets/src/main/resources/auth.yml @@ -0,0 +1,7 @@ +auth: + ignore_urls: + - /auth/captcha + - /auth/login + - /auth/send/code + - /auth/mobile + - /upload/** \ No newline at end of file diff --git a/srt-cloud-data-assets/src/main/resources/bootstrap.yml b/srt-cloud-data-assets/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..a2348b6 --- /dev/null +++ b/srt-cloud-data-assets/src/main/resources/bootstrap.yml @@ -0,0 +1,46 @@ +server: + port: 8098 + +spring: + mvc: + servlet: + load-on-startup: 1 + application: + name: srt-cloud-data-assets + profiles: + active: dev + cloud: + nacos: + discovery: + server-addr: 101.34.77.101:8848 + # 命名空间,默认:public + namespace: 09dff3e2-9790-4d4f-beb6-9baeb01ae040 + service: ${spring.application.name} + group: srt2.0 + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + namespace: ${spring.cloud.nacos.discovery.namespace} + file-extension: yaml + # 指定配置 + extension-configs: + - data-id: datasource.yaml + refresh: true + servlet: + multipart: + max-request-size: 100MB + max-file-size: 1024MB +storage: + enabled: true + config: + # 存储类型:local、aliyun + type: local + # 访问域名 + domain: http://localhost:8082/sys + # 配置访问前缀 + prefix: + local: + # 本地上传路径 + path: D://upload + +cbx: + isCaptcha: false diff --git a/srt-cloud-data-assets/src/main/resources/log4j2.xml b/srt-cloud-data-assets/src/main/resources/log4j2.xml new file mode 100644 index 0000000..14461eb --- /dev/null +++ b/srt-cloud-data-assets/src/main/resources/log4j2.xml @@ -0,0 +1,48 @@ + + + + + ./logs/ + srt-cloud-system + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/srt-cloud-data-governance/src/main/java/net/srt/GovernanceApplication.java b/srt-cloud-data-governance/src/main/java/net/srt/GovernanceApplication.java index 65f1dee..4284f79 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/GovernanceApplication.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/GovernanceApplication.java @@ -18,6 +18,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; public class GovernanceApplication { public static void main(String[] args) { SpringApplication.run(GovernanceApplication.class, args); + System.out.println("原神启动!!!!!!!!!!!!!"); } } diff --git a/srt-cloud-data-governance/src/main/java/net/srt/controller/MetadataController.java b/srt-cloud-data-governance/src/main/java/net/srt/controller/MetadataController.java index 4d51a62..749171e 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/controller/MetadataController.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/controller/MetadataController.java @@ -23,7 +23,7 @@ public class MetadataController { @GetMapping("/list-child") @Operation(summary = "根据父级id获取信息") public Result> listByParentId(@RequestParam Long parentId){ - List treeNodeVos = metadataService.listByParentId(parentId); + List treeNodeVos = metadataService.listByPatenId(parentId); return Result.ok(treeNodeVos); } @@ -44,7 +44,7 @@ public class MetadataController { @GetMapping("/list-keyword") @Operation(summary = "模糊查询") public Result> listByKeyword(String keyword){ - List treeNodeVos = metadataService.listByKeyword(keyword); + List treeNodeVos = metadataService.listKeyword(keyword); return Result.ok(treeNodeVos); } @@ -78,13 +78,13 @@ public class MetadataController { @PostMapping("/neo4j") @Operation(summary = "更新neo4j的url") public Result upNeo4jInfo(@RequestBody Neo4jInfo neo4jInfo){ - metadataService.upNeo4jInfo(neo4jInfo); + metadataService.updateNeo4j(neo4jInfo); return Result.ok(); } @GetMapping("/neo4j") @Operation(summary = "获取neo4j的url") public Result getNeo4jInfo(){ - return Result.ok(metadataService.getNeo4jInfo()); + return Result.ok(metadataService.getNeo4j()); } } diff --git a/srt-cloud-data-governance/src/main/java/net/srt/controller/StandardController.java b/srt-cloud-data-governance/src/main/java/net/srt/controller/StandardController.java index 20ae5b2..2c9b45d 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/controller/StandardController.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/controller/StandardController.java @@ -2,6 +2,10 @@ package net.srt.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import net.srt.convert.StandardConvert; +import net.srt.entity.DatastandardEntity; +import net.srt.entity.StandardEntity; +import net.srt.framework.common.utils.BeanUtil; import net.srt.framework.common.utils.Result; import net.srt.framework.common.utils.TreeNodeVo; import net.srt.service.StandardService; @@ -9,6 +13,8 @@ import net.srt.vo.StandardManagementVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; +import java.util.ArrayList; import java.util.List; /** @@ -30,6 +36,13 @@ public class StandardController { return Result.ok(standardService.listTree()); } + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + StandardEntity entity = standardService.getById(id); + + return Result.ok(StandardConvert.INSTANCE.convert(entity)); + } @PostMapping @Operation(summary = "保存") @@ -45,9 +58,9 @@ public class StandardController { return Result.ok(); } - @DeleteMapping + @DeleteMapping("/{id}") @Operation(summary = "删除") - public Result delete(Long id) { + public Result delete(@PathVariable Long id) { standardService.delete(id); return Result.ok(); } diff --git a/srt-cloud-data-governance/src/main/java/net/srt/dao/StandardDao.java b/srt-cloud-data-governance/src/main/java/net/srt/dao/StandardDao.java index adc6acc..b2dcb0f 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/dao/StandardDao.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/dao/StandardDao.java @@ -12,5 +12,4 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface StandardDao extends BaseMapper { - } diff --git a/srt-cloud-data-governance/src/main/java/net/srt/init/BusinessInitializer.java b/srt-cloud-data-governance/src/main/java/net/srt/init/BusinessInitializer.java new file mode 100644 index 0000000..cf0c336 --- /dev/null +++ b/srt-cloud-data-governance/src/main/java/net/srt/init/BusinessInitializer.java @@ -0,0 +1,34 @@ +package net.srt.init; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.srt.service.MetadataCollectRecordService; +import net.srt.service.QualityTaskService; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class BusinessInitializer implements ApplicationRunner { + + private final MetadataCollectRecordService metadataCollectRecordService; + private final QualityTaskService qualityTaskService; + + @Override + public void run(ApplicationArguments args) { + initScheduleMonitor(); + } + + /** + * init task monitor + */ + private void initScheduleMonitor() { +// //处理没执行完的采集任务 +// metadataCollectRecordService.dealNotFinished(); +// //处理没执行完的质量检测任务 +// qualityTaskService.dealNotFinished(); + } + +} diff --git a/srt-cloud-data-governance/src/main/java/net/srt/service/MetadataService.java b/srt-cloud-data-governance/src/main/java/net/srt/service/MetadataService.java index a171909..b414aa5 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/service/MetadataService.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/service/MetadataService.java @@ -8,25 +8,31 @@ import net.srt.vo.MetadataVO; import java.util.List; +/** + * @BelongsProject: srt_cloud + * @BelongsPackage: net.srt.service + * @Author: jpz + * @CreateTime: 2023/12/24 14:35 + */ + public interface MetadataService extends BaseService { - List listByParentId(Long parentId); + List listByPatenId(Long parentId); List listFloder(); List listDb(); - List listByKeyword(String keyword); + List listKeyword(String keyword); MetadataVO get(Long id); void save(MetadataVO vo); - void update(MetadataVO vo); void delete(Long id); - void upNeo4jInfo(Neo4jInfo neo4jInfo); + void updateNeo4j(Neo4jInfo neo4jInfo); - Neo4jInfo getNeo4jInfo(); + Neo4jInfo getNeo4j(); } diff --git a/srt-cloud-data-governance/src/main/java/net/srt/service/impl/MetadataServiceImpl.java b/srt-cloud-data-governance/src/main/java/net/srt/service/impl/MetadataServiceImpl.java index 9dd5d33..e07adbb 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/service/impl/MetadataServiceImpl.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/service/impl/MetadataServiceImpl.java @@ -38,7 +38,7 @@ public class MetadataServiceImpl extends BaseServiceImpl listByParentId(Long parentId) { + public List listByPatenId(Long parentId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(MetadataEntity::getParentId,parentId) .orderByAsc(MetadataEntity::getOrderNo); @@ -93,9 +93,9 @@ public class MetadataServiceImpl extends BaseServiceImpl listByKeyword(String keyword) { + public List listKeyword(String keyword) { if(StringUtil.isBlank(keyword)){ - return listByParentId(0L); + return listByPatenId(0L); } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.like(MetadataEntity::getName,keyword) @@ -171,12 +171,12 @@ public class MetadataServiceImpl extends BaseServiceImpl metadataIds=qualityConfigvo.getMetadataIds(); + QualityConfigVo QualityConfigVo= QualityConfigConvert.INSTANCE.convert(baseMapper.selectById(id)); + List metadataIds=QualityConfigVo.getMetadataIds(); LambdaQueryWrapper metadataWrapper= Wrappers.lambdaQuery(); metadataWrapper.in(MetadataEntity::getId,metadataIds); List metadataEntities=metadataDao.selectList(metadataWrapper); if (CollectionUtils.isEmpty(metadataEntities)){ - qualityConfigvo.setMetadataStrs("检测字段已删除,请检查数据信息"); + QualityConfigVo.setMetadataStrs("检测字段已删除,请检查数据信息"); }else { - qualityConfigvo.setMetadataStrs(metadataEntities.stream().map(MetadataEntity::getPath).collect(Collectors.joining(";"))); + QualityConfigVo.setMetadataStrs(metadataEntities.stream().map(MetadataEntity::getPath).collect(Collectors.joining(";"))); } - if (BuiltInQualityRule.ASSOCIATION_CONSISTENCY.getId().equals(qualityConfigvo.getRuleId())){ - QualityConfigParam param = qualityConfigvo.getParam(); + if (BuiltInQualityRule.ASSOCIATION_CONSISTENCY.getId().equals(QualityConfigVo.getRuleId())){ + QualityConfigParam param = QualityConfigVo.getParam(); Integer columnMetaId = param.getColumnMetaId(); MetadataEntity entity = metadataDao.selectById(columnMetaId); if (entity!= null){ - qualityConfigvo.setRelMetadataStr(entity.getPath()); + QualityConfigVo.setRelMetadataStr(entity.getPath()); }else { - qualityConfigvo.setMetadataStrs("关联字段已被删除,请检查元数据信息"); + QualityConfigVo.setMetadataStrs("关联字段已被删除,请检查元数据信息"); } } - return qualityConfigvo; + return QualityConfigVo; } @Override diff --git a/srt-cloud-data-governance/src/main/java/net/srt/service/impl/StandardServiceImpl.java b/srt-cloud-data-governance/src/main/java/net/srt/service/impl/StandardServiceImpl.java index 9a60e6a..abb24e4 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/service/impl/StandardServiceImpl.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/service/impl/StandardServiceImpl.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import net.srt.controller.StandardController; import net.srt.convert.StandardConvert; import net.srt.dao.StandardDao; +import net.srt.entity.MetamodelEntity; import net.srt.entity.StandardEntity; import net.srt.framework.common.exception.ServerException; import net.srt.framework.common.utils.BeanUtil; @@ -66,7 +67,7 @@ public class StandardServiceImpl extends BaseServiceImpl> listAll() { List list = dataDatabaseService.listAll(); diff --git a/srt-cloud-data-integrate/src/main/resources/bootstrap.yml b/srt-cloud-data-integrate/src/main/resources/bootstrap.yml index edd03e2..ebf3ba8 100644 --- a/srt-cloud-data-integrate/src/main/resources/bootstrap.yml +++ b/srt-cloud-data-integrate/src/main/resources/bootstrap.yml @@ -15,7 +15,7 @@ spring: discovery: server-addr: 101.34.77.101:8848 # 命名空间,默认:public - namespace: 7e1e997d-5fa4-4f84-9f48-3e0adf830a37 + namespace: 9de208a6-cb30-41ae-a880-78196c99c050 service: ${spring.application.name} group: srt2.0 config: diff --git a/srt-cloud-data-service/src/main/java/net/srt/DataServiceApplication.java b/srt-cloud-data-service/src/main/java/net/srt/DataServiceApplication.java new file mode 100644 index 0000000..c593712 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/DataServiceApplication.java @@ -0,0 +1,15 @@ +package net.srt; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@EnableFeignClients +@EnableDiscoveryClient +@SpringBootApplication +public class DataServiceApplication { + public static void main(String[] args) { + SpringApplication.run(DataServiceApplication.class, args); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/constants/ApiConstants.java b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiConstants.java new file mode 100644 index 0000000..6800b30 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiConstants.java @@ -0,0 +1,8 @@ +package net.srt.constants; + +import lombok.Data; + +@Data +public class ApiConstants { + public static final String API_PREFIX = "/api/v1"; // 例如,这里定义了一个API的前缀 +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/constants/ApiController.java b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiController.java new file mode 100644 index 0000000..20e6083 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiController.java @@ -0,0 +1,53 @@ +package net.srt.constants; + +import net.srt.dao.ApiConfigDao; +import net.srt.entity.ApiConfigEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ResponseStatusException; + +@Controller +@RequestMapping("/api") +public class ApiController { + + private boolean isOnline = true; + + @GetMapping("/status") + public ResponseEntity getStatus() { + String status = isOnline ? "online" : "offline"; + return ResponseEntity.ok("API status: " + status); + } + + @GetMapping("/resource/{id}") + public ResponseEntity getResource(@PathVariable Long id) { + if (!isOnline) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Resource not found"); + } + + // 处理获取资源的逻辑... + + String resource = ""; // 假设这里是获取资源的代码 + + if (resource != null) { + return ResponseEntity.ok("Resource: " + resource); + } else { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Resource not found"); + } + } + + @GetMapping("/offline") + public ResponseEntity offline() { + isOnline = false; + return ResponseEntity.ok("API is now offline"); + } + + @GetMapping("/online") + public ResponseEntity online() { + isOnline = true; + return ResponseEntity.ok("API is now online"); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java new file mode 100644 index 0000000..7ab6c34 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java @@ -0,0 +1,19 @@ +package net.srt.constants; + +public enum ApiGroupType { + FOLDER(1,"数据库"), + API(2,"数据库"); + private final Integer value; + private final String longValue; + + ApiGroupType(Integer value, String longValue) { + this.value = value; + this.longValue = longValue; + } + public Integer getValue() { + return value; + } + public String getLongValue() { + return longValue; + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java new file mode 100644 index 0000000..ee9046a --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java @@ -0,0 +1,140 @@ +package net.srt.controller; +import io.swagger.v3.oas.annotations.Operation; +import lombok.AllArgsConstructor; +import net.srt.convert.ApiConfigConvert; +import net.srt.dto.SqlDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import net.srt.query.ApiConfigQuery; +import net.srt.service.ApiConfigService; +import net.srt.vo.ApiConfigVo; +import net.srt.vo.DataServiceApiAuthVo; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import srt.cloud.framework.dbswitch.core.model.JdbcSelectResult; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/api-config") +@AllArgsConstructor +public class ApiConfigController { + private final ApiConfigService apiConfigService; + + @GetMapping("page") + @Operation(summary = "分页") + @PreAuthorize("hasAuthority('data-service:api-config:page')") + public Result> page(@Valid ApiConfigQuery query) { + PageResult page = apiConfigService.page(query); + + return Result.ok(page); + } + @GetMapping("page-resource") + @Operation(summary = "根据resourceId分页获取") + public Result> pageResource(@Valid ApiConfigQuery query){ + PageResult page = apiConfigService.pageResource(query); + + return Result.ok(page); + } + + @GetMapping("page-auth") + public Result> pageAuth(@Valid ApiConfigQuery query) { + PageResult page = apiConfigService.page(query); + + return Result.ok(page); + } + + //取消授权 +// @PutMapping("/auth-info") +// @Operation(summary = "修改授权") +// public Result upAuth(@RequestBody DataServiceApiAuthVo authVO){ +// apiConfigService.upAuth(authVO); +// return Result.ok(); +// } + @Operation(summary = "回显") + @GetMapping(value = "/auth-info/{authId}") + public Result getAuthId(@PathVariable Long authId){ + return Result.ok(apiConfigService.getAuthInfo(authId)); + } + + //重置调用次数 + @Operation(summary = "重置调用次数") + @PutMapping("/reset-requested/{authId}") + public Result resetRequested(@PathVariable Long authId){ + apiConfigService.resetRequested(authId); + return Result.ok(); + } + + + @GetMapping("{id}") + @Operation(summary = "信息") + @PreAuthorize("hasAnyAuthority('data-service:api-config:info')") + public Result get(@PathVariable("id") Long id){ + ApiConfigEntity entity=apiConfigService.getById(id); + return Result.ok(ApiConfigConvert.INSTANCE.convert(entity)); + } + + @PostMapping + @Operation(summary = "保存") + @PreAuthorize("hasAnyAuthority('data-service:api-config:save')") + public Result save(@RequestBody ApiConfigVo vo) { + apiConfigService.save(vo); + return Result.ok(); + } + @PutMapping + @Operation(summary = "修改") + @PreAuthorize("hasAnyAuthority('data-service:api-config:update')") + public Result update(@RequestBody ApiConfigVo vo){ + apiConfigService.update(vo); + return Result.ok(); + } + @DeleteMapping + @Operation(summary = "删除") + @PreAuthorize("hasAnyAuthority('data-service:api-config:delete')") + public Result delete(@RequestBody List idList){ + apiConfigService.delete(idList); + return Result.ok(); + } + @GetMapping("getIpPort") + public Result getIpPort() { + return Result.ok(apiConfigService.getIpPort()); + } + @Operation(summary = "获取服务的ip和端口号") + @GetMapping("/ip-port") + public Result ipPort() { + return Result.ok(apiConfigService.ipPort()); + } + @Operation(summary = "上线") + @PreAuthorize("hasAnyAuthority('data-service:api-config:online')") + @PutMapping("/{id}/online") + public Result online(@PathVariable Long id) { + apiConfigService.online(id); + return Result.ok(); + } + @Operation(summary = "下线") + @PreAuthorize("hasAnyAuthority('data-service:api-config:offline')") + @PutMapping("/{id}/offline") + public Result offline(@PathVariable Long id){ + apiConfigService.offline(id); + return Result.ok(); + } + + @Operation(summary = "执行sql") + @PostMapping("/sql/execute") + public Result sqlExecute(@RequestBody SqlDto dto) { + return Result.ok(apiConfigService.sqlExecute(dto)); + } + + @Operation(summary = "导出 api 文档") + @PostMapping(value = "/export-docs") + public void exportDocs(@RequestBody List ids, HttpServletResponse response) { + apiConfigService.exportDocs(ids, response); + } + + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java new file mode 100644 index 0000000..28675b8 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java @@ -0,0 +1,69 @@ +package net.srt.controller; + +import io.swagger.v3.oas.annotations.Operation; +import lombok.AllArgsConstructor; +import net.srt.convert.ApiGroupConvert; +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import net.srt.framework.common.utils.TreeNodeVo; +import net.srt.query.ApiConfigQuery; +import net.srt.service.ApiGroupService; +import net.srt.vo.ApiConfigVo; +import net.srt.vo.ApiGroupVo; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** +* 数据服务-api分组 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@RestController +@RequestMapping("/api-group") +@AllArgsConstructor +public class ApiGroupController { + private final ApiGroupService apiGroupService; + @GetMapping + @Operation(summary = "查询文件分组树") + public Result> listTree() { + return Result.ok(apiGroupService.listTree()); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @PreAuthorize("hasAuthority('data-service:api-group:info')") + public Result get(@PathVariable("id") Long id){ + ApiGroupEntity entity = apiGroupService.getById(id); + + return Result.ok(ApiGroupConvert.INSTANCE.convert(entity)); + } + + @PostMapping + @Operation(summary = "保存") + @PreAuthorize("hasAuthority('data-service:api-group:save')") + public Result save(@RequestBody ApiGroupVo vo) { + apiGroupService.save(vo); + return Result.ok(); + } + + @PutMapping + @Operation(summary = "修改") + @PreAuthorize("hasAuthority('data-service:api-group:update')") + public Result update(@RequestBody @Valid ApiGroupVo vo) { + apiGroupService.update(vo); + return Result.ok(); + } + + @DeleteMapping("/{id}") + @Operation(summary = "删除") + @PreAuthorize("hasAuthority('data-service:api-group:delete')") + public Result delete(@PathVariable Long id) { + apiGroupService.delete(id); + return Result.ok(); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiController.java new file mode 100644 index 0000000..75da63c --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiController.java @@ -0,0 +1,29 @@ +package net.srt.controller; + +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import net.srt.dao.DataServiceAppDao; +import net.srt.framework.common.utils.Result; +import net.srt.service.DataServiceAppService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName : DataServiceApiController + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 20:38 + */ +@RestController +@RequestMapping("api") +@Tag(name = "api") +@AllArgsConstructor +public class DataServiceApiController { + private final DataServiceAppService dataServiceAppService; + @GetMapping("/token/generate") + public Result tokenGenerate(@RequestParam String appKey, @RequestParam String appSecret) { + return Result.ok(dataServiceAppService.tokenGenerate(appKey, appSecret)); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java new file mode 100644 index 0000000..a9ffb07 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java @@ -0,0 +1,43 @@ +package net.srt.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import net.srt.query.DataServiceApiLogQuery; +import net.srt.query.DataServiceAppQuery; +import net.srt.service.DataServiceApiLogService; +import net.srt.vo.DataServiceApiLogVo; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @ClassName : DataServiceApiLogController + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:29 + */ +@RestController +@RequestMapping("log") +@Tag(name = "api请求日志") +@AllArgsConstructor +public class DataServiceApiLogController { + private final DataServiceApiLogService dataServiceApiLogService; + + @GetMapping("page") + @Operation(summary = "分页") + public Result> page(@Valid DataServiceApiLogQuery query){ + //查询数据 + PageResult page=dataServiceApiLogService.dataPageList(query); + return Result.ok(page); + } + @DeleteMapping + @Operation(summary ="删除") + public Result delete(@RequestBody List idList){ + dataServiceApiLogService.removeId(idList); + return Result.ok(); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java index e138804..f50d62d 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java @@ -8,7 +8,9 @@ import net.srt.framework.common.page.PageResult; import net.srt.framework.common.utils.Result; import net.srt.query.DataServiceAppQuery; import net.srt.service.DataServiceAppService; +import net.srt.vo.DataServiceApiAuthVo; import net.srt.vo.DataServiceAppVo; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -32,12 +34,12 @@ public class DataServiceAppController { PageResult pageResult = dataServiceAppService.page(query); return Result.ok(pageResult); } - @GetMapping("{id}") - @Operation(summary = "信息") - public Result get(@PathVariable("id") Long id){ - DataServiceAppEntity dataServiceAppEntity = dataServiceAppService.getById(id); - return Result.ok(DataServiceAppConvert.INSTANCE.convert(dataServiceAppEntity)); - } +// @GetMapping("{id}") +// @Operation(summary = "信息") +// public Result get(@PathVariable("id") Long id){ +// DataServiceAppEntity dataServiceAppEntity = dataServiceAppService.getById(id); +// return Result.ok(DataServiceAppConvert.INSTANCE.convert(dataServiceAppEntity)); +// } @PostMapping @Operation(summary = "保存") @@ -61,16 +63,19 @@ public class DataServiceAppController { return Result.ok(); } + + @PostMapping("/auth") @Operation(summary = "添加授权") - public Result addAuth(@RequestBody DataServiceAppVo authVO){ + public Result addAuth(@RequestBody DataServiceApiAuthVo authVO){ dataServiceAppService.addAuth(authVO); return Result.ok(); } + @PutMapping("/auth") @Operation(summary = "修改授权") - public Result upAuth(@RequestBody DataServiceAppVo authVO){ + public Result upAuth(@RequestBody DataServiceApiAuthVo authVO){ dataServiceAppService.upAuth(authVO); return Result.ok(); } @@ -81,4 +86,5 @@ public class DataServiceAppController { dataServiceAppService.cancelAuth(authId); return Result.ok(); } + } diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java new file mode 100644 index 0000000..9706f7e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java @@ -0,0 +1,30 @@ +package net.srt.convert; + +import net.srt.dto.ApiConfigDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.vo.ApiConfigVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** +* 数据服务-api配置 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@Mapper +public interface ApiConfigConvert { + ApiConfigConvert INSTANCE = Mappers.getMapper(ApiConfigConvert.class); + + ApiConfigEntity convert(ApiConfigVo vo); + + ApiConfigVo convert(ApiConfigEntity entity); + + ApiConfigDto convertDto(ApiConfigEntity entity); + + List convertList(List list); + + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java new file mode 100644 index 0000000..c0e45ce --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java @@ -0,0 +1,26 @@ +package net.srt.convert; + +import net.srt.entity.ApiGroupEntity; +import net.srt.vo.ApiGroupVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** +* 数据服务-api分组 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@Mapper +public interface ApiGroupConvert { + ApiGroupConvert INSTANCE = Mappers.getMapper(ApiGroupConvert.class); + + ApiGroupEntity convert(ApiGroupVo vo); + + ApiGroupVo convert(ApiGroupEntity entity); + + List convertList(List list); + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java new file mode 100644 index 0000000..8e88916 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java @@ -0,0 +1,26 @@ +package net.srt.convert; + +import net.srt.entity.DataServiceApiAuthEntity; +import net.srt.vo.DataServiceApiAuthVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * @ClassName : DataServiceApiAuthConvert + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 19:45 + */ +@Mapper +public interface DataServiceApiAuthConvert { + DataServiceApiAuthConvert INSTANCE = Mappers.getMapper(DataServiceApiAuthConvert.class); + + + DataServiceApiAuthEntity convert(DataServiceApiAuthVo vo); + + DataServiceApiAuthVo convert(DataServiceApiAuthEntity entity); + + List convertList(List list); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java new file mode 100644 index 0000000..0921ae7 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java @@ -0,0 +1,24 @@ +package net.srt.convert; + +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.vo.DataServiceApiLogVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * @ClassName : DataServiceApiLogConvert + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:30 + */ +@Mapper +public interface DataServiceApiLogConvert { + DataServiceApiLogConvert INSTANCE = Mappers.getMapper(DataServiceApiLogConvert.class); + DataServiceApiLogEntity convert(DataServiceApiLogVo vo); + + DataServiceApiLogVo convert(DataServiceApiLogEntity entity); + + List convertList(List list); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceAppConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceAppConvert.java index 3abbab9..2c975e2 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceAppConvert.java +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceAppConvert.java @@ -19,6 +19,7 @@ public interface DataServiceAppConvert { DataServiceAppEntity convert(DataServiceAppVo vo); + DataServiceAppVo convert(DataServiceAppEntity entity); List convertList(List list); diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java new file mode 100644 index 0000000..088d674 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java @@ -0,0 +1,22 @@ +package net.srt.dao; + +import net.srt.entity.ApiConfigEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface ApiConfigDao extends BaseDao { + List getResourceList(Map params); + + ApiConfigEntity getById(Long id); + + void updateById(@Param("apiId") Long apiId, @Param("id") Long id); + + List getAuthList(Map params); + + void updateAuthId(@Param("authId") Long authId); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java new file mode 100644 index 0000000..66b1af5 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java @@ -0,0 +1,9 @@ +package net.srt.dao; + +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ApiGroupDao extends BaseDao { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java new file mode 100644 index 0000000..d9c84a6 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java @@ -0,0 +1,18 @@ +package net.srt.dao; + +import net.srt.entity.DataServiceApiAuthEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * @ClassName : DataServiceApiAuthDao + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:23 + */ +@Mapper +public interface DataServiceApiAuthDao extends BaseDao { + void resetRequested(Long authId); + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java new file mode 100644 index 0000000..a2cb64e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java @@ -0,0 +1,15 @@ +package net.srt.dao; + +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +/** + * @ClassName : DataServiceApiLogDao + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:30 + */ +@Mapper +public interface DataServiceApiLogDao extends BaseDao { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceAppDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceAppDao.java index f93a261..1ef713e 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceAppDao.java +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceAppDao.java @@ -13,5 +13,5 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface DataServiceAppDao extends BaseDao { - DataServiceAppEntity selectByApplyId(@Param("applyId") Long applyId); +// DataServiceAppEntity selectByApplyId(@Param("applyId") Long applyId); } diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java b/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java new file mode 100644 index 0000000..638f19d --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java @@ -0,0 +1,48 @@ +package net.srt.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + + +@Data +public class ApiConfigDto implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + private Long groupId; + private String path; + private String type; + private String name; + private String note; + private String sqlText; + private String sqlSeparator; + private Integer sqlMaxRow; + private String sqlParam; + private String jsonParam; + private String responseResult; + private String contentType; + private Integer status; + private Date releaseTime; + private Long releaseUserId; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Long projectId; + private Integer version; + private Integer deleted; + private Long creator; + private Date createTime; + private Long updater; + private Date updateTime; + private Integer requestedTimes; + private Integer requestedSuccessTimes; + private Integer requestedFailedTimes; + private Long authId; + private String group; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java b/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java new file mode 100644 index 0000000..335ef90 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java @@ -0,0 +1,17 @@ +package net.srt.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AppToken implements Serializable { + private Long appId; + private String appKey; + private String token; + private Long expireAt; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java b/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java new file mode 100644 index 0000000..599ea55 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java @@ -0,0 +1,15 @@ +package net.srt.dto; + +import lombok.Data; + +@Data +public class SqlDto { + private Integer sqlDbType; + private Long projectId; + private String statement; + private String sqlSeparator; + private Long databaseId; + private Integer openTrans; + private String jsonParams; + private Integer sqlMaxRow; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java new file mode 100644 index 0000000..4e9eb1d --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java @@ -0,0 +1,38 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import net.srt.framework.mybatis.entity.BaseEntity; + +import java.util.ArrayList; +import java.util.Date; + +@Data +@TableName("data_service_api_config") +public class ApiConfigEntity extends BaseEntity { + private Long groupId; + private String path; + private String type; + private String name; + private String note; + private String sqlText; + private String sqlSeparator; + private Integer sqlMaxRow; + private String sqlParam; + private String jsonParam; + private String responseResult; + private String contentType; + private Integer status; + private Date releaseTime; + private Long releaseUserId; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Long projectId; + private Integer requestedTimes; + private Integer requestedSuccessTimes; + private Integer requestedFailedTimes; + private Long authId; + private String groupPath; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java new file mode 100644 index 0000000..a3afe4c --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java @@ -0,0 +1,17 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import net.srt.framework.mybatis.entity.BaseEntity; + +@Data +@TableName("data_service_api_group") +public class ApiGroupEntity extends BaseEntity { + private Long parentId; + private Integer type; + private String name; + private String description; + private Integer orderNo; + private String path; + private Long projectId; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEnitiy.java b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEnitiy.java deleted file mode 100644 index 852114f..0000000 --- a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEnitiy.java +++ /dev/null @@ -1,70 +0,0 @@ -//package net.srt.entity; -// -//import com.baomidou.mybatisplus.annotation.FieldFill; -//import com.baomidou.mybatisplus.annotation.FieldStrategy; -//import com.baomidou.mybatisplus.annotation.TableField; -//import com.baomidou.mybatisplus.annotation.TableName; -//import lombok.Data; -//import lombok.EqualsAndHashCode; -//import net.srt.framework.mybatis.entity.BaseEntity; -// -//import java.util.Date; -// -///** -// * @ClassName : DataServiceApiAuthEnitiy -// * @Description : -// * @Author : FJJ -// * @Date: 2023-12-24 11:30 -// */ -//@EqualsAndHashCode(callSuper=false) -//@Data -//@TableName("data_service_api_auth1") -//public class DataServiceApiAuthEnitiy extends BaseEntity { -// -// /** -// * app的id -// */ -// private Long appId; -// -// /** -// * 分组id -// */ -// private Long groupId; -// -// /** -// * api的id -// */ -// private Long apiId; -// -// /** -// * 调用次数 不限次数为-1 -// */ -// private Integer requestTimes; -// -// @TableField(updateStrategy = FieldStrategy.IGNORED) -// private Date startTime; -// @TableField(updateStrategy = FieldStrategy.IGNORED) -// private Date endTime; -// -// /** -// * 已调用次数 -// */ -// @TableField(updateStrategy = FieldStrategy.NEVER) -// private Integer requestedTimes; -// @TableField(updateStrategy = FieldStrategy.NEVER) -// private Integer requestedSuccessTimes; -// @TableField(updateStrategy = FieldStrategy.NEVER) -// private Integer requestedFailedTimes; -// -// /** -// * 所属项目id -// */ -// private Long projectId; -// -// /** -// * 真删 -// */ -// @TableField(fill = FieldFill.INSERT) -// private Integer deleted; -// -//} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java new file mode 100644 index 0000000..94b00bb --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java @@ -0,0 +1,68 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.mybatis.entity.BaseEntity; + +import java.util.Date; + +/** + * @ClassName : DataServiceApiAuthEntity + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:20 + */ +@EqualsAndHashCode(callSuper = false) +@Data +@TableName("data_service_api_auth") +public class DataServiceApiAuthEntity extends BaseEntity { + + + /** + * app的id + */ + private Long appId; + + /** + * 分组id + */ + private Long groupId; + + /** + * api的id + */ + private Long apiId; + + /** + * 调用次数 不限次数为-1 + */ + private Integer requestTimes; + + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Date startTime; + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Date endTime; + + /** + * 已调用次数 + */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private Integer requestedTimes; + @TableField(updateStrategy = FieldStrategy.NEVER) + private Integer requestedSuccessTimes; + @TableField(updateStrategy = FieldStrategy.NEVER) + private Integer requestedFailedTimes; + + /** + * 所属项目id + */ + private Long projectId; + + /** + * 真删 + */ + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java new file mode 100644 index 0000000..2edd578 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java @@ -0,0 +1,61 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.mybatis.entity.BaseEntity; + +/** + * @ClassName : DataServiceApiLogEntity + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:11 + */ +@EqualsAndHashCode(callSuper = false) +@Data +@TableName("data_service_api_log") +public class DataServiceApiLogEntity extends BaseEntity { + /** + * url + */ + private String url; + + /** + * 响应状态码 + */ + private Integer status; + + /** + * 时长 + */ + private Long duration; + + /** + * IP地址 + */ + private String ip; + + /** + * app的id + */ + private Long appId; + + /** + * api的id + */ + private Long apiId; + + private String appName; + private String apiName; + + /** + * 错误信息 + */ + private String error; + + /** + * 项目id + */ + private Long projectId; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java new file mode 100644 index 0000000..7351ef9 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java @@ -0,0 +1,27 @@ +package net.srt.handler; + +// 导入必要的类 + +import net.srt.constants.ApiConstants; +import net.srt.entity.ApiConfigEntity; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; + +import java.util.HashMap; +import java.util.Map; + + +// 假设这是你的接口处理类 +public class ApiHandler { + private Map mappings = new HashMap<>(); + + public void registerApi(ApiConfigEntity api) { + RequestMappingInfo mappingInfo = RequestMappingInfo + .paths(ApiConstants.API_PREFIX + api.getPath()) // 使用API_PREFIX常量 + .methods(RequestMethod.valueOf(api.getType())) + .build(); + + mappings.put(mappingInfo, api); + } + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java new file mode 100644 index 0000000..f74bc8e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java @@ -0,0 +1,21 @@ +package net.srt.handler; + +import net.srt.constants.ApiConstants; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +public class ApiRegistration { + private RequestMappingHandlerMapping handlerMapping; // 注入或实例化 RequestMappingHandlerMapping 对象 + + public void registerApi(String path, String method, Object handler, String handlerMethod) throws NoSuchMethodException { + RequestMappingInfo mappingInfo = RequestMappingInfo + .paths(ApiConstants.API_PREFIX + path) + .methods(RequestMethod.valueOf(method)) + .build(); + + HandlerMethod handlerMethodObject = new HandlerMethod(handler, handlerMethod); + handlerMapping.registerMapping(mappingInfo, handlerMethodObject.getBean(), handlerMethodObject.getMethod()); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java new file mode 100644 index 0000000..3916db8 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java @@ -0,0 +1,9 @@ +package net.srt.handler; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +public interface MappingRequestHandler { + Object invoke(HttpServletRequest request, String apiToken, Map pathVariables, + Map requestParams, Map requestBodys); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java new file mode 100644 index 0000000..d39bee7 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java @@ -0,0 +1,25 @@ +package net.srt.handler; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Map; + +public class MappingRequestHandlerExample { + private final MappingRequestHandler handler; + private Method method; + + public MappingRequestHandlerExample(MappingRequestHandler handler) { + this.handler = handler; + try { + method = MappingRequestHandler.class.getDeclaredMethod( + "invoke", HttpServletRequest.class, String.class, Map.class, Map.class, Map.class); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + + public void getHandlerAndMethod() { + System.out.println("Handler: " + handler); + System.out.println("Method: " + method); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java b/srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java new file mode 100644 index 0000000..4cbb148 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java @@ -0,0 +1,21 @@ +package net.srt.query; + +import lombok.Data; +import net.srt.framework.common.query.Query; + +@Data +public class ApiConfigQuery extends Query { + private Long groupId; + private Long resourceId; + private Long appId; + private String name; + private String path; + private String contentType; + private Integer status; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Integer queryApply; + private Integer ifMarket; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java b/srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java new file mode 100644 index 0000000..20aaa03 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java @@ -0,0 +1,20 @@ +package net.srt.query; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.common.query.Query; + +/** + * @ClassName : DataServiceApiLogQuery + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Schema(description = "api日志") +public class DataServiceApiLogQuery extends Query { + private String ip; + private String apiName; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java b/srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java new file mode 100644 index 0000000..991679c --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java @@ -0,0 +1,47 @@ +package net.srt.service; + +import cn.hutool.http.server.HttpServerResponse; +import net.srt.dto.SqlDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.BaseService; +import net.srt.query.ApiConfigQuery; +import net.srt.vo.ApiConfigVo; +import net.srt.vo.DataServiceApiAuthVo; +import srt.cloud.framework.dbswitch.core.model.JdbcSelectResult; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +public interface ApiConfigService extends BaseService { + String getIpPort(); + + PageResult page(ApiConfigQuery query); + + void save(ApiConfigVo vo); + + void update(ApiConfigVo vo); + + void delete(List idList); + + PageResult pageResource(ApiConfigQuery query); + + List listActiveByGroupId(Long id); + + void online(Long id); + + void offline(Long id); + + String ipPort(); + + JdbcSelectResult sqlExecute(SqlDto dto); + + void exportDocs(List ids, HttpServletResponse response); + + void upAuth(DataServiceApiAuthVo authVO); + + DataServiceApiAuthVo getAuthInfo(Long authId); + + void resetRequested(Long authId); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java b/srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java new file mode 100644 index 0000000..58c0d64 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java @@ -0,0 +1,18 @@ +package net.srt.service; + +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.utils.TreeNodeVo; +import net.srt.framework.mybatis.service.BaseService; +import net.srt.vo.ApiGroupVo; + +import java.util.List; + +public interface ApiGroupService extends BaseService { + List listTree(); + + void save(ApiGroupVo vo); + + void update(ApiGroupVo vo); + + void delete(Long id); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiAuthService.java b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiAuthService.java new file mode 100644 index 0000000..5394c03 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiAuthService.java @@ -0,0 +1,10 @@ +package net.srt.service; + +/** + * @ClassName : DataServiceApiAuthService + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:23 + */ +public interface DataServiceApiAuthService { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java new file mode 100644 index 0000000..fedf1df --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java @@ -0,0 +1,21 @@ +package net.srt.service; + +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.BaseService; +import net.srt.query.DataServiceApiLogQuery; +import net.srt.vo.DataServiceApiLogVo; + +import java.util.List; + +/** + * @ClassName : DataServiceApiLogService + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:31 + */ +public interface DataServiceApiLogService extends BaseService { + PageResult dataPageList(DataServiceApiLogQuery query); + + void removeId(List idList); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceAppService.java b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceAppService.java index d0c4606..96b0bdc 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceAppService.java +++ b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceAppService.java @@ -4,6 +4,7 @@ import net.srt.entity.DataServiceAppEntity; import net.srt.framework.common.page.PageResult; import net.srt.framework.mybatis.service.BaseService; import net.srt.query.DataServiceAppQuery; +import net.srt.vo.DataServiceApiAuthVo; import net.srt.vo.DataServiceAppVo; import java.util.List; @@ -23,9 +24,11 @@ public interface DataServiceAppService extends BaseService void delete(List idList); - void addAuth(DataServiceAppVo authVO); + void addAuth(DataServiceApiAuthVo authVO); - void upAuth(DataServiceAppVo authVO); + void upAuth(DataServiceApiAuthVo authVO); void cancelAuth(Long authId); + + String tokenGenerate(String appKey, String appSecret); } diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java new file mode 100644 index 0000000..67474b2 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java @@ -0,0 +1,287 @@ +package net.srt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import net.srt.api.ServerNames; +import net.srt.convert.ApiConfigConvert; +import net.srt.convert.DataServiceApiAuthConvert; +import net.srt.dao.ApiConfigDao; +import net.srt.dao.ApiGroupDao; +import net.srt.dao.DataServiceApiAuthDao; +import net.srt.dto.SqlDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.entity.ApiGroupEntity; +import net.srt.entity.DataServiceApiAuthEntity; +import net.srt.framework.common.constant.Constant; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.framework.security.user.SecurityUser; +import net.srt.query.ApiConfigQuery; +import net.srt.service.ApiConfigService; +import net.srt.vo.ApiConfigVo; +import net.srt.vo.DataServiceApiAuthVo; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; +import srt.cloud.framework.dbswitch.common.util.StringUtil; +import srt.cloud.framework.dbswitch.core.model.JdbcSelectResult; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Service +@AllArgsConstructor +public class ApiConfigServiceImpl extends BaseServiceImpl implements ApiConfigService { + private final ApiGroupDao apiGroupDao; + private final DiscoveryClient discoveryClient; + private final ApiConfigDao apiConfigDao; + private final DataServiceApiAuthDao dataServiceApiAuthDao; + private final Map mappings = new ConcurrentHashMap<>(); + @Override + public String getIpPort() { + List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + return instances.get(0).getHost() + ":" + instances.get(0).getPort()+"/data-service/api/"; + } + + + + + public void online(Long id) { + ApiConfigEntity apiConfigEntity = apiConfigDao.getById(id); + if (apiConfigEntity != null) { + apiConfigEntity.setStatus(1); + apiConfigEntity.setReleaseTime(new Date()); + apiConfigEntity.setReleaseUserId(SecurityUser.getUserId()); + String routeKey = getRouteKeyByRequestTypeAndUrl(apiConfigEntity.getType(), apiConfigEntity.getPath()); + boolean isExists = checkIfExists(routeKey); + + if (isExists) { + ApiConfigEntity configEntity = mappings.get(routeKey); + if (configEntity != null) { // 添加 null 判断 + offline(configEntity.getId()); // 修正方法调用为传入id + // 从 mappings 中移除该 routeKey + mappings.remove(routeKey); + } + } else { + mappings.put(routeKey, apiConfigEntity); + } + apiConfigDao.updateById(apiConfigEntity); + } + } + + private boolean checkIfExists(String routeKey) { + // 这里是全局的 mappings + Map globalMappings = getGlobalMappings(); + + return globalMappings.containsKey(routeKey); + } + + private Map getGlobalMappings() { + return mappings; + } + + private String getRouteKeyByRequestTypeAndUrl(String type, String path) { + return getRouteKey(type, path); + } + + private String getRouteKey(String type, String path) { + return type.toUpperCase() + "_" + path.toLowerCase(); + } + + @Override + public void offline(Long id) { // 修正参数类型为 Long id + ApiConfigEntity apiConfigEntity = apiConfigDao.getById(id); + if (apiConfigEntity != null) { + apiConfigEntity.setStatus(0); + apiConfigEntity.setReleaseTime(null); + apiConfigEntity.setReleaseUserId(null); + apiConfigDao.updateById(apiConfigEntity); + }else{ + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Resource not found"); + } + } + // @Override +// public void online(Long id) { +// ApiConfigEntity apiConfigEntity = new ApiConfigEntity(); +// apiConfigEntity.setId(id); +// apiConfigEntity.setStatus(1); +// apiConfigEntity.setReleaseTime(new Date()); +// apiConfigEntity.setReleaseUserId(SecurityUser.getUserId()); +// +// apiConfigDao.updateById(apiConfigEntity); +// } + + @Override + public String ipPort() { + List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + return instances.get(0).getHost() + ":" + instances.get(0).getPort(); + } + + @Override + public JdbcSelectResult sqlExecute(SqlDto dto) { + return null; + } + + @Override + public void exportDocs(List ids, HttpServletResponse response) { + List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + ServiceInstance instance = instances.get(0); + StringBuilder docs = new StringBuilder("## 接口文档\n---\n"); + List apiConfigEntities = baseMapper.selectBatchIds(ids); + for (ApiConfigEntity api : apiConfigEntities) { + docs.append("### ").append(api.getName()) + .append("\n- IP地址:").append(instance.getHost()) + .append("\n- 端口:").append(instance.getPort()) + .append("\n- 接口地址:/data-service/api/").append(api.getPath()) + .append("\n- 请求方式:").append(api.getType()) + .append("\n- Content-Type:").append(api.getContentType()) + .append("\n- 是否需要鉴权:").append(api.getPrivates() == 1 ? "是" : "否"); + if (api.getPrivates() == 1) { + docs.append("\n- 获取鉴权token:").append("/data-service/api/token/generate?appKey=您的appKey&appSecret=您的appToken"); + } + docs.append("\n- 接口备注:").append(api.getNote()) + .append("\n- 请求参数示例:").append("\n```json\n").append(StringUtil.isNotBlank(api.getJsonParam()) ? api.getJsonParam() : "{}").append("\n```\n") + .append("\n- 响应结果示例:").append("\n```json\n").append(StringUtil.isNotBlank(api.getResponseResult()) ? api.getResponseResult() : "{\"code\":0,\"msg\":\"success\",\"data\":[]}").append("\n```\n") + .append("\n---\n"); + } + response.setContentType("application/x-msdownload;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment; filename=API DOCS.md"); + OutputStream os = null; + try { + os = response.getOutputStream(); + os.write(docs.toString().getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public void upAuth(DataServiceApiAuthVo authVO) { + dataServiceApiAuthDao.updateById(DataServiceApiAuthConvert.INSTANCE.convert(authVO)); + } + + @Override + public DataServiceApiAuthVo getAuthInfo(Long authId) { + return DataServiceApiAuthConvert.INSTANCE.convert(dataServiceApiAuthDao.selectById(authId)); + } + + @Override + public void resetRequested(Long authId) { + dataServiceApiAuthDao.resetRequested(authId); + } + + + @Override + public PageResult page(ApiConfigQuery query) { + // 查询参数 + Map params = getParams(query); + // 分页查询 + query.setOrder("dsac.id"); + IPage page = getPage(query); + params.put(Constant.PAGE, page); + // 数据列表 + List list = baseMapper.getAuthList(params); + return new PageResult<>(ApiConfigConvert.INSTANCE.convertList(list), page.getTotal()); + } + private LambdaQueryWrapper getWrapper(ApiConfigQuery query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtil.isNotBlank(query.getName()), ApiConfigEntity::getName, query.getName()); + wrapper.like(StringUtil.isNotBlank(query.getPath()), ApiConfigEntity::getPath, query.getPath()); + wrapper.eq(StringUtil.isNotBlank(query.getContentType()), ApiConfigEntity::getContentType, query.getContentType()); + wrapper.eq(query.getStatus()!= null, ApiConfigEntity::getStatus, query.getStatus()); + wrapper.eq(query.getSqlDbType() != null, ApiConfigEntity::getSqlDbType, query.getSqlDbType()); + wrapper.eq(query.getDatabaseId()!= null, ApiConfigEntity::getDatabaseId, query.getDatabaseId()); + wrapper.eq(query.getPrivates()!= null, ApiConfigEntity::getPrivates, query.getPrivates()); + wrapper.eq(query.getOpenTrans()!= null, ApiConfigEntity::getOpenTrans, query.getOpenTrans()); + dataScopeWithoutOrgId(wrapper); + wrapper.orderByDesc(ApiConfigEntity::getCreateTime); + wrapper.orderByDesc(ApiConfigEntity::getId); + return wrapper; + } + + @Override + public void save(ApiConfigVo vo) { + ApiConfigEntity entity = ApiConfigConvert.INSTANCE.convert(vo); + entity.setProjectId(getProjectId()); + baseMapper.insert(entity); + } + + @Override + public void update(ApiConfigVo vo) { + ApiConfigEntity entity = ApiConfigConvert.INSTANCE.convert(vo); + entity.setProjectId(getProjectId()); + updateById(entity); + } + + @Override + public void delete(List idList) { + removeByIds(idList); + } + + @Override + public PageResult pageResource(ApiConfigQuery query) { + // 查询参数 + Map params = getParams(query); + IPage page = getPage(query); + params.put(Constant.PAGE, page); + // 数据列表 + List list = baseMapper.getResourceList(params); + List apiConfigVos = ApiConfigConvert.INSTANCE.convertList(list); + for (ApiConfigVo apiConfigVo : apiConfigVos) { + ApiGroupEntity groupEntity = apiGroupDao.selectById(apiConfigVo.getGroupId()); + apiConfigVo.setGroup(groupEntity != null ? groupEntity.getPath() : null); + } + return new PageResult<>(apiConfigVos, page.getTotal()); + + } + + @Override + public List listActiveByGroupId(Long id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ApiConfigEntity::getStatus, 1).eq(ApiConfigEntity::getGroupId, id).orderByDesc(ApiConfigEntity::getId); + dataScopeWithoutOrgId(wrapper); + return baseMapper.selectList(wrapper); + } + + private Map getParams(ApiConfigQuery query) { + Map params = new HashMap<>(); + params.put("ifMarket", query.getIfMarket()); + params.put("queryApply", query.getQueryApply()); + if (query.getQueryApply() != null && query.getQueryApply() == 1) { + params.put("userId", SecurityUser.getUserId()); + } + params.put("resourceId", query.getResourceId()); + params.put("groupId", query.getGroupId()); + params.put("appId", query.getAppId()); + params.put("name", query.getName()); + params.put("path", query.getPath()); + params.put("contentType", query.getContentType()); + params.put("status", query.getStatus()); + params.put("sqlDbType", query.getSqlDbType()); + params.put("databaseId", query.getDatabaseId()); + params.put("privates", query.getPrivates()); + params.put("openTrans", query.getOpenTrans()); + // 数据权限 + params.put(Constant.DATA_SCOPE, getDataScope("dsac", null, null, "project_id", false, true)); + + return params; + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java new file mode 100644 index 0000000..778f75d --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java @@ -0,0 +1,140 @@ +package net.srt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.AllArgsConstructor; +import net.srt.constants.ApiGroupType; +import net.srt.convert.ApiGroupConvert; +import net.srt.dao.ApiGroupDao; +import net.srt.entity.ApiConfigEntity; +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.exception.ServerException; +import net.srt.framework.common.utils.BeanUtil; +import net.srt.framework.common.utils.BuildTreeUtils; +import net.srt.framework.common.utils.TreeNodeVo; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.service.ApiConfigService; +import net.srt.service.ApiGroupService; +import net.srt.vo.ApiGroupVo; +import org.springframework.stereotype.Service; +import srt.cloud.framework.dbswitch.common.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +@Service +@AllArgsConstructor +public class ApiGroupServiceImpl extends BaseServiceImpl implements ApiGroupService{ + private final ApiConfigService apiConfigService; + /** + * 获取API分组树形结构列表 + * @return API分组树形结构列表 + */ + @Override + public List listTree() { + // 查询所有API分组实体对象,并转换为树节点VO对象列表 + List treeNodeVos = getTreeNodeVos(); + // 构建树形结构,并返回根节点列表 + return BuildTreeUtils.buildTree(treeNodeVos); + } + + /** + * 获取API分组树节点VO对象列表 + * @return API分组树节点VO对象列表 + */ + private List getTreeNodeVos() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + dataScopeWithoutOrgId(wrapper); // 加入数据权限过滤 + wrapper.orderByAsc(ApiGroupEntity::getOrderNo); // 按orderNo升序排序 + List apiGroupEntities = baseMapper.selectList(wrapper); + // 将实体对象列表转换为VO对象列表 + return BeanUtil.copyListProperties(apiGroupEntities, TreeNodeVo::new, (oldItem, newItem) -> { + // 设置节点名称 + newItem.setLabel(oldItem.getName()); + // 设置节点值 + newItem.setValue(oldItem.getId()); + newItem.setDisabled(oldItem.getType() == 1); // 如果是虚拟节点,设置禁用状态 + if (newItem.getPath().contains("/")) { // 设置父级节点路径 + newItem.setParentPath(newItem.getPath().substring(0, newItem.getPath().lastIndexOf("/"))); + } + }); + } + + /** + * 新增API分组 + * @param vo API分组VO对象 + */ + @Override + public void save(ApiGroupVo vo) { + // 将VO对象转换为实体对象 + ApiGroupEntity entity = ApiGroupConvert.INSTANCE.convert(vo); + // 递归生成路径 + entity.setPath(recursionPath(entity, null)); + // 设置项目ID + entity.setProjectId(getProjectId()); + // 执行插入操作 + baseMapper.insert(entity); // 使用 insertSelective() 方法进行插入操作 + } + + /** + * 更新API分组 + * @param vo API分组VO对象 + */ + @Override + public void update(ApiGroupVo vo) { + // 将VO对象转换为实体对象 + ApiGroupEntity entity = ApiGroupConvert.INSTANCE.convert(vo); + // 递归生成路径 + entity.setPath(recursionPath(entity, null)); + // 设置项目ID + entity.setProjectId(getProjectId()); + // 执行更新操作 + updateById(entity); + } + + /** + * 递归生成API分组路径 + * @param groupEntity 分组实体对象 + * @param path 父级路径 + * @return 完整路径 + */ + //1 + private String recursionPath(ApiGroupEntity groupEntity, String path) { + if (StringUtil.isBlank(path)) { + // 如果路径为空,则将路径设置为组实体的名称 + path = groupEntity.getName(); + } + if (groupEntity.getParentId() != 0) { + // 如果组实体的父ID不为0 + // 查询父级组实体 + ApiGroupEntity parent = getById(groupEntity.getParentId()); // 通过父ID获取父级组实体 + path = parent.getName() + "/" + path; // 将父级组实体的名称与当前路径拼接起来,中间以斜杠分隔 + return recursionPath(parent, path); // 递归调用recursionPath方法,传入父级组实体和拼接后的路径 + } + return path; + } + + /** + * 根据ID删除API分组 + * @param id API分组ID + */ + @Override + public void delete(Long id) { + // 查询是否存在子节点 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ApiGroupEntity::getParentId, id).last(" limit 1"); + ApiGroupEntity one = baseMapper.selectOne(wrapper); + if (one != null) { + throw new ServerException("存在子节点,不允许删除!"); + } + // 查询是否有API配置与之关联 + LambdaQueryWrapper serviceApiConfigWrapper = new LambdaQueryWrapper<>(); + serviceApiConfigWrapper.eq(ApiConfigEntity::getGroupId, id).last(" limit 1"); + ApiConfigEntity apiConfigEntity = apiConfigService.getOne(serviceApiConfigWrapper); + if (apiConfigEntity != null) { + throw new ServerException("节点下有 api 与之关联,不允许删除!"); + } + // 执行删除操作 + removeById(id); + } + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiAuthServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiAuthServiceImpl.java new file mode 100644 index 0000000..89d511e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiAuthServiceImpl.java @@ -0,0 +1,10 @@ +package net.srt.service.impl; + +/** + * @ClassName : DataServiceApiAuthServiceImpl + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:23 + */ +public class DataServiceApiAuthServiceImpl { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java new file mode 100644 index 0000000..058f65a --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java @@ -0,0 +1,51 @@ +package net.srt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import net.srt.convert.DataServiceApiLogConvert; +import net.srt.dao.DataServiceApiLogDao; +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.query.DataServiceApiLogQuery; +import net.srt.service.DataServiceApiLogService; +import net.srt.vo.DataServiceApiLogVo; +import org.springframework.stereotype.Service; +import srt.cloud.framework.dbswitch.common.util.StringUtil; + +import java.util.List; + +/** + * @ClassName : DataServiceApiLogServiceImpl + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:31 + */ +@Service +@AllArgsConstructor +public class DataServiceApiLogServiceImpl extends BaseServiceImpl implements DataServiceApiLogService { + @Override + public PageResult dataPageList(DataServiceApiLogQuery query) { + IPage page = baseMapper.selectPage(getPage(query), getWrapper(query)); + + return new PageResult<>(DataServiceApiLogConvert.INSTANCE.convertList(page.getRecords()), page.getTotal()); + } + + @Override + public void removeId(List idList) { + removeByIds(idList); + } + + private LambdaQueryWrapper getWrapper(DataServiceApiLogQuery query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtil.isNotBlank(query.getIp()), DataServiceApiLogEntity::getIp, query.getIp()) + .like(StringUtil.isNotBlank(query.getApiName()), DataServiceApiLogEntity::getApiName, query.getApiName()) + .orderByDesc(DataServiceApiLogEntity::getCreateTime).orderByDesc(DataServiceApiLogEntity::getId); + dataScopeWithoutOrgId(wrapper); + return wrapper; + } + + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceAppServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceAppServiceImpl.java index a4e251c..3a268b6 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceAppServiceImpl.java +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceAppServiceImpl.java @@ -4,8 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; +import net.srt.convert.DataServiceApiAuthConvert; import net.srt.convert.DataServiceAppConvert; +import net.srt.dao.ApiConfigDao; +import net.srt.dao.DataServiceApiAuthDao; import net.srt.dao.DataServiceAppDao; +import net.srt.dto.AppToken; +import net.srt.entity.DataServiceApiAuthEntity; import net.srt.entity.DataServiceAppEntity; import net.srt.framework.common.exception.ServerException; import net.srt.framework.common.page.PageResult; @@ -13,7 +18,9 @@ import net.srt.framework.mybatis.service.impl.BaseServiceImpl; import net.srt.framework.security.user.SecurityUser; import net.srt.query.DataServiceAppQuery; import net.srt.service.DataServiceAppService; +import net.srt.vo.DataServiceApiAuthVo; import net.srt.vo.DataServiceAppVo; +import org.apache.commons.lang.RandomStringUtils; import org.springframework.stereotype.Service; import srt.cloud.framework.dbswitch.common.util.StringUtil; @@ -30,6 +37,8 @@ import java.util.List; @AllArgsConstructor public class DataServiceAppServiceImpl extends BaseServiceImpl implements DataServiceAppService { private final DataServiceAppDao dataServiceAppDao; + private final ApiConfigDao apiConfigDao; + private final DataServiceApiAuthDao dataServiceApiAuthDao; @Override public PageResult page(DataServiceAppQuery query) { IPage page=baseMapper.selectPage(getPage(query),null); @@ -44,6 +53,7 @@ public class DataServiceAppServiceImpl extends BaseServiceImpl wrapper = Wrappers.lambdaQuery(); + wrapper.eq(DataServiceAppEntity::getAppKey,appKey).last("limit 1"); + DataServiceAppEntity dataServiceAppEntity = baseMapper.selectOne(wrapper); + if (dataServiceAppEntity==null){ + throw new RuntimeException("appKey不存在"); + } + if (!appSecret.equals(dataServiceAppEntity.getAppSecret())){ + throw new ServerException("appSecret错误"); + } + //生成token + String token = RandomStringUtils.random(32, true, true); + AppToken appToken = new AppToken(); + appToken.setToken(token); + appToken.setAppKey(appKey); + appToken.setAppId(dataServiceAppEntity.getId()); + if (dataServiceAppEntity.getExpireDuration()==0){ + appToken.setExpireAt(0L); + } else if (dataServiceAppEntity.getExpireDuration()== -1) { + appToken.setExpireAt(-1L); + }else if (dataServiceAppEntity.getExpireDuration()>0){ + long l = System.currentTimeMillis() + dataServiceAppEntity.getExpireDuration() * 1000; + appToken.setExpireAt(l); + } + return appToken.getToken(); } -// private LambdaQueryWrapper getWrapper(DataServiceAppQuery query) { -// LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); -// wrapper.like(StringUtil.isNotBlank(query.getName()), DataServiceAppEntity::getName, query.getName()) -// .eq(DataServiceAppEntity::getIfMarket, query.getIfMarket() != null ? query.getIfMarket() : 0) -// .eq(query.getIfMarket() != null, DataServiceAppEntity::getCreator, SecurityUser.getUserId()) -// .eq(StringUtil.isNotBlank(query.getAppKey()), DataServiceAppEntity::getAppKey, query.getAppKey()) -// .orderByDesc(DataServiceAppEntity::getCreateTime).orderByDesc(DataServiceAppEntity::getId); -// return wrapper; -// } + private LambdaQueryWrapper getWrapper(DataServiceAppQuery query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtil.isNotBlank(query.getName()), DataServiceAppEntity::getName, query.getName()) + .eq(DataServiceAppEntity::getIfMarket, query.getIfMarket() != null ? query.getIfMarket() : 0) + .eq(query.getIfMarket() != null, DataServiceAppEntity::getCreator, SecurityUser.getUserId()) + .eq(StringUtil.isNotBlank(query.getAppKey()), DataServiceAppEntity::getAppKey, query.getAppKey()) + .orderByDesc(DataServiceAppEntity::getCreateTime).orderByDesc(DataServiceAppEntity::getId); + return wrapper; + } } diff --git a/srt-cloud-data-service/src/main/java/net/srt/utils/EncrypDES.java b/srt-cloud-data-service/src/main/java/net/srt/utils/EncrypDES.java new file mode 100644 index 0000000..939f75c --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/utils/EncrypDES.java @@ -0,0 +1,145 @@ +package net.srt.utils; + +import javax.crypto.Cipher; +import java.security.Key; + +/** + * @ClassName : EncrypDES + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 09:31 + */ +public class EncrypDES { + + // 字符串默认键值 + private static String strDefaultKey = "inventec2020@#$%^&"; + + //加密工具 + private Cipher encryptCipher = null; + + // 解密工具 + private Cipher decryptCipher = null; + + /** + * 默认构造方法,使用默认密钥 + */ + public EncrypDES() throws Exception { + this(strDefaultKey); + } + + /** + * 指定密钥构造方法 + * @param strKey 指定的密钥 + * @throws Exception + */ + + public EncrypDES(String strKey) throws Exception { + + // Security.addProvider(new com.sun.crypto.provider.SunJCE()); + Key key = getKey(strKey.getBytes()); + encryptCipher = Cipher.getInstance("DES"); + encryptCipher.init(Cipher.ENCRYPT_MODE, key); + decryptCipher = Cipher.getInstance("DES"); + decryptCipher.init(Cipher.DECRYPT_MODE, key); + } + + /** + * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813,和public static byte[] + * + * hexStr2ByteArr(String strIn) 互为可逆的转换过程 + * + * @param arrB 需要转换的byte数组 + * @return 转换后的字符串 + * @throws Exception 本方法不处理任何异常,所有异常全部抛出 + */ + public static String byteArr2HexStr(byte[] arrB) throws Exception { + int iLen = arrB.length; + // 每个byte用2个字符才能表示,所以字符串的长度是数组长度的2倍 + StringBuffer sb = new StringBuffer(iLen * 2); + for (int i = 0; i < iLen; i++) { + int intTmp = arrB[i]; + // 把负数转换为正数 + while (intTmp < 0) { + intTmp = intTmp + 256; + } + // 小于0F的数需要在前面补0 + if (intTmp < 16) { + sb.append("0"); + } + sb.append(Integer.toString(intTmp, 16)); + } + return sb.toString(); + } + + /** + * 将表示16进制值的字符串转换为byte数组,和public static String byteArr2HexStr(byte[] arrB) + * 互为可逆的转换过程 + * @param strIn 需要转换的字符串 + * @return 转换后的byte数组 + */ + public static byte[] hexStr2ByteArr(String strIn) throws Exception { + byte[] arrB = strIn.getBytes(); + int iLen = arrB.length; + // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2 + byte[] arrOut = new byte[iLen / 2]; + for (int i = 0; i < iLen; i = i + 2) { + String strTmp = new String(arrB, i, 2); + arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16); + } + return arrOut; + } + + /** + * + * 加密字节数组 + * @param arrB 需加密的字节数组 + * @return 加密后的字节数组 + */ + public byte[] encrypt(byte[] arrB) throws Exception { + return encryptCipher.doFinal(arrB); + } + + /** + * 加密字符串 + * @param strIn 需加密的字符串 + * @return 加密后的字符串 + */ + public String encrypt(String strIn) throws Exception { + return byteArr2HexStr(encrypt(strIn.getBytes())); + } + + /** + * 解密字节数组 + * @param arrB 需解密的字节数组 + * @return 解密后的字节数组 + */ + public byte[] decrypt(byte[] arrB) throws Exception { + return decryptCipher.doFinal(arrB); + } + + /** + * 解密字符串 + * @param strIn 需解密的字符串 + * @return 解密后的字符串 + */ + public String decrypt(String strIn) throws Exception { + return new String(decrypt(hexStr2ByteArr(strIn))); + } + + /** + * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位 + * @param arrBTmp 构成该字符串的字节数组 + * @return 生成的密钥 + */ + private Key getKey(byte[] arrBTmp) throws Exception { + // 创建一个空的8位字节数组(默认值为0) + byte[] arrB = new byte[8]; + // 将原始字节数组转换为8位 + for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) { + arrB[i] = arrBTmp[i]; + } + // 生成密钥 + Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES"); + return key; + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java new file mode 100644 index 0000000..78b59cd --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java @@ -0,0 +1,56 @@ +package net.srt.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** +* 数据服务-api配置 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@Data +public class ApiConfigVo implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + private Long groupId; + private String path; + private String type; + private String name; + private String note; + private String sqlText; + private String sqlSeparator; + private Integer sqlMaxRow; + private String sqlParam; + private String jsonParam; + private String responseResult; + private String contentType; + private Integer status; + private Date releaseTime; + private Long releaseUserId; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Long projectId; + private Integer version; + private Integer deleted; + private Long creator; + private Date createTime; + private Long updater; + private Date updateTime; + private Integer requestedTimes; + private Integer requestedSuccessTimes; + private Integer requestedFailedTimes; + private Long authId; + private String group; + private String groupPath; + private Integer previlege; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java new file mode 100644 index 0000000..4193587 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java @@ -0,0 +1,25 @@ +package net.srt.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class ApiGroupVo implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + private Long parentId; + private Integer type; + private String name; + private String description; + private Integer orderNo; + private String path; + private Long projectId; + private Integer version; + private Integer deleted; + private Long creator; + private Date createTime; + private Long updater; + private Date updateTime; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiAuthVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiAuthVo.java index bd53d79..be2a7ff 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiAuthVo.java +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiAuthVo.java @@ -19,33 +19,35 @@ import java.util.Date; public class DataServiceApiAuthVo implements Serializable { private static final long serialVersionUID = 1L; - @Schema(description = "主键id") + @Schema(description = "id") private Long id; - @Schema(description = "app的id") + @Schema(description = "appId") private Long appId; - @Schema(description = "分组id") + @Schema(description = "groupId") private Long groupId; - @Schema(description = "api的id") + @Schema(description = "apiId") private Long apiId; - @Schema(description = "调用次数 不限次数为-1") + @Schema(description = "调用的次数:不限次数为-1") private Integer requestTimes; - @Schema(description = "已调用次数") + @Schema(description = "已调次数") private Integer requestedTimes; private Integer requestedSuccessTimes; private Integer requestedFailedTimes; - @Schema(description = "所属项目id") + @Schema(description = "所属项目的id") private Long projectId; + private Long authId; + @Schema(description = "版本号") private Integer version; - @Schema(description = "删除标识 0:正常 1:已删除") + @Schema(description = "删除标识 0是正常 1是已删除") private Integer deleted; @Schema(description = "创建者") diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java new file mode 100644 index 0000000..0c338e3 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java @@ -0,0 +1,72 @@ +package net.srt.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName : DataServiceApiLog + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:05 + */ +@Data +@Schema(description = "api请求日志") +public class DataServiceApiLogVo implements Serializable { + private static final long serialVersionUID = 1L; + + + @Schema(description = "主键id") + private Long id; + + @Schema(description = "url") + private String url; + + @Schema(description = "响应状态码") + private Integer status; + + @Schema(description = "时长") + private Long duration; + + @Schema(description = "IP地址") + private String ip; + + @Schema(description = "app的id") + private String appId; + + @Schema(description = "api的id") + private String apiId; + + private String appName; + private String apiName; + + @Schema(description = "错误信息") + private String error; + + @Schema(description = "项目id") + private Long projectId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "删除标识 0:正常 1:已删除") + private Integer deleted; + + @Schema(description = "创建者") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新者") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java new file mode 100644 index 0000000..d79c064 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java @@ -0,0 +1,73 @@ +package net.srt.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @BelongsProject: data-center + * @BelongsPackage: net.srt.vo + * @Author: yanqiang + * @CreateTime: 2023-12-24 15:21 + */ + +@Data +@Schema(description = "api日志") +public class ServiceApiLogVo implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "主键id") + private Long id; + + @Schema(description = "url") + private String url; + + @Schema(description = "响应状态码") + private Integer status; + + @Schema(description = "时长") + private Long duration; + + @Schema(description = "IP地址") + private String ip; + + @Schema(description = "app的id") + private String appId; + + @Schema(description = "api的id") + private String apiId; + + private String appName; + private String apiName; + + @Schema(description = "错误信息") + private String error; + + @Schema(description = "项目id") + private Long projectId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "删除标识 0:正常 1:已删除") + private Integer deleted; + + @Schema(description = "创建者") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新者") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java new file mode 100644 index 0000000..ce741cd --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java @@ -0,0 +1,70 @@ +package net.srt.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @BelongsProject: data-center + * @BelongsPackage: net.srt.vo + * @Author: yanqiang + * @CreateTime: 2023-12-21 20:50 + */ + +@Data +@Schema(description = "数据app") +public class ServiceAppVo implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "主键id") + private Long id; + + @Schema(description = "名称") + private String name; + + @Schema(description = "备注") + private String note; + + @Schema(description = "appKey") + private String appKey; + + @Schema(description = "appSecret") + private String appSecret; + + @Schema(description = "过期时间") + private String expireDesc; + /** + * 过期时间 -1永久;0 单次失效;> 0 失效时间 + */ + private Long expireDuration; + private Integer ifMarket; + + @Schema(description = "项目id") + private Long projectId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "0:正常 1:已删除") + private Integer deleted; + + @Schema(description = "创建人") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新人") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; + + +} diff --git a/srt-cloud-data-service/src/main/resources/bootstrap.yml b/srt-cloud-data-service/src/main/resources/bootstrap.yml index 8cb2c5d..2b9a36d 100644 --- a/srt-cloud-data-service/src/main/resources/bootstrap.yml +++ b/srt-cloud-data-service/src/main/resources/bootstrap.yml @@ -14,8 +14,8 @@ spring: nacos: discovery: server-addr: 101.34.77.101:8848 - # 命名空间,默认:public - namespace: 09dff3e2-9790-4d4f-beb6-9baeb01ae040 + # 命名空间,默认:public、 + namespace: 9de208a6-cb30-41ae-a880-78196c99c050 service: ${spring.application.name} group: srt2.0 config: diff --git a/srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml b/srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml new file mode 100644 index 0000000..7e54245 --- /dev/null +++ b/srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml @@ -0,0 +1,90 @@ + + + + + + update data_service_api_config set auth_id=#{apiId} where id=#{id} + + + update data_service_api_config set auth_id=null where auth_id=#{authId} + + + + + diff --git a/srt-cloud-data-service/src/main/resources/mapper/DataServiceApiAuthMapper.xml b/srt-cloud-data-service/src/main/resources/mapper/DataServiceApiAuthMapper.xml new file mode 100644 index 0000000..e97cdab --- /dev/null +++ b/srt-cloud-data-service/src/main/resources/mapper/DataServiceApiAuthMapper.xml @@ -0,0 +1,11 @@ + + + + + + + UPDATE data_service_api_auth SET requested_times=0,requested_success_times=0,requested_failed_times=0 WHERE id =#{id} + + diff --git a/srt-cloud-data-service/src/main/resources/mapper/DataServiceAppMapper.xml b/srt-cloud-data-service/src/main/resources/mapper/DataServiceAppMapper.xml index 6271392..9a6fdde 100644 --- a/srt-cloud-data-service/src/main/resources/mapper/DataServiceAppMapper.xml +++ b/srt-cloud-data-service/src/main/resources/mapper/DataServiceAppMapper.xml @@ -5,7 +5,7 @@ - + + + diff --git a/srt-cloud-framework/srt-cloud-flink/build/app/flink-app-1.14-2.0.0-jar-with-dependencies.jar b/srt-cloud-framework/srt-cloud-flink/build/app/flink-app-1.14-2.0.0-jar-with-dependencies.jar index 125a9ef..48c09f7 100644 Binary files a/srt-cloud-framework/srt-cloud-flink/build/app/flink-app-1.14-2.0.0-jar-with-dependencies.jar and b/srt-cloud-framework/srt-cloud-flink/build/app/flink-app-1.14-2.0.0-jar-with-dependencies.jar differ diff --git a/srt-cloud-framework/srt-cloud-flink/build/extends/flink-catalog-mysql-1.14-2.0.0.jar b/srt-cloud-framework/srt-cloud-flink/build/extends/flink-catalog-mysql-1.14-2.0.0.jar index 8c6d86f..877ce62 100644 Binary files a/srt-cloud-framework/srt-cloud-flink/build/extends/flink-catalog-mysql-1.14-2.0.0.jar and b/srt-cloud-framework/srt-cloud-flink/build/extends/flink-catalog-mysql-1.14-2.0.0.jar differ diff --git a/srt-cloud-framework/srt-cloud-flink/build/extends/flink-client-1.14-2.0.0.jar b/srt-cloud-framework/srt-cloud-flink/build/extends/flink-client-1.14-2.0.0.jar index f8ecd96..74d52ea 100644 Binary files a/srt-cloud-framework/srt-cloud-flink/build/extends/flink-client-1.14-2.0.0.jar and b/srt-cloud-framework/srt-cloud-flink/build/extends/flink-client-1.14-2.0.0.jar differ diff --git a/srt-cloud-framework/srt-cloud-mybatis/src/main/java/net/srt/framework/mybatis/service/impl/BaseServiceImpl.java b/srt-cloud-framework/srt-cloud-mybatis/src/main/java/net/srt/framework/mybatis/service/impl/BaseServiceImpl.java index 89a427e..077c62b 100644 --- a/srt-cloud-framework/srt-cloud-mybatis/src/main/java/net/srt/framework/mybatis/service/impl/BaseServiceImpl.java +++ b/srt-cloud-framework/srt-cloud-mybatis/src/main/java/net/srt/framework/mybatis/service/impl/BaseServiceImpl.java @@ -198,13 +198,20 @@ public class BaseServiceImpl, T> extends ServiceImpl queryWrapper) { - DataScope dataScope = getDataScope(null, null, null, null, false, true); - if (dataScope != null) { - queryWrapper.apply(dataScope.getSqlFilter()); - } - } +// protected void dataScopeWithoutOrgId(LambdaQueryWrapper queryWrapper) { +// DataScope dataScope = getDataScope(null, null, null, null, false, true); +// if (dataScope != null) { +// queryWrapper.apply(dataScope.getSqlFilter()); +// } +// } + protected void dataScopeWithoutOrgId(LambdaQueryWrapper queryWrapper) { + DataScope dataScope = this.getDataScope((String)null, (String)null, (String)null, (String)null, false, true); + if (dataScope != null) { + queryWrapper.apply(dataScope.getSqlFilter(), new Object[0]); + } + + } /** * MyBatis-Plus 数据权限 */ diff --git a/srt-cloud-framework/srt-cloud-security/src/main/java/net/srt/framework/security/config/SecurityFilterConfig.java b/srt-cloud-framework/srt-cloud-security/src/main/java/net/srt/framework/security/config/SecurityFilterConfig.java index 78f6a23..329a8c1 100644 --- a/srt-cloud-framework/srt-cloud-security/src/main/java/net/srt/framework/security/config/SecurityFilterConfig.java +++ b/srt-cloud-framework/srt-cloud-security/src/main/java/net/srt/framework/security/config/SecurityFilterConfig.java @@ -40,7 +40,6 @@ public class SecurityFilterConfig { .and().authorizeRequests() .antMatchers(permits).permitAll() .antMatchers(HttpMethod.OPTIONS).permitAll() - .antMatchers("/datax/**").permitAll() .anyRequest().authenticated() .and().exceptionHandling().authenticationEntryPoint(new SecurityAuthenticationEntryPoint()) .and().headers().frameOptions().disable() diff --git a/srt-cloud-module/srt-cloud-datax-service/src/main/resources/bootstrap.yml b/srt-cloud-module/srt-cloud-datax-service/src/main/resources/bootstrap.yml index 4d5aac0..9158606 100644 --- a/srt-cloud-module/srt-cloud-datax-service/src/main/resources/bootstrap.yml +++ b/srt-cloud-module/srt-cloud-datax-service/src/main/resources/bootstrap.yml @@ -11,7 +11,7 @@ spring: discovery: server-addr: 101.34.77.101:8848 # 命名空间,默认:public - namespace: 7e1e997d-5fa4-4f84-9f48-3e0adf830a37 + namespace: 9de208a6-cb30-41ae-a880-78196c99c050 service: ${spring.application.name} group: srt2.0 config: diff --git a/srt-cloud-module/srt-cloud-datax/pom.xml b/srt-cloud-module/srt-cloud-datax/pom.xml index 4ccd30a..5ba3ab9 100644 --- a/srt-cloud-module/srt-cloud-datax/pom.xml +++ b/srt-cloud-module/srt-cloud-datax/pom.xml @@ -101,11 +101,11 @@ - - com.alibaba.datax - mysqlreader - 0.0.1-SNAPSHOT - + + + + + @@ -117,11 +117,11 @@ - - com.alibaba.datax - oraclereader - 0.0.1-SNAPSHOT - + + + + + diff --git a/srt-cloud-module/srt-cloud-datax/src/main/resources/bootstrap.yml b/srt-cloud-module/srt-cloud-datax/src/main/resources/bootstrap.yml index 3a1e9f5..d13af5e 100644 --- a/srt-cloud-module/srt-cloud-datax/src/main/resources/bootstrap.yml +++ b/srt-cloud-module/srt-cloud-datax/src/main/resources/bootstrap.yml @@ -11,7 +11,7 @@ spring: discovery: server-addr: 101.34.77.101:8848 # 命名空间,默认:public - namespace: 7e1e997d-5fa4-4f84-9f48-3e0adf830a37 + namespace: 9de208a6-cb30-41ae-a880-78196c99c050 service: ${spring.application.name} group: srt2.0 config: diff --git a/srt-cloud-module/srt-cloud-message/src/main/resources/bootstrap.yml b/srt-cloud-module/srt-cloud-message/src/main/resources/bootstrap.yml index af0321c..0efb72e 100644 --- a/srt-cloud-module/srt-cloud-message/src/main/resources/bootstrap.yml +++ b/srt-cloud-module/srt-cloud-message/src/main/resources/bootstrap.yml @@ -11,7 +11,7 @@ spring: discovery: server-addr: 101.34.77.101:8848 # 命名空间,默认:public - namespace: 7e1e997d-5fa4-4f84-9f48-3e0adf830a37 + namespace: 9de208a6-cb30-41ae-a880-78196c99c050 service: ${spring.application.name} group: srt2.0 config: diff --git a/srt-cloud-module/srt-cloud-quartz/pom.xml b/srt-cloud-module/srt-cloud-quartz/pom.xml index 63bf9b5..6a5a577 100644 --- a/srt-cloud-module/srt-cloud-quartz/pom.xml +++ b/srt-cloud-module/srt-cloud-quartz/pom.xml @@ -1,14 +1,14 @@ - - net.srt - srt-cloud-module - 2.0.0 - - 4.0.0 - srt-cloud-quartz - jar + + net.srt + srt-cloud-module + 2.0.0 + + 4.0.0 + srt-cloud-quartz + jar - + net.srt srt-cloud-api @@ -36,41 +36,41 @@ - - net.srt - srt-cloud-mybatis - 2.0.0 - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - com.github.xiaoymin - knife4j-springdoc-ui - - - org.quartz-scheduler - quartz - net.srt - srt-cloud-datax + srt-cloud-mybatis + 2.0.0 + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + com.github.xiaoymin + knife4j-springdoc-ui + + + org.quartz-scheduler + quartz + + + net.srt + srt-cloud-api 2.0.0 - - - + + + org.codehaus.mojo appassembler-maven-plugin @@ -170,35 +170,36 @@ + + + + + + + + + + + + + + + + + + + + - maven-assembly-plugin + org.apache.maven.plugins + maven-surefire-plugin - - ${project.parent.parent.basedir}/assembly/assembly-win.xml - ${project.parent.parent.basedir}/assembly/assembly-linux.xml - + true - - - make-assembly - package - - single - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - + + diff --git a/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/QuartzApplication.java b/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/QuartzApplication.java index fae1f2b..43a6de6 100644 --- a/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/QuartzApplication.java +++ b/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/QuartzApplication.java @@ -14,7 +14,6 @@ import org.springframework.context.annotation.ComponentScan; @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication -@ComponentScan(basePackages = "net.srt.framework.common.cache") public class QuartzApplication { public static void main(String[] args) { diff --git a/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/quartz/api/QuartzDataAccessApiImpl.java b/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/quartz/api/QuartzDataAccessApiImpl.java index 485e7a1..2d6f660 100644 --- a/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/quartz/api/QuartzDataAccessApiImpl.java +++ b/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/quartz/api/QuartzDataAccessApiImpl.java @@ -8,7 +8,6 @@ import net.srt.api.module.data.integrate.dto.DataAccessDto; import net.srt.api.module.data.integrate.dto.DataAccessTaskDto; import net.srt.api.module.quartz.QuartzDataAccessApi; import net.srt.api.module.quartz.constant.QuartzJobType; -import net.srt.datax.feign.DataAccessFeign; import net.srt.framework.common.utils.Result; import net.srt.quartz.entity.ScheduleJobEntity; import net.srt.quartz.enums.JobGroupEnum; @@ -32,7 +31,6 @@ public class QuartzDataAccessApiImpl implements QuartzDataAccessApi { private final Scheduler scheduler; private final DataAccessApi dataAccessApi; private final ScheduleJobService jobService; - private final DataAccessFeign feign; @Override public Result releaseAccess(Long id) { @@ -53,24 +51,48 @@ public class QuartzDataAccessApiImpl implements QuartzDataAccessApi { return Result.ok(); } + /** + * 手动运行任务 + * @param id 任务ID + * @return 运行结果 + */ @Override public Result handRun(Long id) { + // 构建任务实体 ScheduleJobEntity jobEntity = buildJobEntity(id); + // 设置任务为单例,且不保存日志 jobEntity.setOnce(true); jobEntity.setSaveLog(false); + // 执行任务 ScheduleUtils.run(scheduler, jobEntity); + // 返回运行结果 return Result.ok(); } + + /** + * 根据id构建调度任务实体 + * @param id 调度任务id + * @return 调度任务实体 + */ private ScheduleJobEntity buildJobEntity(Long id) { DataAccessDto dataAccessDto = dataAccessApi.getById(id).getData(); - if (dataAccessDto.getIsDatax().equals("datax")){ - feign.execute(dataAccessDto); - } - return ScheduleJobEntity.builder().isDatax(dataAccessDto.getIsDatax()).typeId(id).projectId(dataAccessDto.getProjectId()).jobType(QuartzJobType.DATA_ACCESS.getValue()).jobName(String.format("[%s]%s", id.toString(), dataAccessDto.getTaskName())).concurrent(ScheduleConcurrentEnum.NO.getValue()) - .beanName("dataAccessTask").method("run").jobGroup(JobGroupEnum.DATA_ACCESS.getValue()).saveLog(true).cronExpression(dataAccessDto.getCron()).status(ScheduleStatusEnum.NORMAL.getValue()) - .params(String.valueOf(id)).once(TaskType.ONE_TIME_FULL_SYNC.getCode().equals(dataAccessDto.getTaskType())).build(); - + return ScheduleJobEntity.builder() + .typeId(id) + .projectId(dataAccessDto.getProjectId()) + .jobType(QuartzJobType.DATA_ACCESS.getValue()) + .jobName(String.format("[%s]%s", id.toString(), dataAccessDto.getTaskName())) + .concurrent(ScheduleConcurrentEnum.NO.getValue()) + .beanName("dataAccessTask") + .method("run") + .jobGroup(JobGroupEnum.DATA_ACCESS.getValue()) + .saveLog(true) + .cronExpression(dataAccessDto.getCron()) + .status(ScheduleStatusEnum.NORMAL.getValue()) + .params(String.valueOf(id)) + .once(TaskType.ONE_TIME_FULL_SYNC.getCode().equals(dataAccessDto.getTaskType())) + .build(); } + } diff --git a/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/quartz/utils/ScheduleUtils.java b/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/quartz/utils/ScheduleUtils.java index 326d74c..f322aa2 100644 --- a/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/quartz/utils/ScheduleUtils.java +++ b/srt-cloud-module/srt-cloud-quartz/src/main/java/net/srt/quartz/utils/ScheduleUtils.java @@ -1,6 +1,5 @@ package net.srt.quartz.utils; -import net.srt.datax.feign.DataAccessFeign; import net.srt.framework.common.exception.ServerException; import net.srt.quartz.entity.ScheduleJobEntity; import net.srt.quartz.enums.ScheduleConcurrentEnum; diff --git a/srt-cloud-module/srt-cloud-quartz/src/main/resources/bootstrap.yml b/srt-cloud-module/srt-cloud-quartz/src/main/resources/bootstrap.yml index 7de59f1..4de246b 100644 --- a/srt-cloud-module/srt-cloud-quartz/src/main/resources/bootstrap.yml +++ b/srt-cloud-module/srt-cloud-quartz/src/main/resources/bootstrap.yml @@ -11,7 +11,7 @@ spring: discovery: server-addr: 101.34.77.101:8848 # 命名空间,默认:public - namespace: 7e1e997d-5fa4-4f84-9f48-3e0adf830a37 + namespace: 9de208a6-cb30-41ae-a880-78196c99c050 service: ${spring.application.name} group: srt2.0 config: diff --git a/srt-cloud-system/src/main/resources/bootstrap.yml b/srt-cloud-system/src/main/resources/bootstrap.yml index aeb7ad8..112c84e 100644 --- a/srt-cloud-system/src/main/resources/bootstrap.yml +++ b/srt-cloud-system/src/main/resources/bootstrap.yml @@ -14,7 +14,7 @@ spring: discovery: server-addr: 101.34.77.101:8848 # 命名空间,默认:public - namespace: 7e1e997d-5fa4-4f84-9f48-3e0adf830a37 + namespace: 9de208a6-cb30-41ae-a880-78196c99c050 service: ${spring.application.name} group: srt2.0 config: diff --git a/srt-data-development/src/main/java/net/srt/DevelopmentApp.java b/srt-data-development/src/main/java/net/srt/DevelopmentApp.java index cd75f8b..e3bd2cf 100644 --- a/srt-data-development/src/main/java/net/srt/DevelopmentApp.java +++ b/srt-data-development/src/main/java/net/srt/DevelopmentApp.java @@ -9,6 +9,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; import java.util.List; @@ -16,6 +17,7 @@ import static com.alibaba.druid.sql.SQLUtils.toSQLString; @EnableDiscoveryClient @SpringBootApplication +@EnableFeignClients @MapperScan("net.srt.Fink.mapper") @MapperScan("net.srt.Hadoop.mapper") @MapperScan("net.srt.disposition.mapper") diff --git a/srt-data-development/src/main/java/net/srt/disposition/controller/DataCheckSqlController.java b/srt-data-development/src/main/java/net/srt/disposition/controller/DataCheckSqlController.java new file mode 100644 index 0000000..33ced52 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/controller/DataCheckSqlController.java @@ -0,0 +1,85 @@ +package net.srt.disposition.controller; + +import io.swagger.v3.oas.annotations.Operation; +import lombok.AllArgsConstructor; +import net.srt.disposition.dto.DataCheckSqlDto; +import net.srt.disposition.dto.DataSqlDto; +import net.srt.disposition.entity.DataCentre; +import net.srt.disposition.entity.DataCheckSqlEntity; +import net.srt.disposition.entity.DevelopmentOperationalRecordsQuery; +import net.srt.disposition.service.DataCenterService; +import net.srt.disposition.service.DataCheckSqlService; +import net.srt.disposition.vo.*; +import net.srt.flink.common.result.SqlExplainResult; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@AllArgsConstructor +@RequestMapping("/task") +public class DataCheckSqlController { + + private DataCheckSqlService dataCheckSqlService; + + private DataCenterService dataCenterService; + + @PostMapping + public Result add(@RequestBody DataCheckSqlDto dataCheckSqlDto){ + dataCheckSqlService.add(dataCheckSqlDto); + return Result.ok(); + } + + @GetMapping("/history/page") + public Result> historyPage(@RequestBody DevelopmentOperationalRecordsQuery query){ + PageResult dataCentrePageResult= dataCenterService.dataCenterService(query); + return Result.ok(dataCentrePageResult); + } + + @DeleteMapping("/history") + @Operation(summary = "运维中心删除") + public Result> deleted(@RequestBody List ids){ + dataCenterService.deleted(ids); + return Result.ok(); + } + + @GetMapping("/env-list") + @Operation(summary = "运维中心删除") + public Result> envList(){ + List developmentTaskSaveVos = dataCenterService.listEnvList(); + return Result.ok(developmentTaskSaveVos); + } + + @GetMapping("/console-log") + public Result consoleLog(){ + return Result.ok(dataCheckSqlService.getLog()); + } + @GetMapping("/clear-log") + public Result checkLog(){ + dataCheckSqlService.clearLog(); + return Result.ok(); + } + + @PostMapping("/explain-sql") + public Result> explainSql(@RequestBody DataSqlDto dataSqlDto){ + List dataSqlVo=dataCheckSqlService.explainSql(dataSqlDto); + return Result.ok(dataSqlVo); + } + + @PostMapping("/execute-sql") + public Result executeSql(@RequestBody DataSqlDto dataSqlDto){ + DataCheckVo dataSqlVo=dataCheckSqlService.executeSql(dataSqlDto); + return Result.ok(dataSqlVo); + } + + + + @GetMapping("/{id}") + public Result get(@PathVariable Integer id) { + DataCheckSqlEntity dataCheckSqlEntity = dataCheckSqlService.find(id); + return Result.ok(dataCheckSqlEntity); + } +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/controller/DataProductionTreeController.java b/srt-data-development/src/main/java/net/srt/disposition/controller/DataProductionTreeController.java index 4d40d05..e8f226a 100644 --- a/srt-data-development/src/main/java/net/srt/disposition/controller/DataProductionTreeController.java +++ b/srt-data-development/src/main/java/net/srt/disposition/controller/DataProductionTreeController.java @@ -26,7 +26,7 @@ public class DataProductionTreeController { } @PostMapping - public Result add(@RequestBody DataProductionTreeDto dataProductionTreeDto){ + public Result add(@RequestBody DataProductionTreeDto dataProductionTreeDto){ dataProductionService.add(dataProductionTreeDto); return Result.ok(); } diff --git a/srt-data-development/src/main/java/net/srt/disposition/convert/DataCentreConvert.java b/srt-data-development/src/main/java/net/srt/disposition/convert/DataCentreConvert.java new file mode 100644 index 0000000..d54cebe --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/convert/DataCentreConvert.java @@ -0,0 +1,18 @@ +package net.srt.disposition.convert; + +import net.srt.disposition.entity.DataCentre; +import net.srt.disposition.vo.DevelopmentTaskSaveVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface DataCentreConvert { + + DataCentreConvert INSTANCE = Mappers.getMapper(DataCentreConvert.class); + + List convertList(List records); + + List convert(List entities); +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/convert/DataCheckSqlConvert.java b/srt-data-development/src/main/java/net/srt/disposition/convert/DataCheckSqlConvert.java new file mode 100644 index 0000000..ed427ec --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/convert/DataCheckSqlConvert.java @@ -0,0 +1,13 @@ +package net.srt.disposition.convert; + +import net.srt.disposition.dto.DataCheckSqlDto; +import net.srt.disposition.entity.DataCheckSqlEntity; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface DataCheckSqlConvert { + DataCheckSqlConvert INSTANCE = Mappers.getMapper(DataCheckSqlConvert.class); + + DataCheckSqlEntity convert(DataCheckSqlDto dataCheckSqlDto); +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/dto/DataCheckSqlDto.java b/srt-data-development/src/main/java/net/srt/disposition/dto/DataCheckSqlDto.java new file mode 100644 index 0000000..f3775cd --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/dto/DataCheckSqlDto.java @@ -0,0 +1,24 @@ +package net.srt.disposition.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.srt.disposition.entity.DataDatabaseDevEntity; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.List; + +@Data +public class DataCheckSqlDto { + private String alias; + private Long catalogueId; + private Long databaseId; + private List databaseList; + private Integer dialect; + private Long id; + private String name; + private Integer openTrans; + private Integer pvdataNum; + private Integer sqlDbType; + private String statement; +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/dto/DataSqlDto.java b/srt-data-development/src/main/java/net/srt/disposition/dto/DataSqlDto.java new file mode 100644 index 0000000..08e1ac8 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/dto/DataSqlDto.java @@ -0,0 +1,59 @@ +package net.srt.disposition.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.srt.disposition.entity.DataDatabaseDevEntity; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.List; + +@Data +public class DataSqlDto { + private Long alertGroupId; + private String alias; + private String batchModel; + private String checkPoint; + private Long clusterConfigurationId; + private Long clusterId; + private String configJson; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date creatTime; + private String creator; + private Long databaseId; + private List databaseList; + private String deleted; + private Integer dialect; + private String enabled; + private Long envId; + private String fragment; + private Long id; + private Long jarId; + private Long jobInstanceId; + private String jobName; + private Integer maxRowNum; + private String name; + private String note; + private Integer parallelism; + private boolean processEnd; + private Long projectId; + private Integer pvdataNum; + private String savePointPath; + private String savePointStrategy; + private Integer sqlDbType; + private String statement; + private String statementSet; + private String step; + private Integer taskId; + private String type; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date updateTime; + private String updater; + private String usrAutoCancel; + private String usrChangeLog; + private String userResult; + private String version; + private Long versionId; +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/dto/DataSqlSaveDto.java b/srt-data-development/src/main/java/net/srt/disposition/dto/DataSqlSaveDto.java new file mode 100644 index 0000000..5eb25f4 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/dto/DataSqlSaveDto.java @@ -0,0 +1,23 @@ +package net.srt.disposition.dto; + +import lombok.Data; +import net.srt.disposition.entity.DataDatabaseDevEntity; + +import java.util.List; + +@Data +public class DataSqlSaveDto { + private String alias; + private Integer catalogueId; + private Integer databaseId; + private List databaseList; + private Integer dialect; + private Integer id; + private String name; + private Integer openTrans; + private boolean processEnd; + private Integer pvdataNum; + private Integer sqlDbType; + private String statement; + +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/entity/DataCentre.java b/srt-data-development/src/main/java/net/srt/disposition/entity/DataCentre.java new file mode 100644 index 0000000..0742b52 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/entity/DataCentre.java @@ -0,0 +1,58 @@ +package net.srt.disposition.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@TableName("data_centre") +public class DataCentre { + private Long id; + private Long projectId; + private Integer sqlDbType; + private Long databaseId; + private Long clusterId; + private Long clusterConfigurationId; + private String session; + private Long jobId; + private String jobName; + private String jobManagerAddress; + private Integer status; + private Integer dialect; + private String type; + private String statement; + private String error; + private String result; + private String configJson; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date startTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date endTime; + private Long taskId; + private String executeType; + private Long scheduleId; + private Long scheduleRecordId; + private Long scheduleNodeRecordId; + private Integer version; + private Integer deleted; + private String creator; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date updateTime;@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date finishTime; + private String instanceStatus; + private String executeSql; + private String executeNo; + private String jib; + private Integer duration; + +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/entity/DataCheckSqlEntity.java b/srt-data-development/src/main/java/net/srt/disposition/entity/DataCheckSqlEntity.java new file mode 100644 index 0000000..0e309ae --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/entity/DataCheckSqlEntity.java @@ -0,0 +1,58 @@ +package net.srt.disposition.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@TableName("data_check_sql") +public class DataCheckSqlEntity { + private Long id; + @TableId + private Long taskId; + private String name; + private Long projectId; + private String alias; + private Integer dialect; + private String type; + private Integer checkPoint; + private Integer savePointStrategy; + private String savePointPath; + private Integer parallelism; + private Boolean fragment; + private Boolean statementSet; + private Boolean batchModel; + private Long clusterId; + private Long clusterConfigurationId; + private Integer sqlDbType; + private Long databaseId; + private Integer openTrans; + private Long jarId; + private Long envId; + private Long alertGroupId; + private String configJson; + private String note; + private Integer step; + private Long jobInstanceId; + private Boolean useAutoCancel; + private Boolean useChangeLog; + private Boolean useResult; + private Integer pvdataNum; + private Boolean enabled; + private Long versionId; + private Integer version; + private Integer deleted; + private Long creator; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + private Long updater; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + private String statement; +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/entity/DataDatabaseDevEntity.java b/srt-data-development/src/main/java/net/srt/disposition/entity/DataDatabaseDevEntity.java new file mode 100644 index 0000000..c528f23 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/entity/DataDatabaseDevEntity.java @@ -0,0 +1,42 @@ +package net.srt.disposition.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.mybatis.entity.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +public class DataDatabaseDevEntity { + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + private String creator; + private String databaseDocument; + private String databaseIndex; + private String databaseIp; + private String databaseKafka; + private String databaseName; + private String databasePort; + private Integer databaseType; + private Integer deleted; + private Long id; + private String isJdbc; + private String isRtApprove; + private String jdbcUrl; + private String name; + private String noReReason; + private String password; + private Integer projectId; + private Integer status; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date updateTime; + private String updater; + private String userName; + private Integer version; + +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/entity/DevelopmentOperationalRecordsQuery.java b/srt-data-development/src/main/java/net/srt/disposition/entity/DevelopmentOperationalRecordsQuery.java new file mode 100644 index 0000000..17d93e4 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/entity/DevelopmentOperationalRecordsQuery.java @@ -0,0 +1,71 @@ +package net.srt.disposition.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.common.query.Query; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@Schema(description = "数据开发-运维中心查询") +public class DevelopmentOperationalRecordsQuery extends Query { + + + @Schema(description = "调度节点记录唯一标识符") + private Long nodeRecordId; + + @Schema(description = "记录标识符") + private Long recordId; + + @Schema(description = "任务唯一标识符") + private Long taskId; + + @Schema(description = "作业名称") + private String jobName; + + @Schema(description = "执行状态") + private Integer status; + + @Schema(description = "实例状态") + private String instanceStatus; + + @Schema(description = "方言") + private Integer dialect; + + @Schema(description = "类型") + private String type; + + @Schema(description = "SQL数据库类型") + private String sqlDbType; + + @Schema(description = "数据库唯一标识符") + private Long databaseId; + + @Schema(description = "集群唯一标识符") + private Integer clusterId; + + @Schema(description = "集群配置唯一标识符") + private Long clusterConfigurationId; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + + @Schema(description = "执行完成时间戳") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date finishTime; + + +} + diff --git a/srt-data-development/src/main/java/net/srt/disposition/mapper/DataCentreMapper.java b/srt-data-development/src/main/java/net/srt/disposition/mapper/DataCentreMapper.java new file mode 100644 index 0000000..bfe1352 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/mapper/DataCentreMapper.java @@ -0,0 +1,7 @@ +package net.srt.disposition.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.srt.disposition.entity.DataCentre; + +public interface DataCentreMapper extends BaseMapper { +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/mapper/DataCheckSqlMapper.java b/srt-data-development/src/main/java/net/srt/disposition/mapper/DataCheckSqlMapper.java new file mode 100644 index 0000000..d7b04e1 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/mapper/DataCheckSqlMapper.java @@ -0,0 +1,9 @@ +package net.srt.disposition.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.srt.disposition.entity.DataCheckSqlEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DataCheckSqlMapper extends BaseMapper { +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/mapper/DataProductionMapper.java b/srt-data-development/src/main/java/net/srt/disposition/mapper/DataProductionMapper.java index 15c512c..0b1c1b8 100644 --- a/srt-data-development/src/main/java/net/srt/disposition/mapper/DataProductionMapper.java +++ b/srt-data-development/src/main/java/net/srt/disposition/mapper/DataProductionMapper.java @@ -2,6 +2,8 @@ package net.srt.disposition.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import net.srt.disposition.entity.DataProductionTreeEntity; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface DataProductionMapper extends BaseMapper { } diff --git a/srt-data-development/src/main/java/net/srt/disposition/mapper/DispositionMapper.java b/srt-data-development/src/main/java/net/srt/disposition/mapper/DispositionMapper.java index cc3cb28..d7cf138 100644 --- a/srt-data-development/src/main/java/net/srt/disposition/mapper/DispositionMapper.java +++ b/srt-data-development/src/main/java/net/srt/disposition/mapper/DispositionMapper.java @@ -2,6 +2,8 @@ package net.srt.disposition.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import net.srt.disposition.entity.DispositionEntity; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface DispositionMapper extends BaseMapper { } diff --git a/srt-data-development/src/main/java/net/srt/disposition/service/DataCenterService.java b/srt-data-development/src/main/java/net/srt/disposition/service/DataCenterService.java new file mode 100644 index 0000000..6983cf7 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/service/DataCenterService.java @@ -0,0 +1,19 @@ +package net.srt.disposition.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.srt.disposition.entity.DataCentre; +import net.srt.disposition.entity.DevelopmentOperationalRecordsQuery; +import net.srt.disposition.vo.DevelopmentTaskSaveVo; +import net.srt.framework.common.page.PageResult; + +import java.util.List; + +public interface DataCenterService extends IService { + PageResult dataCenterService(DevelopmentOperationalRecordsQuery query); + + void deleted(List ids); + + List listEnvList(); + + +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/service/DataCheckSqlService.java b/srt-data-development/src/main/java/net/srt/disposition/service/DataCheckSqlService.java new file mode 100644 index 0000000..bda4f2e --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/service/DataCheckSqlService.java @@ -0,0 +1,32 @@ +package net.srt.disposition.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.srt.disposition.dto.DataCheckSqlDto; +import net.srt.disposition.dto.DataSqlDto; +import net.srt.disposition.entity.DataCentre; +import net.srt.disposition.entity.DataCheckSqlEntity; +import net.srt.disposition.vo.DataCheckSqlVo; +import net.srt.disposition.vo.DataCheckVo; +import net.srt.disposition.vo.DataSqlVo; +import net.srt.disposition.vo.LogVo; +import net.srt.flink.common.result.SqlExplainResult; +import net.srt.framework.common.page.PageResult; + +import java.util.List; + +public interface DataCheckSqlService extends IService { + DataCheckSqlEntity find(Integer id); + + void add(DataCheckSqlDto dataCheckSqlDto); + + List explainSql(DataSqlDto dataSqlDto); + + DataCheckVo executeSql(DataSqlDto dataSqlDto); + + LogVo getLog(); + + void clearLog(); + + + +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/service/impl/DataCenterServiceImpl.java b/srt-data-development/src/main/java/net/srt/disposition/service/impl/DataCenterServiceImpl.java new file mode 100644 index 0000000..225db47 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/service/impl/DataCenterServiceImpl.java @@ -0,0 +1,68 @@ +package net.srt.disposition.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import net.srt.disposition.convert.DataCentreConvert; +import net.srt.disposition.entity.DataCentre; +import net.srt.disposition.entity.DevelopmentOperationalRecordsQuery; +import net.srt.disposition.mapper.DataCentreMapper; +import net.srt.disposition.service.DataCenterService; +import net.srt.disposition.vo.DevelopmentTaskSaveVo; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@AllArgsConstructor +public class DataCenterServiceImpl extends BaseServiceImpl implements DataCenterService { + + @Override + public PageResult dataCenterService(DevelopmentOperationalRecordsQuery query) { + IPage page=baseMapper.selectPage(getPage(query),getWrapper(query)); + + return new PageResult<>(DataCentreConvert.INSTANCE.convertList(page.getRecords()),page.getTotal()); + } + + @Override + public void deleted(List ids) { + removeByIds(ids); + for (Long id : ids) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(DataCentre::getId,id); + baseMapper.delete(wrapper); + } + + } + + @Override + public List listEnvList() { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + List entities = baseMapper.selectList(wrapper); + List developmentTaskSaveVos = DataCentreConvert.INSTANCE.convert(entities); + return developmentTaskSaveVos; + } + + private LambdaQueryWrapper getWrapper(DevelopmentOperationalRecordsQuery query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(query.getNodeRecordId()!=null,DataCentre::getScheduleNodeRecordId,query.getNodeRecordId()); + wrapper.eq(query.getTaskId()!=null,DataCentre::getTaskId,query.getTaskId()); + wrapper.like(StringUtils.isNotBlank(query.getJobName()),DataCentre::getJobName,query.getJobName()); + wrapper.eq(query.getStatus()!=null,DataCentre::getStatus,query.getStatus()); + wrapper.eq(query.getInstanceStatus()!=null,DataCentre::getInstanceStatus,query.getInstanceStatus()); + wrapper.eq(query.getDialect()!=null,DataCentre::getDialect,query.getDialect()); + wrapper.eq(StringUtils.isNotBlank(query.getSqlDbType()),DataCentre::getSqlDbType,query.getSqlDbType()); + wrapper.eq(query.getDatabaseId()!=null,DataCentre::getDatabaseId,query.getDatabaseId()); + wrapper.eq(query.getClusterId()!=null,DataCentre::getClusterId,query.getClusterId()); + wrapper.eq(query.getClusterConfigurationId()!=null,DataCentre::getClusterConfigurationId,query.getClusterConfigurationId()); + wrapper.gt(query.getStartTime()!=null,DataCentre::getStartTime,query.getStartTime()); + wrapper.lt(query.getEndTime()!=null,DataCentre::getEndTime,query.getEndTime()); + wrapper.eq(query.getFinishTime()!=null,DataCentre::getFinishTime,query.getFinishTime()); + + return wrapper; + } +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/service/impl/DataCheckSqlServiceImpl.java b/srt-data-development/src/main/java/net/srt/disposition/service/impl/DataCheckSqlServiceImpl.java new file mode 100644 index 0000000..5af9fb8 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/service/impl/DataCheckSqlServiceImpl.java @@ -0,0 +1,380 @@ +package net.srt.disposition.service.impl; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import lombok.AllArgsConstructor; +import net.srt.disposition.convert.DataCheckSqlConvert; +import net.srt.disposition.dto.DataCheckSqlDto; +import net.srt.disposition.dto.DataSqlDto; +import net.srt.disposition.entity.DataCentre; +import net.srt.disposition.entity.DataCheckSqlEntity; +import net.srt.disposition.entity.DataDatabaseDevEntity; +import net.srt.disposition.entity.DataProductionTreeEntity; +import net.srt.disposition.mapper.DataCentreMapper; +import net.srt.disposition.mapper.DataCheckSqlMapper; +import net.srt.disposition.mapper.DataProductionMapper; +import net.srt.disposition.service.DataCheckSqlService; +import net.srt.disposition.vo.DataCheckVo; +import net.srt.disposition.vo.LogVo; +import net.srt.disposition.vo.Result; +import net.srt.flink.common.result.SqlExplainResult; +import net.srt.flink.common.utils.LogUtil; +import net.srt.flink.process.context.ProcessContextHolder; +import net.srt.flink.process.model.ProcessEntity; +import net.srt.flink.process.model.ProcessStatus; +import net.srt.flink.process.model.ProcessStep; +import net.srt.flink.process.model.ProcessType; +import net.srt.flink.process.pool.ConsolePool; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.framework.security.cache.TokenStoreCache; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import srt.cloud.framework.dbswitch.common.type.ProductTypeEnum; + +import javax.servlet.http.HttpServletRequest; +import java.sql.*; +import java.time.LocalDateTime; +import java.util.*; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Service +@AllArgsConstructor +public class DataCheckSqlServiceImpl extends BaseServiceImpl implements DataCheckSqlService { + + private DataProductionMapper dataProductionMapper; + private TokenStoreCache storeCache; + private DataCentreMapper dataCentreMapper; + private HttpServletRequest request; + @Override + public DataCheckSqlEntity find(Integer id) { + DataCheckSqlEntity dataCheckSqlEntity = baseMapper.selectById(id); + return dataCheckSqlEntity; + } + + @Override + public void add(DataCheckSqlDto dataCheckSqlDto) { + DataCheckSqlEntity convert = DataCheckSqlConvert.INSTANCE.convert(dataCheckSqlDto); + convert.setTaskId(dataCheckSqlDto.getCatalogueId()); + DataProductionTreeEntity dataProductionTreeEntity = new DataProductionTreeEntity(); + dataProductionTreeEntity.setId(dataCheckSqlDto.getCatalogueId()); + dataProductionTreeEntity.setTaskId(dataCheckSqlDto.getCatalogueId()); + dataProductionMapper.updateById(dataProductionTreeEntity); + baseMapper.insert(convert); + } + + @Override + public List explainSql(DataSqlDto dataSqlDto) { + ProcessEntity process = BuildStes(dataSqlDto); + // 初始化一个列表,用于存储SQL解析结果 + List sqlExplainResults = new ArrayList<>(); + // 初始化一个变量,用于存储当前正在处理的SQL语句 + String current = null; + // 记录SQL验证开始的日志 + process.info("Start check sql..."); + + try { + // 使用SQLUtils将输入的SQL解析为SQL语句列表 + List stmtList = SQLUtils.parseStatements(dataSqlDto.getStatement(), "SqlServer"); + + // 遍历列表中的每个SQL语句 + for (SQLStatement item : stmtList) { + // 设置当前正在处理的SQL语句,以便记录日志 + current = item.toString(); + + // 获取SQL语句的类型(例如,SELECT、INSERT)并添加到结果列表中 + String type = item.getClass().getSimpleName(); + SqlExplainResult success = SqlExplainResult.success(type, current, null); + sqlExplainResults.add(success); + } + + // 记录SQL正确的日志消息 + process.info("Sql is correct."); + + } catch (Exception e) { + // 如果在SQL解析过程中发生异常,将失败的结果添加到列表中 + SqlExplainResult fail = SqlExplainResult.fail(current, LogUtil.getError(e)); + sqlExplainResults.add(fail); + + String error = LogUtil.getError(e); + // 记录错误消息 + process.error(error); + } + + // 返回SQL解析结果列表 + return sqlExplainResults; + } + + @Override + public DataCheckVo executeSql(DataSqlDto dataSqlDto) { + DataCheckVo dataCheckVo=null; + try { + dataCheckVo = selectColumns(dataSqlDto); + dataCheckVo.setEndTime(new Date()); + + //构建运维数据 + DataCentre operationalRecordsEntity= getDataCentre(dataCheckVo,dataSqlDto); + + //添加到运维作业表中 + dataCentreMapper.insert(operationalRecordsEntity); + } catch (Exception e) { + throw new RuntimeException(e); + } + return dataCheckVo; + } + + private DataCentre getDataCentre(DataCheckVo exeCuteSql, DataSqlDto dto) { + + DataCentre operationalRecords = new DataCentre(); + //获取租户id\项目id + Long projectId = storeCache.getProjectId(getAccessToken1()); + + operationalRecords.setProjectId(projectId); + operationalRecords.setSqlDbType(dto.getSqlDbType()); + operationalRecords.setDatabaseId(dto.getDatabaseId()); + operationalRecords.setJobName(dto.getJobName()); + operationalRecords.setStatement(dto.getStatement()); + operationalRecords.setExecuteType(dto.getBatchModel()); + Result result = exeCuteSql.getResult(); + List results = result.getResults(); + String Result= ""; + for (Result resultsDTO : results) { + Result=resultsDTO.getRowData().toString(); + } + operationalRecords.setResult(Result); + operationalRecords.setEndTime(new Date()); + operationalRecords.setStartTime(new Date()); + operationalRecords.setTaskId(dto.getId()); + operationalRecords.setCreateTime(new Date()); + operationalRecords.setExecuteNo(UUID.randomUUID().toString()); + operationalRecords.setDuration(0); + return operationalRecords; + } + + public String getAccessToken1() { + String accessToken = request.getHeader("Authorization"); + if (StringUtils.isBlank(accessToken)) { + accessToken = request.getParameter("access_token"); + } + return accessToken; + } + + public DataCheckVo selectColumns(DataSqlDto dto) throws Exception{ + + //获取数据库信息 + List databaseList = dto.getDatabaseList(); + DataDatabaseDevEntity databaseVO = new DataDatabaseDevEntity(); + for (DataDatabaseDevEntity dataDatabaseVO : databaseList) { + if(dto.getDatabaseId().equals(dataDatabaseVO.getId())){ + databaseVO.setId(dataDatabaseVO.getId()); + databaseVO.setDatabaseName(dataDatabaseVO.getDatabaseName()); + databaseVO.setDatabaseIp(dataDatabaseVO.getDatabaseIp()); + databaseVO.setDatabasePort(dataDatabaseVO.getDatabasePort()); + databaseVO.setUserName(dataDatabaseVO.getUserName()); + databaseVO.setPassword(dataDatabaseVO.getPassword()); + databaseVO.setDatabaseType(dataDatabaseVO.getDatabaseType()); + databaseVO.setJdbcUrl(dataDatabaseVO.getJdbcUrl()); + databaseVO.setVersion(dataDatabaseVO.getVersion()); + databaseVO.setCreateTime(dataDatabaseVO.getCreateTime()); + databaseVO.setUpdateTime(dataDatabaseVO.getUpdateTime()); + databaseVO.setDeleted(dataDatabaseVO.getDeleted()); + databaseVO.setCreator(dataDatabaseVO.getCreator()); + databaseVO.setUpdater(dataDatabaseVO.getUpdater()); + } + } + //日志对象构建 + ProcessEntity process= BuildStes(dto); + + DataCheckVo exeCuteSql = new DataCheckVo(); + List sqlExplainResults = new ArrayList<>(); + String current = null; + try { + // 记录SQL验证开始的日志 + process.info("Start execute sql..."); + + if(databaseVO.getDatabaseType().equals(ProductTypeEnum.MYSQL.getIndex())){ + String className = ProductTypeEnum.MYSQL.getDriveClassName(); + + //1. 注册驱动 + try { + Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + // 获取数据库连接 + try (Connection conn = DriverManager.getConnection(databaseVO.getJdbcUrl(), databaseVO.getUserName(), databaseVO.getPassword())) { + // 获取表名 + String dtoStatement = dto.getStatement(); + String tableName = getTableName(dtoStatement); + + // 获取数据库操作对象 + try (Statement statement = conn.createStatement()) { + String sql = "SHOW COLUMNS FROM " + tableName; + + // 获取列名并存储在一个列表中 + List columnNames = new ArrayList<>(); + try (ResultSet selectColumnNames = statement.executeQuery(sql)) { + while (selectColumnNames.next()) { + String columnName = selectColumnNames.getString("Field"); + columnNames.add(columnName); + System.out.println("列名: " + columnName); + } + } + // 获取表中数据 + try (ResultSet row = statement.executeQuery(dtoStatement)) { + // 创建集合用于存储查询结果 + List> resultList = new ArrayList<>(); + + // 处理查询结果 + while (row.next()) { + // 创建一个 Map 用于存储每一行的数据 + Map rowData = new HashMap<>(); + + // 遍历字段名列表,获取每个字段对应的值,并存储到 Map 中 + for (String columnName : columnNames) { + Object value = row.getObject(columnName); + rowData.put(columnName, value); + } + // 将 Map 添加到集合中 + resultList.add(rowData); + } + Result resultsDTO=BuildResultsDTO(columnNames,resultList,dto); + exeCuteSql.setResult(resultsDTO); + exeCuteSql.setSuccess(true); + } + + // 使用SQLUtils将输入的SQL解析为SQL语句列表 + List stmtList = SQLUtils.parseStatements(dto.getStatement(), "SqlServer"); + + // 遍历列表中的每个SQL语句 + for (SQLStatement item : stmtList) { + // 设置当前正在处理的SQL语句,以便记录日志 + current = item.toString(); + + // 获取SQL语句的类型(例如,SELECT、INSERT)并添加到结果列表中 + String type = item.getClass().getSimpleName(); + sqlExplainResults.add(SqlExplainResult.success(type, current, null)); + } + process.info("Execute sql succeed."); + } + } catch (SQLException e) { + // 如果在SQL解析过程中发生异常,将失败的结果添加到列表中 + sqlExplainResults.add(SqlExplainResult.fail(current, LogUtil.getError(e))); + String error = LogUtil.getError(e); + // 记录错误消息 + process.error(error); + } + }else{ + throw new Exception("目前只支持Mysql类型"); + } + process.infoEnd(); + + } catch (Exception e) { + // 如果在SQL解析过程中发生异常,将失败的结果添加到列表中 + sqlExplainResults.add(SqlExplainResult.fail(current, LogUtil.getError(e))); + String error = LogUtil.getError(e); + // 记录错误消息 + process.error(error); + } + + return exeCuteSql; + } + + private Result BuildResultsDTO(List columnNames, List> resultList, DataSqlDto dto) { + + + long seconds = new Date().getSeconds(); + Result resultsDTO = new Result(); + String dtoStatement = dto.getStatement(); + List result = new ArrayList<>(); + Result resultsDTO1 = new Result(); + resultsDTO1.setColumns(columnNames); + + resultsDTO1.setRowData(resultList); + resultsDTO1.setCount(resultList.size()); + resultsDTO1.setSql(dtoStatement); + resultsDTO1.setSuccess(true); + resultsDTO1.setJobId(dto.getId()); + long take = new Date().getSeconds() - seconds; + resultsDTO1.setTime(take); + resultsDTO1.setIfQuery(true); + result.add(resultsDTO1); + + + resultsDTO.setResults(result); + resultsDTO.setCount(resultList.size()); + resultsDTO.setSql(dtoStatement); + resultsDTO.setSuccess(true); + resultsDTO.setJobId(dto.getId()); + long take1 = new Date().getSeconds() - seconds; + resultsDTO.setTime(take1); + return resultsDTO; + } + + private String getTableName(String dtoStatement) { + + // 使用正则表达式匹配表名 + Pattern pattern = Pattern.compile("from\\s+([a-zA-Z_][a-zA-Z0-9_]*)", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(dtoStatement); + String tableName =""; + // 查找匹配 + if (matcher.find()) { + // 获取匹配的表名 + tableName = matcher.group(1); + System.out.println("Table Name: " + tableName); + } else { + System.out.println("Table name not found."); + } + return tableName; + + } + + + @Override + public LogVo getLog() { + LogVo clearLog = new LogVo(); + ConsolePool instance = ConsolePool.getInstance(); + + if(instance.exist(getAccessToken())){ + clearLog.setLog(instance.get(getAccessToken()).toString()); + clearLog.setEnd(true); + return clearLog; + }else{ + return clearLog; + } + } + + @Override + public void clearLog() { + ConsolePool instance = ConsolePool.getInstance(); + instance.remove(getAccessToken()); + } + + private ProcessEntity BuildStes(DataSqlDto dto) { + // 从上下文获取当前进程实体 + ProcessEntity process = ProcessContextHolder.getProcess(); + process.setPid(UUID.randomUUID().toString().replaceAll("-", "")); + process.setName(dto.getName()); + process.setTaskId(Math.toIntExact(dto.getDatabaseId())); + process.setType(ProcessType.SQLEXECUTE); + process.setStatus(ProcessStatus.RUNNING); + process.setAccessToken(getAccessToken()); + process.setProjectId(dto.getProjectId()); + process.setStartTime(LocalDateTime.now()); + process.setEndTime(LocalDateTime.now()); + process.setStepIndex(1); + + ProcessStep processStep = new ProcessStep(); + processStep.setStepStatus(process.getStatus()); + processStep.setStartTime(LocalDateTime.now()); + processStep.setEndTime(LocalDateTime.now()); + List steps = new ArrayList<>(); + steps.add(processStep); + process.setSteps(steps); + + return process; + + } + +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/vo/DataCheckSqlVo.java b/srt-data-development/src/main/java/net/srt/disposition/vo/DataCheckSqlVo.java new file mode 100644 index 0000000..e55ca87 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/vo/DataCheckSqlVo.java @@ -0,0 +1,23 @@ +package net.srt.disposition.vo; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +public class DataCheckSqlVo { + private Integer index; + private String type; + private String sql; + private String parse; + private String explain; + private String error; + private boolean parseTrue; + private boolean explainTrue; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date explainTime; +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/vo/DataCheckVo.java b/srt-data-development/src/main/java/net/srt/disposition/vo/DataCheckVo.java new file mode 100644 index 0000000..847071c --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/vo/DataCheckVo.java @@ -0,0 +1,28 @@ +package net.srt.disposition.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +public class DataCheckVo { + private Integer id; + private String jobConfig; + private String jobManagerAddress; + private Integer status; + private boolean success; + private String statement; + private Integer jobId; + private Integer jobInstanceId; + private String error; + private Result result; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + private String log; +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/vo/DataSqlVo.java b/srt-data-development/src/main/java/net/srt/disposition/vo/DataSqlVo.java new file mode 100644 index 0000000..7ef7984 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/vo/DataSqlVo.java @@ -0,0 +1,22 @@ +package net.srt.disposition.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +public class DataSqlVo { + private Long index; + private String type; + private String sql; + private String parse; + private String explain; + private String error; + private boolean parseTrue; + private boolean explainTrue; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date explainTime; +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/vo/DevelopmentOperationalRecordsVo.java b/srt-data-development/src/main/java/net/srt/disposition/vo/DevelopmentOperationalRecordsVo.java new file mode 100644 index 0000000..a1f0e1f --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/vo/DevelopmentOperationalRecordsVo.java @@ -0,0 +1,141 @@ +package net.srt.disposition.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author : WangZhanpeng + * @date : 2023/12/27 19:14 + */ +@Data +@Schema(description = "数据开发-运维中心") +public class DevelopmentOperationalRecordsVo { + + @Schema(description = "主键") + private Long id; + + @Schema(description = "所属项目唯一标识符") + private Long projectId; + + @Schema(description = "SQL数据库类型") + private String sqlDbType; + + @Schema(description = "数据库唯一标识符") + private Long databaseId; + + @Schema(description = "集群唯一标识符") + private Integer clusterId; + + @Schema(description = "集群配置唯一标识符") + private Long clusterConfigurationId; + + @Schema(description = "会话信息") + private String session; + + @Schema(description = "作业唯一标识符") + private Long jobId; + + @Schema(description = "作业名称") + private String jobName; + + @Schema(description = "作业管理器地址") + private String jobManagerAddress; + + @Schema(description = "执行状态") + private Integer status; + + @Schema(description = "方言") + private Integer dialect; + + @Schema(description = "类型") + private String type; + + @Schema(description = "SQL语句") + private String statement; + + @Schema(description = "错误信息") + private String error; + + @Schema(description = "执行结果") + private String result; + + @Schema(description = "配置JSON字符串") + private String configJson; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + + @Schema(description = "任务唯一标识符") + private Long taskId; + + @Schema(description = "执行类型") + private String executeType; + + @Schema(description = "调度唯一标识符") + private Long scheduleId; + + @Schema(description = "调度节点唯一标识符") + private Long scheduleNodeId; + + @Schema(description = "调度记录唯一标识符") + private Long scheduleRecordId; + + @Schema(description = "调度节点记录唯一标识符") + private Long scheduleNodeRecordId; + + @Schema(description = "实例状态") + private String instanceStatus; + + @Schema(description = "执行完成时间戳") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date finishTime; + + @Schema(description = "执行的SQL语句") + private String executeSql; + + @Schema(description = "执行编号") + private String executeNo; + + @Schema(description = "作业标识符") + private String jid; + + @Schema(description = "执行持续时间") + private Integer duration; + + @Schema(description = "实体的版本") + private Integer version; + + @Schema(description = "表示实体是否已删除的标志") + private Integer deleted; + + @Schema(description = "创建者的ID") + private Integer creator; + + @Schema(description = "实体的创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @Schema(description = "更新者的ID") + private Integer updater; + + @Schema(description = "实体的更新时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + + +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/vo/DevelopmentTaskSaveVo.java b/srt-data-development/src/main/java/net/srt/disposition/vo/DevelopmentTaskSaveVo.java new file mode 100644 index 0000000..d97f21e --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/vo/DevelopmentTaskSaveVo.java @@ -0,0 +1,143 @@ +package net.srt.disposition.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author : WangZhanpeng + * @date : 2023/12/24 19:59 + */ +@Data +@Schema(description = "数据开发-sql作业") +public class DevelopmentTaskSaveVo implements Serializable { + + @Schema(description = "唯一标识") + private Long id; + + @Schema(description = "警报组标识") + private Long alertGroupId; + + @Schema(description = "别名") + private String alias; + + @Schema(description = "批处理模型") + private String batchModel; + + @Schema(description = "目录标识") + private Long catalogueId; + + @Schema(description = "检查点") + private String checkPoint; + + @Schema(description = "集群配置标识") + private Long clusterConfigurationId; + + @Schema(description = "集群标识") + private Long clusterId; + + @Schema(description = "配置 JSON") + private String configJson; + + @Schema(description = "数据库标识") + private Long databaseId; + + @Schema(description = "方言") + private String dialect; + + @Schema(description = "是否启用") + private String enabled; + + @Schema(description = "环境标识") + private String envId; + + @Schema(description = "片段") + private String fragment; + + @Schema(description = "JAR标识") + private Long jarId; + + @Schema(description = "作业实例标识") + private Long jobInstanceId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "备注") + private String note; + + @Schema(description = "开放传输") + private String openTrans; + + @Schema(description = "并行度") + private Integer parallelism; + + @Schema(description = "处理结束时间") + private String processEnd; + + @Schema(description = "项目标识") + private Long projectId; + + @Schema(description = "PV数据数量") + private Integer pvdataNum; + + @Schema(description = "保存点路径") + private String savePointPath; + + @Schema(description = "保存点策略") + private String savePointStrategy; + + @Schema(description = "SQL数据库类型") + private String sqlDbType; + + @Schema(description = "语句") + private String statement; + + @Schema(description = "语句集") + private String statementSet; + + @Schema(description = "步骤") + private String step; + + @Schema(description = "类型") + private String type; + + @Schema(description = "是否使用自动取消") + private String useAutoCancel; + + @Schema(description = "是否使用变更日志") + private String useChangeLog; + + @Schema(description = "是否使用结果") + private String useResult; + + @Schema(description = "版本标识") + private Long versionId; + + @Schema(description = "版本") + private Integer version; + + @Schema(description = "已删除") + private String deleted; + + @Schema(description = "创建者") + private Integer creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新者") + private Integer updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; + +} + + diff --git a/srt-data-development/src/main/java/net/srt/disposition/vo/LogVo.java b/srt-data-development/src/main/java/net/srt/disposition/vo/LogVo.java new file mode 100644 index 0000000..46cdfa5 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/vo/LogVo.java @@ -0,0 +1,9 @@ +package net.srt.disposition.vo; + +import lombok.Data; + +@Data +public class LogVo { + private String log; + private boolean end; +} diff --git a/srt-data-development/src/main/java/net/srt/disposition/vo/Result.java b/srt-data-development/src/main/java/net/srt/disposition/vo/Result.java new file mode 100644 index 0000000..493a5c0 --- /dev/null +++ b/srt-data-development/src/main/java/net/srt/disposition/vo/Result.java @@ -0,0 +1,23 @@ +package net.srt.disposition.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Data +public class Result { + private List results; + private boolean ifQuery; + private String sql; + private Long time; + private boolean success; + private String errorMsg; + private Integer count; + private List columns; + private List> rowData; + private Long jobId; +} diff --git a/srt-data-development/src/main/resources/auth.yml b/srt-data-development/src/main/resources/auth.yml index 0e6a006..2d05014 100644 --- a/srt-data-development/src/main/resources/auth.yml +++ b/srt-data-development/src/main/resources/auth.yml @@ -1,7 +1,3 @@ auth: ignore_urls: - - /auth/captcha - - /auth/login - - /auth/send/code - - /auth/mobile - - /upload/** \ No newline at end of file + - /data-development/** diff --git a/srt-data-development/src/main/resources/bootstrap.yml b/srt-data-development/src/main/resources/bootstrap.yml index 57dc047..c8c69dd 100644 --- a/srt-data-development/src/main/resources/bootstrap.yml +++ b/srt-data-development/src/main/resources/bootstrap.yml @@ -2,9 +2,6 @@ server: port: 8094 spring: - mvc: - servlet: - load-on-startup: 1 application: name: srt-cloud-data-development profiles: @@ -14,7 +11,7 @@ spring: discovery: server-addr: 101.34.77.101:8848 # 命名空间,默认:public - namespace: 7e1e997d-5fa4-4f84-9f48-3e0adf830a37 + namespace: 9de208a6-cb30-41ae-a880-78196c99c050 service: ${spring.application.name} group: srt2.0 config: @@ -25,19 +22,4 @@ spring: extension-configs: - data-id: datasource.yaml refresh: true - servlet: - multipart: - max-request-size: 100MB - max-file-size: 1024MB -storage: - enabled: true - config: - # 存储类型:local、aliyun - type: local - # 访问域名 - domain: http://localhost:8082/sys - # 配置访问前缀 - prefix: - local: - # 本地上传路径 - path: D://upload + diff --git a/srt-data-development/src/test/java/com/text/dome/a.java b/srt-data-development/src/test/java/com/text/dome/a.java new file mode 100644 index 0000000..96e796c --- /dev/null +++ b/srt-data-development/src/test/java/com/text/dome/a.java @@ -0,0 +1,32 @@ +package com.text.dome; + + +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import jdk.nashorn.internal.runtime.ParserException; + +import java.util.List; + +import static com.alibaba.druid.sql.SQLUtils.toSQLString; + +public class a { + public static void main(String[] args) { + String str = "create table `tb_user` (\n" + + " `id` varchar(22) not null COMMENT '主键id',\n" + + " `usercode` varchar(11) DEFAULT null COMMENT '手机号',\n" + + " `name` varchar(10) DEFAULT nu"; + System.out.println("格式化之前:"); + System.out.println(str); + System.out.println("格式化之后:"); + try { + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(str, "mysql"); + List statementList = parser.parseStatementList(); + str = toSQLString((SQLObject) statementList, "mysql"); + System.out.println(str); + } catch (ParserException e) { + System.out.println("SQL转换中发生了错误:"+e.getMessage()); + } + } +}