页面增加水印及水印防删

从以下几点判断水印消失:
1.选用canvas 防止水印内容篡改
2.选用MutationObserver 监听水印的style属性是否被篡改和监听水印元素是否被删除
3.定时更新元素的z-index动态计算最大层级
watermark.js

/* by 01130.hk - online tools website : 01130.hk/zh/calclength.html */
let obj = JSON.parse(window.localStorage.getItem("User"));
let watermarkUrl = createWatermark([obj.name, obj.account]);
function createWatermark (text = '默认水印') {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  // 设置canvas尺寸
  canvas.width = 200;
  canvas.height = 150;
  // 旋转文字
  ctx.rotate((-15 * Math.PI) / 180);
  // 设置文字样式
  ctx.font = '20px Microsoft YaHei';
  ctx.fillStyle = 'rgba(0, 0, 0,0.1)';
  ctx.textAlign = 'center';
  ctx.textBaseline = 'middle';
  // 绘制文字(支持多行)
  const texts = Array.isArray(text) ? text : [text];
  texts.forEach((line, i) => {
    ctx.fillText(line, canvas.width / 2, canvas.height / 2 + i * 20);
  });
  // 转为图片URL
  return canvas.toDataURL('image/png');
}

// 计算页面中最大的z-index
function getMaxZIndex () {
  // 获取所有可见元素
  const elements = document.querySelectorAll('body *:not(.watermark-layer)');
  let maxZ = 10; // 默认最低层级(确保至少高于普通内容)
  elements.forEach(el => {
    const position = window.getComputedStyle(el).position;
    // 只处理有定位的元素(z-index对static无效)
    if (position !== 'static') {
      const zIndex = window.getComputedStyle(el).zIndex;
      if (zIndex !== 'auto') {
        const z = parseInt(zIndex, 10);
        if (!isNaN(z) && z > maxZ) {
          maxZ = z;
        }
      }
    }
  });
  return maxZ;
}
let styleStr = `position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-image: url(${watermarkUrl});
      background-repeat: repeat;
      pointer-events: none; 
      z-index: ${getMaxZIndex() + 1};
      `
// 闭包封装水印防护逻辑
export function initWatermark () {
  console.log('创建元素');

  // 创建水印元素(初始层级为最大z-index +1)
  let watermarkEl = document.createElement('div');

  watermarkEl.className = 'watermark-layer';
  watermarkEl.style.cssText = styleStr

  document.body.appendChild(watermarkEl);
  const observer = new MutationObserver((mutations) => {
    mutations.forEach((mutation) => {
      const watermarkEl = document.querySelector('.watermark-layer');
      if (!watermarkEl) {
        console.log('水印被删除,重新创建')
        observer.disconnect();
        initWatermark();

      }

      if (mutation.attributeName === 'style' && watermarkEl && watermarkEl.getAttribute('style') !== styleStr) {
        // 样式变化时,重新设置
        console.log('样式变化时,重新设置', styleStr)
        watermarkEl.setAttribute('style', styleStr);
      }

    });
  });
  observer.observe(document.body, {
    attributes: true,
    childList: true,
    subtree: true,
  });
  // 定时检查zIndex
  const checkTimer = setInterval(() => {
    zIndex();
  }, 300)
  // 清理函数 
  return () => {
    observer.disconnect();
    clearInterval(checkTimer);
  };

}

// 层级
function zIndex () {
  styleStr = `position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-image: url(${watermarkUrl});
      background-repeat: repeat;
      pointer-events: none; 
      z-index: ${getMaxZIndex() + 1};
      
      `
  const watermarkEl = document.querySelector('.watermark-layer');
  watermarkEl.setAttribute('style', styleStr);
}

main.vue

/* by 01130.hk - online tools website : 01130.hk/zh/calclength.html */
import { initWatermark } from '@/utils/watermark';  //引入
export default {
    data(){
        return{
             watermarkCleanup: null,
            }
    }
created(){
    //创建水印并保存清理函数
    const watermarkEl = document.querySelector('.watermark-layer');
    if (!watermarkEl) {
      // 保存清理函数的引用
      this.watermarkCleanup = initWatermark();

    }
}
  beforeDestroy () {
    // 调用清理函数来关闭定时器和页面元素监听
    if (this.watermarkCleanup) {
      this.watermarkCleanup();
    }
  }
}

如有遗漏,欢迎指教补充
同步定位与地图构建(SLAM)技术为移动机器人或自主载具在未知空间中的导航提供了核心支撑。借助该技术,机器人能够在探索过程中实时构建环境地图并确定自身位置。典型的SLAM流程涵盖传感器数据采集、数据处理、状态估计及地图生成等环节,其核心挑战在于有效处理定位与环境建模中的各类不确定性。 Matlab作为工程计算与数据可视化领域广泛应用的数学软件,具备丰富的内置函数与专用工具箱,尤其适用于算法开发与仿真验证。在SLAM研究方面,Matlab可用于模拟传感器输出、实现定位建图算法,并进行系统性能评估。其仿真环境能显著降低实验成本,加速算法开发与验证周期。 本次“SLAM-基于Matlab的同步定位与建图仿真实践项目”通过Matlab平台完整再现了SLAM的关键流程,包括数据采集、滤波估计、特征提取、数据关联与地图更新等核心模块。该项目不仅呈现了SLAM技术的实际应用场景,更为机器人导航与自主移动领域的研究人员提供了系统的实践参考。 项目涉及的核心技术要点主要包括:传感器模型(如激光雷达与视觉传感器)的建立与应用、特征匹配与数据关联方法、滤波器设计(如扩展卡尔曼滤波与粒子滤波)、图优化框架(如GTSAM与Ceres Solver)以及路径规划与避障策略。通过项目实践,参与者可深入掌握SLAM算法的实现原理,并提升相关算法的设计与调试能力。 该项目同时注重理论向工程实践的转化,为机器人技术领域的学习者提供了宝贵的实操经验。Matlab仿真环境将复杂的技术问题可视化与可操作化,显著降低了学习门槛,提升了学习效率与质量。 实践过程中,学习者将直面SLAM技术在实际应用中遇到的典型问题,包括传感器误差补偿、动态环境下的建图定位挑战以及计算资源优化等。这些问题的解决对推动SLAM技术的产业化应用具有重要价值。 SLAM技术在工业自动化、服务机器人、自动驾驶及无人机等领域的应用前景广阔。掌握该项技术不仅有助于提升个人专业能力,也为相关行业的技术发展提供了重要支撑。随着技术进步与应用场景的持续拓展,SLAM技术的重要性将日益凸显。 本实践项目作为综合性学习资源,为机器人技术领域的专业人员提供了深入研习SLAM技术的实践平台。通过Matlab这一高效工具,参与者能够直观理解SLAM的实现过程,掌握关键算法,并将理论知识系统应用于实际工程问题的解决之中。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值