diff --git a/Dockerfile b/Dockerfile index 5e7123a861..f5118e68fd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,9 +2,9 @@ FROM registry.cn-qingdao.aliyuncs.com/dataease/alpine-openjdk17-jre ARG IMAGE_TAG -RUN mkdir -p /opt/apps/config /opt/dataease/drivers/ /opt/dataease2.0/cache/ /opt/dataease2.0/data/map /opt/dataease2.0/data/static-resource/ +RUN mkdir -p /opt/apps/config /opt/dataease2.0/drivers/ /opt/dataease2.0/cache/ /opt/dataease2.0/data/map /opt/dataease2.0/data/static-resource/ -ADD drivers/* /opt/dataease/drivers/ +ADD drivers/* /opt/dataease2.0/drivers/ ADD mapFiles/ /opt/dataease2.0/data/map/ ADD staticResource/ /opt/dataease2.0/data/static-resource/ diff --git a/README.md b/README.md index 0fa9021e03..26307e9f7b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,9 @@ DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。DataEase 支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,并可以方便的与他人分享。 -![DataEase 概览图](https://github.com/dataease/dataease/assets/41712985/ef020c86-68e0-43a3-8054-f51463eae361) +![DataEase 概览图](https://github.com/dataease/dataease/assets/41712985/52ca92d0-955c-42f1-bb79-d9bb19913649) + + **DataEase 的优势:** @@ -52,11 +54,8 @@ DataEase 是开源的数据可视化分析工具,帮助用户快速分析数 ## DataEase 快速入门 -- [安装部署教程](https://dataease.io/docs/installation/installation_mode/) -- [快速入门视频](https://www.bilibili.com/video/BV1qG4y1F7uc/) -- [完整在线文档](https://dataease.io/docs/) -- [中文社区论坛](https://bbs.fit2cloud.com/c/de/6) -- [模板应用市场](https://dataease.io/templates/) +- [在线文档](https://dataease.io/docs/) +- [社区论坛](https://bbs.fit2cloud.com/c/de/6) ## License diff --git a/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java b/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java index 075e94a0bd..3c217a76b0 100644 --- a/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java +++ b/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java @@ -14,18 +14,18 @@ public class MybatisPlusGenerator { * 第一 我嫌麻烦 * 第二 后面配置会放到nacos读起来更麻烦了 */ - private static final String url = "jdbc:mysql://127.0.0.1:3306/de_standalone?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false"; + private static final String url = "jdbc:mysql://39.98.78.97:3306/dataease?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false"; private static final String username = "root"; private static final String password = "Password123@mysql"; /** * 业务模块例如datasource,dataset,panel等 */ - private static final String busi = "system"; + private static final String busi = "template"; /** * 这是要生成代码的表名称 */ - private static final String TABLE_NAME = "core_sys_setting"; + private static final String TABLE_NAME = "visualization_template"; /** * 下面两个配置基本上不用动 diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java index d74064398a..a99cde6dcf 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java @@ -1,14 +1,12 @@ package io.dataease.chart.manage; import cn.hutool.core.collection.CollectionUtil; -import com.fasterxml.jackson.core.type.TypeReference; import io.dataease.api.chart.dto.*; import io.dataease.api.chart.request.ChartDrillRequest; import io.dataease.api.chart.request.ChartExtRequest; import io.dataease.api.dataset.dto.SqlVariableDetails; import io.dataease.api.dataset.union.DatasetGroupInfoDTO; import io.dataease.api.dataset.union.model.SQLMeta; -import io.dataease.api.permissions.auth.api.InteractiveAuthApi; import io.dataease.api.permissions.auth.dto.BusiPerCheckDTO; import io.dataease.api.permissions.dataset.dto.DataSetRowPermissionsTreeDTO; import io.dataease.chart.constant.ChartConstants; @@ -30,6 +28,7 @@ import io.dataease.engine.utils.Utils; import io.dataease.exception.DEException; import io.dataease.i18n.Translator; import io.dataease.result.ResultCode; +import io.dataease.system.manage.CorePermissionManage; import io.dataease.utils.BeanUtils; import io.dataease.utils.JsonUtil; import jakarta.annotation.Resource; @@ -37,7 +36,6 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -65,8 +63,9 @@ public class ChartDataManage { private ChartViewManege chartViewManege; @Resource private PermissionManage permissionManage; - @Autowired(required = false) - private InteractiveAuthApi interactiveAuthApi; + + @Resource + private CorePermissionManage corePermissionManage; private static Logger logger = LoggerFactory.getLogger(ChartDataManage.class); @@ -140,11 +139,12 @@ public class ChartDataManage { DEException.throwException(ResultCode.DATA_IS_WRONG.code(), Translator.get("i18n_no_ds")); } // check permission - if (interactiveAuthApi != null) { - BusiPerCheckDTO dto = new BusiPerCheckDTO(); - dto.setId(table.getId()); - dto.setAuthEnum(AuthEnum.READ); - interactiveAuthApi.checkAuth(dto); + BusiPerCheckDTO dto = new BusiPerCheckDTO(); + dto.setId(table.getId()); + dto.setAuthEnum(AuthEnum.READ); + boolean checked = corePermissionManage.checkAuth(dto); + if (!checked) { + DEException.throwException(Translator.get("i18n_no_datasource_permission")); } // column permission diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java index 6be80e7fa5..ae5d7e6628 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java @@ -9,8 +9,6 @@ import io.dataease.api.dataset.union.DatasetGroupInfoDTO; import io.dataease.api.dataset.union.UnionDTO; import io.dataease.api.dataset.vo.DataSetBarVO; import io.dataease.api.ds.vo.DatasourceDTO; -import io.dataease.api.permissions.user.api.UserApi; -import io.dataease.api.permissions.user.vo.UserFormVO; import io.dataease.commons.constants.OptConstants; import io.dataease.dataset.dao.auto.entity.CoreDatasetGroup; import io.dataease.dataset.dao.auto.entity.CoreDatasetTable; @@ -31,11 +29,11 @@ import io.dataease.license.config.XpackInteract; import io.dataease.model.BusiNodeRequest; import io.dataease.model.BusiNodeVO; import io.dataease.operation.manage.CoreOptRecentManage; +import io.dataease.system.manage.CoreUserManage; import io.dataease.utils.*; import jakarta.annotation.Resource; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -68,8 +66,10 @@ public class DatasetGroupManage { private CoreDatasetTableMapper coreDatasetTableMapper; @Resource private CoreDatasourceMapper coreDatasourceMapper; - @Autowired(required = false) - private UserApi userApi; + + + @Resource + private CoreUserManage coreUserManage; @Resource private CoreOptRecentManage coreOptRecentManage; @@ -88,13 +88,9 @@ public class DatasetGroupManage { CoreDatasetGroup coreDatasetGroup = coreDatasetGroupMapper.selectById(datasetGroupInfoDTO.getId()); datasetGroupInfoDTO.setPid(coreDatasetGroup.getPid()); } - if (userApi == null) { - checkName(datasetGroupInfoDTO); - } - if (userApi != null) { - datasetGroupInfoDTO.setUpdateBy(userApi.info().getId() + ""); - datasetGroupInfoDTO.setLastUpdateTime(System.currentTimeMillis()); - } + checkName(datasetGroupInfoDTO); + datasetGroupInfoDTO.setUpdateBy(AuthUtils.getUser().getUserId() + ""); + datasetGroupInfoDTO.setLastUpdateTime(System.currentTimeMillis()); if (StringUtils.equalsIgnoreCase(datasetGroupInfoDTO.getNodeType(), leafType)) { if (!rename && ObjectUtils.isEmpty(datasetGroupInfoDTO.getAllFields())) { DEException.throwException(Translator.get("i18n_no_fields")); @@ -112,10 +108,8 @@ public class DatasetGroupManage { if (ObjectUtils.isEmpty(datasetGroupInfoDTO.getId())) { isCreate = true; datasetGroupInfoDTO.setId(IDUtils.snowID()); - if (userApi != null) { - datasetGroupInfoDTO.setCreateBy(userApi.info().getId() + ""); - datasetGroupInfoDTO.setUpdateBy(userApi.info().getId() + ""); - } + datasetGroupInfoDTO.setCreateBy(AuthUtils.getUser().getUserId() + ""); + datasetGroupInfoDTO.setUpdateBy(AuthUtils.getUser().getUserId() + ""); datasetGroupInfoDTO.setCreateTime(time); datasetGroupInfoDTO.setLastUpdateTime(time); datasetGroupInfoDTO.setPid(datasetGroupInfoDTO.getPid() == null ? 0L : datasetGroupInfoDTO.getPid()); @@ -152,21 +146,19 @@ public class DatasetGroupManage { CoreDatasetGroup coreDatasetGroup = BeanUtils.copyBean(new CoreDatasetGroup(), datasetGroupInfoDTO); coreDatasetGroup.setLastUpdateTime(System.currentTimeMillis()); coreDatasetGroupMapper.updateById(coreDatasetGroup); - coreOptRecentManage.saveOpt(datasetGroupInfoDTO.getId(), OptConstants.OPT_RESOURCE_TYPE.DATASET,OptConstants.OPT_TYPE.UPDATE); + coreOptRecentManage.saveOpt(datasetGroupInfoDTO.getId(), OptConstants.OPT_RESOURCE_TYPE.DATASET, OptConstants.OPT_TYPE.UPDATE); } @XpackInteract(value = "authResourceTree", before = false) public void innerSave(DatasetGroupInfoDTO datasetGroupInfoDTO) { CoreDatasetGroup coreDatasetGroup = BeanUtils.copyBean(new CoreDatasetGroup(), datasetGroupInfoDTO); coreDatasetGroupMapper.insert(coreDatasetGroup); - coreOptRecentManage.saveOpt(coreDatasetGroup.getId(), OptConstants.OPT_RESOURCE_TYPE.DATASET,OptConstants.OPT_TYPE.NEW); + coreOptRecentManage.saveOpt(coreDatasetGroup.getId(), OptConstants.OPT_RESOURCE_TYPE.DATASET, OptConstants.OPT_TYPE.NEW); } @XpackInteract(value = "authResourceTree", before = false) public DatasetGroupInfoDTO move(DatasetGroupInfoDTO datasetGroupInfoDTO) { - if (userApi == null) { - checkName(datasetGroupInfoDTO); - } + checkName(datasetGroupInfoDTO); if (datasetGroupInfoDTO.getPid() != 0) { checkMove(datasetGroupInfoDTO); } @@ -174,12 +166,10 @@ public class DatasetGroupManage { long time = System.currentTimeMillis(); CoreDatasetGroup coreDatasetGroup = new CoreDatasetGroup(); BeanUtils.copyBean(coreDatasetGroup, datasetGroupInfoDTO); - if (userApi != null) { - datasetGroupInfoDTO.setUpdateBy(userApi.info().getId() + ""); - } + datasetGroupInfoDTO.setUpdateBy(AuthUtils.getUser().getUserId() + ""); coreDatasetGroup.setLastUpdateTime(time); coreDatasetGroupMapper.updateById(coreDatasetGroup); - coreOptRecentManage.saveOpt(coreDatasetGroup.getId(), OptConstants.OPT_RESOURCE_TYPE.DATASET,OptConstants.OPT_TYPE.UPDATE); + coreOptRecentManage.saveOpt(coreDatasetGroup.getId(), OptConstants.OPT_RESOURCE_TYPE.DATASET, OptConstants.OPT_TYPE.UPDATE); return datasetGroupInfoDTO; } @@ -190,7 +180,7 @@ public class DatasetGroupManage { DEException.throwException("resource not exist"); } Objects.requireNonNull(CommonBeanFactory.getBean(this.getClass())).recursionDel(id); - coreOptRecentManage.saveOpt(coreDatasetGroup.getId(), OptConstants.OPT_RESOURCE_TYPE.DATASET,OptConstants.OPT_TYPE.DELETE); + coreOptRecentManage.saveOpt(coreDatasetGroup.getId(), OptConstants.OPT_RESOURCE_TYPE.DATASET, OptConstants.OPT_TYPE.DELETE); } public void recursionDel(Long id) { @@ -231,15 +221,13 @@ public class DatasetGroupManage { public DataSetBarVO queryBarInfo(Long id) { DataSetBarVO dataSetBarVO = coreDataSetExtMapper.queryBarInfo(id); // get creator - if (userApi != null) { - UserFormVO userFormVO = userApi.queryById(Long.valueOf(dataSetBarVO.getCreateBy())); - if (userFormVO != null) { - dataSetBarVO.setCreator(userFormVO.getName()); - } - UserFormVO userFormVOUpdateBy = userApi.queryById(Long.valueOf(dataSetBarVO.getUpdateBy())); - if (userFormVOUpdateBy != null) { - dataSetBarVO.setUpdater(userFormVOUpdateBy.getName()); - } + String userName = coreUserManage.getUserName(Long.valueOf(dataSetBarVO.getCreateBy())); + if (StringUtils.isNotBlank(userName)) { + dataSetBarVO.setCreator(userName); + } + String updateUserName = coreUserManage.getUserName(Long.valueOf(dataSetBarVO.getUpdateBy())); + if (StringUtils.isNotBlank(updateUserName)) { + dataSetBarVO.setUpdater(updateUserName); } dataSetBarVO.setDatasourceDTOList(getDatasource(id)); return dataSetBarVO; @@ -254,13 +242,13 @@ public class DatasetGroupManage { QueryWrapper datasourceQueryWrapper = new QueryWrapper<>(); datasourceQueryWrapper.in("id", ids); - List datasourceDTOList = coreDatasourceMapper.selectList(datasourceQueryWrapper).stream().map(ele -> { + List datasourceDTOList = coreDatasourceMapper.selectList(datasourceQueryWrapper).stream().map(ele -> { DatasourceDTO dto = new DatasourceDTO(); BeanUtils.copyBean(dto, ele); dto.setConfiguration(null); return dto; }).collect(Collectors.toList()); - if(ids.size() != datasourceDTOList.size()){ + if (ids.size() != datasourceDTOList.size()) { DEException.throwException("由于数据集所用的数据源已被删除,无法显示数据集"); } return datasourceDTOList; @@ -366,15 +354,13 @@ public class DatasetGroupManage { DatasetGroupInfoDTO dto = new DatasetGroupInfoDTO(); BeanUtils.copyBean(dto, coreDatasetGroup); // get creator - if (userApi != null) { - UserFormVO userFormVO = userApi.queryById(Long.valueOf(dto.getCreateBy())); - if (userFormVO != null) { - dto.setCreator(userFormVO.getName()); - } - UserFormVO userFormVOUpdateBy = userApi.queryById(Long.valueOf(dto.getUpdateBy())); - if (userFormVOUpdateBy != null) { - dto.setUpdater(userFormVOUpdateBy.getName()); - } + String userName = coreUserManage.getUserName(Long.valueOf(dto.getCreateBy())); + if (StringUtils.isNotBlank(userName)) { + dto.setCreator(userName); + } + String updateUserName = coreUserManage.getUserName(Long.valueOf(dto.getUpdateBy())); + if (StringUtils.isNotBlank(updateUserName)) { + dto.setUpdater(updateUserName); } dto.setUnionSql(null); if (StringUtils.equalsIgnoreCase(dto.getNodeType(), "dataset")) { @@ -440,8 +426,8 @@ public class DatasetGroupManage { for (CoreDatasetTable datasetTable : datasetTables) { if (StringUtils.isNotEmpty(datasetTable.getSqlVariableDetails())) { List defaultsSqlVariableDetails = JsonUtil.parseList(datasetTable.getSqlVariableDetails(), listTypeReference); - if(CollectionUtil.isNotEmpty(defaultsSqlVariableDetails)){ - List fullName = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(defaultsSqlVariableDetails)) { + List fullName = new ArrayList<>(); geFullName(id, fullName); List finalFullName = CollectionUtil.reverse(fullName); defaultsSqlVariableDetails.forEach(sqlVariableDetails -> { diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java index 9b892bc21a..67762b324c 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java @@ -6,12 +6,10 @@ import io.dataease.api.dataset.dto.DatasetTableDTO; import io.dataease.api.dataset.dto.SqlVariableDetails; import io.dataease.api.dataset.union.*; import io.dataease.api.dataset.union.model.SQLObj; -import io.dataease.api.permissions.auth.api.InteractiveAuthApi; import io.dataease.api.permissions.auth.dto.BusiPerCheckDTO; import io.dataease.commons.utils.SqlparserUtils; import io.dataease.constant.AuthEnum; import io.dataease.dataset.constant.DatasetTableType; -import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableMapper; import io.dataease.dataset.dto.DatasourceSchemaDTO; import io.dataease.dataset.utils.DatasetTableTypeConstants; import io.dataease.dataset.utils.SqlUtils; @@ -24,6 +22,7 @@ import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; import io.dataease.exception.DEException; import io.dataease.i18n.Translator; +import io.dataease.system.manage.CorePermissionManage; import io.dataease.utils.BeanUtils; import io.dataease.utils.JsonUtil; import jakarta.annotation.Resource; @@ -31,7 +30,6 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -44,16 +42,14 @@ import java.util.stream.Collectors; */ @Component public class DatasetSQLManage { - @Resource - private CoreDatasetTableMapper coreDatasetTableMapper; - @Resource - private DatasetTableFieldManage datasetTableFieldManage; + @Resource private CoreDatasourceMapper coreDatasourceMapper; @Resource private EngineServer engineServer; - @Autowired(required = false) - private InteractiveAuthApi interactiveAuthApi; + + @Resource + private CorePermissionManage corePermissionManage; private static Logger logger = LoggerFactory.getLogger(DatasetSQLManage.class); @@ -328,17 +324,15 @@ public class DatasetSQLManage { private String putObj2Map(Map dsMap, DatasetTableDTO ds) throws Exception { // 通过datasource id校验数据源权限 - if (interactiveAuthApi != null) { - BusiPerCheckDTO dto = new BusiPerCheckDTO(); - dto.setId(ds.getDatasourceId()); - dto.setAuthEnum(AuthEnum.READ); - try { - interactiveAuthApi.checkAuth(dto); - } catch (Exception e) { - DEException.throwException(Translator.get("i18n_no_datasource_permission")); - } + BusiPerCheckDTO dto = new BusiPerCheckDTO(); + dto.setId(ds.getDatasourceId()); + dto.setAuthEnum(AuthEnum.READ); + boolean checked = corePermissionManage.checkAuth(dto); + if (!checked) { + DEException.throwException(Translator.get("i18n_no_datasource_permission")); } + String schemaAlias; if (StringUtils.equalsIgnoreCase(ds.getType(), DatasetTableType.DB) || StringUtils.equalsIgnoreCase(ds.getType(), DatasetTableType.SQL)) { CoreDatasource coreDatasource = coreDatasourceMapper.selectById(ds.getDatasourceId()); diff --git a/core/core-backend/src/main/java/io/dataease/datasource/manage/DataSourceManage.java b/core/core-backend/src/main/java/io/dataease/datasource/manage/DataSourceManage.java index 6ebd3a95d7..a26fe93b95 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/manage/DataSourceManage.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/manage/DataSourceManage.java @@ -87,6 +87,13 @@ public class DataSourceManage { coreOptRecentManage.saveOpt(coreDatasource.getId(), OptConstants.OPT_RESOURCE_TYPE.DATASOURCE,OptConstants.OPT_TYPE.UPDATE); } + @XpackInteract(value = "datasourceResourceTree", before = false) + public void innerEditStatus(CoreDatasource coreDatasource) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", coreDatasource.getId()); + coreDatasourceMapper.update(coreDatasource, updateWrapper); + } + @XpackInteract(value = "datasourceResourceTree", before = false) public void move(DatasourceDTO dataSourceDTO) { Long id = dataSourceDTO.getId(); diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java index a6a421b4a3..15c1e4a30d 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java @@ -53,8 +53,8 @@ public class CalciteProvider { private EngineServer engineServer; protected ExtendedJdbcClassLoader extendedJdbcClassLoader; private Map customJdbcClassLoaders = new HashMap<>(); - private final String FILE_PATH = "/opt/dataease/drivers"; - private final String CUSTOM_PATH = "/opt/dataease/custom-drivers/"; + private final String FILE_PATH = "/opt/dataease2.0/drivers"; + private final String CUSTOM_PATH = "/opt/dataease2.0/custom-drivers/"; private static String split = "DE"; @Resource diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/ExcelUtils.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/ExcelUtils.java index b4c3059602..9fa6b85ca0 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/ExcelUtils.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/ExcelUtils.java @@ -35,7 +35,7 @@ import java.util.stream.Collectors; public class ExcelUtils { public static final String UFEFF = "\uFEFF"; - private static String path = "/opt/dataease/data/excel/"; + private static String path = "/opt/dataease2.0/data/excel/"; private static ObjectMapper objectMapper = new ObjectMapper(); private static TypeReference> TableFieldListTypeReference = new TypeReference>() { diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceDriverServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceDriverServer.java index 52e6f48ae1..8e8cc6499d 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceDriverServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceDriverServer.java @@ -31,7 +31,7 @@ import java.util.*; @RequestMapping("/datasourceDriver") public class DatasourceDriverServer implements DatasourceDriverApi { - private final static String DRIVER_PATH = "/opt/dataease/custom-drivers/"; + private final static String DRIVER_PATH = "/opt/dataease2.0/custom-drivers/"; @Resource private CoreDriverMapper coreDriverMapper; diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java index 91a8a00ab3..d6550acdba 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java @@ -12,10 +12,6 @@ import io.dataease.api.dataset.dto.DatasetTableDTO; import io.dataease.api.dataset.dto.PreviewSqlDTO; import io.dataease.api.ds.DatasourceApi; import io.dataease.api.ds.vo.*; -import io.dataease.api.permissions.auth.api.InteractiveAuthApi; -import io.dataease.api.permissions.auth.dto.BusiResourceEditor; -import io.dataease.api.permissions.user.api.UserApi; -import io.dataease.api.permissions.user.vo.UserFormVO; import io.dataease.commons.constants.TaskStatus; import io.dataease.commons.utils.CommonThreadPool; import io.dataease.constant.DataSourceType; @@ -34,18 +30,17 @@ import io.dataease.datasource.provider.ApiUtils; import io.dataease.datasource.provider.CalciteProvider; import io.dataease.datasource.provider.ExcelUtils; import io.dataease.datasource.request.DatasourceRequest; -import io.dataease.datasource.type.Pg; import io.dataease.engine.constant.SQLConstants; import io.dataease.exception.DEException; import io.dataease.i18n.Translator; import io.dataease.license.config.XpackInteract; import io.dataease.model.BusiNodeRequest; import io.dataease.model.BusiNodeVO; +import io.dataease.system.manage.CoreUserManage; import io.dataease.utils.*; import jakarta.annotation.Resource; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RequestBody; @@ -89,10 +84,10 @@ public class DatasourceServer implements DatasourceApi { private CoreDsFinishPageMapper coreDsFinishPageMapper; @Resource private DatasetDataManage datasetDataManage; - @Autowired(required = false) - private UserApi userApi; - @Autowired(required = false) - private InteractiveAuthApi interactiveAuthApi; + + + @Resource + private CoreUserManage coreUserManage; @Override public List query(String keyWord) { @@ -311,16 +306,16 @@ public class DatasourceServer implements DatasourceApi { private static void checkParams(String configurationStr) { DatasourceConfiguration configuration = JsonUtil.parseObject(configurationStr, DatasourceConfiguration.class); - if(configuration.getInitialPoolSize() < configuration.getMinPoolSize()){ + if (configuration.getInitialPoolSize() < configuration.getMinPoolSize()) { DEException.throwException("初始连接数不能小于最小连接数!"); } - if(configuration.getInitialPoolSize() > configuration.getMaxPoolSize()){ + if (configuration.getInitialPoolSize() > configuration.getMaxPoolSize()) { DEException.throwException("初始连接数不能大于最大连接数!"); } - if(configuration.getMaxPoolSize() < configuration.getMinPoolSize()){ + if (configuration.getMaxPoolSize() < configuration.getMinPoolSize()) { DEException.throwException("最大连接数不能小于最小连接数!"); } - if(configuration.getQueryTimeout() < 0){ + if (configuration.getQueryTimeout() < 0) { DEException.throwException("查询超时不能小于0!"); } } @@ -540,12 +535,8 @@ public class DatasourceServer implements DatasourceApi { } datasourceDTO.setConfiguration(new String(Base64.getEncoder().encode(datasourceDTO.getConfiguration().getBytes()))); - if (userApi != null) { - UserFormVO userFormVO = userApi.queryById(Long.valueOf(datasourceDTO.getCreateBy())); - if (userFormVO != null) { - datasourceDTO.setCreator(userFormVO.getName()); - } - } + datasourceDTO.setCreator(coreUserManage.getUserName(Long.valueOf(datasourceDTO.getCreateBy()))); + return datasourceDTO; } @@ -622,14 +613,12 @@ public class DatasourceServer implements DatasourceApi { record.setStatus(coreDatasource.getStatus()); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("id", coreDatasource.getId()); - datasourceMapper.update(record, wrapper); - if (interactiveAuthApi != null) { - BusiResourceEditor editor = new BusiResourceEditor(); - editor.setId((long) coreDatasource.getId()); - editor.setName(coreDatasource.getName()); - editor.setExtraFlag(getExtraFlag(coreDatasource.getType(), coreDatasource.getStatus())); - interactiveAuthApi.editResource(editor); + CoreDatasource originData = datasourceMapper.selectById(coreDatasource.getId()); + String originStatus = originData.getStatus(); + if (StringUtils.equals(coreDatasource.getStatus(), originStatus)) { + return datasourceDTO; } + dataSourceManage.innerEditStatus(coreDatasource); return datasourceDTO; } @@ -882,7 +871,7 @@ public class DatasourceServer implements DatasourceApi { List datasetTableDTOS = ApiUtils.getTables(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())){ + if (pager.getRecords().get(i).getTableName().equalsIgnoreCase(datasetTableDTOS.get(i1).getTableName())) { pager.getRecords().get(i).setName(datasetTableDTOS.get(i1).getName()); } } diff --git a/core/core-backend/src/main/java/io/dataease/system/manage/CorePermissionManage.java b/core/core-backend/src/main/java/io/dataease/system/manage/CorePermissionManage.java new file mode 100644 index 0000000000..e01e24a0d5 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/system/manage/CorePermissionManage.java @@ -0,0 +1,14 @@ +package io.dataease.system.manage; + +import io.dataease.api.permissions.auth.dto.BusiPerCheckDTO; +import io.dataease.license.config.XpackInteract; +import org.springframework.stereotype.Component; + +@Component +public class CorePermissionManage { + + @XpackInteract(value = "corePermissionManage", replace = true) + public boolean checkAuth(BusiPerCheckDTO dto) { + return true; + } +} diff --git a/core/core-backend/src/main/java/io/dataease/system/manage/CoreUserManage.java b/core/core-backend/src/main/java/io/dataease/system/manage/CoreUserManage.java new file mode 100644 index 0000000000..1c4e7273d1 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/system/manage/CoreUserManage.java @@ -0,0 +1,14 @@ +package io.dataease.system.manage; + +import io.dataease.license.config.XpackInteract; +import org.springframework.stereotype.Component; + +@Component +public class CoreUserManage { + + + @XpackInteract(value = "coreUserManage", replace = true) + public String getUserName(Long uid) { + return "管理员"; + } +} diff --git a/core/core-backend/src/main/resources/application-standalone.yml b/core/core-backend/src/main/resources/application-standalone.yml index a1f9149413..19ab8a6e2e 100644 --- a/core/core-backend/src/main/resources/application-standalone.yml +++ b/core/core-backend/src/main/resources/application-standalone.yml @@ -1,6 +1,6 @@ spring: datasource: - url: jdbc:mysql://127.0.0.1:3306/de_standalone?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true + url: jdbc:mysql://39.98.78.97:3306/dataease?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false username: root password: Password123@mysql messages: diff --git a/core/core-frontend/src/api/template.ts b/core/core-frontend/src/api/template.ts new file mode 100644 index 0000000000..fdce516ca0 --- /dev/null +++ b/core/core-frontend/src/api/template.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export function save(data) { + return request.post({ + url: '/template/save', + data: data, + loading: true + }) +} +export function templateDelete(id) { + return request.post({ + url: '/template/delete/' + id + }) +} + +export function showTemplateList(data) { + return request.post({ + url: '/template/templateList', + data: data + }) +} + +export function findOne(id) { + return request.get({ + url: '/template/findOne/' + id + }) +} + +export function find(data) { + return request.post({ + url: '/template/find', + data: data, + loading: true + }) +} + +export function nameCheck(data) { + return request.post({ + url: '/template/nameCheck', + data: data + }) +} diff --git a/core/core-frontend/src/api/templateMarket/index.js b/core/core-frontend/src/api/templateMarket/index.js new file mode 100644 index 0000000000..81d500c4fb --- /dev/null +++ b/core/core-frontend/src/api/templateMarket/index.js @@ -0,0 +1,14 @@ +import request from '@/config/axios' + +export function searchMarket(data) { + return request.post({ + url: '/template/market/search', + data + }) +} + +export function getCategories() { + return request.post({ + url: '/template/market/categories' + }) +} diff --git a/core/core-frontend/src/components/visualization/ComponentEditBar.vue b/core/core-frontend/src/components/visualization/ComponentEditBar.vue index 81ced527a5..7dc1584f4c 100644 --- a/core/core-frontend/src/components/visualization/ComponentEditBar.vue +++ b/core/core-frontend/src/components/visualization/ComponentEditBar.vue @@ -287,7 +287,7 @@ const showEditPosition = computed(() => { if (showPosition.value === 'canvas') { const baseLeft = element.value.x - 1 const baseRight = pcMatrixCount.value.x - (element.value.x + element.value.sizeX - 1) - if (baseLeft === 0 && baseRight === 0) { + if ((baseLeft === 0 && baseRight === 0) || baseRight < 0) { return 'bar-main-right-inner' } else if (baseRight === 0) { return 'bar-main-left-outer' diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index 65515fa7a5..a78c249967 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -264,7 +264,7 @@ export default { data_source_table: '数据源表', auth_method: '认证方式', passwd: '用户名密码', - kerbers_info: '请确保 krb5.Conf、Keytab Key,已经添加到路径:/opt/dataease/conf', + kerbers_info: '请确保 krb5.Conf、Keytab Key,已经添加到路径:/opt/dataease2.0/conf', client_principal: 'Client Principal', keytab_Key_path: 'Keytab Key Path', please_select_left: '请从左侧选择', @@ -1430,8 +1430,9 @@ export default { auth_num: '授权数量', version: '版本', version_num: '版本号', - standard: '标准版', + standard: '社区版', enterprise: '企业版', + Embedded: '嵌入式版', support: '获取技术支持', update_success: '更新成功', serial_no: '序列号', @@ -1629,7 +1630,7 @@ export default { weeks_4: '周四', weeks_5: '周五', weeks_6: '周六', - system_parameter_setting: '系统参数设置', + system_parameter_setting: '系统参数', connection_successful: '连接成功', connection_failed: '连接失败', save_failed: '保存失败', diff --git a/core/core-frontend/src/views/about/index.vue b/core/core-frontend/src/views/about/index.vue index abb872e2ca..5f1f65041c 100644 --- a/core/core-frontend/src/views/about/index.vue +++ b/core/core-frontend/src/views/about/index.vue @@ -150,7 +150,13 @@ const update = (licKey: string) => {
{{ $t('about.version') }}
- {{ license.edition === 'Standard' ? $t('about.standard') : $t('about.enterprise') }} + {{ + !license?.edition + ? $t('about.standard') + : license.edition === 'Embedded' + ? $t('about.Embedded') + : $t('about.enterprise') + }}
diff --git a/core/core-frontend/src/views/canvas/DeCanvas.vue b/core/core-frontend/src/views/canvas/DeCanvas.vue index 6d72595834..02b101b8b0 100644 --- a/core/core-frontend/src/views/canvas/DeCanvas.vue +++ b/core/core-frontend/src/views/canvas/DeCanvas.vue @@ -175,14 +175,16 @@ const addItemBox = component => { } const moveOutFromTab = component => { - component.canvasId = canvasId.value - dvMainStore.addComponent({ - component, - index: undefined, - isFromGroup: true, - componentData: componentData.value - }) - addItemBox(component) + setTimeout(() => { + component.canvasId = canvasId.value + dvMainStore.addComponent({ + component, + index: undefined, + isFromGroup: true, + componentData: componentData.value + }) + addItemBox(component) + }, 500) } // 全局监听按键事件 diff --git a/core/core-frontend/src/views/chart/components/editor/dataset-select/DatasetSelect.vue b/core/core-frontend/src/views/chart/components/editor/dataset-select/DatasetSelect.vue index 1cfc8131a2..379f34814f 100644 --- a/core/core-frontend/src/views/chart/components/editor/dataset-select/DatasetSelect.vue +++ b/core/core-frontend/src/views/chart/components/editor/dataset-select/DatasetSelect.vue @@ -173,33 +173,10 @@ const dsClick = (data: Tree) => { } //选中赋值 _modelValue.value = data.id - getFields(data.id, props.viewId) //关闭弹窗 datasetSelectorPopover.value?.hide() } } -const getFields = (id, chartId) => { - if (id && chartId) { - getFieldByDQ(id, chartId) - .then(res => { - state.value.dimension = (res.dimensionList as unknown as Field[]) || [] - state.value.quota = (res.quotaList as unknown as Field[]) || [] - state.value.dimensionData = JSON.parse(JSON.stringify(state.value.dimension)) - state.value.quotaData = JSON.parse(JSON.stringify(state.value.quota)) - }) - .catch(() => { - state.value.dimension = [] - state.value.quota = [] - state.value.dimensionData = [] - state.value.quotaData = [] - }) - } else { - state.value.dimension = [] - state.value.quota = [] - state.value.dimensionData = [] - state.value.quotaData = [] - } -} const _popoverShow = ref(false) function onPopoverShow() { _popoverShow.value = true diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/components/TooltipSelector.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/components/TooltipSelector.vue index 2b74219b3b..a515875ab4 100644 --- a/core/core-frontend/src/views/chart/components/editor/editor-style/components/TooltipSelector.vue +++ b/core/core-frontend/src/views/chart/components/editor/editor-style/components/TooltipSelector.vue @@ -69,7 +69,7 @@ const initSeriesTooltip = () => { ...next, seriesId: next.seriesId ?? next.id, show: index <= quotaAxis.value.length - 1, - summary: 'sum' + summary: COUNT_DE_TYPE.includes(next.deType) ? 'count' : 'sum' } as SeriesFormatter if (seriesAxisMap[tmp.seriesId]) { tmp = { @@ -136,6 +136,18 @@ const AGGREGATION_TYPE = [ { name: t('chart.count'), value: 'count' }, { name: t('chart.count_distinct'), value: 'count_distinct' } ] +const COUNT_AGGREGATION_TYPE = [ + { name: t('chart.count'), value: 'count' }, + { name: t('chart.count_distinct'), value: 'count_distinct' } +] +const COUNT_DE_TYPE = [0, 1, 5] + +const aggregationList = computed(() => { + if (COUNT_DE_TYPE.includes(curSeriesFormatter.value?.deType)) { + return COUNT_AGGREGATION_TYPE + } + return AGGREGATION_TYPE +}) watch( [() => props.chart.customAttr.tooltip, () => props.chart.customAttr.tooltip.show], () => { @@ -188,10 +200,8 @@ const init = () => { formatterSelector.value?.blur() // 新增视图 const formatter = state.tooltipForm.seriesTooltipFormatter - if (!quotaAxis.value?.length) { - if (!formatter.length) { - quotaData.value?.forEach(i => formatter.push({ ...i, seriesId: i.id, show: false })) - } + if (!formatter.length) { + quotaData.value?.forEach(i => formatter.push({ ...i, seriesId: i.id, show: false })) curSeriesFormatter.value = {} return } @@ -209,7 +219,13 @@ const init = () => { } } -const showProperty = prop => props.propertyInner?.includes(prop) +const showProperty = prop => { + const instance = chartViewManager.getChartView(props.chart.render, props.chart.type) + if (instance) { + return instance.propertyInner['tooltip-selector'].includes(prop) + } + return props.propertyInner?.includes(prop) +} const updateSeriesTooltipFormatter = (form: AxisEditForm) => { const { axisType, editType } = form if ( @@ -575,7 +591,7 @@ onMounted(() => { @change="changeTooltipAttr('seriesTooltipFormatter', true)" > view.value['tableId']], () => { + getFields(props.view.tableId, props.view.id) const nodeId = view.value['tableId'] if (!!nodeId) { cacheId = nodeId as unknown as string @@ -157,7 +159,28 @@ watch( }, { deep: true } ) - +const getFields = (id, chartId) => { + if (id && chartId) { + getFieldByDQ(id, chartId) + .then(res => { + state.dimension = (res.dimensionList as unknown as Field[]) || [] + state.quota = (res.quotaList as unknown as Field[]) || [] + state.dimensionData = JSON.parse(JSON.stringify(state.dimension)) + state.quotaData = JSON.parse(JSON.stringify(state.quota)) + }) + .catch(() => { + state.dimension = [] + state.quota = [] + state.dimensionData = [] + state.quotaData = [] + }) + } else { + state.dimension = [] + state.quota = [] + state.dimensionData = [] + state.quotaData = [] + } +} watch( [() => state.searchField], newVal => { diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/bar/bar.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/bar/bar.ts index 817ab36a17..ead63e3e82 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/bar/bar.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/bar/bar.ts @@ -116,6 +116,7 @@ export class Bar extends G2PlotChartView { pre[next.id] = next return pre }, {}) + // 默认是灰色 tmpOptions.label.style.fill = DEFAULT_LABEL.color const label = { fields: [], @@ -242,6 +243,7 @@ export class StackBar extends Bar { return baseOptions } const { label: labelAttr } = parseJson(chart.customAttr) + baseOptions.label.style.fill = labelAttr.color const label = { ...baseOptions.label, formatter: function (param: Datum) { diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/bar/horizontal-bar.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/bar/horizontal-bar.ts index 2d7e5b9f3c..1ddc990762 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/bar/horizontal-bar.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/bar/horizontal-bar.ts @@ -164,11 +164,12 @@ export class HorizontalBar extends G2PlotChartView { } setupDefaultOptions(chart: ChartObj): ChartObj { - const { customAttr } = chart + const { customAttr, senior } = chart const { label } = customAttr if (!['left', 'middle', 'right'].includes(label.position)) { label.position = 'middle' } + senior.functionCfg.emptyDataStrategy = 'ignoreData' return chart } @@ -185,6 +186,7 @@ export class HorizontalBar extends G2PlotChartView { pre[next.id] = next return pre }, {}) + // 默认灰色 tmpOptions.label.style.fill = DEFAULT_LABEL.color const label = { fields: [], @@ -272,6 +274,7 @@ export class HorizontalStackBar extends HorizontalBar { return baseOptions } const { label: labelAttr } = parseJson(chart.customAttr) + baseOptions.label.style.fill = labelAttr.color const label = { ...baseOptions.label, formatter: function (param: Datum) { diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/others/word-cloud.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/others/word-cloud.ts index e9acde25b3..0fdfb9cce3 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/others/word-cloud.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/others/word-cloud.ts @@ -78,7 +78,7 @@ export class WordCloud extends G2PlotChartView { const options = this.setupOptions(chart, initOptions) const newChart = new G2WordCloud(container, options) newChart.on('point:click', param => { - action({ data: { data: param.data.data.datum } }) + action({ x: param.x, y: param.y, data: { data: param.data.data.datum } }) }) return newChart } diff --git a/core/core-frontend/src/views/common/DvDetailInfo.vue b/core/core-frontend/src/views/common/DvDetailInfo.vue index 062d601253..6c8e70b4b0 100644 --- a/core/core-frontend/src/views/common/DvDetailInfo.vue +++ b/core/core-frontend/src/views/common/DvDetailInfo.vue @@ -1,11 +1,11 @@