【VUE】前端实现防篡改的水印

这篇具有很好参考价值的文章主要介绍了【VUE】前端实现防篡改的水印。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果

【VUE】前端实现防篡改的水印,语言-HTML,VUE,前端,vue.js,Watermark,watchEffect,Mutation,Observer,canvas

【VUE】前端实现防篡改的水印,语言-HTML,VUE,前端,vue.js,Watermark,watchEffect,Mutation,Observer,canvas

水印的作用

图片加水印的操作一般是由后端来完成,有些站点保护的知识产权的类型可能比较多,不仅仅是图片,可能还有视频、文字等等,对于不同类型的对象添加水印后端操作比较复杂,所有有些站点逐步的让前端去进行水印添加的操作。

前端框架

React框架

如果用React框架来进行开发就比较简单,在Ant Design 库里面有一个水印组件Watermark,通过这个组件你可以给一个区域加上一个水印。区域内容没有限制,如图片、文字、视频等等添加水印都是可以的。
【VUE】前端实现防篡改的水印,语言-HTML,VUE,前端,vue.js,Watermark,watchEffect,Mutation,Observer,canvas

Vue 框架

Ant Design Vue Element UI 暂时没有水印组件。所以需要自己开发,基本思路如下:

  1. 生成水印 :使用canvas.toDataURL()生成base64水印图片数据,将水印图片数据赋值到水印div上。
  2. 防止篡改
    • 监控篡改 : 使用 MutationObserver.observe 监控水印元素、属性、内容、子元素变化,然后改变依赖数据flag.value++;
    • 重新添加水印:定义响应式依赖数据const flag = ref(0);, 使用 watchEffect 自动追踪依赖flag.value;,重新添加水印元素

代码

App.vue

<template>
  <div class="container">
    <WatermarkComponent text="少莫千华">
      <div class="content" style="background-color: red;">
        <img  src="./assets/LA.png"/>
      </div>
    </WatermarkComponent>
    <WatermarkComponent text="少莫千华">
      <video controls class="video" src= './assets/LA.mp4'></video>
    </WatermarkComponent>
  </div>
</template>

<script>
import WatermarkComponent from './components/WatermarkComponent.vue'

export default {
  name: 'App',
  components:{
    WatermarkComponent
  }
}
</script>

<style scoped>
.container{
  width: 100%;
  display: flex;
  justify-content: space-around;
  position: relative;
}
.content{
  display: flex;
  justify-content: center;
  align-items: center;
  position: relative;
  margin: 3px;
}
img{
  height: 100%;
  width: 100%;
  object-fit:cover;
}
video {
  height: 110%;
  width: 100%;
  object-fit:fill;
}
.watermark-container {
  position: relative;
  flex-basis: 50%;
  box-sizing: border-box;
}
video{
  position: absolute;
  flex-basis: 50%;
  box-sizing: border-box;
}

#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

WatermarkComponent.vue

<template>
  <div class="watermark-container" ref="parentRef">
    <slot></slot>
  <!-- 添加一个div,填充整个区域,设置水印背景,重复 -->
  </div>
</template>

<script setup>
import { onMounted, onUnmounted,defineProps, ref, watchEffect } from 'vue';
import useWatermarkBg from './useWatermarkBg';

const props = defineProps( {
  text: {
    type: String,
    required: true,
    default: '少莫千华',
  },
  fontSize:{
    type: Number,
    default: 40,
  },
  gap:{
    type:Number,
    default:20,
  },
});
const bg = useWatermarkBg(props);
const parentRef = ref(null);
// 定义一个依赖
const flag = ref(0);
let div;

//挂载以后添加水印
//监控元素变化、元素属性变化,防止篡改
//动态生成水印元素div
watchEffect(()=>{
  flag.value;
  if(!parentRef.value){
    return ;
  }
  if(div)
  {
    div.remove();
  }
  const {base64,styleSize} = bg.value;
  div = document.createElement('div');
  div.style.backgroundImage = `url(${base64})`;
  div.style.backgroundSize = `${styleSize}px ${styleSize}px`;
  // 重复平铺
  div.style.backgroundRepeat = 'repeat'; 
  // 覆盖到同级的上一个元素
  div.style.zIndex = 9999;
  // 绝对定位
  div.style.position = 'absolute';
  // 设置边距
  div.style.inset = 0;
  //div.style.left = 0;
  //div.style.right = 0;
  //div.style.top = 0;
  //div.style.bottom = 100;
  //将水印添加到 .watermark-container 元素中
  parentRef.value.appendChild(div);
});

onMounted(()=>{
    //监控元素属性、子元素、内容、元素本身变化
    let ob =  new MutationObserver((records)=>{
    console.log(records);
    for(const record of records) {
      // 判断删除的节点
      for(const dom of record.removedNodes) {
        // 判断节点是不是水印
        if(dom === div) {
          //删除水印元素触发 watchEffect
          console.log('删除了水印元素');
          // 修改依赖值,触发 watchEffect 重新运行
          flag.value++;
          return;
        }
      }
      //修改水印元素属性触发 watchEffect
      if(record.target === div){
        console.log('修改了水印属性');
        // 修改依赖值,触发 watchEffect 重新运行
        flag.value++;
        return;
      }
      //生产环境考虑到其他内容,完善,如 ZIndex 等等
    }
  });
  // 监听 parentRef.value的变化
  // 监听内容:childList、attributes、subtree
  ob.observe(parentRef.value,{
    childList: true,
    attributes : true,
    subtree: true,
  });
  onUnmounted(()=>{
    ob && ob.disconnect();//取消监听
    div = null;
  });
});



</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.wartermark-container{
  position: relative;
}
</style>

生成水印图像 useWatermarkBg.js

import { computed } from 'vue';

export default function useWatermarkBg(props) {
  return computed(() => {
    const canvas = document.createElement('canvas');
    const devicePixelRatio = window.devicePixelRatio || 1;
    const fontSize = props.fontSize * devicePixelRatio;
    const font = fontSize + 'px serif';
    const ctx = canvas.getContext('2d');
    // 获取文字宽度
    ctx.font = font;
    const {width} = ctx.measureText(props.text);
    const canvasSize = Math.max(100, width) + props.gap * devicePixelRatio;
    console.log(canvasSize + 'px');
    canvas.width = canvasSize;
    canvas.height = canvasSize;
    ctx.translate(canvas.width/2, canvas.height/2);
    //倾斜文本45°
    ctx.rotate((Math.PI/180) * -45);
    ctx.fillStyle  = 'rgba(0,0,0,0.3)';
    ctx.font = font;
    ctx.textAlign = 'center';
    ctx.textBaseline = 'middle';
    ctx.fillText(props.text,0,0);
    return {
      base64:canvas.toDataURL(),
      size:canvasSize,
      styleSize:canvasSize/devicePixelRatio,
    };
  });
}

资源

LA.png

【VUE】前端实现防篡改的水印,语言-HTML,VUE,前端,vue.js,Watermark,watchEffect,Mutation,Observer,canvas

LA.mp4

演讲开始素材文章来源地址https://www.toymoban.com/news/detail-630908.html

到了这里,关于【VUE】前端实现防篡改的水印的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端vue实现页面加水印文字 单个页面所有页面加水印 水印颜色

    前端vue实现页面加水印文字, 可以实现系统所有页面加水印,也可以单个页面加水印, 可更改水印颜色,  阅读全文下载完整代码请关注微信公众号: 前端组件开发 效果图如下:       #### 使用方法 ```使用方法 /* 给系统所有页面加水印*/ // 第一个参数:水印文字  第二个参数: 加

    2024年02月08日
    浏览(60)
  • vue 纯前端预览pdf,纯前端实现pdf加水印下载文件也带水印,防止pdf下载

      原理:主要是利用pdfh5这个插件来完成的   使用方法:   1.页面需要有一个容器例子:div id=\\\"demo\\\"/div   2.下载pdfh5插件 npm install pdfh5   (注意:webpack5之后不会下载polyfill 需要手动下载 所以引入pdfh5的时候会报错)   解决方案:下载 node-polyfill-webpack-plugin npm install node-polyfill-

    2024年04月15日
    浏览(68)
  • 前端HTML、CSS、JS、VUE3 汇总

    学习https://developer.mozilla.org/zh-CN/docs/Learn/CSS 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 使用VS Code运行前端代码 在VS Code上安装前端插件 正在更新中~ ✨ 提示:这里可以添加本文要记录的大概内容: 学习路线 知识定位 HTML基础 标签、表格、表单、

    2024年02月13日
    浏览(51)
  • 前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案二:轮询去判断服务端的index.html是否跟当前的index.html的脚本hash值一样

    当我们重新部署前端项目的时候,如果用户一直停留在页面上并未刷新使用,会存在功能使用差异性的问题,因此,当前端部署项目后,需要提醒用户有去重新加载页面。 vue、js、webpack 根据打完包之后生成的 script src 的hash值去判断 ,每次打包都会生成唯一的hash值,只要轮

    2024年01月23日
    浏览(44)
  • 用js实现html页面水印

    要在 HTML 页面中添加水印并防止截图,可以使用 JavaScript。以下是实现的基本步骤: 1、在 HTML 中添加一个 div 元素作为水印容器,并设置其样式。 2、使用 JavaScript 动态生成水印内容,并将其添加到水印容器中。 3、通过 CSS 设置水印文本的样式,例如颜色、字体大小等。 4、

    2023年04月11日
    浏览(33)
  • vue用js 添加水印

    2024年02月22日
    浏览(42)
  • 【前端】html2canvas生成图片空白排查data:;(js vue react uniapp)

    因为要做一个分享图,就用到了html2canvas,一开始是好好的,今天随便测了下,发现图片显示不出来了。打印了下,生成的图片链接变成了 data:; 。后面一步一步地排查,发现是页面内容太多了,删减一点内容就能显示出来。然后我又去认真看了下html2canvas的各个参数,发现可

    2024年02月03日
    浏览(59)
  • 免费下载xlsx.full.min.js包,并放入前端代码里,在html+vue中引用

    访问 xlsx.js 的 GitHub 页面:https://github.com/SheetJS/sheetjs 在 GitHub 页面中,找到 \\\"Code\\\" 按钮,然后点击它,在下拉菜单中选择 \\\"Download ZIP\\\",以下载 xlsx.js 的最新版本。 解压下载的 ZIP 文件。 在解压后的文件夹中,你会找到 xlsx.full.min.js 文件。将这个文件复制到你的前端项目中,通

    2024年02月02日
    浏览(37)
  • 前端vue2 全局水印效果

    最近写项目遇到一个需求,全局显示水印,不管在哪个路由都要显示。 想要实现的效果: 新建shuiyin.js文件 main.js中全局注册

    2024年02月15日
    浏览(50)
  • 前端实现 input 回车搜索(html,vue,react实现)

    搜索框是个常见的功能,除了 用ui库,有的时候必须要自己封装(因为改ui库太麻烦了,定制化要求很高),所以 涉及到 点击按钮搜索和回车搜索都要实现。下面就是实现的一些方法。 html里: 方式一:html里可以用 form 来实现,因为form里回车也能触发提交事件。思路就是

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包