diff --git a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java
index 701e526ce..5085ebbea 100644
--- a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java
+++ b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java
@@ -10,13 +10,13 @@ import com.cf.imes.framework.common.exception.ErrorCode;
*/
public interface ErrorCodeConstants {
- // ========== GoView 模块 1-003-000-000 ==========
- ErrorCode GO_VIEW_PROJECT_NOT_EXISTS = new ErrorCode(1_003_000_000, "GoView 项目不存在");
-
// ========== UREPORT 模块 1-003-001-000 ==========
- ErrorCode UREPORT_DATA_NOT_EXISTS = new ErrorCode(1_003_001_001, "Ureport2 报表不存在");
- ErrorCode UREPORT_DATABASE_NOT_EXISTS = new ErrorCode(1_003_001_002, "Ureport2 报表数据源不存在");
- ErrorCode TEMPLATE_NOT_EXISTS = new ErrorCode(1_003_001_003, "报表模板信息不存在");
- ErrorCode DATASOURCE_NOT_EXISTS = new ErrorCode(1_003_001_004, "报表数据源不存在");
- ErrorCode DATASET_NOT_EXISTS = new ErrorCode(1_003_001_005, "报表数据集不存在");
+ ErrorCode TEMPLATE_NOT_EXISTS = new ErrorCode(1_003_001_001, "报表模板信息不存在");
+ ErrorCode DATASOURCE_NOT_EXISTS = new ErrorCode(1_003_001_002, "报表数据源不存在");
+ ErrorCode DATASOURCE_CONNECT_FAIL = new ErrorCode(1_003_001_003, "报表数据源连接失败");
+ ErrorCode DATASET_NOT_EXISTS = new ErrorCode(1_003_001_004, "报表数据集不存在");
+ ErrorCode DATASET_SQL_INJECTION_RISK = new ErrorCode(1_003_001_005, "存在SQL注入风险");
+ ErrorCode DATASET_SQL_REQUIRED = new ErrorCode(1_003_001_006, "SQL语句不能为空");
+ ErrorCode DATASET_SQL_ILLEGAL = new ErrorCode(1_003_001_007, "SQL语句非法");
+ ErrorCode DATASET_GET_FIELDS_ERROR = new ErrorCode(1_003_001_008, "获取表字段");
}
diff --git a/cf-module-report/cf-module-report-biz/pom.xml b/cf-module-report/cf-module-report-biz/pom.xml
index 4495719c0..eef2d3137 100644
--- a/cf-module-report/cf-module-report-biz/pom.xml
+++ b/cf-module-report/cf-module-report-biz/pom.xml
@@ -103,6 +103,13 @@
cf-spring-boot-starter-monitor
+
+ com.ureport
+ ureport-core
+ 2.3.0-SNAPSHOT
+ system
+ ${project.basedir}/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar
+
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java
index f9257b07f..5ae98d4e3 100644
--- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java
@@ -7,6 +7,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -19,7 +20,7 @@ import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
public class ReportDatasetSaveReqVO {
- @Schema(description = "数据集id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @Schema(description = "数据集id", example = "1")
private Long id;
@Schema(description = "数据集名称", example = "测试数据集")
@@ -33,8 +34,8 @@ public class ReportDatasetSaveReqVO {
private String sql;
@Schema(description = "参数列表")
- private List parameters;
+ private List parameters = new ArrayList<>();
@Schema(description = "字段列表")
- private List fields;
+ private List fields = new ArrayList<>();
}
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java
index 4f89c8be2..c96f0bc69 100644
--- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java
@@ -2,10 +2,12 @@ package com.cf.imes.module.report.controller.admin.datasource;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
+import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetFieldVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportBeanDatasourceRespVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceRespVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO;
+import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceTestConnReqVO;
import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO;
import com.cf.imes.module.report.service.datasource.ReportDatasourceService;
import io.swagger.v3.oas.annotations.Operation;
@@ -19,8 +21,11 @@ import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
+import java.util.Map;
+import static com.cf.imes.framework.common.pojo.CommonResult.error;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
+import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_CONNECT_FAIL;
/**
* 报表数据源控制器
@@ -30,7 +35,7 @@ import static com.cf.imes.framework.common.pojo.CommonResult.success;
*/
@Tag(name = "管理后台 - 报表数据源")
@RestController
-@RequestMapping("/report/datasource")
+@RequestMapping("/report")
@Validated
public class ReportDatasourceController {
@Resource
@@ -61,7 +66,7 @@ public class ReportDatasourceController {
}
@GetMapping("/datasource/{id}")
- @Operation(summary = "获得报表数据源")
+ @Operation(summary = "获取报表数据源")
@Parameter(name = "id", description = "编号", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('report:datasource:query')")
public CommonResult getDatasource(@PathVariable("id") Long id) {
@@ -69,14 +74,11 @@ public class ReportDatasourceController {
return success(BeanUtils.toBean(datasource, ReportDatasourceRespVO.class));
}
- @GetMapping("/datasources")
+ @GetMapping("/{templateId}/datasources")
@Operation(summary = "获取报表模板下的报表数据源")
@PreAuthorize("@ss.hasPermission('report:datasource:query')")
- public CommonResult> getDatasourcePage(@RequestParam(value = "reportId") Long reportId,
- @RequestParam(value = "name", required = false) String name,
- @RequestParam(value = "type", required = false) Integer type) {
- ReportDatasourceReqVO reqVO = new ReportDatasourceReqVO(reportId, name, type);
- return success(BeanUtils.toBean(datasourceService.getTemplateDatasourceList(reqVO), ReportDatasourceRespVO.class));
+ public CommonResult> getDatasourcePage(@PathVariable(value = "templateId") Long templateId) {
+ return success(BeanUtils.toBean(datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build()), ReportDatasourceRespVO.class));
}
@GetMapping("/datasource/beans")
@@ -92,4 +94,26 @@ public class ReportDatasourceController {
public CommonResult> getBeanDatasourceList(@RequestParam(value = "beanId") String beanId) {
return success(datasourceService.loadBeanMethods(beanId));
}
+
+ @PostMapping("/datasource/connect")
+ @Operation(summary = "测试数据源连接")
+ @PreAuthorize("@ss.hasPermission('report:datasource:query')")
+ public CommonResult testDatasourceConnect(@RequestBody ReportDatasourceTestConnReqVO reqVO) {
+ boolean connResult = datasourceService.testConnect(reqVO);
+ return connResult ? success(true) : error(DATASOURCE_CONNECT_FAIL);
+ }
+
+ @PostMapping("/datasource/tables")
+ @Operation(summary = "获取数据源表列表")
+ @PreAuthorize("@ss.hasPermission('report:datasource:query')")
+ public CommonResult>> getDatasourceTables(@RequestBody ReportDatasourceTestConnReqVO reqVO) {
+ return success(datasourceService.getDatasourceTables(reqVO));
+ }
+
+ @PostMapping("/datasource/table/fields")
+ @Operation(summary = "获取数据源表字段")
+ @PreAuthorize("@ss.hasPermission('report:datasource:query')")
+ public CommonResult> getDatasourceTableFields(@RequestBody ReportDatasourceTestConnReqVO reqVO) {
+ return success(datasourceService.getTableFields(reqVO));
+ }
}
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceReqVO.java
index 9fc3c5ca8..2878f0d62 100644
--- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceReqVO.java
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceReqVO.java
@@ -7,6 +7,9 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
+import java.io.Serial;
+import java.io.Serializable;
+
/**
* @author Gqr
* @since 2024/7/8 11:01
@@ -17,13 +20,16 @@ import lombok.ToString;
@Builder
@AllArgsConstructor
@NoArgsConstructor
-public class ReportDatasourceReqVO {
+public class ReportDatasourceReqVO implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 4591901987664100102L;
+
@Schema(description = "模板id", example = "1", requiredMode = Schema.RequiredMode.REQUIRED)
private Long templateId;
@Schema(description = "数据源名称", example = "测试库")
private String name;
- @Schema(description = "数据源类型,jdbc、buildin", example = "jdbc")
+ @Schema(description = "数据源类型,0 jdbc、1 buildin、2 spring", example = "jdbc")
private Integer type;
}
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java
index 2921db9af..82ba7889d 100644
--- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java
@@ -1,6 +1,7 @@
package com.cf.imes.module.report.controller.admin.datasource.vo;
import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetRespVO;
+import com.cf.imes.module.report.enums.datasource.ReportDatasourceTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -27,8 +28,8 @@ public class ReportDatasourceRespVO {
@Schema(description = "数据源名称", example = "测试库")
private String name;
- @Schema(description = "数据源类型,jdbc、buildin", example = "jdbc")
- private String type;
+ @Schema(description = "数据源类型,jdbc、buildin、spring", example = "jdbc")
+ private ReportDatasourceTypeEnum type;
@Schema(description = "数据源驱动类",example = "com.mysql.cj.jdbc.Driver")
private String driver;
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java
index cce0b9d30..883d9c02d 100644
--- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java
@@ -1,6 +1,7 @@
package com.cf.imes.module.report.controller.admin.datasource.vo;
import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO;
+import com.cf.imes.module.report.validation.datasource.ReportDatasourceTypeInEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -8,6 +9,9 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -19,7 +23,10 @@ import java.util.List;
@Builder
@AllArgsConstructor
@NoArgsConstructor
-public class ReportDatasourceSaveReqVO {
+public class ReportDatasourceSaveReqVO implements Serializable {
+ @Serial
+ private static final long serialVersionUID = -1738392826420649562L;
+
@Schema(description = "数据源id", example = "1")
private Long id;
@@ -30,9 +37,13 @@ public class ReportDatasourceSaveReqVO {
@Schema(description = "数据源名称", example = "测试库")
private String name;
- @Schema(description = "数据源类型,jdbc、buildin", example = "jdbc")
+ @Schema(description = "数据源类型,jdbc、buildin、spring", example = "jdbc")
+ @ReportDatasourceTypeInEnum
private String type;
+ @Schema(description = "spring型数据源id")
+ private String beanId;
+
@Schema(description = "数据源驱动类",example = "com.mysql.cj.jdbc.Driver")
private String driver;
@@ -49,5 +60,5 @@ public class ReportDatasourceSaveReqVO {
private String remark;
@Schema(description = "数据集")
- private List datasets;
+ private List datasets = new ArrayList<>();
}
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceTestConnReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceTestConnReqVO.java
new file mode 100644
index 000000000..c51e5afe9
--- /dev/null
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceTestConnReqVO.java
@@ -0,0 +1,44 @@
+package com.cf.imes.module.report.controller.admin.datasource.vo;
+
+import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetParameterVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Gqr
+ * @since 2024/7/8 11:01
+ */
+@Schema(description = "管理后台 - 报表数据源测试连接 Request VO")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ReportDatasourceTestConnReqVO {
+
+ @Schema(description = "数据源驱动类",example = "com.mysql.cj.jdbc.Driver")
+ private String driver;
+
+ @Schema(description = "数据源地址", example = "https://www.cf.com")
+ private String url;
+
+ @Schema(description = "数据源用户名", example = "晨丰")
+ private String userName;
+
+ @Schema(description = "数据源密码", example = "晨丰")
+ private String password;
+
+ @Schema(description = "数据源id", example = "1")
+ private Long datasourceId;
+
+ @Schema(description = "数据库语句")
+ private String sql;
+
+ @Schema(description = "参数列表")
+ private List parameters = new ArrayList<>();
+}
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java
index 9f7bdbfce..375de199c 100644
--- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java
@@ -7,6 +7,7 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -30,7 +31,7 @@ public class ReportTemplateSaveReqVO {
private String content;
@Schema(description = "数据源")
- private List datasource;
+ private List datasource = new ArrayList<>();
@Schema(description = "模板类型,0内置、1自定义", example = "1")
private Integer type;
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java
index 37eecdb03..3beab7a73 100644
--- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.cf.imes.framework.mybatis.core.dataobject.BaseDO;
import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO;
+import com.cf.imes.module.report.enums.datasource.ReportDatasourceTypeEnum;
import lombok.*;
import java.util.List;
@@ -39,9 +40,13 @@ public class ReportDatasourceDO extends BaseDO {
*/
private String name;
/**
- * 模板类型,jdbc、buildin
+ * 模板类型,jdbc、buildin、spring
*/
- private String type;
+ private ReportDatasourceTypeEnum type;
+ /**
+ * spring型数据源id
+ */
+ private String beanId;
/**
* 数据源驱动类
*/
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java
new file mode 100644
index 000000000..d31672640
--- /dev/null
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java
@@ -0,0 +1,41 @@
+package com.cf.imes.module.report.enums.datasource;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author Gqr
+ * @since 2024/7/17 9:43
+ */
+@Getter
+@AllArgsConstructor
+public enum ReportDatasourceTypeEnum {
+ JDBC(0,"jdbc"),
+ BUILDIN(1,"buildin"),
+ SPRING(2,"spring");
+
+ @EnumValue
+ private final Integer code;
+
+ @JsonValue
+ private final String desc;
+
+ /**
+ * 匹配枚举
+ *
+ * @param desc
+ * @return
+ */
+ @JsonCreator
+ public static ReportDatasourceTypeEnum fromDesc(String desc) {
+ for (ReportDatasourceTypeEnum value : ReportDatasourceTypeEnum.values()) {
+ if (value.getDesc().equals(desc)) {
+ return value;
+ }
+ }
+ return null;
+ }
+}
diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java
index a2ea0a14b..d140b9363 100644
--- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java
+++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java
@@ -1,12 +1,15 @@
package com.cf.imes.module.report.service.datasource;
+import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetFieldVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportBeanDatasourceRespVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO;
+import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceTestConnReqVO;
import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO;
import javax.validation.Valid;
import java.util.List;
+import java.util.Map;
/**
* 报表数据源 Service 接口
@@ -67,4 +70,28 @@ public interface ReportDatasourceService {
* @return
*/
List loadBeanMethods(String beanId);
+
+ /**
+ * 测试数据源连接
+ *
+ * @param reqVO 连接信息请求
+ * @return
+ */
+ boolean testConnect(ReportDatasourceTestConnReqVO reqVO);
+
+ /**
+ * 获取数据源表列表
+ *
+ * @param reqVO 连接信息请求
+ * @return
+ */
+ List