feat: 支持飞书数据源插件

This commit is contained in:
taojinlong
2025-02-17 16:00:10 +08:00
committed by taojinlong
parent 29a6bdb923
commit 879ae12718
18 changed files with 409 additions and 119 deletions

View File

@@ -34,6 +34,7 @@ import io.dataease.extensions.datasource.dto.*;
import io.dataease.extensions.datasource.factory.ProviderFactory;
import io.dataease.extensions.datasource.model.SQLMeta;
import io.dataease.extensions.datasource.provider.Provider;
import io.dataease.extensions.datasource.vo.DatasourceConfiguration;
import io.dataease.extensions.view.dto.ChartExtFilterDTO;
import io.dataease.extensions.view.dto.ChartExtRequest;
import io.dataease.extensions.view.dto.ColumnPermissionItem;
@@ -103,7 +104,7 @@ public class DatasetDataManage {
if (StringUtils.equalsIgnoreCase(type, DatasetTableType.DB) || StringUtils.equalsIgnoreCase(type, DatasetTableType.SQL)) {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(datasetTableDTO.getDatasourceId());
DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO();
if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || StringUtils.equalsIgnoreCase("api", coreDatasource.getType())) {
if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
coreDatasource = engineManage.getDeEngine();
}
if (StringUtils.isNotEmpty(coreDatasource.getStatus()) && "Error".equalsIgnoreCase(coreDatasource.getStatus())) {
@@ -406,7 +407,7 @@ public class DatasetDataManage {
public Map<String, Object> previewSql(PreviewSqlDTO dto) throws DEException {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(dto.getDatasourceId());
DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO();
if (coreDatasource.getType().equalsIgnoreCase("API") || coreDatasource.getType().equalsIgnoreCase("Excel")) {
if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) || coreDatasource.getType().equalsIgnoreCase("Excel")) {
BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine());
} else {
BeanUtils.copyBean(datasourceSchemaDTO, coreDatasource);

View File

@@ -510,7 +510,7 @@ public class DatasetSQLManage {
if (coreDatasource == null) {
DEException.throwException(Translator.get("i18n_dataset_ds_error") + ",ID:" + ds.getDatasourceId());
}
if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || StringUtils.equalsIgnoreCase("api", coreDatasource.getType())) {
if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
coreDatasource = engineManage.getDeEngine();
}

View File

@@ -29,9 +29,7 @@ import org.quartz.JobKey;
import org.quartz.TriggerKey;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import static io.dataease.datasource.server.DatasourceTaskServer.ScheduleType.CRON;
import static io.dataease.datasource.server.DatasourceTaskServer.ScheduleType.MANUAL;
@@ -49,6 +47,9 @@ public class DatasourceSyncManage {
private ScheduleManager scheduleManager;
@Resource
private CalciteProvider calciteProvider;
@Resource
private DatasourceServer datasourceServer;
public void extractExcelData(CoreDatasource coreDatasource, String type) {
if (coreDatasource == null) {
@@ -138,11 +139,11 @@ public class DatasourceSyncManage {
public void extractedData(Long taskId, CoreDatasource coreDatasource, DatasourceServer.UpdateType updateType, String scheduleType) {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> tables = ApiUtils.getTables(datasourceRequest);
List<DatasetTableDTO> tables = (List<DatasetTableDTO>) datasourceServer.invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
for (DatasetTableDTO api : tables) {
CoreDatasourceTaskLog datasetTableTaskLog = datasourceTaskServer.initTaskLog(coreDatasource.getId(), taskId, api.getTableName(), scheduleType);
datasourceRequest.setTable(api.getTableName());
List<TableField> tableFields = ApiUtils.getTableFields(datasourceRequest);
List<TableField> tableFields = (List<TableField>) datasourceServer.invokeMethod(coreDatasource.getType(), "getTableFields", DatasourceRequest.class, datasourceRequest);
try {
datasetTableTaskLog.setInfo(datasetTableTaskLog.getInfo() + "/n Begin to sync datatable: " + datasourceRequest.getTable());
createEngineTable(datasourceRequest.getTable(), tableFields);
@@ -191,11 +192,11 @@ public class DatasourceSyncManage {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> tables = ApiUtils.getTables(datasourceRequest);
List<DatasetTableDTO> tables = (List<DatasetTableDTO>) datasourceServer.invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
for (DatasetTableDTO api : tables) {
if (api.getTableName().equalsIgnoreCase(tableName)) {
datasourceRequest.setTable(api.getTableName());
List<TableField> tableFields = ApiUtils.getTableFields(datasourceRequest);
List<TableField> tableFields = (List<TableField>) datasourceServer.invokeMethod(coreDatasource.getType(), "getTableFields", DatasourceRequest.class, datasourceRequest);
try {
datasetTableTaskLog.setInfo(datasetTableTaskLog.getInfo() + "/n Begin to sync datatable: " + datasourceRequest.getTable());
createEngineTable(datasourceRequest.getTable(), tableFields);
@@ -227,7 +228,7 @@ public class DatasourceSyncManage {
}
private void extractApiData(DatasourceRequest datasourceRequest, DatasourceServer.UpdateType extractType, List<TableField> tableFields) throws Exception {
Map<String, Object> result = ApiUtils.fetchResultField(datasourceRequest);
Map<String, Object> result = (Map<String, Object>) datasourceServer.invokeMethod(datasourceRequest.getDatasource().getType(), "fetchApiResultField", DatasourceRequest.class, datasourceRequest);
List<String[]> dataList = (List<String[]>) result.get("dataList");
CoreDeEngine engine = engineManage.info();
EngineRequest engineRequest = new EngineRequest();
@@ -300,11 +301,7 @@ public class DatasourceSyncManage {
public void addSchedule(CoreDatasourceTask datasourceTask) throws DEException {
if (StringUtils.equalsIgnoreCase(datasourceTask.getSyncRate(), DatasourceTaskServer.ScheduleType.RIGHTNOW.toString())) {
scheduleManager.addOrUpdateSingleJob(new JobKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()),
new TriggerKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()),
ExtractDataJob.class,
new Date(datasourceTask.getStartTime()),
scheduleManager.getDefaultJobDataMap(datasourceTask.getDsId().toString(), datasourceTask.getCron(), datasourceTask.getId().toString(), datasourceTask.getUpdateType()));
scheduleManager.addOrUpdateSingleJob(new JobKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), new TriggerKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), ExtractDataJob.class, new Date(datasourceTask.getStartTime()), scheduleManager.getDefaultJobDataMap(datasourceTask.getDsId().toString(), datasourceTask.getCron(), datasourceTask.getId().toString(), datasourceTask.getUpdateType()));
} else {
Date endTime;
if (datasourceTask.getEndTime() == null || datasourceTask.getEndTime() == 0) {
@@ -317,11 +314,7 @@ public class DatasourceSyncManage {
}
}
scheduleManager.addOrUpdateCronJob(new JobKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()),
new TriggerKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()),
ExtractDataJob.class,
datasourceTask.getCron(), new Date(datasourceTask.getStartTime()), endTime,
scheduleManager.getDefaultJobDataMap(datasourceTask.getDsId().toString(), datasourceTask.getCron(), datasourceTask.getId().toString(), datasourceTask.getUpdateType()));
scheduleManager.addOrUpdateCronJob(new JobKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), new TriggerKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), ExtractDataJob.class, datasourceTask.getCron(), new Date(datasourceTask.getStartTime()), endTime, scheduleManager.getDefaultJobDataMap(datasourceTask.getDsId().toString(), datasourceTask.getCron(), datasourceTask.getId().toString(), datasourceTask.getUpdateType()));
}
}

View File

@@ -6,8 +6,8 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.jayway.jsonpath.JsonPath;
import io.dataease.api.ds.vo.ApiDefinition;
import io.dataease.api.ds.vo.ApiDefinitionRequest;
import io.dataease.extensions.datasource.dto.ApiDefinition;
import io.dataease.extensions.datasource.dto.ApiDefinitionRequest;
import io.dataease.exception.DEException;
import io.dataease.extensions.datasource.dto.DatasetTableDTO;
import io.dataease.extensions.datasource.dto.DatasourceRequest;
@@ -75,7 +75,7 @@ public class ApiUtils {
Map<String, Object> result = new HashMap<>();
List<String[]> dataList = new ArrayList<>();
List<TableField> fieldList = new ArrayList<>();
ApiDefinition apiDefinition = checkApiDefinition(datasourceRequest);
ApiDefinition apiDefinition = getApiDefinition(datasourceRequest);
if (apiDefinition == null) {
DEException.throwException("未找到");
}
@@ -178,7 +178,7 @@ public class ApiUtils {
}
private static List<String[]> getData(DatasourceRequest datasourceRequest) throws Exception {
ApiDefinition apiDefinition = checkApiDefinition(datasourceRequest);
ApiDefinition apiDefinition = getApiDefinition(datasourceRequest);
if (apiDefinition == null) {
DEException.throwException("未找到");
}
@@ -463,7 +463,28 @@ public class ApiUtils {
}
}
public static ApiDefinition checkApiDefinition(ApiDefinition apiDefinition, String response) throws DEException {
public static ApiDefinition checkApiDefinition(DatasourceRequest datasourceRequest) throws DEException {
ApiDefinition apiDefinition = new ApiDefinition();
List<ApiDefinition> apiDefinitionList = new ArrayList<>();
TypeReference<List<ApiDefinition>> listTypeReference = new TypeReference<List<ApiDefinition>>() {
};
try {
apiDefinitionList = objectMapper.readValue(datasourceRequest.getDatasource().getConfiguration(), listTypeReference);
} catch (Exception e) {
DEException.throwException(e);
}
if (!CollectionUtils.isEmpty(apiDefinitionList)) {
for (ApiDefinition definition : apiDefinitionList) {
if (definition != null && (definition.getType() == null || !definition.getType().equalsIgnoreCase("params"))) {
apiDefinition = definition;
}
}
}
String response = execHttpRequest(true, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest));
return checkApiDefinition(apiDefinition, response);
}
private static ApiDefinition checkApiDefinition(ApiDefinition apiDefinition, String response) throws DEException {
if (StringUtils.isEmpty(response)) {
DEException.throwException("该请求返回数据为空");
}
@@ -802,7 +823,7 @@ public class ApiUtils {
return apiDefinitionListTemp.stream().filter(apiDefinition -> apiDefinition != null && apiDefinition.getType() != null && apiDefinition.getType().equalsIgnoreCase("params")).collect(Collectors.toList());
}
private static ApiDefinition checkApiDefinition(DatasourceRequest datasourceRequest) throws DEException {
private static ApiDefinition getApiDefinition(DatasourceRequest datasourceRequest) throws DEException {
List<ApiDefinition> apiDefinitionList = new ArrayList<>();
TypeReference<List<ApiDefinition>> listTypeReference = new TypeReference<List<ApiDefinition>>() {
};

View File

@@ -5,6 +5,7 @@ import io.dataease.dataset.utils.TableUtils;
import io.dataease.datasource.dao.auto.entity.CoreDeEngine;
import io.dataease.datasource.server.DatasourceServer;
import io.dataease.extensions.datasource.dto.TableField;
import io.dataease.extensions.datasource.vo.DatasourceConfiguration;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
@@ -68,7 +69,7 @@ public class MysqlEngineProvider extends EngineProvider {
.append("'),");
}
String insetSql = (insertSql + values.substring(0, values.length() - 1)).replaceAll("'null'", "null");
if (dsType.equalsIgnoreCase("api")) {
if (dsType.contains(DatasourceConfiguration.DatasourceType.API.name())) {
List<TableField> keys = tableFields.stream().filter(tableField -> tableField.isPrimaryKey() && tableField.isChecked()).toList();
List<TableField> notKeys = tableFields.stream().filter(tableField -> tableField.isChecked() && !tableField.isPrimaryKey()).toList();
if (CollectionUtils.isNotEmpty(keys) && extractType.equals(DatasourceServer.UpdateType.add_scope)) {

View File

@@ -10,10 +10,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import io.dataease.api.dataset.dto.PreviewSqlDTO;
import io.dataease.api.ds.DatasourceApi;
import io.dataease.api.ds.vo.*;
import io.dataease.api.lark.vo.LarkInfoVO;
import io.dataease.api.permissions.relation.api.RelationApi;
import io.dataease.commons.constants.TaskStatus;
import io.dataease.constant.LogOT;
import io.dataease.constant.LogST;
import io.dataease.constant.MessageEnum;
import io.dataease.dataset.manage.DatasetDataManage;
import io.dataease.dataset.utils.TableUtils;
import io.dataease.datasource.dao.auto.entity.*;
@@ -25,7 +27,6 @@ import io.dataease.datasource.dao.ext.mapper.TaskLogExtMapper;
import io.dataease.datasource.manage.DataSourceManage;
import io.dataease.datasource.manage.DatasourceSyncManage;
import io.dataease.datasource.manage.EngineManage;
import io.dataease.datasource.provider.ApiUtils;
import io.dataease.datasource.provider.CalciteProvider;
import io.dataease.datasource.provider.ExcelUtils;
import io.dataease.constant.SQLConstants;
@@ -47,6 +48,9 @@ import io.dataease.model.BusiNodeVO;
import io.dataease.system.dao.auto.entity.CoreSysSetting;
import io.dataease.system.manage.CoreUserManage;
import io.dataease.utils.*;
import io.dataease.xpack.base.settings.dao.entity.ExternalTokenEntity;
import io.dataease.xpack.base.settings.platform.common.ExternalTokenManage;
import io.dataease.xpack.base.settings.platform.lark.manage.LarkManage;
import jakarta.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
@@ -66,6 +70,7 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;
@@ -100,6 +105,8 @@ public class DatasourceServer implements DatasourceApi {
@Resource
private DatasetDataManage datasetDataManage;
@Resource
private LarkManage larkManage;
@Resource
private ScheduleManager scheduleManager;
@Resource
private CoreUserManage coreUserManage;
@@ -107,11 +114,14 @@ public class DatasourceServer implements DatasourceApi {
private PluginManageApi pluginManage;
@Autowired(required = false)
private RelationApi relationManage;
@Resource(name = "externalTokenManage")
private ExternalTokenManage externalTokenManage;
public enum UpdateType {
all_scope, add_scope
}
private static final String tenantAccessTokenUrl = "https://open.larksuite.com/open-apis/auth/v3/tenant_access_token/internal";
private TypeReference<List<ApiDefinition>> listTypeReference = new TypeReference<List<ApiDefinition>>() {
};
@Resource
@@ -126,7 +136,7 @@ public class DatasourceServer implements DatasourceApi {
}
public boolean checkRepeat(@RequestBody BusiDsRequest dataSourceDTO) {
if (Arrays.asList("API", "Excel", "folder", "es").contains(dataSourceDTO.getType())) {
if (Arrays.asList("Excel", "folder", "es").contains(dataSourceDTO.getType()) || dataSourceDTO.getType().contains("API")) {
return false;
}
BusiNodeRequest request = new BusiNodeRequest();
@@ -152,7 +162,13 @@ public class DatasourceServer implements DatasourceApi {
if (Arrays.asList("API", "Excel", "folder").contains(datasource.getType())) {
continue;
}
if (StringUtils.isEmpty(datasource.getConfiguration())) {
continue;
}
DatasourceConfiguration compare = JsonUtil.parseObject(datasource.getConfiguration(), DatasourceConfiguration.class);
if (compare == null) {
continue;
}
switch (dataSourceDTO.getType()) {
case "sqlServer":
case "db2":
@@ -274,7 +290,7 @@ public class DatasourceServer implements DatasourceApi {
}
}
datasourceSyncManage.extractExcelData(coreDatasource, "all_scope");
} else if (dataSourceDTO.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) {
} else if (dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
CoreDatasourceTask coreDatasourceTask = new CoreDatasourceTask();
BeanUtils.copyBean(coreDatasourceTask, dataSourceDTO.getSyncSetting());
coreDatasourceTask.setName(coreDatasource.getName() + "-task");
@@ -294,11 +310,11 @@ public class DatasourceServer implements DatasourceApi {
datasourceSyncManage.addSchedule(coreDatasourceTask);
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(dataSourceDTO);
List<DatasetTableDTO> tables = ApiUtils.getTables(datasourceRequest);
List<DatasetTableDTO> tables = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
checkName(tables.stream().map(DatasetTableDTO::getName).collect(Collectors.toList()));
for (DatasetTableDTO api : tables) {
datasourceRequest.setTable(api.getTableName());
List<TableField> tableFields = ApiUtils.getTableFields(datasourceRequest);
List<TableField> tableFields = (List<TableField>) invokeMethod(coreDatasource.getType(), "getTableFields", DatasourceRequest.class, datasourceRequest);
try {
datasourceSyncManage.createEngineTable(datasourceRequest.getTable(), tableFields);
} catch (Exception e) {
@@ -344,10 +360,12 @@ public class DatasourceServer implements DatasourceApi {
datasourceRequest.setDatasource(dataSourceDTO);
List<String> toCreateTables = new ArrayList<>();
List<String> toDeleteTables = new ArrayList<>();
if (dataSourceDTO.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) {
if (dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
requestDatasource.setEnableDataFill(null);
List<String> sourceTables = ApiUtils.getTables(sourceTableRequest).stream().map(DatasetTableDTO::getTableName).toList();
List<DatasetTableDTO> datasetTableDTOS = ApiUtils.getTables(datasourceRequest);
List<DatasetTableDTO> sourceTableDTOs = (List<DatasetTableDTO>) invokeMethod(sourceData.getType(), "getApiTables", DatasourceRequest.class, sourceTableRequest);
List<String> sourceTables = sourceTableDTOs.stream().map(DatasetTableDTO::getTableName).toList();
List<DatasetTableDTO> datasetTableDTOS = (List<DatasetTableDTO>) invokeMethod(sourceData.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
List<String> tables = datasetTableDTOS.stream().map(DatasetTableDTO::getTableName).collect(Collectors.toList());
checkName(datasetTableDTOS.stream().map(DatasetTableDTO::getName).collect(Collectors.toList()));
toCreateTables = tables.stream().filter(table -> !sourceTables.contains(table)).collect(Collectors.toList());
@@ -356,9 +374,11 @@ public class DatasourceServer implements DatasourceApi {
for (String sourceTable : sourceTables) {
if (table.equals(sourceTable)) {
datasourceRequest.setTable(table);
List<String> tableFields = ApiUtils.getTableFields(datasourceRequest).stream().map(TableField::getName).sorted().collect(Collectors.toList());
List<TableField> tableFieldList = (List<TableField>) invokeMethod(datasourceRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, datasourceRequest);
List<String> tableFields = tableFieldList.stream().map(TableField::getName).sorted().collect(Collectors.toList());
sourceTableRequest.setTable(sourceTable);
List<String> sourceTableFields = ApiUtils.getTableFields(sourceTableRequest).stream().map(TableField::getName).sorted().collect(Collectors.toList());
List<TableField> sourceTableFieldList = (List<TableField>) invokeMethod(sourceTableRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, sourceTableRequest);
List<String> sourceTableFields = sourceTableFieldList.stream().map(TableField::getName).sorted().collect(Collectors.toList());
if (!String.join(",", tableFields).equals(String.join(",", sourceTableFields))) {
toDeleteTables.add(table);
toCreateTables.add(table);
@@ -390,7 +410,7 @@ public class DatasourceServer implements DatasourceApi {
for (String toCreateTable : toCreateTables) {
datasourceRequest.setTable(toCreateTable);
try {
datasourceSyncManage.createEngineTable(toCreateTable, ApiUtils.getTableFields(datasourceRequest));
datasourceSyncManage.createEngineTable(toCreateTable, (List<TableField>) invokeMethod(sourceTableRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, sourceTableRequest));
} catch (Exception e) {
DEException.throwException("Failed to create table " + toCreateTable + ", " + e.getMessage());
}
@@ -486,7 +506,7 @@ public class DatasourceServer implements DatasourceApi {
if (datasource == null) {
DEException.throwException(Translator.get("i18n_datasource_not_exists"));
}
if (datasource.getType().equalsIgnoreCase("api")) {
if (datasource.getType().contains("API")) {
datasource.setConfiguration("[]");
} else {
datasource.setConfiguration("");
@@ -589,10 +609,10 @@ public class DatasourceServer implements DatasourceApi {
}
}
}
if (coreDatasource.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) {
if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(datasourceDTO);
List<DatasetTableDTO> tables = ApiUtils.getTables(datasourceRequest);
List<DatasetTableDTO> tables = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
for (DatasetTableDTO api : tables) {
datasourceRequest.setTable(api.getTableName());
try {
@@ -671,8 +691,8 @@ public class DatasourceServer implements DatasourceApi {
BeanUtils.copyBean(datasourceDTO, coreDatasource);
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(datasourceDTO);
if (coreDatasource.getType().equals("API")) {
List<DatasetTableDTO> datasetTableDTOS = ApiUtils.getTables(datasourceRequest);
if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
List<DatasetTableDTO> datasetTableDTOS = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
datasetTableDTOS.forEach(datasetTableDTO1 -> {
CoreDatasourceTaskLog log = datasourceTaskServer.lastSyncLogForTable(datasetTableDTO.getDatasourceId(), datasetTableDTO1.getTableName());
if (log != null) {
@@ -701,7 +721,7 @@ public class DatasourceServer implements DatasourceApi {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(Long.parseLong(datasourceId));
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
if (coreDatasource.getType().equals("API") || coreDatasource.getType().equals("Excel")) {
if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) || coreDatasource.getType().equals("Excel")) {
datasourceRequest.setDatasource(transDTO(engineManage.getDeEngine()));
DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO();
BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine());
@@ -781,7 +801,7 @@ public class DatasourceServer implements DatasourceApi {
List<ExcelSheetData> excelSheetDataList = new ArrayList<>();
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) {
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())){
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) {
List<TableField> newTableFields = sheet.getFields();
datasourceRequest.setTable(datasetTableDTO.getTableName());
List<TableField> oldTableFields = ExcelUtils.getTableFields(datasourceRequest);
@@ -802,7 +822,7 @@ public class DatasourceServer implements DatasourceApi {
List<DatasetTableDTO> datasetTableDTOS = ExcelUtils.getTables(datasourceRequest);
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) {
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())){
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) {
sheet.setDeTableName(datasetTableDTO.getTableName());
}
}
@@ -876,12 +896,17 @@ public class DatasourceServer implements DatasourceApi {
public ApiDefinition checkApiDatasource(Map<String, String> request) throws DEException {
ApiDefinition apiDefinition = JsonUtil.parseObject(new String(java.util.Base64.getDecoder().decode(request.get("data"))), ApiDefinition.class);
List<ApiDefinition> paramsList = JsonUtil.parseList(new String(java.util.Base64.getDecoder().decode(request.get("paramsList"))), listTypeReference);
String response = ApiUtils.execHttpRequest(true, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), paramsList);
if (request.keySet().contains("type") && request.get("type").equals("apiStructure")) {
apiDefinition.setShowApiStructure(true);
}
ApiUtils.checkApiDefinition(apiDefinition, response);
List<ApiDefinition> paramsList = JsonUtil.parseList(new String(java.util.Base64.getDecoder().decode(request.get("paramsList"))), listTypeReference);
paramsList.add(apiDefinition);
DatasourceRequest datasourceRequest = new DatasourceRequest();
DatasourceDTO datasource = new DatasourceDTO();
datasource.setConfiguration(JsonUtil.toJSONString(paramsList).toString());
datasourceRequest.setDatasource(datasource);
apiDefinition = (ApiDefinition) invokeMethod(request.get("dsType"), "checkApiDefinition", DatasourceRequest.class, datasourceRequest);
if (apiDefinition.getRequest().getAuthManager() != null && StringUtils.isNotBlank(apiDefinition.getRequest().getAuthManager().getUsername()) && StringUtils.isNotBlank(apiDefinition.getRequest().getAuthManager().getPassword()) && apiDefinition.getRequest().getAuthManager().getVerification().equals("Basic Auth")) {
apiDefinition.getRequest().getAuthManager().setUsername(new String(Base64.getEncoder().encode(apiDefinition.getRequest().getAuthManager().getUsername().getBytes())));
apiDefinition.getRequest().getAuthManager().setPassword(new String(Base64.getEncoder().encode(apiDefinition.getRequest().getAuthManager().getPassword().getBytes())));
@@ -889,6 +914,47 @@ public class DatasourceServer implements DatasourceApi {
return apiDefinition;
}
private void generateToken(LarkInfoVO info) {
if (ObjectUtils.isEmpty(info)) {
info = larkManage.query();
}
HttpClientConfig clientConfig = new HttpClientConfig();
clientConfig.addHeader("Content-Type", "application/json");
String tokenPost = HttpClientUtil.post(tenantAccessTokenUrl, buildAccessTokenParam(info.getAppId(), info.getAppSecret()), clientConfig);
Map<String, Object> parse = null;
try {
parse = buildAccessTokenResult(tokenPost);
} catch (Exception e) {
DEException.throwException("请检查appId和appSecret参数," + e.getMessage());
}
String tenantAccessToken = parse.get("tenant_access_token").toString();
Integer expires_in = (Integer) parse.get("expire");
ExternalTokenEntity externalTokenEntity = new ExternalTokenEntity();
long expTimePoint = System.currentTimeMillis() + expires_in * 1000L;
externalTokenEntity.setId(MessageEnum.LARK.getFlag());
externalTokenEntity.setToken(tenantAccessToken);
externalTokenEntity.setExpTime(expTimePoint);
externalTokenManage.refreshToken(externalTokenEntity);
}
private Map<String, Object> buildAccessTokenResult(String json) {
if (ObjectUtils.isEmpty(json)) {
DEException.throwException("get access token error");
}
Map<String, Object> resultMap = JsonUtil.parse(json, Map.class);
if (Integer.parseInt(resultMap.get("code").toString()) != 0) {
DEException.throwException(resultMap.get("msg").toString());
}
return resultMap;
}
private String buildAccessTokenParam(String appId, String appSecret) {
Map<String, String> param = new HashMap<>();
param.put("app_id", appId);
param.put("app_secret", appSecret);
return Objects.requireNonNull(JsonUtil.toJSONString(param)).toString();
}
private void preCheckDs(DatasourceDTO datasource) throws DEException {
List<String> list = datasourceTypes().stream().map(DatasourceConfiguration.DatasourceType::getType).collect(Collectors.toList());
if (LicenseUtil.licenseValid()) {
@@ -909,8 +975,8 @@ public class DatasourceServer implements DatasourceApi {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(coreDatasource);
String status = null;
if (coreDatasource.getType().equals("API")) {
status = ApiUtils.checkStatus(datasourceRequest);
if (coreDatasource.getType().startsWith("API")) {
status = (String) invokeMethod(coreDatasource.getType(), "checkAPIStatus", DatasourceRequest.class, datasourceRequest);
} else {
Provider provider = ProviderFactory.getProvider(coreDatasource.getType());
status = provider.checkStatus(datasourceRequest);
@@ -921,6 +987,10 @@ public class DatasourceServer implements DatasourceApi {
}
}
public String getTenantAccessToken() {
LarkInfoVO larkInfo = larkManage.query();
return externalTokenManage.getToken(MessageEnum.LARK.getFlag(), t -> generateToken(larkInfo));
}
public void updateDemoDs() {
}
@@ -968,7 +1038,7 @@ public class DatasourceServer implements DatasourceApi {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(dsId);
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> datasetTableDTOS = ApiUtils.getTables(datasourceRequest);
List<DatasetTableDTO> datasetTableDTOS = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
for (int i = 0; i < pager.getRecords().size(); i++) {
for (int i1 = 0; i1 < datasetTableDTOS.size(); i1++) {
if (pager.getRecords().get(i).getTableName().equalsIgnoreCase(datasetTableDTOS.get(i1).getTableName())) {
@@ -1124,7 +1194,7 @@ public class DatasourceServer implements DatasourceApi {
DatasourceDTO datasourceDTO = new DatasourceDTO();
BeanUtils.copyBean(datasourceDTO, datasource);
if (datasourceDTO.getType().equalsIgnoreCase(DatasourceConfiguration.DatasourceType.API.toString())) {
if (datasourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.toString())) {
List<ApiDefinition> apiDefinitionList = JsonUtil.parseList(datasourceDTO.getConfiguration(), listTypeReference);
List<ApiDefinition> apiDefinitionListWithStatus = new ArrayList<>();
List<ApiDefinition> params = new ArrayList<>();
@@ -1203,7 +1273,7 @@ public class DatasourceServer implements DatasourceApi {
BeanUtils.copyBean(datasourceDTO, coreDatasource);
try {
checkDatasourceStatus(datasourceDTO);
if (!Arrays.asList("API", "Excel", "folder").contains(coreDatasource.getType())) {
if (!Arrays.asList("API", "Excel", "folder").contains(coreDatasource.getType()) && !coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
calciteProvider.updateDsPoolAfterCheckStatus(datasourceDTO);
}
} catch (DEException e) {
@@ -1241,4 +1311,35 @@ public class DatasourceServer implements DatasourceApi {
vo.setHost(host);
return vo;
}
private Method getMethod(String dsType, String methodName, Class<?> classes) {
Method method = null;
try {
String ClassName = "io.dataease.datasource.provider.ApiUtils";
if (!dsType.equals(DatasourceConfiguration.DatasourceType.API.name())) {
ClassName = "io.dataease.datasource.provider.LarkUtils";
}
Class<?> clazz = Class.forName(ClassName);
method = clazz.getMethod(methodName, classes);
} catch (Exception e) {
DEException.throwException("Cant find method: " + e.getMessage());
}
return method;
}
public Object invokeMethod(String dsType, String methodName, Class<?> classes, Object object) {
Object resObj = null;
try {
Method method = getMethod(dsType, methodName, classes);
if (object instanceof DatasourceRequest) {
Class<?> clazz = Class.forName(DatasourceRequest.class.getName());
Method setToken = clazz.getMethod("setToken", String.class);
setToken.invoke(object, getTenantAccessToken());
}
resObj = method.invoke(null, object);
} catch (Exception e) {
DEException.throwException(e);
}
return resObj;
}
}

View File

@@ -30,8 +30,8 @@ import io.dataease.dataset.manage.DatasetDataManage;
import io.dataease.dataset.manage.DatasetGroupManage;
import io.dataease.datasource.dao.auto.entity.CoreDatasource;
import io.dataease.datasource.dao.auto.mapper.CoreDatasourceMapper;
import io.dataease.datasource.provider.ApiUtils;
import io.dataease.datasource.provider.ExcelUtils;
import io.dataease.datasource.server.DatasourceServer;
import io.dataease.exception.DEException;
import io.dataease.extensions.datasource.vo.DatasourceConfiguration;
import io.dataease.extensions.view.dto.ChartViewDTO;
@@ -141,6 +141,8 @@ public class DataVisualizationServer implements DataVisualizationApi {
@Resource
private CoreUserManage coreUserManage;
@Resource
private DatasourceServer datasourceServer;
@Override
public DataVisualizationVO findCopyResource(Long dvId, String busiFlag) {
@@ -232,8 +234,8 @@ public class DataVisualizationServer implements DataVisualizationApi {
if (StringUtils.isNotEmpty(datasourceOld.getConfiguration())) {
if (datasourceOld.getType().equals(DatasourceConfiguration.DatasourceType.Excel.name())) {
dsTableNamesMap.put(datasourceOld.getId(), ExcelUtils.getTableNamesMap(datasourceOld.getConfiguration()));
} else if (datasourceOld.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) {
dsTableNamesMap.put(datasourceOld.getId(), ApiUtils.getTableNamesMap(datasourceOld.getConfiguration()));
} else if (datasourceOld.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
dsTableNamesMap.put(datasourceOld.getId(), (Map<String, String>) datasourceServer.invokeMethod(datasourceOld.getType(), "getTableNamesMap", String.class, datasourceOld.getConfiguration()));
}
}
});
@@ -244,8 +246,8 @@ public class DataVisualizationServer implements DataVisualizationApi {
if (StringUtils.isNotEmpty(datasourceNew.getConfiguration())) {
if (datasourceNew.getType().equals(DatasourceConfiguration.DatasourceType.Excel.name())) {
dsTableNamesMap.put(datasourceNew.getId(), ExcelUtils.getTableNamesMap(datasourceNew.getConfiguration()));
} else if (datasourceNew.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) {
dsTableNamesMap.put(datasourceNew.getId(), ApiUtils.getTableNamesMap(datasourceNew.getConfiguration()));
} else if (datasourceNew.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
dsTableNamesMap.put(datasourceNew.getId(), (Map<String, String>) datasourceServer.invokeMethod(datasourceNew.getType(), "getTableNamesMap", String.class, datasourceNew.getConfiguration()));
}
}
});
@@ -516,11 +518,11 @@ public class DataVisualizationServer implements DataVisualizationApi {
coreVisualizationManage.delete(dvId);
}
private void resourceTreeTypeAdaptor(List<BusiNodeVO> tree,String type){
if(!CollectionUtils.isEmpty(tree)){
private void resourceTreeTypeAdaptor(List<BusiNodeVO> tree, String type) {
if (!CollectionUtils.isEmpty(tree)) {
tree.forEach(busiNodeVO -> {
busiNodeVO.setType(type);
resourceTreeTypeAdaptor(busiNodeVO.getChildren(),type);
resourceTreeTypeAdaptor(busiNodeVO.getChildren(), type);
});
}
}
@@ -537,7 +539,7 @@ public class DataVisualizationServer implements DataVisualizationApi {
List<BusiNodeVO> dataVResult = coreVisualizationManage.tree(requestDv);
List<BusiNodeVO> result = new ArrayList<>();
if (!CollectionUtils.isEmpty(dashboardResult)) {
resourceTreeTypeAdaptor(dashboardResult,"dashboard");
resourceTreeTypeAdaptor(dashboardResult, "dashboard");
BusiNodeVO dashboardResultParent = new BusiNodeVO();
dashboardResultParent.setName(Translator.get("i18n_menu.panel"));
dashboardResultParent.setId(-101L);
@@ -549,7 +551,7 @@ public class DataVisualizationServer implements DataVisualizationApi {
result.add(dashboardResultParent);
}
if (!CollectionUtils.isEmpty(dataVResult)) {
resourceTreeTypeAdaptor(dataVResult,"dataV");
resourceTreeTypeAdaptor(dataVResult, "dataV");
BusiNodeVO dataVResultParent = new BusiNodeVO();
dataVResultParent.setName(Translator.get("i18n_menu.screen"));
dataVResultParent.setId(-102L);

View File

@@ -1,30 +1,25 @@
package io.dataease.visualization.utils;
import io.dataease.datasource.provider.ApiUtils;
import io.dataease.datasource.provider.ExcelUtils;
import io.dataease.extensions.datasource.vo.DatasourceConfiguration;
import io.dataease.extensions.view.dto.ChartViewDTO;
import io.dataease.utils.JsonUtil;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
public class VisualizationUtils {
public static Map<Long,String> viewTransToStr(Map<Long, ChartViewDTO> source ){
Map<Long,String> result = new HashMap<>();
source.forEach((key,value) ->{
result.put(key, (String)JsonUtil.toJSONString(value));
});
return result;
public static Map<Long, String> viewTransToStr(Map<Long, ChartViewDTO> source) {
Map<Long, String> result = new HashMap<>();
source.forEach((key, value) -> {
result.put(key, (String) JsonUtil.toJSONString(value));
});
return result;
}
public static Map<Long,ChartViewDTO> viewTransToObj (Map<Long, String> source ){
Map<Long,ChartViewDTO> result = new HashMap<>();
source.forEach((key,value) ->{
result.put(key, JsonUtil.parseObject(value,ChartViewDTO.class));
public static Map<Long, ChartViewDTO> viewTransToObj(Map<Long, String> source) {
Map<Long, ChartViewDTO> result = new HashMap<>();
source.forEach((key, value) -> {
result.put(key, JsonUtil.parseObject(value, ChartViewDTO.class));
});
return result;
}

View File

@@ -1098,7 +1098,15 @@ export default {
sync_table: '同步指定表',
req_completed: '请求成功',
sync_rate: '更新频率',
has_same_ds: '存在相同配置数据源,确认保存?'
has_same_ds: '存在相同配置数据源,确认保存?',
table_addr: '表格地址',
input_addr: '请输入表格地址',
app_token: 'app_token',
input_app_token: '请输入app_token',
table_id: 'table_id',
input_table_id: '请输入table_id',
view_id: 'view_id',
input_view_id: '请输入view_id'
},
chart: {
align: '对齐方式',

View File

@@ -291,7 +291,7 @@ const saveDataset = () => {
request.apiConfiguration = ''
checkRepeat(request).then(res => {
let method = request.id === '' ? save : update
if (request.type !== 'API') {
if (!request.type.startsWith('API')) {
request.syncSetting = null
}
if (res) {

View File

@@ -24,9 +24,10 @@ import { CustomPassword } from '@/components/custom-password'
import { ElForm, ElMessage, ElMessageBox } from 'element-plus-secondary'
import Cron from '@/components/cron/src/Cron.vue'
import { ComponentPublicInstance } from 'vue'
import { XpackComponent } from '@/components/plugin'
import {PluginComponent, XpackComponent} from '@/components/plugin'
import { iconFieldMap } from '@/components/icon-group/field-list'
import { boolean } from 'mathjs'
import LarkItemDraw from '@/views/visualized/data/datasource/form/LarkItemDraw_bak.vue'
const { t } = useI18n()
const prop = defineProps({
form: {
@@ -95,6 +96,7 @@ const defaultRule = {
const rule = ref<FormRules>(cloneDeep(defaultRule))
const api_table_title = ref('')
const editApiItem = ref()
const editLarkItem = ref()
const defaultApiItem = {
name: '',
deTableName: '',
@@ -127,7 +129,7 @@ const defaultApiItem = {
}
const initForm = type => {
if (type !== 'API') {
if (!type.startsWith('API')) {
form.value.configuration = {
dataBase: '',
jdbcUrl: '',
@@ -148,7 +150,7 @@ const initForm = type => {
rule.value = cloneDeep(defaultRule)
setRules()
}
if (type === 'API') {
if (type.startsWith('API')) {
form.value.syncSetting = {
updateType: 'all_scope',
syncRate: 'SIMPLE_CRON',
@@ -170,7 +172,7 @@ const initForm = type => {
}, 0)
}
const notapiexcelconfig = computed(() => form.value.type !== 'API')
const notapiexcelconfig = computed(() => !form.value.type.startsWith('API'))
const authMethodList = [
{
@@ -353,7 +355,7 @@ const setRules = () => {
watch(
() => form.value.type,
val => {
if (val !== 'API') {
if (!val.startsWith('API')) {
rule.value = cloneDeep(defaultRule)
setRules()
}
@@ -431,6 +433,37 @@ const addApiItem = item => {
})
}
const addLarkItem = item => {
let apiItem = null
let editItem = false
api_table_title.value = t('datasource.data_table')
if (item) {
apiItem = cloneDeep(item)
editItem = true
} else {
apiItem = cloneDeep(defaultApiItem)
apiItem.type = activeName.value
let serialNumber1 =
form.value.apiConfiguration.length > 0
? form.value.apiConfiguration[form.value.apiConfiguration.length - 1].serialNumber + 1
: 0
let serialNumber2 =
form.value.paramsConfiguration && form.value.paramsConfiguration.length > 0
? form.value.paramsConfiguration[form.value.paramsConfiguration.length - 1].serialNumber + 1
: 0
apiItem.serialNumber = serialNumber1 + serialNumber2
}
nextTick(() => {
editLarkItem.value.initApiItem(
apiItem,
form.value,
activeName.value,
editItem,
isSupportSetKey.value
)
})
}
const activeName = ref('table')
const showPriority = ref(false)
const showSSH = ref(false)
@@ -604,6 +637,7 @@ const apiRule = {
}
const dialogEditParams = ref(false)
const dialogRenameApi = ref(false)
const dialogAddLarkItem = ref(false)
const activeParamsName = ref('')
const activeParamsID = ref(0)
const paramsObj = ref({
@@ -757,7 +791,7 @@ defineExpose({
<template>
<div class="editor-detail">
<div class="detail-inner create-dialog">
<div v-show="form.type === 'API'" class="info-update">
<div v-show="form.type.startsWith('API')" class="info-update">
<div :class="activeStep === 1 && 'active'" class="info-text">
{{ t('data_source.source_configuration_information') }}
</div>
@@ -766,7 +800,10 @@ defineExpose({
{{ t('data_source.data_update_settings') }}
</div>
</div>
<div class="title-form_primary base-info" v-show="activeStep !== 2 && form.type === 'API'">
<div
class="title-form_primary base-info"
v-show="activeStep !== 2 && form.type.startsWith('API')"
>
{{ t('datasource.basic_info') }}
</div>
<el-form
@@ -969,6 +1006,90 @@ defineExpose({
</div>
</div>
</template>
<template v-if="form.type === 'APILark'">
<div class="title-form_primary flex-space table-info-mr" v-show="activeStep !== 2">
<el-tabs v-model="activeName" class="api-tabs">
<el-tab-pane :label="t('datasource.data_table')" name="table"></el-tab-pane>
</el-tabs>
<el-button type="primary" style="margin-left: auto" @click="() => addLarkItem(null)">
<template #icon>
<Icon name="icon_add_outlined"><icon_add_outlined class="svg-icon" /></Icon>
</template>
{{ t('common.add') }}
</el-button>
</div>
<empty-background
v-show="activeStep !== 2"
v-if="!form.apiConfiguration.length && activeName === 'table'"
:description="t('datasource.no_data_table')"
img-type="noneWhite"
/>
<template v-if="form.type === 'APILark' && activeStep === 1 && activeName === 'table'">
<div class="api-card-content">
<div
v-for="(api, idx) in form.apiConfiguration"
:key="api.id"
class="api-card"
@click="addLarkItem(api)"
>
<el-row>
<el-col style="display: flex" :span="19">
<span class="name ellipsis">{{ api.name }}</span>
<span v-if="api.status === 'Error'" class="de-tag invalid">{{
t('datasource.invalid')
}}</span>
<span v-if="api.status === 'Success'" class="de-tag valid">{{
t('datasource.valid')
}}</span>
</el-col>
<el-col style="text-align: right" :span="5">
<el-icon class="de-copy-icon hover-icon" @click.stop="copyItem(api)">
<Icon name="de-copy"><deCopy class="svg-icon" /></Icon>
</el-icon>
<span @click.stop>
<el-popover
placement="top"
width="200"
:ref="setItemRef"
show-arrow
popper-class="api-table-delete"
trigger="click"
>
<template #reference>
<el-icon class="de-delete-icon hover-icon">
<Icon name="de-delete"><deDelete class="svg-icon" /></Icon>
</el-icon>
</template>
<template #default>
<el-icon class="de-copy-icon icon-warning">
<Icon name="icon_warning_filled"
><icon_warning_filled class="svg-icon"
/></Icon>
</el-icon>
<div class="tips">
{{ t('datasource.delete_this_item') }}
</div>
<div class="foot">
<el-button style="min-width: 48px" secondary @click="cancelItem(idx)">{{
t('common.cancel')
}}</el-button>
<el-button
style="min-width: 48px"
type="primary"
@click="deleteItem(api, idx)"
>{{ t('common.sure') }}</el-button
>
</div>
</template>
</el-popover>
</span>
</el-col>
</el-row>
</div>
</div>
</template>
</template>
<template v-if="notapiexcelconfig">
<el-form-item
:label="t('data_source.connection_method')"
@@ -1344,7 +1465,7 @@ defineExpose({
<el-form-item
:label="t('datasource.update_type')"
prop="syncSetting.updateType"
v-if="activeStep === 2 && form.type === 'API'"
v-if="activeStep === 2 && form.type.startsWith('API')"
>
<el-radio-group v-model="form.syncSetting.updateType">
<el-radio label="all_scope">{{ t('datasource.all_scope') }}</el-radio>
@@ -1354,7 +1475,7 @@ defineExpose({
<el-form-item
:label="t('datasource.sync_rate')"
prop="syncSetting.syncRate"
v-if="activeStep === 2 && form.type === 'API'"
v-if="activeStep === 2 && form.type.startsWith('API')"
>
<el-radio-group v-model="form.syncSetting.syncRate" @change="onRateChange">
<el-radio label="RIGHTNOW">{{ t('data_source.update_now') }}</el-radio>
@@ -1363,7 +1484,11 @@ defineExpose({
</el-radio-group>
</el-form-item>
<div
v-if="activeStep === 2 && form.type === 'API' && form.syncSetting.syncRate !== 'RIGHTNOW'"
v-if="
activeStep === 2 &&
form.type.startsWith('API') &&
form.syncSetting.syncRate !== 'RIGHTNOW'
"
class="execute-rate-cont"
>
<el-form-item
@@ -1496,8 +1621,20 @@ defineExpose({
<el-button type="primary" @click="saveApiObj">{{ t('dataset.confirm') }} </el-button>
</template>
</el-dialog>
<api-http-request-draw @return-item="returnItem" ref="editApiItem"></api-http-request-draw>
<plugin-component
:jsname="getPluginStatic(currentDsType)"
ref="xpack"
:form="form"
:editDs="editDs"
:active-step="activeApiStep"
@submitForm="handleSubmit"
v-if="
activeStep !== 0 && currentDsType && currentDsType !== 'Excel' && visible && isPlugin
"
>
</plugin-component>
<!-- <lark-item-draw @return-item="returnItem" ref="editLarkItem"></lark-item-draw>-->
</div>
</div>
</template>

View File

@@ -196,7 +196,7 @@ const activeApiStep = ref(0)
const setNextStep = () => {
activeApiStep.value = activeStep.value + 1
if (currentDsType.value === 'API' && activeStep.value === 1) return
if (currentDsType.value.includes('API') && activeStep.value === 1) return
activeStep.value = activeStep.value + 1
}
@@ -208,14 +208,14 @@ const next = () => {
if (
form.apiConfiguration?.length === 0 &&
currentDsType.value === 'API' &&
currentDsType.value.includes('API') &&
activeStep.value !== 2
) {
ElMessage.error(t('data_source.cannot_be_empty_table'))
return
}
if (currentDsType.value === 'API' && activeStep.value !== 2) {
if (currentDsType.value.includes('API') && activeStep.value !== 2) {
const validateFrom = detail.value.submitForm()
validateFrom(val => {
if (val) {
@@ -284,7 +284,10 @@ const handleShowFinishPage = ({ id, name, pid }) => {
emitter.on('showFinishPage', handleShowFinishPage)
const prev = () => {
if ((currentDsType.value === 'API' && activeApiStep.value === 1) || activeStep.value === 1) {
if (
(currentDsType.value.includes('API') && activeApiStep.value === 1) ||
activeStep.value === 1
) {
ElMessageBox.confirm(t('data_source.the_previous_step'), {
confirmButtonType: 'primary',
type: 'warning',
@@ -299,7 +302,7 @@ const prev = () => {
}
const prevConfirm = () => {
if (currentDsType.value === 'API' && activeApiStep.value === 2) {
if (currentDsType.value.includes('API') && activeApiStep.value === 2) {
activeApiStep.value = 1
activeStep.value = 1
return
@@ -336,7 +339,8 @@ const validateDS = () => {
configuration: string
apiConfiguration: string
}
if (currentDsType.value === 'API') {
console.log(form)
if (currentDsType.value.includes('API')) {
if (form.apiConfiguration.length === 0) {
ElMessage.error(t('data_source.add_data_table'))
return
@@ -417,6 +421,7 @@ const typeTitle = computed(() => {
const saveDS = () => {
isUpdate = false
console.log('1')
const request = JSON.parse(JSON.stringify(form)) as unknown as Omit<
Form,
'configuration' | 'apiConfiguration'
@@ -424,6 +429,7 @@ const saveDS = () => {
configuration: string
apiConfiguration: string
}
console.log('1')
if (currentDsType.value === 'Excel') {
excel.value.uploadStatus(false)
if (!excel.value.sheetFile?.name) {
@@ -443,7 +449,7 @@ const saveDS = () => {
})
return
} else if (currentDsType.value === 'API') {
} else if (currentDsType.value.includes('API')) {
for (let i = 0; i < request.apiConfiguration.length; i++) {
if (
request.apiConfiguration[i].deTableName === '' ||
@@ -461,6 +467,7 @@ const saveDS = () => {
request.apiConfiguration[i].fields[j].value = []
}
}
console.log('3')
let apiItems = []
apiItems = apiItems.concat(request.apiConfiguration)
if (request.paramsConfiguration) {
@@ -472,7 +479,7 @@ const saveDS = () => {
} else {
request.configuration = Base64.encode(JSON.stringify(request.configuration))
}
console.log('4')
if (isPlugin.value) {
xpack?.value?.invokeMethod({
methodName: 'submitForm',
@@ -483,6 +490,7 @@ const saveDS = () => {
request.apiConfiguration = ''
validate(val => {
if (val) {
console.log('5')
doSaveDs(request)
}
})
@@ -498,6 +506,7 @@ const doSaveDs = request => {
showClose: false,
tip: ''
}
console.log('6')
checkRepeat(request).then(res => {
let method = request.id === '' ? save : update
if (res) {
@@ -846,8 +855,8 @@ defineExpose({
>
<el-button
v-show="
(activeStep === 0 && currentDsType !== 'API') ||
(activeApiStep !== 2 && currentDsType === 'API')
(activeStep === 0 && !currentDsType.startsWith('API')) ||
(activeApiStep !== 2 && currentDsType.startsWith('API'))
"
type="primary"
@click="next"
@@ -856,8 +865,8 @@ defineExpose({
>
<el-button
v-show="
(activeStep === 1 && currentDsType !== 'API') ||
(activeApiStep === 2 && currentDsType === 'API')
(activeStep === 1 && !currentDsType.startsWith('API')) ||
(activeApiStep === 2 && currentDsType.startsWith('API'))
"
type="primary"
@click="saveDS"

View File

@@ -292,7 +292,7 @@ const validateDS = () => {
Object.assign(nodeTmpInfo, cloneDeep(nodeInfo))
validateById(nodeTmpInfo.id as number)
.then(res => {
if (res.data.type === 'API') {
if (res.data.type.startsWith('API')) {
let error = 0
const dsStatus = JSON.parse(res.data.status)
for (let i = 0; i < dsStatus.length; i++) {
@@ -828,7 +828,7 @@ const handleCopy = async data => {
datasource.id = ''
datasource.copy = true
datasource.name = t('datasource.copy')
if (datasource.type === 'API') {
if (datasource.type.startsWith('API')) {
for (let i = 0; i < datasource.apiConfiguration.length; i++) {
datasource.apiConfiguration[i].deTableName = ''
}
@@ -1390,7 +1390,7 @@ const getMenuList = (val: boolean) => {
<el-table-column
key="status"
prop="status"
v-if="['api'].includes(nodeInfo.type.toLowerCase())"
v-if="nodeInfo.type.startsWith('API')"
:label="t('data_source.latest_update_status')"
>
<template #default="scope">
@@ -1420,7 +1420,10 @@ const getMenuList = (val: boolean) => {
<el-table-column
key="lastUpdateTime"
prop="lastUpdateTime"
v-if="['excel', 'api'].includes(nodeInfo.type.toLowerCase())"
v-if="
['excel', 'api'].includes(nodeInfo.type.toLowerCase()) ||
nodeInfo.type.startsWith('API')
"
:label="t('data_source.latest_update_time')"
>
<template v-slot:default="scope">
@@ -1489,7 +1492,11 @@ const getMenuList = (val: boolean) => {
</el-col>
</el-row>
<template
v-if="!['Excel', 'API', 'es'].includes(nodeInfo.type) && nodeInfo.weight >= 7"
v-if="
!['Excel', 'es'].includes(nodeInfo.type) &&
!nodeInfo.type.startsWith('API') &&
nodeInfo.weight >= 7
"
>
<el-row :gutter="24" v-show="nodeInfo.configuration.urlType !== 'jdbcUrl'">
<el-col :span="12">
@@ -1639,7 +1646,7 @@ const getMenuList = (val: boolean) => {
</template>
</BaseInfoContent>
<BaseInfoContent
v-if="nodeInfo.type === 'API' && nodeInfo.weight >= 7"
v-if="nodeInfo.type.startsWith('API') && nodeInfo.weight >= 7"
v-slot="slotProps"
:name="t('datasource.data_table')"
>
@@ -1691,7 +1698,7 @@ const getMenuList = (val: boolean) => {
</el-button>
</BaseInfoContent>
<BaseInfoContent
v-if="nodeInfo.type === 'API' && nodeInfo.weight >= 7"
v-if="nodeInfo.type.startsWith('API') && nodeInfo.weight >= 7"
v-slot="slotProps"
:name="t('dataset.update_setting')"
:time="(nodeInfo.lastSyncTime as string)"

View File

@@ -6,6 +6,7 @@ import io.dataease.api.ds.vo.*;
import io.dataease.auth.DeApiPath;
import io.dataease.auth.DePermit;
import io.dataease.exception.DEException;
import io.dataease.extensions.datasource.dto.ApiDefinition;
import io.dataease.extensions.datasource.dto.DatasetTableDTO;
import io.dataease.extensions.datasource.dto.DatasourceDTO;
import io.dataease.extensions.datasource.dto.TableField;

View File

@@ -1,7 +1,6 @@
package io.dataease.api.ds.vo;
package io.dataease.extensions.datasource.dto;
import io.dataease.extensions.datasource.dto.TableField;
import lombok.Data;
import java.util.ArrayList;
@@ -30,4 +29,8 @@ public class ApiDefinition {
private boolean showApiStructure;
private Long updateTime;
private String type = "table";
private String token;
private String appToken;
private String tableId;
private String viewId;
}

View File

@@ -26,6 +26,7 @@ public class DatasourceRequest implements Serializable {
private boolean totalPageFlag;
private Map<Long, DatasourceSchemaDTO> dsList;
private List<TableFieldWithValue> tableFieldWithValues;
private String token;
public DatasourceRequest() {
}

View File

@@ -1,6 +1,7 @@
package io.dataease.extensions.datasource.plugin;
import io.dataease.exception.DEException;
import io.dataease.extensions.datasource.dto.DatasourceRequest;
import io.dataease.extensions.datasource.factory.ProviderFactory;
import io.dataease.extensions.datasource.provider.Provider;
import io.dataease.extensions.datasource.vo.XpackPluginsDatasourceVO;
@@ -15,7 +16,9 @@ import java.io.InputStream;
import java.net.URI;
import java.nio.file.Paths;
import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@@ -25,6 +28,13 @@ import java.util.jar.JarFile;
public abstract class DataEaseDatasourcePlugin extends Provider implements DataEasePlugin {
private final String DEFAULT_FILE_PATH = "/opt/dataease2.0/drivers/plugin";
@Override
public List<String> getSchema(DatasourceRequest datasourceRequest) {
return new ArrayList<>();
}
@Override
public void loadPlugin() {
XpackPluginsDatasourceVO datasourceConfig = getConfig();
@@ -41,7 +51,7 @@ public abstract class DataEaseDatasourcePlugin extends Provider implements DataE
String localPath = StringUtils.isEmpty(config.getDriverPath()) ? DEFAULT_FILE_PATH : config.getDriverPath();
ProtectionDomain protectionDomain = this.getClass().getProtectionDomain();
URI uri = protectionDomain.getCodeSource().getLocation().toURI();
try(JarFile jarFile = new JarFile(new File(uri))) {
try (JarFile jarFile = new JarFile(new File(uri))) {
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
@@ -52,8 +62,8 @@ public abstract class DataEaseDatasourcePlugin extends Provider implements DataE
file.getParentFile().mkdirs();
}
try(InputStream inputStream = jarFile.getInputStream(entry);
FileOutputStream outputStream = new FileOutputStream(file)){
try (InputStream inputStream = jarFile.getInputStream(entry);
FileOutputStream outputStream = new FileOutputStream(file)) {
byte[] bytes = new byte[1024];
int length;
while ((length = inputStream.read(bytes)) >= 0) {
@@ -83,7 +93,7 @@ public abstract class DataEaseDatasourcePlugin extends Provider implements DataE
try {
ProtectionDomain protectionDomain = this.getClass().getProtectionDomain();
URI uri = protectionDomain.getCodeSource().getLocation().toURI();
try(JarFile jarFile = new JarFile(new File(uri))) {
try (JarFile jarFile = new JarFile(new File(uri))) {
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();