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

Vue与Konva:解锁Canvas绘图的无限可能

前言

在现代Web开发中,动态、交互式的图形界面已成为提升用户体验的关键要素。Vue.js,作为一款轻量级且高效的前端框架,凭借其响应式数据绑定和组件化开发模式,赢得了众多开发者的青睐。而当Vue.js邂逅Konva.js,两者结合产生的化学反应更是令人惊叹。今天,就让我们一同深入探索如何利用Vue.js和Konva.js绘制复杂且交互丰富的Canvas图形。


一、Vue Konva简介

Vue Konva是一款基于Vue.js的JavaScript库,它为开发者提供了声明式和响应式的绑定方式,使得在Vue中使用Konva框架变得异常简单。通过Vue Konva,我们可以轻松地在Vue组件中绘制各种复杂的Canvas图形,并且能够实现图形的动态更新和交互。

二、快速上手

  1. 安装
    首先,确保你的项目中已经安装了Vue.js 2.4+版本。接下来,通过npm安装vue-konva和konva:
    对于Vue 3
npm install vue-konva konva --save

对于Vue 2

npm install vue-konva@2 konva --save
  1. 引入和使用VueKonva
    在Vue 3中,你需要在main.js中引入VueKonva并使用它:
import { createApp } from 'vue';
import App from './App.vue';
import VueKonva from 'vue-konva';const app = createApp(App);
app.use(VueKonva);
app.mount('#app');

在Vue 2中,引入和使用VueKonva的方式如下:

import Vue from 'vue';
import VueKonva from 'vue-konva';Vue.use(VueKonva);
  1. 在组件模板中引用
    在你的Vue组件中,你可以通过以下方式使用Vue Konva的组件:
<template><v-stage :config="configKonva"><v-layer><v-circle :config="configCircle"></v-circle></v-layer></v-stage>
</template><script>
export default {data() {return {configKonva: {width: 200,height: 200},configCircle: {x: 100,y: 100,radius: 70,fill: "red",stroke: "black",strokeWidth: 4}};}
};
</script>

三、绘制基础图形

Vue Konva提供了与Konva框架相同名称的组件,前缀为v-。你可以通过config属性传递参数来配置这些组件。以下是一些核心形状的示例:

  • v-rect(矩形)
  • v-circle(圆形)
  • v-ellipse(椭圆)
  • v-line(线条)
  • v-image(图片)
  • v-text(文本)
  • v-text-path(文本路径)
  • v-star(星形)
  • v-label(标签)
  • v-path(路径)
  • v-regular-polygon(正多边形)
    在这里插入图片描述
<template><div><v-stage ref="stage" :config="stageSize"><v-layer><v-text :config="{text: 'Some text on canvas', fontSize: 15}"/><v-rect :config="{x: 20,y: 50,width: 100,height: 100,fill: 'red',shadowBlur: 10}"/><v-circle :config="{x: 200,y: 100,radius: 50,fill: 'green'}"/><v-line :config="{x: 20,y: 200,points: [0, 0, 100, 0, 100, 100],tension: 0.5,closed: true,stroke: 'black',fillLinearGradientStartPoint: { x: -50, y: -50 },fillLinearGradientEndPoint: { x: 50, y: 50 },fillLinearGradientColorStops: [0, 'red', 1, 'yellow']}"/></v-layer><v-layer ref="dragLayer"></v-layer></v-stage></div>
</template><script>
const width = window.innerWidth;
const height = window.innerHeight;
export default {data() {return {stageSize: {width: width,height: height}};}
};
</script>

四、自定义形状

除了基础形状,Vue Konva还允许你创建自定义形状。通过使用v-shape组件,你可以定义一个绘图函数,该函数接收一个Konva.Canvas渲染器,你可以利用它访问HTML5 Canvas上下文,并使用特殊方法如context.fillStrokeShape(shape)来自动处理填充、描边和阴影效果。
在这里插入图片描述

<template><v-stage ref="stage" :config="stageSize"><v-layer><v-shape :config="{width: 260,height: 170,sceneFunc: function (context, shape) {const width = shape.width();const height = shape.height();context.beginPath();context.moveTo(0, 0);context.lineTo(width - 40, height - 90);context.quadraticCurveTo(width - 110, height - 70, width, height);context.closePath();// (!) Konva特定方法,非常重要context.fillStrokeShape(shape);},fill: '#00D2FF',stroke: 'black',strokeWidth: 4}"/></v-layer></v-stage>
</template><script>
const width = window.innerWidth;
const height = window.innerHeight;export default {data() {return {stageSize: {width: width,height: height}};}
};
</script>

五、事件监听

Vue Konva使得监听用户输入事件(如click、dblclick、mouseover、tap、dbltap、touchstart等)和拖拽事件(如dragstart、dragmove、dragend)变得非常简单。你可以通过在组件上添加事件监听器来实现这些功能。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

<template>
<v-stage ref="stage" :config="stageSize"><v-layer ref="layer"><v-regular-polygon@mousemove="handleMouseMove"@mouseout="handleMouseOut":config="{x: 80,y: 120,sides: 3,radius: 80,fill: '#00D2FF',stroke: 'black',strokeWidth: 4}"/><v-text ref="text" :config="{x: 10,y: 10,fontFamily: 'Calibri',fontSize: 24,text: text,fill: 'black'}" /></v-layer></v-stage>
</template><script>
const width = window.innerWidth;
const height = window.innerHeight;export default {data() {return {stageSize: {width: width,height: height},text: ''};},methods: {writeMessage(message) {this.text = message;},handleMouseOut(event) {this.writeMessage('Mouseout triangle');},handleMouseMove(event) {const mousePos = this.$refs.stage.getNode().getPointerPosition();const x = mousePos.x - 190;const y = mousePos.y - 40;this.writeMessage('x: ' + x + ', y: ' + y);}}
};
</script>

六、绘制图片

在Vue Konva中,绘制图片需要手动创建一个原生的window.Image实例或canvas元素,并将其作为v-image组件的image属性。
在这里插入图片描述

<template><v-stage ref="stage" :config="stageSize"><v-layer ref="layer"><v-image :config="{image: image}"/></v-layer></v-stage>
</template><script>
const width = window.innerWidth;
const height = window.innerHeight;export default {data() {return {stageSize: {width: width,height: height},image: null};},created() {const image = new window.Image();image.src = "https://konvajs.org/assets/yoda.jpg";image.onload = () => {// 图片加载完成后设置this.image = image;};}
};
</script>

七、应用滤镜

Vue Konva允许你为图形应用各种滤镜效果。你需要手动缓存Konva.Node,并在需要时重新缓存节点。
在这里插入图片描述

<template>
<v-stage ref="stage" :config="stageSize"><v-layer ref="layer"><v-rectref="rect"@mousemove="handleMouseMove":config="{filters: filters,noise: 1,x: 10,y: 10,width: 50,height: 50,fill: color,shadowBlur: 10}"/></v-layer></v-stage>
</template><script>
const width = window.innerWidth;
const height = window.innerHeight;
import Konva from 'konva';export default {data() {return {stageSize: {width: width,height: height},color: 'green',filters: [Konva.Filters.Noise]};},methods: {handleMouseMove() {this.color = Konva.Util.getRandomColor();// 重新缓存const rectNode = this.$refs.rect.getNode();// 可能需要手动重绘图层rectNode.cache();}},mounted() {const rectNode = this.$refs.rect.getNode();rectNode.cache();},
};
</script>

八、保存和加载Canvas

Vue Konva提供了简单的方法来保存和加载Canvas状态。你可以通过保存应用的状态来实现这一点,而不需要保存Konva内部的节点。
在这里插入图片描述

<template><div>点击Canvas创建一个圆。<a href=".">刷新页面</a>。圆应该仍然在这里。<v-stage ref="stage":config="stageSize"@click="handleClick"><v-layer ref="layer"><v-circlev-for="item in list":key="item.id":config="item"></v-circle></v-layer><v-layer ref="dragLayer"></v-layer></v-stage></div>
</template><script>
const width = window.innerWidth;
const height = window.innerHeight;export default {data() {return {list: [{ x: 100, y: 100, radius: 50, fill: 'blue' }],stageSize: {width: width,height: height}};},methods: {handleClick(evt) {const stage = evt.target.getStage();const pos = stage.getPointerPosition();this.list.push({radius: 50,fill: 'red',...pos});this.save();},load() {const data = localStorage.getItem('storage');if (data) this.list = JSON.parse(data);},save() {localStorage.setItem('storage', JSON.stringify(this.list));}},mounted() {this.load();}
};
</script>

九、拖拽功能

Vue Konva使得实现图形的拖拽功能变得非常简单。你只需要在组件中添加draggable: true属性即可。
在这里插入图片描述
在这里插入图片描述

<template>
<v-stage ref="stage" :config="stageSize"><v-layer ref="layer"><v-text@dragstart="handleDragStart"@dragend="handleDragEnd":config="{text: 'Draggable Text',x: 50,y: 50,draggable: true,fill: isDragging ? 'green' : 'black'}"/></v-layer></v-stage>
</template><script>
const width = window.innerWidth;
const height = window.innerHeight;export default {data() {return {stageSize: {width: width,height: height},isDragging: false};},methods: {handleDragStart() {this.isDragging = true;},handleDragEnd() {this.isDragging = false;}}
};
</script>

十、调整大小和旋转

虽然Vue Konva没有提供纯声明式的“Vue方式”来使用Transformer工具,但你仍然可以通过手动操作Konva节点来实现这一功能。
在这里插入图片描述
在这里插入图片描述

<template><v-stageref="stage":config="stageSize"@mousedown="handleStageMouseDown"@touchstart="handleStageMouseDown"><v-layer ref="layer"><v-rectv-for="item in rectangles":key="item.id":config="item"@transformend="handleTransformEnd"/><v-transformer ref="transformer" /></v-layer></v-stage>
</template><script>
import Konva from 'konva';
const width = window.innerWidth;
const height = window.innerHeight;export default {data() {return {stageSize: {width: width,height: height,},rectangles: [{rotation: 0,x: 10,y: 10,width: 100,height: 100,scaleX: 1,scaleY: 1,fill: 'red',name: 'rect1',draggable: true,},{rotation: 0,x: 150,y: 150,width: 100,height: 100,scaleX: 1,scaleY: 1,fill: 'green',name: 'rect2',draggable: true,},],selectedShapeName: '',};},methods: {handleTransformEnd(e) {// 形状被变换,保存新的属性回节点// 在我们的状态中找到元素const rect = this.rectangles.find((r) => r.name === this.selectedShapeName);// 更新状态rect.x = e.target.x();rect.y = e.target.y();rect.rotation = e.target.rotation();rect.scaleX = e.target.scaleX();rect.scaleY = e.target.scaleY();// 更改填充色rect.fill = Konva.Util.getRandomColor();},handleStageMouseDown(e) {// 点击舞台 - 清除选择if (e.target === e.target.getStage()) {this.selectedShapeName = '';this.updateTransformer();return;}// 点击变换器 - 什么都不做const clickedOnTransformer =e.target.getParent().className === 'Transformer';if (clickedOnTransformer) {return;}// 通过名称找到被点击的矩形const name = e.target.name();const rect = this.rectangles.find((r) => r.name === name);if (rect) {this.selectedShapeName = name;} else {this.selectedShapeName = '';}this.updateTransformer();},updateTransformer() {// 手动附加或分离变换器节点const transformerNode = this.$refs.transformer.getNode();const stage = transformerNode.getStage();const { selectedShapeName } = this;const selectedNode = stage.findOne('.' + selectedShapeName);// 如果选定节点已经附加,则什么都不做if (selectedNode === transformerNode.node()) {return;}if (selectedNode) {// 附加到另一个节点transformerNode.nodes([selectedNode]);} else {// 移除变换器transformerNode.nodes([]);}},},
};
</script>

十一、动画效果

Vue Konva允许你为图形添加动画效果。你可以使用Konva的Tween和Animation方法来实现这一点。
在这里插入图片描述
在这里插入图片描述

<template><v-stage ref="stage" :config="stageSize"><v-layer ref="layer"><v-rectref="rect"@dragstart="changeSize"@dragend="changeSize":config="{width: 50,height: 50,fill: 'green',draggable: true}"/><v-regular-polygonref="hexagon":config="{x: 200,y: 200,sides: 6,radius: 20,fill: 'red',stroke: 'black',strokeWidth: 4}"/></v-layer></v-stage>
</template><script>
import Konva from "konva";
const width = window.innerWidth;
const height = window.innerHeight;export default {data() {return {stageSize: {width: width,height: height}};},methods: {changeSize(e) {// to()是Konva.Node实例的方法e.target.to({scaleX: Math.random() + 0.8,scaleY: Math.random() + 0.8,duration: 0.2});}},mounted() {const vm = this;const amplitude = 100;const period = 5000;// in msconst centerX = vm.$refs.stage.getNode().getWidth() / 2;const hexagon = this.$refs.hexagon.getNode();// Konva.Animation示例const anim = new Konva.Animation(function(frame) {hexagon.setX(amplitude * Math.sin((frame.time * 2 * Math.PI) / period) + centerX);}, hexagon.getLayer());anim.start();}
};
</script>

十二、缓存图形

在Vue Konva中,你可以通过访问Konva节点并使用node.cache()函数来缓存节点。
在这里插入图片描述

<template><div><v-stage ref="stage" :config="stageConfig"><v-layer ref="layer"><v-group ref="group"><v-starv-for="item in list":key="item.id":config="{x: item.x,y: item.y,rotation: item.rotation,id: item.id,numPoints: 5,innerRadius: 30,outerRadius: 50, fill: '#89b717',opacity: 0.8,shadowColor: 'black',shadowBlur: 10,shadowOpacity: 0.6,scaleX: item.scale,scaleY: item.scale,}"/></v-group></v-layer></v-stage><div class="cache"><input type="checkbox" @change="handleCacheChange"> 缓存图形</div></div>
</template><script>
const width = window.innerWidth;
const height = window.innerHeight;
export default {data() {return {list: [],dragItemId: null,stageConfig: {width: width,height: height,draggable: true}};},methods: {handleCacheChange(e) {const shouldCache = e.target.checked;if (shouldCache) {this.$refs.group.getNode().cache();} else {this.$refs.group.getNode().clearCache();}}},mounted() {for (let n = 0; n < 300; n++) {this.list.push({id: Math.round(Math.random() * 10000).toString(),x: Math.random() * width,y: Math.random() * height,rotation: Math.random() * 180,scale: Math.random()});}}
};
</script><style>
body {margin: 0;padding: 0;
}.cache {position: absolute;top: 0;left: 0;
}
</style>

十三、改变zIndex和组件排序
在Vue Konva中,不推荐直接使用zIndex来改变组件的堆叠顺序。相反,你应该通过更新应用的数据来确保组件在模板中的顺序正确。
在这里插入图片描述
在这里插入图片描述

<template><div><v-stage ref="stage" :config="configKonva"><v-layer ref="layer"><v-circlev-for="item in items":key="item.id":config="item"@dragstart="handleDragstart"@dragend="handleDragend"></v-circle></v-layer></v-stage></div>
</template><script>
import Konva from "konva";
const width = window.innerWidth;
const height = window.innerHeight;function generateItems() {const items = [];for (let i = 0; i < 10; i++) {items.push({x: Math.random() * width,y: Math.random() * height,radius: 50,id: "node-" + i,fill: Konva.Util.getRandomColor(),draggable: true,});}return items;
}export default {data() {return {items: [],dragItemId: null,configKonva: {width: width,height: height,},};},methods: {handleDragstart(e) {// 保存拖动元素:this.dragItemId = e.target.id();// 通过重新排列items数组,将当前元素移动到顶部:const item = this.items.find((i) => i.id === this.dragItemId);const index = this.items.indexOf(item);this.items.splice(index, 1);this.items.push(item);},handleDragend(e) {this.dragItemId = null;},},mounted() {this.items = generateItems();},
};
</script><style>
body {margin: 0;padding: 0;
}
</style>

总结

通过以上内容,我们全面地介绍了Vue Konva的各种功能和用法。从基础图形的绘制到复杂的动画效果,Vue Konva都提供了强大的支持。希望这篇博客能够帮助你更好地理解和使用Vue Konva,为你的Web应用增添更多的交互性和视觉效果。

相关文章:

Vue与Konva:解锁Canvas绘图的无限可能

前言 在现代Web开发中&#xff0c;动态、交互式的图形界面已成为提升用户体验的关键要素。Vue.js&#xff0c;作为一款轻量级且高效的前端框架&#xff0c;凭借其响应式数据绑定和组件化开发模式&#xff0c;赢得了众多开发者的青睐。而当Vue.js邂逅Konva.js&#xff0c;两者结…...

collabora online+nextcloud+mariadb在线文档协助

1、环境 龙蜥os 8.9 docker 2、安装docker dnf -y install dnf-plugins-core dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sed -i shttps://download.docker.comhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce /etc/yum.repos.…...

linux基础命令1

1、linux目录结构——树型结构 根目录&#xff1a;/ 用户主目录(家目录)&#xff1a;~或者 /home/edu 根目录下常见的文件夹: 2、常见的命令 1、pwd 查看当前目录 cd 切换目录 cd ~ 切换到家目录 2、ls 查看当前目录的文件信息 语法:ls [选项] [参…...

[LVGL] 在VC_MFC中移植LVGL

前言&#xff1a; 0. 在MFC中开发LVGL的优点是可以用多个Window界面做辅助扩展【类似GUIguider】 1.本文基于VC2022-MFC单文档框架移植lvgl8 2. gitee上下载lvgl8.3 源码&#xff0c;并将其文件夹改名为lvgl lvgl: LVGL 是一个开源图形库&#xff0c;提供您创建具有易于使用…...

Spring Boot整合MQTT

MQTT是基于代理的轻量级的消息发布订阅传输协议。 1、下载安装代理 进入mosquitto下载地址&#xff1a;Download | Eclipse Mosquitto&#xff0c;进行下载&#xff0c;以win版本为例 下载完成后&#xff0c;在本地文件夹找到下载的代理安装文件 使用管理员身份打开安装 安装…...

elasticsearch实战三 elasticsearch与mysql数据实时同步

一 介绍 elasticsearch数据不是一直不变的&#xff0c;需要与mysql、oracle等数据库的数据做同步。 本博客里涉及到的项目地址&#xff1a;https://www.aliyundrive.com/s/7bRWpTYsxWV 方案一&#xff1a; 同步调用&#xff0c;即操作mysql数据后&#xff0c;接着操作elastic…...

netcore openTelemetry+prometheus+grafana

一、netcore项目 二、openTelemetry 三、prometheus 四、grafana添加Dashborad aspire/src/Grafana/dashboards at main dotnet/aspire GitHub 导入&#xff1a;aspnetcore.json和aspnetcore-endpoint.json 效果&#xff1a;...

StochSync:可在任意空间中生成360°全景图和3D网格纹理

StochSync方法可以用于在任意空间中生成图像&#xff0c;尤其是360全景图和3D网格纹理。该方法利用了预训练的图像扩散模型&#xff0c;以实现零-shot生成&#xff0c;消除了对新数据收集和单独训练生成模型的需求。StochSync 结合了 Diffusion Synchronization&#xff08;DS&…...

MybatisPlus较全常用复杂查询引例(limit、orderby、groupby、having、like...)

MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。以下是 MyBatis-Plus 中常用复杂查询&#xff08;如 LIMIT、ORDER BY、GROUP BY、HAVING、LIKE 等&#xff09;的引例&#xff1a; 1. 环境准备…...

大数据项目2:基于hadoop的电影推荐和分析系统设计和实现

前言 大数据项目源码资料说明&#xff1a; 大数据项目资料来自我多年工作中的开发积累与沉淀。 我分享的每个项目都有完整代码、数据、文档、效果图、部署文档及讲解视频。 可用于毕设、课设、学习、工作或者二次开发等&#xff0c;极大提升效率&#xff01; 1、项目目标 本…...

win10的Unet项目导入阿里云训练

win10配置文件 annotated-types0.7.0 certifi2024.12.14 charset-normalizer3.4.1 click8.1.8 colorama0.4.6 contourpy1.1.1 cycler0.12.1 docker-pycreds0.4.0 eval_type_backport0.2.2 filelock3.16.1 fonttools4.55.3 fsspec2024.12.0 gitdb4.0.12 GitPython3.1.44 idna3.…...

Linux(20)——调度作业

目录 一、调度延迟的用户作业&#xff1a; 1、延迟的用户作业&#xff1a; 2、查看延迟的用户作业&#xff1a; 3、从计划中删除作业&#xff1a; 二、调度周期性用户作业&#xff1a; 1、周期性用户作业&#xff1a; 2、调度周期性用户作业&#xff1a; 3、用户作业格…...

DeepSeek赋能Vue:打造超丝滑进度条开发指南

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…...

清除el-table选中状态 clearSelection

如何在Vue应用中使用Element UI的el-table组件&#xff0c;通过this.$refs.multipleTable.clearSelection()方法来清除所有选中行的状态。适合前端开发者了解表格组件的交互操作。 // el-table绑定ref<el-table selection-change"selsChange" ref"multipl…...

【算法】动态规划专题⑥ —— 完全背包问题 python

目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题&#xff0c;它与0-1背包问题相似&#xff0c;但有一个关键的区别&#xff1a;在完全背包问题中&#xff0c;每种物品都有无限的数量可用。…...

论文笔记-COLING2025-LLMTreeRec

论文笔记-COLING2025-LLMTreeRec: Unleashing the Power of Large Language Models for Cold-Start Recommendations LLMTreeRec: 释放大语言模型在冷启动推荐中的力量摘要1.引言2.框架2.1项目树构建2.2以LLM为中心的基于树的推荐2.2.1推荐链策略2.2.2检索策略 3.实验3.1实验设…...

c++ haru生成pdf输出饼图

#define PI 3.14159265358979323846 // 绘制饼图的函数 void draw_pie_chart(HPDF_Doc pdf, HPDF_Page page, float *data, int data_count, float x, float y, float radius) { float total 0; int i; // 计算数据总和 for (i 0; i < data_count; i) { tot…...

【‌Unity】Unity中物体的static属性作用

‌Unity中物体的static属性主要用于优化游戏性能和简化渲染过程。‌ Unity中物体的static属性的作用 优化渲染性能‌&#xff1a;当物体被标记为static时&#xff0c;Unity会在游戏运行时将其视为静止的物体&#xff0c;这意味着这些物体的渲染信息不会随着每一帧的更新而变化…...

Rust 测试指南:从入门到进阶

1. 测试基础&#xff1a;#[test] 属性 Rust 测试的基本单位是函数。只要在一个函数前面标注 #[test] 属性&#xff0c;那么在运行 cargo test 时&#xff0c;Rust 会自动识别并执行它。例如&#xff0c;新建一个库工程 adder&#xff0c;cargo new adder --lib&#xff0c;在 …...

Elasticsearch 生产集群部署终极方案

Elasticsearch 集群部署 1.集群部署1.1 新增用户1.2 优化操作系统1.3 JDK1.4 elasticsearch1.5 开机自启动 2.安全认证功能2.1 生成CA证书2.2 生成密钥2.3 上传至其他节点2.4 修改属主、属组2.5 配置文件添加参数2.6 各节点添加密钥库密码2.7 设置用户密码 1.集群部署 1.1 新增…...

电路笔记(元器件):AD 5263数字电位计(暂记)

AD5263 是四通道、15 V、256位数字电位计&#xff0c;可通过SPI/I2C配置具体电平值。 配置模式&#xff1a; W引脚作为电位器的抽头&#xff0c;可在A-B之间调整任意位置的电阻值。也可将W与A(或B)引脚短接&#xff0c;A-W间的电阻总是0欧姆&#xff0c;通过数字接口调整电位器…...

如何在电脑后台定时进行自动截图?自动截图后如何快捷保存?如何远程查看?

7-2 有时候需要对电脑的屏幕进行在后台连续性的截图保存&#xff0c;并且要可以远程查看&#xff0c;无界面&#xff0c;以达到对电脑的使用过程进行完全了解的目的&#xff0c;一般用于对小孩使用电脑的掌握&#xff0c;如果父母在外地&#xff0c;不方便就近管理&#xff0c…...

解决react中函数式组件usestate异步更新

问题&#xff1a;在点击modal组件确认后 调用后端接口&#xff0c;使用setstateone&#xff08;false&#xff09;使modal组件关闭&#xff0c;但是设置后关闭不了&#xff0c;在设置setstateone&#xff08;false&#xff09;前后打印出了对应的stateone都为true&#xff0c;但…...

skia-macos源码编译

1、下载git-hub 源码 2、下载依赖库 3、编译&#xff0c;注意选项 bin/gn gen out/release --args"is_official_buildfalse skia_use_system_expatfalse skia_use_system_icufalse skia_use_libjpeg_turbofalse skia_use_system_libpngfalse skia_use_system_libwebpfal…...

本地部署DeepSeek(Mac版本,带图形化操作界面)

一、下载安装&#xff1a;Ollama 官网下载&#xff1a;Download Ollama on macOS 二、安装Ollama 1、直接解压zip压缩包&#xff0c;解压出来就是应用程序 2、直接将Ollama拖到应用程序中即可 3、启动终端命令验证 # 输入 ollama 代表已经安装成功。 4、下载模型 点击模型…...

离线统信系统的python第三方库批量安装流程

一、关于UOS本机 操作系统&#xff1a;UOS&#xff08;基于Debian的Linux发行版&#xff09; CPU&#xff1a;海光x86 二、具体步骤 1、在联网的电脑上用控制台的pip命令批量下载指定版本的第三方库 方法A cd <目标位置的绝对路径> pip download -d . --platform many…...

群晖安装Gitea

安装Docker Docker运行Gitea 上传gitea包&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/hmxm6/90360455 打开docker 点击印象&#xff0c;点击新增&#xff0c;从文件添加 点击启动 可根据情况&#xff0c;进行高级设置&#xff0c;没有就下一步 点击应…...

jmeter逻辑控制器9

1&#xff0c;简单控制器2&#xff0c;录制控制器3&#xff0c;循环控制器4&#xff0c;随机控制器5&#xff0c;随机顺序控制器6&#xff0c;if控制器7&#xff0c;模块控制器8&#xff0c;Include控制器9&#xff0c;事物控制器本文永久更新地址: 1&#xff0c;简单控制器 不…...

Spring统一修改RequestBody

我们编写RestController时&#xff0c;有可能多个接口使用了相同的RequestBody&#xff0c;在一些场景下需求修改传入的RequestBody的值&#xff0c;如果是每个controller中都去修改&#xff0c;代码会比较繁琐&#xff0c;最好的方式是在一个地方统一修改&#xff0c;比如将he…...

自动化xpath定位元素(附几款浏览器xpath插件)

在 Web 自动化测试、数据采集、前端调试中&#xff0c;XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大&#xff0c;但面对复杂 DOM 结构时&#xff0c;XPath 仍然更具灵活性。因此&#xff0c;掌握 XPath&#xff0c;不仅能提高自动化测试的稳定性&#xff0c;还能在爬…...

go-elasticsearch创建ik索引并进行查询操作

es-go client引入gomod go get github.com/elastic/go-elasticsearch/v8latest连接es服务器&#xff08;不经过安全校验) cfg : elasticsearch.Config{Addresses: []string{"http://localhost:9200",}, } es, err : elasticsearch.NewClient(cfg) if err ! nil {pa…...

【东莞常平】戴尔R710服务器不开机维修分享

1&#xff1a;2025-02-06一位老客户的朋友刚开工公司ERP服务器一台戴尔老服务器故障无法开机&#xff0c;于是经老客户介绍找到我们。 2&#xff1a;服务器型号是DELL PowerEdge R710 这个服务器至少也有15年以上的使用年限了。 3&#xff1a;客户反馈的故障问题为&#xff1a;…...

rebase和merge

rebase 和merge区别&#xff1a; rebase变基&#xff0c;改变基底&#xff1a;rebase会抹去提交记录。 git pull 默认merge&#xff0c;git pull --rebase 变基 rebase C、D提交属于feature分支&#xff0c;是基于master分支&#xff0c;在B提交额外拉出来的&#xff0c;当…...

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现 目录 SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来&#xff08;优…...

2025牛客寒假算法基础集训营5(补题)

C 小L的位运算 显然&#xff0c;如果两次反置的价格小于等于交换的价格&#xff0c;那么直接全部反置就好了。 反之&#xff0c;由于交换一定低于两次反置&#xff0c;我们尽可能用交换来消去不正确的位置。不正确的位置类型只有00&#xff0c;01&#xff0c;10&#xff0c;11&…...

Kotlin Android 环境搭建

Kotlin Android 环境搭建 引言 随着移动应用的日益普及,Android 开发成为了一个热门的技术领域。Kotlin 作为一种现代的编程语言,因其简洁、安全、互操作性强等特点,被越来越多的开发者所喜爱。本文将详细介绍 Kotlin Android 环境搭建的步骤,帮助您快速上手 Kotlin Andr…...

DeepSeek图解10页PDF

以前一直在关注国内外的一些AI工具&#xff0c;包括文本型、图像类的一些AI实践&#xff0c;最近DeepSeek突然爆火&#xff0c;从互联网收集一些资料与大家一起分享学习。 本章节分享的文件为网上流传的DeepSeek图解10页PDF&#xff0c;免费附件链接给出。 1 本地 1 本地部…...

Kafka中的KRaft算法

我们之前的Kafka值依赖于Zookeeper注册中心来启动的&#xff0c;往里面注册我们节点信息 Kafka是什么时候不依赖Zookeeper节点了 在Kafka2.8.0开始就可以不依赖Zookeeper了 可以用KRaft模式代替Zookeeper管理Kafka集群 KRaft Controller和KRaft Leader的关系 两者关系 Lea…...

C++20新特性

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 C20 是 C 标准中的一个重要版本&#xff0c;引入了许多新特性和改进&#xff0c;包括模块&#xff08;Modules&#xff09;、协程…...

[LUA ERROR] bad light userdata pointer

Cocos2d项目&#xff0c;targetSdkVersion30&#xff0c;在 android 13 设备运行报错: [LUA ERROR] bad light userdata pointer &#xff0c;导致黑屏。 参考 cocos2dx 适配64位 arm64-v8a 30 lua 提示 bad light userdata pointer 黑屏-CSDN博客的方法 下载最新的Cocos2dx …...

Maven 安装配置(完整教程)

文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型&#xff08;POM&#xff09;的项目管理和自动化构建工具。它主要服务于 Java 平台&#xff0c;但也支持其他编程语言…...

JAVA:CloseableHttpClient 进行 HTTP 请求的技术指南

1、简述 CloseableHttpClient 是 Apache HttpComponents 提供的一个强大 HTTP 客户端库。它允许 Java 程序与 HTTP/HTTPS 服务交互&#xff0c;可以发送 GET、POST 等各种请求类型&#xff0c;并处理响应。该库广泛用于 REST API 调用、文件上传和下载等场景。 2、特性 Close…...

WebRTC 客户端与ZLMediaKit通讯

1 web浏览器js方式 要使用 WebRTC 客户端与 ZLMediaKit 通讯&#xff0c;您需要设置一个 WebRTC 客户端并与 ZLMediaKit 进行连接。以下是一个基本的步骤和示例代码&#xff0c;帮助您实现这一目标。 ### 步骤 1. **安装 ZLMediaKit**&#xff1a;确保您已经在服务器上安装并…...

openssl使用

openssl使用 提取密钥对 数字证书pfx包含公钥和私钥&#xff0c;而cer证书只包含公钥。提取需输入证书保护密码 openssl pkcs12 -in xxx.pfx -nocerts -nodes -out pare.key提取私钥 openssl rsa -in pare.key -out pri.key提取公钥 openssl rsa -in pare.key -pubout -ou…...

stm32小白成长为高手的学习步骤和方法

我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解&#xff0c;请立即阅读STM32的文档&#xff0c;以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程&#xff0c;初学者可以看看&#xff0c;讲的真心不错。 英文好的同学&#xf…...

支持多种网络数据库格式的自动化转换工具——VisualXML

一、VisualXML软件介绍 对于DBC、ARXML……文件的编辑、修改等繁琐操作&#xff0c;WINDHILL风丘科技开发的总线设计工具——VisualXML&#xff0c;可轻松解决这一问题&#xff0c;提升工作效率。 VisualXML是一个强大且基于Excel表格生成多种网络数据库文件的转换工具&#…...

Linux学习笔记16---高精度延时实验

延时函数是很常用的 API 函数&#xff0c;在前面的实验中我们使用循环来实现延时函数&#xff0c;但是使用循环来实现的延时函数不准确&#xff0c;误差会很大。虽然使用到延时函数的地方精度要求都不会很严格( 要求严格的话就使用硬件定时器了 ) &#xff0c;但是延时函数肯定…...

【kafka实战】05 Kafka消费者消费消息过程源码剖析

1. 概述 Kafka消费者&#xff08;Consumer&#xff09;是Kafka系统中负责从Kafka集群中拉取消息的客户端组件。消费者消费消息的过程涉及多个步骤&#xff0c;包括消费者组的协调、分区分配、消息拉取、消息处理等。本文将深入剖析Kafka消费者消费消息的源码&#xff0c;并结合…...

20240817 联想 笔试

文章目录 1、选择题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.202、编程题2.12.2岗位:Linux开发工程师 题型:20 道选择题,2 道编程题 1、选择题 1.1 有如下程序,程序运行的结果为 (D) #include <stdio.h>int main() {int k = 3...