uniapp加上全局水印

文章目录

  • 一、效果图
  • 二、创建```watermark.js```文件
  • 三、在main.js中引入
  • 四、运行

  • 前言:uniapp页面加水印你还在傻乎乎的一个个页面加吗,今天教你一招,一步到位

一、效果图

  • 未登录效果
    在这里插入图片描述

  • 登录后效果
    在这里插入图片描述

二、创建watermark.js文件

这里的水印因为我是为了显示store中的用户名字(user.name)和账号(user.userno),所以用了store,切记,这里的user.name和user.userno要换成自己的内容,我做了一个判断,如果是登录页面或者是忘记密码啊等等不用登录就能访问的页面,我都统一显示“请登录”,还有的页面不需要显示的,就给他过滤掉,其余的页面就正常显示用户姓名和编号,所以这里做了一个判断

/*** uniapp全局水印插件(支持排除特定页面)*/
import store from '@/store/index.js'
export default {install(app, options = {}) {// 默认配置const defaultOptions = {defaultContent: '未登录',width: 170, // 水印宽度height: 130, // 水印高度fontSize: 14, // 字体大小color: 'rgba(0, 0, 0, 0.1)', // 水印字体颜色及透明度rotate: -15, // 旋转角度zIndex: 999, // 在哪一层loginPaths: ['/pages/login', '/pages/forgetpwd'], // 登录相关页面路径(水印为请登录)excludePaths: ['/pages/common/webview/unindex'] // 需要排除水印的页面路径};const opts = { ...defaultOptions, ...options };let watermarkEl = null;let currentContent = '';// 获取当前页面路径function getCurrentPagePath() {const pages = getCurrentPages();if (pages.length) {const currentPage = pages[pages.length - 1];return `/${currentPage.route}`;}return '';}// 检查是否为需要排除水印的页面function isExcludedPage() {const currentPath = getCurrentPagePath();return opts.excludePaths.some(path => currentPath.includes(path));}// 检查是否为登录相关页面function isLoginPage() {const currentPath = getCurrentPagePath();return opts.loginPaths.some(path => currentPath.includes(path));}// 创建水印元素function createWatermark(content) {const canvas = document.createElement('canvas');canvas.width = opts.width;canvas.height = opts.height;const ctx = canvas.getContext('2d');ctx.rotate(opts.rotate * Math.PI / 180);ctx.font = `${opts.fontSize}px sans-serif`;ctx.fillStyle = opts.color;ctx.textAlign = 'left';ctx.textBaseline = 'middle';ctx.fillText(content, canvas.width / 10, canvas.height / 2);return canvas.toDataURL('image/png');}// 更新水印function updateWatermark(force = false) {// 如果是排除的页面,隐藏水印if (isExcludedPage()) {if (watermarkEl) watermarkEl.style.display = 'none';return;}// 确保水印元素存在if (!watermarkEl) {watermarkEl = document.createElement('div');watermarkEl.className = 'global-watermark';watermarkEl.style.cssText = `position: fixed;top: 0;left: 0;width: 100%;height: 100%;pointer-events: none;z-index: ${opts.zIndex};`;document.body.appendChild(watermarkEl);} else {watermarkEl.style.display = 'block';}const user = store?.state?.user || {};const newContent = isLoginPage() ? opts.defaultContent : ((user.name+' '+user.userno) || opts.defaultContent);if (newContent !== currentContent || force) {currentContent = newContent;const watermarkUrl = createWatermark(newContent);watermarkEl.style.backgroundImage = `url("${watermarkUrl}")`;}}// 初始化路由监听function initRouteWatcher() {// 轮询检查页面变化let lastPagesLength = 0;setInterval(() => {const pages = getCurrentPages();if (pages.length !== lastPagesLength) {lastPagesLength = pages.length;updateWatermark();}}, 300);}// 全局混入app.mixin({onLoad() {this.$nextTick(updateWatermark);},onShow() {updateWatermark();},mounted() {// 监听用户状态变化this.userWatcher = store?.watch((state) => state.user?.name,() => updateWatermark());},beforeUnmount() {// 清理监听器if (this.userWatcher) {this.userWatcher();}}});// 初始化initRouteWatcher();setTimeout(updateWatermark, 100);}
};    

三、在main.js中引入

import watermark from './watermark';
// 使用水印插件,可传入自定义配置
Vue.use(watermark, {loginPaths: ['/pages/login',  // 登录页'/pages/forgetpwd' // 忘记密码页面],defaultContent: '请登录'
});App.mpType = 'app';const app = new Vue({store,...App
})

四、运行

做完这几个步骤后,运行就可以显示出自己想要的效果了

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

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

相关文章

thinkphp8.0七牛云直传图片

环境&#xff1a;tp8\php8.3; 服务器&#xff1a;centOS Stream 9; 场景&#xff1a;通过html页面直传七牛云服务器&#xff0c;速度更快&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta na…

Godot x openKylin 全国开发大赛正式启动

从2023年开始&#xff0c;Godot Hub 每年举办一次 Godot Hub Festival 开发大赛&#xff0c;现已成为国内 Godot 社区规模最大的开发比赛。本届 Godot Hub Festival 2025将与 OpenAtom openKylin 开源社区合作举办&#xff0c;定名为 Godot x openKylin 全国开发大赛&#xff0…

工控机Linux修改网口

修改Ip:sudo nmcli connection modify net1-static ipv4.addresses 192.168.200.225/24 修改dns:sudo nmcli connection modify net1-static ipv4.dns 114.114.114.114 修改网关:sudo nmcli connection modify net1-static ipv4.gateway 192.168.200.1 IP生效&#xff1a;nm…

CRMEB Pro版v3.3源码全开源+PC端+Uniapp前端+搭建教程

一.介绍 crmeb Pro版 v3.3版本正式发布&#xff0c;全新UI重磅上线&#xff0c;焕然一新&#xff0c;不负期待&#xff01;页面DIY设计功能全面升级&#xff0c;组件更丰富&#xff0c;样式设计更全面&#xff1b;移动端商家管理&#xff0c;让商城管理更便捷&#xff0c;还从…

【python】OOP:Object-Oriented Programming

文章目录 1. 面向对象编程的核心概念1.1 类与对象的关系1.2 封装&#xff08;Encapsulation&#xff09; 2. 继承与多态2.1 继承机制2.2 多重继承2.3 多态性 3. 特殊方法与运算符重载4. 抽象类与接口4.1 抽象基类 5. 组合与聚合6. 属性管理6.1 使用property装饰器6.2 描述符协议…

蒙特卡洛方法:随机抽样的艺术与科学

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 蒙特卡洛算法&#xff08;Monte Carlo Method&#xff09;是一类基于随…

Linux基础 -- UBI(**Unsorted Block Images**)

UBI&#xff08;Unsorted Block Images&#xff09;是 Linux 中为原始 NAND Flash 设计的一种 逻辑卷管理层&#xff0c;其核心作用是&#xff1a;在 NAND 闪存设备上提供 坏块管理、擦写均衡&#xff08;wear leveling&#xff09;和逻辑到物理地址映射等机制&#xff0c;为上…

线程相关函数

思维导图 1. 创建一个分支线程&#xff0c;在主线程中拷贝文件的前一部分&#xff0c;主线程拷贝后一部分。 2.解读代码 info1 from child process_1 info1 from parent process3.解读代码&#xff0c;-打印多少次 14次

SeaTunnel 社区月报(5-6 月):全新功能上线、Bug 大扫除、Merge 之星是谁?

在 5 月和 6 月&#xff0c;SeaTunnel 社区迎来了一轮密集更新&#xff1a;2.3.11 正式发布&#xff0c;新增对 Databend、Elasticsearch 向量、HTTP 批量写入、ClickHouse 多表写入等多个连接器能力&#xff0c;全面提升了数据同步灵活性。同时&#xff0c;近 100 个修复与优化…

数学建模_非线性规划

matlab求解调用示例 第二道例题建模 matlab求解 1.matlab只能处理min问题&#xff1a; max两边取负号变成min 2. > > >号变成 < < <&#xff1a;两边取负号 调用示例 第二道例题建模 目标函数取平方而不取绝对值 后面省略

【BurpSuite 2025最新版插件开发】基础篇7:数据的持久化存储

1 前言 历史章节&#xff1a; 【BurpSuite 2025最新版插件开发】基础篇1&#xff1a;环境搭建 【BurpSuite 2025最新版插件开发】基础篇2&#xff1a;插件生命周期与核心接口 【BurpSuite 2025最新版插件开发】基础篇3&#xff1a;请求拦截和修改简单示例 【BurpSuite 202…

GPT-4 Turbo集成智能工作流,开启自动化研究与知识管理新篇章!

目录 一、系统架构设计二、核心模块实现1. 智能数据采集引擎2. 自动化研究引擎3. 知识管理系统 三、智能工作流引擎四、关键技术实现1. 动态工作流引擎2. 知识图谱构建 五、企业级部署方案1. 云原生架构2. Docker部署脚本 六、应用案例&#xff1a;药物研发项目七、性能优化策略…

告别SQL卡顿与混乱!AI如何赋能实时计算?

在当今数据驱动的商业环境中&#xff0c;SQL作为与数据库交互的核心语言&#xff0c;其编写效率和质量直接影响着企业的数据决策速度和系统性能。然而&#xff0c;我们在长期的企业服务实践中发现&#xff0c;数据库开发人员普遍面临以下痛点&#xff1a; SQL性能问题频发&…

LeetCode算法(和中等打的有来有回)——盛最多水的容器

文章目录 leetcode第11题&#xff1a;盛最多水的容器二次循环代码 双指针优化解析代码 leetcode第11题&#xff1a;盛最多水的容器 二次循环 这道题比较容易想到的就是通过二次循环遍历所有能盛的水的体积。 代码 class Solution {public int maxArea(int[] height) {// 记录…

Karmada 多集群服务发现

一、背景介绍 多集群架构下&#xff0c;不同 Kubernetes 集群间的服务如何互通是核心挑战。Karmada 支持 Kubernetes Multi‑cluster Service APIs&#xff08;MCS&#xff09;&#xff0c;通过 ServiceExport 和 ServiceImport 实现跨集群服务发现与调用&#xff0c;帮助多集…

macOS 26正式发布,全新Liquid Glass设计语言亮相

在全球科技爱好者翘首以盼的WWDC 2025开发者大会上&#xff0c;苹果公司正式揭开了macOS 26系统的神秘面纱。此次系统更新最令人瞩目的&#xff0c;当属其采用的全新Liquid Glass设计语言&#xff0c;该设计不仅重塑了Mac的视觉风格&#xff0c;更为用户带来了一场前所未有的操…

网络基础(3)

网络基础&#xff08;3&#xff09; 有关进程 1&#xff09;进程是人在系统中的代表&#xff0c;只要把数据给进程&#xff0c;人就相当于拿到了数据 2&#xff09;数据传输到主机不是目的&#xff0c;而是手段。到达主机内部&#xff0c;再交给主机内的进程才是目的 上网的…

C语言专题:17.逻辑运算与三目运算符(按位逻辑运算、条件运算符)

​ C语言中的逻辑运算符和三目运算符&#xff08;条件运算符&#xff09;是非常常见且基础的操作符&#xff0c;它们分别用于布尔逻辑运算和简化条件判断的表达式。通过合理使用这些运算符&#xff0c;可以使代码更加简洁、清晰。本文将重点介绍逻辑运算符、三目运算符和按位逻…

【分布式 ID】一文详解美团 Leaf

文章目录 1. 前言2. 项目启动示例 - MYSQL 和 Zookeepr2.1 Leaf-segment 模式2.2 Leaf-snowflake 模式 - 单节点2.3 Leaf-snowflake 模式 - 多节点 3. Leaf-segment 详细讲解4. Leaf-segment 源码解析4.1 SegmentBuffer 号段缓存4.2 Segment 号段4.3 初始化号段服务 SegmentIDG…

互联网大厂Java面试实录:Spring Boot与微服务在电商场景中的应用

互联网大厂Java面试实录&#xff1a;Spring Boot与微服务在电商场景中的应用 面试场景 面试官&#xff1a;你好&#xff0c;谢飞机&#xff0c;欢迎参加我们的Java开发岗位面试。首先&#xff0c;能否简单介绍一下你的技术背景&#xff1f; 谢飞机&#xff1a;嗨&#xff0c…