From f3413e91fac87b195f1884ec92c321e60e5a60b8 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Tue, 9 Jan 2024 17:08:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8F=AF=E8=A7=86=E5=8C=96=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=94=AF=E6=8C=81=E6=98=BE=E7=A4=BA=E6=B0=B4=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/MybatisPlusGenerator.java | 4 +- .../auto/entity/VisualizationWatermark.java | 94 +++++++++++++++++++ .../mapper/VisualizationWatermarkMapper.java | 18 ++++ .../server/DataVisualizationServer.java | 10 ++ core/core-frontend/src/api/user.ts | 2 - core/core-frontend/src/api/watermark.ts | 4 + .../src/assets/svg/watermark.svg | 1 + .../data-visualization/canvas/DePreview.vue | 44 +++++---- .../src/components/watermark/watermark.ts | 10 +- .../modules/data-visualization/dvMain.ts | 3 +- core/core-frontend/src/utils/canvasUtils.ts | 15 ++- .../visualization/vo/DataVisualizationVO.java | 5 + .../vo/VisualizationWatermarkVO.java | 80 ++++++++++++++++ .../main/java/io/dataease/utils/IPUtils.java | 54 +++++++++++ 14 files changed, 310 insertions(+), 34 deletions(-) create mode 100644 core/core-backend/src/main/java/io/dataease/visualization/dao/auto/entity/VisualizationWatermark.java create mode 100644 core/core-backend/src/main/java/io/dataease/visualization/dao/auto/mapper/VisualizationWatermarkMapper.java create mode 100644 core/core-frontend/src/api/watermark.ts create mode 100644 core/core-frontend/src/assets/svg/watermark.svg create mode 100644 sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/VisualizationWatermarkVO.java create mode 100644 sdk/common/src/main/java/io/dataease/utils/IPUtils.java 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 e518a888f6..51424d85aa 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 = "template"; + private static final String busi = "visualization"; /** * 这是要生成代码的表名称 */ - private static final String TABLE_NAME = "visualization_template_category_map"; + private static final String TABLE_NAME = "visualization_watermark"; /** * 下面两个配置基本上不用动 diff --git a/core/core-backend/src/main/java/io/dataease/visualization/dao/auto/entity/VisualizationWatermark.java b/core/core-backend/src/main/java/io/dataease/visualization/dao/auto/entity/VisualizationWatermark.java new file mode 100644 index 0000000000..8aac06961e --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/visualization/dao/auto/entity/VisualizationWatermark.java @@ -0,0 +1,94 @@ +package io.dataease.visualization.dao.auto.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; + +/** + *

+ * 仪表板水印设置表 + *

+ * + * @author fit2cloud + * @since 2024-01-09 + */ +@TableName("visualization_watermark") +public class VisualizationWatermark implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 版本号 + */ + private String version; + + /** + * 设置内容 + */ + private String settingContent; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Long createTime; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getSettingContent() { + return settingContent; + } + + public void setSettingContent(String settingContent) { + this.settingContent = settingContent; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "VisualizationWatermark{" + + "id = " + id + + ", version = " + version + + ", settingContent = " + settingContent + + ", createBy = " + createBy + + ", createTime = " + createTime + + "}"; + } +} diff --git a/core/core-backend/src/main/java/io/dataease/visualization/dao/auto/mapper/VisualizationWatermarkMapper.java b/core/core-backend/src/main/java/io/dataease/visualization/dao/auto/mapper/VisualizationWatermarkMapper.java new file mode 100644 index 0000000000..99334c00ac --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/visualization/dao/auto/mapper/VisualizationWatermarkMapper.java @@ -0,0 +1,18 @@ +package io.dataease.visualization.dao.auto.mapper; + +import io.dataease.visualization.dao.auto.entity.VisualizationWatermark; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 仪表板水印设置表 Mapper 接口 + *

+ * + * @author fit2cloud + * @since 2024-01-09 + */ +@Mapper +public interface VisualizationWatermarkMapper extends BaseMapper { + +} 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 fefd404e02..96175826df 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 @@ -10,6 +10,7 @@ import io.dataease.api.visualization.request.DataVisualizationBaseRequest; import io.dataease.api.visualization.request.VisualizationWorkbranchQueryRequest; import io.dataease.api.visualization.vo.DataVisualizationVO; import io.dataease.api.visualization.vo.VisualizationResourceVO; +import io.dataease.api.visualization.vo.VisualizationWatermarkVO; import io.dataease.chart.dao.auto.entity.CoreChartView; import io.dataease.chart.manage.ChartDataManage; import io.dataease.chart.manage.ChartViewManege; @@ -31,7 +32,9 @@ import io.dataease.utils.BeanUtils; import io.dataease.utils.IDUtils; import io.dataease.utils.JsonUtil; import io.dataease.visualization.dao.auto.entity.DataVisualizationInfo; +import io.dataease.visualization.dao.auto.entity.VisualizationWatermark; import io.dataease.visualization.dao.auto.mapper.DataVisualizationInfoMapper; +import io.dataease.visualization.dao.auto.mapper.VisualizationWatermarkMapper; import io.dataease.visualization.dao.ext.mapper.ExtDataVisualizationMapper; import io.dataease.visualization.manage.CoreVisualizationManage; import jakarta.annotation.Resource; @@ -83,6 +86,9 @@ public class DataVisualizationServer implements DataVisualizationApi { @Resource private CoreOptRecentManage coreOptRecentManage; + @Resource + private VisualizationWatermarkMapper watermarkMapper; + @Override @XpackInteract(value = "dataVisualizationServer", original = true) public DataVisualizationVO findById(Long dvId, String busiFlag) { @@ -94,6 +100,10 @@ public class DataVisualizationServer implements DataVisualizationApi { Map viewInfo = chartViewDTOS.stream().collect(Collectors.toMap(ChartViewDTO::getId, chartView -> chartView)); result.setCanvasViewInfo(viewInfo); } + VisualizationWatermark watermark = watermarkMapper.selectById("system_default"); + VisualizationWatermarkVO watermarkVO = new VisualizationWatermarkVO(); + BeanUtils.copyBean(watermarkVO,watermark); + result.setWatermarkInfo(watermarkVO); return result; } else { DEException.throwException("资源不存在或已经被删除..."); diff --git a/core/core-frontend/src/api/user.ts b/core/core-frontend/src/api/user.ts index 21299075ea..d02e0a227a 100644 --- a/core/core-frontend/src/api/user.ts +++ b/core/core-frontend/src/api/user.ts @@ -77,5 +77,3 @@ export const defaultPwdApi = () => request.get({ url: '/user/defaultPwd' }) export const resetPwdApi = uid => request.post({ url: `/user/resetPwd/${uid}` }) export const switchEnableApi = data => request.post({ url: '/user/enable', data }) - -export const userLoginInfo = () => request.get({ url: '/user/userLoginInfo' }) diff --git a/core/core-frontend/src/api/watermark.ts b/core/core-frontend/src/api/watermark.ts new file mode 100644 index 0000000000..6c78457973 --- /dev/null +++ b/core/core-frontend/src/api/watermark.ts @@ -0,0 +1,4 @@ +import request from '@/config/axios' + +export const searchRoleApi = (keyword: string) => + request.post({ url: '/role/query', data: { keyword } }) diff --git a/core/core-frontend/src/assets/svg/watermark.svg b/core/core-frontend/src/assets/svg/watermark.svg new file mode 100644 index 0000000000..7a26b489d8 --- /dev/null +++ b/core/core-frontend/src/assets/svg/watermark.svg @@ -0,0 +1 @@ + diff --git a/core/core-frontend/src/components/data-visualization/canvas/DePreview.vue b/core/core-frontend/src/components/data-visualization/canvas/DePreview.vue index 39a92dcb26..3fe0f5b403 100644 --- a/core/core-frontend/src/components/data-visualization/canvas/DePreview.vue +++ b/core/core-frontend/src/components/data-visualization/canvas/DePreview.vue @@ -11,7 +11,7 @@ import UserViewEnlarge from '@/components/visualization/UserViewEnlarge.vue' import CanvasOptBar from '@/components/visualization/CanvasOptBar.vue' import { isMainCanvas } from '@/utils/canvasUtils' import { activeWatermark } from '@/components/watermark/watermark' -import { userLoginInfo } from '@/api/user' +import { personInfoApi } from '@/api/user' const dvMainStore = dvMainStoreWithOut() const { pcMatrixCount, curComponent } = storeToRefs(dvMainStore) @@ -49,6 +49,10 @@ const props = defineProps({ downloadStatus: { type: Boolean, default: false + }, + userId: { + type: String, + require: false } }) @@ -60,7 +64,8 @@ const { canvasViewInfo, showPosition, previewActive, - downloadStatus + downloadStatus, + userId } = toRefs(props) const domId = 'preview-' + canvasId.value const scaleWidth = ref(100) @@ -175,30 +180,29 @@ const initRefreshTimer = () => { } } -const initWatermark = () => { - if (dvInfo.value.watermarkInfo) { - nextTick(() => { - if (userInfo.value) { +const initWatermark = (waterDomId = 'preview-canvas-main') => { + if (dvInfo.value.watermarkInfo && isMainCanvas(canvasId.value)) { + if (userInfo.value) { + activeWatermark( + dvInfo.value.watermarkInfo.settingContent, + userInfo.value, + waterDomId, + canvasId.value, + dvInfo.value.watermarkOpen + ) + } else { + const method = personInfoApi + method().then(res => { + userInfo.value = res.data activeWatermark( dvInfo.value.watermarkInfo.settingContent, userInfo.value, - 'canvasInfo-main', + waterDomId, canvasId.value, dvInfo.value.watermarkOpen ) - } else { - userLoginInfo().then(res => { - userInfo.value = res.data - activeWatermark( - dvInfo.value.watermarkInfo.settingContent, - userInfo.value, - 'canvasInfo-main', - canvasId.value, - dvInfo.value.watermarkOpen - ) - }) - } - }) + }) + } } } diff --git a/core/core-frontend/src/components/watermark/watermark.ts b/core/core-frontend/src/components/watermark/watermark.ts index a179606ae2..54f8557463 100644 --- a/core/core-frontend/src/components/watermark/watermark.ts +++ b/core/core-frontend/src/components/watermark/watermark.ts @@ -35,7 +35,7 @@ export function watermark(settings, domId) { const cutWidth = page_width * 0.015 page_width = page_width - cutWidth // 获取页面最大高度 - let page_height = watermarkDom.clientHeight - 56 + let page_height = watermarkDom.scrollHeight - 56 page_height = page_height < 400 ? 400 : page_height // page_height = Math.max(page_height, window.innerHeight - 30) // 如果将水印列数设置为0,或水印列数设置过大,超过页面最大宽度,则重新计算水印列数和水印x轴间隔 @@ -165,13 +165,13 @@ export function activeWatermark(watermarkForm, userLoginInfo, domId, canvasId, w if (watermarkForm.type === 'custom') { watermark_txt = watermarkForm.content watermark_txt = watermark_txt.replaceAll('${ip}', userLoginInfo.ip) - watermark_txt = watermark_txt.replaceAll('${username}', userLoginInfo.userInfo.username) - watermark_txt = watermark_txt.replaceAll('${nickName}', userLoginInfo.userInfo.nickName) + watermark_txt = watermark_txt.replaceAll('${username}', userLoginInfo.account) + watermark_txt = watermark_txt.replaceAll('${nickName}', userLoginInfo.name) watermark_txt = watermark_txt.replaceAll('${time}', getNow()) watermark_width = watermark_txt.length * watermarkForm.watermark_fontsize * 0.75 watermark_width = watermark_width > 350 ? 350 : watermark_width } else if (watermarkForm.type === 'nickName') { - watermark_txt = userLoginInfo.userInfo.nickName + watermark_txt = userLoginInfo.name } else if (watermarkForm.type === 'ip') { watermark_txt = userLoginInfo.ip watermark_width = 150 @@ -179,7 +179,7 @@ export function activeWatermark(watermarkForm, userLoginInfo, domId, canvasId, w watermark_txt = getNow() watermark_width = 200 } else { - watermark_txt = userLoginInfo.userInfo.username + watermark_txt = userLoginInfo.name } const settings = { watermark_txt: watermark_txt, diff --git a/core/core-frontend/src/store/modules/data-visualization/dvMain.ts b/core/core-frontend/src/store/modules/data-visualization/dvMain.ts index 91b5383477..dba7db38c1 100644 --- a/core/core-frontend/src/store/modules/data-visualization/dvMain.ts +++ b/core/core-frontend/src/store/modules/data-visualization/dvMain.ts @@ -861,7 +861,8 @@ export const dvMainStore = defineStore('dataVisualization', { pid: null, status: null, selfWatermarkStatus: null, - type: null + type: null, + watermarkInfo: null } }, setViewDataDetails(viewId, dataInfo) { diff --git a/core/core-frontend/src/utils/canvasUtils.ts b/core/core-frontend/src/utils/canvasUtils.ts index a5e8e87aa0..0ea921e542 100644 --- a/core/core-frontend/src/utils/canvasUtils.ts +++ b/core/core-frontend/src/utils/canvasUtils.ts @@ -11,7 +11,6 @@ import { getPanelAllLinkageInfo } from '@/api/visualization/linkage' import { queryVisualizationJumpInfo } from '@/api/visualization/linkJump' import { getViewConfig } from '@/views/chart/components/editor/util/chart' import { snapshotStoreWithOut } from '@/store/modules/data-visualization/snapshot' -import { toPercent } from '@/utils/translate' const dvMainStore = dvMainStoreWithOut() const { curBatchOptComponents, dvInfo, canvasStyleData, componentData, canvasViewInfo } = storeToRefs(dvMainStore) @@ -81,18 +80,25 @@ export function commonHandleDragEnd(e, dvModel) { export function initCanvasDataPrepare(dvId, busiFlag, callBack) { findById(dvId, busiFlag).then(res => { const canvasInfo = res.data + const watermarkInfo = { + ...canvasInfo.watermarkInfo, + settingContent: JSON.parse(canvasInfo.watermarkInfo.settingContent) + } + const dvInfo = { id: canvasInfo.id, name: canvasInfo.name, pid: canvasInfo.pid, status: canvasInfo.status, - selfWatermarkStatus: canvasInfo.selfWatermarkStatus, + watermarkOpen: canvasInfo.selfWatermarkStatus, type: canvasInfo.type, creatorName: canvasInfo.creatorName, updateName: canvasInfo.updateName, createTime: canvasInfo.createTime, - updateTime: canvasInfo.updateTime + updateTime: canvasInfo.updateTime, + watermarkInfo: watermarkInfo } + const canvasDataResult = JSON.parse(canvasInfo.componentData) const canvasStyleResult = JSON.parse(canvasInfo.canvasStyleData) const canvasViewInfoPreview = canvasInfo.canvasViewInfo @@ -157,7 +163,8 @@ export function canvasSave(callBack) { canvasStyleData: JSON.stringify(canvasStyleData.value), componentData: JSON.stringify(componentDataToSave), canvasViewInfo: canvasViewInfo.value, - ...dvInfo.value + ...dvInfo.value, + watermarkInfo: null } const method = dvInfo.value.id ? updateCanvas : saveCanvas diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java index 9dd4a4ead0..c13f28eb05 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java @@ -129,6 +129,11 @@ public class DataVisualizationVO implements Serializable { */ private Map extendDataInfo = new HashMap<>(); + /** + * 水印信息 + */ + private VisualizationWatermarkVO watermarkInfo; + public DataVisualizationVO(Long id, String name, String type, String canvasStyleData, String componentData, Map canvasViewInfo, Map extendDataInfo) { this.id = id; this.name = name; diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/VisualizationWatermarkVO.java b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/VisualizationWatermarkVO.java new file mode 100644 index 0000000000..8f73962350 --- /dev/null +++ b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/VisualizationWatermarkVO.java @@ -0,0 +1,80 @@ +package io.dataease.api.visualization.vo; + +public class VisualizationWatermarkVO{ + + /** + * 主键 + */ + private String id; + + /** + * 版本号 + */ + private String version; + + /** + * 设置内容 + */ + private String settingContent; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Long createTime; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getSettingContent() { + return settingContent; + } + + public void setSettingContent(String settingContent) { + this.settingContent = settingContent; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "VisualizationWatermark{" + + "id = " + id + + ", version = " + version + + ", settingContent = " + settingContent + + ", createBy = " + createBy + + ", createTime = " + createTime + + "}"; + } +} diff --git a/sdk/common/src/main/java/io/dataease/utils/IPUtils.java b/sdk/common/src/main/java/io/dataease/utils/IPUtils.java new file mode 100644 index 0000000000..624d36fbd6 --- /dev/null +++ b/sdk/common/src/main/java/io/dataease/utils/IPUtils.java @@ -0,0 +1,54 @@ +package io.dataease.utils; + +import jakarta.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.StringUtils; + +import java.net.InetAddress; +import java.util.Arrays; + +public class IPUtils { + + private static final String HEAD_KEYS = "x-forwarded-for, Proxy-Client-IP, WL-Proxy-Client-IP"; + + private static final String UNKNOWN = "unknown"; + + private static final String LOCAL_IP_KEY = "0:0:0:0:0:0:0:1"; + private static final String LOCAL_IP_VAL = "127.0.0.1"; + + public static String get() { + + String ipStr = null; + boolean isProxy = false; + + HttpServletRequest request = null; + try { + request = ServletUtils.request(); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + return null; + } + String[] keyArr = HEAD_KEYS.split(","); + for (String key : keyArr) { + String header = request.getHeader(key.trim()); + if (StringUtils.isNotBlank(header) && !StringUtils.equalsIgnoreCase(UNKNOWN, header)) { + ipStr = header; + isProxy = true; + break; + } + } + + if (!isProxy) { + ipStr = request.getRemoteAddr(); + } + ipStr = Arrays.stream(ipStr.split(",")).filter(item -> StringUtils.isNotBlank(item) && !StringUtils.equalsIgnoreCase(UNKNOWN, item.trim())).findFirst().orElse(ipStr); + return StringUtils.equals(LOCAL_IP_KEY, ipStr) ? LOCAL_IP_VAL : ipStr; + } + + public static String domain() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (Exception e) { + return LOCAL_IP_VAL; + } + } +}