Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	backend/src/main/resources/db/migration/V32__1.8.sql
This commit is contained in:
wangjiahao 2022-02-24 17:41:27 +08:00
commit 734aa62a31
28 changed files with 244 additions and 91 deletions

View File

@ -1,11 +1,15 @@
package io.dataease.config; package io.dataease.config;
import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; 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.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.*; import org.springframework.context.annotation.*;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.*; import springfox.documentation.builders.*;
import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.*; import springfox.documentation.service.*;
@ -15,11 +19,14 @@ import springfox.documentation.spring.web.plugins.Docket;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@EnableOpenApi @EnableOpenApi
@Configuration @Configuration
@Import(BeanValidatorPluginsConfiguration.class) @Import(BeanValidatorPluginsConfiguration.class)
public class Knife4jConfiguration implements BeanPostProcessor{ public class Knife4jConfiguration implements BeanPostProcessor{
private static final String splitor = ",";
private final OpenApiExtensionResolver openApiExtensionResolver; private final OpenApiExtensionResolver openApiExtensionResolver;
@Value("${version}") @Value("${version}")
@ -54,12 +61,12 @@ public class Knife4jConfiguration implements BeanPostProcessor{
@Bean(value = "datasourceApi") @Bean(value = "datasourceApi")
public Docket datasourceApi() { public Docket datasourceApi() {
return defaultApi("数据源管理", "io.dataease.datasource"); return defaultApi("数据源管理", "io.dataease.controller.datasource");
} }
@Bean(value = "sysApi") @Bean(value = "sysApi")
public Docket sysApi() { public Docket sysApi() {
return defaultApi("系统管理", "io.dataease.controller.sys"); return defaultApi("系统管理", "io.dataease.controller.sys,io.dataease.plugins.server");
} }
private ApiInfo apiInfo(){ private ApiInfo apiInfo(){
@ -79,12 +86,12 @@ public class Knife4jConfiguration implements BeanPostProcessor{
List<SecurityContext> securityContexts = new ArrayList<>(); List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add(securityContext()); securityContexts.add(securityContext());
Docket docket=new Docket(DocumentationType.OAS_30) Docket docket=new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo()) .apiInfo(apiInfo())
.groupName(groupName) .groupName(groupName)
.select() .select()
.apis(RequestHandlerSelectors.basePackage(packageName)) /*.apis(RequestHandlerSelectors.basePackage(packageName))*/
.apis(basePackage(packageName))
.paths(PathSelectors.any()) .paths(PathSelectors.any())
.build() .build()
.securityContexts(securityContexts).securitySchemes(securitySchemes) .securityContexts(securityContexts).securitySchemes(securitySchemes)
@ -120,4 +127,25 @@ public class Knife4jConfiguration implements BeanPostProcessor{
return results; return results;
} }
public static Predicate<RequestHandler> basePackage(final String basePackage) {
return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}
private static Function<Class<?>, 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<? extends Class<?>> declaringClass(RequestHandler input) {
return Optional.fromNullable(input.declaringClass());
}
} }

View File

@ -44,7 +44,8 @@ public class IndexController {
case valid: case valid:
return "doc.html"; return "doc.html";
default: default:
return "nolic.html"; // return "nolic.html";
return "doc.html";
} }
} }

View File

@ -3,9 +3,12 @@ package io.dataease.controller.dataset;
import com.auth0.jwt.JWT; import com.auth0.jwt.JWT;
import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.DecodedJWT;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.dataease.auth.annotation.DePermission;
import io.dataease.auth.filter.F2CLinkFilter; import io.dataease.auth.filter.F2CLinkFilter;
import io.dataease.base.domain.DatasetTable; import io.dataease.base.domain.DatasetTable;
import io.dataease.base.domain.DatasetTableField; 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.commons.exception.DEException;
import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.request.dataset.DataSetTableRequest;
import io.dataease.controller.request.dataset.MultFieldValuesRequest; import io.dataease.controller.request.dataset.MultFieldValuesRequest;
@ -106,6 +109,7 @@ public class DataSetTableFieldController {
dataSetTableFieldsService.batchEdit(list); dataSetTableFieldsService.batchEdit(list);
} }
@DePermission(type = DePermissionType.DATASET, value = "tableId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE)
@ApiOperation("保存") @ApiOperation("保存")
@PostMapping("save") @PostMapping("save")
public DatasetTableField save(@RequestBody DatasetTableField datasetTableField) { public DatasetTableField save(@RequestBody DatasetTableField datasetTableField) {

View File

@ -3,7 +3,10 @@ package io.dataease.controller.dataset;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.dataease.auth.annotation.DePermission;
import io.dataease.base.domain.DatasetTableTask; 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.PageUtils;
import io.dataease.commons.utils.Pager; import io.dataease.commons.utils.Pager;
import io.dataease.controller.request.dataset.DataSetTaskRequest; import io.dataease.controller.request.dataset.DataSetTaskRequest;
@ -32,6 +35,7 @@ public class DataSetTableTaskController {
@Resource @Resource
private DataSetTableTaskLogService dataSetTableTaskLogService; private DataSetTableTaskLogService dataSetTableTaskLogService;
@DePermission(type = DePermissionType.DATASET, value = "datasetTableTask.tableId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE)
@ApiOperation("保存") @ApiOperation("保存")
@PostMapping("save") @PostMapping("save")
public DatasetTableTask save(@RequestBody DataSetTaskRequest dataSetTaskRequest) throws Exception { public DatasetTableTask save(@RequestBody DataSetTaskRequest dataSetTaskRequest) throws Exception {
@ -70,6 +74,7 @@ public class DataSetTableTaskController {
dataSetTableTaskService.updateDatasetTableTaskStatus(datasetTableTask); dataSetTableTaskService.updateDatasetTableTaskStatus(datasetTableTask);
} }
@DePermission(type = DePermissionType.DATASET, value = "tableId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE)
@ApiOperation("执行任务") @ApiOperation("执行任务")
@PostMapping("/execTask") @PostMapping("/execTask")
public void execTask(@RequestBody DatasetTableTask datasetTableTask) throws Exception{ public void execTask(@RequestBody DatasetTableTask datasetTableTask) throws Exception{

View File

@ -3,7 +3,10 @@ package io.dataease.controller.dataset;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.dataease.auth.annotation.DePermission;
import io.dataease.base.domain.DatasetTableTaskLog; 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.PageUtils;
import io.dataease.commons.utils.Pager; import io.dataease.commons.utils.Pager;
import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.controller.sys.base.BaseGridRequest;
@ -28,6 +31,7 @@ public class DataSetTableTaskLogController {
@Resource @Resource
private DataSetTableTaskLogService dataSetTableTaskLogService; private DataSetTableTaskLogService dataSetTableTaskLogService;
@DePermission(type = DePermissionType.DATASET, value = "tableId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE)
@ApiOperation("保存") @ApiOperation("保存")
@PostMapping("save") @PostMapping("save")
public DatasetTableTaskLog save(@RequestBody DatasetTableTaskLog datasetTableTaskLog) { public DatasetTableTaskLog save(@RequestBody DatasetTableTaskLog datasetTableTaskLog) {

View File

@ -50,7 +50,7 @@ public class DatasourceController {
@DePermission(type = DePermissionType.DATASOURCE, value = "id") @DePermission(type = DePermissionType.DATASOURCE, value = "id")
@ApiOperation("验证数据源") @ApiOperation("验证数据源")
@PostMapping("/validate") @PostMapping("/validate")
public ResultHolder validate(@RequestBody Datasource datasource) throws Exception { public ResultHolder validate(@RequestBody DatasourceDTO datasource) throws Exception {
return datasourceService.validate(datasource); return datasourceService.validate(datasource);
} }

View File

@ -16,5 +16,6 @@ public class ApiDefinition {
private List<DatasetTableField> fields; private List<DatasetTableField> fields;
private String request; private String request;
private String dataPath; private String dataPath;
private String status;
private List<JSONObject> datas = new ArrayList<>(); private List<JSONObject> datas = new ArrayList<>();
} }

View File

@ -18,10 +18,11 @@ import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ApiIgnore
@RestController @RestController
@RequestMapping("plugin/dataset/columnPermissions") @RequestMapping("plugin/dataset/columnPermissions")
public class ColumnPermissionsController { public class ColumnPermissionsController {

View File

@ -15,10 +15,11 @@ import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ApiIgnore
@RestController @RestController
@RequestMapping("plugin/dataset/rowPermissions") @RequestMapping("plugin/dataset/rowPermissions")
public class RowPermissionsController { public class RowPermissionsController {

View File

@ -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.dto.SSOUserInfo;
import io.dataease.plugins.xpack.oidc.service.OidcXpackService; import io.dataease.plugins.xpack.oidc.service.OidcXpackService;
import io.dataease.service.sys.SysUserService; import io.dataease.service.sys.SysUserService;
import springfox.documentation.annotations.ApiIgnore;
@ApiIgnore
@RequestMapping("/sso") @RequestMapping("/sso")
@Controller @Controller
public class SSOServer { public class SSOServer {

View File

@ -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.ThemeItem;
import io.dataease.plugins.xpack.theme.dto.ThemeRequest; import io.dataease.plugins.xpack.theme.dto.ThemeRequest;
import io.dataease.plugins.xpack.theme.service.ThemeXpackService; import io.dataease.plugins.xpack.theme.service.ThemeXpackService;
import springfox.documentation.annotations.ApiIgnore;
@ApiIgnore
@RequestMapping("/plugin/theme") @RequestMapping("/plugin/theme")
@RestController @RestController
public class ThemeServer { public class ThemeServer {

View File

@ -17,9 +17,10 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import io.dataease.plugins.xpack.auth.service.AuthXpackService; import io.dataease.plugins.xpack.auth.service.AuthXpackService;
import springfox.documentation.annotations.ApiIgnore;
import java.util.*; import java.util.*;
@ApiIgnore
@RequestMapping("/plugin/auth") @RequestMapping("/plugin/auth")
@RestController @RestController
public class XAuthServer { public class XAuthServer {

View File

@ -95,15 +95,15 @@ public class XDeptServer {
} }
@RequiresPermissions("dept:del")
@ApiIgnore @ApiIgnore
@ApiOperation("删除")
@PostMapping("/nodesByDeptId/{deptId}") @PostMapping("/nodesByDeptId/{deptId}")
public List<XpackDeptTreeNode> nodesByDeptId(@PathVariable("deptId") Long deptId){ public List<XpackDeptTreeNode> nodesByDeptId(@PathVariable("deptId") Long deptId){
DeptXpackService deptService = SpringContextUtil.getBean(DeptXpackService.class); DeptXpackService deptService = SpringContextUtil.getBean(DeptXpackService.class);
return deptService.searchTree(deptId); return deptService.searchTree(deptId);
} }
@RequiresPermissions("dept:edit")
@ApiOperation("移动") @ApiOperation("移动")
@PostMapping("/move") @PostMapping("/move")
public void move(@RequestBody XpackMoveDept xpackMoveDept){ public void move(@RequestBody XpackMoveDept xpackMoveDept){

View File

@ -7,9 +7,11 @@ import io.dataease.plugins.xpack.display.service.DisplayXpackService;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ApiIgnore
@RequestMapping("/api/display") @RequestMapping("/api/display")
@RestController @RestController
public class XDisplayServer { public class XDisplayServer {

View File

@ -23,13 +23,14 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List; import java.util.List;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import javax.annotation.Resource; import javax.annotation.Resource;
@ApiIgnore
@RequestMapping("/plugin/task") @RequestMapping("/plugin/task")
@RestController @RestController
public class XEmailTaskServer { public class XEmailTaskServer {

View File

@ -8,9 +8,10 @@ import io.dataease.plugins.xpack.ldap.dto.response.LdapInfo;
import io.dataease.plugins.xpack.ldap.service.LdapXpackService; import io.dataease.plugins.xpack.ldap.service.LdapXpackService;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List; import java.util.List;
@ApiIgnore
@RequestMapping("/plugin/ldap") @RequestMapping("/plugin/ldap")
@RestController @RestController
public class XLdapServer { public class XLdapServer {

View File

@ -7,10 +7,12 @@ import io.dataease.plugins.xpack.oidc.service.OidcXpackService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ApiIgnore
@RequestMapping("/plugin/oidc") @RequestMapping("/plugin/oidc")
@RestController @RestController
public class XOidcServer { public class XOidcServer {

View File

@ -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.dto.request.XpackUkeyDto;
import io.dataease.plugins.xpack.ukey.service.UkeyXpackService; import io.dataease.plugins.xpack.ukey.service.UkeyXpackService;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import java.util.List; import java.util.List;
@ApiIgnore
@RequestMapping("/plugin/ukey") @RequestMapping("/plugin/ukey")
@RestController @RestController
public class XUserKeysServer { public class XUserKeysServer {

View File

@ -12,7 +12,9 @@ import org.springframework.web.bind.annotation.RestController;
import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.config.SpringContextUtil;
import io.dataease.plugins.view.entity.PluginViewType; import io.dataease.plugins.view.entity.PluginViewType;
import io.dataease.plugins.view.service.ViewPluginService; import io.dataease.plugins.view.service.ViewPluginService;
import springfox.documentation.annotations.ApiIgnore;
@ApiIgnore
@RequestMapping("/plugin/view") @RequestMapping("/plugin/view")
@RestController @RestController
public class PluginViewServer { public class PluginViewServer {

View File

@ -12,15 +12,13 @@ import io.dataease.controller.request.datasource.ApiDefinitionRequest;
import io.dataease.controller.request.datasource.DatasourceRequest; import io.dataease.controller.request.datasource.DatasourceRequest;
import io.dataease.dto.datasource.TableDesc; import io.dataease.dto.datasource.TableDesc;
import io.dataease.dto.datasource.TableField; import io.dataease.dto.datasource.TableField;
import io.dataease.exception.DataEaseException;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHeaders;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -102,22 +100,18 @@ public class ApiProvider extends DatasourceProvider{
@Override @Override
public String checkStatus(DatasourceRequest datasourceRequest) throws Exception { public String checkStatus(DatasourceRequest datasourceRequest) throws Exception {
List<ApiDefinition> apiDefinitionList = JSONObject.parseArray(datasourceRequest.getDatasource().getConfiguration(), ApiDefinition.class).stream().filter(item -> item.getName().equalsIgnoreCase(datasourceRequest.getTable())).collect(Collectors.toList()); List<ApiDefinition> apiDefinitionList = JSONObject.parseArray(datasourceRequest.getDatasource().getConfiguration(), ApiDefinition.class);
int success = 0; JSONObject apiItemStatuses = new JSONObject();
for (ApiDefinition apiDefinition : apiDefinitionList) { for (ApiDefinition apiDefinition : apiDefinitionList) {
datasourceRequest.setTable(apiDefinition.getName()); datasourceRequest.setTable(apiDefinition.getName());
try { try {
getData(datasourceRequest); getData(datasourceRequest);
success++; apiItemStatuses.put(apiDefinition.getName(), "Success");
}catch (Exception ignore){} }catch (Exception ignore){
apiItemStatuses.put(apiDefinition.getName(), "Error");
}
} }
if(success == apiDefinitionList.size()){ return JSONObject.toJSONString(apiItemStatuses);
return "Success";
}
if(success > 0 && success < apiDefinitionList.size() ){
return "Warning";
}
return "Error";
} }
static public String execHttpRequest(ApiDefinition apiDefinition) throws Exception{ static public String execHttpRequest(ApiDefinition apiDefinition) throws Exception{

View File

@ -405,7 +405,7 @@ public class DataSetTableService {
public DataSetTableDTO getWithPermission(String id, Long user) { public DataSetTableDTO getWithPermission(String id, Long user) {
CurrentUserDto currentUserDto = AuthUtils.getUser(); CurrentUserDto currentUserDto = AuthUtils.getUser();
Long userId = user != null ? currentUserDto.getUserId() : user; Long userId = currentUserDto != null ? currentUserDto.getUserId() : user;
DataSetTableRequest dataSetTableRequest = new DataSetTableRequest(); DataSetTableRequest dataSetTableRequest = new DataSetTableRequest();
dataSetTableRequest.setId(id); dataSetTableRequest.setId(id);
@ -464,7 +464,7 @@ public class DataSetTableService {
} }
public Map<String, Object> getPreviewData(DataSetTableRequest dataSetTableRequest, Integer page, Integer pageSize, public Map<String, Object> getPreviewData(DataSetTableRequest dataSetTableRequest, Integer page, Integer pageSize,
List<DatasetTableField> extFields) throws Exception { List<DatasetTableField> extFields) throws Exception {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
DatasetTableField datasetTableField = DatasetTableField.builder().tableId(dataSetTableRequest.getId()) DatasetTableField datasetTableField = DatasetTableField.builder().tableId(dataSetTableRequest.getId())
.checked(Boolean.TRUE).build(); .checked(Boolean.TRUE).build();
@ -926,8 +926,8 @@ public class DataSetTableService {
DorisTableUtils.dorisFieldName( DorisTableUtils.dorisFieldName(
datasetTableField.getTableId() + "_" + datasetTableField.getDataeaseName())) datasetTableField.getTableId() + "_" + datasetTableField.getDataeaseName()))
|| StringUtils.equalsIgnoreCase(tableField.getFieldName(), || StringUtils.equalsIgnoreCase(tableField.getFieldName(),
DorisTableUtils.dorisFieldNameShort(datasetTableField.getTableId() + "_" DorisTableUtils.dorisFieldNameShort(datasetTableField.getTableId() + "_"
+ datasetTableField.getOriginName()))) { + datasetTableField.getOriginName()))) {
tableField.setRemarks(datasetTableField.getName()); tableField.setRemarks(datasetTableField.getName());
break; break;
} }
@ -990,7 +990,7 @@ public class DataSetTableService {
DorisTableUtils.dorisFieldName( DorisTableUtils.dorisFieldName(
datasetTableField.getTableId() + "_" + datasetTableField.getDataeaseName())) datasetTableField.getTableId() + "_" + datasetTableField.getDataeaseName()))
|| StringUtils.equalsIgnoreCase(tableField.getFieldName(), DorisTableUtils.dorisFieldName( || StringUtils.equalsIgnoreCase(tableField.getFieldName(), DorisTableUtils.dorisFieldName(
datasetTableField.getTableId() + "_" + datasetTableField.getOriginName()))) { datasetTableField.getTableId() + "_" + datasetTableField.getOriginName()))) {
tableField.setRemarks(datasetTableField.getName()); tableField.setRemarks(datasetTableField.getName());
break; break;
} }
@ -1073,7 +1073,7 @@ public class DataSetTableService {
} }
public String getCustomSQLDatasource(DataTableInfoDTO dataTableInfoDTO, List<DataSetTableUnionDTO> list, public String getCustomSQLDatasource(DataTableInfoDTO dataTableInfoDTO, List<DataSetTableUnionDTO> list,
Datasource ds) { Datasource ds) {
DatasourceTypes datasourceTypes = DatasourceTypes.valueOf(ds.getType()); DatasourceTypes datasourceTypes = DatasourceTypes.valueOf(ds.getType());
String keyword = datasourceTypes.getKeywordPrefix() + "%s" + datasourceTypes.getKeywordSuffix(); String keyword = datasourceTypes.getKeywordPrefix() + "%s" + datasourceTypes.getKeywordSuffix();
Map<String, String[]> customInfo = new TreeMap<>(); Map<String, String[]> customInfo = new TreeMap<>();
@ -1260,7 +1260,7 @@ public class DataSetTableService {
// 递归计算出所有子级的checkedFields和unionParam // 递归计算出所有子级的checkedFields和unionParam
private void getUnionSQLDorisJoin(List<UnionDTO> childrenDs, Map<String, String[]> checkedInfo, private void getUnionSQLDorisJoin(List<UnionDTO> childrenDs, Map<String, String[]> checkedInfo,
List<UnionParamDTO> unionList, List<DatasetTableField> checkedFields) { List<UnionParamDTO> unionList, List<DatasetTableField> checkedFields) {
for (int i = 0; i < childrenDs.size(); i++) { for (int i = 0; i < childrenDs.size(); i++) {
UnionDTO unionDTO = childrenDs.get(i); UnionDTO unionDTO = childrenDs.get(i);
String tableId = unionDTO.getCurrentDs().getId(); String tableId = unionDTO.getCurrentDs().getId();
@ -1398,7 +1398,7 @@ public class DataSetTableService {
// 递归计算出所有子级的checkedFields和unionParam // 递归计算出所有子级的checkedFields和unionParam
private void getUnionSQLDatasourceJoin(List<UnionDTO> childrenDs, Map<String, String[]> checkedInfo, private void getUnionSQLDatasourceJoin(List<UnionDTO> childrenDs, Map<String, String[]> checkedInfo,
List<UnionParamDTO> unionList, String keyword, List<DatasetTableField> checkedFields) { List<UnionParamDTO> unionList, String keyword, List<DatasetTableField> checkedFields) {
for (int i = 0; i < childrenDs.size(); i++) { for (int i = 0; i < childrenDs.size(); i++) {
UnionDTO unionDTO = childrenDs.get(i); UnionDTO unionDTO = childrenDs.get(i);
@ -1703,10 +1703,10 @@ public class DataSetTableService {
if (datasetTableIncrementalConfig == null || StringUtils.isEmpty(datasetTableIncrementalConfig.getTableId())) { if (datasetTableIncrementalConfig == null || StringUtils.isEmpty(datasetTableIncrementalConfig.getTableId())) {
return; return;
} }
if(StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalAdd())){ if (StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalAdd())) {
datasetTableIncrementalConfig.setIncrementalAdd(datasetTableIncrementalConfig.getIncrementalAdd().trim()); datasetTableIncrementalConfig.setIncrementalAdd(datasetTableIncrementalConfig.getIncrementalAdd().trim());
} }
if(StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalDelete())){ if (StringUtils.isNotEmpty(datasetTableIncrementalConfig.getIncrementalDelete())) {
datasetTableIncrementalConfig.setIncrementalDelete(datasetTableIncrementalConfig.getIncrementalDelete().trim()); datasetTableIncrementalConfig.setIncrementalDelete(datasetTableIncrementalConfig.getIncrementalDelete().trim());
} }
if (StringUtils.isEmpty(datasetTableIncrementalConfig.getId())) { if (StringUtils.isEmpty(datasetTableIncrementalConfig.getId())) {

View File

@ -1,5 +1,6 @@
package io.dataease.service.datasource; package io.dataease.service.datasource;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.JsonPath;
@ -110,12 +111,38 @@ public class DatasourceService {
datasourceDTO.setConfiguration(JSONObject.toJSONString(new Gson().fromJson(datasourceDTO.getConfiguration(), CHConfiguration.class)) ); datasourceDTO.setConfiguration(JSONObject.toJSONString(new Gson().fromJson(datasourceDTO.getConfiguration(), CHConfiguration.class)) );
break; break;
case api: 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; break;
default: default:
break; break;
} }
}catch (Exception ignore){} }catch (Exception ignore){
ignore.printStackTrace();
}
}); });
return datasourceDTOS; return datasourceDTOS;
@ -135,6 +162,7 @@ public class DatasourceService {
return extDataSourceMapper.query(gridExample); return extDataSourceMapper.query(gridExample);
} }
@DeCleaner(DePermissionType.DATASOURCE)
public void deleteDatasource(String datasourceId) throws Exception { public void deleteDatasource(String datasourceId) throws Exception {
DatasetTableExample example = new DatasetTableExample(); DatasetTableExample example = new DatasetTableExample();
example.createCriteria().andDataSourceIdEqualTo(datasourceId); example.createCriteria().andDataSourceIdEqualTo(datasourceId);
@ -156,22 +184,39 @@ public class DatasourceService {
handleConnectionPool(datasource, "edit"); handleConnectionPool(datasource, "edit");
} }
public ResultHolder validate(Datasource datasource) throws Exception { public ResultHolder validate(DatasourceDTO datasource) throws Exception {
try { try {
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType()); DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(datasource); datasourceRequest.setDatasource(datasource);
String status = datasourceProvider.checkStatus(datasourceRequest); String datasourceStatus = datasourceProvider.checkStatus(datasourceRequest);
if (status.equalsIgnoreCase("Success")) { if(datasource.getType().equalsIgnoreCase("api")){
return ResultHolder.success("Success"); 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.success(datasource);
return ResultHolder.error("Datasource has invalid items");
}
if (status.equalsIgnoreCase("Error")) {
return ResultHolder.error("Datasource is invalid");
}
return ResultHolder.success("Success");
}catch (Exception e){ }catch (Exception e){
return ResultHolder.error("Datasource is invalid: " + e.getMessage()); return ResultHolder.error("Datasource is invalid: " + e.getMessage());
} }
@ -187,17 +232,29 @@ public class DatasourceService {
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType()); DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(datasource); datasourceRequest.setDatasource(datasource);
String status = datasourceProvider.checkStatus(datasourceRequest); String datasourceStatus = datasourceProvider.checkStatus(datasourceRequest);
datasource.setStatus(status); datasource.setStatus(datasourceStatus);
if (status.equalsIgnoreCase("Success")) {
return ResultHolder.success("Success"); if(datasource.getType().equalsIgnoreCase("api")){
} List<ApiDefinition> apiDefinitionList = JSONObject.parseArray(datasource.getConfiguration(), ApiDefinition.class);
if (status.equalsIgnoreCase("Warning")) { JSONObject apiItemStatuses = JSONObject.parseObject(datasourceStatus);
return ResultHolder.error("Datasource has invalid items"); int success = 0;
} for (ApiDefinition apiDefinition : apiDefinitionList) {
if (status.equalsIgnoreCase("Error")) { String status = apiItemStatuses.getString(apiDefinition.getName());
return ResultHolder.error("Datasource is invalid"); 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"); return ResultHolder.success("Success");
}catch (Exception e){ }catch (Exception e){
datasource.setStatus("Error"); datasource.setStatus("Error");
@ -219,12 +276,14 @@ public class DatasourceService {
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(ds); datasourceRequest.setDatasource(ds);
datasourceProvider.checkStatus(datasourceRequest); if(!datasource.getType().equalsIgnoreCase("api")){
datasourceProvider.checkStatus(datasourceRequest);
}
List<TableDesc> tables = datasourceProvider.getTables(datasourceRequest); List<TableDesc> tables = datasourceProvider.getTables(datasourceRequest);
// 获取当前数据源下的db类型数据集 // 获取当前数据源下的dbapi类型数据集
DatasetTableExample datasetTableExample = new DatasetTableExample(); DatasetTableExample datasetTableExample = new DatasetTableExample();
datasetTableExample.createCriteria().andTypeIn(Arrays.asList("db","api")).andDataSourceIdEqualTo(datasource.getId()); datasetTableExample.createCriteria().andTypeIn(Arrays.asList("db","api")).andDataSourceIdEqualTo(datasource.getId());
List<DatasetTable> datasetTables = datasetTableMapper.selectByExampleWithBLOBs(datasetTableExample); List<DatasetTable> datasetTables = datasetTableMapper.selectByExampleWithBLOBs(datasetTableExample);
List<DBTableDTO> list = new ArrayList<>(); List<DBTableDTO> list = new ArrayList<>();

View File

@ -354,6 +354,9 @@ SET FOREIGN_KEY_CHECKS = 1;
ALTER TABLE `panel_view` ALTER TABLE `panel_view`
ADD COLUMN `position` varchar(255) NULL DEFAULT 'panel' COMMENT '视图位置 panel 仪表板中tab Tab页中' AFTER `update_time`; 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` ALTER TABLE `panel_view`
ADD COLUMN `copy_from_panel` varchar(255) NULL AFTER `position`, ADD COLUMN `copy_from_panel` varchar(255) NULL AFTER `position`,
ADD COLUMN `copy_from_view` varchar(255) NULL AFTER `copy_from_panel`, ADD COLUMN `copy_from_view` varchar(255) NULL AFTER `copy_from_panel`,

View File

@ -1337,7 +1337,11 @@ export default {
auth_config_info: 'Permission verification is required for the request', auth_config_info: 'Permission verification is required for the request',
verified: 'Verified', verified: 'Verified',
verification_method: 'Verification Method', 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: { pblink: {
key_pwd: 'Please enter the password to open the link', key_pwd: 'Please enter the password to open the link',

View File

@ -1338,7 +1338,11 @@ export default {
auth_config_info: '請求需要進行權限校驗', auth_config_info: '請求需要進行權限校驗',
verified: '認證', verified: '認證',
verification_method: '認證方式', verification_method: '認證方式',
username: '用戶名' username: '用戶名',
api_table_not_empty: 'API 數據表不能為空',
has_repeat_name: 'API 數據表名稱重複',
valid: '有效',
invalid: '無效'
}, },
pblink: { pblink: {
key_pwd: '請輸入密碼打開鏈接', key_pwd: '請輸入密碼打開鏈接',

View File

@ -1346,7 +1346,11 @@ export default {
auth_config_info: '请求需要进行权限校验', auth_config_info: '请求需要进行权限校验',
verified: '认证', verified: '认证',
verification_method: '认证方式', verification_method: '认证方式',
username: '用户名' username: '用户名',
api_table_not_empty: 'API 数据表不能为空',
has_repeat_name: 'API 数据表名称重复',
valid: '有效',
invalid: '无效'
}, },
pblink: { pblink: {
key_pwd: '请输入密码打开链接', key_pwd: '请输入密码打开链接',

View File

@ -622,7 +622,7 @@
/> />
</el-collapse-item> </el-collapse-item>
<el-collapse-item <el-collapse-item
v-show="view.render && view.render === 'antv' && chart.type !== 'map' && chart.type !== 'waterfall' && chart.type !== 'word-cloud' && chart.type !== 'treemap'" v-show="view.render && view.render === 'antv' && chart.type !== 'map' && chart.type !== 'waterfall' && chart.type !== 'word-cloud' && chart.type !== 'treemap' && chart.type !== 'funnel'"
name="size" name="size"
:title="(chart.type && chart.type.includes('table')) ? $t('chart.table_config') : $t('chart.size')" :title="(chart.type && chart.type.includes('table')) ? $t('chart.table_config') : $t('chart.size')"
> >

View File

@ -48,6 +48,18 @@
<el-table-column prop="name" :label="$t('datasource.data_table_name')" width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="name" :label="$t('datasource.data_table_name')" width="150" show-overflow-tooltip></el-table-column>
<el-table-column prop="method" :label="$t('datasource.method')" width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="method" :label="$t('datasource.method')" width="150" show-overflow-tooltip></el-table-column>
<el-table-column prop="url" :label="$t('datasource.url')" width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="url" :label="$t('datasource.url')" width="150" show-overflow-tooltip></el-table-column>
<el-table-column prop="status" :label="$t('commons.status')" width="150">
<template slot-scope="scope">
<span v-if="scope.row.status === 'Success'" style="color: green">
{{ $t('datasource.valid') }}
</span>
<span v-if="scope.row.status === 'Error'" style="color: red">
{{ $t('datasource.invalid') }}
</span>
</template>
</el-table-column>
<el-table-column :label="$t('dataset.operate')"> <el-table-column :label="$t('dataset.operate')">
<template slot-scope="scope" style="float: right"> <template slot-scope="scope" style="float: right">
<el-button size="mini" type="primary" icon="el-icon-edit" circle @click="addApiItem(scope.row)"/> <el-button size="mini" type="primary" icon="el-icon-edit" circle @click="addApiItem(scope.row)"/>
@ -409,7 +421,7 @@ export default {
canEdit: false, canEdit: false,
originConfiguration: {}, originConfiguration: {},
edit_api_item: false, edit_api_item: false,
add_api_item: false, add_api_item: true,
active: 0, active: 0,
defaultApiItem: { defaultApiItem: {
name: '', name: '',
@ -426,6 +438,7 @@ export default {
fields: [] fields: []
}, },
apiItem: { apiItem: {
status: '',
name: '', name: '',
url: '', url: '',
method: 'GET', method: 'GET',
@ -571,6 +584,10 @@ export default {
const method = this.formType === 'add' ? addDs : editDs const method = this.formType === 'add' ? addDs : editDs
const form = JSON.parse(JSON.stringify(this.form)) const form = JSON.parse(JSON.stringify(this.form))
if(form.type === 'api'){ if(form.type === 'api'){
if(this.form.apiConfiguration.length < 1){
this.$message.error(i18n.t('datasource.api_table_not_empty'))
return
}
form.configuration = JSON.stringify(form.apiConfiguration) form.configuration = JSON.stringify(form.apiConfiguration)
}else { }else {
form.configuration = JSON.stringify(form.configuration) form.configuration = JSON.stringify(form.configuration)
@ -655,6 +672,9 @@ export default {
if (res.success) { if (res.success) {
this.$success(i18n.t('datasource.validate_success')) this.$success(i18n.t('datasource.validate_success'))
} else { } else {
if(data.type === 'api') {
this.form.apiConfiguration = res.data.apiConfiguration
}
if (res.message.length < 2500) { if (res.message.length < 2500) {
this.$error(res.message) this.$error(res.message)
} else { } else {
@ -686,6 +706,25 @@ export default {
}, },
next() { next() {
if(this.active === 1){ if(this.active === 1){
let hasRepeatName = false
if(this.add_api_item){
this.form.apiConfiguration.forEach(item => {
if(item.name === this.apiItem.name){
hasRepeatName = true
}
})
}else {
let index = this.form.apiConfiguration.indexOf(this.apiItem)
for(let i=0; i < this.form.apiConfiguration.length;i++ ){
if(i !== index && this.form.apiConfiguration[i].name === this.apiItem.name){
hasRepeatName = true
}
}
}
if(hasRepeatName){
this.$message.error(i18n.t('datasource.has_repeat_name'))
return
}
this.$refs.apiItem.validate(valid => { this.$refs.apiItem.validate(valid => {
if (valid) { if (valid) {
const data = JSON.parse(JSON.stringify(this.apiItem)) const data = JSON.parse(JSON.stringify(this.apiItem))
@ -693,6 +732,7 @@ export default {
this.loading = true this.loading = true
checkApiDatasource(data).then(res => { checkApiDatasource(data).then(res => {
this.loading = false this.loading = false
this.apiItem.status = 'Success'
this.$success(i18n.t('commons.success')) this.$success(i18n.t('commons.success'))
this.active++ this.active++
this.apiItem.fields = res.data.fields this.apiItem.fields = res.data.fields
@ -718,17 +758,17 @@ export default {
saveItem() { saveItem() {
this.active = 0 this.active = 0
this.edit_api_item = false this.edit_api_item = false
if(!this.add_api_item){ if(this.add_api_item){
this.form.apiConfiguration.push(this.apiItem) this.form.apiConfiguration.push(this.apiItem)
} }
}, },
addApiItem(item) { addApiItem(item) {
if (item) { if (item) {
this.add_api_item = true this.add_api_item = false
this.api_table_title = this.$t('datasource.edit_api_table') this.api_table_title = this.$t('datasource.edit_api_table')
this.apiItem = item this.apiItem = item
}else { }else {
this.add_api_item = false this.add_api_item = true
this.apiItem = JSON.parse(JSON.stringify(this.defaultApiItem)) this.apiItem = JSON.parse(JSON.stringify(this.defaultApiItem))
this.api_table_title = this.$t('datasource.add_api_table') this.api_table_title = this.$t('datasource.add_api_table')
} }
@ -738,21 +778,6 @@ export default {
deleteItem(item) { deleteItem(item) {
this.form.apiConfiguration.splice(this.form.apiConfiguration.indexOf(item), 1) this.form.apiConfiguration.splice(this.form.apiConfiguration.indexOf(item), 1)
}, },
runDebug() {
this.$refs['debugForm'].validate((valid) => {
if (valid) {
this.loading = true;
this.isStop = true;
this.request.url = this.debugForm.url;
this.request.method = this.debugForm.method;
this.request.name = getUUID().substring(0, 8);
this.runData = [];
this.runData.push(this.request);
/*触发执行操作*/
this.reportId = getUUID().substring(0, 8);
}
})
},
validateApi(item) { validateApi(item) {
if(undefined){ if(undefined){