Vue框架项目,给容器添加水印watermark

news2024/11/28 10:39:17

1、在@/utils下新增一个名为waterMark.js的脚本

具体水印样式可以在代码里自行调节style

参数 - 水印内容, 加水印的容器, 是否显示时间

let watermark = {};

function getCurrentDateTime() {
  const now = new Date();

  const year = now.getFullYear();
  const month = String(now.getMonth() + 1).padStart(2, "0");
  const day = String(now.getDate()).padStart(2, "0");

  const hours = String(now.getHours()).padStart(2, "0");
  const minutes = String(now.getMinutes()).padStart(2, "0");
  const seconds = String(now.getSeconds()).padStart(2, "0");

  const dateTime = `${year}-${month}-${day}`;
  return dateTime;
}

const currentDateTime = getCurrentDateTime();
let setWatermark = (text, sourceBody, isShowTime) => {
  if (isShowTime) {
    let time = getCurrentDateTime();
    text = `${text}\n${time}`;
  }
  //   console.log("水印文本", text);
  let id =
    Math.random() * 10000 +
    "-" +
    Math.random() * 10000 +
    "/" +
    Math.random() * 10000;

  if (document.getElementById(id) !== null) {
    document.body.removeChild(document.getElementById(id));
  }

  let can = document.createElement("canvas");
  can.width = 180;
  can.height = 75;

  let cans = can.getContext("2d");
  cans.rotate((-20 * Math.PI) / 180);
  cans.font = "15px Vedana";
  cans.fillStyle = "rgba(0, 0, 0, .5)";
  cans.textAlign = "left";
  cans.textBaseline = "Middle";
  //   let textLines = text.split("\n");
  //   textLines.forEach((line, index) => {
  //     cans.fillText(line, can.width / 20, can.height * (index + 1)); // 调整行高
  //   });
  cans.fillText(text, can.width / 20, can.height);

  let water_div = document.createElement("div");
  water_div.id = id;
  water_div.style.pointerEvents = "none";
  water_div.style.background =
    "url(" + can.toDataURL("image/png") + ") left top repeat";
  water_div.style.zIndex = "100000";
  water_div.style.whiteSpace = "pre";
  water_div.style.opacity = "0.5";
  if (sourceBody) {
    water_div.style.width = "100%";
    water_div.style.height = "100%";
    water_div.style.position = "absolute";
    water_div.style.top = "3px";
    water_div.style.left = "0px";
    sourceBody.appendChild(water_div);
  } else {
    water_div.style.top = "3px";
    water_div.style.left = "0px";
    water_div.style.position = "fixed";
    water_div.style.width = document.documentElement.clientWidth + "px";
    water_div.style.height = document.documentElement.clientHeight + "px";
    document.body.appendChild(water_div);
  }

  return id;
};

/**
 *  该方法只允许调用一次
 *  @param:
 *  @text == 水印内容
 *  @sourceBody == 水印添加在哪里,不传就是body
 *  @isShowTime == 是否显示时间
 * */
watermark.set = (text, sourceBody, isShowTime) => {
  let id = setWatermark(text, sourceBody, isShowTime);
  setInterval(() => {
    if (document.getElementById(id) === null) {
      id = setWatermark(text, sourceBody, isShowTime);
    }
  }, 1000);
  window.onresize = () => {
    setWatermark(text, sourceBody, isShowTime);
  };
};

export default watermark;

2、在main.js下进行全局注册

import watermark from '@/utils/waterMark.js'
Vue.prototype.$watermark = watermark

3、在vue组件中使用

<el-dialog :visible.sync="openFile">
    <div id="fileDialog" ref="fileDialog" style="height:100%;width:100%;"></div>
</el-dialog>
handleOpenDialog(){
    this.openFile = true; //打开对话框
    this.$nextTick(()=>{
        let nickName = "admin";
        // 参数 - 水印内容, 加水印的容器, 是否显示时间
        this.$watermark.set(nickName, this.$refs.fileDialog, true);
    })
}

4、效果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue入门教学——编写第一个页面

以Vue2.0为例子。 1、创建一个Vue项目 创建过程&#xff1a;Vue-cli&#xff08;脚手架&#xff09;的创建_vue脚手架创建项目命令-CSDN博客【注】项目名不能有大写字母。创建完毕后&#xff0c;使用VSCode打开项目文件夹&#xff08;其他编辑器也行&#xff09;。 2、运行项…

人声与背景音乐源分离

一.人声分离项目说明 人声分离是将音频录音分离为各个源的任务。该存储库是音乐源分离的 PyTorch 实现。用户可以通过安装此存储库将自己喜欢的歌曲分成不同的来源。用户还可以训练自己的源分离系统。该存储库还可用于训练语音增强、乐器分离和任何分离系统。 2.1 环境配置 …

嵌入式开发:ST-LINK V2.1仿真器,Type-C接口

标题ST-LINK V2.1仿真器&#xff0c;Type-C接口 之前做的版本虽然也是V2.1的&#xff0c;但使用的接口是USB的Micro形式&#xff0c;不支持正反插&#xff0c;也不兼容现在通用的手机数据线&#xff0c;出差的时候又要多带一条线。 现在终于把我的ST-LINK的接口改了一下 如下…

修改Android Studio默认的gradle目录

今天看了一下&#xff0c;gradle在C盘占用了40多G。我C盘是做GHOST的&#xff0c;放在这里不方便。所以就要修改。 新建目录名&#xff08;似乎无必要&#xff09; ANDROID_SDK_HOMEG:\SOFTWARES\android-sdk GRADLE_USER_HOMEG:\SOFTWARES\.gradle 修改目录 File->Setti…

“探秘!根据关键词搜索商品列表的虾皮API大揭露!“

要使用虾皮API根据关键词获取商品列表&#xff0c;您需要使用虾皮API的搜索功能。以下是使用Python和虾皮API根据关键词获取商品列表的基本步骤&#xff1a; 注册虾皮API账号并获取API凭证&#xff08;访问虾皮开放平台并创建应用以获取API凭证&#xff09;。安装必要的Python…

软件学习心得

标定表示&#xff1a;通过不断修改软件控制参数&#xff0c;使得系统得到最佳运行状态 通过xcp协议进行标定&#xff08;XCP寻址的通讯方式&#xff09; A2L文件是上位机解析ECU描述文件数据库&#xff1a;存放了变量名称、数据格式、转换规则&#xff0c;还存放了ECU的通讯信息…

python 把函数的值赋给变量

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一个是模块的调用和一个自定义函数返回值赋值给变量 编写一个简单的函数模块&#xff1a; def run(name): list1 hello namereturn list1编写一个调用的脚…

Avalonia播放视频(mp4)

1.Nuget添加类库Dove.Avalonia.Extensions.Media&#xff0c;项目路径https://github.com/michael-eddy/Avalonia.Extensions/ 2.Nuget添加VideoLAN.LibVLC.Windows PlatformLibVLC PackageMinimum OS VersionWindowsVideoLAN.LibVLC.WindowsWindows XPUWPVideoLAN.LibVLC.UW…

EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(一):驱动安装与建立连接

XPCIE1032H功能简介 XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡&#xff0c;可选6-64轴运动控制&#xff0c;支持多路高速数字输入输出&#xff0c;可轻松实现多轴同步控制和高速数据传输。 XPCIE1032H集成了强大的运动控制功能&#xff0c;结合MotionRT7运动…

Intel x86_64 LBR功能

文章目录 前言一、CPUID指令1.1 CPUID功能简介1.2 输入参数01H返回结果1.2.1 ECX返回结果1.2.2 EDX返回结果 1.3 Linux中CPUID指令1.3.1 应用层调用cpid指令1.3.2 linux内核中调用cpuid指令 二、MSR寄存器2.1 MSR 寄存器简介2.2 RDMSR,WRMSR指令介绍2.3 IA32_DEBUGCTL MSR 寄存…

净利暴跌9成,主力业务下滑,这家全球知名CIS供应商如何“翻身”?

消费电子寒冬对上游供应链的影响还在持续。 近日&#xff0c;全球知名的CMOS图像传感器&#xff08;CIS&#xff09;供应商格科微发布三季报显示&#xff0c;前三季度共实现营业收入32.45亿元&#xff0c;同比下降29.01%&#xff1b;实现净利润4972.57万元&#xff0c;同比下降…

开发中常用的SQL语句

开发中常用的SQL语句 1.update更新时不能引用本身表2.备份MySQL3.函数的使用1. case,when的使用2. IF3.其它4.拼接5. 处理时间 4.导出表结构注释等 1.update更新时不能引用本身表 UPDATE student SET valid_flag 0 WHERE id IN (SELECT idFROM (SELECT su.idFROM student su …

如何接入电商数据(淘宝/京东)API接口的对接获取(商品详情|价格|SKU)

双11是电商行业的两个重大节点&#xff0c;这两大节日吸引了大量消费者参与&#xff0c;同时也为电商企业带来了巨大的销售机会和业绩增长。 作为疫情放开之后的第一场“战役”&#xff0c;今年618显然被寄予了厚望。无论是大型电商品牌还是小型电商商家&#xff0c;都在积极探…

SQL练习---511.游戏玩法分析 I

题目描述 分析 题目描述很简单&#xff0c;找出用户第一次登陆的时期&#xff0c;很简单一个用户有多个记录&#xff0c;因此按用户分组即可&#xff0c;但是不知道日期能否求出最小值&#xff0c;事实证明还是可以的。 题解 select player_id,min(event_date) first_login f…

ObjectMapper - 实现复杂类型对象反序列化(天坑!)

目录 一、复杂类型反序列化 1.1、背景 1.2、问题解决 一、复杂类型反序列化 1.1、背景 a&#xff09;例如有 AppResult 对象&#xff0c;如下&#xff1a; Data public class AppResult {private Integer code;private String msg;private Object data;} b&#xff09;App…

Postgresql 常用整理

文章目录 1. 查询1.1数据库表1.1.1 获取指定数据库表1.1.2 获取指定数据库表所有列名 1.2 别名1.2.1 子表指定别名1.2.2 查询结果指定别名 1.3 临时表1.3.1 定义临时表1.3.2 使用临时表 1.4 子表1.5 分组1.5.1 group by1.5.2 partition by 1.6 分组后合并指定列字段&#xff1a…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(排它条件网关)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 这个章节来完成并行网关与排它条件网关的功能 1、前端 目前就修改了排它条件网关的前端条件部分&#xf…

SAP 11策略测试简介

下面我们将测试11策略 1、首先准备好物料 成品物料为AB1,在MRP3视图中维护对应的策略组的11 同时选择消耗模式为2.消耗期间都是999 在这个视图上,我们不仅仅是将“策略组”字段维护成11,同时,我们还需要将“综合MRP”字段维护成“2”。这就是11策略很特别的地方。“策略组”…

excel如何加密(excel加密的三种方法)

Excel是一款广泛使用的办公软件&#xff0c;有时候我们需要对一些重要的Excel文件进行加密&#xff0c;以保证文件的安全性。下面将介绍3种常用的Excel加密方法。 方法一&#xff1a;通过路径文件-另存为-工具-常规选项-设置打开或修改权限密码&#xff08;密码只可以使数字、字…

龙讯旷腾半导体缺陷计算大赛发布

2023计算大赛 第二期半导体缺陷计算大赛 选拔赛截止日期11月23日晚 决赛截止日期11月30日晚 线上线下同步 线下11月末杭州 大赛亮点 免费培训、灵活安排时间参与、线上线下&#xff08;杭州&#xff09;同步召开 多次机会冲关决赛奖励金 已购/未购用户均可参加、无身份…