diff --git a/Dockerfile b/Dockerfile index f5118e68fd..986319240f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,10 +13,11 @@ WORKDIR /opt/apps ADD core/core-backend/target/CoreApplication.jar /opt/apps/app.jar ADD de-xpack/xpack-permissions/target/xpack-permissions-$IMAGE_TAG.jar /opt/apps/xpack-permission.jar ADD de-xpack/xpack-base/target/xpack-base-$IMAGE_TAG.jar /opt/apps/xpack-base.jar +ADD de-xpack/xpack-sync/target/xpack-sync-$IMAGE_TAG.jar /opt/apps/xpack-sync.jar ENV JAVA_APP_JAR=/opt/apps/app.jar HEALTHCHECK --interval=15s --timeout=5s --retries=20 --start-period=30s CMD curl -f 127.0.0.1:8100 -CMD java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dataease2.0/logs/dump.hprof -Dloader.path=/opt/apps/xpack-permission.jar,/opt/apps/xpack-base.jar -jar /opt/apps/app.jar +CMD java -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dataease2.0/logs/dump.hprof -Dloader.path=/opt/apps/xpack-permission.jar,/opt/apps/xpack-base.jar,/opt/apps/xpack-sync.jar -jar /opt/apps/app.jar diff --git a/core/core-backend/pom.xml b/core/core-backend/pom.xml index 1e43ec1d51..72a5f97b9e 100644 --- a/core/core-backend/pom.xml +++ b/core/core-backend/pom.xml @@ -23,6 +23,11 @@ api-permissions ${dataease.version} + + io.dataease + api-sync + ${dataease.version} + com.mysql mysql-connector-j 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 51424d85aa..12bd3304f8 100644 --- a/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java +++ b/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java @@ -21,11 +21,11 @@ public class MybatisPlusGenerator { /** * 业务模块例如datasource,dataset,panel等 */ - private static final String busi = "visualization"; + private static final String busi = "template"; /** * 这是要生成代码的表名称 */ - private static final String TABLE_NAME = "visualization_watermark"; + 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 7faaa1e829..0db9a5d4e9 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,6 +1,5 @@ package io.dataease.chart.manage; -import cn.hutool.core.collection.CollectionUtil; import io.dataease.api.chart.dto.*; import io.dataease.api.chart.request.ChartDrillRequest; import io.dataease.api.chart.request.ChartExtRequest; @@ -32,12 +31,13 @@ import io.dataease.system.manage.CorePermissionManage; import io.dataease.utils.BeanUtils; import io.dataease.utils.JsonUtil; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.math.RoundingMode; @@ -246,7 +246,7 @@ public class ChartDataManage { boolean hasParameters = false; List sqlVariables = datasetGroupManage.getSqlParams(Arrays.asList(view.getTableId())); - if (CollectionUtil.isNotEmpty(sqlVariables)) { + if (CollectionUtils.isNotEmpty(sqlVariables)) { for (SqlVariableDetails parameter : Optional.ofNullable(request.getParameters()).orElse(new ArrayList<>())) { String parameterId = StringUtils.endsWith(parameter.getId(), START_END_SEPARATOR) ? parameter.getId().split(START_END_SEPARATOR)[0] : parameter.getId(); if (sqlVariables.stream().map(SqlVariableDetails::getId).collect(Collectors.toList()).contains(parameterId)) { @@ -1146,8 +1146,8 @@ public class ChartDataManage { getIndex += xAxis.size(); } if (StringUtils.equalsIgnoreCase(fieldType, "extStack")) { - int xAxisSize = CollectionUtil.size(view.getXAxis()); - int extSize = CollectionUtil.size(view.getXAxisExt()); + int xAxisSize = CollectionUtils.size(view.getXAxis()); + int extSize = CollectionUtils.size(view.getXAxisExt()); index += xAxisSize + extSize; getIndex += xAxisSize + extSize; } @@ -1326,7 +1326,7 @@ public class ChartDataManage { } public void saveChartViewFromVisualization(String checkData, Long sceneId, Map chartViewsInfo) { - if (!CollectionUtils.isEmpty(chartViewsInfo)) { + if (!MapUtils.isEmpty(chartViewsInfo)) { chartViewsInfo.forEach((key, chartViewDTO) -> { if (checkData.indexOf(chartViewDTO.getId() + "") > -1) { try { diff --git a/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java b/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java index edcd4f7759..3df134d2d6 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java +++ b/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java @@ -1,6 +1,5 @@ package io.dataease.chart.server; -import cn.hutool.core.util.ArrayUtil; import io.dataease.api.chart.ChartDataApi; import io.dataease.api.chart.dto.ChartViewDTO; import io.dataease.api.chart.dto.ViewDetailField; @@ -15,18 +14,14 @@ import io.dataease.visualization.manage.VisualizationTemplateExtendDataManage; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.hssf.usermodel.HSSFClientAnchor; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.springframework.util.Base64Utils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; @@ -50,9 +45,9 @@ public class ChartDataServer implements ChartDataApi { public ChartViewDTO getData(ChartViewDTO chartViewDTO) throws Exception { try { // 从模板数据获取 - if(CommonConstants.VIEW_DATA_FROM.TEMPLATE.equalsIgnoreCase(chartViewDTO.getDataFrom())){ - return extendDataManage.getChartDataInfo(chartViewDTO.getId(),chartViewDTO); - }else{ + if (CommonConstants.VIEW_DATA_FROM.TEMPLATE.equalsIgnoreCase(chartViewDTO.getDataFrom())) { + return extendDataManage.getChartDataInfo(chartViewDTO.getId(), chartViewDTO); + } else { return chartDataManage.calcData(chartViewDTO); } } catch (Exception e) { @@ -85,7 +80,7 @@ public class ChartDataServer implements ChartDataApi { @Override public void innerExportDetails(ChartExcelRequest request, HttpServletResponse response) throws Exception { - OutputStream outputStream = response.getOutputStream(); + OutputStream outputStream = response.getOutputStream(); try { findExcelData(request); List details = request.getDetails(); @@ -114,7 +109,7 @@ public class ChartDataServer implements ChartDataApi { Boolean mergeHead = false; ViewDetailField[] detailFields = request.getDetailFields(); - if (ArrayUtil.isNotEmpty(detailFields)) { + if (ArrayUtils.isNotEmpty(detailFields)) { cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); @@ -199,7 +194,7 @@ public class ChartDataServer implements ChartDataApi { } else if (cellValObj != null) { try { // with DataType - if ((excelTypes[j].equals(DeTypeConstants.DE_INT) || excelTypes[j] .equals(DeTypeConstants.DE_FLOAT) ) && StringUtils.isNotEmpty(cellValObj.toString())) { + if ((excelTypes[j].equals(DeTypeConstants.DE_INT) || excelTypes[j].equals(DeTypeConstants.DE_FLOAT)) && StringUtils.isNotEmpty(cellValObj.toString())) { cell.setCellValue(Double.valueOf(cellValObj.toString())); } else { cell.setCellValue(cellValObj.toString()); diff --git a/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java b/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java index 7dfa8e7fe1..0e6f826ecc 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java +++ b/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java @@ -1,8 +1,8 @@ package io.dataease.chart.utils; -import cn.hutool.core.util.ArrayUtil; import io.dataease.api.chart.dto.*; import io.dataease.utils.IDUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -1004,7 +1004,7 @@ public class ChartDataBuild { Map map = transTableNormal(fields, null, data, desensitizationList); List> tableRow = (List>) map.get("tableRow"); final int xEndIndex = detailIndex; - Map> groupDataList = detailData.stream().collect(Collectors.groupingBy(item -> ArrayUtil.join(ArrayUtil.sub(item, 0, xEndIndex), "-de-", "(", ")"))); + Map> groupDataList = detailData.stream().collect(Collectors.groupingBy(item -> "(" + StringUtils.join(ArrayUtils.subarray(item, 0, xEndIndex), "-de-") + ")")); tableRow.forEach(row -> { String key = xAxis.stream().map(x -> String.format(format, row.get(x.getDataeaseName()).toString())).collect(Collectors.joining("-de-")); diff --git a/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java b/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java index eacb52d182..4b6ffc6c28 100644 --- a/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java +++ b/core/core-backend/src/main/java/io/dataease/commons/utils/SqlparserUtils.java @@ -60,12 +60,13 @@ public class SqlparserUtils { } private static void getDependencies(SqlNode sqlNode, Boolean fromOrJoin) { - + if (sqlNode == null) { + return; + } if (sqlNode.getKind() == JOIN) { SqlJoin sqlKind = (SqlJoin) sqlNode; } else if (sqlNode.getKind() == IDENTIFIER) { - } else if (sqlNode.getKind() == AS) { SqlBasicCall sqlKind = (SqlBasicCall) sqlNode; } else if (sqlNode.getKind() == SELECT) { @@ -80,9 +81,19 @@ public class SqlparserUtils { SqlNode newWhere = sqlKind.getWhere().accept(getSqlShuttle()); sqlKind.setWhere(newWhere); } - - } else { - // TODO 这里可根据需求拓展处理其他类型的 sqlNode + } else if (sqlNode.getKind() == ORDER_BY) { + SqlOrderBy sqlKind = (SqlOrderBy) sqlNode; + List operandList = sqlKind.getOperandList(); + for (int i = 0; i < operandList.size(); i++) { + getDependencies(operandList.get(i), false); + } + } else if (sqlNode.getKind() == UNION) { + SqlBasicCall sqlKind = (SqlBasicCall) sqlNode; + if (sqlKind.getOperandList().size() >= 2) { + for (int i = 0; i < sqlKind.getOperandList().size(); i++) { + getDependencies(sqlKind.getOperandList().get(i), false); + } + } } } 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 1258586555..cc81808666 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 @@ -1,6 +1,5 @@ package io.dataease.dataset.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.core.type.TypeReference; import io.dataease.api.dataset.dto.DatasetTableDTO; @@ -32,6 +31,7 @@ import io.dataease.operation.manage.CoreOptRecentManage; import io.dataease.system.manage.CoreUserManage; import io.dataease.utils.*; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -211,7 +211,7 @@ public class DatasetGroupManage { List nodes = new ArrayList<>(); if (ObjectUtils.isEmpty(request.getLeaf()) || !request.getLeaf()) nodes.add(rootNode()); List bos = pos.stream().map(this::convert).toList(); - if (CollectionUtil.isNotEmpty(bos)) { + if (CollectionUtils.isNotEmpty(bos)) { nodes.addAll(bos); } return TreeUtils.mergeTree(nodes, BusiNodeVO.class, false); @@ -449,10 +449,11 @@ public class DatasetGroupManage { for (CoreDatasetTable datasetTable : datasetTables) { if (StringUtils.isNotEmpty(datasetTable.getSqlVariableDetails())) { List defaultsSqlVariableDetails = JsonUtil.parseList(datasetTable.getSqlVariableDetails(), listTypeReference); - if (CollectionUtil.isNotEmpty(defaultsSqlVariableDetails)) { + if (CollectionUtils.isNotEmpty(defaultsSqlVariableDetails)) { List fullName = new ArrayList<>(); geFullName(id, fullName); - List finalFullName = CollectionUtil.reverse(fullName); + Collections.reverse(fullName); + List finalFullName = fullName; defaultsSqlVariableDetails.forEach(sqlVariableDetails -> { sqlVariableDetails.setDatasetGroupId(id); sqlVariableDetails.setDatasetTableId(datasetTable.getId()); @@ -500,13 +501,13 @@ public class DatasetGroupManage { public List getDetailWithPerm(List ids) { var result = new ArrayList(); - if (CollectionUtil.isNotEmpty(ids)) { + if (CollectionUtils.isNotEmpty(ids)) { var dsList = coreDatasetGroupMapper.selectBatchIds(ids); - if (CollectionUtil.isNotEmpty(dsList)) { + if (CollectionUtils.isNotEmpty(dsList)) { dsList.forEach(ds -> { DatasetTableDTO dto = new DatasetTableDTO(); BeanUtils.copyBean(dto, ds); - var fields = datasetTableFieldManage.listFieldsWithPermissions(ds.getId()); + var fields = datasetTableFieldManage.listFieldsWithPermissions(ds.getId()); List dimensionList = fields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "d")).toList(); List quotaList = fields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "q")).toList(); Map> map = new LinkedHashMap<>(); diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java index 08bf01ada9..2266e16989 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java @@ -1,9 +1,7 @@ package io.dataease.dataset.manage; -import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.dataease.api.chart.dto.ColumnPermissionItem; -import io.dataease.auth.bo.TokenUserBO; import io.dataease.dataset.dao.auto.entity.CoreDatasetTableField; import io.dataease.dataset.dao.auto.mapper.CoreDatasetGroupMapper; import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper; 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 a26fe93b95..8b0da25485 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 @@ -1,6 +1,5 @@ package io.dataease.datasource.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import io.dataease.api.ds.vo.DatasourceDTO; @@ -19,6 +18,7 @@ import io.dataease.operation.manage.CoreOptRecentManage; import io.dataease.utils.AuthUtils; import io.dataease.utils.TreeUtils; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -65,7 +65,7 @@ public class DataSourceManage { List nodes = new ArrayList<>(); List pos = dataSourceExtMapper.selectList(queryWrapper); if (ObjectUtils.isEmpty(request.getLeaf()) || !request.getLeaf()) nodes.add(rootNode()); - if (CollectionUtil.isNotEmpty(pos)) { + if (CollectionUtils.isNotEmpty(pos)) { nodes.addAll(pos.stream().map(this::convert).toList()); } return TreeUtils.mergeTree(nodes, BusiNodeVO.class, false); 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 43438cb658..797bc92009 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 @@ -173,7 +173,7 @@ public class CalciteProvider { datasetTableFields.add(tableField); } list = getDataResult(resultSet); - } catch (Exception e) { + } catch (Exception | AssertionError e) { DEException.throwException(Translator.get("i18n_fetch_error") + e.getMessage()); } finally { try { @@ -255,7 +255,7 @@ public class CalciteProvider { DatasourceConfiguration configuration = null; DatasourceType datasourceType = DatasourceType.valueOf(ds.getType()); try { - if(rootSchema.getSubSchema(ds.getSchemaAlias()) != null){ + if (rootSchema.getSubSchema(ds.getSchemaAlias()) != null) { JdbcSchema jdbcSchema = rootSchema.getSubSchema(ds.getSchemaAlias()).unwrap(JdbcSchema.class); BasicDataSource basicDataSource = (BasicDataSource) jdbcSchema.getDataSource(); basicDataSource.close(); 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 7296453e33..ee875b83aa 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 @@ -1,6 +1,5 @@ package io.dataease.datasource.server; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -42,13 +41,13 @@ import io.dataease.system.dao.auto.entity.CoreSysSetting; import io.dataease.system.manage.CoreUserManage; import io.dataease.utils.*; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.quartz.JobDataMap; import org.quartz.JobKey; import org.quartz.TriggerKey; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -137,6 +136,9 @@ public class DatasourceServer implements DatasourceApi { dataSourceManage.move(dataSourceDTO); } case "rename" -> { + if(StringUtils.isEmpty(dataSourceDTO.getName())){ + DEException.throwException("名称不能为空!"); + } CoreDatasource datasource = datasourceMapper.selectById(dataSourceDTO.getId()); datasource.setName(dataSourceDTO.getName()); dataSourceManage.innerEdit(datasource); @@ -168,7 +170,7 @@ public class DatasourceServer implements DatasourceApi { ids.add(busiNodeVO.getId()); } } - if (CollectionUtil.isNotEmpty(busiNodeVO.getChildren())) { + if (CollectionUtils.isNotEmpty(busiNodeVO.getChildren())) { filterDs(busiNodeVO.getChildren(), ids, type, id); } } @@ -184,14 +186,14 @@ public class DatasourceServer implements DatasourceApi { List ids = new ArrayList<>(); filterDs(busiNodeVOS, ids, dataSourceDTO.getType(), dataSourceDTO.getId()); - if (CollectionUtil.isEmpty(ids)) { + if (CollectionUtils.isEmpty(ids)) { return false; } QueryWrapper wrapper = new QueryWrapper<>(); wrapper.in("id", ids); List datasources = datasourceMapper.selectList(wrapper); - if (CollectionUtil.isEmpty(datasources)) { + if (CollectionUtils.isEmpty(datasources)) { return false; } dataSourceDTO.setConfiguration(new String(Base64.getDecoder().decode(dataSourceDTO.getConfiguration()))); @@ -465,8 +467,9 @@ public class DatasourceServer implements DatasourceApi { CoreDatasource coreDatasource = new CoreDatasource(); BeanUtils.copyBean(coreDatasource, dataSourceDTO); checkDatasourceStatus(coreDatasource); - dataSourceDTO.setStatus(coreDatasource.getStatus()); - return dataSourceDTO; + DatasourceDTO result = new DatasourceDTO(); + result.setStatus(coreDatasource.getStatus()); + return result; } @Override diff --git a/core/core-backend/src/main/java/io/dataease/map/manage/MapManage.java b/core/core-backend/src/main/java/io/dataease/map/manage/MapManage.java index b49278b60b..a5dcb5efef 100644 --- a/core/core-backend/src/main/java/io/dataease/map/manage/MapManage.java +++ b/core/core-backend/src/main/java/io/dataease/map/manage/MapManage.java @@ -1,7 +1,5 @@ package io.dataease.map.manage; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.dataease.api.map.dto.GeometryNodeCreator; import io.dataease.api.map.vo.AreaNode; @@ -14,6 +12,7 @@ import io.dataease.map.dao.ext.entity.CoreAreaCustom; import io.dataease.map.dao.ext.mapper.CoreAreaCustomMapper; import io.dataease.utils.BeanUtils; import io.dataease.utils.CommonBeanFactory; +import io.dataease.utils.FileUtils; import io.dataease.utils.LogUtil; import jakarta.annotation.Resource; import org.apache.commons.collections4.CollectionUtils; @@ -32,7 +31,6 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; -import java.util.stream.Stream; import static io.dataease.constant.CacheConstant.CommonCacheConstant.WORLD_MAP_CACHE; @@ -114,7 +112,8 @@ public class MapManage { if (ObjectUtils.isEmpty(file) || file.isEmpty()) { DEException.throwException("geometry file is require"); } - String suffix = FileUtil.getSuffix(file.getOriginalFilename()); + + String suffix = FileUtils.getExtensionName(file.getOriginalFilename()); if (!StringUtils.equalsIgnoreCase("json", suffix)) { DEException.throwException("仅支持json格式文件"); } @@ -164,7 +163,7 @@ public class MapManage { } List codeResultList = new ArrayList<>(); codeResultList.add(code); - childTreeIdList(ListUtil.of(code), codeResultList); + childTreeIdList(List.of(code), codeResultList); coreAreaCustomMapper.deleteBatchIds(codeResultList); codeResultList.forEach(id -> { File file = buildGeoFile(id); diff --git a/core/core-backend/src/main/java/io/dataease/menu/manage/MenuManage.java b/core/core-backend/src/main/java/io/dataease/menu/manage/MenuManage.java index b5434e11c9..f5e3296bfa 100644 --- a/core/core-backend/src/main/java/io/dataease/menu/manage/MenuManage.java +++ b/core/core-backend/src/main/java/io/dataease/menu/manage/MenuManage.java @@ -1,6 +1,5 @@ package io.dataease.menu.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.dataease.api.menu.vo.MenuMeta; import io.dataease.api.menu.vo.MenuVO; @@ -10,6 +9,7 @@ import io.dataease.menu.dao.auto.entity.CoreMenu; import io.dataease.menu.dao.auto.mapper.CoreMenuMapper; import io.dataease.utils.BeanUtils; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -61,10 +61,10 @@ public class MenuManage { for (MenuTreeNode menuTreeNode : roots) { MenuVO vo = convert(menuTreeNode); List children = null; - if (CollectionUtil.isNotEmpty(children = menuTreeNode.getChildren())) { + if (CollectionUtils.isNotEmpty(children = menuTreeNode.getChildren())) { vo.setChildren(convertTree(children)); } - if (CollectionUtil.isNotEmpty(vo.getChildren()) || menuTreeNode.getType() != 1) { + if (CollectionUtils.isNotEmpty(vo.getChildren()) || menuTreeNode.getType() != 1) { result.add(vo); } } diff --git a/core/core-backend/src/main/java/io/dataease/operation/manage/CoreOptRecentManage.java b/core/core-backend/src/main/java/io/dataease/operation/manage/CoreOptRecentManage.java index ff332a523e..f9e8283684 100644 --- a/core/core-backend/src/main/java/io/dataease/operation/manage/CoreOptRecentManage.java +++ b/core/core-backend/src/main/java/io/dataease/operation/manage/CoreOptRecentManage.java @@ -1,12 +1,12 @@ package io.dataease.operation.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.dataease.commons.constants.OptConstants; import io.dataease.operation.dao.auto.entity.CoreOptRecent; import io.dataease.operation.dao.auto.mapper.CoreOptRecentMapper; import io.dataease.utils.AuthUtils; import io.dataease.utils.IDUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -64,7 +64,7 @@ public class CoreOptRecentManage { queryWrapper.eq("resource_type", OptConstants.OPT_RESOURCE_TYPE.TEMPLATE); queryWrapper.eq("uid", uid); List result = coreStoreMapper.selectList(queryWrapper); - if (CollectionUtil.isNotEmpty(result)) { + if (CollectionUtils.isNotEmpty(result)) { return result.stream().collect(Collectors.toMap(CoreOptRecent::getResourceName, CoreOptRecent::getTime)); } else { return new HashMap<>(); diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorCheckBO.java b/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorCheckBO.java new file mode 100644 index 0000000000..aab6e1ed4e --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorCheckBO.java @@ -0,0 +1,12 @@ +package io.dataease.rmonitor.bo; + +import lombok.Data; +import java.io.Serializable; + +@Data +public class PerMonitorCheckBO implements Serializable { + + private boolean valid; + + private boolean emptyPermission; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorNodeBO.java b/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorNodeBO.java new file mode 100644 index 0000000000..ea2e91720c --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorNodeBO.java @@ -0,0 +1,24 @@ +package io.dataease.rmonitor.bo; + +import io.dataease.model.TreeBaseModel; +import io.dataease.model.TreeResultModel; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class PerMonitorNodeBO implements TreeBaseModel, TreeResultModel, Serializable { + + private Long id; + + private String name; + + private Long pid; + + private boolean leaf; + + private int extraFlag; + + private List children; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorManage.java b/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorManage.java new file mode 100644 index 0000000000..920e90cd3b --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorManage.java @@ -0,0 +1,118 @@ +package io.dataease.rmonitor.manage; + +import io.dataease.exception.DEException; +import io.dataease.rmonitor.bo.PerMonitorCheckBO; +import io.dataease.rmonitor.bo.PerMonitorNodeBO; +import io.dataease.rmonitor.mapper.ResourceMonitorMapper; +import io.dataease.rmonitor.mapper.entity.DatasetFreeResource; +import io.dataease.rmonitor.mapper.entity.DsFreeResource; +import io.dataease.rmonitor.mapper.entity.VisualFreeResource; +import io.dataease.utils.BeanUtils; +import io.dataease.utils.TreeUtils; +import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Component("resourceMonitorManage") +public class ResourceMonitorManage { + + + @Resource(name = "resourceMonitorSyncManage") + private ResourceMonitorSyncManage resourceMonitorSyncManage; + + @Resource + private ResourceMonitorMapper resourceMonitorMapper; + + + private boolean existFreeResource() { + int rCount = resourceMonitorMapper.dsCount() + resourceMonitorMapper.datasetCount() + resourceMonitorMapper.vCount(); + return rCount > 0; + } + + private Map> freeResource() { + Map> result = new HashMap<>(); + + List dsFreeResources = resourceMonitorMapper.queryFreeDs(); + if (CollectionUtils.isNotEmpty(dsFreeResources)) { + List dsBos = dsFreeResources.stream().map(node -> { + PerMonitorNodeBO bo = BeanUtils.copyBean(new PerMonitorNodeBO(), node); + bo.setLeaf(StringUtils.equals("folder", node.getType())); + return bo; + }).collect(Collectors.toList()); + List dsTree = TreeUtils.mergeTree(dsBos, PerMonitorNodeBO.class, false); + result.put("datasource", dsTree); + } + + List datasetFreeResources = resourceMonitorMapper.queryFreeDataset(); + if (CollectionUtils.isNotEmpty(datasetFreeResources)) { + List datasetBos = datasetFreeResources.stream().map(node -> { + PerMonitorNodeBO bo = BeanUtils.copyBean(new PerMonitorNodeBO(), node); + bo.setLeaf(StringUtils.equals("folder", node.getNodeType())); + return bo; + }).collect(Collectors.toList()); + List datasetTree = TreeUtils.mergeTree(datasetBos, PerMonitorNodeBO.class, false); + result.put("dataset", datasetTree); + } + + List visualFreeResources = resourceMonitorMapper.queryFreeVusial(); + if (CollectionUtils.isNotEmpty(visualFreeResources)) { + Map> baseMap = visualFreeResources.stream().collect(Collectors.groupingBy(VisualFreeResource::getType)); + for (Map.Entry> entry : baseMap.entrySet()) { + List freeResource = entry.getValue(); + List visualBos = freeResource.stream().map(node -> { + PerMonitorNodeBO bo = BeanUtils.copyBean(new PerMonitorNodeBO(), node); + bo.setLeaf(StringUtils.equals("folder", node.getNodeType())); + return bo; + }).collect(Collectors.toList()); + result.put(convertBusiFlag(entry.getKey()), TreeUtils.mergeTree(visualBos, PerMonitorNodeBO.class, false)); + } + } + return result; + } + + private String convertBusiFlag(String key) { + if (StringUtils.equals("dashboard", key)){ + return "panel"; + } else if (StringUtils.equals("dataV", key)) { + return "screen"; + } else return key; + } + + public boolean check() { + PerMonitorCheckBO checkBO = resourceMonitorSyncManage.checkXpackResource(); + return checkBO.isValid() && checkBO.isEmptyPermission() && existFreeResource(); + } + + @Transactional + public void delete() { + boolean existFree = existFreeResource(); + if (!existFree) DEException.throwException("无未同步资源!"); + resourceMonitorMapper.delFreeDs(); + resourceMonitorMapper.delFreeDataset(); + resourceMonitorMapper.delFreeVisual(); + } + + public void sync() { + //1、从xpack获取资源 如果xpack不存在 或者资源不为空 则直接返回 并且抛出异常“仅支持首次导入lic同步” + //2、从core获取资源 + //3、根据类型分组 并组织成树形结构 + //4、分别遍历每一棵树 从上到下 同步到权限体系 给默认组织 + PerMonitorCheckBO checkBO = resourceMonitorSyncManage.checkXpackResource(); + if (!checkBO.isValid()) DEException.throwException("缺少许可证"); + if (!checkBO.isEmptyPermission()) DEException.throwException("仅支持license首次导入同步"); + Map> freeResourceMap = freeResource(); + if (MapUtils.isEmpty(freeResourceMap)) DEException.throwException("无未同步资源!"); + for (Map.Entry> entry : freeResourceMap.entrySet()) { + resourceMonitorSyncManage.sync(entry.getKey(), entry.getValue()); + } + } + +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorSyncManage.java b/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorSyncManage.java new file mode 100644 index 0000000000..dc875acded --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorSyncManage.java @@ -0,0 +1,28 @@ +package io.dataease.rmonitor.manage; + +import io.dataease.exception.DEException; +import io.dataease.license.config.XpackInteract; +import io.dataease.rmonitor.bo.PerMonitorCheckBO; +import io.dataease.rmonitor.bo.PerMonitorNodeBO; +import io.dataease.rmonitor.mapper.ResourceMonitorMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component("resourceMonitorSyncManage") +public class ResourceMonitorSyncManage { + + @Resource(name = "resourceMonitorMapper") + private ResourceMonitorMapper resourceMonitorMapper; + + @XpackInteract(value = "resourceMonitorSyncManage", replace = true) + public void sync(String flag, List treeNodes) { + DEException.throwException("缺失许可证"); + } + + @XpackInteract(value = "resourceMonitorSyncManage", replace = true) + public PerMonitorCheckBO checkXpackResource() { + return new PerMonitorCheckBO(); + } +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/ResourceMonitorMapper.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/ResourceMonitorMapper.java new file mode 100644 index 0000000000..0b2ae83575 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/ResourceMonitorMapper.java @@ -0,0 +1,41 @@ +package io.dataease.rmonitor.mapper; + +import io.dataease.rmonitor.mapper.entity.DatasetFreeResource; +import io.dataease.rmonitor.mapper.entity.DsFreeResource; +import io.dataease.rmonitor.mapper.entity.VisualFreeResource; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface ResourceMonitorMapper { + + @Select("select count(id) from core_datasource") + int dsCount(); + + @Select("select count(id) from core_dataset_group") + int datasetCount(); + + @Select("select count(id) from data_visualization_info") + int vCount(); + + @Select("select id, name, pid, type, status from core_datasource") + List queryFreeDs(); + + @Select("select id, name, pid, node_type from core_dataset_group") + List queryFreeDataset(); + + @Select("select id, name, pid, node_type, type from data_visualization_info") + List queryFreeVusial(); + + @Delete("delete from core_datasource") + void delFreeDs(); + + @Delete("delete from core_dataset_group") + void delFreeDataset(); + @Delete("delete from data_visualization_info") + void delFreeVisual(); + +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/BaseFreeResource.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/BaseFreeResource.java new file mode 100644 index 0000000000..390acb6e10 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/BaseFreeResource.java @@ -0,0 +1,15 @@ +package io.dataease.rmonitor.mapper.entity; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class BaseFreeResource implements Serializable { + + private Long id; + + private String name; + + private Long pid; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DatasetFreeResource.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DatasetFreeResource.java new file mode 100644 index 0000000000..1d4f85c00a --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DatasetFreeResource.java @@ -0,0 +1,13 @@ +package io.dataease.rmonitor.mapper.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@EqualsAndHashCode(callSuper = true) +@Data +public class DatasetFreeResource extends BaseFreeResource implements Serializable { + + private String nodeType; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DsFreeResource.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DsFreeResource.java new file mode 100644 index 0000000000..a8dc0fd1a0 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DsFreeResource.java @@ -0,0 +1,16 @@ +package io.dataease.rmonitor.mapper.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@EqualsAndHashCode(callSuper = true) +@Data +public class DsFreeResource extends BaseFreeResource implements Serializable { + + private String type; + + private String status; + +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/VisualFreeResource.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/VisualFreeResource.java new file mode 100644 index 0000000000..d3302b84c5 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/VisualFreeResource.java @@ -0,0 +1,15 @@ +package io.dataease.rmonitor.mapper.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@EqualsAndHashCode(callSuper = true) +@Data +public class VisualFreeResource extends BaseFreeResource implements Serializable { + + private String nodeType; + + private String type; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/server/ResourceMonitorServer.java b/core/core-backend/src/main/java/io/dataease/rmonitor/server/ResourceMonitorServer.java new file mode 100644 index 0000000000..1289ba3a79 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/server/ResourceMonitorServer.java @@ -0,0 +1,30 @@ +package io.dataease.rmonitor.server; + +import io.dataease.api.rmonitor.ResourceMonitorApi; +import io.dataease.rmonitor.manage.ResourceMonitorManage; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rmonitor") +public class ResourceMonitorServer implements ResourceMonitorApi { + + @Resource(name = "resourceMonitorManage") + private ResourceMonitorManage resourceMonitorManage; + + @Override + public boolean existFree() { + return resourceMonitorManage.check(); + } + + @Override + public void delete() { + resourceMonitorManage.delete(); + } + + @Override + public void sync() { + resourceMonitorManage.sync(); + } +} diff --git a/core/core-backend/src/main/java/io/dataease/share/dao/auto/entity/XpackShare.java b/core/core-backend/src/main/java/io/dataease/share/dao/auto/entity/XpackShare.java new file mode 100644 index 0000000000..2ea358f8ae --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/share/dao/auto/entity/XpackShare.java @@ -0,0 +1,150 @@ +package io.dataease.share.dao.auto.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author fit2cloud + * @since 2023-09-22 + */ +@TableName("xpack_share") +public class XpackShare implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + /** + * 创建人 + */ + private Long creator; + + /** + * 创建时间 + */ + private Long time; + + /** + * 过期时间 + */ + private Long exp; + + /** + * uuid + */ + private String uuid; + + /** + * 密码 + */ + private String pwd; + + /** + * 资源ID + */ + private Long resourceId; + + /** + * 组织ID + */ + private Long oid; + + /** + * 业务类型 + */ + private Integer type; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getCreator() { + return creator; + } + + public void setCreator(Long creator) { + this.creator = creator; + } + + public Long getTime() { + return time; + } + + public void setTime(Long time) { + this.time = time; + } + + public Long getExp() { + return exp; + } + + public void setExp(Long exp) { + this.exp = exp; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getPwd() { + return pwd; + } + + public void setPwd(String pwd) { + this.pwd = pwd; + } + + public Long getResourceId() { + return resourceId; + } + + public void setResourceId(Long resourceId) { + this.resourceId = resourceId; + } + + public Long getOid() { + return oid; + } + + public void setOid(Long oid) { + this.oid = oid; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "XpackShare{" + + "id = " + id + + ", creator = " + creator + + ", time = " + time + + ", exp = " + exp + + ", uuid = " + uuid + + ", pwd = " + pwd + + ", resourceId = " + resourceId + + ", oid = " + oid + + ", type = " + type + + "}"; + } +} diff --git a/core/core-backend/src/main/java/io/dataease/share/dao/auto/mapper/XpackShareMapper.java b/core/core-backend/src/main/java/io/dataease/share/dao/auto/mapper/XpackShareMapper.java new file mode 100644 index 0000000000..488a2acc43 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/share/dao/auto/mapper/XpackShareMapper.java @@ -0,0 +1,18 @@ +package io.dataease.share.dao.auto.mapper; + +import io.dataease.share.dao.auto.entity.XpackShare; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author fit2cloud + * @since 2023-09-22 + */ +@Mapper +public interface XpackShareMapper extends BaseMapper { + +} diff --git a/core/core-backend/src/main/java/io/dataease/share/dao/ext/mapper/XpackShareExtMapper.java b/core/core-backend/src/main/java/io/dataease/share/dao/ext/mapper/XpackShareExtMapper.java new file mode 100644 index 0000000000..4b122e87b7 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/share/dao/ext/mapper/XpackShareExtMapper.java @@ -0,0 +1,30 @@ +package io.dataease.share.dao.ext.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.dataease.share.dao.ext.po.XpackSharePO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface XpackShareExtMapper { + + @Select(""" + select + s.id as share_id, + v.id as resource_id, + v.type, + s.creator, + s.time, + s.exp, + v.name + from xpack_share s + left join data_visualization_info v on s.resource_id = v.id + ${ew.customSqlSegment} + """) + IPage query(IPage page, @Param("ew") QueryWrapper ew); + + @Select("select type from data_visualization_info where id = #{id}") + String visualizationType(@Param("id") Long id); +} diff --git a/core/core-backend/src/main/java/io/dataease/share/dao/ext/po/XpackSharePO.java b/core/core-backend/src/main/java/io/dataease/share/dao/ext/po/XpackSharePO.java new file mode 100644 index 0000000000..9b89fb7b03 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/share/dao/ext/po/XpackSharePO.java @@ -0,0 +1,31 @@ +package io.dataease.share.dao.ext.po; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class XpackSharePO implements Serializable { + @Serial + private static final long serialVersionUID = 7929343371768885789L; + + private Long shareId; + + private Long resourceId; + + private String name; + + private String type; + + private Long creator; + + private Long time; + + private Long exp; + +} diff --git a/core/core-backend/src/main/java/io/dataease/share/manage/XpackShareManage.java b/core/core-backend/src/main/java/io/dataease/share/manage/XpackShareManage.java new file mode 100644 index 0000000000..c325161e67 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/share/manage/XpackShareManage.java @@ -0,0 +1,201 @@ +package io.dataease.share.manage; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.dataease.api.visualization.request.VisualizationWorkbranchQueryRequest; +import io.dataease.api.xpack.share.request.XpackShareProxyRequest; +import io.dataease.api.xpack.share.request.XpackSharePwdValidator; +import io.dataease.api.xpack.share.vo.XpackShareGridVO; +import io.dataease.api.xpack.share.vo.XpackShareProxyVO; +import io.dataease.auth.bo.TokenUserBO; +import io.dataease.constant.AuthConstant; +import io.dataease.constant.BusiResourceEnum; +import io.dataease.exception.DEException; +import io.dataease.license.config.XpackInteract; +import io.dataease.share.dao.auto.mapper.XpackShareMapper; +import io.dataease.utils.*; +import io.dataease.share.dao.auto.entity.XpackShare; +import io.dataease.share.dao.ext.mapper.XpackShareExtMapper; +import io.dataease.share.dao.ext.po.XpackSharePO; +import io.dataease.share.util.LinkTokenUtil; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Component("xpackShareManage") +public class XpackShareManage { + + @Resource(name = "xpackShareMapper") + private XpackShareMapper xpackShareMapper; + + @Resource(name = "xpackShareExtMapper") + private XpackShareExtMapper xpackShareExtMapper; + + public XpackShare queryByResource(Long resourceId) { + Long userId = AuthUtils.getUser().getUserId(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("creator", userId); + queryWrapper.eq("resource_id", resourceId); + return xpackShareMapper.selectOne(queryWrapper); + } + + public void switcher(Long resourceId) { + XpackShare originData = queryByResource(resourceId); + if (ObjectUtils.isNotEmpty(originData)) { + xpackShareMapper.deleteById(originData.getId()); + return; + } + TokenUserBO user = AuthUtils.getUser(); + Long userId = user.getUserId(); + XpackShare xpackShare = new XpackShare(); + xpackShare.setId(IDUtils.snowID()); + xpackShare.setCreator(userId); + xpackShare.setTime(System.currentTimeMillis()); + xpackShare.setResourceId(resourceId); + xpackShare.setUuid(RandomStringUtils.randomAlphanumeric(8)); + xpackShare.setOid(user.getDefaultOid()); + String dType = xpackShareExtMapper.visualizationType(resourceId); + xpackShare.setType(StringUtils.equalsIgnoreCase("dataV", dType) ? 2 : 1); + xpackShareMapper.insert(xpackShare); + } + + public void editExp(Long resourceId, Long exp) { + XpackShare originData = queryByResource(resourceId); + if (ObjectUtils.isEmpty(originData)) { + DEException.throwException("share instance not exist"); + } + originData.setExp(exp); + if (ObjectUtils.isEmpty(exp)) { + originData.setExp(0L); + } + xpackShareMapper.updateById(originData); + } + + public void editPwd(Long resourceId, String pwd) { + XpackShare originData = queryByResource(resourceId); + if (ObjectUtils.isEmpty(originData)) { + DEException.throwException("share instance not exist"); + } + originData.setPwd(pwd); + xpackShareMapper.updateById(originData); + } + + public IPage querySharePage(int goPage, int pageSize, VisualizationWorkbranchQueryRequest request) { + Long uid = AuthUtils.getUser().getUserId(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("s.creator", uid); + if (StringUtils.isNotBlank(request.getType())) { + BusiResourceEnum busiResourceEnum = BusiResourceEnum.valueOf(request.getType().toUpperCase()); + if (ObjectUtils.isEmpty(busiResourceEnum)) { + DEException.throwException("type is invalid"); + } + String resourceType = convertResourceType(request.getType()); + if (StringUtils.isNotBlank(resourceType)) { + queryWrapper.eq("v.type", resourceType); + } + } + if (StringUtils.isNotBlank(request.getKeyword())) { + queryWrapper.like("v.name", request.getKeyword()); + } + queryWrapper.orderBy(true, request.isAsc(), "s.time"); + Page page = new Page<>(goPage, pageSize); + return xpackShareExtMapper.query(page, queryWrapper); + } + + private String convertResourceType(String busiFlag) { + return switch (busiFlag) { + case "panel" -> "dashboard"; + case "screen" -> "dataV"; + default -> null; + }; + } + + @XpackInteract(value = "perFilterShareManage", recursion = true) + public IPage query(int pageNum, int pageSize, VisualizationWorkbranchQueryRequest request) { + IPage poiPage = proxy().querySharePage(pageNum, pageSize, request); + List vos = proxy().formatResult(poiPage.getRecords()); + IPage ipage = new Page<>(); + ipage.setSize(poiPage.getSize()); + ipage.setCurrent(poiPage.getCurrent()); + ipage.setPages(poiPage.getPages()); + ipage.setTotal(poiPage.getTotal()); + ipage.setRecords(vos); + return ipage; + } + + public List formatResult(List pos) { + if (CollectionUtils.isEmpty(pos)) return new ArrayList<>(); + return pos.stream().map(po -> + new XpackShareGridVO( + po.getShareId(), po.getResourceId(), po.getName(), po.getCreator().toString(), + po.getTime(), po.getExp(), 9)).toList(); + } + + private XpackShareManage proxy() { + return CommonBeanFactory.getBean(this.getClass()); + } + + public XpackShareProxyVO proxyInfo(XpackShareProxyRequest request) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("uuid", request.getUuid()); + XpackShare xpackShare = xpackShareMapper.selectOne(queryWrapper); + if (ObjectUtils.isEmpty(xpackShare)) + return null; + String linkToken = LinkTokenUtil.generate(xpackShare.getCreator(), xpackShare.getResourceId(), xpackShare.getExp(), xpackShare.getPwd(), xpackShare.getOid()); + HttpServletResponse response = ServletUtils.response(); + response.addHeader(AuthConstant.LINK_TOKEN_KEY, linkToken); + Integer type = xpackShare.getType(); + String typeText = (ObjectUtils.isNotEmpty(type) && type == 1) ? "dashboard" : "dataV"; + return new XpackShareProxyVO(xpackShare.getResourceId(), xpackShare.getCreator(), linkExp(xpackShare), pwdValid(xpackShare, request.getCiphertext()), typeText); + } + + private boolean linkExp(XpackShare xpackShare) { + if (ObjectUtils.isEmpty(xpackShare.getExp()) || xpackShare.getExp().equals(0L)) return false; + return System.currentTimeMillis() > xpackShare.getExp(); + } + + private boolean pwdValid(XpackShare xpackShare, String ciphertext) { + if (StringUtils.isBlank(xpackShare.getPwd())) return true; + if (StringUtils.isBlank(ciphertext)) return false; + String text = RsaUtils.decryptStr(ciphertext); + int len = text.length(); + int splitIndex = len - 4; + String pwd = text.substring(splitIndex); + String uuid = text.substring(0, splitIndex); + return StringUtils.equals(xpackShare.getUuid(), uuid) && StringUtils.equals(xpackShare.getPwd(), pwd); + } + + public boolean validatePwd(XpackSharePwdValidator validator) { + String ciphertext = RsaUtils.decryptStr(validator.getCiphertext()); + int len = ciphertext.length(); + int splitIndex = len - 4; + String pwd = ciphertext.substring(splitIndex); + String uuid = ciphertext.substring(0, splitIndex); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("uuid", uuid); + XpackShare xpackShare = xpackShareMapper.selectOne(queryWrapper); + return StringUtils.equals(xpackShare.getUuid(), uuid) && StringUtils.equals(xpackShare.getPwd(), pwd); + } + + public Map queryRelationByUserId(Long uid) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("creator", uid); + List result = xpackShareMapper.selectList(queryWrapper); + if (CollectionUtils.isNotEmpty(result)) { + return result.stream() + .collect(Collectors.toMap(xpackShare -> String.valueOf(xpackShare.getResourceId()), XpackShare::getUuid)); + } + return new HashMap<>(); + } +} diff --git a/core/core-backend/src/main/java/io/dataease/share/server/XpackShareServer.java b/core/core-backend/src/main/java/io/dataease/share/server/XpackShareServer.java new file mode 100644 index 0000000000..94bb97bb25 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/share/server/XpackShareServer.java @@ -0,0 +1,76 @@ +package io.dataease.share.server; + +import io.dataease.api.visualization.request.VisualizationWorkbranchQueryRequest; +import io.dataease.api.xpack.share.XpackShareApi; +import io.dataease.api.xpack.share.request.XpackShareExpRequest; +import io.dataease.api.xpack.share.request.XpackShareProxyRequest; +import io.dataease.api.xpack.share.request.XpackSharePwdRequest; +import io.dataease.api.xpack.share.request.XpackSharePwdValidator; +import io.dataease.api.xpack.share.vo.XpackShareGridVO; +import io.dataease.api.xpack.share.vo.XpackShareProxyVO; +import io.dataease.api.xpack.share.vo.XpackShareVO; +import io.dataease.utils.BeanUtils; +import io.dataease.share.dao.auto.entity.XpackShare; +import io.dataease.share.manage.XpackShareManage; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +@RequestMapping("/share") +@RestController +public class XpackShareServer implements XpackShareApi { + + @Resource(name = "xpackShareManage") + private XpackShareManage xpackShareManage; + @Override + public boolean status(Long resourceId) { + return ObjectUtils.isNotEmpty(xpackShareManage.queryByResource(resourceId)); + } + + @Override + public void switcher(Long resourceId) { + xpackShareManage.switcher(resourceId); + } + + @Override + public void editExp(XpackShareExpRequest request) { + xpackShareManage.editExp(request.getResourceId(), request.getExp()); + } + + @Override + public void editPwd(XpackSharePwdRequest request) { + xpackShareManage.editPwd(request.getResourceId(), request.getPwd()); + } + + @Override + public XpackShareVO detail(Long resourceId) { + XpackShare xpackShare = xpackShareManage.queryByResource(resourceId); + if (ObjectUtils.isEmpty(xpackShare)) return null; + return BeanUtils.copyBean(new XpackShareVO(), xpackShare); + } + + @Override + public List query(VisualizationWorkbranchQueryRequest request) { + return xpackShareManage.query(1, 20, request).getRecords(); + } + + @Override + public XpackShareProxyVO proxyInfo(XpackShareProxyRequest request) { + return xpackShareManage.proxyInfo(request); + } + + @Override + public boolean validatePwd(XpackSharePwdValidator validator) { + return xpackShareManage.validatePwd(validator); + } + + @Override + public Map queryRelationByUserId(@PathVariable("uid") Long uid) { + return xpackShareManage.queryRelationByUserId(uid); + } +} diff --git a/core/core-backend/src/main/java/io/dataease/share/util/LinkTokenUtil.java b/core/core-backend/src/main/java/io/dataease/share/util/LinkTokenUtil.java new file mode 100644 index 0000000000..e460e9361e --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/share/util/LinkTokenUtil.java @@ -0,0 +1,23 @@ +package io.dataease.share.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTCreator; +import com.auth0.jwt.algorithms.Algorithm; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.Date; + +public class LinkTokenUtil { + private static final String defaultPwd = "link-pwd-fit2cloud"; + public static String generate(Long uid, Long resourceId, Long exp, String pwd, Long oid) { + pwd = StringUtils.isBlank(pwd) ? defaultPwd : pwd; + Algorithm algorithm = Algorithm.HMAC256(pwd); + JWTCreator.Builder builder = JWT.create(); + builder.withClaim("uid", uid).withClaim("resourceId", resourceId).withClaim("oid", oid); + if (ObjectUtils.isNotEmpty(exp) && !exp.equals(0L)) { + builder = builder.withExpiresAt(new Date(exp)); + } + return builder.sign(algorithm); + } +} diff --git a/core/core-backend/src/main/java/io/dataease/system/server/SysParameterServer.java b/core/core-backend/src/main/java/io/dataease/system/server/SysParameterServer.java index eb33745da1..f1a2cd8450 100644 --- a/core/core-backend/src/main/java/io/dataease/system/server/SysParameterServer.java +++ b/core/core-backend/src/main/java/io/dataease/system/server/SysParameterServer.java @@ -3,10 +3,12 @@ package io.dataease.system.server; import io.dataease.api.system.SysParameterApi; import io.dataease.api.system.request.OnlineMapEditor; import io.dataease.api.system.vo.SettingItemVO; +import io.dataease.constant.XpackSettingConstants; import io.dataease.system.dao.auto.entity.CoreSysSetting; import io.dataease.system.manage.SysParameterManage; import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -18,6 +20,7 @@ public class SysParameterServer implements SysParameterApi { @Resource private SysParameterManage sysParameterManage; + @Override public String singleVal(String key) { return sysParameterManage.singleVal(key); @@ -45,4 +48,17 @@ public class SysParameterServer implements SysParameterApi { public void saveBasicSetting(List settingItemVOS) { sysParameterManage.saveBasic(settingItemVOS); } + + @Override + public Integer RequestTimeOut() { + Integer frontTimeOut = 60; + List settingItemVOS = queryBasicSetting(); + for (int i = 0; i < settingItemVOS.size(); i++) { + SettingItemVO settingItemVO = settingItemVOS.get(i); + if (StringUtils.isNotBlank(settingItemVO.getPkey()) && settingItemVO.getPkey().equalsIgnoreCase(XpackSettingConstants.Front_Time_Out) && StringUtils.isNotBlank(settingItemVO.getPval())) { + frontTimeOut = Integer.parseInt(settingItemVO.getPval()); + } + } + return frontTimeOut; + } } diff --git a/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java b/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java index d0315f9262..122d0d7989 100644 --- a/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java +++ b/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java @@ -5,11 +5,11 @@ import java.io.Serializable; /** *

- * 仪表板模板表 + * *

* * @author fit2cloud - * @since 2023-11-06 + * @since 2024-01-16 */ @TableName("visualization_template") public class VisualizationTemplate implements Serializable { @@ -37,7 +37,7 @@ public class VisualizationTemplate implements Serializable { private Integer level; /** - * 模板种类 dataV or dashboard 目录或者文件夹 + * 模版种类 dataV or dashboard 目录或者文件夹 */ private String dvType; @@ -62,7 +62,7 @@ public class VisualizationTemplate implements Serializable { private String snapshot; /** - * 模板类型 system 系统内置 self 用户自建 + * 模版类型 system 系统内置 self 用户自建 */ private String templateType; @@ -81,6 +81,11 @@ public class VisualizationTemplate implements Serializable { */ private String dynamicData; + /** + * 使用次数 + */ + private Integer useCount; + public String getId() { return id; } @@ -185,6 +190,14 @@ public class VisualizationTemplate implements Serializable { this.dynamicData = dynamicData; } + public Integer getUseCount() { + return useCount; + } + + public void setUseCount(Integer useCount) { + this.useCount = useCount; + } + @Override public String toString() { return "VisualizationTemplate{" + @@ -201,6 +214,7 @@ public class VisualizationTemplate implements Serializable { ", templateStyle = " + templateStyle + ", templateData = " + templateData + ", dynamicData = " + dynamicData + + ", useCount = " + useCount + "}"; } } diff --git a/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java b/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java index 2a8c72964f..73bfdaff84 100644 --- a/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java +++ b/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java @@ -6,11 +6,11 @@ import org.apache.ibatis.annotations.Mapper; /** *

- * 仪表板模板表 Mapper 接口 + * Mapper 接口 *

* * @author fit2cloud - * @since 2023-11-06 + * @since 2024-01-16 */ @Mapper public interface VisualizationTemplateMapper extends BaseMapper { diff --git a/core/core-backend/src/main/java/io/dataease/template/manage/TemplateCenterManage.java b/core/core-backend/src/main/java/io/dataease/template/manage/TemplateCenterManage.java index 85d631dfca..374e793bb1 100644 --- a/core/core-backend/src/main/java/io/dataease/template/manage/TemplateCenterManage.java +++ b/core/core-backend/src/main/java/io/dataease/template/manage/TemplateCenterManage.java @@ -121,13 +121,17 @@ public class TemplateCenterManage { public MarketBaseResponse searchTemplateRecommend() { + MarketTemplateV2BaseResponse v2BaseResponse = null; + Map templateParams = sysParameterManage.groupVal("template."); + // 模版市场推荐 try { - Map templateParams = sysParameterManage.groupVal("template."); - return baseResponseV2TransRecommend(templateQuery(templateParams), templateParams.get("template.url")); + v2BaseResponse = templateQuery(templateParams); } catch (Exception e) { DEException.throwException(e); } - return null; + // 模版管理使用次数推荐 + List manage = searchTemplateFromManage(); + return baseResponseV2TransRecommend(v2BaseResponse, manage, templateParams.get("template.url")); } public MarketPreviewBaseResponse searchTemplatePreview() { @@ -161,7 +165,7 @@ public class TemplateCenterManage { } } - private MarketBaseResponse baseResponseV2TransRecommend(MarketTemplateV2BaseResponse v2BaseResponse, String url) { + private MarketBaseResponse baseResponseV2TransRecommend(MarketTemplateV2BaseResponse v2BaseResponse,List templateManages, String url) { Map useTime = coreOptRecentManage.findTemplateRecentUseTime(); List categoryVO = getCategoriesV2().stream().filter(node -> !"全部".equalsIgnoreCase(node.getLabel())).collect(Collectors.toList()); Map categoriesMap = categoryVO.stream() @@ -177,6 +181,22 @@ public class TemplateCenterManage { } // 最近使用排序 Collections.sort(contents); + Long countDataV = contents.stream().filter(item -> "PANEL".equals(item.getTemplateType())).count(); + Long countDashboard = contents.stream().filter(item -> "SCREEN".equals(item.getTemplateType())).count(); + List templateDataV = templateManages.stream().filter(item -> "PANEL".equals(item.getTemplateType())).collect(Collectors.toList()); + List templateDashboard = templateManages.stream().filter(item -> "SCREEN".equals(item.getTemplateType())).collect(Collectors.toList()); + if(countDataV<10){ + Long addItemCount = 10 -countDataV; + Long addIndex = templateDataV.size() queryWrapper = new QueryWrapper<>(); queryWrapper.eq("delete_flag", false); - queryWrapper.ne("pid",-1); + queryWrapper.ne("pid", -1); queryWrapper.eq(ObjectUtils.isNotEmpty(request.getLeaf()), "node_type", ObjectUtils.isNotEmpty(request.getLeaf()) && request.getLeaf() ? "leaf" : "folder"); queryWrapper.eq("type", request.getBusiFlag()); queryWrapper.orderByDesc("create_time"); List pos = extMapper.queryNodes(queryWrapper); - if (CollectionUtil.isNotEmpty(pos)) { + if (CollectionUtils.isNotEmpty(pos)) { nodes.addAll(pos.stream().map(this::convert).toList()); } return TreeUtils.mergeTree(nodes, BusiNodeVO.class, false); @@ -81,7 +81,7 @@ public class CoreVisualizationManage { if (isTopNode(tempPid)) continue; delIds.add(tempPid); List childrenIdList = extMapper.queryChildrenId(tempPid); - if (CollectionUtil.isNotEmpty(childrenIdList)) { + if (CollectionUtils.isNotEmpty(childrenIdList)) { childrenIdList.forEach(kid -> { if (!delIds.contains(kid)) { stack.add(kid); @@ -112,7 +112,7 @@ public class CoreVisualizationManage { return preInnerSave(visualizationInfo); } - public Long preInnerSave(DataVisualizationInfo visualizationInfo){ + public Long preInnerSave(DataVisualizationInfo visualizationInfo) { if (visualizationInfo.getId() == null) { Long id = IDUtils.snowID(); visualizationInfo.setId(id); @@ -169,7 +169,7 @@ public class CoreVisualizationManage { } List formatResult(List pos) { - if (CollectionUtil.isEmpty(pos)) { + if (CollectionUtils.isEmpty(pos)) { return new ArrayList<>(); } return pos.stream().map(po -> diff --git a/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationStoreManage.java b/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationStoreManage.java index 55d55cda18..730939dc3a 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationStoreManage.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationStoreManage.java @@ -1,6 +1,5 @@ package io.dataease.visualization.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -18,6 +17,7 @@ import io.dataease.visualization.dao.auto.mapper.CoreStoreMapper; import io.dataease.visualization.dao.ext.mapper.CoreStoreExtMapper; import io.dataease.visualization.dao.ext.po.StorePO; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -84,7 +84,7 @@ public class VisualizationStoreManage { } public List formatResult(List pos) { - if (CollectionUtil.isEmpty(pos)) return new ArrayList<>(); + if (CollectionUtils.isEmpty(pos)) return new ArrayList<>(); return pos.stream().map(po -> new VisualizationStoreVO( po.getStoreId(), po.getResourceId(), po.getName(), diff --git a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java index 96175826df..4d251d107e 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java @@ -102,7 +102,7 @@ public class DataVisualizationServer implements DataVisualizationApi { } VisualizationWatermark watermark = watermarkMapper.selectById("system_default"); VisualizationWatermarkVO watermarkVO = new VisualizationWatermarkVO(); - BeanUtils.copyBean(watermarkVO,watermark); + BeanUtils.copyBean(watermarkVO, watermark); result.setWatermarkInfo(watermarkVO); return result; } else { @@ -117,6 +117,11 @@ public class DataVisualizationServer implements DataVisualizationApi { DataVisualizationInfo visualizationInfo = new DataVisualizationInfo(); BeanUtils.copyBean(visualizationInfo, request); visualizationInfo.setNodeType(request.getNodeType() == null ? DataVisualizationConstants.NODE_TYPE.LEAF : request.getNodeType()); + if (request.getSelfWatermarkStatus() != null && request.getSelfWatermarkStatus()) { + visualizationInfo.setSelfWatermarkStatus(1); + } else { + visualizationInfo.setSelfWatermarkStatus(0); + } Long newDvId = coreVisualizationManage.innerSave(visualizationInfo); //保存视图信 chartDataManage.saveChartViewFromVisualization(request.getComponentData(), newDvId, request.getCanvasViewInfo()); @@ -132,12 +137,17 @@ public class DataVisualizationServer implements DataVisualizationApi { } DataVisualizationInfo visualizationInfo = new DataVisualizationInfo(); BeanUtils.copyBean(visualizationInfo, request); - if(DataVisualizationConstants.RESOURCE_OPT_TYPE.COPY.equals(request.getOptType())){ + if (request.getSelfWatermarkStatus() != null && request.getSelfWatermarkStatus()) { + visualizationInfo.setSelfWatermarkStatus(1); + } else { + visualizationInfo.setSelfWatermarkStatus(0); + } + if (DataVisualizationConstants.RESOURCE_OPT_TYPE.COPY.equals(request.getOptType())) { // 复制更新 新建权限插入 visualizationInfoMapper.deleteById(dvId); visualizationInfo.setNodeType(DataVisualizationConstants.NODE_TYPE.LEAF); coreVisualizationManage.innerSave(visualizationInfo); - }else{ + } else { // 检查当前节点的pid是否一致如果不一致 需要调用move 接口(预存 可能会出现pid =-1的情况) if (request.getPid() != -1) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -231,7 +241,7 @@ public class DataVisualizationServer implements DataVisualizationApi { extDataVisualizationMapper.copyLinkJumpInfo(copyId); extDataVisualizationMapper.copyLinkJumpTargetInfo(copyId); DataVisualizationInfo visualizationInfoTarget = new DataVisualizationInfo(); - BeanUtils.copyBean(visualizationInfoTarget,newDv); + BeanUtils.copyBean(visualizationInfoTarget, newDv); visualizationInfoTarget.setPid(-1L); coreVisualizationManage.preInnerSave(visualizationInfoTarget); return String.valueOf(newDvId); @@ -261,7 +271,11 @@ public class DataVisualizationServer implements DataVisualizationApi { name = visualizationTemplate.getName(); dvType = visualizationTemplate.getDvType(); // 模板市场记录 - coreOptRecentManage.saveOpt(request.getTemplateId(), OptConstants.OPT_RESOURCE_TYPE.TEMPLATE,OptConstants.OPT_TYPE.NEW); + coreOptRecentManage.saveOpt(request.getTemplateId(), OptConstants.OPT_RESOURCE_TYPE.TEMPLATE, OptConstants.OPT_TYPE.NEW); + VisualizationTemplate visualizationTemplateUpdate = new VisualizationTemplate(); + visualizationTemplateUpdate.setId(visualizationTemplate.getId()); + visualizationTemplateUpdate.setUseCount(visualizationTemplate.getUseCount() == null ? 0 : visualizationTemplate.getUseCount() + 1); + templateMapper.updateById(visualizationTemplateUpdate); } else if (DataVisualizationConstants.NEW_PANEL_FROM.NEW_OUTER_TEMPLATE.equals(newFrom)) { templateStyle = request.getCanvasStyleData(); templateData = request.getComponentData(); @@ -281,7 +295,7 @@ public class DataVisualizationServer implements DataVisualizationApi { name = templateFileInfo.getName(); dvType = templateFileInfo.getDvType(); // 模板市场记录 - coreOptRecentManage.saveOpt(request.getResourceName(), OptConstants.OPT_RESOURCE_TYPE.TEMPLATE,OptConstants.OPT_TYPE.NEW); + coreOptRecentManage.saveOpt(request.getResourceName(), OptConstants.OPT_RESOURCE_TYPE.TEMPLATE, OptConstants.OPT_TYPE.NEW); } // 解析动态数据 Map dynamicDataMap = JsonUtil.parseObject(dynamicData, Map.class); @@ -292,7 +306,7 @@ public class DataVisualizationServer implements DataVisualizationApi { String originViewId = entry.getKey(); String originViewData = JsonUtil.toJSONString(entry.getValue()).toString(); ChartViewDTO chartView = JsonUtil.parseObject(originViewData, ChartViewDTO.class); - if(chartView == null){ + if (chartView == null) { continue; } Long newViewId = IDUtils.snowID(); diff --git a/core/core-backend/src/main/java/io/dataease/visualization/server/StaticResourceServer.java b/core/core-backend/src/main/java/io/dataease/visualization/server/StaticResourceServer.java index 6b07a3ea63..840efa6350 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/server/StaticResourceServer.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/server/StaticResourceServer.java @@ -1,8 +1,6 @@ package io.dataease.visualization.server; -import cn.hutool.core.codec.Base64Decoder; -import cn.hutool.core.collection.CollectionUtil; import io.dataease.api.visualization.StaticResourceApi; import io.dataease.api.visualization.request.StaticResourceRequest; import io.dataease.exception.DEException; @@ -10,8 +8,10 @@ import io.dataease.utils.FileUtils; import io.dataease.utils.JsonUtil; import io.dataease.utils.LogUtil; import io.dataease.utils.StaticResourceUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.util.Assert; +import org.springframework.util.Base64Utils; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -89,17 +89,18 @@ public class StaticResourceServer implements StaticResourceApi { } else { if (StringUtils.isNotEmpty(content)) { Files.createFile(uploadPath); - FileCopyUtils.copy(Base64Decoder.decode(content), Files.newOutputStream(uploadPath)); + FileCopyUtils.copy(Base64Utils.decodeFromString(content), Files.newOutputStream(uploadPath)); } } } catch (Exception e) { LogUtil.error("template static resource save error" + e.getMessage()); } } + @Override public Map findResourceAsBase64(StaticResourceRequest resourceRequest) { Map result = new HashMap<>(); - if (CollectionUtil.isNotEmpty(resourceRequest.getResourcePathList())) { + if (CollectionUtils.isNotEmpty(resourceRequest.getResourcePathList())) { for (String path : resourceRequest.getResourcePathList()) { String value = StaticResourceUtils.getImgFileToBase64(path.substring(path.lastIndexOf("/") + 1, path.length())); result.put(path, value); diff --git a/core/core-backend/src/main/resources/application.yml b/core/core-backend/src/main/resources/application.yml index f838d5d272..87a0091da2 100644 --- a/core/core-backend/src/main/resources/application.yml +++ b/core/core-backend/src/main/resources/application.yml @@ -46,6 +46,7 @@ quartz: dataease: version: '@project.version@' + origin-list: http://192.168.2.70:9080 apisix-api: domain: http://192.168.0.121:9180 key: edd1c9f034335f136f87ad84b625c8f1 diff --git a/core/core-backend/src/main/resources/db/desktop/V2.1__ddl.sql b/core/core-backend/src/main/resources/db/desktop/V2.1__ddl.sql index 5fe6c42145..43b2e5bdf7 100644 --- a/core/core-backend/src/main/resources/db/desktop/V2.1__ddl.sql +++ b/core/core-backend/src/main/resources/db/desktop/V2.1__ddl.sql @@ -1,19 +1,4 @@ DROP TABLE IF EXISTS `visualization_template`; -CREATE TABLE `visualization_template` ( - `id` varchar(50) NOT NULL COMMENT '主键', - `name` varchar(255) DEFAULT NULL COMMENT '名称', - `pid` varchar(255) DEFAULT NULL COMMENT '父级id', - `level` int DEFAULT NULL COMMENT '层级', - `dv_type` varchar(255) DEFAULT NULL COMMENT '模板种类 dataV or dashboard 目录或者文件夹', - `node_type` varchar(255) DEFAULT NULL COMMENT '节点类型 folder or panel 目录或者文件夹', - `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', - `create_time` bigint DEFAULT NULL COMMENT '创建时间', - `snapshot` longtext COMMENT '缩略图', - `template_type` varchar(255) DEFAULT NULL COMMENT '模板类型 system 系统内置 self 用户自建 ', - `template_style` longtext COMMENT 'template 样式', - `template_data` longtext COMMENT 'template 数据', - `dynamic_data` longtext COMMENT '预存数据', - PRIMARY KEY (`id`) CREATE TABLE `visualization_template` ( `id` varchar(50) NOT NULL COMMENT '主键', @@ -85,7 +70,8 @@ VALUES (30, 0, 1, 'toolbox', null, 7, 'icon_template', '/toolbox', 1, 1, 0); INSERT INTO `core_menu` VALUES (31, 30, 2, 'template-setting', 'toolbox/template-setting', 1, 'icon_template', '/template-setting', 0, 1, 1); -ALTER TABLE core_opt_recent ADD `resource_name` varchar(255) NULL COMMENT '资源名称'; +ALTER TABLE core_opt_recent + ADD `resource_name` varchar(255) NULL COMMENT '资源名称'; DROP TABLE IF EXISTS `core_area_custom`; CREATE TABLE `core_area_custom` diff --git a/core/core-backend/src/main/resources/db/desktop/V2.2__update_table_desc_ddl.sql b/core/core-backend/src/main/resources/db/desktop/V2.2__update_table_desc_ddl.sql index 44c70caad0..86ec02bbac 100644 --- a/core/core-backend/src/main/resources/db/desktop/V2.2__update_table_desc_ddl.sql +++ b/core/core-backend/src/main/resources/db/desktop/V2.2__update_table_desc_ddl.sql @@ -1,177 +1,211 @@ -ALTER TABLE `QRTZ_BLOB_TRIGGERS` COMMENT = '自定义触发器存储(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_CALENDARS` COMMENT = 'Quartz日历(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_CRON_TRIGGERS` COMMENT = 'CronTrigger存储(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_FIRED_TRIGGERS` COMMENT = '存储已经触发的trigger相关信息(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_JOB_DETAILS` COMMENT = '存储jobDetails信息(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_LOCKS` COMMENT = 'Quartz锁表,为多个节点调度提供分布式锁(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_PAUSED_TRIGGER_GRPS` COMMENT = '存放暂停掉的触发器(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_SCHEDULER_STATE` COMMENT = '存储所有节点的scheduler(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_SIMPLE_TRIGGERS` COMMENT = 'SimpleTrigger存储(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_SIMPROP_TRIGGERS` COMMENT = '存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_TRIGGERS` COMMENT = '存储定义的trigger(开源作业调度框架Quartz)'; -ALTER TABLE `area` COMMENT = '地图区域表'; -ALTER TABLE `core_area_custom` COMMENT = '自定义地图区域信息表'; -ALTER TABLE `core_chart_view` COMMENT = '组件视图表'; -ALTER TABLE `core_dataset_group` COMMENT = '数据集分组表'; -ALTER TABLE `core_dataset_table` COMMENT = 'table数据集'; -ALTER TABLE `core_dataset_table_field` COMMENT = 'table数据集表字段'; -ALTER TABLE `core_dataset_table_sql_log` COMMENT = 'table数据集查询sql日志'; -ALTER TABLE `core_datasource` COMMENT = '数据源表'; -ALTER TABLE `core_datasource_task` COMMENT = '数据源定时同步任务'; -ALTER TABLE `core_datasource_task_log` COMMENT = '数据源定时同步任务执行日志'; -ALTER TABLE `core_de_engine` COMMENT = '数据引擎'; -ALTER TABLE `core_driver` COMMENT = '驱动'; -ALTER TABLE `core_driver_jar` COMMENT = '驱动详情'; -ALTER TABLE `core_menu` COMMENT = '路由菜单'; -ALTER TABLE `core_opt_recent` COMMENT = '可视化资源表'; -ALTER TABLE `core_rsa` COMMENT = 'rsa 密钥表'; -ALTER TABLE `core_store` COMMENT = '用户收藏表'; -ALTER TABLE `core_sys_setting` COMMENT = '系统设置表'; -ALTER TABLE `data_visualization_info` COMMENT = '可视化大屏信息表'; -ALTER TABLE `de_standalone_version` COMMENT = '数据库版本变更记录表'; -ALTER TABLE `license` COMMENT = '企业版许可证信息表'; -ALTER TABLE `per_api_key` COMMENT = 'API Key 密钥表'; -ALTER TABLE `per_auth_busi_role` COMMENT = '角色资源权限配置'; -ALTER TABLE `per_auth_busi_user` COMMENT = '用户资源权限配置'; -ALTER TABLE `per_auth_menu` COMMENT = '菜单资源权限配置'; -ALTER TABLE `per_busi_resource` COMMENT = '企业资源'; -ALTER TABLE `per_dataset_column_permissions` COMMENT = '数据集列权限'; -ALTER TABLE `per_dataset_row_permissions_tree` COMMENT = '数据集行权限'; -ALTER TABLE `per_embedded_instance` COMMENT = '嵌入式应用'; -ALTER TABLE `per_menu_resource` COMMENT = '菜单资源'; -ALTER TABLE `per_org` COMMENT = '组织机构'; -ALTER TABLE `per_role` COMMENT = '角色'; -ALTER TABLE `per_sys_setting` COMMENT = '系统设置表'; -ALTER TABLE `per_user` COMMENT = '用户表'; -ALTER TABLE `per_user_role` COMMENT = '用户角色表'; -ALTER TABLE `visualization_background` COMMENT = '边框背景表'; -ALTER TABLE `visualization_background_image` COMMENT = '背景图'; -ALTER TABLE `visualization_link_jump` COMMENT = '跳转记录表'; -ALTER TABLE `visualization_link_jump_info` COMMENT = '跳转配置表'; -ALTER TABLE `visualization_link_jump_target_view_info` COMMENT = '跳转目标仪表板视图字段配置表'; -ALTER TABLE `visualization_linkage` COMMENT = '联动记录表'; -ALTER TABLE `visualization_linkage_field` COMMENT = '联动字段'; -ALTER TABLE `visualization_subject` COMMENT = '主题表'; -ALTER TABLE `visualization_template_extend_data` COMMENT = '模板视图明细信息表'; -ALTER TABLE `xpack_setting_authentication` COMMENT = '认证设置'; -ALTER TABLE `xpack_share` COMMENT = '公共链接'; +COMMENT ON TABLE `QRTZ_BLOB_TRIGGERS` + IS '自定义触发器存储(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_CALENDARS` + IS 'Quartz日历(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_CRON_TRIGGERS` + IS 'CronTrigger存储(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_FIRED_TRIGGERS` + IS '存储已经触发的trigger相关信息(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_JOB_DETAILS` + IS '存储jobDetails信息(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_LOCKS` + IS 'Quartz锁表,为多个节点调度提供分布式锁(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_PAUSED_TRIGGER_GRPS` + IS '存放暂停掉的触发器(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_SCHEDULER_STATE` + IS '存储所有节点的scheduler(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_SIMPLE_TRIGGERS` + IS 'SimpleTrigger存储(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_SIMPROP_TRIGGERS` + IS '存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器(开源作业调度框架Quartz)'; +COMMENT ON TABLE `QRTZ_TRIGGERS` + IS '存储定义的trigger(开源作业调度框架Quartz)'; +COMMENT ON TABLE `area` + IS '地图区域表'; +COMMENT ON TABLE `core_area_custom` + IS '自定义地图区域信息表'; +COMMENT ON TABLE `core_chart_view` + IS '组件视图表'; +COMMENT ON TABLE `core_dataset_group` + IS '数据集分组表'; +COMMENT ON TABLE `core_dataset_table` + IS 'table数据集'; +COMMENT ON TABLE `core_dataset_table_field` + IS 'table数据集表字段'; +COMMENT ON TABLE `core_dataset_table_sql_log` + IS 'table数据集查询sql日志'; +COMMENT ON TABLE `core_datasource` + IS '数据源表'; +COMMENT ON TABLE `core_datasource_task` + IS '数据源定时同步任务'; +COMMENT ON TABLE `core_datasource_task_log` + IS '数据源定时同步任务执行日志'; +COMMENT ON TABLE `core_de_engine` + IS '数据引擎'; +COMMENT ON TABLE `core_driver` + IS '驱动'; +COMMENT ON TABLE `core_driver_jar` + IS '驱动详情'; +COMMENT ON TABLE `core_menu` + IS '路由菜单'; +COMMENT ON TABLE `core_opt_recent` + IS '可视化资源表'; +COMMENT ON TABLE `core_rsa` + IS 'rsa 密钥表'; +COMMENT ON TABLE `core_store` + IS '用户收藏表'; +COMMENT ON TABLE `core_sys_setting` + IS '系统设置表'; +COMMENT ON TABLE `data_visualization_info` + IS '可视化大屏信息表'; + +COMMENT ON TABLE `visualization_background` + IS '边框背景表'; +COMMENT ON TABLE `visualization_background_image` + IS '背景图'; +COMMENT ON TABLE `visualization_link_jump` + IS '跳转记录表'; +COMMENT ON TABLE `visualization_link_jump_info` + IS '跳转配置表'; +COMMENT ON TABLE `visualization_link_jump_target_view_info` + IS '跳转目标仪表板视图字段配置表'; +COMMENT ON TABLE `visualization_linkage` + IS '联动记录表'; +COMMENT ON TABLE `visualization_linkage_field` + IS '联动字段'; +COMMENT ON TABLE `visualization_subject` + IS '主题表'; +COMMENT ON TABLE `visualization_template_extend_data` + IS '模板视图明细信息表'; ALTER TABLE `core_dataset_group` - MODIFY COLUMN `qrtz_instance` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Quartz 实例 ID' AFTER `create_time`; + MODIFY COLUMN `qrtz_instance` varchar(1024) NULL DEFAULT NULL COMMENT 'Quartz 实例 ID'; ALTER TABLE `core_dataset_table_field` - MODIFY COLUMN `size` int(0) NULL DEFAULT NULL COMMENT '字段长度(允许为空,默认0)' AFTER `type`, - MODIFY COLUMN `date_format` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '时间字段类型' AFTER `accuracy`; + MODIFY COLUMN `size` int(0) NULL DEFAULT NULL COMMENT '字段长度(允许为空,默认0)'; +ALTER TABLE `core_dataset_table_field` + MODIFY COLUMN `date_format` varchar(255) NULL DEFAULT NULL COMMENT '时间字段类型'; ALTER TABLE `core_datasource_task` - MODIFY COLUMN `extra_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '额外数据' AFTER `last_exec_status`; + MODIFY COLUMN `extra_data` longtext NULL COMMENT '额外数据'; ALTER TABLE `core_datasource_task_log` - MODIFY COLUMN `trigger_type` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新频率类型' AFTER `create_time`; + MODIFY COLUMN `trigger_type` varchar(45) NULL DEFAULT NULL COMMENT '更新频率类型'; ALTER TABLE `core_driver_jar` - MODIFY COLUMN `trans_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '替换后的 jar 包名称' AFTER `driver_class`, - MODIFY COLUMN `is_trans_name` tinyint(1) NULL DEFAULT NULL COMMENT '是否将上传 jar 包替换了名称(1-是,0-否)' AFTER `trans_name`; + MODIFY COLUMN `trans_name` varchar(255) NULL DEFAULT NULL COMMENT '替换后的 jar 包名称'; +ALTER TABLE `core_driver_jar` + MODIFY COLUMN `is_trans_name` tinyint(1) NULL DEFAULT NULL COMMENT '是否将上传 jar 包替换了名称(1-是,0-否)'; ALTER TABLE `core_rsa` - MODIFY COLUMN `aes_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'AES 加密算法的 key' AFTER `create_time`; + MODIFY COLUMN `aes_key` text NOT NULL COMMENT 'AES 加密算法的 key'; ALTER TABLE `data_visualization_info` - MODIFY COLUMN `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键' FIRST; - -ALTER TABLE `de_standalone_version` - MODIFY COLUMN `installed_rank` int(0) NOT NULL COMMENT '执行顺序(主键)' FIRST, - MODIFY COLUMN `version` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '版本' AFTER `installed_rank`, - MODIFY COLUMN `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '描述' AFTER `version`, - MODIFY COLUMN `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '类型' AFTER `description`, - MODIFY COLUMN `script` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '脚本名称' AFTER `type`, - MODIFY COLUMN `checksum` int(0) NULL DEFAULT NULL COMMENT '脚本内容一致性校验码' AFTER `script`, - MODIFY COLUMN `installed_by` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '执行用户' AFTER `checksum`, - MODIFY COLUMN `installed_on` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '执行时间' AFTER `installed_by`, - MODIFY COLUMN `execution_time` int(0) NOT NULL COMMENT '执行时长' AFTER `installed_on`, - MODIFY COLUMN `success` tinyint(1) NOT NULL COMMENT '状态(1-成功,0-失败)' AFTER `execution_time`; - -ALTER TABLE `license` - MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `update_time` bigint(0) NULL DEFAULT NULL COMMENT '更新时间' AFTER `id`, - MODIFY COLUMN `license` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'license' AFTER `update_time`, - MODIFY COLUMN `f2c_license` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'F2C License' AFTER `license`; - -ALTER TABLE `per_dataset_column_permissions` - MODIFY COLUMN `update_time` bigint(0) NULL DEFAULT NULL COMMENT '更新时间' AFTER `white_list_user`; - -ALTER TABLE `per_dataset_row_permissions_tree` - MODIFY COLUMN `update_time` bigint(0) NULL DEFAULT NULL COMMENT '更新时间' AFTER `white_list_dept`; - -ALTER TABLE `per_user` - MODIFY COLUMN `pwd` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码' AFTER `account`; + MODIFY COLUMN `id` varchar(50) NOT NULL COMMENT '主键'; ALTER TABLE `visualization_background` - MODIFY COLUMN `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称' AFTER `id`, - MODIFY COLUMN `classification` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名' AFTER `name`, - MODIFY COLUMN `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '内容' AFTER `classification`, - MODIFY COLUMN `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注' AFTER `content`, - MODIFY COLUMN `sort` int(0) NULL DEFAULT NULL COMMENT '排序' AFTER `remark`, - MODIFY COLUMN `upload_time` bigint(0) NULL DEFAULT NULL COMMENT '上传时间' AFTER `sort`, - MODIFY COLUMN `base_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所在目录地址' AFTER `upload_time`, - MODIFY COLUMN `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图片url' AFTER `base_url`; + MODIFY COLUMN `id` varchar(64) NOT NULL COMMENT '主键'; +ALTER TABLE `visualization_background` + MODIFY COLUMN `name` varchar(255) NULL DEFAULT NULL COMMENT '名称'; +ALTER TABLE `visualization_background` + MODIFY COLUMN `classification` varchar(255) NOT NULL COMMENT '分类名'; +ALTER TABLE `visualization_background` + MODIFY COLUMN `content` longtext NULL COMMENT '内容'; +ALTER TABLE `visualization_background` + MODIFY COLUMN `remark` varchar(255) NULL DEFAULT NULL COMMENT '备注'; +ALTER TABLE `visualization_background` + MODIFY COLUMN `sort` int(0) NULL DEFAULT NULL COMMENT '排序'; +ALTER TABLE `visualization_background` + MODIFY COLUMN `upload_time` bigint(0) NULL DEFAULT NULL COMMENT '上传时间'; +ALTER TABLE `visualization_background` + MODIFY COLUMN `base_url` varchar(255) NULL DEFAULT NULL COMMENT '所在目录地址'; +ALTER TABLE `visualization_background` + MODIFY COLUMN `url` varchar(255) NULL DEFAULT NULL COMMENT '图片url'; ALTER TABLE `visualization_background_image` - MODIFY COLUMN `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称' AFTER `id`, - MODIFY COLUMN `classification` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名' AFTER `name`, - MODIFY COLUMN `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '内容' AFTER `classification`, - MODIFY COLUMN `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注' AFTER `content`, - MODIFY COLUMN `sort` int(0) NULL DEFAULT NULL COMMENT '排序' AFTER `remark`, - MODIFY COLUMN `upload_time` bigint(0) NULL DEFAULT NULL COMMENT '上传时间' AFTER `sort`, - MODIFY COLUMN `base_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所在目录地址' AFTER `upload_time`, - MODIFY COLUMN `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图片url' AFTER `base_url`; + MODIFY COLUMN `id` varchar(64) NOT NULL COMMENT '主键'; +ALTER TABLE `visualization_background_image` + MODIFY COLUMN `name` varchar(255) NULL DEFAULT NULL COMMENT '名称'; +ALTER TABLE `visualization_background_image` + MODIFY COLUMN `classification` varchar(255) NOT NULL COMMENT '分类名'; +ALTER TABLE `visualization_background_image` + MODIFY COLUMN `content` longtext NULL COMMENT '内容'; +ALTER TABLE `visualization_background_image` + MODIFY COLUMN `remark` varchar(255) NULL DEFAULT NULL COMMENT '备注'; +ALTER TABLE `visualization_background_image` + MODIFY COLUMN `sort` int(0) NULL DEFAULT NULL COMMENT '排序'; +ALTER TABLE `visualization_background_image` + MODIFY COLUMN `upload_time` bigint(0) NULL DEFAULT NULL COMMENT '上传时间'; +ALTER TABLE `visualization_background_image` + MODIFY COLUMN `base_url` varchar(255) NULL DEFAULT NULL COMMENT '所在目录地址'; +ALTER TABLE `visualization_background_image` + MODIFY COLUMN `url` varchar(255) NULL DEFAULT NULL COMMENT '图片url'; ALTER TABLE `visualization_link_jump` - MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源' AFTER `checked`, - MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID' AFTER `copy_from`; + MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键'; +ALTER TABLE `visualization_link_jump` + MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源'; +ALTER TABLE `visualization_link_jump` + MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID'; ALTER TABLE `visualization_link_jump_info` - MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源' AFTER `attach_params`, - MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID' AFTER `copy_from`; + MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键'; +ALTER TABLE `visualization_link_jump_info` + MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源'; +ALTER TABLE `visualization_link_jump_info` + MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID'; ALTER TABLE `visualization_link_jump_target_view_info` - MODIFY COLUMN `target_id` bigint(0) NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `link_jump_info_id` bigint(0) NULL DEFAULT NULL COMMENT 'visualization_link_jump_info 表的 ID' AFTER `target_id`, - MODIFY COLUMN `target_view_id` bigint(0) NULL DEFAULT NULL COMMENT '目标视图ID' AFTER `source_field_active_id`, - MODIFY COLUMN `target_field_id` bigint(0) NULL DEFAULT NULL COMMENT '目标字段ID' AFTER `target_view_id`, - MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源' AFTER `target_field_id`, - MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID' AFTER `copy_from`; + MODIFY COLUMN `target_id` bigint(0) NOT NULL COMMENT '主键'; +ALTER TABLE `visualization_link_jump_target_view_info` + MODIFY COLUMN `link_jump_info_id` bigint(0) NULL DEFAULT NULL COMMENT 'visualization_link_jump_info 表的 ID'; +ALTER TABLE `visualization_link_jump_target_view_info` + MODIFY COLUMN `target_view_id` bigint(0) NULL DEFAULT NULL COMMENT '目标视图ID'; +ALTER TABLE `visualization_link_jump_target_view_info` + MODIFY COLUMN `target_field_id` bigint(0) NULL DEFAULT NULL COMMENT '目标字段ID'; +ALTER TABLE `visualization_link_jump_target_view_info` + MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源'; +ALTER TABLE `visualization_link_jump_target_view_info` + MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID'; ALTER TABLE `visualization_linkage` - MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `dv_id` bigint(0) NULL DEFAULT NULL COMMENT '联动大屏/仪表板ID' AFTER `id`, - MODIFY COLUMN `ext1` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '扩展字段1' AFTER `linkage_active`, - MODIFY COLUMN `ext2` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '扩展字段2' AFTER `ext1`, - MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源' AFTER `ext2`, - MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID' AFTER `copy_from`; + MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键'; +ALTER TABLE `visualization_linkage` + MODIFY COLUMN `dv_id` bigint(0) NULL DEFAULT NULL COMMENT '联动大屏/仪表板ID'; +ALTER TABLE `visualization_linkage` + MODIFY COLUMN `ext1` varchar(2000) NULL DEFAULT NULL COMMENT '扩展字段1'; +ALTER TABLE `visualization_linkage` + MODIFY COLUMN `ext2` varchar(2000) NULL DEFAULT NULL COMMENT '扩展字段2'; +ALTER TABLE `visualization_linkage` + MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源'; +ALTER TABLE `visualization_linkage` + MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID'; ALTER TABLE `visualization_linkage_field` - MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源' AFTER `update_time`, - MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID' AFTER `copy_from`; + MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键'; +ALTER TABLE `visualization_linkage_field` + MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源'; +ALTER TABLE `visualization_linkage_field` + MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID'; ALTER TABLE `visualization_subject` - MODIFY COLUMN `create_num` int(0) NOT NULL DEFAULT 0 COMMENT '创建序号' AFTER `cover_url`; + MODIFY COLUMN `create_num` int(0) NOT NULL DEFAULT 0 COMMENT '创建序号'; ALTER TABLE `visualization_template_category` - MODIFY COLUMN `template_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模版类型 system 系统内置 self 用户自建' AFTER `snapshot`; + MODIFY COLUMN `template_type` varchar(255) NULL DEFAULT NULL COMMENT '模版类型 system 系统内置 self 用户自建'; ALTER TABLE `visualization_template_extend_data` - MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `dv_id` bigint(0) NULL DEFAULT NULL COMMENT '模板ID' AFTER `id`, - MODIFY COLUMN `view_id` bigint(0) NULL DEFAULT NULL COMMENT '视图ID' AFTER `dv_id`, - MODIFY COLUMN `view_details` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '视图详情' AFTER `view_id`, - MODIFY COLUMN `copy_from` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '复制来源' AFTER `view_details`, - MODIFY COLUMN `copy_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '复制来源ID' AFTER `copy_from`; + MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键'; +ALTER TABLE `visualization_template_extend_data` + MODIFY COLUMN `dv_id` bigint(0) NULL DEFAULT NULL COMMENT '模板ID'; +ALTER TABLE `visualization_template_extend_data` + MODIFY COLUMN `view_id` bigint(0) NULL DEFAULT NULL COMMENT '视图ID'; +ALTER TABLE `visualization_template_extend_data` + MODIFY COLUMN `view_details` longtext NULL COMMENT '视图详情'; +ALTER TABLE `visualization_template_extend_data` + MODIFY COLUMN `copy_from` varchar(255) NULL DEFAULT NULL COMMENT '复制来源'; +ALTER TABLE `visualization_template_extend_data` + MODIFY COLUMN `copy_id` varchar(255) NULL DEFAULT NULL COMMENT '复制来源ID'; ALTER TABLE `core_opt_recent` - MODIFY COLUMN `resource_type` int(0) NOT NULL COMMENT '资源类型 1-可视化资源 2-仪表板 3-数据大屏 4-数据集 5-数据源 6-模板' AFTER `uid`; + MODIFY COLUMN `resource_type` int(0) NOT NULL COMMENT '资源类型 1-可视化资源 2-仪表板 3-数据大屏 4-数据集 5-数据源 6-模板'; diff --git a/core/core-backend/src/main/resources/db/desktop/V2.3__ddl.sql b/core/core-backend/src/main/resources/db/desktop/V2.3__ddl.sql index f8a9c19a0e..2ade41ecfc 100644 --- a/core/core-backend/src/main/resources/db/desktop/V2.3__ddl.sql +++ b/core/core-backend/src/main/resources/db/desktop/V2.3__ddl.sql @@ -1,12 +1,25 @@ - DROP TABLE IF EXISTS `visualization_watermark`; -CREATE TABLE `visualization_watermark` ( - `id` varchar(50) NOT NULL COMMENT '主键', - `version` varchar(255) DEFAULT NULL COMMENT '版本号', - `setting_content` longtext COMMENT '设置内容', - `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', - `create_time` bigint(13) DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`) -) COMMENT='仪表板水印设置表'; +CREATE TABLE `visualization_watermark` +( + `id` varchar(50) NOT NULL COMMENT '主键', + `version` varchar(255) DEFAULT NULL COMMENT '版本号', + `setting_content` longtext COMMENT '设置内容', + `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', + `create_time` bigint(13) DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) +) COMMENT ='仪表板水印设置表'; + +INSERT INTO `visualization_watermark` (`id`, `version`, `setting_content`, `create_by`, `create_time`) +VALUES ('system_default', '1.0', + '{\"enable\":false,\"enablePanelCustom\":true,\"type\":\"custom\",\"content\":\"水印\",\"watermark_color\":\"#DD1010\",\"watermark_x_space\":12,\"watermark_y_space\":36,\"watermark_fontsize\":15}', + 'admin', NULL); + + +INSERT INTO `core_sys_setting` (`id`, `pkey`, `pval`, `type`, `sort`) +VALUES (9, 'basic.frontTimeOut', '60', 'text', 1); + +ALTER TABLE `visualization_template` + ADD COLUMN `use_count` int NULL DEFAULT 0 COMMENT '使用次数'; + +update visualization_template set use_count = 0; -INSERT INTO `visualization_watermark` (`id`, `version`, `setting_content`, `create_by`, `create_time`) VALUES ('system_default', '1.0', '{\"enable\":false,\"enablePanelCustom\":true,\"type\":\"custom\",\"content\":\"水印\",\"watermark_color\":\"#DD1010\",\"watermark_x_space\":12,\"watermark_y_space\":36,\"watermark_fontsize\":15}', 'admin', NULL); diff --git a/core/core-backend/src/main/resources/db/migration/V2.2__update_table_desc_ddl.sql b/core/core-backend/src/main/resources/db/migration/V2.2__update_table_desc_ddl.sql index 44c70caad0..36ec14d204 100644 --- a/core/core-backend/src/main/resources/db/migration/V2.2__update_table_desc_ddl.sql +++ b/core/core-backend/src/main/resources/db/migration/V2.2__update_table_desc_ddl.sql @@ -1,132 +1,142 @@ -ALTER TABLE `QRTZ_BLOB_TRIGGERS` COMMENT = '自定义触发器存储(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_CALENDARS` COMMENT = 'Quartz日历(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_CRON_TRIGGERS` COMMENT = 'CronTrigger存储(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_FIRED_TRIGGERS` COMMENT = '存储已经触发的trigger相关信息(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_JOB_DETAILS` COMMENT = '存储jobDetails信息(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_LOCKS` COMMENT = 'Quartz锁表,为多个节点调度提供分布式锁(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_PAUSED_TRIGGER_GRPS` COMMENT = '存放暂停掉的触发器(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_SCHEDULER_STATE` COMMENT = '存储所有节点的scheduler(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_SIMPLE_TRIGGERS` COMMENT = 'SimpleTrigger存储(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_SIMPROP_TRIGGERS` COMMENT = '存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器(开源作业调度框架Quartz)'; -ALTER TABLE `QRTZ_TRIGGERS` COMMENT = '存储定义的trigger(开源作业调度框架Quartz)'; -ALTER TABLE `area` COMMENT = '地图区域表'; -ALTER TABLE `core_area_custom` COMMENT = '自定义地图区域信息表'; -ALTER TABLE `core_chart_view` COMMENT = '组件视图表'; -ALTER TABLE `core_dataset_group` COMMENT = '数据集分组表'; -ALTER TABLE `core_dataset_table` COMMENT = 'table数据集'; -ALTER TABLE `core_dataset_table_field` COMMENT = 'table数据集表字段'; -ALTER TABLE `core_dataset_table_sql_log` COMMENT = 'table数据集查询sql日志'; -ALTER TABLE `core_datasource` COMMENT = '数据源表'; -ALTER TABLE `core_datasource_task` COMMENT = '数据源定时同步任务'; -ALTER TABLE `core_datasource_task_log` COMMENT = '数据源定时同步任务执行日志'; -ALTER TABLE `core_de_engine` COMMENT = '数据引擎'; -ALTER TABLE `core_driver` COMMENT = '驱动'; -ALTER TABLE `core_driver_jar` COMMENT = '驱动详情'; -ALTER TABLE `core_menu` COMMENT = '路由菜单'; -ALTER TABLE `core_opt_recent` COMMENT = '可视化资源表'; -ALTER TABLE `core_rsa` COMMENT = 'rsa 密钥表'; -ALTER TABLE `core_store` COMMENT = '用户收藏表'; -ALTER TABLE `core_sys_setting` COMMENT = '系统设置表'; -ALTER TABLE `data_visualization_info` COMMENT = '可视化大屏信息表'; -ALTER TABLE `de_standalone_version` COMMENT = '数据库版本变更记录表'; -ALTER TABLE `license` COMMENT = '企业版许可证信息表'; -ALTER TABLE `per_api_key` COMMENT = 'API Key 密钥表'; -ALTER TABLE `per_auth_busi_role` COMMENT = '角色资源权限配置'; -ALTER TABLE `per_auth_busi_user` COMMENT = '用户资源权限配置'; -ALTER TABLE `per_auth_menu` COMMENT = '菜单资源权限配置'; -ALTER TABLE `per_busi_resource` COMMENT = '企业资源'; -ALTER TABLE `per_dataset_column_permissions` COMMENT = '数据集列权限'; -ALTER TABLE `per_dataset_row_permissions_tree` COMMENT = '数据集行权限'; -ALTER TABLE `per_embedded_instance` COMMENT = '嵌入式应用'; -ALTER TABLE `per_menu_resource` COMMENT = '菜单资源'; -ALTER TABLE `per_org` COMMENT = '组织机构'; -ALTER TABLE `per_role` COMMENT = '角色'; -ALTER TABLE `per_sys_setting` COMMENT = '系统设置表'; -ALTER TABLE `per_user` COMMENT = '用户表'; -ALTER TABLE `per_user_role` COMMENT = '用户角色表'; -ALTER TABLE `visualization_background` COMMENT = '边框背景表'; -ALTER TABLE `visualization_background_image` COMMENT = '背景图'; -ALTER TABLE `visualization_link_jump` COMMENT = '跳转记录表'; -ALTER TABLE `visualization_link_jump_info` COMMENT = '跳转配置表'; -ALTER TABLE `visualization_link_jump_target_view_info` COMMENT = '跳转目标仪表板视图字段配置表'; -ALTER TABLE `visualization_linkage` COMMENT = '联动记录表'; -ALTER TABLE `visualization_linkage_field` COMMENT = '联动字段'; -ALTER TABLE `visualization_subject` COMMENT = '主题表'; -ALTER TABLE `visualization_template_extend_data` COMMENT = '模板视图明细信息表'; -ALTER TABLE `xpack_setting_authentication` COMMENT = '认证设置'; -ALTER TABLE `xpack_share` COMMENT = '公共链接'; +ALTER TABLE `QRTZ_BLOB_TRIGGERS` + COMMENT = '自定义触发器存储(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_CALENDARS` + COMMENT = 'Quartz日历(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_CRON_TRIGGERS` + COMMENT = 'CronTrigger存储(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_FIRED_TRIGGERS` + COMMENT = '存储已经触发的trigger相关信息(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_JOB_DETAILS` + COMMENT = '存储jobDetails信息(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_LOCKS` + COMMENT = 'Quartz锁表,为多个节点调度提供分布式锁(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_PAUSED_TRIGGER_GRPS` + COMMENT = '存放暂停掉的触发器(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_SCHEDULER_STATE` + COMMENT = '存储所有节点的scheduler(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_SIMPLE_TRIGGERS` + COMMENT = 'SimpleTrigger存储(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_SIMPROP_TRIGGERS` + COMMENT = '存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器(开源作业调度框架Quartz)'; +ALTER TABLE `QRTZ_TRIGGERS` + COMMENT = '存储定义的trigger(开源作业调度框架Quartz)'; +ALTER TABLE `area` + COMMENT = '地图区域表'; +ALTER TABLE `core_area_custom` + COMMENT = '自定义地图区域信息表'; +ALTER TABLE `core_chart_view` + COMMENT = '组件视图表'; +ALTER TABLE `core_dataset_group` + COMMENT = '数据集分组表'; +ALTER TABLE `core_dataset_table` + COMMENT = 'table数据集'; +ALTER TABLE `core_dataset_table_field` + COMMENT = 'table数据集表字段'; +ALTER TABLE `core_dataset_table_sql_log` + COMMENT = 'table数据集查询sql日志'; +ALTER TABLE `core_datasource` + COMMENT = '数据源表'; +ALTER TABLE `core_datasource_task` + COMMENT = '数据源定时同步任务'; +ALTER TABLE `core_datasource_task_log` + COMMENT = '数据源定时同步任务执行日志'; +ALTER TABLE `core_de_engine` + COMMENT = '数据引擎'; +ALTER TABLE `core_driver` + COMMENT = '驱动'; +ALTER TABLE `core_driver_jar` + COMMENT = '驱动详情'; +ALTER TABLE `core_menu` + COMMENT = '路由菜单'; +ALTER TABLE `core_opt_recent` + COMMENT = '可视化资源表'; +ALTER TABLE `core_rsa` + COMMENT = 'rsa 密钥表'; +ALTER TABLE `core_store` + COMMENT = '用户收藏表'; +ALTER TABLE `core_sys_setting` + COMMENT = '系统设置表'; +ALTER TABLE `data_visualization_info` + COMMENT = '可视化大屏信息表'; +ALTER TABLE `de_standalone_version` + COMMENT = '数据库版本变更记录表'; + +ALTER TABLE `visualization_background` + COMMENT = '边框背景表'; +ALTER TABLE `visualization_background_image` + COMMENT = '背景图'; +ALTER TABLE `visualization_link_jump` + COMMENT = '跳转记录表'; +ALTER TABLE `visualization_link_jump_info` + COMMENT = '跳转配置表'; +ALTER TABLE `visualization_link_jump_target_view_info` + COMMENT = '跳转目标仪表板视图字段配置表'; +ALTER TABLE `visualization_linkage` + COMMENT = '联动记录表'; +ALTER TABLE `visualization_linkage_field` + COMMENT = '联动字段'; +ALTER TABLE `visualization_subject` + COMMENT = '主题表'; +ALTER TABLE `visualization_template_extend_data` + COMMENT = '模板视图明细信息表'; ALTER TABLE `core_dataset_group` - MODIFY COLUMN `qrtz_instance` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Quartz 实例 ID' AFTER `create_time`; + MODIFY COLUMN `qrtz_instance` varchar(1024) NULL DEFAULT NULL COMMENT 'Quartz 实例 ID' AFTER `create_time`; ALTER TABLE `core_dataset_table_field` MODIFY COLUMN `size` int(0) NULL DEFAULT NULL COMMENT '字段长度(允许为空,默认0)' AFTER `type`, - MODIFY COLUMN `date_format` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '时间字段类型' AFTER `accuracy`; + MODIFY COLUMN `date_format` varchar(255) NULL DEFAULT NULL COMMENT '时间字段类型' AFTER `accuracy`; ALTER TABLE `core_datasource_task` - MODIFY COLUMN `extra_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '额外数据' AFTER `last_exec_status`; + MODIFY COLUMN `extra_data` longtext NULL COMMENT '额外数据' AFTER `last_exec_status`; ALTER TABLE `core_datasource_task_log` - MODIFY COLUMN `trigger_type` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新频率类型' AFTER `create_time`; + MODIFY COLUMN `trigger_type` varchar(45) NULL DEFAULT NULL COMMENT '更新频率类型' AFTER `create_time`; ALTER TABLE `core_driver_jar` - MODIFY COLUMN `trans_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '替换后的 jar 包名称' AFTER `driver_class`, + MODIFY COLUMN `trans_name` varchar(255) NULL DEFAULT NULL COMMENT '替换后的 jar 包名称' AFTER `driver_class`, MODIFY COLUMN `is_trans_name` tinyint(1) NULL DEFAULT NULL COMMENT '是否将上传 jar 包替换了名称(1-是,0-否)' AFTER `trans_name`; ALTER TABLE `core_rsa` - MODIFY COLUMN `aes_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'AES 加密算法的 key' AFTER `create_time`; + MODIFY COLUMN `aes_key` text NOT NULL COMMENT 'AES 加密算法的 key' AFTER `create_time`; ALTER TABLE `data_visualization_info` - MODIFY COLUMN `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键' FIRST; + MODIFY COLUMN `id` varchar(50) NOT NULL COMMENT '主键' FIRST; ALTER TABLE `de_standalone_version` MODIFY COLUMN `installed_rank` int(0) NOT NULL COMMENT '执行顺序(主键)' FIRST, - MODIFY COLUMN `version` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '版本' AFTER `installed_rank`, - MODIFY COLUMN `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '描述' AFTER `version`, - MODIFY COLUMN `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '类型' AFTER `description`, - MODIFY COLUMN `script` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '脚本名称' AFTER `type`, + MODIFY COLUMN `version` varchar(50) NULL DEFAULT NULL COMMENT '版本' AFTER `installed_rank`, + MODIFY COLUMN `description` varchar(200) NOT NULL COMMENT '描述' AFTER `version`, + MODIFY COLUMN `type` varchar(20) NOT NULL COMMENT '类型' AFTER `description`, + MODIFY COLUMN `script` varchar(1000) NOT NULL COMMENT '脚本名称' AFTER `type`, MODIFY COLUMN `checksum` int(0) NULL DEFAULT NULL COMMENT '脚本内容一致性校验码' AFTER `script`, - MODIFY COLUMN `installed_by` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '执行用户' AFTER `checksum`, + MODIFY COLUMN `installed_by` varchar(100) NOT NULL COMMENT '执行用户' AFTER `checksum`, MODIFY COLUMN `installed_on` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '执行时间' AFTER `installed_by`, MODIFY COLUMN `execution_time` int(0) NOT NULL COMMENT '执行时长' AFTER `installed_on`, MODIFY COLUMN `success` tinyint(1) NOT NULL COMMENT '状态(1-成功,0-失败)' AFTER `execution_time`; -ALTER TABLE `license` - MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `update_time` bigint(0) NULL DEFAULT NULL COMMENT '更新时间' AFTER `id`, - MODIFY COLUMN `license` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'license' AFTER `update_time`, - MODIFY COLUMN `f2c_license` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'F2C License' AFTER `license`; - -ALTER TABLE `per_dataset_column_permissions` - MODIFY COLUMN `update_time` bigint(0) NULL DEFAULT NULL COMMENT '更新时间' AFTER `white_list_user`; - -ALTER TABLE `per_dataset_row_permissions_tree` - MODIFY COLUMN `update_time` bigint(0) NULL DEFAULT NULL COMMENT '更新时间' AFTER `white_list_dept`; - -ALTER TABLE `per_user` - MODIFY COLUMN `pwd` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码' AFTER `account`; ALTER TABLE `visualization_background` - MODIFY COLUMN `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称' AFTER `id`, - MODIFY COLUMN `classification` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名' AFTER `name`, - MODIFY COLUMN `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '内容' AFTER `classification`, - MODIFY COLUMN `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注' AFTER `content`, + MODIFY COLUMN `id` varchar(64) NOT NULL COMMENT '主键' FIRST, + MODIFY COLUMN `name` varchar(255) NULL DEFAULT NULL COMMENT '名称' AFTER `id`, + MODIFY COLUMN `classification` varchar(255) NOT NULL COMMENT '分类名' AFTER `name`, + MODIFY COLUMN `content` longtext NULL COMMENT '内容' AFTER `classification`, + MODIFY COLUMN `remark` varchar(255) NULL DEFAULT NULL COMMENT '备注' AFTER `content`, MODIFY COLUMN `sort` int(0) NULL DEFAULT NULL COMMENT '排序' AFTER `remark`, MODIFY COLUMN `upload_time` bigint(0) NULL DEFAULT NULL COMMENT '上传时间' AFTER `sort`, - MODIFY COLUMN `base_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所在目录地址' AFTER `upload_time`, - MODIFY COLUMN `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图片url' AFTER `base_url`; + MODIFY COLUMN `base_url` varchar(255) NULL DEFAULT NULL COMMENT '所在目录地址' AFTER `upload_time`, + MODIFY COLUMN `url` varchar(255) NULL DEFAULT NULL COMMENT '图片url' AFTER `base_url`; ALTER TABLE `visualization_background_image` - MODIFY COLUMN `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键' FIRST, - MODIFY COLUMN `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称' AFTER `id`, - MODIFY COLUMN `classification` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名' AFTER `name`, - MODIFY COLUMN `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '内容' AFTER `classification`, - MODIFY COLUMN `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注' AFTER `content`, + MODIFY COLUMN `id` varchar(64) NOT NULL COMMENT '主键' FIRST, + MODIFY COLUMN `name` varchar(255) NULL DEFAULT NULL COMMENT '名称' AFTER `id`, + MODIFY COLUMN `classification` varchar(255) NOT NULL COMMENT '分类名' AFTER `name`, + MODIFY COLUMN `content` longtext NULL COMMENT '内容' AFTER `classification`, + MODIFY COLUMN `remark` varchar(255) NULL DEFAULT NULL COMMENT '备注' AFTER `content`, MODIFY COLUMN `sort` int(0) NULL DEFAULT NULL COMMENT '排序' AFTER `remark`, MODIFY COLUMN `upload_time` bigint(0) NULL DEFAULT NULL COMMENT '上传时间' AFTER `sort`, - MODIFY COLUMN `base_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所在目录地址' AFTER `upload_time`, - MODIFY COLUMN `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图片url' AFTER `base_url`; + MODIFY COLUMN `base_url` varchar(255) NULL DEFAULT NULL COMMENT '所在目录地址' AFTER `upload_time`, + MODIFY COLUMN `url` varchar(255) NULL DEFAULT NULL COMMENT '图片url' AFTER `base_url`; ALTER TABLE `visualization_link_jump` MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, @@ -149,8 +159,8 @@ ALTER TABLE `visualization_link_jump_target_view_info` ALTER TABLE `visualization_linkage` MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, MODIFY COLUMN `dv_id` bigint(0) NULL DEFAULT NULL COMMENT '联动大屏/仪表板ID' AFTER `id`, - MODIFY COLUMN `ext1` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '扩展字段1' AFTER `linkage_active`, - MODIFY COLUMN `ext2` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '扩展字段2' AFTER `ext1`, + MODIFY COLUMN `ext1` varchar(2000) NULL DEFAULT NULL COMMENT '扩展字段1' AFTER `linkage_active`, + MODIFY COLUMN `ext2` varchar(2000) NULL DEFAULT NULL COMMENT '扩展字段2' AFTER `ext1`, MODIFY COLUMN `copy_from` bigint(0) NULL DEFAULT NULL COMMENT '复制来源' AFTER `ext2`, MODIFY COLUMN `copy_id` bigint(0) NULL DEFAULT NULL COMMENT '复制来源ID' AFTER `copy_from`; @@ -163,15 +173,15 @@ ALTER TABLE `visualization_subject` MODIFY COLUMN `create_num` int(0) NOT NULL DEFAULT 0 COMMENT '创建序号' AFTER `cover_url`; ALTER TABLE `visualization_template_category` - MODIFY COLUMN `template_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模版类型 system 系统内置 self 用户自建' AFTER `snapshot`; + MODIFY COLUMN `template_type` varchar(255) NULL DEFAULT NULL COMMENT '模版类型 system 系统内置 self 用户自建' AFTER `snapshot`; ALTER TABLE `visualization_template_extend_data` MODIFY COLUMN `id` bigint(0) NOT NULL COMMENT '主键' FIRST, MODIFY COLUMN `dv_id` bigint(0) NULL DEFAULT NULL COMMENT '模板ID' AFTER `id`, MODIFY COLUMN `view_id` bigint(0) NULL DEFAULT NULL COMMENT '视图ID' AFTER `dv_id`, - MODIFY COLUMN `view_details` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '视图详情' AFTER `view_id`, - MODIFY COLUMN `copy_from` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '复制来源' AFTER `view_details`, - MODIFY COLUMN `copy_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '复制来源ID' AFTER `copy_from`; + MODIFY COLUMN `view_details` longtext NULL COMMENT '视图详情' AFTER `view_id`, + MODIFY COLUMN `copy_from` varchar(255) NULL DEFAULT NULL COMMENT '复制来源' AFTER `view_details`, + MODIFY COLUMN `copy_id` varchar(255) NULL DEFAULT NULL COMMENT '复制来源ID' AFTER `copy_from`; ALTER TABLE `core_opt_recent` MODIFY COLUMN `resource_type` int(0) NOT NULL COMMENT '资源类型 1-可视化资源 2-仪表板 3-数据大屏 4-数据集 5-数据源 6-模板' AFTER `uid`; diff --git a/core/core-backend/src/main/resources/db/migration/V2.3__ddl.sql b/core/core-backend/src/main/resources/db/migration/V2.3__ddl.sql index f8a9c19a0e..e26a77c3ec 100644 --- a/core/core-backend/src/main/resources/db/migration/V2.3__ddl.sql +++ b/core/core-backend/src/main/resources/db/migration/V2.3__ddl.sql @@ -10,3 +10,9 @@ CREATE TABLE `visualization_watermark` ( ) COMMENT='仪表板水印设置表'; INSERT INTO `visualization_watermark` (`id`, `version`, `setting_content`, `create_by`, `create_time`) VALUES ('system_default', '1.0', '{\"enable\":false,\"enablePanelCustom\":true,\"type\":\"custom\",\"content\":\"水印\",\"watermark_color\":\"#DD1010\",\"watermark_x_space\":12,\"watermark_y_space\":36,\"watermark_fontsize\":15}', 'admin', NULL); + +ALTER TABLE `visualization_template` + ADD COLUMN `use_count` int NULL DEFAULT 0 COMMENT '使用次数' AFTER `dynamic_data`; + +update visualization_template set use_count = 0; +INSERT INTO `core_sys_setting` (`id`, `pkey`, `pval`, `type`, `sort`) VALUES (9, 'basic.frontTimeOut', '60', 'text', 1); diff --git a/core/core-backend/src/main/resources/i18n/core_zh_CN.properties b/core/core-backend/src/main/resources/i18n/core_zh_CN.properties index d2f6d4d8c5..926674c050 100644 --- a/core/core-backend/src/main/resources/i18n/core_zh_CN.properties +++ b/core/core-backend/src/main/resources/i18n/core_zh_CN.properties @@ -20,7 +20,7 @@ i18n_menu.org=\u7EC4\u7EC7\u7BA1\u7406 i18n_menu.auth=\u6743\u9650\u914D\u7F6E i18n_menu.sync=\u540C\u6B65\u7BA1\u7406 i18n_menu.summary=\u6982\u89C8 -i18n_menu.ds=\u6570\u636E\u6E90\u7BA1\u7406 +i18n_menu.ds=\u6570\u636e\u8fde\u63a5\u7ba1\u7406 i18n_menu.task=\u4EFB\u52A1\u7BA1\u7406 i18n_menu.embedded=\u5D4C\u5165\u5F0F\u7BA1\u7406 i18n_menu.platform=\u5E73\u53F0\u5BF9\u63A5 diff --git a/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml b/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml index 7c18f24e46..c4598a13ad 100644 --- a/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml +++ b/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml @@ -53,12 +53,13 @@ vt.create_time, vt.template_type, vt.SNAPSHOT, + vt.use_count, vtcm.category_id, cor.time as 'recent_use_time' FROM visualization_template vt LEFT JOIN visualization_template_category_map vtcm ON vt.id = vtcm.template_id left JOIN core_opt_recent cor on cor.resource_type = 6 and vt.id = cor.resource_name - ORDER BY vt.create_time DESC + ORDER BY vt.use_count ,vt.create_time DESC