转载wenqiang1208的文章

superset 作为一个数据可视化的工具,其中的图表,报表数据是非常敏感的,为了防止数据外泄,大部分公司需要在敏感图表上加上水印。

本篇文章有2种方式去介绍如何在superset上添加水印。

我们主要在首页,看板,chart图表,sqllab上加上水印。

版本信息

superset版本0.36

(可能适用于0.37或者0.38)

ps: 由于在原生的36版本上做了二次开发,可能会有部分代码不一致

先放几个加上水印的superset吧

首页

看板详情

1、使用第三方水印库加上水印

遇到不会写的代码怎么办,熟练的打开 最大的同性交友网站(狗头) Github, 输入 waterMark 找找看。

经过一番搜索 貌似找到一个可用的开源库。

https://github.com/saucxs/watermark-dom

(版本迭代多,功能吻合, 配置简单,使用简单)

1.1 引入第三方库

cd superset-frontend
npm install watermark-dom -s

1.2 添加公共配置项

由于需要在好几个页面上加上水印,那最好把配置提取出来,这样方便修改

增加文件 superset-frontend/src/waterMark.js

文件内容

const waterMarkConf = {
watermark_txt: 'superset水印',
watermark_color: 'black',
watermark_font: '微软雅黑',
watermark_fontsize: 15,
watermark_height: 88,
watermark_width: 170,
watermark_x_space: 10,
watermark_y_space: 5,
watermark_alpha: 0.15,
watermark_angle: 20,
}
export default waterMarkConf;

这些参数 可以参考 第三方库的配置 修改

1.3 welcome首页 添加水印

首页的目录地址

superset-frontend/src/welcome/App.jsx

修改该文件,添加内容

import watermark from 'watermark-dom';
import waterMarkConf from '../waterMark.js' watermark.init({...waterMarkConf, watermark_txt: `测试水印 ${user.username}`})

ps:由于需要加上名字, 这边覆盖了原有的水印内容,

username 是从后端的的 相关接口 传入的, 可以在 superset/views/core.py 搜索 bootstrap_data,

注意: 首页的看板列表页面和 dashboard菜单下的列表页面 是用的同一套组件,所以在首页修改后,看板菜单的列表页面 也修改了

1.4 dashboard详情页面

看板详情页面的地址: superset-frontend/src/dashboard/App.jsx

同理修改

import watermark from 'watermark-dom';
import waterMarkConf from 'src/waterMark'; // username 不存在的话,需要获取
const username = bootstrapData.username; watermark.load({...waterMarkConf, watermark_txt: `玩物得志 ${username}`});

注意: 由于看板详情页面的后端接口没有返回用户信息,需要修改一下后端接口返回用户名

superset/views/core.py 中的 @expose("/dashboard/<dashboard_id>/") 接口

在返回的数据bootstrap_data 增加用户名

"username": g.user.username if g.user else '',

1.5 chart图表详情页面

chart图表详情页面地址: superset-frontend/src/explore/App.jsx

与看板详情页面同理

后端接口 superset/views/core.py

 @expose("/explore/<datasource_type>/<datasource_id>/", methods=["GET", "POST"])
@expose("/explore/", methods=["GET", "POST"])

1.6 SqlLab页面

Sqllab详情页面 superset-frontend/src/SqlLab/App.jsx

同理 修改

后端接口 superset/views/core.py

def _get_sqllab_payload(user_id: int) -> Dict[str, Any] 函数中的返回值 增加 username

额外注意

如果样式有问题的话, 可能是 body 和 #app 有冲突 可以尝试调整 superset-frontend/stylesheets/less/index.less

2、自定义watermark工具

由于前端做了较多的二次开发 导致 第一种方式的部分页面不兼容水印,样式比较难调。

因此 有了第二种方式。目前第二种方式 比较稳定

参考大佬的链接: https://www.cnblogs.com/feng3037/p/14028780.html

有做略微调整

2.1 新建waterMark工具文件

新建 superset-frontend/src/waterMark.js

const watermark = ({
// 使用 ES6 的函数默认值方式设置参数的默认取值
container = document.body,
width = '170px',
height = '88px',
textAlign = 'left',
textBaseline = 'bottom',
font = '15px Microsoft Yahei',
fillStyle = 'black',
content = '玩物得志',
rotate = 20,
zIndex = 10000,
opacity = 0.08,
} = {}, ...res) => {
const args = res
const canvas = document.createElement('canvas') canvas.setAttribute('width', width)
canvas.setAttribute('height', height)
const ctx = canvas.getContext('2d') ctx.textAlign = textAlign
ctx.textBaseline = textBaseline
ctx.font = font
ctx.fillStyle = fillStyle
ctx.rotate(- rotate * Math.PI / 180 )
ctx.fillText(content, 35, 90) const base64Url = canvas.toDataURL()
const __wm = document.querySelector('.__wm')
const watermarkDiv = __wm || document.createElement('div')
const styleStr = `
position:absolute;
top:0;
left:0;
width:100%;
height:100%;
z-index:${zIndex};
pointer-events:none;
opacity:${opacity};
background-repeat:repeat;
background-image:url('${base64Url}')` watermarkDiv.setAttribute('style', styleStr)
watermarkDiv.classList.add('__wm') if (!__wm) {
container.insertBefore(watermarkDiv, container.firstChild)
} const MutationObserver = window.MutationObserver || window.WebKitMutationObserver
if (MutationObserver) {
let mo = new MutationObserver(function () {
const __wm = document.querySelector('.__wm')
console.log(__wm)
// 只在__wm元素变动才重新调用 __canvasWM
if ((__wm && __wm.getAttribute('style') !== styleStr) || !__wm) {
// 避免一直触发
mo.disconnect()
mo = null
watermark(JSON.parse(JSON.stringify(args)))
}
}) mo.observe(container, {
attributes: true,
subtree: true,
childList: true
})
} }
export default watermark;

2.2 修改各个详情页面

与第一种方式 修改类似,再App.js 文件中添加

// 引入
import watermark from '../waterMark';
// 初始化
watermark({
content: `测试水印 ${user.username}`,
container: document.querySelector('body')
})

额外注意

可能需要调整样式,非必须

1、

superset-frontend/stylesheets/less/index.less

body {
position: absolute; min-height: 100% !important;
height: auto !important;
width: 100%;
display: flex;
flex-direction: column;
}

2、

如果 loading gif 位置变化的话,可以调整下面的文件

superset/templates/superset/basic.html

调整下面的代码

 <img src="/static/assets/images/loading.gif" style="width: 50px; position: absolute; top: 200px; left: 50%; transform: translate(-50%,-50%)">

总结

1、本人前端半吊子水平,如果有问题 请见谅。

2、欢迎大家一起来交流 superset 二次开发

superset 图表加水印的更多相关文章

  1. 火车头dede采集接口,图片加水印,远程图片本地化,远程无后缀的无图片本地化

    <?php /* [LocoySpider] (C)2005-2010 Lewell Inc. 火车采集器 DedeCMS 5.7 UTF8 文章发布接口 Update content: 图片加 ...

  2. thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印

    今天分享一下thinkphp 3.2.3整合ueditor 1.4,给上传的图片加水印.博主是新手,在这里卡住了很久(>_<) thinkphp 3.2.3整合ueditor 1.4 下载 ...

  3. 【转】WPF TextBox和PasswordBox加水印

    Textbox加水印 Textbox加水印,需要一个VisualBrush和触发器验证Text是否为空,在空的时候设置背景的Brush就可以实现水印效果. <TextBox Name=" ...

  4. Web 上传图片加水印

    上传图片加水印 需要使用控件FileUpload 上传按钮Image控件展示上传的图片,页面中拖入三个控件 <form id="form1" runat="serv ...

  5. PHPThumb处理图片,生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转

    [强烈推荐]下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 在网站建设过 ...

  6. 使用iText对pdf做权限的操作(不允许修改,不允许复制,不允许另存为),并且加水印等

    添加水印,并且增加权限 @Test public void addWaterMark() throws Exception{ String srcFile="D:\\work\\pdf\\w ...

  7. 用node.js给图片加水印

    一.准备工作: 首先,确保你本地已经安装好了node环境.然后,我们进行图像编辑操作需要用到一个Node.js的库:images.这个库的地址是:https://github.com/zhangyua ...

  8. php 分享两种给图片加水印的方法

    本文章向码农们介绍 php 给图片加水印的两种方法,感兴趣的码农可以参考一下本文章的源代码. 方法一:PHP最简单的加水印方法 <?php // http://www.manongjc.com ...

  9. Java图片处理(二)图片加水印

    图片加水印,是通过图片重叠绘制实现的.实现代码如下: public static void press(String pressImg, String pressText, String target ...

  10. Python练习册--PIL处理图片之加水印

    背景 最近在看到了Python 练习册,每天一个小程序 这个项目,非常有趣,也比较实用. 晚上看了这第000题,关于Python图片处理: 将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似 ...

随机推荐

  1. C#中的9个“黑魔法”

    C#中的9个"黑魔法"与"骚操作" 我们知道C#是非常先进的语言,因为是它很有远见的"语法糖".这些"语法糖"有时过于好 ...

  2. 一文带你搞懂GaussDB数据库性能调优

    本文分享自华为云社区<[GaussTech技术专栏]GaussDB性能调优>,作者:GaussDB 数据库. 数据库性能调优是一项复杂且系统性的工作,需要综合考虑多方面的因素.因此,调优人 ...

  3. 数字IC知识点:处理多个时钟

    1. 多时钟域 图1.多时钟域 对于工程师来说,开发含多个时钟(见图1)的设计是一种挑战. 这样的设计中可能有以下任何一个,或者全部类型的时钟关系: 时钟的频率不同 时钟频率相同,但相位不同 以上两种 ...

  4. 方法的虚分派(virtual dispatch)和方法表(method table)

    Java方法调用的虚分派 JUN 2ND, 2013 | COMMENTS 本文通过介绍 Java 方法调用的虚分派,来加深对 Java 多态实现的理解.需要预先理解 Java 字节码和 JVM 的基 ...

  5. 图片渲染 API:极速生成电商、社媒、营销、横幅、证书等图片!

    不知道还有没有同学还记得,当时自己开发智能体时,有一个自动生成证书图片的功能,既方便又实用.今天我们就来带大家回顾一下,如何快速生成图片,并且最重要的是,完全无需通过 HTTP 调用,极大提高了操作的 ...

  6. Grid 网格布局备忘录

    概述 网格布局(Grid)是最强大的 CSS 布局方案. 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局. Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个 ...

  7. 适配器模式应用~获取IP地址时想起了适配器

    获取IP地址信息时,一般我们需要一个HttpServletRequest对象,然后从请求头里获取x-forwarded-for的值,而当我们使用dubbo+netty开发rest接口时,如果希望获取I ...

  8. iOS画中画

    iOS 14 画中画 打开项目后台模式 创建视频播放源 let url = Bundle.main.url(forResource: "annie", withExtension: ...

  9. LeetCode题集-9 - 回文数

    题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不 ...

  10. gradle 很棒

    一直以为 gradle 就是 maven 的一个易读版,表达上比 XML 更精简了,实际上还是maven,似乎没有存在的必要. 但是,万万没想到,这玩意儿竟然是一个语言,竟然可以调试!也就是说,它不是 ...