当前位置: 首页 > news >正文

echarts柱状图可鼠标左击出现自定义弹框,右击隐藏弹框并阻止默认右击事件

每项x轴数据对应有两条柱图和一条阴影效果是学习其它博客得到的效果,这个是学习的原文链接:echarts两个合并柱体(普通柱状图+象形柱图)共享一个柱体阴影

因为这次情况比较特殊,不仅需要自定义弹框内容,而且也需要鼠标的右击事件隐藏效果。这里我就假设在已有阴影效果的基础上,针对鼠标点击显示弹框进行记录。若有需要源码在后面,可自取。

echarts自定义弹框内容

  • 效果图展示
  • 前记
  • 鼠标左击事件(click)
    • 参数介绍
    • 自定义弹框的样式
    • 逻辑代码部分
      • 添加自定义元素
      • 清除之前的菜单元素
      • 左击方法的全部代码
  • 鼠标右击事件(contextmenu)
    • 逻辑代码部分
      • chart.getZr().on 与 chart.on
      • 隐藏鼠标右击后的默认行为
      • 右击方法的全部代码
  • 源码

效果图展示

在这里插入图片描述

前记

echarts的鼠标事件:点击跳转至官方的鼠标事件
官网给的事件行为逻辑:点击跳转至官网的事件与行为
在这里插入图片描述
下面是具体含义:

click:当用户在图表上进行单击操作时触发,可以用于实现单击选中数据点或者执行特定的交互操作。
dblclick:当用户在图表上进行双击操作时触发,可以用于实现双击放大或者展开详细信息等功能。
mousedown:当用户按下鼠标按钮时触发,可以用于实现拖拽、绘制选框等交互操作。
mousemove:当用户在图表上移动鼠标时触发,可以用于实现实时显示数据信息或者跟随鼠标移动的提示框。
mouseup:当用户释放鼠标按钮时触发,可以用于结束拖拽、绘制等操作。
mouseover:当鼠标悬停在图表元素上时触发,可以用于显示详细信息或者高亮当前元素。
mouseout:当鼠标移出图表元素时触发,可以用于隐藏信息框或者取消高亮状态。
globalout:当鼠标移出图表区域时触发,可以用于清除所有高亮状态或者隐藏全局提示框。
contextmenu:当用户在图表上右键单击时触发,可以用于显示自定义的右键菜单或者执行特定的操作。

这里用到的是click单击以及contextmenu右键单击事件。

鼠标左击事件(click)

这里在绑定点击操作里,根据被点击的位置使用子绝父相(子盒子position: absolute;父盒子position: relative;),设定自定义弹框的位置。

参数介绍

点击阴影部分时,可查看params值,params.event.event与vue的鼠标右击事件 @contextmenu="func"传的event参数一样,通过这个可以设置被点击盒子的显示位置,设定其top值及left值。
在这里插入图片描述

自定义弹框的样式

1、若添加自定义类名可通过divdom.classList.add(“类名”),在 JavaScript 中,classList 是 DOM 元素的属性,它提供了一组方法来操作元素的类名。其中,.add() 方法用于向元素的类列表中添加一个或多个类名。
2、若添加自定义样式可通过divdom.style.cssText,此方法是用于设置元素的内联样式的属性。直接将 CSS 样式规则作为字符串赋给元素的内联样式,从而一次性设置多个样式属性。

单引号与反引号的区别:
反引号是 ES6 中的模板字符串语法。使用反引号包裹字符串可以实现字符串插值,即在字符串中嵌入变量或表达式的值。
与单引号和双引号相比,使用反引号的优势在于可以在字符串中直接引用变量,而无需使用字符串连接符(+)来拼接字符串。这样使得代码更具可读性,并且更容易维护。

在下面这段代码中,反引号用于创建一个模板字符串,其中 ${} 内部的表达式会被计算并替换为实际的值。这样就可以动态地设置 left 和 top 样式属性的值,根据 params.event.event.pageX 和 params.event.event.pageY 的实时数值来确定自定义div菜单的位置。

逻辑代码部分

添加自定义元素

通过 createElement 方法创建视图元素,这里创建了三个div,分别为父盒子(.custom-menu)、两个子盒子(.menu-item),元素结构如下图。
在这里插入图片描述

清除之前的菜单元素

自定义弹框已经创建显示好了,每次左击时都会出现一个新创建的弹框,接下来就需要隐藏之前出现的,如何拿到之前的弹框呢?那么就需要一个全局参数 currentMenu: null 记录当前菜单,用于判断是否存在菜单并使用 removeChild 方法删除子节点。

这里分为两种情况使用清除,一是每次左击时清除之前被左击显示的菜单;二是点击菜单里的某项子盒子时清除盒子。清除逻辑都差不多,只不过需要分情况调用而已。

左击方法的全部代码

chartLeftEvent(chart) {chart.on("click", (params) => {console.log("params", params);if (this.currentMenu && this.currentMenu.parentNode === document.body) {document.body.removeChild(this.currentMenu); // 清除之前的菜单元素}const menu = document.createElement("div");// 创建一个新的 div 元素,并将其赋给名为 menu 的常量menu.classList.add("custom-menu");// 为新创建的 div 元素添加一个自定义样式类名 "custom-menu"// 使用模板字符串设置 div 元素的内联样式,动态确定菜单的位置menu.style.cssText = `left: ${params.event.event.pageX}px;top: ${params.event.event.pageY}px;`;// 将创建好的 div 元素添加到页面的 body 元素中,显示出菜单document.body.appendChild(menu);const menuItem1 = document.createElement("div");menuItem1.className = "menu-item";menuItem1.style.cssText = `border-radius: 0px 10px 0px 0px;`;menuItem1.innerText = "查看具体信息1";menuItem1.onclick = () => {console.log("查看工步信息");if (this.currentMenu && this.currentMenu.parentNode === document.body) {document.body.removeChild(this.currentMenu); // 清除之前的菜单元素}};menu.appendChild(menuItem1);const menuItem2 = document.createElement("div");menuItem2.className = "menu-item";menuItem2.style.cssText = `border-radius: 0px 0px 0px 10px;`;menuItem2.innerText = "查看具体信息2";menuItem2.onclick = () => {console.log("查看人员信息");if (this.currentMenu && this.currentMenu.parentNode === document.body) {document.body.removeChild(this.currentMenu); // 清除之前的菜单元素}};menu.appendChild(menuItem2);this.currentMenu = menu; // 保存当前菜单元素});},

鼠标右击事件(contextmenu)

逻辑代码部分

chart.getZr().on 与 chart.on

在 echarts 中,chart.getZr().on 与 chart.on 的区别主要在于事件绑定的对象和事件触发的时机:

chart.on与chart.getZr().on的区别:
chart.on: 这种方式是在 echarts 实例上直接绑定事件监听器。通过 chart.on 可以监听 echarts实例上的特定事件,如鼠标点击图表、图例切换等。这种方式适用于监听 echarts 提供的交互事件,如点击图表某个系列时触发的事件。
chart.getZr().on: 这种方式是直接在 echarts 实例的底层渲染容器(即 ZRender 实例)上绑定事件监听器。通过chart.getZr() 可以获取到 ZRender 实例,然后使用 .on 方法可以在 ZRender 实例上监听各种原生 DOM事件,如鼠标点击、移动等。这种方式可以实现更加底层的事件监听,对 echarts 渲染的交互细节进行定制。

总体来说,使用 chart.getZr().on 可以监听更加底层的原生 DOM 事件,而 chart.on 则用于监听 echarts 封装的图表交互事件。这里的左击事件用的chart.on,右击事件用的chart.getZr().on ,大家都可以感受一下。

隐藏鼠标右击后的默认行为

右击图表示默认会显示下图这个菜单,所以需要通过preventDefault方法阻止默认右击事件
在这里插入图片描述

右击方法的全部代码

chartRightEvent(chart) {// 使用箭头函数chart.getZr().on("contextmenu", (params) => {params.event.preventDefault(); // 取消默认右击事件if (this.currentMenu && this.currentMenu.parentNode === document.body) {document.body.removeChild(this.currentMenu); // 清除之前的菜单元素}});},

源码

<div style="width: 100%; height: 100%" id="barChart" ref="echartsContainer"></div>
....
data() {return { currentMenu: null, // 保存当前显示的菜单元素};
},
mounted() {this.updateChartData();},methods: {// 柱状图updateChartData() {var xdata = ["ABCD01-01","ABCD01-02","ABCD01-03","ABCD01-04","ABCD01-05","ABCD01-06","ABCD01-07","ABCD01-08","ABCD01-09","ABCD01-10","ABCD01-11","ABCD01-12","ABCD01-13","ABCD01-14","ABCD01-15","ABCD01-16","ABCD01-17","ABCD01-18","ABCD01-19","ABCD01-20","ABCD01-21","ABCD01-22","ABCD01-23","ABCD01-24",];var ctdata = [21,18,34,31,22,18,18,18,18,18,18,18,21,15,34,31,22,18,18,18,18,18,18,18,];var stdata = [20.5,15,31,31,18,9,9,9,9,9,9,9,20.5,15,31,31,18,9,9,9,9,9,9,9,];var bgdata = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,];var maxValue = 34; //最大秒数var maxCenterName = "ABCD01-03"; //最大秒数对应的工站var threshold = 8; //差值const chartDom = document.getElementById("barChart");const chart = echarts.init(chartDom, "dark");var option;option = {backgroundColor: "transparent",// 预设颜色优先级低于series里定义的颜色,所以象形柱图不会被污染color: [{type: "linear",x: 0,y: 1,x2: 0,y2: 0,colorStops: [{offset: 0,color: "rgba(204, 218, 234,0)", // 0% 处的颜色},{offset: 1,color: "rgba(204, 218, 234,1)", // 100% 处的颜色},],},{type: "linear",x: 0,y: 1,x2: 0,y2: 0,colorStops: [{offset: 0,color: "rgba(93, 207, 207,0)", // 0% 处的颜色},{offset: 1,color: "rgba(93, 207, 207,1)", // 100% 处的颜色},],},],grid: {left: "3%",right: "6%",bottom: "15%",},legend: {orient: "vertical", // 设置图例垂直排列right: 10, // 调整图例距离右侧的距离top: "top", // 设置图例位于上方itemWidth: 10, // 设置宽度itemHeight: 10, // 设置高度textStyle: {color: "#fff",},},xAxis: [{type: "category",axisTick: {show: false,},data: xdata,axisLabel: {show: true,color: "#ffffff",},axisLabel: {show: true,color: "#ffffff",fontSize: 12, // 设置字体大小为12},},{type: "category",show: false,data: this.xAxisData_,},],yAxis: [{type: "value",name: "second",min: 0,max: 40,splitNumber: 5,nameTextStyle: {//y轴上方单位的颜色color: "#fff",},splitLine: {lineStyle: {color: "rgba(133, 139, 145,0.3)",},},axisLabel: {show: true,color: "#ffffff",},},{type: "value",alignTicks: true,show: false,},{type: "value",show: false,},],dataZoom: [{type: "slider", // 设置为滑动条show: true, // 显示滑动条start: 0, // 滑动条起始位置end: 100 / (12 - 10) - 1, // 滑动条结束位置bottom: 10, // 滑动条距离底部的距离textStyle: {color: "#fff",},backgroundColor: "#acb7c3", // 设置背景颜色handleStyle: {color: "#2a82e4", // 设置左右两边的可滑动收缩竖线颜色},},],series: [{name: "DATA1",data: ctdata,type: "bar",barWidth: 10,barGap: 1, //柱子之间间距yAxisIndex: 0,z: 2,label: {show: true,position: "top",color: "white",},// 标记线配置markLine: {data: [{yAxis: maxValue, // 最大值的纵坐标label: {show: true,position: "end",formatter: "瓶颈CT:" + maxValue + "s\n" + maxCenterName, // 标记线的标签textStyle: {color: "red",},},lineStyle: {type: "dashed", // 设置为虚线color: "red", // 标记线的颜色},symbol: ["none", "arrow"], // 取消箭头样式silent: true, // 取消鼠标悬浮时的高亮效果},],},},{name: "DATA2",data: stdata,type: "bar",barWidth: 10,yAxisIndex: 1,z: 2,label: {show: true,position: "top",color: "#66e1df",},},{data: bgdata,type: "bar",barWidth: 55,yAxisIndex: 2,xAxisIndex: 1,z: 1,itemStyle: {normal: {color: function (params) {var ctValue = ctdata[params.dataIndex];var stValue = stdata[params.dataIndex];if (Math.abs(ctValue - stValue) > threshold) {return "rgba(102, 77, 107,0.6)";} else {return "rgba(0,0,0,0.16)";}},},},},],};option && chart.setOption(option);this.chartRightEvent(chart);this.chartLeftEvent(chart);},chartRightEvent(chart) {chart.getZr().on("contextmenu", (params) => {params.event.preventDefault(); // 取消默认右击事件// 使用箭头函数if (this.currentMenu && this.currentMenu.parentNode === document.body) {document.body.removeChild(this.currentMenu); // 清除之前的菜单元素}});},chartLeftEvent(chart) {chart.on("click", (params) => {console.log("params", params);// let xIndex = chart.convertFromPixel({ seriesIndex: 0 }, [//   params.offsetX,//   params.offsetY,// ])[0]; // 阴影索引值// console.log("xIndex", xIndex);if (this.currentMenu && this.currentMenu.parentNode === document.body) {document.body.removeChild(this.currentMenu); // 清除之前的菜单元素}const menu = document.createElement("div");menu.classList.add("custom-menu"); // 添加自定义样式类名menu.style.cssText = `left: ${params.event.event.pageX}px;top: ${params.event.event.pageY}px;`;document.body.appendChild(menu);const menuItem1 = document.createElement("div");menuItem1.className = "menu-item";menuItem1.style.cssText = `border-radius: 0px 10px 0px 0px;`;menuItem1.innerText = "查看具体信息1";menuItem1.onclick = () => {console.log("查看工步信息");if (this.currentMenu && this.currentMenu.parentNode === document.body) {document.body.removeChild(this.currentMenu); // 清除之前的菜单元素}};menu.appendChild(menuItem1);const menuItem2 = document.createElement("div");menuItem2.className = "menu-item";menuItem2.style.cssText = `border-radius: 0px 0px 0px 10px;`;menuItem2.innerText = "查看具体信息2";menuItem2.onclick = () => {console.log("查看人员信息");if (this.currentMenu && this.currentMenu.parentNode === document.body) {document.body.removeChild(this.currentMenu); // 清除之前的菜单元素}};menu.appendChild(menuItem2);this.currentMenu = menu; // 保存当前菜单元素});},}
/* echarts图表样式 */
.custom-menu {position: absolute;width: 130px;box-shadow: rgb(0 0 0 / 30%) 1px 1px 3px;z-index: 999;background: rgb(69 140 199 / 80%);border: none;border-radius: 0px 10px 0px 10px;color: #fff;display: flex;flex-direction: column;align-items: center;
}.menu-item {padding: 5px 0px;cursor: pointer;width: 100%;display: flex;justify-content: center;
}.menu-itemborder1 {border-radius: 0px 10px 0px 0px;
}.menu-itemborder2 {border-radius: 0px 0px 0px 10px;
}.menu-item:hover {background-color: #a2bbda;
}

相关文章:

echarts柱状图可鼠标左击出现自定义弹框,右击隐藏弹框并阻止默认右击事件

每项x轴数据对应有两条柱图和一条阴影效果是学习其它博客得到的效果&#xff0c;这个是学习的原文链接&#xff1a;echarts两个合并柱体&#xff08;普通柱状图象形柱图&#xff09;共享一个柱体阴影 因为这次情况比较特殊&#xff0c;不仅需要自定义弹框内容&#xff0c;而且…...

存算一体成为突破算力瓶颈的关键技术?

大模型的训练和推理需要高性能的算力支持。以ChatGPT为例&#xff0c;据估算&#xff0c;在训练方面&#xff0c;1746亿参数的GPT-3模型大约需要375-625台8卡DGX A100服务器训练10天左右&#xff0c;对应A100 GPU数量约3000-5000张。 在推理方面&#xff0c;如果以A100 GPU单卡…...

Pytorch_1_基本语法

一、Pytorch的基本元素操作 1.引入torch from __future__ import print_function import torch 2.创建矩阵 x torch.empty(5,3) print(x) 3.输出结果&#xff1a; tensor([[7.9191e34, 1.1259e24, 1.2359e-42], [4.0824e-40, 1.1379e-35, 2.5353e30], [8.…...

2024上海国际玻璃纤维及新材料展览会

2024上海国际玻璃纤维及新材料展览会 时间&#xff1a;2024年12月18&#xff5e;20日 地点&#xff1a;上海新国际博览中心 ◆ 》》》展会概况&#xff1a; 玻璃纤维是一种性能优异的无机非金属材料&#xff0c;比有机纤维耐温高&#xff0c;不燃&#xff0c;抗腐&#xff…...

云计算项目九:K8S安装

K8S安装 Kube-master安装 按照如下配置准备云主机 防火墙相关配置&#xff1a;禁用selinux&#xff0c;禁用swap&#xff0c;且在firewalld-*。上传kubernetes.zip 到跳板机 配置yum仓库&#xff08;跳板机&#xff09; 跳板机主机配置k8s软件源服务端 [rootjs ~]# yum -y…...

sign加密方法生成

1. 引入包的问题 2. 原因 .pycrypto、pycrytodome和crypto是一个东西&#xff0c;crypto在python上面的名字是pycrypto&#xff0c;它是一个第三方库&#xff0c;但是已经停止更新 3. 解决方法 --直接安装&#xff1a;pip install pycryptodome 3.但是&#xff0c;在使用的时…...

【Linux】编译器-gcc/g++使用

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 初见gcc和g3. 程序的翻译过程3.1 预处理3.1.1 宏替换 去注释 头文件展开3.1.2 条件编译 3.2 编译3.3 汇编3.4 链接 4. 链接4.1 动态链接4.2 静态链接 1. 前言 在之…...

Python 中的 filter() 函数:筛选可迭代对象元素

在 Python 中&#xff0c;filter() 函数是一个非常有用的内置函数&#xff0c;用于根据指定条件过滤可迭代对象中的元素。本文将深入探讨 filter() 函数的用法、工作原理以及常见应用场景&#xff0c;以帮助大家更好地理解和运用这个函数。 什么是 filter() 函数&#xff1f; …...

Java高频面试之并发篇

有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 并行和并发有什么区别&#xff1f; 并行是同时执行多个任务&#xff0c;而并发是多个任务在一段时间内交替执行。并行&#xff08;Parallel&#xff09;是指同时执行多个任务或操作&#xff0c;通过同时…...

docker 运行异构镜像

概述 关于docker镜像在不同的cpu架构下运行报错的解决办法&#xff0c;作者踩坑验证&#xff0c;在此分享经验 某次工作遇到需要银行内部部署docker镜像&#xff0c;由于行内已经开始走信创的路线&#xff0c;使用鲲鹏系统&#xff0c;arm架构&#xff0c;记过就遇到了standa…...

练习3-8 查询水果价格

探索--题目集索引 给定四种水果&#xff0c;分别是苹果&#xff08;apple&#xff09;、梨&#xff08;pear&#xff09;、桔子&#xff08;orange&#xff09;、葡萄&#xff08;grape&#xff09;&#xff0c;单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元…...

PTA 对于下列程序,正确的是() 。void f(int *p){ *p = 5;}int main(void){ int a, *p; a = 10;

对于下列程序&#xff0c;正确的是&#xff08;&#xff09; 。 void f(int *p) {*p 5; } int main(void) {int a, *p;a 10;p &a;f(p);printf(“%d”, (*p));return 0; }A.5 B.6 C.10 D.11 答&#xff1a;A 解析&#xff1a;这里考察当是指针作为函数的参数。这里将 p …...

【银河商学】大蓝短视频学习02——流量突围实战

【银河商学】大蓝短视频学习02——流量突围实战 内容大纲 找对标找准你的"竞争对手" 定形式选定适合你的视频形式 做内容选题决定命运 2s上热门 一、找对标 1. 为什么要找对标 标准答案,少走弯路99%的问题,都有标准答案。 找个懂得人问一问 秒上热门,快速起号预…...

Android 获取Sms

Android 获取Sms 本篇文章记录下android下获取短信列表. 1: 申请权限 <uses-permission android:name"android.permission.READ_SMS" />2: 获取短信内容列表 private void readSms() {String[] projection {"_id", "address", "b…...

【Linux】cpp-httplib库

目录 升级gcc版本 下载cpp-httplib的zip安装包&#xff0c;上传到服务器 ​编辑 简单使用 首先打开gittee,搜索cpp-httplib,选择其中一个即可 也可以点下方链接 cpp-httplib库&#xff1a;cpp-httplib: cpp-httplib (gitee.com) 注意&#xff1a;cpp-httplib在使用的时候需…...

全网最最最详细centos7如何安装docker教程

在CentOS 7上安装Docker主要包括以下步骤&#xff1a; 1. 卸载旧版本的Docker 首先&#xff0c;需要确保系统上没有安装旧版本的Docker。可以通过以下命令来卸载它们&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-late…...

【C++专栏】C++入门 | 函数重载、引用、内联函数

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;C专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ C入门 | 函数重载、引用、内联函数 文章编号&#xff1a;C入门 / 02 文…...

html--彩虹爱心

文章目录 js内容cssreset.min.cssstyle.css html内容 js内容 const colors ["#e03776","#8f3e98","#4687bf","#3bab6f","#f9c25e","#f47274"]; const SVG_NS http://www.w3.org/2000/svg; const SVG_XLINK &q…...

基于Kronig-Penney能带模型的MATLAB求解与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于Kronig-Penney能带模型的MATLAB求解与仿真.综合利用 MATLAB提供的求解常微分方程、矩阵行列式、代数表达式化简及绘图等函数 ,可使 Kronig-Penney能带模型分析…...

【Web - 框架 - Vue】随笔 - Vue CLI - 快速上手

Vue CLI 创建Vue CLI项目 【步骤】 命名项目空间&#xff1a;在电脑里创建文件夹&#xff0c;用于存储所有项目&#xff1b;定位项目空间&#xff1a;在"CMD窗口"里定位到工程的项目空间上&#xff1b; 方法1&#xff1a;(a)用"WINR"打开运行窗口&#x…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...