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;
+ }
+ }
+}