diff --git a/backend/pom.xml b/backend/pom.xml index e616f0206e..f1e772b196 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -118,7 +118,7 @@ org.apache.commons commons-text - 1.8 + [1.10.0,) commons-codec diff --git a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java index 5932e7bd14..272304b63c 100644 --- a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java +++ b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java @@ -86,7 +86,7 @@ public class DatasourceController { @PostMapping("/get/{id}") public DatasourceDTO getDatasource(@PathVariable String id) throws Exception { DatasourceUnionRequest request = new DatasourceUnionRequest(); - request.setUserId(String.valueOf(AuthUtils.getUser().getUserId())); + request.setUserId("1"); request.setId(id); List datasourceList = datasourceService.getDatasourceList(request); return CollectionUtils.isNotEmpty(datasourceList) ? datasourceList.get(0) : null; diff --git a/backend/src/main/java/io/dataease/controller/panel/AppLogController.java b/backend/src/main/java/io/dataease/controller/panel/AppLogController.java index f388d18a78..45a547acf3 100644 --- a/backend/src/main/java/io/dataease/controller/panel/AppLogController.java +++ b/backend/src/main/java/io/dataease/controller/panel/AppLogController.java @@ -21,24 +21,31 @@ import java.util.List; @RestController @Api(tags = "应用市场:应用日志") @ApiSupport(order = 220) -@RequestMapping("/app/log") +@RequestMapping("app/log") public class AppLogController { @Resource - private AppLogService applogService; + private AppLogService appLogService; @I18n @ApiOperation("查询日志") @PostMapping("/logGrid/{goPage}/{pageSize}") @ApiImplicitParams({ - @ApiImplicitParam(paramType = "path", name = "goPage", value = "页码", required = true, dataType = "Integer"), - @ApiImplicitParam(paramType = "path", name = "pageSize", value = "页容量", required = true, dataType = "Integer"), - @ApiImplicitParam(name = "request", value = "查询条件", required = true) + @ApiImplicitParam(paramType = "path", name = "goPage", value = "页码", required = true, dataType = "Integer"), + @ApiImplicitParam(paramType = "path", name = "pageSize", value = "页容量", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "request", value = "查询条件", required = true) }) public Pager> logGrid(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody KeyGridRequest request) { Page page = PageHelper.startPage(goPage, pageSize, true); - return PageUtils.setPageInfo(page, applogService.query(request)); + return PageUtils.setPageInfo(page, appLogService.query(request)); + } + + + @ApiOperation("删除日志和资源") + @PostMapping("/deleteLog") + public void deleteLogAndResource(@RequestBody AppLogGridDTO request) throws Exception { + appLogService.deleteLogAndResource(request); } } diff --git a/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java b/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java index b9c2cc1dbb..b361b5d725 100644 --- a/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java +++ b/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java @@ -203,4 +203,18 @@ public class PanelGroupController { result.setResponseSource("appApply"); return result; } + + @PostMapping("/appEdit") + public void appEdit(@RequestBody PanelAppTemplateApplyRequest request) throws Exception{ + panelGroupService.appEdit(request); + } + + @GetMapping("/findOneWithParent/{panelId}") + public PanelGroupDTO findOneWithParent(@PathVariable String panelId) throws Exception{ + PanelGroupDTO result = findOne(panelId); + result.setParents(authService.parentResource(panelId,"panel")); + result.setRequestId(UUIDUtil.getUUIDAsString()); + result.setResponseSource("appApply"); + return result; + } } diff --git a/backend/src/main/java/io/dataease/controller/request/dataset/DataSetGroupRequest.java b/backend/src/main/java/io/dataease/controller/request/dataset/DataSetGroupRequest.java index 5c87b85646..51f8cd76ba 100644 --- a/backend/src/main/java/io/dataease/controller/request/dataset/DataSetGroupRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/dataset/DataSetGroupRequest.java @@ -18,4 +18,6 @@ public class DataSetGroupRequest extends DatasetGroup { private String userId; @ApiModelProperty("ID集合") private Set ids; + @ApiModelProperty("排除的ID") + private String excludedId; } diff --git a/backend/src/main/java/io/dataease/controller/request/panel/PanelAppTemplateApplyRequest.java b/backend/src/main/java/io/dataease/controller/request/panel/PanelAppTemplateApplyRequest.java index 5446e5a84d..77b95aaabe 100644 --- a/backend/src/main/java/io/dataease/controller/request/panel/PanelAppTemplateApplyRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/panel/PanelAppTemplateApplyRequest.java @@ -13,12 +13,18 @@ import java.util.List; @Data public class PanelAppTemplateApplyRequest { + private String logId; + private String panelId; + private String panelGroupPid; + private String panelName; private String datasetGroupId; + private String datasetGroupPid; + private String datasetGroupName; private String appTemplateId; diff --git a/backend/src/main/java/io/dataease/dto/appTemplateMarket/AppLogGridDTO.java b/backend/src/main/java/io/dataease/dto/appTemplateMarket/AppLogGridDTO.java index c54b894374..3e1181660c 100644 --- a/backend/src/main/java/io/dataease/dto/appTemplateMarket/AppLogGridDTO.java +++ b/backend/src/main/java/io/dataease/dto/appTemplateMarket/AppLogGridDTO.java @@ -16,4 +16,18 @@ public class AppLogGridDTO extends PanelAppTemplateLog implements Serializable { private String panelName; + private String panelGroupPid; + + private String datasourceType; + + private String datasetGroupPid; + + private Boolean deleteResource; + + private String datasetPrivileges; + + private String panelPrivileges; + + private String datasourcePrivileges; + } diff --git a/backend/src/main/java/io/dataease/ext/ExtAppLogMapper.xml b/backend/src/main/java/io/dataease/ext/ExtAppLogMapper.xml index ee7b6a93fc..ccd96b59a6 100644 --- a/backend/src/main/java/io/dataease/ext/ExtAppLogMapper.xml +++ b/backend/src/main/java/io/dataease/ext/ExtAppLogMapper.xml @@ -7,12 +7,38 @@ + + + + + + diff --git a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java index 6468accbd6..ea5b3a204e 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java @@ -90,7 +90,9 @@ public class JdbcProvider extends DefaultJdbcProvider { DatabaseMetaData databaseMetaData = connection.getMetaData(); String tableNamePattern = datasourceRequest.getTable(); if(datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.mysql.name())){ - tableNamePattern = String.format(MySQLConstants.KEYWORD_TABLE, tableNamePattern); + if(databaseMetaData.getDriverMajorVersion() < 8){ + tableNamePattern = String.format(MySQLConstants.KEYWORD_TABLE, tableNamePattern); + } } ResultSet resultSet = databaseMetaData.getColumns(null, "%", tableNamePattern, "%"); while (resultSet.next()) { diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 2324f62cb8..c3fe116d71 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -2382,7 +2382,7 @@ public class DataSetTableService { if (CollectionUtils.isNotEmpty(data)) { jsonArray = data.stream().map(ele -> { Map map = new HashMap<>(); - for (int i = 0; i < ele.size(); i++) { + for (int i = 0; i < fieldArray.length; i++) { map.put(fieldArray[i], ele.get(i)); } return map; diff --git a/backend/src/main/java/io/dataease/service/panel/PanelAppTemplateService.java b/backend/src/main/java/io/dataease/service/panel/PanelAppTemplateService.java index 75f9c47bb2..db1c7dbb46 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelAppTemplateService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelAppTemplateService.java @@ -5,6 +5,7 @@ import io.dataease.commons.constants.CommonConstants; import io.dataease.commons.constants.PanelConstants; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.BeanUtils; +import io.dataease.controller.datasource.request.UpdataDsRequest; import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.request.panel.PanelAppTemplateApplyRequest; import io.dataease.controller.request.panel.PanelAppTemplateRequest; @@ -270,15 +271,36 @@ public class PanelAppTemplateService { return chartViewFieldsRealMap; } - public void nameCheck(PanelAppTemplateApplyRequest request) { - panelGroupService.checkPanelName(request.getPanelName(), request.getPanelId(), PanelConstants.OPT_TYPE_INSERT, null, "panel"); - DatasetGroup datasetGroup = new DatasetGroup(); - datasetGroup.setPid(request.getDatasetGroupId()); - datasetGroup.setName(request.getDatasetGroupName()); - dataSetGroupService.checkName(datasetGroup); - request.getDatasourceList().stream().forEach(datasource -> { - datasourceService.checkName(datasource.getName(), datasource.getType(), null); - }); + public void nameCheck(PanelAppTemplateApplyRequest request, String optType) { + if ("add".equals(optType)) { + panelGroupService.checkPanelName(request.getPanelName(), request.getPanelGroupPid(), PanelConstants.OPT_TYPE_INSERT, null, "panel"); + DatasetGroup datasetGroup = new DatasetGroup(); + datasetGroup.setPid(request.getDatasetGroupPid()); + datasetGroup.setName(request.getDatasetGroupName()); + dataSetGroupService.checkName(datasetGroup); + request.getDatasourceList().stream().forEach(datasource -> { + datasourceService.checkName(datasource.getName(), datasource.getType(), null); + }); + } else { + DatasetGroup datasetGroup = new DatasetGroup(); + datasetGroup.setPid(request.getDatasetGroupPid()); + datasetGroup.setName(request.getDatasetGroupName()); + datasetGroup.setId(request.getDatasetGroupId()); + dataSetGroupService.checkName(datasetGroup); + request.getDatasourceList().stream().forEach(datasource -> { + datasourceService.checkName(datasource.getName(), datasource.getType(), datasource.getId()); + }); + } } + + @Transactional(rollbackFor = Exception.class) + public void editDatasource(List updateDatasourceList) throws Exception { + for (int i = 0; i < updateDatasourceList.size(); i++) { + UpdataDsRequest updataDsRequest = new UpdataDsRequest(); + BeanUtils.copyBean(updataDsRequest, updateDatasourceList.get(i)); + datasourceService.updateDatasource(updataDsRequest); + + } + } } diff --git a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java index 73fb1119ba..cb9af63d96 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -127,9 +127,9 @@ public class PanelGroupService { @Resource private PanelAppTemplateLogService appTemplateLogService; @Resource - private ChartGroupService chartGroupService; - @Resource private DataSetGroupService dataSetGroupService; + @Resource + private DatasetGroupMapper datasetGroupMapper; public List tree(PanelGroupRequest panelGroupRequest) { String userId = String.valueOf(AuthUtils.getUser().getUserId()); @@ -232,6 +232,25 @@ public class PanelGroupService { return panelId; } + public void move(PanelGroupRequest request){ + PanelGroupWithBLOBs panelInfo = panelGroupMapper.selectByPrimaryKey(request.getId()); + if (panelInfo.getPid().equalsIgnoreCase(request.getPid())) { + DataEaseException.throwException(Translator.get("i18n_select_diff_folder")); + } + // 移动校验 + if (StringUtils.isNotEmpty(request.getName())) { + checkPanelName(request.getName(), request.getPid(), PanelConstants.OPT_TYPE_INSERT, request.getId(), panelInfo.getNodeType()); + } + PanelGroupWithBLOBs record = new PanelGroupWithBLOBs(); + record.setName(request.getName()); + record.setId(request.getId()); + record.setPid(request.getPid()); + record.setUpdateTime(request.getUpdateTime()); + record.setUpdateBy(request.getUpdateBy()); + panelGroupMapper.updateByPrimaryKeySelective(record); + DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFY, sourceType, request.getId(), panelInfo.getPid(), request.getPid(), sourceType); + } + public void checkPanelName(String name, String pid, String optType, String id, String nodeType) { PanelGroupExample groupExample = new PanelGroupExample(); @@ -811,12 +830,12 @@ public class PanelGroupService { @Transactional(rollbackFor = Exception.class) public String appApply(PanelAppTemplateApplyRequest request) throws Exception{ //仪表板名称校验,数据集分组名称校验,数据源名称校验 - panelAppTemplateService.nameCheck(request); + panelAppTemplateService.nameCheck(request,"add"); String newPanelId = UUIDUtil.getUUIDAsString(); // 新建数据集分组 DatasetGroup newDatasetGroup = new DatasetGroup(); - newDatasetGroup.setPid(request.getDatasetGroupId()); + newDatasetGroup.setPid(request.getDatasetGroupPid()); newDatasetGroup.setName(request.getDatasetGroupName()); newDatasetGroup.setType("group"); DataSetGroupDTO resultDatasetGroup = dataSetGroupService.save(newDatasetGroup); @@ -853,7 +872,7 @@ public class PanelGroupService { panelAppTemplateService.applyViewsField(chartViewFieldsInfo,chartViewsRealMap,datasetsRealMap,datasetFieldsRealMap); - panelAppTemplateService.applyPanel(panelInfo,chartViewsRealMap,newPanelId, request.getPanelName(), request.getPanelId()); + panelAppTemplateService.applyPanel(panelInfo,chartViewsRealMap,newPanelId, request.getPanelName(), request.getPanelGroupPid()); panelAppTemplateService.applyPanelView(panelViewsInfo,chartViewsRealMap,newPanelId); @@ -873,4 +892,42 @@ public class PanelGroupService { appTemplateLogService.newAppApplyLog(templateLog); return newPanelId; } + + @Transactional(rollbackFor = Exception.class) + public void appEdit(PanelAppTemplateApplyRequest request) throws Exception{ + long currentTime = System.currentTimeMillis(); + String userName = AuthUtils.getUser().getUsername(); + //名称校验,数据集分组名称校验,数据源名称校验 + panelAppTemplateService.nameCheck(request,"update"); + //仪表板移动更新名称 + PanelGroup panelHistoryInfo = panelGroupMapper.selectByPrimaryKey(request.getPanelId()); + String panelHistoryPid = panelHistoryInfo.getPid(); + if(panelHistoryPid.equals(request.getPanelGroupPid())){ + // 未移动 + checkPanelName(request.getPanelName(), request.getPanelGroupPid(), PanelConstants.OPT_TYPE_UPDATE, request.getPanelId(), "panel"); + }else{ + checkPanelName(request.getPanelName(), request.getPanelGroupPid(), PanelConstants.OPT_TYPE_INSERT, null, "panel"); + } + panelHistoryInfo.setName(request.getPanelName()); + panelHistoryInfo.setPid(request.getPanelGroupPid()); + panelHistoryInfo.setUpdateBy(userName); + panelHistoryInfo.setUpdateTime(currentTime); + panelGroupMapper.updateByPrimaryKey(panelHistoryInfo); + + //数据集分组移动,变更 + DatasetGroup datasetGroupHistoryInfo = datasetGroupMapper.selectByPrimaryKey(request.getDatasetGroupId()); + DatasetGroup datasetGroup = new DatasetGroup(); + datasetGroup.setName(request.getDatasetGroupName()); + datasetGroup.setId(request.getDatasetGroupId()); + if(datasetGroupHistoryInfo.getPid().equals(request.getDatasetGroupPid())){ + datasetGroup.setPid(request.getDatasetGroupPid()); + } + dataSetGroupService.checkName(datasetGroup); + datasetGroupHistoryInfo.setName(request.getDatasetGroupName()); + datasetGroupHistoryInfo.setPid(request.getDatasetGroupPid()); + datasetGroupMapper.updateByPrimaryKey(datasetGroupHistoryInfo); + + //数据源变更 + panelAppTemplateService.editDatasource(request.getDatasourceList()); + } } diff --git a/backend/src/main/java/io/dataease/service/panel/applog/AppLogQueryParam.java b/backend/src/main/java/io/dataease/service/panel/applog/AppLogQueryParam.java index 9aee5afaf3..0abc975811 100644 --- a/backend/src/main/java/io/dataease/service/panel/applog/AppLogQueryParam.java +++ b/backend/src/main/java/io/dataease/service/panel/applog/AppLogQueryParam.java @@ -7,5 +7,6 @@ import java.util.List; @Data public class AppLogQueryParam extends GridExample { + private String userId; } diff --git a/backend/src/main/java/io/dataease/service/panel/applog/AppLogService.java b/backend/src/main/java/io/dataease/service/panel/applog/AppLogService.java index 0c174f17a4..7fd1ac2577 100644 --- a/backend/src/main/java/io/dataease/service/panel/applog/AppLogService.java +++ b/backend/src/main/java/io/dataease/service/panel/applog/AppLogService.java @@ -1,13 +1,20 @@ package io.dataease.service.panel.applog; import com.google.gson.Gson; +import io.dataease.commons.utils.AuthUtils; import io.dataease.controller.sys.request.KeyGridRequest; import io.dataease.dto.SysLogDTO; import io.dataease.dto.appTemplateMarket.AppLogGridDTO; import io.dataease.ext.ExtAppLogMapper; import io.dataease.ext.query.GridExample; import io.dataease.plugins.common.base.mapper.PanelAppTemplateLogMapper; +import io.dataease.service.dataset.DataSetGroupService; +import io.dataease.service.datasource.DatasourceService; +import io.dataease.service.panel.PanelGroupService; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import javax.annotation.Resource; import java.util.List; @@ -19,12 +26,19 @@ public class AppLogService { private PanelAppTemplateLogMapper appLogMapper; @Resource private ExtAppLogMapper extAppLogMapper; + @Resource + private PanelGroupService panelGroupService; + @Resource + private DataSetGroupService dataSetGroupService; + @Resource + private DatasourceService datasourceService; public List query(KeyGridRequest request) { GridExample gridExample = request.convertExample(); gridExample.setExtendCondition(request.getKeyWord()); AppLogQueryParam logQueryParam = gson.fromJson(gson.toJson(gridExample), AppLogQueryParam.class); + logQueryParam.setUserId(String.valueOf(AuthUtils.getUser().getUserId())); List voLogs = extAppLogMapper.query(logQueryParam); return voLogs; } @@ -34,4 +48,19 @@ public class AppLogService { } + @Transactional + public void deleteLogAndResource(AppLogGridDTO request) throws Exception { + if (request.getDeleteResource()) { + if (StringUtils.isNotEmpty(request.getPanelId())) { + panelGroupService.deleteCircle(request.getPanelId()); + } + if (StringUtils.isNotEmpty(request.getDatasetGroupId())) { + dataSetGroupService.delete(request.getDatasetGroupId()); + } + if (StringUtils.isNotEmpty(request.getDatasourceId())) { + datasourceService.deleteDatasource(request.getDatasourceId()); + } + } + appLogMapper.deleteByPrimaryKey(request.getId()); + } } diff --git a/backend/src/main/resources/db/migration/V29__de1.6.sql b/backend/src/main/resources/db/migration/V29__de1.6.sql index cda07ca6d4..08319e3455 100644 --- a/backend/src/main/resources/db/migration/V29__de1.6.sql +++ b/backend/src/main/resources/db/migration/V29__de1.6.sql @@ -27,7 +27,7 @@ ADD COLUMN `mobile_layout` tinyint(1) NULL DEFAULT 0 COMMENT '启用移动端布 DROP FUNCTION IF EXISTS `GET_PANEL_WITH_PRIVILEGE_AND_MOBILE`; delimiter ;; CREATE FUNCTION `GET_PANEL_WITH_PRIVILEGE_AND_MOBILE`(userId longtext,modelType varchar(255),privilegeType varchar(255)) - RETURNS longtext CHARSET utf8 + RETURNS longtext CHARSET utf8mb4 COLLATE utf8mb4_general_ci READS SQL DATA BEGIN @@ -73,7 +73,7 @@ delimiter ; DROP FUNCTION IF EXISTS `GET_V_AUTH_MODEL_ID_P_USE_MOBILE`; delimiter ;; CREATE FUNCTION `GET_V_AUTH_MODEL_ID_P_USE_MOBILE`(userId longtext,modelType varchar(255)) - RETURNS longtext CHARSET utf8 + RETURNS longtext CHARSET utf8mb4 COLLATE utf8mb4_general_ci READS SQL DATA BEGIN diff --git a/backend/src/main/resources/db/migration/V32__1.8.sql b/backend/src/main/resources/db/migration/V32__1.8.sql index 01201ca456..1f079e7d3b 100644 --- a/backend/src/main/resources/db/migration/V32__1.8.sql +++ b/backend/src/main/resources/db/migration/V32__1.8.sql @@ -344,7 +344,7 @@ CREATE TABLE `sys_background_image` ( `base_url` varchar(255) DEFAULT NULL, `url` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; -- ---------------------------- -- Records of sys_background_image @@ -404,7 +404,7 @@ CREATE TABLE `dataease_code_version` ( `success` tinyint(1) NOT NULL, PRIMARY KEY (`installed_rank`), KEY `dataease_version_s_idx` (`success`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; -- ---------------------------- -- Records of dataease_code_version @@ -429,7 +429,7 @@ CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `v_history_chart_view` AS DROP FUNCTION IF EXISTS `GET_CHART_GROUP_WITH_CHILDREN`; delimiter ;; CREATE FUNCTION `GET_CHART_GROUP_WITH_CHILDREN`(parentId varchar(8000)) - RETURNS LONGTEXT CHARSET utf8 + RETURNS LONGTEXT CHARSET utf8mb4 COLLATE utf8mb4_general_ci READS SQL DATA BEGIN diff --git a/backend/src/main/resources/db/migration/V33__1.9.sql b/backend/src/main/resources/db/migration/V33__1.9.sql index 8cc46a3726..ab7f3fcb7f 100644 --- a/backend/src/main/resources/db/migration/V33__1.9.sql +++ b/backend/src/main/resources/db/migration/V33__1.9.sql @@ -105,7 +105,7 @@ ADD COLUMN `copy_id` varchar(255) NULL COMMENT '复制ID' AFTER `copy_from`; DROP FUNCTION IF EXISTS `copy_auth`; delimiter ;; CREATE FUNCTION `copy_auth`(authSource varchar(255),authSourceType varchar(255),authUser varchar(255)) - RETURNS varchar(255) CHARSET utf8mb4 + RETURNS varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci READS SQL DATA BEGIN @@ -256,7 +256,7 @@ delimiter ; DROP FUNCTION IF EXISTS `delete_auth_source`; delimiter ;; CREATE FUNCTION `delete_auth_source`(authSource varchar(255),authSourceType varchar(255)) - RETURNS varchar(255) CHARSET utf8mb4 + RETURNS varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci READS SQL DATA BEGIN @@ -285,7 +285,7 @@ INSERT INTO `sys_menu` VALUES (101, 1, 4, 1, '插件管理', 'system-plugin', 's DROP FUNCTION IF EXISTS `GET_CHART_VIEW_COPY_NAME`; delimiter ;; CREATE FUNCTION `GET_CHART_VIEW_COPY_NAME`(chartId varchar(255),pid varchar(255)) - RETURNS varchar(255) CHARSET utf8mb4 + RETURNS varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci READS SQL DATA BEGIN diff --git a/backend/src/main/resources/db/migration/V40__1.15.sql b/backend/src/main/resources/db/migration/V40__1.15.sql index ac39813c35..6eca9baaef 100644 --- a/backend/src/main/resources/db/migration/V40__1.15.sql +++ b/backend/src/main/resources/db/migration/V40__1.15.sql @@ -213,7 +213,7 @@ delimiter ; DROP FUNCTION IF EXISTS `GET_CHART_VIEW_COPY_NAME`; delimiter ;; CREATE FUNCTION `GET_CHART_VIEW_COPY_NAME`(chartId varchar(255),pid varchar(255)) - RETURNS varchar(255) CHARSET utf8mb4 + RETURNS varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci READS SQL DATA BEGIN diff --git a/backend/src/main/resources/db/migration/V42__1.16.sql b/backend/src/main/resources/db/migration/V42__1.16.sql index 6a02f442ad..a44a6a190f 100644 --- a/backend/src/main/resources/db/migration/V42__1.16.sql +++ b/backend/src/main/resources/db/migration/V42__1.16.sql @@ -32,6 +32,17 @@ WHERE (`msg_type_id` = 6); ALTER TABLE `sys_user_assist` ADD COLUMN `larksuite_id` VARCHAR(255) NULL DEFAULT NULL AFTER `lark_id`; +INSERT INTO `sys_menu` (`menu_id`, `pid`, `sub_count`, `type`, `title`, `name`, `component`, `menu_sort`, `icon`, + `path`, `i_frame`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, + `update_time`) +VALUES (41, 1, 1, 1, '应用管理', 'system-app-template', 'panel/appTemplate/index', 13, 'sys-param', + 'panel/appTemplate/index', 0, 0, 0, NULL, NULL, NULL, NULL, 1620444227389); +INSERT INTO `sys_menu` (`menu_id`, `pid`, `sub_count`, `type`, `title`, `name`, `component`, `menu_sort`, `icon`, + `path`, `i_frame`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, + `update_time`) +VALUES (203, 0, 0, 1, '应用', 'app-template-market', 'panel/appTemplateMarket/index', 6, 'dashboard', + '/appTemplateMarket', 0, 0, 0, NULL, NULL, NULL, NULL, 1620444227389); + ALTER TABLE `dataset_table_field` CHANGE COLUMN `type` `type` VARCHAR(255) NOT NULL COMMENT '原始字段类型' ; INSERT INTO `my_plugin` (`name`, `store`, `free`, `cost`, `category`, `descript`, `version`, `creator`, `load_mybatis`, @@ -42,3 +53,220 @@ VALUES ('Apache Kylin 数据源插件', 'default', '0', '0', 'datasource', 'Apac INSERT INTO `sys_msg_channel` (`msg_channel_id`, `channel_name`, `service_name`) VALUES ('6', 'webmsg.channel_larksuite_msg', 'sendLarksuite'); + +INSERT INTO `sys_menu` (`menu_id`, `pid`, `sub_count`, `type`, `title`, `name`, `component`, `menu_sort`, `icon`, `path`, `i_frame`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`) VALUES (204, 203, 0, 2, '删除记录', NULL, NULL, 999, NULL, NULL, 0, 0, 0, 'appLog:del', NULL, NULL, 1614930903502, 1614930903502); +INSERT INTO `sys_menu` (`menu_id`, `pid`, `sub_count`, `type`, `title`, `name`, `component`, `menu_sort`, `icon`, `path`, `i_frame`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`) VALUES (205, 203, 0, 2, '编辑记录', NULL, NULL, 999, NULL, NULL, 0, 0, 0, 'appLog:edit', NULL, NULL, 1614930935529, 1614930935529); + +INSERT INTO `sys_auth` (`id`, `auth_source`, `auth_source_type`, `auth_target`, `auth_target_type`, `auth_time`, `auth_details`, `auth_user`, `update_time`, `copy_from`, `copy_id`) VALUES ('46e4e2cb-1349-40c3-a72d-7b0b30ab5d14', '203', 'menu', '1', 'role', 1666840141866, NULL, 'admin', NULL, NULL, NULL); +INSERT INTO `sys_auth` (`id`, `auth_source`, `auth_source_type`, `auth_target`, `auth_target_type`, `auth_time`, `auth_details`, `auth_user`, `update_time`, `copy_from`, `copy_id`) VALUES ('6e22ad53-d737-447f-9686-5041e122b4dc', '205', 'menu', '1', 'role', 1666840141468, NULL, 'admin', NULL, NULL, NULL); +INSERT INTO `sys_auth` (`id`, `auth_source`, `auth_source_type`, `auth_target`, `auth_target_type`, `auth_time`, `auth_details`, `auth_user`, `update_time`, `copy_from`, `copy_id`) VALUES ('da17fcfe-7875-4aaf-983b-d750d71f36d2', '204', 'menu', '1', 'role', 1666840141658, NULL, 'admin', NULL, NULL, NULL); + +INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('b4fe2e52-55a4-11ed-bf84-0242ac130005', '6e22ad53-d737-447f-9686-5041e122b4dc', 'i18n_auth_grant', 15, 0, 'grant', '基础权限-授权', 'admin', 1666840141000, NULL, NULL, NULL); +INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('b4fe3215-55a4-11ed-bf84-0242ac130005', '6e22ad53-d737-447f-9686-5041e122b4dc', 'i18n_auth_use', 1, 1, 'use', '基础权限-使用', 'admin', 1666840141000, NULL, NULL, NULL); +INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('b51affbf-55a4-11ed-bf84-0242ac130005', 'da17fcfe-7875-4aaf-983b-d750d71f36d2', 'i18n_auth_grant', 15, 0, 'grant', '基础权限-授权', 'admin', 1666840141000, NULL, NULL, NULL); +INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('b51b0473-55a4-11ed-bf84-0242ac130005', 'da17fcfe-7875-4aaf-983b-d750d71f36d2', 'i18n_auth_use', 1, 1, 'use', '基础权限-使用', 'admin', 1666840141000, NULL, NULL, NULL); +INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('b53a1ad7-55a4-11ed-bf84-0242ac130005', '46e4e2cb-1349-40c3-a72d-7b0b30ab5d14', 'i18n_auth_grant', 15, 0, 'grant', '基础权限-授权', 'admin', 1666840142000, NULL, NULL, NULL); +INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('b53a1dfd-55a4-11ed-bf84-0242ac130005', '46e4e2cb-1349-40c3-a72d-7b0b30ab5d14', 'i18n_auth_use', 1, 1, 'use', '基础权限-使用', 'admin', 1666840142000, NULL, NULL, NULL); + + +DROP VIEW IF EXISTS `v_auth_model`; +CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `v_auth_model` AS SELECT + `sys_user`.`user_id` AS `id`, + concat( `sys_user`.`nick_name`, '(', `sys_user`.`username`, ')' ) AS `name`, + `sys_user`.`username` AS `label`, + '0' AS `pid`, + 'leaf' AS `node_type`, + 'user' AS `model_type`, + 'user' AS `model_inner_type`, + 'target' AS `auth_type`, + `sys_user`.`create_by` AS `create_by`, + 0 AS `level`, + 0 AS `mode`, + '0' AS `data_source_id` + FROM + `sys_user` + WHERE + ( `sys_user`.`is_admin` <> 1 ) UNION ALL + SELECT + `sys_role`.`role_id` AS `id`, + `sys_role`.`name` AS `name`, + `sys_role`.`name` AS `label`, + '0' AS `pid`, + 'leaf' AS `node_type`, + 'role' AS `model_type`, + 'role' AS `model_inner_type`, + 'target' AS `auth_type`, + `sys_role`.`create_by` AS `create_by`, + 0 AS `level`, + 0 AS `mode`, + '0' AS `data_source_id` + FROM + `sys_role` UNION ALL + SELECT + `sys_dept`.`dept_id` AS `id`, + `sys_dept`.`name` AS `name`, + `sys_dept`.`name` AS `label`,( + cast( `sys_dept`.`pid` AS CHAR charset utf8mb4 ) COLLATE utf8mb4_general_ci + ) AS `pid`, + IF + (( `sys_dept`.`sub_count` = 0 ), 'leaf', 'spine' ) AS `node_type`, + 'dept' AS `model_type`, + 'dept' AS `model_inner_type`, + 'target' AS `auth_type`, + `sys_dept`.`create_by` AS `create_by`, + 0 AS `level`, + 0 AS `mode`, + '0' AS `data_source_id` + FROM + `sys_dept` UNION ALL + SELECT + `datasource`.`id` AS `id`, + `datasource`.`name` AS `NAME`, + `datasource`.`name` AS `label`, + '0' AS `pid`, + 'leaf' AS `node_type`, + 'link' AS `model_type`, + `datasource`.`type` AS `model_inner_type`, + 'source' AS `auth_type`, + `datasource`.`create_by` AS `create_by`, + 0 AS `level`, + 0 AS `mode`, + '0' AS `data_source_id` + FROM + `datasource` UNION ALL + SELECT + `dataset_group`.`id` AS `id`, + `dataset_group`.`name` AS `NAME`, + `dataset_group`.`name` AS `label`, + IF + ( isnull( `dataset_group`.`pid` ), '0', `dataset_group`.`pid` ) AS `pid`, + 'spine' AS `node_type`, + 'dataset' AS `model_type`, + `dataset_group`.`type` AS `model_inner_type`, + 'source' AS `auth_type`, + `dataset_group`.`create_by` AS `create_by`, + `dataset_group`.`level` AS `level`, + 0 AS `mode`, + '0' AS `data_source_id` + FROM + `dataset_group` UNION ALL + SELECT + `dataset_table`.`id` AS `id`, + `dataset_table`.`name` AS `NAME`, + `dataset_table`.`name` AS `label`, + `dataset_table`.`scene_id` AS `pid`, + 'leaf' AS `node_type`, + 'dataset' AS `model_type`, + `dataset_table`.`type` AS `model_inner_type`, + 'source' AS `auth_type`, + `dataset_table`.`create_by` AS `create_by`, + 0 AS `level`, + `dataset_table`.`mode` AS `mode`, + `dataset_table`.`data_source_id` AS `data_source_id` + FROM + `dataset_table` UNION ALL + SELECT + `panel_group`.`id` AS `id`, + `panel_group`.`name` AS `NAME`, + `panel_group`.`name` AS `label`,( + CASE + `panel_group`.`id` + WHEN 'panel_list' THEN + '0' + WHEN 'default_panel' THEN + '0' ELSE `panel_group`.`pid` + END + ) AS `pid`, + IF + (( `panel_group`.`node_type` = 'folder' ), 'spine', 'leaf' ) AS `node_type`, + 'panel' AS `model_type`, + `panel_group`.`panel_type` AS `model_inner_type`, + 'source' AS `auth_type`, + `panel_group`.`create_by` AS `create_by`, + 0 AS `level`, + 0 AS `mode`, + '0' AS `data_source_id` + FROM + `panel_group` UNION ALL + SELECT + `sys_menu`.`menu_id` AS `menu_id`, + `sys_menu`.`title` AS `name`, + `sys_menu`.`title` AS `label`, + `sys_menu`.`pid` AS `pid`, + IF + (( `sys_menu`.`sub_count` > 0 ), 'spine', 'leaf' ) AS `node_type`, + 'menu' AS `model_type`,( + CASE + `sys_menu`.`type` + WHEN 0 THEN + 'folder' + WHEN 1 THEN + 'menu' + WHEN 2 THEN + 'button' + END + ) AS `model_inner_type`, + 'source' AS `auth_type`, + `sys_menu`.`create_by` AS `create_by`, + 0 AS `level`, + 0 AS `mode`, + '0' AS `data_source_id` + FROM + `sys_menu` + WHERE + (( + `sys_menu`.`i_frame` <> 1 + ) + OR isnull( `sys_menu`.`i_frame` )) UNION ALL + SELECT + `plugin_sys_menu`.`menu_id` AS `menu_id`, + `plugin_sys_menu`.`title` AS `name`, + `plugin_sys_menu`.`title` AS `label`, + `plugin_sys_menu`.`pid` AS `pid`, + IF + (( `plugin_sys_menu`.`sub_count` > 0 ), 'spine', 'leaf' ) AS `node_type`, + 'menu' AS `model_type`,( + CASE + `plugin_sys_menu`.`type` + WHEN 0 THEN + 'folder' + WHEN 1 THEN + 'menu' + WHEN 2 THEN + 'button' + END + ) AS `model_inner_type`, + 'source' AS `auth_type`, + `plugin_sys_menu`.`create_by` AS `create_by`, + 0 AS `level`, + 0 AS `mode`, + '0' AS `data_source_id` + FROM + `plugin_sys_menu` + WHERE + (( + `plugin_sys_menu`.`i_frame` <> 1 + ) + OR isnull( `plugin_sys_menu`.`i_frame` )); + +-- ---------------------------- +-- Function structure for delete_auth_target +-- ---------------------------- +DROP FUNCTION IF EXISTS `delete_auth_target`; +delimiter ;; +CREATE FUNCTION `delete_auth_target`(authTarget varchar(255),authTargetType varchar(255)) + RETURNS varchar(255) CHARSET utf8mb4 + READS SQL DATA +BEGIN + +delete from sys_auth_detail where auth_id in ( + select id from sys_auth where sys_auth.auth_target=authTarget and sys_auth.auth_target_type=authTargetType +); + +delete from sys_auth where sys_auth.auth_target=authTarget and sys_auth.auth_target_type=authTargetType; + +RETURN 'success'; + +END +;; +delimiter ; diff --git a/frontend/src/api/appTemplateMarket/log.js b/frontend/src/api/appTemplateMarket/log.js index 3a14b96f80..a652d53b38 100644 --- a/frontend/src/api/appTemplateMarket/log.js +++ b/frontend/src/api/appTemplateMarket/log.js @@ -11,7 +11,7 @@ export function logGrid(page, size, data) { export function opTypes() { return request({ - url: '/api/log/opTypes', + url: '/app/log/opTypes', method: 'post', loading: true }) @@ -19,10 +19,19 @@ export function opTypes() { export function exportExcel(data) { return request({ - url: '/api/log/export', + url: '/app/log/export', method: 'post', loading: true, responseType: 'blob', data }) } + +export function deleteLogAndResource(data) { + return request({ + url: '/app/log/deleteLog', + method: 'post', + data, + loading: true + }) +} diff --git a/frontend/src/api/panel/panel.js b/frontend/src/api/panel/panel.js index 3a74f445a8..f892134606 100644 --- a/frontend/src/api/panel/panel.js +++ b/frontend/src/api/panel/panel.js @@ -313,7 +313,33 @@ export function appApply(data) { return request({ url: 'panel/group/appApply', method: 'post', - loading: true, + loading: false, data }) } + +export function appEdit(data) { + return request({ + url: 'panel/group/appEdit', + method: 'post', + loading: false, + data + }) +} + +export function editApply(data) { + return request({ + url: 'panel/group/appApply', + method: 'post', + loading: false, + data + }) +} + +export function findOneWithParent(panelId) { + return request({ + url: 'panel/group/findOneWithParent/' + panelId, + method: 'get', + loading: false + }) +} diff --git a/frontend/src/assets/datasource/pg.jpg b/frontend/src/assets/datasource/pg.jpg index ebcb628b89..cc2106b924 100644 Binary files a/frontend/src/assets/datasource/pg.jpg and b/frontend/src/assets/datasource/pg.jpg differ diff --git a/frontend/src/components/DeDrag/index.vue b/frontend/src/components/DeDrag/index.vue index ba4a5e3c35..2d38230a34 100644 --- a/frontend/src/components/DeDrag/index.vue +++ b/frontend/src/components/DeDrag/index.vue @@ -44,7 +44,6 @@ @resizeView="resizeView" @linkJumpSet="linkJumpSet" @boardSet="boardSet" - @fieldSelect="fieldSelect" /> - - @@ -239,13 +232,6 @@ export default { mobileLayoutStatus() { this.restore() } - // //监控当前组件移动 检查是否靠近tab - // curComponent: { - // handler(newVal, oldVla) { - // // this.restore() - // }, - // deep: true - // }, }, created() { }, @@ -301,8 +287,7 @@ export default { } }, canvasScroll(e) { - this.scrollLeft = e.target.scrollLeft - this.scrollTop = e.target.scrollTop + this.$emit('canvasScroll', { scrollLeft: e.target.scrollLeft, scrollTop: e.target.scrollTop }) bus.$emit('onScroll') }, // handleDrop(e) { @@ -597,4 +582,7 @@ export default { overflow-y: auto; background-size: 100% 100% !important; } +.min-width-730 { + min-width: 730px !important; +} diff --git a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue index cf18c101c3..50407a9c93 100644 --- a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue +++ b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue @@ -195,7 +195,7 @@ export default { return style }, componentActiveFlag() { - return (this.curComponent && this.config === this.curComponent && !this.previewVisible && !this.showPosition.includes('email-task')) || this.showPosition.includes('multiplexing') + return !this.mobileLayoutStatus && ((this.curComponent && this.config === this.curComponent && !this.previewVisible && !this.showPosition.includes('email-task')) || this.showPosition.includes('multiplexing')) }, curGap() { return (this.canvasStyleData.panel.gap === 'yes' && this.config.auxiliaryMatrix) ? this.componentGap : 0 diff --git a/frontend/src/components/canvas/components/Editor/DeEditor.vue b/frontend/src/components/canvas/components/Editor/DeEditor.vue index eccbc53c7c..bd7bc2c023 100644 --- a/frontend/src/components/canvas/components/Editor/DeEditor.vue +++ b/frontend/src/components/canvas/components/Editor/DeEditor.vue @@ -942,12 +942,6 @@ export default { height: this.outStyle.height + this.scrollTop + 'px !important' } }, - // 挤占式画布设计 - // eslint-disable-next-line - coordinates() { - // eslint-disable-next-line - return this.coordinates - }, customStyle() { let style = { width: '100%', diff --git a/frontend/src/components/canvas/components/Editor/EditBar.vue b/frontend/src/components/canvas/components/Editor/EditBar.vue index 1340650372..e969bf1bfc 100644 --- a/frontend/src/components/canvas/components/Editor/EditBar.vue +++ b/frontend/src/components/canvas/components/Editor/EditBar.vue @@ -200,7 +200,7 @@ export default { }, sourceElement: { type: Object, - required: true + default: () => {} }, element: { type: Object, diff --git a/frontend/src/components/canvas/components/TextAttr.vue b/frontend/src/components/canvas/components/TextAttr.vue index 7e3b2e874e..20a9bacfa8 100644 --- a/frontend/src/components/canvas/components/TextAttr.vue +++ b/frontend/src/components/canvas/components/TextAttr.vue @@ -588,7 +588,7 @@ export default { mainStyle() { const style = { left: (this.getPositionX(this.curComponent.style.left) - this.scrollLeft) + 'px', - top: (this.getPositionY(this.curComponent.style.top) - this.scrollTop + 25) + 'px' + top: (this.getPositionY(this.curComponent.style.top) - this.scrollTop + 20) + 'px' } return style }, diff --git a/frontend/src/components/widget/DeWidget/DeTabs.vue b/frontend/src/components/widget/DeWidget/DeTabs.vue index b9b3db6631..b97cd577fd 100644 --- a/frontend/src/components/widget/DeWidget/DeTabs.vue +++ b/frontend/src/components/widget/DeWidget/DeTabs.vue @@ -56,7 +56,7 @@ -
+
+ +
@@ -211,11 +221,16 @@ import { findPanelElementInfo } from '@/api/panel/panel' import { getNowCanvasComponentData } from '@/components/canvas/utils/utils' import DeCanvasTab from '@/components/canvas/DeCanvas' import Preview from '@/components/canvas/components/Editor/Preview' +import TextAttr from '@/components/canvas/components/TextAttr' export default { name: 'DeTabs', - components: { Preview, DeCanvasTab, TabUseList, ViewSelect, DataeaseTabs }, + components: { TextAttr, Preview, DeCanvasTab, TabUseList, ViewSelect, DataeaseTabs }, props: { + canvasId: { + type: String, + default: 'canvas-main' + }, element: { type: Object, default: null @@ -252,6 +267,20 @@ export default { }, data() { return { + scrollLeft: 50, + scrollTop: 10, + // 需要展示属性设置的组件类型 + showAttrComponent: [ + 'custom', + 'v-text', + 'picture-add', + 'de-tabs', + 'rect-shape', + 'de-show-date', + 'de-video', + 'de-stream-media', + 'de-frame' + ], activeTabName: null, tabIndex: 1, dialogVisible: false, @@ -264,6 +293,23 @@ export default { } }, computed: { + curCanvasScaleSelf() { + return this.curCanvasScaleMap[this.canvasId] + }, + showAttr() { + if (this.mobileLayoutStatus) { + return false + } else if (this.curComponent && this.showAttrComponent.includes(this.curComponent.type)) { + // 过滤组件有标题才显示 + if (this.curComponent.type === 'custom' && (!this.curComponent.options.attrs.showTitle || !this.curComponent.options.attrs.title)) { + return false + } else { + return true + } + } else { + return false + } + }, moveActive() { return this.tabMoveInActiveId && this.tabMoveInActiveId === this.element.id }, @@ -285,7 +331,9 @@ export default { 'curComponent', 'mobileLayoutStatus', 'canvasStyleData', - 'tabMoveInActiveId' + 'tabMoveInActiveId', + 'curCanvasScaleMap', + 'pcComponentData' ]), fontColor() { return this.element && this.element.style && this.element.style.headFontColor || 'none' @@ -360,9 +408,23 @@ export default { bus.$off('add-new-tab', this.addNewTab) }, methods: { + initScroll() { + this.scrollLeft = 50 + this.scrollTop = 10 + }, + canvasScroll(scrollInfo) { + this.scrollLeft = scrollInfo.scrollLeft + 50 + this.scrollTop = scrollInfo.scrollTop + 10 + console.log('scrollInfo=' + JSON.stringify(scrollInfo)) + bus.$emit('onScroll') + }, tabCanvasComponentData(tabName) { - const result = getNowCanvasComponentData(this.element.id + '-' + tabName) - return result + const tabCanvasId = this.element.id + '-' + tabName + if (this.mobileLayoutStatus) { + return this.pcComponentData.filter(item => item.canvasId === tabCanvasId) + } else { + return getNowCanvasComponentData(tabCanvasId) + } }, setContentThemeStyle() { this.element.options.tabList.forEach(tab => { diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index d3a53cec82..a4620f5b4a 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -2625,6 +2625,21 @@ export default { search_by_keyword: 'Search by keyword', apply_logs: 'Apply logs', app_group_delete_tips: 'Are you sure to delete this application category?', + + app_group_delete_content: 'After deletion, all application templates in this category will also be deleted.', + panel_position: 'Panel position', + panel_name: 'Panel name', + dataset_group_position: 'Dataset group position', + dataset_group_name: 'Dataset name', + datasource_info: 'Datasource info', + datasource: 'Datasource', + dataset_group: 'Dataset group', + panel: 'Panel', + log_delete_tips: 'Are you sure to delete this application record?', + log_resource_delete_tips: 'Delete related resources (irrecoverable after deletion)' + + }, + <<<<<<< pr@dev@fix_oidc_exit_error app_group_delete_content: 'After deletion, all application templates in this category will also be deleted.' }, logout: { diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 3e41d495c2..b3fe7c44dd 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -2626,8 +2626,21 @@ export default { search_by_keyword: '通過關鍵字搜索', apply_logs: '應用記錄', app_group_delete_tips: '確定刪除該應用分類嗎?', - app_group_delete_content: '刪除後,該分類中所有的應用模闆也將被刪除。' + + app_group_delete_content: '刪除後,該分類中所有的應用模板也將被刪除。', + panel_position: '儀表板位置', + panel_name: '儀表板名稱', + dataset_group_position: '數據集分組位置', + dataset_group_name: '數據集分組名稱', + datasource_info: '數據源信息', + datasource: '數據源', + dataset_group: '數據集分組', + panel: '儀表板', + log_delete_tips: '確定刪除該條應用記錄嗎?', + log_resource_delete_tips: '刪除相關資源(刪除後不可恢復)' + }, + logout: { oidc_logout_error: 'OIDC退出失敗,是否繼續退出DataEase?', cas_logout_error: 'CAS服務異常,請聯系管理員!' diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 851565d647..87bdeea425 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -2626,8 +2626,21 @@ export default { search_by_keyword: '通过关键字搜索', apply_logs: '应用记录', app_group_delete_tips: '确定删除该应用分类吗?', - app_group_delete_content: '删除后,该分类中所有的应用模板也将被删除。' + + app_group_delete_content: '删除后,该分类中所有的应用模板也将被删除。', + panel_position: '仪表板位置', + panel_name: '仪表板名称', + dataset_group_position: '数据集分组位置', + dataset_group_name: '数据集分组名称', + datasource_info: '数据源信息', + datasource: '数据源', + dataset_group: '数据集分组', + panel: '仪表板', + log_delete_tips: '确定删除该条应用记录吗?', + log_resource_delete_tips: '删除相关资源(删除后不可恢复)' + }, + logout: { oidc_logout_error: 'OIDC退出失败,是否继续退出DataEase?', cas_logout_error: 'CAS服务异常,请联系管理员!' diff --git a/frontend/src/views/chart/chart/util.js b/frontend/src/views/chart/chart/util.js index b5915a81da..a7bab92044 100644 --- a/frontend/src/views/chart/chart/util.js +++ b/frontend/src/views/chart/chart/util.js @@ -3218,3 +3218,5 @@ export function getRemark(chart) { } return remark } + +export const quotaViews = ['label', 'richTextView', 'text', 'gauge', 'liquid'] diff --git a/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue b/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue index cbdccb70cb..c094712188 100644 --- a/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue +++ b/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue @@ -175,7 +175,10 @@ :disabled="disableEditCompare" :command="beforeQuickCalc('setting')" >{{ $t('chart.yoy_label') }}... - {{ $t('chart.percent') }} + {{ $t('chart.percent') }} @@ -242,6 +245,7 @@ import { getItemType, getOriginFieldName } from '@/views/chart/components/drag-i import FieldErrorTips from '@/views/chart/components/drag-item/components/FieldErrorTips' import bus from '@/utils/bus' import { formatterItem } from '@/views/chart/chart/formatter' +import { quotaViews } from '@/views/chart/chart/util' export default { name: 'QuotaExtItem', @@ -277,7 +281,8 @@ export default { compareItem: compareItem, disableEditCompare: false, tagType: 'success', - formatterItem: formatterItem + formatterItem: formatterItem, + quotaViews: quotaViews } }, watch: { diff --git a/frontend/src/views/chart/components/drag-item/QuotaItem.vue b/frontend/src/views/chart/components/drag-item/QuotaItem.vue index 5843e847e6..f063550610 100644 --- a/frontend/src/views/chart/components/drag-item/QuotaItem.vue +++ b/frontend/src/views/chart/components/drag-item/QuotaItem.vue @@ -175,7 +175,10 @@ :disabled="disableEditCompare" :command="beforeQuickCalc('setting')" >{{ $t('chart.yoy_label') }}... - {{ $t('chart.percent') }} + {{ $t('chart.percent') }} @@ -242,6 +245,7 @@ import { getItemType, getOriginFieldName } from '@/views/chart/components/drag-i import FieldErrorTips from '@/views/chart/components/drag-item/components/FieldErrorTips' import bus from '@/utils/bus' import { formatterItem } from '@/views/chart/chart/formatter' +import { quotaViews } from '@/views/chart/chart/util' export default { name: 'QuotaItem', @@ -277,7 +281,8 @@ export default { compareItem: compareItem, disableEditCompare: false, tagType: 'success', - formatterItem: formatterItem + formatterItem: formatterItem, + quotaViews: quotaViews } }, watch: { diff --git a/frontend/src/views/chart/components/senior/AssistLine.vue b/frontend/src/views/chart/components/senior/AssistLine.vue index b0eef1e46a..0b9c24af06 100644 --- a/frontend/src/views/chart/components/senior/AssistLine.vue +++ b/frontend/src/views/chart/components/senior/AssistLine.vue @@ -51,7 +51,7 @@ :title="$t('chart.assist_line')" :visible="editLineDialog" :show-close="false" - width="70%" + width="1000px" class="dialog-css" > @@ -274,7 +274,7 @@ :title="$t('chart.threshold')" :visible="editTableThresholdDialog" :show-close="false" - width="50%" + width="800px" class="dialog-css" append-to-body > diff --git a/frontend/src/views/chart/components/senior/dialog/AssistLineEdit.vue b/frontend/src/views/chart/components/senior/dialog/AssistLineEdit.vue index 21e133f793..655a2a4a7c 100644 --- a/frontend/src/views/chart/components/senior/dialog/AssistLineEdit.vue +++ b/frontend/src/views/chart/components/senior/dialog/AssistLineEdit.vue @@ -17,6 +17,7 @@ diff --git a/frontend/src/views/chart/components/senior/dialog/TableThresholdEdit.vue b/frontend/src/views/chart/components/senior/dialog/TableThresholdEdit.vue index 073dfdee8b..119bd29ce7 100644 --- a/frontend/src/views/chart/components/senior/dialog/TableThresholdEdit.vue +++ b/frontend/src/views/chart/components/senior/dialog/TableThresholdEdit.vue @@ -100,6 +100,7 @@ v-show="!item.term.includes('null') && !item.term.includes('empty') && item.term !== 'between'" v-model="item.value" class="value-item" + style="margin-left: 10px;" :placeholder="$t('chart.drag_block_label_value')" size="mini" clearable diff --git a/frontend/src/views/chart/components/shape-attr/SizeSelector.vue b/frontend/src/views/chart/components/shape-attr/SizeSelector.vue index d94b954a9a..4612570507 100644 --- a/frontend/src/views/chart/components/shape-attr/SizeSelector.vue +++ b/frontend/src/views/chart/components/shape-attr/SizeSelector.vue @@ -541,97 +541,99 @@ @change="changeBarSizeCase('dimensionShow')" >{{ $t('chart.show') }} - - + - - - - - + + + + - - - - - {{ $t('chart.italic') }} - {{ $t('chart.bolder') }} - - - + + + + - {{ $t('chart.italic') }} + {{ $t('chart.bolder') }} + + + + + + + + {{ $t('chart.font_shadow') }} + + + + - - - - {{ $t('chart.font_shadow') }} - - - - - + +
{{ $t('chart.show') }} - - + - - - - - + + + + - - - - - {{ $t('chart.italic') }} - {{ $t('chart.bolder') }} - - - + + + + - {{ $t('chart.italic') }} + {{ $t('chart.bolder') }} + + + + + + + + {{ $t('chart.font_shadow') }} + + + + - - - - {{ $t('chart.font_shadow') }} - - - - - + + -1) { + ele.compareCalc = compareItem + ele.formatterCfg.type = 'auto' + } }) if (view.type === 'chart-mix') { view.yaxisExt.forEach(function(ele) { @@ -2121,6 +2125,10 @@ export default { if (!ele.compareCalc) { ele.compareCalc = compareItem } + if (quotaViews.indexOf(view.type) > -1) { + ele.compareCalc = compareItem + ele.formatterCfg.type = 'auto' + } }) } view.extStack.forEach(function(ele) { diff --git a/frontend/src/views/panel/appTemplate/AppTemplateContent.vue b/frontend/src/views/panel/appTemplate/AppTemplateContent.vue new file mode 100644 index 0000000000..72875f60ce --- /dev/null +++ b/frontend/src/views/panel/appTemplate/AppTemplateContent.vue @@ -0,0 +1,534 @@ + + + + + diff --git a/frontend/src/views/panel/appTemplate/component/AppTemplateApply.vue b/frontend/src/views/panel/appTemplate/component/AppTemplateApply.vue new file mode 100644 index 0000000000..b3cf4cffac --- /dev/null +++ b/frontend/src/views/panel/appTemplate/component/AppTemplateApply.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/frontend/src/views/panel/appTemplate/component/TemplateItem.vue b/frontend/src/views/panel/appTemplate/component/TemplateItem.vue index b86fbee65c..d6674d4172 100644 --- a/frontend/src/views/panel/appTemplate/component/TemplateItem.vue +++ b/frontend/src/views/panel/appTemplate/component/TemplateItem.vue @@ -12,7 +12,10 @@ alt="" > -
+
- {{ $t("commons.update") }} + {{ $t('commons.update') }} - {{ $t("commons.uninstall") }} + {{ $t('commons.uninstall') }}
+ +
+ + + + {{ model.name }} + + + + {{ $t('panel.preview') }} + + {{ $t('panel.apply') }} + + + +
- diff --git a/frontend/src/views/panel/appTemplateMarket/component/AppMarketPreview.vue b/frontend/src/views/panel/appTemplateMarket/component/AppMarketPreview.vue new file mode 100644 index 0000000000..6b66c30e74 --- /dev/null +++ b/frontend/src/views/panel/appTemplateMarket/component/AppMarketPreview.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/frontend/src/views/panel/appTemplateMarket/index.vue b/frontend/src/views/panel/appTemplateMarket/index.vue index d259e822d7..de50d714fd 100644 --- a/frontend/src/views/panel/appTemplateMarket/index.vue +++ b/frontend/src/views/panel/appTemplateMarket/index.vue @@ -1,12 +1,11 @@ @@ -139,16 +120,18 @@ import { searchAppTemplate } from '@/api/appTemplateMarket' import { groupTree, panelSave } from '@/api/panel/panel' import { DEFAULT_COMMON_CANVAS_STYLE_STRING } from '@/views/panel/panel' -import MarketPreview from '@/views/panel/appTemplateMarket/component/MarketPreview' import elementResizeDetectorMaker from 'element-resize-detector' -import AppTemplateItem from '@/views/panel/appTemplateMarket/component/AppTemplateItem' import AppTemplateLog from '@/views/panel/appTemplateMarket/log' +import AppTemplateContent from '@/views/panel/appTemplate/AppTemplateContent' +import AppMarketPreview from '@/views/panel/appTemplateMarket/component/AppMarketPreview' +import AppTemplateApply from '@/views/panel/appTemplate/component/AppTemplateApply' export default { name: 'AppTemplateMarket', - components: { AppTemplateLog, AppTemplateItem, MarketPreview }, + components: { AppTemplateApply, AppMarketPreview, AppTemplateContent, AppTemplateLog }, data() { return { + previewItem: null, hasResult: true, templateMiniWidth: 330, templateCurWidth: 310, @@ -194,11 +177,8 @@ export default { } } }, - computed: { - - }, - watch: { - }, + computed: {}, + watch: {}, mounted() { this.initMarketTemplate() this.getGroupTree() @@ -215,6 +195,24 @@ export default { }) }, methods: { + applyNew(item) { + const datasourceInfo = JSON.parse(item.datasourceInfo)[0] + const param = { + datasourceType: datasourceInfo.type, + appTemplateId: item.id, + appTemplateName: item.name, + panelName: item.name, + datasetGroupName: item.name + } + this.$refs.templateApply.init(param) + }, + appApply() { + this.applyNew(this.previewItem) + }, + previewApp(item) { + this.previewModel = true + this.previewItem = item + }, initMarketTemplate() { searchAppTemplate({ nodeType: 'folder' }).then(rsp => { this.currentAppShowList = rsp.data @@ -280,109 +278,120 @@ export default { diff --git a/frontend/src/views/panel/appTemplateMarket/log/index.vue b/frontend/src/views/panel/appTemplateMarket/log/index.vue index 5b0dbc0b45..fb000a9004 100644 --- a/frontend/src/views/panel/appTemplateMarket/log/index.vue +++ b/frontend/src/views/panel/appTemplateMarket/log/index.vue @@ -10,7 +10,8 @@ type="primary" icon="el-icon-plus" @click="applyNew()" - >{{ $t('commons.create') }} + >{{ $t('commons.create') }} +   {{ $t("user.filter") - }} + >{{ + $t('user.filter') + }} + @@ -45,7 +48,7 @@ class="filter-texts" > {{ paginationConfig.total }} - {{ $t("user.result_one") }} + {{ $t('user.result_one') }} {{ $t("user.clear_filter") }} + >{{ $t('user.clear_filter') }} +
+ :label="$t('app_template.panel')" + > + + {{ scope.row.applyTime | timestampFormatDate }} + + +
@@ -132,6 +176,39 @@ @search="filterDraw" /> + + + + + + + + + {{ $t('app_template.log_resource_delete_tips') }} + + + {{ $t('commons.cancel') }} + {{ $t('commons.confirm') }} + + @@ -144,10 +221,13 @@ import { addOrder, formatOrders } from '@/utils/index' -import { logGrid } from '@/api/appTemplateMarket/log' +import { deleteLogAndResource, logGrid } from '@/api/appTemplateMarket/log' +import { findOneWithParent } from '@/api/panel/panel' +import AppTemplateApply from '@/views/panel/appTemplate/component/AppTemplateApply' + export default { name: 'AppTemplateLog', - components: { GridTable, filterUser }, + components: { AppTemplateApply, GridTable, filterUser }, mixins: [keyEnter], props: { appTemplateId: { @@ -162,6 +242,12 @@ export default { }, data() { return { + optShow: false, + deleteConfirmDialog: false, + deleteItemInfo: { + deleteResource: false + }, + operateWidth: 168, columns: [], paginationConfig: { currentPage: 1, @@ -194,6 +280,56 @@ export default { this.resizeObserver() }, methods: { + closeDel() { + this.deleteItemInfo = { + deleteResource: false + } + this.deleteConfirmDialog = false + }, + confirmDel() { + deleteLogAndResource(this.deleteItemInfo).then(() => { + this.closeDel() + this.search() + }) + }, + closeDraw() { + this.search() + }, + editApply(item) { + const param = { + datasourceType: item.datasourceType, + logId: item.id, + panelId: item.panelId, + panelGroupPid: item.panelGroupPid, + datasourceId: item.datasourceId, + datasetGroupPid: item.datasetGroupPid, + datasetGroupId: item.datasetGroupId, + datasetGroupName: item.datasetGroupName, + panelName: item.panelName, + datasourcePrivileges: item.datasourcePrivileges, + panelPrivileges: item.panelPrivileges, + datasetPrivileges: item.datasetPrivileges + } + this.$refs.templateEditApply.init(param) + }, + goToDatasource(row) { + + }, + goPanel(row) { + findOneWithParent(row.panelId).then(rsp => { + this.$router.push({ name: 'panel', params: rsp.data }) + }) + }, + edit() { + + }, + del(item) { + this.deleteItemInfo = { + ...item, + deleteResource: false + } + this.deleteConfirmDialog = true + }, applyNew() { this.$emit('applyNew') }, @@ -289,6 +425,11 @@ export default { logGrid(currentPage, pageSize, param).then((response) => { this.data = response.data.listObject this.paginationConfig.total = response.data.itemCount + const _this = this + _this.optShow = false + this.$nextTick(() => { + _this.optShow = true + }) }) } } @@ -302,4 +443,13 @@ export default { .table-container-filter { height: calc(100% - 110px); } + +.link-span { + color: #3370FF; + cursor: pointer; + + &:hover { + text-decoration: underline; + } +} diff --git a/frontend/src/views/panel/edit/ComponentWait.vue b/frontend/src/views/panel/edit/ComponentWait.vue index cc7ace5ece..3434a4b07a 100644 --- a/frontend/src/views/panel/edit/ComponentWait.vue +++ b/frontend/src/views/panel/edit/ComponentWait.vue @@ -6,7 +6,7 @@ @@ -466,6 +467,13 @@ + + @@ -519,10 +527,12 @@ import { listenGlobalKeyDown } from '@/components/canvas/utils/shortcutKey' import { adaptCurThemeCommonStyle } from '@/components/canvas/utils/style' import eventBus from '@/components/canvas/utils/eventBus' import DeCanvas from '@/components/canvas/DeCanvas' +import TextAttr from '@/components/canvas/components/TextAttr' export default { name: 'PanelEdit', components: { + TextAttr, DeCanvas, Multiplexing, ChartStyleBatchSet, @@ -811,8 +821,8 @@ export default { }, initEvents() { bus.$on('component-on-drag', this.componentOnDrag) - // bus.$on('component-dialog-edit', this.editDialog) - // bus.$on('button-dialog-edit', this.editButtonDialog) + bus.$on('component-dialog-edit', this.editDialog) + bus.$on('button-dialog-edit', this.editButtonDialog) bus.$on('component-dialog-style', this.componentDialogStyle) bus.$on('previewFullScreenClose', this.previewFullScreenClose) bus.$on('change_panel_right_draw', this.changeRightDrawOpen) @@ -1309,9 +1319,9 @@ export default { // 打开属性栏 bus.$emit('change_panel_right_draw', true) }, - canvasScroll(event) { - this.scrollLeft = event.target.scrollLeft - this.scrollTop = event.target.scrollTop + canvasScroll(scrollInfo) { + this.scrollLeft = scrollInfo.scrollLeft + this.scrollTop = scrollInfo.scrollTop bus.$emit('onScroll') }, destroyTimeMachine() { @@ -1501,6 +1511,7 @@ export default { color: gray; height: 30px; width: 100%; + text-align: center; } .this_mobile_canvas_bottom { diff --git a/frontend/src/views/panel/list/PanelList.vue b/frontend/src/views/panel/list/PanelList.vue index a3b9b0d2e9..671f996f94 100644 --- a/frontend/src/views/panel/list/PanelList.vue +++ b/frontend/src/views/panel/list/PanelList.vue @@ -199,7 +199,7 @@ :command="beforeClickEdit('folder', 'new', data, node)" > - {{ $t('panel.groupAdd') }} + {{ $t('panel.groupAdd') }} {{ $t('panel.export_to_img') }} + {{ $t('panel.export_to_app') }} @@ -304,6 +308,7 @@ export default { }, data() { return { + canvasInfoTemp: 'preview-temp-canvas-main', canvasId: 'canvas-main', showMain: true, pdfTemplateSelectedIndex: 0, @@ -405,7 +410,7 @@ export default { saveToTemplate() { this.dataLoading = true setTimeout(() => { - html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => { + html2canvas(document.getElementById(this.canvasInfoTemp)).then(canvas => { this.templateSaveShow = true this.dataLoading = false const snapshot = canvas.toDataURL('image/jpeg', 0.1) // 0.2是图片质量 @@ -430,7 +435,7 @@ export default { _this.dataLoading = true try { _this.findStaticSource(function(staticResource) { - html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => { + html2canvas(document.getElementById(_this.canvasInfoTemp)).then(canvas => { _this.dataLoading = false const snapshot = canvas.toDataURL('image/jpeg', 0.1) // 0.1是图片质量 if (snapshot !== '') { @@ -458,9 +463,9 @@ export default { _this.dataLoading = true try { _this.findStaticSource(function(staticResource) { - html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => { + html2canvas(document.getElementById(_this.canvasInfoTemp)).then(canvas => { _this.dataLoading = false - const snapshot = canvas.toDataURL('image/jpeg', 0.1) // 0.1是图片质量 + const snapshot = canvas.toDataURL('image/jpeg', 1) // 0.1是图片质量 if (snapshot !== '') { const panelInfo = { name: _this.$store.state.panel.panelInfo.name, @@ -528,7 +533,7 @@ export default { setTimeout(() => { this.exporting = true setTimeout(() => { - const canvasID = document.getElementById('canvasInfoTemp') + const canvasID = document.getElementById(this.canvasInfoTemp) const a = document.createElement('a') html2canvas(canvasID).then(canvas => { this.exporting = false @@ -559,7 +564,7 @@ export default { setTimeout(() => { this.exporting = true setTimeout(() => { - html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => { + html2canvas(document.getElementById(this.canvasInfoTemp)).then(canvas => { const snapshot = canvas.toDataURL('image/jpeg', 1) // 是图片质量 this.dataLoading = false this.exporting = false @@ -573,7 +578,7 @@ export default { }, refreshTemplateInfo() { this.templateInfo = {} - html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => { + html2canvas(document.getElementById(this.canvasInfoTemp)).then(canvas => { const snapshot = canvas.toDataURL('image/jpeg', 0.1) // 0.2是图片质量 if (snapshot !== '') { this.templateInfo = { @@ -623,7 +628,9 @@ export default { if (this.showType === 1 && this.shareUserId !== null) { const param = { userId: this.shareUserId } proxyInitPanelData(this.panelInfo.id, param, null) - } else { initPanelData(this.panelInfo.id, false) } + } else { + initPanelData(this.panelInfo.id, false) + } }, changePublishState() { if (this.panelInfo.status === 'publish') { @@ -642,72 +649,76 @@ export default { diff --git a/frontend/src/views/system/datasource/DsForm.vue b/frontend/src/views/system/datasource/DsForm.vue index 96ca0ac5f0..b3aa91b2dc 100644 --- a/frontend/src/views/system/datasource/DsForm.vue +++ b/frontend/src/views/system/datasource/DsForm.vue @@ -1,9 +1,12 @@ @@ -167,6 +303,10 @@ import PluginCom from '@/views/system/plugin/PluginCom' import { listDatasourceType, listDatasource } from '@/api/system/datasource' import deTextarea from '@/components/deCustomCm/deTextarea.vue' import msgCfm from '@/components/msgCfm' +import { dsGroupTree } from '@/api/dataset/dataset' +import { appApply, appEdit, groupTree } from '@/api/panel/panel' +import { deepCopy } from '@/components/canvas/utils/utils' + export default { name: 'DsForm', components: { @@ -175,8 +315,51 @@ export default { deTextarea }, mixins: [msgCfm], + props: { + referencePosition: { + type: String, + default: 'datasource' + }, + outerParams: { + type: Object, + request: false + } + }, data() { return { + appMarketEdit: true, + attachRule: { + panelName: [ + { + required: true, + min: 2, + max: 25, + message: i18n.t('datasource.input_limit_2_25', [2, 25]), + trigger: 'blur' + } + ], + datasetGroupName: [ + { + required: true, + min: 2, + max: 25, + message: i18n.t('datasource.input_limit_2_25', [2, 25]), + trigger: 'blur' + } + ], + datasetGroupPid: [{ required: true, message: i18n.t('chart.select_group'), trigger: 'blur' }], + panelGroupPid: [{ required: true, message: i18n.t('chart.select_group'), trigger: 'blur' }] + }, + panelGroupList: [], + datasetGroupList: [], + attachForm: { + appTemplateId: '', + panelGroupPid: null, + panelName: '', + datasetGroupPid: null, + datasetGroupId: null, + datasetGroupName: '' + }, disabled: false, form: { configuration: { @@ -402,8 +585,30 @@ export default { async created() { await this.datasourceTypes() this.queryTreeData() - const { id, showModel, type, name } = this.$route.query + let { id, showModel, type, name } = this.$route.query this.params = this.$route.query + if (this.positionCheck('appMarket')) { + id = this.outerParams.datasourceId + showModel = this.outerParams.showModel + type = this.outerParams.datasourceType + name = this.outerParams.name + this.attachForm.appTemplateId = this.outerParams.appTemplateId + this.attachForm.panelGroupPid = this.outerParams.panelGroupPid + this.attachForm.panelId = this.outerParams.panelId + this.attachForm.panelName = this.outerParams.panelName + this.attachForm.datasetGroupPid = this.outerParams.datasetGroupPid ? this.outerParams.datasetGroupPid : '0' + this.attachForm.datasetGroupId = this.outerParams.datasetGroupId + this.attachForm.datasetGroupName = this.outerParams.datasetGroupName + this.params = { + id: this.outerParams.datasourceId, + showModel: this.outerParams.showModel, + type: this.outerParams.datasourceType, + name: this.outerParams.name, + privileges: this.outerParams.datasourcePrivileges + } + this.getPanelGroupTree() + this.getDatasetGroupTree() + } if (id) { await this.getDatasourceDetail(id, showModel) this.edit(this.params) @@ -420,6 +625,36 @@ export default { this.disabled = Boolean(id) && showModel === 'show' && !this.canEdit }, methods: { + normalizer(node) { + // 去掉children=null的属性 + if (node.children === null || node.children === 'null') { + delete node.children + } + }, + getDatasetGroupTree() { + dsGroupTree({ nodeType: 'group', excludedId: this.attachForm.datasetGroupId }).then(res => { + this.datasetGroupList = [{ + id: '0', + name: this.$t('dataset.dataset_group'), + label: this.$t('dataset.dataset_group'), + pid: '0', + privileges: 'grant,manage,use', + type: 'group', + children: res.data + }] + }) + }, + getPanelGroupTree() { + groupTree({ nodeType: 'folder' }).then(res => { + this.panelGroupList = res.data + if (!this.attachForm.panelGroupPid && this.panelGroupList && this.panelGroupList.length > 0) { + this.attachForm.panelGroupPid = this.panelGroupList[0].id + } + }) + }, + positionCheck(referencePosition) { + return this.referencePosition === referencePosition + }, datasourceTypes() { return listDatasourceType().then((res) => { this.dsTypes = res.data || [] @@ -569,7 +804,7 @@ export default { if ( configuration.host === this.form.configuration.host && configuration.dataBase === - this.form.configuration.dataBase && + this.form.configuration.dataBase && configuration.port === this.form.configuration.port ) { repeat = true @@ -584,7 +819,7 @@ export default { if ( configuration.host === this.form.configuration.host && configuration.dataBase === - this.form.configuration.dataBase && + this.form.configuration.dataBase && configuration.port === this.form.configuration.port && configuration.schema === this.form.configuration.schema ) { @@ -621,7 +856,7 @@ export default { configuration.schema === this.form.configuration.schema && configuration.host === this.form.configuration.host && configuration.dataBase === - this.form.configuration.dataBase && + this.form.configuration.dataBase && configuration.port === this.form.configuration.port ) { repeat = true @@ -631,7 +866,7 @@ export default { if ( configuration.host === this.form.configuration.host && configuration.dataBase === - this.form.configuration.dataBase && + this.form.configuration.dataBase && configuration.port === this.form.configuration.port ) { repeat = true @@ -656,11 +891,20 @@ export default { if (!status) { return } + if (this.positionCheck('appMarket')) { + this.$refs.attachParamsForm.validate(valid => { + if (!valid) { + return false + } + } + ) + } this.$refs.dsForm.validate((valid) => { if (!valid) { return false } - const method = this.formType === 'add' ? addDs : editDs + let method = this.formType === 'add' ? addDs : editDs + const form = JSON.parse(JSON.stringify(this.form)) if (form.type === 'api') { if (this.form.apiConfiguration.length < 1) { @@ -674,17 +918,29 @@ export default { } else { form.configuration = JSON.stringify(form.configuration) } + const isAppMarket = this.positionCheck('appMarket') + let appApplyForm + if (isAppMarket) { + if (typeof form.desc === 'object') { + form.desc = '' + } + appApplyForm = { + ...this.attachForm, + datasourceList: [deepCopy(form)] + } + method = this.formType === 'add' ? appApply : appEdit + } if ( this.formType === 'modify' && this.originConfiguration !== form.configuration ) { - if (repeat) { + if (repeat && !isAppMarket) { $confirm( i18n.t('datasource.repeat_datasource_msg') + - '[' + - repeatDsName.join(',') + - '], ' + - i18n.t('datasource.confirm_save'), + '[' + + repeatDsName.join(',') + + '], ' + + i18n.t('datasource.confirm_save'), () => { $confirm(i18n.t('datasource.edit_datasource_msg'), () => { this.method(method, form) @@ -693,27 +949,40 @@ export default { ) } else { $confirm(i18n.t('datasource.edit_datasource_msg'), () => { - this.method(method, form) + isAppMarket ? this.appApplyMethod(method, appApplyForm) : this.method(method, form) }) } return } - if (repeat) { + if (repeat && !isAppMarket) { $confirm( i18n.t('datasource.repeat_datasource_msg') + - '[' + - repeatDsName.join(',') + - '], ' + - i18n.t('datasource.confirm_save'), + '[' + + repeatDsName.join(',') + + '], ' + + i18n.t('datasource.confirm_save'), () => { this.method(method, form) } ) } else { - this.method(method, form) + isAppMarket ? this.appApplyMethod(method, appApplyForm) : this.method(method, form) } }) }, + appApplyMethod(method, form) { + this.formLoading = true + method(form).then((res) => { + this.$success(i18n.t('commons.save_success')) + if (this.formType === 'add') { + this.$router.push({ name: 'panel', params: res.data }) + } else { + this.closeDraw() + } + }).finally(() => { + this.formLoading = false + }) + }, method(method, form) { this.formLoading = true method(form).then((res) => { @@ -767,6 +1036,14 @@ export default { if (!status) { return } + if (this.positionCheck('appMarket')) { + this.$refs.attachParamsForm.validate(valid => { + if (!valid) { + return false + } + } + ) + } this.$refs.dsForm.validate((valid) => { if (valid) { const data = JSON.parse(JSON.stringify(this.form)) @@ -844,6 +1121,10 @@ export default { backToList() { this.$router.push('/datasource/index') }, + + closeDraw() { + this.$emit('closeDraw') + }, logOutTips() { const options = { title: 'role.tips', @@ -967,21 +1248,47 @@ export default { } }) }, - handleClick(tab, event) {} + handleClick(tab, event) { + } } }