如何用vue封装一个防用户删除的平铺页面的水印组件

news/2025/5/25 3:58:59

需求

水印.png

  • 为了防止截图等安全问题,在web项目页面中生成一个平铺全屏的水印
  • 要求水印内容为用户名,水印节点用户不能通过开发者工具等删除

效果

  • 如上图
  • body节点下插入水印DOM节点,水印节点覆盖在页面最上层但不影响页面正常操作
  • 在通过js或者用户通过开发者工具删除或修改水印节点时自动复原

原理

  • 通过canvas画出节点需生成水印的文字生成base64图片
  • 生成该水印背景图的div节点插入到body下,通过jsMutationObserver方法监听节点变化,再自动重新生成

生成水印DOM节点

// 生成水印DOM节点    
init () {let canvas = document.createElement('canvas')canvas.id = 'canvas'canvas.width = '200' // 单个水印的宽高canvas.height = '130'this.maskDiv = document.createElement('div')let ctx = canvas.getContext('2d')ctx.font = 'normal 18px Microsoft Yahei' // 设置样式ctx.fillStyle = 'rgba(112, 113, 114, 0.1)' // 水印字体颜色ctx.rotate(30 * Math.PI / 180) // 水印偏转角度ctx.fillText(this.inputText, 30, 20)let src = canvas.toDataURL('image/png')this.maskDiv.style.position = 'fixed'this.maskDiv.style.zIndex = '9999'this.maskDiv.id = '_waterMark'this.maskDiv.style.top = '30px'this.maskDiv.style.left = '0'this.maskDiv.style.height = '100%'this.maskDiv.style.width = '100%'this.maskDiv.style.pointerEvents = 'none'this.maskDiv.style.backgroundImage = 'URL(' + src + ')'// 水印节点插到body下document.body.appendChild(this.maskDiv)},

监听DOM更改

// 监听更改,更改后执行callback回调函数,会得到一个相关信息的参数对象Monitor () {let body = document.getElementsByTagName('body')[0]let options = {childList: true,attributes: true,characterData: true,subtree: true,attributeOldValue: true,characterDataOldValue: true}let observer = new MutationObserver(this.callback)observer.observe(body, options) // 监听body节点},

使用

  • 直接引入项目任何组件中使用即可
  • 组件prop接收三个参数
  props: {// 显示的水印文本inputText: {type: String,default: 'waterMark水印'},// 是否允许通过js或开发者工具等途径修改水印DOM节点(水印的id,attribute属性,节点的删除)// true为允许,默认不允许inputAllowDele: {type: Boolean,default: false},// 是否在组件销毁时去除水印节点(前提是允许用户修改DOM,否则去除后会再次自动生成)// true会,默认不会inputDestroy: {type: Boolean,default: false}}
  • inputText(String):需要生成的水印文本,默认为'waterMark水印'
  • inputAllowDele(Boolean):是否需要允许用户删除水印DOM节点,true为允许,默认不允许
  • inputDestroy(Boolean):是否在组件销毁时去除水印节点,true会,默认不会,(只有在inputAllowDele为ftrue时才能生效)
  • 如果需要修改水印大小,文字,颜色等样式,可直接进入组件中按注释修改

小结

  • 工作写了个相关组件,复用率挺高就封装了下,没有经过严格测试,可当做参考使用,有需要的朋友欢迎下载源码使用相关GitHub代码
  • 当然在浏览器端无论怎样也不能完全防止用户的的行为,但也能满足多数需求场景
文章来源:https://blog.csdn.net/weixin_33829657/article/details/88685759
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-1065372.html

相关文章

day012生成器函数、生成器表达式、列表推导式

本节主要内容 生成器和生成器表达式 列表推导式 一、生成器 生成器实质就是迭代器 1、python中获取生成器的三种方式: * 通过生成器函数 * 通过生成器表达式 * 通过数据的转换获取生成器 1.生成器函数 fe1: def func(): print("111") yield 222 ret fun…

数据治理到底能不能干

为什么是脏活、累活?1. 源数据烟囱式开发:业务繁多、数据库多而乱,系统与系统之间错综复杂数据库种类:架构经历多次变迁,切换不完全,需要从Mysql、oracle、hbase甚至excle表中跨库、跨实例、跨种类才能获得…

那些年,我爬过的北科(四)——爬虫进阶之极简并行爬虫框架开发

写在前面 在看过目录之后,读者可能会问为什么这个教程没有讲一个框架,比如说scrapy或者pyspider。在这里,我认为理解爬虫的原理更加重要,而不是学习一个框架。爬虫说到底就是HTTP请求,与语言无关,与框架也无…

C51 中断 个人笔记

总架构图 IE寄存器 控制各个中断源的屏蔽与允许 TCON寄存器 各个中断源的请求标志位&有效信号的规定 中断源及其优先级 中断号写程序的时候要用 CPU处理中断三原则 1.CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。 2.正在进行的中断过程不能被新的…

python-装饰器实现pv-uv

python-装饰器实现pv-uv 网站流量统计可以帮助我们分析网站的访问和广告来访等数据,里面包含很多数据的,比如访问试用的系统,浏览器,ip归属地,访问时间,搜索引擎来源,广告效果等。原来是一样的&…

Flink控制任务调度:作业链与处理槽共享组(SlotSharingGroup)

概述为了实现并行执行,Flink应用会将算子划分为不同任务,然后将这些任务分配到集群中的不同进程上去执行。和很多其他分布式系统一样,Flink应用的性能很大程度上取决于任务的调度方式。任务被分配到的工作进程、任务间的共存情况以及工作进程…

gcc 无法编译c17程序解决办法

1.保证将gcc程序升级到7.1以上。 2.如果用命令行手工编译,就多加个参数-stdc17,例如命令应该是: "g" -stdc17 "text.cpp" -o "text.exe" 这样就能编译成功了。 3.如果是集成环境,那就在调用插件那…

手把手用 express 搭建后台

前言 想必很多小伙伴开始学 node 的时候想搞个项目出来却不知道怎么下手吧,这个教程的话就是教大家用 express 框架简单粗暴搭建一个可以用的后台出来,然后关于 node 和 express 的其他知识,大家还是需要自己去看看文档了解一下。 1 环境准备…

八张图,看懂数据分析如何驱动决策

数据驱动决策,是大家天天挂在嘴边的时髦词汇。可到底数据是如何驱动的?很少有同学真正看到过全流程。更有同学总疑惑:“自己被人追着屁股要数,感觉自己才是被驱着动的“。今天系统讲解一下,拒绝跟风。1 最原始的决策流…

基于Impala的高性能数仓实践之执行引擎模块

导读:本系列文章将结合实际开发和使用经验,聊聊可以从哪些方面对数仓查询引擎进行优化。Impala是Cloudera开发和开源的数仓查询引擎,以性能优秀著称。除了Apache Impala开源项目,业界知名的Apache Doris和StarRocks、SelectDB项目…