简单通用防篡改水印组件封装(vue3)

一、项目结构

二、项目代码

1.App.vue

<template>
  <div class="container">
    <Watermark text="版权所有">
      <div class="content"></div>
    </Watermark>
    <Watermark text="禁止转载" style="background:#28c840">
      <div class="content"></div>
    </Watermark>
  </div>
</template>
<script setup>
import Watermark from './components/WaterMark.vue'
</script>
<style scoped>
.container {
  width: 100%;
  /* height: 600px; */
  display: flex;
  justify-content: space-between
}
.content{
  width:50vw;
  height: 400px;
}
</style>

2.WaterMark.vue

<template>
    <div class="watermark-container" ref="parent">
        <slot></slot>
    </div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
import useWatermarkBg from './useWatermarkBg'
const props = defineProps({
    text: {
        type: String,
        required: true,
        default: 'watermark'
    },
    fontSize: {
        type: Number,
        default: 20,
    },
    gap: {
        type: Number,
        default: 20,
    }
})
const parent = ref()
let div
const bg = useWatermarkBg(props)
const ob = new MutationObserver((entries) => {
       console.log("entries",entries);
    for (const entry of entries) {
        // console.log("entry",entry);
        for (const node of entry.removedNodes) {
            console.log("target", entry.target, "div", div);
            if (node === div) {
                resetWatermark()
                console.log(123);
            }
           
        }
        if (entry.target === div) {
                resetWatermark()
                console.log(456);
            }
    }
})

// 重置水印
function resetWatermark() {
    if (!parent.value) {
        return
    }
    if (div) {
        div.remove()
    }
    const { base64, size } = bg.value
    div = document.createElement('div')
    div.style.position = 'absolute'
    div.style.backgroundImage = `url(${base64})`
    div.style.backgroundSize = `${size}px ${size}px`
    div.style.backgroundRepeat = 'repeat'
    div.style.zIndex = 9999
    div.style.pointerEvents = 'none'
    div.style.inset = 0
    parent.value.appendChild(div)
}
onMounted(() => {
    resetWatermark()
    ob.observe(parent.value, {
        childList: true, 
        subtree: true, 
        attributes: true,
    })
})
onUnmounted(() => {
    ob.disconnect()
})
</script>
<style scoped>
.watermark-container {
    position: relative;
}
</style>

3.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
        canvas.width = canvasSize
        canvas.height = canvasSize
        ctx.translate(canvas.width / 2, canvas.height / 2)
        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 / devicePixelRatio
        }
    })
}

三、运行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/719304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker 中 File Sharing 和Volumes 的区别

在 Docker 中&#xff0c;File Sharing 和 Volumes 都涉及到将文件和目录从主机系统映射到容器中&#xff0c;但它们的用途和实现方式有一些重要的区别&#xff1a; 一、简介 File Sharing 是 Docker Desktop 在 Windows 和 macOS 上的一项功能&#xff0c;允许你将主机文件系…

了解振弦采集仪在建筑物安全监测中的应用与研究

了解振弦采集仪在建筑物安全监测中的应用与研究 摘要&#xff1a;河北稳控科技振弦采集仪是一种常用的结构物安全监测设备&#xff0c;广泛应用于建筑物、桥梁、塔楼等工程结构的监测。本文将从振弦采集仪的原理、应用案例和研究进展等方面进行详细介绍&#xff0c;以便更好地…

Web开发技术大作业(HTML\CSS\PHP\MYSQL\JS)

从6月13日到6月15日&#xff0c;经过一系列的操作&#xff0c;终于把老师布置的大作业写完了&#xff0c;虽然有很多水分&#xff0c;很多东西都是为了应付&#xff08;特别是最后做的那几个网页&#xff09;&#xff0c;真的是惨不忍睹&#xff0c;不过既然花时间写了&#xf…

振动分析-4-振动传感器的安装部署

参考(电机、减速机、风机)振动传感器部署指南 设备状态监测的测点通常选在设备轴承或靠近轴承的位置&#xff0c;通过在轴向、垂直方向、水平方向部署振动传感器来实现设备振动信号的采集。但在实际工作中&#xff0c;考虑安装空间和硬件成本&#xff0c;部署过程通常被两个问题…

两个方法教你如何查看隐藏文件!

在日常使用电脑的过程中&#xff0c;我们可能会遇到一些被隐藏起来的文件&#xff0c;这些文件可能是由于系统设置、安全考虑或是其他原因而被隐藏。 虽然这些隐藏文件通常不会影响我们日常使用电脑&#xff0c;但在某些情况下&#xff0c;我们可能需要查看或访问这些文件。那…

电脑剪辑软件推荐哪个?分享4款剪辑工具

电脑剪辑软件推荐哪个&#xff1f;在选择电脑剪辑软件时&#xff0c;我们不仅要考虑软件的功能性和易用性&#xff0c;还要关注其是否能够方便地扩充我们的创作资源和技能。优秀的剪辑软件应提供丰富的素材库、模板和插件&#xff0c;让我们能够轻松获取所需的音频、视频、滤镜…

MYSQL数据库安装

一.编译安装MySQL服务 1.安装环境依赖包 2.将安装mysql 所需软件包传到/opt目录下 mysql-boost-5.7.44.tar tar zxvf mysql-boost-5.7.44.tar.gz 3.配置软件模块 cd /opt/mysql-5.7.44/ cmake \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DMYSQL_UNIX_ADDR/usr/local/mysq…

Java switch case 语句

Java switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等&#xff0c;每个值称为一个分支。 语法 switch case 语句语法格式如下&#xff1a; switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可选 //你可以有任…

05眼动识别软件详情2波形优化-滤波

对应视频链接点击直达 01项目点击下载&#xff0c;可直接运行&#xff08;含数据库&#xff09; 05眼动识别软件详情2 对应视频链接点击直达期望的数据展示数据波形对比如何实现几种常用滤波介绍维纳滤波巴特沃斯滤波器中值滤波排序滤波 推荐 结语其他以下是废话 原始数据的波…

多种总部文件下发方式比较,哪一种既相应业务效率又保证安全?

大型企业在全国甚至全球都会设有分公司、办事处、生产工厂、研发中心等不同形式的分支机构&#xff0c;在日常经营中&#xff0c;存在多种总部文件下发的场景&#xff0c;如将公司战略规划与考核、规章制度、新产品信息及定价策略、业务培训指导材料、客户数据及资料、内部通知…

自学【大模型】的,能骂醒一个算一个!

为啥说胡乱自学大模型的&#xff0c;能骂醒一个算一个。因为很多人学会个AI工具就觉得自己会玩大模型了&#xff0c;其实你才刚入门&#xff01; 想要完全了解大模型&#xff0c;你首先要了解市面上的LLM大模型现状&#xff0c;学习Python语言、Prompt提示工程&#xff0c;然后…

成都跃享未来教育抖音小店,一站式平台!

在如今的教育市场上&#xff0c;成都跃享未来教育咨询有限公司以其独特的经营理念和创新的教育模式&#xff0c;吸引了众多家长和学生的关注。特别是在抖音小店这一新兴电商平台上&#xff0c;跃享未来教育更是展现出了非凡的魅力和潜力&#xff0c;成为了成都教育咨询领域的一…

需要用来做3D家具展示的软件哪个网站更专业?

国内外的3D家具展示软件网站并且值得推荐的也就那么几家&#xff1a; 1、Cedreo&#xff0c;Cedreo 是一个在线3D家居设计平台&#xff0c;适合专业的房屋建筑商、改造商和室内设计师。它允许用户创建2D和3D平面图以及室内外效果图&#xff0c;拥有7000多件可定制的3D家具、材…

视频融合平台LntonCVS视频监控汇聚平台:构建多元接入与智能管理的安防新生态

一、视频融合平台概述 视频融合平台支持多种协议和设备类型的接入&#xff0c;包括GB28181、Onvif、RTSP、RTMP、海康SDK、Ehome、大华SDK、宇视SDK等。它能够统一整合和管理来自不同品牌、不同协议的视频资源&#xff0c;构建视频数据资源池&#xff0c;并通过视频资源目录为…

使用LangChain+Ollama自己做的一个和大语言模型聊天的网站支持上下文对话,学习记录。

0.引言 在自己学习的过程中可以自己做一个和聊天大模型对话的一个小网站&#xff0c;成就感不亚于人生第一次跑完10km。 1.项目介绍 前端代码&#xff1a;Vue3, MarkDownIT. 后端代码&#xff1a;Python3, Fernet库, OpenAPI, LangChain, Ollama. Ollama 本地模型的部署和管理…

PCB曝光设备日志采集工具

PCB大多数曝光设备,日志放在一起,并且不断持续写入,可通通过: 过滤文件名指定文件名 排除多余的日志;增量日志,可采用增量模式; 下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自启动,…

使用python绘制三维直方图

使用python绘制三维直方图 三维直方图定义特点 效果代码 三维直方图 维直方图&#xff08;3D直方图&#xff09;是一种用于展示三维数据分布情况的图表。它扩展了二维直方图的概念&#xff0c;通过在三维空间中绘制柱体来表示数据在三个维度&#xff08;X、Y、Z&#xff09;上…

【开发利器】OpenCV实验大师最新版本又又发布了

最新发布 大家好&#xff0c;OpenCV实验大师 最新发布的安装包已经支持Python3.10了。同时继续支持Python3.8的安装包&#xff0c;OpenCV实验大师工具软件本次从Python3.8升级到Python3.10是为了方便更多基于Python3.10的开发者使用。同时修复了一批软件错误。 安装配置 下载…

信创服务器操作系统的适配迁移分析

浅谈信创服务器操作系统的适配迁移 01 服务器操作系统迁移适配流程复杂 随着CentOS停服临近和红帽RHEL源码权限受限&#xff0c;服务器操作系统安全漏洞风险加剧。国内众多企业面临CentOS、REHL等系统升级替换的挑战。同时&#xff0c;出于安全、功能升级和合规需求&#xff0…

从0开始C++(一)

目录 c的基本介绍 C语言和C 的区别 面向过程和面向对象的区别 引用 引用使用的注意事项 赋值 终端输入 cin getline string字符串类 遍历方式 字符串和数字转换 函数 内联函数 函数重载overload 小练习&#xff1a; 参考代码 c的基本介绍 C是一种通用的高级编…