diff --git a/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java b/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java index d178f435e7..dc32281171 100644 --- a/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; + import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.IOException; @@ -40,20 +41,20 @@ public class PluginCommonServer { BufferedInputStream bis = null; InputStream inputStream = null; OutputStream os = null; //输出流 - try{ + try { inputStream = service.vueResource(jsName); byte[] buffer = new byte[1024]; os = response.getOutputStream(); bis = new BufferedInputStream(inputStream); int i = bis.read(buffer); - while(i != -1){ + while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } os.flush(); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); - }finally { + } finally { try { bis.close(); inputStream.close(); @@ -69,28 +70,28 @@ public class PluginCommonServer { @GetMapping("/component/{componentName}") public void componentInfo(@PathVariable String componentName) { - Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType(PluginComponentService.class); - beansOfType.values().stream().forEach(service -> { + Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType(PluginComponentService.class); + beansOfType.values().stream().forEach(service -> { List components = service.components(); if (components.contains(componentName)) { HttpServletResponse response = ServletUtils.response(); BufferedInputStream bis = null; InputStream inputStream = null; OutputStream os = null; //输出流 - try{ + try { inputStream = service.vueResource(componentName); byte[] buffer = new byte[1024]; os = response.getOutputStream(); bis = new BufferedInputStream(inputStream); int i = bis.read(buffer); - while(i != -1){ + while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } os.flush(); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); - }finally { + } finally { try { bis.close(); inputStream.close(); @@ -101,7 +102,7 @@ public class PluginCommonServer { } return; } - }); + }); } @GetMapping("/staticInfo/{name}/{suffix}") @@ -115,22 +116,24 @@ public class PluginCommonServer { BufferedInputStream bis = null; InputStream inputStream = null; OutputStream os = null; //输出流 - try{ + try { inputStream = service.vueResource(name, suffix); byte[] buffer = new byte[1024]; os = response.getOutputStream(); bis = new BufferedInputStream(inputStream); int i = bis.read(buffer); - while(i != -1){ + while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } if (suffix.indexOf("svg") != -1) response.setContentType("image/svg+xml"); + if (suffix.indexOf("png") != -1) + response.setContentType("image/png"); os.flush(); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); - }finally { + } finally { try { bis.close(); inputStream.close(); diff --git a/backend/src/main/java/io/dataease/plugins/server/XWatermarkServer.java b/backend/src/main/java/io/dataease/plugins/server/XWatermarkServer.java index 5bd552cfba..0a1740fcb6 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XWatermarkServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XWatermarkServer.java @@ -4,10 +4,7 @@ import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.watermark.WatermarkService; import io.dataease.plugins.xpack.watermark.dto.PanelWatermarkDTO; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; /** @@ -29,7 +26,7 @@ public class XWatermarkServer { @ApiOperation("保存水印配置") @PostMapping("/save") - public void save(PanelWatermarkDTO panelWatermark) { + public void save(@RequestBody PanelWatermarkDTO panelWatermark) { WatermarkService userXpackService = SpringContextUtil.getBean(WatermarkService.class); userXpackService.saveWatermarkInfo(panelWatermark); } diff --git a/backend/src/main/resources/db/migration/V44__1.17.sql b/backend/src/main/resources/db/migration/V44__1.17.sql index e878d7fda3..0726c5ed68 100644 --- a/backend/src/main/resources/db/migration/V44__1.17.sql +++ b/backend/src/main/resources/db/migration/V44__1.17.sql @@ -6,26 +6,33 @@ ALTER TABLE `sys_log` ALTER TABLE `panel_group` ADD COLUMN `watermark_open` tinyint(1) NULL DEFAULT 1 COMMENT '是否单独打开水印' AFTER `update_time`; +DROP TABLE IF EXISTS `panel_watermark`; +CREATE TABLE `panel_watermark` +( + `id` varchar(50) NOT NULL, + `version` varchar(255) DEFAULT NULL COMMENT '版本号', + `setting_content` longtext COMMENT '设置内容', + `create_by` varchar(255) DEFAULT NULL, + `create_time` bigint(13) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + INSERT INTO `panel_watermark` (`id`, `version`, `setting_content`, `create_by`, `create_time`) VALUES ('system_default', '1.0', '{\"enable\":false,\"enablePanelCustom\":true,\"type\":\"custom\",\"content\":\"${time}-${nickName}\",\"watermark_color\":\"#999999\",\"watermark_x_space\":20,\"watermark_y_space\":100,\"watermark_fontsize\":20}', 'admin', NULL); -CREATE TABLE `panel_watermark` -( - `id` varchar(50) NOT NULL, - `name` varchar(255) DEFAULT NULL, - `version` varchar(255) DEFAULT NULL COMMENT '版本', - `type` varchar(255) DEFAULT NULL COMMENT '类型', - `content` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; - SET FOREIGN_KEY_CHECKS = 1; -UPDATE `sys_menu` SET `component` = 'dataset/Form' WHERE (`menu_id` = '800'); +UPDATE `sys_menu` +SET `component` = 'dataset/Form' +WHERE (`menu_id` = '800'); -UPDATE `sys_menu` SET `component` = 'msg/All' WHERE (`component` = 'msg/all'); -UPDATE `sys_menu` SET `component` = 'msg/Setting' WHERE (`component` = 'msg/setting'); +UPDATE `sys_menu` +SET `component` = 'msg/All' +WHERE (`component` = 'msg/all'); +UPDATE `sys_menu` +SET `component` = 'msg/Setting' +WHERE (`component` = 'msg/setting'); diff --git a/frontend/src/api/panel/panel.js b/frontend/src/api/panel/panel.js index 8819018514..dc41cd5079 100644 --- a/frontend/src/api/panel/panel.js +++ b/frontend/src/api/panel/panel.js @@ -163,6 +163,10 @@ export function initPanelData(panelId, useCache = false, callback) { if (response.data) { // 初始化视图data和style 数据 panelInit(JSON.parse(response.data.panelData), JSON.parse(response.data.panelStyle)) + const watermarkInfo = { + ...response.data.watermarkInfo, + settingContent: JSON.parse(response.data.watermarkInfo.settingContent) + } // 设置当前仪表板全局信息 store.dispatch('panel/setPanelInfo', { id: response.data.id, @@ -177,7 +181,7 @@ export function initPanelData(panelId, useCache = false, callback) { updateName: response.data.updateName, updateTime: response.data.updateTime, watermarkOpen: response.data.watermarkOpen, - watermarkInfo: response.data.watermarkInfo + watermarkInfo: watermarkInfo }) // 刷新联动信息 getPanelAllLinkageInfo(panelId).then(rsp => { diff --git a/frontend/src/api/panel/shareProxy.js b/frontend/src/api/panel/shareProxy.js index 241a7dbc24..10c5853dd7 100644 --- a/frontend/src/api/panel/shareProxy.js +++ b/frontend/src/api/panel/shareProxy.js @@ -10,6 +10,10 @@ export function proxyInitPanelData(panelId, proxy, callback) { if (response.data) { // 初始化视图data和style 数据 panelInit(JSON.parse(response.data.panelData), JSON.parse(response.data.panelStyle)) + const watermarkInfo = { + ...response.data.watermarkInfo, + settingContent: JSON.parse(response.data.watermarkInfo.settingContent) + } // 设置当前仪表板全局信息 store.dispatch('panel/setPanelInfo', { id: response.data.id, @@ -25,7 +29,7 @@ export function proxyInitPanelData(panelId, proxy, callback) { updateName: response.data.updateName, updateTime: response.data.updateTime, watermarkOpen: response.data.watermarkOpen, - watermarkInfo: response.data.watermarkInfo + watermarkInfo: watermarkInfo }) // 刷新联动信息 getPanelAllLinkageInfo(panelId, proxy).then(rsp => { diff --git a/frontend/src/assets/watermark-demo.png b/frontend/src/assets/watermark-demo.png deleted file mode 100644 index a6353af3ff..0000000000 Binary files a/frontend/src/assets/watermark-demo.png and /dev/null differ diff --git a/frontend/src/components/canvas/DeCanvas.vue b/frontend/src/components/canvas/DeCanvas.vue index 49ce231648..9f7dbc68d8 100644 --- a/frontend/src/components/canvas/DeCanvas.vue +++ b/frontend/src/components/canvas/DeCanvas.vue @@ -8,7 +8,7 @@ @mouseup="deselectCurComponent" @scroll="canvasScroll" > - + { const userInfo = res.data - activeWatermark(JSON.parse(this.panelInfo.watermarkInfo.settingContent), userInfo, this.canvasDomId, this.canvasId, this.panelInfo.watermarkOpen) + activeWatermark(this.panelInfo.watermarkInfo.settingContent, userInfo, this.canvasDomId, this.canvasId, this.panelInfo.watermarkOpen) }) } }, diff --git a/frontend/src/components/canvas/components/Toolbar.vue b/frontend/src/components/canvas/components/Toolbar.vue index 9bc1fb28d4..1ab2995f04 100644 --- a/frontend/src/components/canvas/components/Toolbar.vue +++ b/frontend/src/components/canvas/components/Toolbar.vue @@ -7,10 +7,10 @@ @change="openMobileLayout" > - + - + @@ -95,7 +95,7 @@ - + {{ $t('panel.new_element_distribution') }} - + {{ $t('panel.aided_grid') }} - + {{ $t('panel.params_setting') }} - + {{ $t('panel.clean_canvas') }} - - + + {{ $t('panel.watermark') }} @@ -191,8 +194,8 @@ {{ - $t('panel.panel_save_warn_tips') - }} + $t('panel.panel_save_warn_tips') + }}
0) { const requestInfo = _this.savePrepare() const cacheRequest = { - ...this.panelInfo, + ...deepCopy(this.panelInfo), ...requestInfo } + cacheRequest.watermarkInfo.settingContent = JSON.stringify(this.panelInfo.watermarkInfo.settingContent) saveCache(cacheRequest) _this.$store.state.cacheStyleChangeTimes = 0 } @@ -449,6 +456,7 @@ export default { // 保存到数据库 const requestInfo = { id: this.panelInfo.id, + watermarkOpen: this.panelInfo.watermarkOpen, panelStyle: JSON.stringify(this.canvasStyleData), panelData: JSON.stringify(this.componentData) } @@ -619,6 +627,9 @@ export default { } }) this.cancelMobileLayoutStatue(sourceComponentData) + }, + styleChange() { + this.$store.commit('canvasChange') } } } diff --git a/frontend/src/components/canvas/components/editor/DeEditor.vue b/frontend/src/components/canvas/components/editor/DeEditor.vue index 13db29faea..07d86d0b33 100644 --- a/frontend/src/components/canvas/components/editor/DeEditor.vue +++ b/frontend/src/components/canvas/components/editor/DeEditor.vue @@ -121,7 +121,7 @@ :canvas-id="canvasId" /> - +
- +
{ - const userInfo = res.data - activeWatermark(JSON.parse(this.panelInfo.watermarkInfo.settingContent), userInfo, 'preview-main-canvas-main', this.canvasId, this.panelInfo.watermarkOpen) - }) + if (this.panelInfo.watermarkInfo) { + userLoginInfo().then(res => { + const userInfo = res.data + activeWatermark(this.panelInfo.watermarkInfo.settingContent, userInfo, 'preview-main-canvas-main', this.canvasId, this.panelInfo.watermarkOpen) + }) + } }, isMainCanvas() { return this.canvasId === 'canvas-main' diff --git a/frontend/src/components/canvas/tools/watermark.js b/frontend/src/components/canvas/tools/watermark.js index 808f7daef1..ab14bb5e60 100644 --- a/frontend/src/components/canvas/tools/watermark.js +++ b/frontend/src/components/canvas/tools/watermark.js @@ -1,50 +1,50 @@ -//动态创建水印元素的封装函数 +// 动态创建水印元素的封装函数 export function watermark(settings, domId) { const watermarkDom = document.getElementById(domId) - //默认设置 - let defaultSettings = { + // 默认设置 + const defaultSettings = { watermark_txt: '', - watermark_x: 20, //水印起始位置x轴坐标 - watermark_y: 20, //水印起始位置Y轴坐标 - watermark_rows: 20, //水印行数 - watermark_cols: 20, //水印列数 - watermark_x_space: 100, //水印x轴间隔 - watermark_y_space: 50, //水印y轴间隔 - watermark_color: '#aaa', //水印字体颜色 - watermark_alpha: 0.4, //水印透明度 - watermark_fontsize: '15px', //水印字体大小 - watermark_font: '微软雅黑', //水印字体 - watermark_width: 210, //水印宽度 - watermark_height: 80, //水印长度 - watermark_angle: 20 //水印倾斜度数 + watermark_x: 20, // 水印起始位置x轴坐标 + watermark_y: 20, // 水印起始位置Y轴坐标 + watermark_rows: 20, // 水印行数 + watermark_cols: 20, // 水印列数 + watermark_x_space: 100, // 水印x轴间隔 + watermark_y_space: 50, // 水印y轴间隔 + watermark_color: '#aaa', // 水印字体颜色 + watermark_alpha: 0.4, // 水印透明度 + watermark_fontsize: '15px', // 水印字体大小 + watermark_font: '微软雅黑', // 水印字体 + watermark_width: 210, // 水印宽度 + watermark_height: 80, // 水印长度 + watermark_angle: 20 // 水印倾斜度数 } - //根据函数的入参调整设置 + // 根据函数的入参调整设置 if (settings && typeof settings === 'object') { - let src = settings || {} + const src = settings || {} for (const key in src) { if (src[key] && defaultSettings[key] && src[key] === defaultSettings[key]) { continue } else if (src[key]) defaultSettings[key] = src[key] } } - //创建虚拟节点对象,在该节点对象中可以放元素,最后只需在页面中添加该节点对象即可。可提高性能 - let oTemp = document.createElement('p') - //获取页面最大宽度 + // 创建虚拟节点对象,在该节点对象中可以放元素,最后只需在页面中添加该节点对象即可。可提高性能 + const oTemp = document.createElement('p') + // 获取页面最大宽度 let page_width = watermarkDom.clientWidth - let cutWidth = page_width * 0.0150 + const cutWidth = page_width * 0.0150 page_width = page_width - cutWidth - //获取页面最大高度 + // 获取页面最大高度 let page_height = watermarkDom.clientHeight - 56 page_height = page_height < 400 ? 400 : page_height // page_height = Math.max(page_height, window.innerHeight - 30) - //如果将水印列数设置为0,或水印列数设置过大,超过页面最大宽度,则重新计算水印列数和水印x轴间隔 - if (defaultSettings.watermark_cols == 0 || (parseInt(defaultSettings.watermark_x + defaultSettings.watermark_width * defaultSettings.watermark_cols + defaultSettings.watermark_x_space * (defaultSettings.watermark_cols - 1)) > page_width)) { + // 如果将水印列数设置为0,或水印列数设置过大,超过页面最大宽度,则重新计算水印列数和水印x轴间隔 + if (defaultSettings.watermark_cols === 0 || (parseInt(defaultSettings.watermark_x + defaultSettings.watermark_width * defaultSettings.watermark_cols + defaultSettings.watermark_x_space * (defaultSettings.watermark_cols - 1)) > page_width)) { defaultSettings.watermark_cols = parseInt((page_width - defaultSettings.watermark_x + defaultSettings.watermark_x_space) / (defaultSettings.watermark_width + defaultSettings.watermark_x_space)) defaultSettings.watermark_x_space = parseInt((page_width - defaultSettings.watermark_x - defaultSettings.watermark_width * defaultSettings.watermark_cols) / (defaultSettings.watermark_cols - 1)) } - //如果将水印行数设置为0,或水印行数设置过大,超过页面最大长度,则重新计算水印行数和水印y轴间隔 - if (defaultSettings.watermark_rows == 0 || (parseInt(defaultSettings.watermark_y + defaultSettings.watermark_height * defaultSettings.watermark_rows + defaultSettings.watermark_y_space * (defaultSettings.watermark_rows - 1)) > page_height)) { + // 如果将水印行数设置为0,或水印行数设置过大,超过页面最大长度,则重新计算水印行数和水印y轴间隔 + if (defaultSettings.watermark_rows === 0 || (parseInt(defaultSettings.watermark_y + defaultSettings.watermark_height * defaultSettings.watermark_rows + defaultSettings.watermark_y_space * (defaultSettings.watermark_rows - 1)) > page_height)) { defaultSettings.watermark_rows = parseInt((defaultSettings.watermark_y_space + page_height - defaultSettings.watermark_y) / (defaultSettings.watermark_height + defaultSettings.watermark_y_space)) defaultSettings.watermark_y_space = parseInt(((page_height - defaultSettings.watermark_y) - defaultSettings.watermark_height * defaultSettings.watermark_rows) / (defaultSettings.watermark_rows - 1)) } @@ -56,11 +56,11 @@ export function watermark(settings, domId) { y = defaultSettings.watermark_y + (defaultSettings.watermark_y_space + defaultSettings.watermark_height) * i for (let j = 0; j < defaultSettings.watermark_cols; j++) { x = defaultSettings.watermark_x + (defaultSettings.watermark_width + defaultSettings.watermark_x_space) * j - let mask_div = document.createElement('div') + const mask_div = document.createElement('div') mask_div.id = 'mask_div' + i + j mask_div.className = 'mask_div' mask_div.appendChild(document.createTextNode(defaultSettings.watermark_txt)) - //设置水印div倾斜显示 + // 设置水印div倾斜显示 mask_div.style.webkitTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)' mask_div.style.MozTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)' mask_div.style.msTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)' @@ -72,7 +72,7 @@ export function watermark(settings, domId) { mask_div.style.top = y + 'px' mask_div.style.overflow = 'hidden' mask_div.style.zIndex = '9999' - //让水印不遮挡页面的点击事件 + // 让水印不遮挡页面的点击事件 mask_div.style.pointerEvents = 'none' mask_div.style.opacity = defaultSettings.watermark_alpha mask_div.style.fontSize = defaultSettings.watermark_fontsize @@ -87,17 +87,15 @@ export function watermark(settings, domId) { } oTemp.setAttribute('id', 'de-watermark-server') watermarkDom.appendChild(oTemp) - } export function getNow() { - let d = new Date() - let year = d.getFullYear() - let month = change(d.getMonth() + 1) - let day = change(d.getDate()) - let hour = change(d.getHours()) - let minute = change(d.getMinutes()) - let second = change(d.getSeconds()) + const d = new Date() + const year = d.getFullYear() + const month = change(d.getMonth() + 1) + const day = change(d.getDate()) + const hour = change(d.getHours()) + const minute = change(d.getMinutes()) function change(t) { if (t < 10) { @@ -107,18 +105,18 @@ export function getNow() { } } - let time = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + const time = year + '-' + month + '-' + day + ' ' + hour + ':' + minute return time } export function activeWatermark(watermarkForm, userLoginInfo, domId, canvasId, watermarkOpen) { - //清理历史水印 + // 清理历史水印 const historyWatermarkDom = document.getElementById('de-watermark-server') if (historyWatermarkDom) { historyWatermarkDom.remove() } - if (!(canvasId === 'canvas-main' && ((watermarkForm.enable && !watermarkForm.enablePanelCustom) - || (watermarkForm.enable && watermarkOpen)))) { + if (!(canvasId === 'canvas-main' && ((watermarkForm.enable && !watermarkForm.enablePanelCustom) || + (watermarkForm.enable && watermarkOpen)))) { return } let watermark_txt diff --git a/frontend/src/components/deDrag/index.vue b/frontend/src/components/deDrag/index.vue index 35ab0903b6..62be1fcf4f 100644 --- a/frontend/src/components/deDrag/index.vue +++ b/frontend/src/components/deDrag/index.vue @@ -65,7 +65,7 @@ @mousedown.stop.prevent="handleDown(handlei, $event)" @touchstart.stop.prevent="handleTouchDown(handlei, $event)" > - +
- +
diff --git a/frontend/src/components/deViewSelect/index.vue b/frontend/src/components/deViewSelect/index.vue index 3fd16e1cb9..4c749009fe 100644 --- a/frontend/src/components/deViewSelect/index.vue +++ b/frontend/src/components/deViewSelect/index.vue @@ -139,6 +139,10 @@ export default { this.innerValues = this.value this.viewLoaded = false this.panelId && findOne(this.panelId).then(response => { + const watermarkInfo = { + ...response.data.watermarkInfo, + settingContent: JSON.parse(response.data.watermarkInfo.settingContent) + } this.panelInfo = { id: response.data.id, name: response.data.name, @@ -150,7 +154,7 @@ export default { updateBy: response.data.updateBy, updateTime: response.data.updateTime, watermarkOpen: response.data.watermarkOpen, - watermarkInfo: response.data.watermarkInfo + watermarkInfo: watermarkInfo } this.$store.dispatch('panel/setPanelInfo', this.panelInfo) panelDataPrepare(JSON.parse(response.data.panelData), JSON.parse(response.data.panelStyle), rsp => { diff --git a/frontend/src/views/link/view/index.vue b/frontend/src/views/link/view/index.vue index 2e2395172f..b71adaf3c5 100644 --- a/frontend/src/views/link/view/index.vue +++ b/frontend/src/views/link/view/index.vue @@ -68,6 +68,10 @@ export default { loadResource(this.resourceId).then(res => { this.show = false let loadingCount = 0 + const watermarkInfo = { + ...res.data.watermarkInfo, + settingContent: JSON.parse(res.data.watermarkInfo.settingContent) + } this.panelInfo = { id: res.data.id, name: res.data.name, @@ -78,7 +82,7 @@ export default { updateBy: res.data.updateBy, updateTime: res.data.updateTime, watermarkOpen: res.data.watermarkOpen, - watermarkInfo: res.data.watermarkInfo + watermarkInfo: watermarkInfo } this.$store.dispatch('panel/setPanelInfo', this.panelInfo) diff --git a/frontend/src/views/panel/list/PanelList.vue b/frontend/src/views/panel/list/PanelList.vue index 6f67ea0151..e8e37eff2a 100644 --- a/frontend/src/views/panel/list/PanelList.vue +++ b/frontend/src/views/panel/list/PanelList.vue @@ -161,7 +161,7 @@ /> - + - + {{ $t('panel.groupAdd') }}
- +
{{ - $t('panel.cancel') - }} + $t('panel.cancel') + }} {{ - $t('dataset.cancel') - }} + $t('dataset.cancel') + }}