diff --git a/backend/src/main/java/io/dataease/commons/constants/SysLogConstants.java b/backend/src/main/java/io/dataease/commons/constants/SysLogConstants.java index 69cbc00165..dd1508ef07 100644 --- a/backend/src/main/java/io/dataease/commons/constants/SysLogConstants.java +++ b/backend/src/main/java/io/dataease/commons/constants/SysLogConstants.java @@ -26,9 +26,11 @@ public class SysLogConstants { LOGIN(12, "OPERATE_TYPE_LOGIN"), - VIEW(13, "OPERATE_TYPE_VIEW"), + PC_VIEW(13, "OPERATE_TYPE_PC_VIEW"), - EXPORT(14, "OPERATE_TYPE_EXPORT"); + MB_VIEW(14, "OPERATE_TYPE_MB_VIEW"), + + EXPORT(15, "OPERATE_TYPE_EXPORT"); private Integer value; private String name; OPERATE_TYPE(Integer value, String name) { 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 4b315e3fd9..fd2c029ae3 100644 --- a/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java +++ b/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java @@ -7,7 +7,7 @@ import io.dataease.auth.annotation.DePermissions; import io.dataease.auth.service.impl.ExtAuthServiceImpl; import io.dataease.commons.constants.PanelConstants; import io.dataease.controller.request.panel.PanelGroupBaseInfoRequest; -import io.dataease.plugins.common.base.domain.PanelGroup; +import io.dataease.controller.request.panel.PanelViewLogRequest; import io.dataease.commons.constants.DePermissionType; import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.controller.handler.annotation.I18n; @@ -131,13 +131,20 @@ public class PanelGroupController { return panelGroupService.queryPanelComponents(id); } - @ApiOperation("导出仪表板视图明细") + @ApiOperation("公共连接导出仪表板视图明细") @PostMapping("/exportDetails") @I18n public void exportDetails(@RequestBody PanelViewDetailsRequest request, HttpServletResponse response) throws IOException { panelGroupService.exportPanelViewDetails(request, response); } + @ApiOperation("站内导出仪表板视图明细") + @PostMapping("/innerExportDetails") + @I18n + public void innerExportDetails(@RequestBody PanelViewDetailsRequest request, HttpServletResponse response) throws IOException { + panelGroupService.exportPanelViewDetails(request, response); + } + @ApiOperation("更新仪表板状态") @PostMapping("/updatePanelStatus/{panelId}") @I18n @@ -172,4 +179,10 @@ public class PanelGroupController { public void removePanelCache(@PathVariable String panelId){ panelGroupService.removePanelCache(panelId); } + + @ApiIgnore + @PostMapping("/viewLog") + public void viewLog(@RequestBody PanelViewLogRequest request) { + panelGroupService.viewLog(request); + } } diff --git a/backend/src/main/java/io/dataease/controller/request/panel/PanelViewDetailsRequest.java b/backend/src/main/java/io/dataease/controller/request/panel/PanelViewDetailsRequest.java index 841ff36e8b..2523167f11 100644 --- a/backend/src/main/java/io/dataease/controller/request/panel/PanelViewDetailsRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/panel/PanelViewDetailsRequest.java @@ -12,6 +12,8 @@ import java.util.List; @Data public class PanelViewDetailsRequest { + private String viewId; + private String viewName; private String[] header; diff --git a/backend/src/main/java/io/dataease/controller/request/panel/PanelViewLogRequest.java b/backend/src/main/java/io/dataease/controller/request/panel/PanelViewLogRequest.java new file mode 100644 index 0000000000..a685074dd9 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/request/panel/PanelViewLogRequest.java @@ -0,0 +1,12 @@ +package io.dataease.controller.request.panel; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class PanelViewLogRequest implements Serializable { + private String panelId; + + private Boolean mobile = false; +} 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 4f5832dddf..721354df67 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -6,9 +6,9 @@ import io.dataease.commons.constants.*; import io.dataease.commons.utils.*; import io.dataease.controller.request.authModel.VAuthModelRequest; import io.dataease.controller.request.dataset.DataSetTableRequest; -import io.dataease.controller.request.panel.PanelGroupBaseInfoRequest; -import io.dataease.controller.request.panel.PanelGroupRequest; -import io.dataease.controller.request.panel.PanelViewDetailsRequest; + +import io.dataease.controller.request.panel.*; + import io.dataease.dto.PanelGroupExtendDataDTO; import io.dataease.dto.SysLogDTO; import io.dataease.dto.authModel.VAuthModelDTO; @@ -620,6 +620,12 @@ public class PanelGroupService { } catch (Exception e) { DataEaseException.throwException(e); } + if (ObjectUtils.isNotEmpty(AuthUtils.getUser())) { + String viewId = request.getViewId(); + ChartViewWithBLOBs chartViewWithBLOBs = chartViewService.get(viewId); + String pid = chartViewWithBLOBs.getSceneId(); + DeLogUtils.save(SysLogConstants.OPERATE_TYPE.EXPORT, SysLogConstants.SOURCE_TYPE.VIEW, viewId,pid, null, null); + } } public void updatePanelStatus(String panelId, PanelGroupBaseInfoRequest request) { @@ -681,4 +687,15 @@ public class PanelGroupService { Object cache = CacheUtils.get(cacheName,cacheId); return cache!=null; } + + public void viewLog(PanelViewLogRequest request) { + String panelId = request.getPanelId(); + Boolean mobile = request.getMobile(); + PanelGroupWithBLOBs panel = panelGroupMapper.selectByPrimaryKey(panelId); + SysLogConstants.OPERATE_TYPE operateType = SysLogConstants.OPERATE_TYPE.PC_VIEW; + if (mobile) { + operateType = SysLogConstants.OPERATE_TYPE.MB_VIEW; + } + DeLogUtils.save(operateType, sourceType, panelId, panel.getPid(), null, null); + } } diff --git a/backend/src/main/java/io/dataease/service/sys/log/LogService.java b/backend/src/main/java/io/dataease/service/sys/log/LogService.java index f4fbc4ebeb..3838bb7b47 100644 --- a/backend/src/main/java/io/dataease/service/sys/log/LogService.java +++ b/backend/src/main/java/io/dataease/service/sys/log/LogService.java @@ -179,9 +179,43 @@ public class LogService { userLogin.setName(Translator.get(operateTypeName) + Translator.get(sourceTypeName)); results.add(userLogin); + List folderItems = viewPanelTypes(); + results.addAll(folderItems); + results.addAll(viewRelativeTypes()); return results; } + private List viewRelativeTypes() { + Integer[] opTypes = new Integer[]{15}; + Integer[] sourceTypes = new Integer[]{4}; + return typesByArr(opTypes, sourceTypes); + } + + private List typesByArr(Integer[] opTypes, Integer[] sourceTypes) { + List results = new ArrayList<>(); + for (int i = 0; i < sourceTypes.length; i++) { + Integer sourceVal = sourceTypes[i]; + String sourceTypeName = SysLogConstants.sourceTypeName(sourceVal); + + for (int j = 0; j < opTypes.length; j++) { + + Integer operateVal = opTypes[j]; + + String operateTypeName = SysLogConstants.operateTypeName(operateVal); + FolderItem folderItem = new FolderItem(); + folderItem.setId(operateVal + "-" + sourceVal); + folderItem.setName(Translator.get(operateTypeName) + Translator.get(sourceTypeName)); + results.add(folderItem); + } + } + return results; + } + private List viewPanelTypes () { + Integer[] opTypes = new Integer[]{13, 14}; + Integer[] sourceTypes = new Integer[]{3}; + return typesByArr(opTypes, sourceTypes); + } + public SysLogGridDTO convertDTO(SysLogWithBLOBs vo) { SysLogGridDTO sysLogGridDTO = new SysLogGridDTO(); sysLogGridDTO.setOpType(SysLogConstants.operateTypeName(vo.getOperateType())); diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index d14d00dabc..2f5afb2967 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -143,6 +143,9 @@ OPERATE_TYPE_DELETELINK=Delete Link OPERATE_TYPE_MODIFYLINK=Modify Link OPERATE_TYPE_UPLOADFILE=Upload OPERATE_TYPE_LOGIN=Login +OPERATE_TYPE_PC_VIEW=View with pc +OPERATE_TYPE_MB_VIEW=View with mobile device +OPERATE_TYPE_EXPORT=Export SOURCE_TYPE_DATASOURCE=DATASOURCE SOURCE_TYPE_DATASET=DATASET diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 39c4733993..00a0f7d2fd 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -141,6 +141,9 @@ OPERATE_TYPE_DELETELINK=\u5220\u9664\u516C\u5171\u94FE\u63A5 OPERATE_TYPE_MODIFYLINK=\u4FEE\u6539\u516C\u5171\u94FE\u63A5 OPERATE_TYPE_UPLOADFILE=\u4E0A\u4F20 OPERATE_TYPE_LOGIN=\u767B\u5F55 +OPERATE_TYPE_PC_VIEW=\u4F7F\u7528PC\u67E5\u770B +OPERATE_TYPE_MB_VIEW=\u4F7F\u7528\u79FB\u52A8\u7AEF\u67E5\u770B +OPERATE_TYPE_EXPORT=\u5BFC\u51FA SOURCE_TYPE_DATASOURCE=\u6570\u636E\u6E90 SOURCE_TYPE_DATASET=\u6570\u636E\u96C6 diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index f113a7e01f..41b412d5e8 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -142,6 +142,9 @@ OPERATE_TYPE_DELETELINK=\u522A\u9664\u516C\u5171\u93C8\u63A5 OPERATE_TYPE_MODIFYLINK=\u4FEE\u6539\u516C\u5171\u93C8\u63A5 OPERATE_TYPE_UPLOADFILE=\u4E0A\u50B3 OPERATE_TYPE_LOGIN=\u767B\u9304 +OPERATE_TYPE_PC_VIEW=\u4F7F\u7528PC\u67E5\u770B +OPERATE_TYPE_MB_VIEW=\u4F7F\u7528\u79FB\u52D5\u7AEF\u67E5\u770B +OPERATE_TYPE_EXPORT=\u5C0E\u51FA SOURCE_TYPE_DATASOURCE=\u6578\u64DA\u6E90 SOURCE_TYPE_DATASET=\u6578\u64DA\u96C6 diff --git a/frontend/src/api/panel/panel.js b/frontend/src/api/panel/panel.js index e5e92583e7..de63eb6380 100644 --- a/frontend/src/api/panel/panel.js +++ b/frontend/src/api/panel/panel.js @@ -90,6 +90,15 @@ export function findOne(id) { }) } +export function viewPanelLog(data) { + return request({ + url: 'panel/group/viewLog', + method: 'post', + loading: true, + data + }) +} + export function getTable(id) { return request({ url: '/panel/table/get/' + id, @@ -224,6 +233,16 @@ export function exportDetails(data) { }) } +export function innerExportDetails(data) { + return request({ + url: 'panel/group/innerExportDetails', + method: 'post', + data: data, + loading: true, + responseType: 'blob' + }) +} + export function updatePanelStatus(panelId, param) { return request({ url: '/panel/group/updatePanelStatus/' + panelId, diff --git a/frontend/src/components/canvas/custom-component/UserViewDialog.vue b/frontend/src/components/canvas/custom-component/UserViewDialog.vue index 5905c74d75..2500116f40 100644 --- a/frontend/src/components/canvas/custom-component/UserViewDialog.vue +++ b/frontend/src/components/canvas/custom-component/UserViewDialog.vue @@ -10,7 +10,7 @@ :chart="mapChart || chart" class="chart-class" /> - + @@ -38,10 +38,11 @@ import ChartComponentG2 from '@/views/chart/components/ChartComponentG2' import PluginCom from '@/views/system/plugin/PluginCom' import ChartComponentS2 from '@/views/chart/components/ChartComponentS2' import LabelNormalText from '@/views/chart/components/normal/LabelNormalText' -import { exportDetails } from '@/api/panel/panel' +import { exportDetails, innerExportDetails } from '@/api/panel/panel' import html2canvas from 'html2canvasde' import { hexColorToRGBA } from '@/views/chart/chart/util' import { deepCopy, exportImg } from '@/components/canvas/utils/utils' +import { getLinkToken, getToken } from '@/utils/auth' export default { name: 'UserViewDialog', components: { LabelNormalText, ChartComponentS2, ChartComponentG2, DeMainContainer, DeContainer, DeAsideContainer, ChartComponent, TableNormal, LabelNormal, PluginCom }, @@ -187,6 +188,7 @@ export default { const excelData = JSON.parse(JSON.stringify(this.chart.data.tableRow)).map(item => excelHeaderKeys.map(i => item[i])) const excelName = this.chart.name const request = { + viewId: this.chart.id, viewName: excelName, header: excelHeader, details: excelData, @@ -195,7 +197,13 @@ export default { snapshotWidth: width, snapshotHeight: height } - exportDetails(request).then((res) => { + let method = innerExportDetails + const token = this.$store.getters.token || getToken() + const linkToken = this.$store.getters.linkToken || getLinkToken() + if (!token && linkToken) { + method = exportDetails + } + method(request).then((res) => { const blob = new Blob([res], { type: 'application/vnd.ms-excel' }) const link = document.createElement('a') link.style.display = 'none' diff --git a/frontend/src/views/panel/GrantAuth/shareTree.vue b/frontend/src/views/panel/GrantAuth/shareTree.vue index 052819a17a..e601263560 100644 --- a/frontend/src/views/panel/GrantAuth/shareTree.vue +++ b/frontend/src/views/panel/GrantAuth/shareTree.vue @@ -71,7 +71,7 @@