浏览器插件开发实战
浏览器插件开发实战
- [1] 入门DEMO
- 一、创建项目
- 二、创建manifest.json
- 三、加载插件
- 四、配置 service-worker.js
- 五、以书签管理器插件为例
- manifest.json
- popup.html
- popup.js
- 查看效果
- [2] Vue项目改造成插件
- 一、复习Vue项目的结构
- 二、删除、添加个别文件
- 三、重写build
- [3] 高级开发
- 一、脚本通信
Google官方浏览器插件中文文档:https://developer.chrome.com/docs/extensions/reference?hl=zh-cn
Google官方浏览器插件示例代码仓:https://github.com/GoogleChrome/chrome-extensions-samples/tree/main
[1] 入门DEMO
一个最简单的Hello World级别的插件项目,最好要有三个文件:
1. manifest.json
2. service-worker.js
其中,manifest.json文件是插件程序说明文档,也是描述入口设置文档;service-worker.js是全局的js文件。接下来我们说明一下开发过程
一、创建项目
创建目录后,进入该目录路径
mkdir plugin_demo
cd plugin_demo
创建一个资源目录
mkdir icons
拖入你的插件图标,官方通常推荐是16x16, 32x32, 48x48, 128x128四个格式,我放了一个48*48的就够用了。
二、创建manifest.json
根目录下创建一个manifest.json主入口文件
touch manifest.json
然后编辑插件基本信息信息
{"manifest_version": 3, # 主程序api版本,这个只设置为3 2已经废弃"name": "名字", # 插件名"description": "description", # 插件描述"version": "1.0", # 插件版本"icons": { # 声明图标"16": "icons/16.png","48": "icons/48.png","128": "icons/128.png"}
}
基本信息配好后,即使是这一个文件,其实也已经可以加载插件到chrome里了。
三、加载插件
1. **chrome浏览器输入: **chrome://extensions/
2. 选中加载已解压的扩展程序
3. 选择你的项目目录
4. 查看你的插件如下:
5. 修改刷新 如果你文件有改动,通过4底部的刷新按钮,刷新加载文件观看变化。
至此,已经完成插件的初步加载过程。
四、配置 service-worker.js
如果说manifest.json是主入口文件,那么service-worker.js就像是前端项目里app.js级别的全局文件。
先在 manifest.json 配置:
{..."background": {"service_worker": "service-worker.js"}
}
然后创建与manifest.json同级的文件service-worker.js,内容为:
chrome.runtime.onInstalled.addListener(function () {console.log("插件已被安装");
})
以上就是一个demo级别的浏览器插件所需的文件。manifest.json文件里面具有丰富的配置,常用的如点击、内嵌面板、权限配置需要自行去查看官方文档。
五、以书签管理器插件为例
以一个简单的书签管理器插件为例,展示一个demo级别的插件。插件项目共有三个文件:
manifest.json
首先创建一个manifest.json文件。
{"manifest_version": 3,"name": "Bookmark Viewer","version": "1.0","description": "Uses the chrome.bookmarks API to search through, add, and delete bookmarks from the user's bookmark tree.","action": {"default_popup": "popup.html"},"permissions": ["bookmarks"]
}
action表示点击事件,即在浏览器里面点击了插件图标会如何。这里设置的default_popup表示点击之后弹出popup.html页面。
permissions是向浏览器声明要使用到的权限,这里会用到书签相关的操作,所以声明bookmarks。
popup.html
然后创建弹出给用户看的前端页面popup.html。
<!doctype html>
<html><meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"><head><title>Bookmark Viewer</title><script src="popup.js" type="module"></script></head><body><button id="addButton">添加书签</button><button id="removeButton">移除书签</button><ul id="bookmarkList"></ul></body>
</html>
popup.js
最后编写前端页面绑定的js,注意popup.js与全局service-worker.js是不一样的。
chrome.bookmarks.getTree((tree) => {const bookmarkList = document.getElementById('bookmarkList');displayBookmarks(tree[0].children, bookmarkList);
});// Recursively display the bookmarks
function displayBookmarks(nodes, parentNode) {for (const node of nodes) {// If the node is a bookmark, create a list item and append it to the parent nodeif (node.url) {const listItem = document.createElement('li');listItem.textContent = node.title;parentNode.appendChild(listItem);}// If the node has children, recursively display themif (node.children) {const sublist = document.createElement('ul');parentNode.appendChild(sublist);displayBookmarks(node.children, sublist);}}
}// Add a bookmark for www.google.com
function addBookmark() {chrome.bookmarks.create({parentId: '1',title: 'Google',url: 'https://www.google.com'},() => {console.log('Bookmark added');location.reload(); // Refresh the popup});
}// Remove the bookmark for www.google.com
function removeBookmark() {chrome.bookmarks.search({ url: 'https://www.google.com/' }, (results) => {for (const result of results) {if (result.url === 'https://www.google.com/') {chrome.bookmarks.remove(result.id, () => {});}}location.reload();});
}// Add click event listeners to the buttons
document.getElementById('addButton').addEventListener('click', addBookmark);
document.getElementById('removeButton').addEventListener('click', removeBookmark);
查看效果
1. **chrome浏览器输入: **chrome://extensions/
2. 选中加载已解压的扩展程序
3. 选择本项目目录
4. 查看插件如下:
5. 点击浏览器右上方的插件按钮,即可看到本机的书签
[2] Vue项目改造成插件
为什么要用Vue开发Chrome插件?个人主要是回到自己熟悉的模式,提高效率。我们总不能用原生JS手撸插件吧。
Vue项目改造成插件的主要原理: 改造配置文件,这样npm run build的时候,生成的内容是chrome插件结构。同时根据dist结构,配置maifest.json。
一、复习Vue项目的结构
对于一个常规的Vue2、Vue3的项目,它的结构一般是:
./project
├── public
│ ├── favicon.ico
│ └── index.html
├── src
├── package.json
├── package-lock.json
├── jsconfig.json
├── babel.config.js
├── vue.config.js
└── README.md
打包(npm run build)之后的dist文件夹结构为:
./dist
├── css
├── js
├── public
├── favicon.ico
└── index.html
可以看到public目录下的内容,被原封不动的搬到dist目录下。
而src下的vue组件和main.js, 则被编译成js和css文件,分别存储到js和css下。
由于我们开发的是chrome插件,可以把不渲染的文件放到public目录下,把渲染源文件放到src下。
另外在public下,创建一个manifest.json文件即可。
把不编译的js,放到public的好处是: 对于chrome api,我们可以直接跳过编译。直接使用chrome.xxx的形式。
二、删除、添加个别文件
把Vue项目改造成插件只需要改动一点点。
第一步,把Vue项目的public文件夹里面的内容全部删除。
第二步,在Vue项目的public文件夹里添加插件必备的文件,结构如下:
./public
├── service-worker
│ └── service-worker.js # 插件后台运行js
├── manifest.json # 插件主描述文件
├── css
│ └── your.css # 自定义css 后面会和Vue项目打包的css合并到css文件夹下
├── js
│ └── your.js # 自定义js 后面会和Vue项目打包的js合并到js文件夹下
└── icons # 插件icon图片├── 48.png├── 16.png└── 128.png
第三步,在src文件夹下添加一个popup.html。这个popup就是最终打包时会使用的html,你的manifest.json得有行为(比如action)来绑定这个文件。
./src
├── ... # 业务代码
└── popup.html # 额外添加的插件关联html
html这样写
<!DOCTYPE html>
<html lang="">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>html,body,#app {height: 100%;margin: 0px;padding: 0px;}
</style>
<body>
<div id="app"></div>
<script src="js/xxx.js"></script> # 你的自定义js
</body>
</html>
三、重写build
在vue.config.js中,配置build过程,主要说明要加载的页面是popup/popup.html。
配置vue.config.js
const { defineConfig } = require('@vue/cli-service')
const pages = {}; #声明一个page集合,如果有
const chromepages=["popup"]; # 这里主要有一个popup页面
chromepages.forEach(name=>{
pages[name]={
entry:`src/main.js`, # 页面入口是popup下的main.js
template:`src/popup.html`, # popup.html
filename:`${name}.html` # 最终渲染的页面是popup.html
};
});
module.exports = {pages,productionSourceMap: false,
}
然后执行build
npm run build
生成的目录结构如下
./dist
├── service-worker
│ └── service-worker.js
├── popup.html #渲染的弹出页面
├── manifest.json 主程序入口
├── js
│ ├── popup.ff36d80a.js
│ └── chunk-vendors.1c3d3fe0.js
├── css
│ ├── popup.0b9776ec.css
│ └── your.css
└── icons├── 48.png├── 16.png└── .png
最后,直接在Googls插件页面选择加载dist文件夹即可。
[3] 高级开发
一、脚本通信
浏览器插件所涉及到的三类JS文件有:
1. service-worker.js。属于插件的全局js,背景脚本在扩展安装后就会持续运行,不会因为浏览器的标签页切换或关闭而停止。会在浏览器下一次打开后自动恢复,拥有更广的权限。
2. content.js。指的是向用户浏览的页面注入的JS文件,我们一版统称content脚本。注入content文件有很多写法,比如直接在manifest.json文件里面声明,或者在service-worker.js里面显式地写。content脚本的作用域在用户访问的页面那里,如果想和插件传递数据需要用google提供的message方法。
3. popup.js。指的是插件的html页面使用script标签引入的JS文件,它的地位是属于插件所有,作用域在插件这边,但是权限没有service-worker.js大。
因此,说脚本通信,指的是插件脚本(service-worker.js、popup.js)和content.js脚本之间的通信。
它们之间需要用message通信:
// popup.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {console.log("收到消息:", request.data);
});// content.js
chrome.runtime.sendMessage({data: 'value'}, function(response) {console.log("收到来自popup.js的回复:", response);
});
相关文章:
浏览器插件开发实战
浏览器插件开发实战 [1] 入门DEMO一、创建项目二、创建manifest.json三、加载插件四、配置 service-worker.js五、以书签管理器插件为例manifest.jsonpopup.htmlpopup.js查看效果 [2] Vue项目改造成插件一、复习Vue项目的结构二、删除、添加个别文件三、重写build [3] 高级开发…...
【特殊子序列 DP】力扣552. 学生出勤记录 II
可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符: ‘A’:Absent,缺勤 ‘L’:Late,迟到 ‘P’:Pr…...
C/C++流星雨
系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…...
Docker 安装 Jenkins:2.346.3
准备:已安装Docker,已配置服务器安全组规则 1581 1、拉取镜像 [rootTseng ~]# docker pull jenkins/jenkins:2.346.3 2.346.3: Pulling from jenkins/jenkins 001c52e26ad5: Pull complete 6b8dd635df38: Pull complete 2ba4c74fd680: Pull complet…...
枫清科技高雪峰:从数据到知识,重塑产业智能化的核心驱动力
2024 年 12 月 5 日,由智东西主办的“2024 中国生成式 AI 大会”在上海盛大开幕,汇聚了全球 AI 领域的顶尖专家、行业领袖与技术创新者。枫清科技(Fabarta)创始人兼 CEO 高雪峰应邀出席,并在大会上发表主题演讲&#x…...
【过滤器】.NET开源 ORM 框架 SqlSugar 系列
目录 0、 过滤器介绍 1、表过滤器 (推荐) 1.1 手动添加过滤器 1.2 禁用、清空、备份和还原 1.3 联表查询设置 1.4 动态添加 2、修改和删除用过滤器 2.1 局部设置 2.2 全局设置 (5.1.4.62) 3、子查询用过滤器 4、联表过滤…...
在 Ansys Q3D 中求解直流和交流电感
提取电缆的电感对于确保电气和电子系统的性能和可靠性至关重要。本篇博客文章将介绍使用 Ansys Q3D 求解直流和交流电感的过程。 概述 在这个例子中,我们将考虑一个由两组电缆组成的简单几何:正极和负极,如下所示: 可以使用“自…...
location重定向和nginx代理
文章目录 1 location重定向1.1 概述1.2 rewrite跳转1.3 用例1.4 实验1.4.1 基于域名的跳转1.4.2 基于ip的跳转1.4.3 基于后缀名的跳转 2 nginx的代理2.1 nginx内置变量2.2 实验2.2.1 前提条件2.2.2 正向代理2.2.3 自动代理 1 location重定向 1.1 概述 重定向:就是…...
币安移除铭文市场的深度解读:背后原因及其对区块链行业的影响
引言: 就在昨天,2024年12月10号,币安宣布将移除铭文市场(Inscriptions Market)。这一消息引发了全球加密货币社区的广泛关注,尤其是在比特币NFT和数字收藏品市场快速发展的背景下。铭文市场自诞生以来迅速…...
【论文复现】基于曲率的图重新布线
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 无基于曲率的图重新布线 论文概述核心算法算法说明关键代码 运行方法数据集配置文件训练和测试 运行结果 论文概述 论文链接 Topping, Jake,…...
scala的Array
特性 类型安全:Scala 中的数组是类型安全的,这意味着一旦声明了数组的类型,就只能存储该类型的元素。 大小固定:数组的大小在创建时确定,之后不能改变。 零索引:Scala 数组与 Java 数组一样,都…...
【HarmonyOS实战开发】鸿蒙JS崩溃分析
当未处理的JS异常导致应用意外退出时,应用会生成对应的JS崩溃日志文件,开发者可通过错误日志查看引起崩溃的代码位置及分析应用崩溃的原因。本文将分别介绍JS崩溃分析思路以及典型分析案例。 一、日志信息 以下是崩溃日志信息中对应字段解释。 Device…...
【Vue3】前端使用 FFmpeg.wasm 完成用户视频录制,并对视频进行压缩处理
强烈推荐这篇博客!非常全面的一篇文章,本文是对该博客的简要概括和补充,在不同技术栈中提供一种可行思路,可先阅读该篇文章再阅读本篇: FFmpeg——在Vue项目中使用FFmpeg(安装、配置、使用、SharedArrayBu…...
与 Cursor AI 对话编程:2小时开发报修维修微信小程序
本文记录了如何通过与 Cursor AI 对话,全程不写一行代码的情况下,完成一个完整的报修小程序。整个过程展示了 AI 如何帮助我们: 生成代码 、解决问题、优化实现、完善细节。 先看一下效果图: 一、项目配置 首先我是这样和 AI 对…...
【机器学习】机器学习的基本分类-无监督学习-主成分分析(PCA:Principal Component Analysis)
主成分分析(Principal Component Analysis, PCA) 主成分分析(PCA)是一种常用的降维技术,用于将高维数据投影到低维空间,同时尽可能保留原数据的主要信息(方差)。 1. PCA 的核心思想…...
工频隔离与高频隔离的优劣对比
工频与高频隔离的优劣以及选择方法的详细介绍: 工频隔离 优点: 隔离效果好:能有效过滤电网上的谐波干扰和负载特性产生的大电流冲击,为负载提供更可靠的保护,适用于对电源稳定性和可靠性要求高的工业、医疗、交通等领…...
前端传入Grule,后端保存到 .grl 文件中
前端传入Grule,后端保存到 .grl 文件中 通过简单的输入框,将Grule的部分拆解成 规则名称 规则描述 规则优先级 规则条件 规则逻辑Grule关键字 when Then 模拟了 if 判断的条件和逻辑部分 类似于 shell 和 ruby 之类的脚本语言,有 then 关键字…...
SpringBoot【十】mybatis之xml映射文件>、<=等特殊符号写法!
一、前言🔥 环境说明:Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 在利用mybatis进行开发的时候,编写sql时可能少不了>、<等比较符号,但是在mapper映射文件中直接使用是不行的,会报错࿰…...
使用Excel 对S型曲线加减速算法进行仿真
项目场景: 项目场景:代码中写了S型加减速算法,相查看生成的加减速数组,直观的展示出来,USB通信一次64字节,对于我几个个32位的频率值不太方便,于是采用Excel进行仿真。 代码中如何生成S加减速曲…...
Java面试宝典 1.13~1.31【2020.5 Beta版】
Java面试宝典 1.13~1.31【2020.5 Beta版】 <a name"14cb060b"></a> 1.Java基础 <a name"22b8b366"></a> 1.13 静态变量与实例变量的区别? 静态变量实例变量定义使用static关键字声明的实例变量在类中声明,但…...
调度系统:使用 Airflow 对 Couchbase 执行 SQL 调度时的潜在问题
使用 Airflow 对 Couchbase 执行 SQL 调度时,通常情况下不会直接遇到与 Couchbase 分布式特性相关的异常,但在某些特定情境下,可能会出现一些与分布式环境、调度和数据一致性相关的潜在问题。以下是一些可能会遇到的问题和建议的解决方案&…...
过载与简单:理解感知
通常情况下,最好的设计是使用最少设计技巧的设计。这是为什么?这一切都是关于人类大脑是如何工作的,它决定了观众对媒体的反应、感受情绪和做出决定。 注意。我们被海量的信息轰炸。不间断地处理所有这些信号会降低我们大脑的注意力。根据微…...
前端加密的方式汇总
目录 一、Base64编码 二、哈希算法 三、对称加密(AES/DES) 四、非对称加密(RSA) 五、加盐 六、Web Cryptography API? 七、总结 随着信息和数据安全重要性的日益凸显,如何保证信息数据在传输的过程中的安全成为开发者重点关注的内容。前端加密通常是指在浏览…...
git新建远程分支后,无法切换
git remote # 列出所有远程主机 git remote update origin --prune # 更新远程主机origin 整理分支 git branch -r # 列出远程分支 git branch -vv # 查看本地分支和远程分支对应关系 git checkout -b gpf origin/gpf # 新建本地分支gpf与远程gpf分支相关…...
HarmonyOS 线性容器List 常用的几个方法
List底层通过单向链表实现,每个节点有一个指向后一个元素的引用。当需要查询元素时,必须从头遍历,插入、删除效率高,查询效率低。List允许元素为null。 List和LinkedList相比,LinkedList是双向链表,可以快速…...
【21天学习AI底层概念】day2 机器学习基础
按照由浅入深的顺序,下一步学习 机器学习(Machine Learning) 的基础是最自然的选择。机器学习是人工智能的核心技术之一,很多AI系统都依赖它。以下是学习路线建议: 第二步:机器学习基础 学习目标ÿ…...
简单的Java小项目
学生选课系统 在控制台输入输出信息: 在eclipse上面的超级简单文件结构: Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…...
TDengine Flink集成
Flink 集成 TDengine 主要涉及在 Flink 项目中配置与 TDengine 的连接,实现数据的读取和写入。以下是一个详细的指南,介绍如何在 Flink 中集成 TDengine: 一、准备工作 安装并启动 Flink: 下载并解压 Flink 安装包。启动 Flink …...
数据结构和算法-05堆和优先队列-01
堆结构(heap) 生活中我们遇见的数据结构-堆: 查看电影口碑排名第一的电影。 堆的概念 [堆(heap)] 是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个结点的值总是不大于或不小于其父结点的…...
PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)
分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者,我总喜欢翻看各种项目附带的论文,虽然大多时候是瞎研究,但却乐在其中。该项目能够完美保留公式、图表、目录和注释,对于需要阅读外文文献的…...
爬虫基础与实践
爬虫技术基础与实践 在当今数字化的时代,数据成为了宝贵的资源。爬虫技术作为获取数据的重要手段,受到了广泛的关注和应用。本文将介绍爬虫的基本概念、工作原理以及一些常用的技术和工具。 一、爬虫的基本概念 爬虫,也称为网络蜘蛛或网络机器…...
uni-app Android平台上架要求的隐私政策提示配置方法【跨端开发系列】
文章目录 前言📖一、前言二、DCloud 数据采集说明三、配置方式3.1 HBuilderX3.2.1及以上版本配置方式3.2 HBuilderX3.2.0及以下版本配置方法3.3 模板提示框3.4 无提示框 四、离线打包配置方式五、模板提示框六、二次确认提示框七、国际化八、隐私协议内容需要注意的…...
在Ubuntu上使用docker compose安装N卡GPU的Ollama服务
在现代计算环境中,利用 GPU 进行计算加速变得越来越重要。下面将讲解如何在Ubuntu上使用docker compose安装N卡GPU的Ollama服务。 1、安装 NVIDIA 容器工具 首先,需要确保你的系统已经安装了 NVIDIA 容器工具 nvidia-container-toolkit。这是让 Docker 容器访问 GPU 的关键…...
中文分词学习
1.安装 jieba 库 !pip install jieba jieba 库是用于中文分词的工具,它通过精确的分词算法来处理文本。通过分词可以将中文句子拆分成单独的词语,这对于自然语言处理任务非常重要,比如文本分类、情感分析、关键词提取。 2.中文文本分词处理…...
Seata 分布式事务
1. 分布式事务介绍 传统单体应用场景下,系统的数据保存在一个数据库实例中,通常场景的关系数据库都能自动提供事务保证,并且这种情况下的事务称为本地事务,能保证原子性、一致性、隔离性、持久性(ACID 特性)…...
Burp入门(10)-IP伪造插件
声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:IP伪造和爬虫审计_哔哩哔哩_bilibili 本文详细介绍IP伪造插件Burp Fake IP使用。 一、插件安装 打开Burp Suite。进入扩展标签页。点击添加&…...
idea连接SQL Server数据库_idea连接sqlserver数据库
4.设置密码(这一步可以在安装数据库时就可以完成),如果觉得用户名有问题,也可以修改用户名 5.查看SQL Server端口号(默认端口:1433),选择SQL Server2019配置管理器 6.打开SQL Server…...
SQL汇总数据:聚集函数
我们经常需要汇总数据而无需实际检索出这些数据,为此SQL提供了专门的函数。使用这些函数,SQL查询能够高效地检索数据,以便进行分析和报表生成。这类检索的例子包括: 确定表中行数(或者满足某个条件或包含某个特定值的…...
Next.js系统性教学:服务器操作与数据变更
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 1. 什么是服务器操作和数据变更? 1.1 服务器操作 (Server Actions) 1.2 数据变更 (Mutations) 2. Next.js中的服务器操作与数据变更 2.1 引入:…...
Python Selenium 各浏览器驱动下载与配置使用(详细流程)
大家好啊!我是NiJiMingCheng 这是我的博客:NiJiMingCheng 这节课我们来学习安装selenium和对应的各个浏览器驱动,个人比较喜欢使用谷歌浏览器驱动,所以接下来以谷歌浏览器来为大家做示例!!! Sel…...
python flask 框架模块介绍
Flask 是一个轻量级、可扩展的 Python Web 框架,特别适合构建小型和中型应用程序。它的设计哲学是简单、灵活,允许开发者根据需要选择或创建功能模块。以下是 Flask 框架的核心模块和其功能的详细讲解: 1. Flask 核心模块 (1) flask.Flask 类…...
手把手搭建基于.NET 8.0的Web API项目
1.背景 工作以后,大部分时间都是在做基于业务的CRUD工作,软件产品或者项目的框架基本都早就搭建好了,程序员只需要在框架内去填格子打代码就行了。于是,我抽了时间来搭建个简单的三层架构模式的web api项目,技术点大概…...
SQL注入基础入门篇 注入思路及常见的SQL注入类型总结
目录 前言一、了解mysql数据库1、了解sql增删改查2、了解sql查询 二、sql注入基础三、学习sql注入漏洞1、union注入1、判断数字型注入还是字符型型注入:2、判断闭合方式(字符型注入):3、判断回显位4、查询库名,表名&am…...
部门操作和日志
PostMapping("/depts") public Result add(RequestBody Dept dept){System.out.println("添加部门: " dept);deptService.add(dept);return Result.success(); }Override public void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setU…...
如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档
本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能,通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1.WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…...
禁用SAP Hana错误密码锁定用户功能
背景 公司项目适配多种数据库其中包含SAP Hana,由于有同事的数据库连接工具保存了某个在用的数据库的旧密码,导致时不时会被锁用户。通过查询官方文档已解决,这里统一记录一下。 禁用密码锁定方法 以下按系统管理员和普通用户的解法分别列…...
uni-app 个人课程表页面
uni-app 个人课程表页面 插件参考地址 大部分代码都是参考了上述代码,只对代码做出了优化 1. 页面模板 在 schedule.vue 文件中,编写页面结构: <template><view><u-navbar title"个人中心"><view class&q…...
实现盘盈单自动化处理:吉客云与金蝶云星空数据对接
盘盈单103v2对接其他入库:吉客云数据集成到金蝶云星空 在企业信息化管理中,数据的高效流转和准确性至关重要。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将吉客云的数据无缝对接到金蝶云星空,实现盘盈单…...
如何查看内网设备访问互联网时的出口 IP 地址?
在企业VPC中我们通常是一个机房公用一个公网IP,也就是所有的设备共用同一个出口IP。 那么如何查看如何查看内网设备访问互联网时的出口 IP 地址呢? 要查看一台 Linux 内网设备访问互联网时的出口 IP 地址,可以使用以下几种方法:…...
JavaCV之FFmpegFrameFilter视频转灰度
1、代码 package com.example.demo.ffpemg;import lombok.SneakyThrows; import org.bytedeco.javacv.*;public class FFmpegFrameFilterVideoExample {SneakyThrowspublic static void main(String[] args) {// 输入视频文件路径String inputVideoPath "f:/2222.mp4&qu…...