diff --git a/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java b/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java index b6e98f027c..be2860cc1d 100644 --- a/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java +++ b/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java @@ -1,11 +1,15 @@ package io.dataease.config; import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.base.Predicate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation.*; import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; +import springfox.documentation.RequestHandler; import springfox.documentation.builders.*; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.service.*; @@ -15,11 +19,14 @@ import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; import java.util.List; + @EnableOpenApi @Configuration @Import(BeanValidatorPluginsConfiguration.class) public class Knife4jConfiguration implements BeanPostProcessor{ + private static final String splitor = ","; + private final OpenApiExtensionResolver openApiExtensionResolver; @Value("${version}") @@ -54,12 +61,12 @@ public class Knife4jConfiguration implements BeanPostProcessor{ @Bean(value = "datasourceApi") public Docket datasourceApi() { - return defaultApi("数据源管理", "io.dataease.datasource"); + return defaultApi("数据源管理", "io.dataease.controller.datasource"); } @Bean(value = "sysApi") public Docket sysApi() { - return defaultApi("系统管理", "io.dataease.controller.sys"); + return defaultApi("系统管理", "io.dataease.controller.sys,io.dataease.plugins.server"); } private ApiInfo apiInfo(){ @@ -79,12 +86,12 @@ public class Knife4jConfiguration implements BeanPostProcessor{ List securityContexts = new ArrayList<>(); securityContexts.add(securityContext()); - Docket docket=new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) .groupName(groupName) .select() - .apis(RequestHandlerSelectors.basePackage(packageName)) + /*.apis(RequestHandlerSelectors.basePackage(packageName))*/ + .apis(basePackage(packageName)) .paths(PathSelectors.any()) .build() .securityContexts(securityContexts).securitySchemes(securitySchemes) @@ -120,4 +127,25 @@ public class Knife4jConfiguration implements BeanPostProcessor{ return results; } + public static Predicate basePackage(final String basePackage) { + return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true); + } + + private static Function, Boolean> handlerPackage(final String basePackage) { + return input -> { + // 循环判断匹配 + for (String strPackage : basePackage.split(splitor)) { + boolean isMatch = input.getPackage().getName().startsWith(strPackage); + if (isMatch) { + return true; + } + } + return false; + }; + } + + private static Optional> declaringClass(RequestHandler input) { + return Optional.fromNullable(input.declaringClass()); + } + } diff --git a/backend/src/main/java/io/dataease/controller/IndexController.java b/backend/src/main/java/io/dataease/controller/IndexController.java index bf8ad7eca0..02f7aca44f 100644 --- a/backend/src/main/java/io/dataease/controller/IndexController.java +++ b/backend/src/main/java/io/dataease/controller/IndexController.java @@ -44,7 +44,8 @@ public class IndexController { case valid: return "doc.html"; default: - return "nolic.html"; +// return "nolic.html"; + return "doc.html"; } } diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java index 4ef2b9b0eb..9a0abdc441 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -3,9 +3,12 @@ package io.dataease.controller.dataset; import com.auth0.jwt.JWT; import com.auth0.jwt.interfaces.DecodedJWT; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.auth.annotation.DePermission; import io.dataease.auth.filter.F2CLinkFilter; import io.dataease.base.domain.DatasetTable; import io.dataease.base.domain.DatasetTableField; +import io.dataease.commons.constants.DePermissionType; +import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.commons.exception.DEException; import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.request.dataset.MultFieldValuesRequest; @@ -106,6 +109,7 @@ public class DataSetTableFieldController { dataSetTableFieldsService.batchEdit(list); } + @DePermission(type = DePermissionType.DATASET, value = "tableId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE) @ApiOperation("保存") @PostMapping("save") public DatasetTableField save(@RequestBody DatasetTableField datasetTableField) { diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskController.java index 71fc911bb7..e0703d256b 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskController.java @@ -3,7 +3,10 @@ package io.dataease.controller.dataset; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.auth.annotation.DePermission; import io.dataease.base.domain.DatasetTableTask; +import io.dataease.commons.constants.DePermissionType; +import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.commons.utils.PageUtils; import io.dataease.commons.utils.Pager; import io.dataease.controller.request.dataset.DataSetTaskRequest; @@ -32,6 +35,7 @@ public class DataSetTableTaskController { @Resource private DataSetTableTaskLogService dataSetTableTaskLogService; + @DePermission(type = DePermissionType.DATASET, value = "datasetTableTask.tableId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE) @ApiOperation("保存") @PostMapping("save") public DatasetTableTask save(@RequestBody DataSetTaskRequest dataSetTaskRequest) throws Exception { @@ -70,6 +74,7 @@ public class DataSetTableTaskController { dataSetTableTaskService.updateDatasetTableTaskStatus(datasetTableTask); } + @DePermission(type = DePermissionType.DATASET, value = "tableId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE) @ApiOperation("执行任务") @PostMapping("/execTask") public void execTask(@RequestBody DatasetTableTask datasetTableTask) throws Exception{ diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskLogController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskLogController.java index 638145fd5d..5160a2b5c2 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskLogController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableTaskLogController.java @@ -3,7 +3,10 @@ package io.dataease.controller.dataset; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.auth.annotation.DePermission; import io.dataease.base.domain.DatasetTableTaskLog; +import io.dataease.commons.constants.DePermissionType; +import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.commons.utils.PageUtils; import io.dataease.commons.utils.Pager; import io.dataease.controller.sys.base.BaseGridRequest; @@ -28,6 +31,7 @@ public class DataSetTableTaskLogController { @Resource private DataSetTableTaskLogService dataSetTableTaskLogService; + @DePermission(type = DePermissionType.DATASET, value = "tableId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE) @ApiOperation("保存") @PostMapping("save") public DatasetTableTaskLog save(@RequestBody DatasetTableTaskLog datasetTableTaskLog) { diff --git a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java index b6b1218c01..a47f6b28cc 100644 --- a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java +++ b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java @@ -50,7 +50,7 @@ public class DatasourceController { @DePermission(type = DePermissionType.DATASOURCE, value = "id") @ApiOperation("验证数据源") @PostMapping("/validate") - public ResultHolder validate(@RequestBody Datasource datasource) throws Exception { + public ResultHolder validate(@RequestBody DatasourceDTO datasource) throws Exception { return datasourceService.validate(datasource); } diff --git a/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinition.java b/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinition.java index 36e4d8e41a..59fda7863b 100644 --- a/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinition.java +++ b/backend/src/main/java/io/dataease/controller/request/datasource/ApiDefinition.java @@ -16,5 +16,6 @@ public class ApiDefinition { private List fields; private String request; private String dataPath; + private String status; private List datas = new ArrayList<>(); } diff --git a/backend/src/main/java/io/dataease/plugins/server/ColumnPermissionsController.java b/backend/src/main/java/io/dataease/plugins/server/ColumnPermissionsController.java index 2a5d1cfda5..68e81c2c9f 100644 --- a/backend/src/main/java/io/dataease/plugins/server/ColumnPermissionsController.java +++ b/backend/src/main/java/io/dataease/plugins/server/ColumnPermissionsController.java @@ -18,10 +18,11 @@ import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; import java.util.ArrayList; import java.util.List; - +@ApiIgnore @RestController @RequestMapping("plugin/dataset/columnPermissions") public class ColumnPermissionsController { diff --git a/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java b/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java index dfde1fdb44..e685a45eaa 100644 --- a/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java +++ b/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java @@ -15,10 +15,11 @@ import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; import java.util.ArrayList; import java.util.List; - +@ApiIgnore @RestController @RequestMapping("plugin/dataset/rowPermissions") public class RowPermissionsController { diff --git a/backend/src/main/java/io/dataease/plugins/server/SSOServer.java b/backend/src/main/java/io/dataease/plugins/server/SSOServer.java index 39566e0119..00dde59a39 100644 --- a/backend/src/main/java/io/dataease/plugins/server/SSOServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/SSOServer.java @@ -30,7 +30,9 @@ import io.dataease.plugins.xpack.oidc.dto.SSOToken; import io.dataease.plugins.xpack.oidc.dto.SSOUserInfo; import io.dataease.plugins.xpack.oidc.service.OidcXpackService; import io.dataease.service.sys.SysUserService; +import springfox.documentation.annotations.ApiIgnore; +@ApiIgnore @RequestMapping("/sso") @Controller public class SSOServer { diff --git a/backend/src/main/java/io/dataease/plugins/server/ThemeServer.java b/backend/src/main/java/io/dataease/plugins/server/ThemeServer.java index df49eba490..b8c25834f7 100644 --- a/backend/src/main/java/io/dataease/plugins/server/ThemeServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/ThemeServer.java @@ -19,7 +19,9 @@ import io.dataease.plugins.xpack.theme.dto.ThemeDto; import io.dataease.plugins.xpack.theme.dto.ThemeItem; import io.dataease.plugins.xpack.theme.dto.ThemeRequest; import io.dataease.plugins.xpack.theme.service.ThemeXpackService; +import springfox.documentation.annotations.ApiIgnore; +@ApiIgnore @RequestMapping("/plugin/theme") @RestController public class ThemeServer { diff --git a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java index 2aec82d079..b6e71bdf5f 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java @@ -17,9 +17,10 @@ import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import io.dataease.plugins.xpack.auth.service.AuthXpackService; +import springfox.documentation.annotations.ApiIgnore; import java.util.*; - +@ApiIgnore @RequestMapping("/plugin/auth") @RestController public class XAuthServer { diff --git a/backend/src/main/java/io/dataease/plugins/server/XDeptServer.java b/backend/src/main/java/io/dataease/plugins/server/XDeptServer.java index 0c3b911405..0d4f46036a 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XDeptServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XDeptServer.java @@ -95,15 +95,15 @@ public class XDeptServer { } - @RequiresPermissions("dept:del") + @ApiIgnore - @ApiOperation("删除") @PostMapping("/nodesByDeptId/{deptId}") public List nodesByDeptId(@PathVariable("deptId") Long deptId){ DeptXpackService deptService = SpringContextUtil.getBean(DeptXpackService.class); return deptService.searchTree(deptId); } + @RequiresPermissions("dept:edit") @ApiOperation("移动") @PostMapping("/move") public void move(@RequestBody XpackMoveDept xpackMoveDept){ diff --git a/backend/src/main/java/io/dataease/plugins/server/XDisplayServer.java b/backend/src/main/java/io/dataease/plugins/server/XDisplayServer.java index b689183768..ef987a473c 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XDisplayServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XDisplayServer.java @@ -7,9 +7,11 @@ import io.dataease.plugins.xpack.display.service.DisplayXpackService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import springfox.documentation.annotations.ApiIgnore; + import java.util.List; import java.util.Map; - +@ApiIgnore @RequestMapping("/api/display") @RestController public class XDisplayServer { diff --git a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java index 317fe48079..470cbbb7aa 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java @@ -23,13 +23,14 @@ import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; import java.util.List; import java.util.concurrent.Future; import javax.annotation.Resource; - +@ApiIgnore @RequestMapping("/plugin/task") @RestController public class XEmailTaskServer { diff --git a/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java b/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java index 44f77c9833..742a9f03cb 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java @@ -8,9 +8,10 @@ import io.dataease.plugins.xpack.ldap.dto.response.LdapInfo; import io.dataease.plugins.xpack.ldap.service.LdapXpackService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; import java.util.List; - +@ApiIgnore @RequestMapping("/plugin/ldap") @RestController public class XLdapServer { diff --git a/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java b/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java index bf600f0aae..042207e088 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java @@ -7,10 +7,12 @@ import io.dataease.plugins.xpack.oidc.service.OidcXpackService; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + import java.util.HashMap; import java.util.List; import java.util.Map; - +@ApiIgnore @RequestMapping("/plugin/oidc") @RestController public class XOidcServer { diff --git a/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java b/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java index 994eb8aac1..4cbbce3b1a 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java @@ -5,10 +5,12 @@ import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.ukey.dto.request.XpackUkeyDto; import io.dataease.plugins.xpack.ukey.service.UkeyXpackService; import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; import javax.servlet.ServletRequest; import java.util.List; +@ApiIgnore @RequestMapping("/plugin/ukey") @RestController public class XUserKeysServer { diff --git a/backend/src/main/java/io/dataease/plugins/server/view/PluginViewServer.java b/backend/src/main/java/io/dataease/plugins/server/view/PluginViewServer.java index d57b1088ab..94e33239aa 100644 --- a/backend/src/main/java/io/dataease/plugins/server/view/PluginViewServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/view/PluginViewServer.java @@ -12,7 +12,9 @@ import org.springframework.web.bind.annotation.RestController; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.view.entity.PluginViewType; import io.dataease.plugins.view.service.ViewPluginService; +import springfox.documentation.annotations.ApiIgnore; +@ApiIgnore @RequestMapping("/plugin/view") @RestController public class PluginViewServer { diff --git a/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java b/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java index 948b9710d1..42a800f1c5 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/ApiProvider.java @@ -12,15 +12,13 @@ import io.dataease.controller.request.datasource.ApiDefinitionRequest; import io.dataease.controller.request.datasource.DatasourceRequest; import io.dataease.dto.datasource.TableDesc; import io.dataease.dto.datasource.TableField; -import io.dataease.exception.DataEaseException; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.http.HttpHeaders; + import org.springframework.stereotype.Service; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.Statement; + import java.util.*; import java.util.stream.Collectors; @@ -102,22 +100,18 @@ public class ApiProvider extends DatasourceProvider{ @Override public String checkStatus(DatasourceRequest datasourceRequest) throws Exception { - List apiDefinitionList = JSONObject.parseArray(datasourceRequest.getDatasource().getConfiguration(), ApiDefinition.class).stream().filter(item -> item.getName().equalsIgnoreCase(datasourceRequest.getTable())).collect(Collectors.toList()); - int success = 0; + List apiDefinitionList = JSONObject.parseArray(datasourceRequest.getDatasource().getConfiguration(), ApiDefinition.class); + JSONObject apiItemStatuses = new JSONObject(); for (ApiDefinition apiDefinition : apiDefinitionList) { datasourceRequest.setTable(apiDefinition.getName()); try { - getData(datasourceRequest); - success++; - }catch (Exception ignore){} + getData(datasourceRequest); + apiItemStatuses.put(apiDefinition.getName(), "Success"); + }catch (Exception ignore){ + apiItemStatuses.put(apiDefinition.getName(), "Error"); + } } - if(success == apiDefinitionList.size()){ - return "Success"; - } - if(success > 0 && success < apiDefinitionList.size() ){ - return "Warning"; - } - return "Error"; + return JSONObject.toJSONString(apiItemStatuses); } static public String execHttpRequest(ApiDefinition apiDefinition) throws Exception{ diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index e2fc21d256..e63fe1f17a 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -405,7 +405,7 @@ public class DataSetTableService { public DataSetTableDTO getWithPermission(String id, Long user) { CurrentUserDto currentUserDto = AuthUtils.getUser(); - Long userId = user != null ? currentUserDto.getUserId() : user; + Long userId = currentUserDto != null ? currentUserDto.getUserId() : user; DataSetTableRequest dataSetTableRequest = new DataSetTableRequest(); dataSetTableRequest.setId(id); @@ -464,7 +464,7 @@ public class DataSetTableService { } public Map getPreviewData(DataSetTableRequest dataSetTableRequest, Integer page, Integer pageSize, - List extFields) throws Exception { + List extFields) throws Exception { Map map = new HashMap<>(); DatasetTableField datasetTableField = DatasetTableField.builder().tableId(dataSetTableRequest.getId()) .checked(Boolean.TRUE).build(); @@ -926,8 +926,8 @@ public class DataSetTableService { DorisTableUtils.dorisFieldName( datasetTableField.getTableId() + "_" + datasetTableField.getDataeaseName())) || StringUtils.equalsIgnoreCase(tableField.getFieldName(), - DorisTableUtils.dorisFieldNameShort(datasetTableField.getTableId() + "_" - + datasetTableField.getOriginName()))) { + DorisTableUtils.dorisFieldNameShort(datasetTableField.getTableId() + "_" + + datasetTableField.getOriginName()))) { tableField.setRemarks(datasetTableField.getName()); break; } @@ -990,7 +990,7 @@ public class DataSetTableService { DorisTableUtils.dorisFieldName( datasetTableField.getTableId() + "_" + datasetTableField.getDataeaseName())) || StringUtils.equalsIgnoreCase(tableField.getFieldName(), DorisTableUtils.dorisFieldName( - datasetTableField.getTableId() + "_" + datasetTableField.getOriginName()))) { + datasetTableField.getTableId() + "_" + datasetTableField.getOriginName()))) { tableField.setRemarks(datasetTableField.getName()); break; } @@ -1073,7 +1073,7 @@ public class DataSetTableService { } public String getCustomSQLDatasource(DataTableInfoDTO dataTableInfoDTO, List list, - Datasource ds) { + Datasource ds) { DatasourceTypes datasourceTypes = DatasourceTypes.valueOf(ds.getType()); String keyword = datasourceTypes.getKeywordPrefix() + "%s" + datasourceTypes.getKeywordSuffix(); Map customInfo = new TreeMap<>(); @@ -1260,7 +1260,7 @@ public class DataSetTableService { // 递归计算出所有子级的checkedFields和unionParam private void getUnionSQLDorisJoin(List childrenDs, Map checkedInfo, - List unionList, List checkedFields) { + List unionList, List checkedFields) { for (int i = 0; i < childrenDs.size(); i++) { UnionDTO unionDTO = childrenDs.get(i); String tableId = unionDTO.getCurrentDs().getId(); @@ -1398,7 +1398,7 @@ public class DataSetTableService { // 递归计算出所有子级的checkedFields和unionParam private void getUnionSQLDatasourceJoin(List childrenDs, Map checkedInfo, - List unionList, String keyword, List checkedFields) { + List unionList, String keyword, List checkedFields) { for (int i = 0; i < childrenDs.size(); i++) { UnionDTO unionDTO = childrenDs.get(i); @@ -1703,10 +1703,10 @@ public class DataSetTableService { if (datasetTableIncrementalConfig == null || StringUtils.isEmpty(datasetTableIncrementalConfig.getTableId())) { return; } - if(StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalAdd())){ + if (StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalAdd())) { datasetTableIncrementalConfig.setIncrementalAdd(datasetTableIncrementalConfig.getIncrementalAdd().trim()); } - if(StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalDelete())){ + if (StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalDelete())) { datasetTableIncrementalConfig.setIncrementalDelete(datasetTableIncrementalConfig.getIncrementalDelete().trim()); } if (StringUtils.isEmpty(datasetTableIncrementalConfig.getId())) { diff --git a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java index e1a360d7f0..f40eb5ef1b 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java @@ -1,5 +1,6 @@ package io.dataease.service.datasource; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.jayway.jsonpath.JsonPath; @@ -110,12 +111,38 @@ public class DatasourceService { datasourceDTO.setConfiguration(JSONObject.toJSONString(new Gson().fromJson(datasourceDTO.getConfiguration(), CHConfiguration.class)) ); break; case api: - datasourceDTO.setApiConfiguration(JSONObject.parseArray(datasourceDTO.getConfiguration())); + JSONArray apiDefinitionList = JSONObject.parseArray(datasourceDTO.getConfiguration()); + JSONArray apiDefinitionListWithStatus = new JSONArray(); + int success = 0; + if(StringUtils.isNotEmpty(datasourceDTO.getStatus())){ + JSONObject apiItemStatuses = JSONObject.parseObject(datasourceDTO.getStatus()); + for (Object apiDefinition : apiDefinitionList) { + String status = apiItemStatuses.getString(JSONObject.parseObject(apiDefinition.toString()).getString("name") ); + JSONObject object = JSONObject.parseObject(apiDefinition.toString()); + object.put("status", status); + apiDefinitionListWithStatus.add(object); + if(StringUtils.isNotEmpty(status) && status.equalsIgnoreCase("Success")){ + success ++; + } + } + } + datasourceDTO.setApiConfiguration(apiDefinitionListWithStatus); + if(success == apiDefinitionList.size()){ + datasourceDTO.setStatus("Success"); + break; + } + if(success > 0 && success < apiDefinitionList.size() ){ + datasourceDTO.setStatus("Warning"); + break; + } + datasourceDTO.setStatus("Error"); break; default: break; } - }catch (Exception ignore){} + }catch (Exception ignore){ + ignore.printStackTrace(); + } }); return datasourceDTOS; @@ -135,6 +162,7 @@ public class DatasourceService { return extDataSourceMapper.query(gridExample); } + @DeCleaner(DePermissionType.DATASOURCE) public void deleteDatasource(String datasourceId) throws Exception { DatasetTableExample example = new DatasetTableExample(); example.createCriteria().andDataSourceIdEqualTo(datasourceId); @@ -156,22 +184,39 @@ public class DatasourceService { handleConnectionPool(datasource, "edit"); } - public ResultHolder validate(Datasource datasource) throws Exception { + public ResultHolder validate(DatasourceDTO datasource) throws Exception { try { DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(datasource); - String status = datasourceProvider.checkStatus(datasourceRequest); - if (status.equalsIgnoreCase("Success")) { - return ResultHolder.success("Success"); + String datasourceStatus = datasourceProvider.checkStatus(datasourceRequest); + if(datasource.getType().equalsIgnoreCase("api")){ + int success = 0; + JSONArray apiDefinitionList = JSONObject.parseArray(datasource.getConfiguration()); + JSONArray apiDefinitionListWithStatus = new JSONArray(); + if(StringUtils.isNotEmpty(datasourceStatus)){ + JSONObject apiItemStatuses = JSONObject.parseObject(datasourceStatus); + for (Object apiDefinition : apiDefinitionList) { + String status = apiItemStatuses.getString(JSONObject.parseObject(apiDefinition.toString()).getString("name") ); + JSONObject object = JSONObject.parseObject(apiDefinition.toString()); + object.put("status", status); + apiDefinitionListWithStatus.add(object); + if(StringUtils.isNotEmpty(status) && status.equalsIgnoreCase("Success")){ + success ++; + } + } + } + + datasource.setApiConfiguration(apiDefinitionListWithStatus); + if(success == apiDefinitionList.size()){ + return ResultHolder.success(datasource); + } + if(success > 0 && success < apiDefinitionList.size() ){ + return ResultHolder.error("Datasource has invalid tables", datasource); + } + return ResultHolder.error("Datasource is invalid.", datasource); } - if (status.equalsIgnoreCase("Warning")) { - return ResultHolder.error("Datasource has invalid items"); - } - if (status.equalsIgnoreCase("Error")) { - return ResultHolder.error("Datasource is invalid"); - } - return ResultHolder.success("Success"); + return ResultHolder.success(datasource); }catch (Exception e){ return ResultHolder.error("Datasource is invalid: " + e.getMessage()); } @@ -187,17 +232,29 @@ public class DatasourceService { DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(datasource); - String status = datasourceProvider.checkStatus(datasourceRequest); - datasource.setStatus(status); - if (status.equalsIgnoreCase("Success")) { - return ResultHolder.success("Success"); - } - if (status.equalsIgnoreCase("Warning")) { - return ResultHolder.error("Datasource has invalid items"); - } - if (status.equalsIgnoreCase("Error")) { - return ResultHolder.error("Datasource is invalid"); + String datasourceStatus = datasourceProvider.checkStatus(datasourceRequest); + datasource.setStatus(datasourceStatus); + + if(datasource.getType().equalsIgnoreCase("api")){ + List apiDefinitionList = JSONObject.parseArray(datasource.getConfiguration(), ApiDefinition.class); + JSONObject apiItemStatuses = JSONObject.parseObject(datasourceStatus); + int success = 0; + for (ApiDefinition apiDefinition : apiDefinitionList) { + String status = apiItemStatuses.getString(apiDefinition.getName()); + apiDefinition.setStatus(status); + if(status.equalsIgnoreCase("Success")){ + success ++; + } + } + if(success == apiDefinitionList.size()){ + return ResultHolder.success(datasource); + } + if(success > 0 && success < apiDefinitionList.size() ){ + return ResultHolder.error("Datasource has invalid tables", datasource); + } + return ResultHolder.error("Datasource is invalid.", datasource); } + return ResultHolder.success("Success"); }catch (Exception e){ datasource.setStatus("Error"); @@ -219,12 +276,14 @@ public class DatasourceService { DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); - datasourceProvider.checkStatus(datasourceRequest); + if(!datasource.getType().equalsIgnoreCase("api")){ + datasourceProvider.checkStatus(datasourceRequest); + } + List tables = datasourceProvider.getTables(datasourceRequest); - // 获取当前数据源下的db类型数据集 + // 获取当前数据源下的db、api类型数据集 DatasetTableExample datasetTableExample = new DatasetTableExample(); - datasetTableExample.createCriteria().andTypeIn(Arrays.asList("db","api")).andDataSourceIdEqualTo(datasource.getId()); List datasetTables = datasetTableMapper.selectByExampleWithBLOBs(datasetTableExample); List list = new ArrayList<>(); diff --git a/backend/src/main/resources/db/migration/V32__1.8.sql b/backend/src/main/resources/db/migration/V32__1.8.sql index 2579aa97f2..3e178574d9 100644 --- a/backend/src/main/resources/db/migration/V32__1.8.sql +++ b/backend/src/main/resources/db/migration/V32__1.8.sql @@ -354,6 +354,9 @@ SET FOREIGN_KEY_CHECKS = 1; ALTER TABLE `panel_view` ADD COLUMN `position` varchar(255) NULL DEFAULT 'panel' COMMENT '视图位置 panel 仪表板中,tab Tab页中' AFTER `update_time`; +ALTER TABLE `datasource` + CHANGE COLUMN `status` `status` LONGTEXT NULL DEFAULT NULL COMMENT '状态' ; + ALTER TABLE `panel_view` ADD COLUMN `copy_from_panel` varchar(255) NULL AFTER `position`, ADD COLUMN `copy_from_view` varchar(255) NULL AFTER `copy_from_panel`, diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 48c2fc2982..0b8b52bd60 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1337,7 +1337,11 @@ export default { auth_config_info: 'Permission verification is required for the request', verified: 'Verified', verification_method: 'Verification Method', - username: 'Username' + username: 'Username', + api_table_not_empty: 'API data table cannot be empty', + has_repeat_name: 'Duplicate API data table name', + valid: 'Valid', + invalid: 'Invalid' }, pblink: { key_pwd: 'Please enter the password to open the link', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 7c7e66103d..16b9565570 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1338,7 +1338,11 @@ export default { auth_config_info: '請求需要進行權限校驗', verified: '認證', verification_method: '認證方式', - username: '用戶名' + username: '用戶名', + api_table_not_empty: 'API 數據表不能為空', + has_repeat_name: 'API 數據表名稱重複', + valid: '有效', + invalid: '無效' }, pblink: { key_pwd: '請輸入密碼打開鏈接', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index c318df97e6..e8f9ffebca 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1346,7 +1346,11 @@ export default { auth_config_info: '请求需要进行权限校验', verified: '认证', verification_method: '认证方式', - username: '用户名' + username: '用户名', + api_table_not_empty: 'API 数据表不能为空', + has_repeat_name: 'API 数据表名称重复', + valid: '有效', + invalid: '无效' }, pblink: { key_pwd: '请输入密码打开链接', diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 8e35536a73..be24d248c7 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -622,7 +622,7 @@ /> diff --git a/frontend/src/views/system/datasource/form.vue b/frontend/src/views/system/datasource/form.vue index ec700d09e9..05ad8a15f5 100644 --- a/frontend/src/views/system/datasource/form.vue +++ b/frontend/src/views/system/datasource/form.vue @@ -48,6 +48,18 @@ + + + + +