Drag and Drop API 实现 JavaScript 中的原生拖放功能
理解什么是拖放,我们先做个简单的实验。鼠标移动到页面左上角“CSDN” 图片上方,点击左键不放开,拖动鼠标,发现图片随着鼠标移动,松开鼠标时,图片消失。
一、拖放(Drag and Drop)有什么作用?
在 JavaScript 中,拖放(Drag and Drop)是一种用户界面交互模式,允许用户通过鼠标选择、拖动和放置元素。
常见拖放场景,如文件上传、画布编辑器、列表排序等。我们看一个文件上传例子:
<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>文件上传</title><style>#dropzone {margin: 0 auto;width: 300px;height: 200px;border: 4px dashed #ccc;display: flex;justify-content: center;align-items: center;color: #ccc;font-size: 16px;}</style></head><body><div id="dropzone">将文件拖到这里</div><script>//拖放目标const dropzone = document.getElementById('dropzone');//拖放目标-dragenter事件dropzone.addEventListener('dragenter', (event) => {event.preventDefault();console.log('拖放目标 - dragenter事件');dropzone.style.backgroundColor = 'darkgreen';});//拖放目标-dragover事件dropzone.addEventListener('dragover', (event) => {event.preventDefault();dropzone.style.borderColor = 'green';dropzone.innerText = 'dragover';});//拖放目标-dragleave事件dropzone.addEventListener('dragleave', () => {dropzone.style.borderColor = '#ccc';dropzone.style.backgroundColor = '#fff';dropzone.innerText = '将文件拖到这里';});//拖放目标-drop事件dropzone.addEventListener('drop', (event) => {event.preventDefault();dropzone.style.borderColor = '#ccc';dropzone.innerText = 'drop';const files = event.dataTransfer.files;for (let i = 0; i < files.length; i++) {console.log('文件名:', files[i].name); //F12查看 文件名: ***}});</script></body>
</html>
拖放是 2 个动作,拖(Drag)和放(Drop),拖动可拖动元素,放在放置目标上面。
二、拖放元素
在 HTML 中,默认可拖放的元素主要包括文本、图片和链接(即标签)。这些元素在默认情况下具有draggable="true"
属性,因此用户可以直接选中并拖动它们。其他非默认可拖放的元素,可以通过设置draggable="true"
属性来使它们变得可拖放.
- 文本:选中文本才能拖动。选中的文本为拖动数据,可以通过
e.dataTransfer.getData('text')
来获取。 - 图片:按住鼠标左键选中图片开始拖动。图片的 URL 为拖动数据,可以通过
e.dataTransfer.getData('url')来获取
。 - 链接:按住鼠标左键选中并开始拖动。链接的 URL 和文本为拖动数据,可以通过
e.dataTransfer.getData('url')
和e.dataTransfer.getData('text')
来获取。 - 自定义:通过设置
draggable="true"
属性来使元素变得可拖放。
拖放元素 3 个事件
- dragstart:在按住鼠标键不放并开始移动鼠标的那一刻,被拖动元素上会触发 dragstart 事件。此时光标会变成非放置符号(圆环中间一条斜杠),表示元素不能放到自身上。
- drag:dragstart 事件触发后,只要目标还被拖动就会持续触发 drag 事件。
- dragend:当拖动停止时(把元素放到有效或无效的放置目标上),会触发 dragend 事件。
<div class="side"><div class="rect graphic" draggable="true">长方形</div><div class="circle graphic" draggable="true">圆形</div>
</div>
<script>//拖放元素const graphics = document.querySelectorAll('.graphic');let graphic;//拖放元素-添加监听事件graphics.forEach((task) => {//拖放元素-dragstart事件task.addEventListener('dragstart', (e) => {console.log('拖放元素 - dragstart');graphic = task;task.style.borderColor = 'red';});//拖放元素-drag事件task.addEventListener('drag', (e) => {// console.log('拖放元素 -drag事件');graphic.style.borderColor = 'yellow';});//拖放元素-dragend事件task.addEventListener('dragend', () => {console.log('拖放元素 - dragend事件');graphic.style.borderColor = '#ccc';});});
</script>
三、放置目标
元素默认是不允许放置的,我们拖动元素时,会看到一个特殊光标(圆环中间一条斜杠)表示不能放下。
不过我们可以通过覆盖 dragenter
和 dragover
事件的默认行为,可以把任何元素转换为有效的放置目标。
let droptarget = document.getElementById('droptarget');
droptarget.addEventListener('dragover', (event) => {event.preventDefault();
});
droptarget.addEventListener('dragenter', (event) => {event.preventDefault();
});
执行上面的代码之后,把元素拖动到这个
droptarget.addEventListener('drop', (event) => {event.preventDefault();
});
放置目标是指被拖动的元素松开鼠标时被放置的目标;拖放元素被拖动到放置目标上时,将依次触发 dragenter、dragover 和 dragleave 或 drop 这四个事件,我们来看一个例子
- dragenter:当拖动元素进入放置目标的范围内时,会触发 dragenter 事件。
- dragover:在拖动元素持续停留在放置目标元素上时,会持续触发 dragover 事件。
- dragleave or drop:当拖动元素移出放置目标的范围时,会触发 dragleave 事件。当拖动元素在放置目标上释放时,会触发 drop 事件。2 者只能触发一个。
<div class="main" id="dropzone"></div>
<script>//拖放目标const dropzone = document.getElementById('dropzone');//拖放目标-dragenter事件dropzone.addEventListener('dragenter', (e) => {e.preventDefault();console.log('拖放目标 - dragenter事件');dropzone.style.backgroundColor = 'red';});//拖放目标-dragover事件dropzone.addEventListener('dragover', (e) => {e.preventDefault();// console.log('拖放目标-dragover事件');dropzone.style.backgroundColor = '#eee';});//拖放目标-dragleave事件dropzone.addEventListener('dragleave', () => {console.log('拖放目标 - dragleave事件');dropzone.style.backgroundColor = 'red';});//拖放目标-drop事件dropzone.addEventListener('drop', (e) => {e.preventDefault();console.log('拖放目标 - drop事件');});
</script>
四、dataTransfer 对象
除非数据受影响,否则简单的拖放并没有实际意义。为实现拖动操作中的数据传输,event 对象上暴露了 dataTransfer 对象,用于从被拖动元素向放置目标传递字符串数据。dataTransfer 对象有两个主要方法:getData()和 setData()。getData()用于获取 setData()存储的值。
// 传递文本
event.dataTransfer.setData('text', 'csdn');
let text = event.dataTransfer.getData('text');
// 传递 URL
event.dataTransfer.setData('URL', 'https://csdn.com/');
let url = event.dataTransfer.getData('URL');
在实际使用种,我们一般在 dragstart 事件中设置数据,在 drop 事件中获取获取,我们来看一个例子
- dragstart 事件中手动调用 setData()存储自定义数据
- drop 事件中手动调用 getData()获取自定义数据
<script>//拖放元素-dragstart事件task.addEventListener('dragstart', (e) => {console.log('拖放元素 - dragstart');data = {type: 'circle',style: {},position: {x: 0,y: 0,},animation: {},e: {onClick: null,},};e.dataTransfer.setData('graphicData', JSON.stringify(data));});//拖放目标-drop事件dropzone.addEventListener('drop', (e) => {e.preventDefault();console.log('拖放目标 - drop事件');let _data=e.dataTransfer.getData('graphicData')});
</script>
五、总结
拖放就是将“拖放元素“ 拖到 ”放置目标”上面。没有数据传输的拖动是没有意义的。拖得时候有 3 个事件,在dragstart
事件中定义数据,放得时候有 4 个事件,在drop
事件中接受数据。
六、画布编辑器
用户可以在画布上自由拖动图形元素案例
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.container {box-sizing: border-box;margin: 0 auto;width: 800px;height: 300px;overflow: hidden;}.side {box-sizing: border-box;padding: 30px;float: left;width: 220px;height: 300px;border: 1px solid pink;display: flex;flex-wrap: wrap;}.graphic {margin-left: 30px;width: 60px;height: 60px;background-color: darkgreen;display: flex;justify-content: center;align-items: center;border: 2px solid #ccc;color: #fff;text-align: center;}.rect {background-color: darkgreen;}.circle {border-radius: 50%;background-color: aqua;}.main {box-sizing: border-box;position: relative;float: left;margin-left: 20px;width: 560px;height: 300px;border: 1px solid lightblue;}#circle2 {position: absolute;display: none;}</style></head><body><div class="container"><div class="side"><div class="rect graphic" draggable="true">长方形</div><div class="circle graphic" draggable="true">圆形</div></div><div class="main" id="dropzone"><div id="circle2" class="circle graphic" draggable="true">圆形</div></div></div><script>//拖放元素const graphics = document.querySelectorAll('.graphic');let graphic, data;//拖放元素-添加监听事件graphics.forEach((task) => {//拖放元素-dragstart事件task.addEventListener('dragstart', (e) => {console.log('拖放元素 - dragstart');graphic = task;//点击不同元素,获取不同的值data = {type: 'circle',style: {},position: {x: 0,y: 0,},animation: {},e: {onClick: null,},};e.dataTransfer.setData('graphicData', JSON.stringify(data));task.style.borderColor = 'red';});//拖放元素-drop事件task.addEventListener('drag', (e) => {// console.log('拖放元素 -drag事件');graphic.style.borderColor = 'yellow';});//拖放元素-dragend事件task.addEventListener('dragend', () => {console.log('拖放元素 - dragend事件');graphic.style.borderColor = '#ccc';});});//拖放目标const dropzone = document.getElementById('dropzone');//拖放目标-dragenter事件dropzone.addEventListener('dragenter', (e) => {console.log('拖放目标 - dragenter事件');e.preventDefault();dropzone.style.backgroundColor = 'red';});//拖放目标-dragover事件dropzone.addEventListener('dragover', (e) => {// console.log('拖放目标-dragover事件');e.preventDefault();dropzone.style.backgroundColor = '#eee';});//拖放目标-dragleave事件dropzone.addEventListener('dragleave', () => {console.log('拖放目标 - dragleave事件');dropzone.style.backgroundColor = 'red';});//拖放目标-drop事件dropzone.addEventListener('drop', (e) => {e.preventDefault();console.log('拖放目标 - drop事件');//获取到值之后console.log(e.dataTransfer.getData('graphicData').toString());const circle2 = document.getElementById('circle2');//根据定位画图circle2.style.display = 'flex';const rectInfo = dropzone.getBoundingClientRect();let top = e.clientY - rectInfo.y;let left = e.clientX - rectInfo.x;circle2.style.margin = 0;circle2.style.left = left + 'px';circle2.style.top = top + 'px';});</script></body>
</html>
点个关注:谢谢!
相关文章:
Drag and Drop API 实现 JavaScript 中的原生拖放功能
理解什么是拖放,我们先做个简单的实验。鼠标移动到页面左上角“CSDN” 图片上方,点击左键不放开,拖动鼠标,发现图片随着鼠标移动,松开鼠标时,图片消失。 一、拖放(Drag and Drop)有…...
人脸检测的若干思考!!!
1.目前主要有人脸检测方法分类? 主要包含两类:传统人脸检测算法和基于深度学习的人脸检测算法。 传统人脸检测算法主要可以分为4类: 基于知识、模型、特征和外观的人脸检测方法; 基于深度学习的方法:基于级联CNN的人脸…...
【时间序列分析】斯皮尔曼(Spearman)相关系数理论基础及python代码实现
文章目录 1. 斯皮尔曼相关系数1.1 公式定义1.2 计算过程1.3 计算示例1.4 注意事项(当有重复值时) 2. 优缺点2.1 优点2.2 缺点 3. 适用场景4. Python代码实现4.1 调用scipy库 5 思考5.1 什么是单调关系?与线性关系的区别是什么?5.2…...
python | linux | ModuleNotFoundError: No module named ‘WFlib‘ |找不到模块
问题: (base) beautyby521-7:~/Website-Fingerprinting-Library-master$ bash scripts/NetCLR.sh Traceback (most recent call last):File "/home/beauty/Website-Fingerprinting-Library-master/exp/pretrain.py", line 8, in <module>from WFli…...
B-TREE详解
B - tree 的详细结构特点 节点结构细节 关键字存储方式:B - tree 节点中的关键字是按照一定顺序排列的,这个顺序可以是升序或者降序。例如,在一个以数字为关键字的 B - tree 中,关键字从左到右依次增大。每个关键字都有一个分隔作…...
Kotlin复习
一、Kotlin类型 1.整数 2.浮点 显示转换: 所有数字类型都支持转换为其他类型,但是转换前会检测长度。 toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double 不同进制的数字表示方法(为了提高…...
批处理文件的创建与编辑方法
批处理命令保存在以BAT为扩展名地文本文件中,因此可以使用任何字处理软件创建、编辑批处理文件,如Word、WinHex、Editpuls等。 案例一 使用copy con命令创建批处理文件 ”copy con“是一个功能简单、易于使用的创建文本文件命令,命令中”con…...
Spring Boot集成Kafka:最佳实践与详细指南
文章目录 一、生产者1.引入库2.配置文件3.配置类PublicConfig.javaMessageProducer.java 4.业务处理类 三、消费者1.引入库2.配置类PublicConfig.javaMessageConsumer.java 3.业务类 一、生产者 1.引入库 引入需要依赖的jar包,引入POM文件: <depend…...
maven 中 有历史模块缓存 怎么清
Maven 在运行时会将一些数据保存在本地仓库中,以加快构建过程。其中一部分是项目的依赖项,还有就是“历史模块缓存”。这些缓存信息保存在本地仓库的 _remote.repositories 文件中。 解决方案: 手动删除缓存文件: 进入你的Maven本…...
云计算HCIP-OpenStack04
书接上回: 云计算HCIP-OpenStack03-CSDN博客 12.Nova计算管理 Nova作为OpenStack的核心服务,最重要的功能就是提供对于计算资源的管理。 计算资源的管理就包含了已封装的资源和未封装的资源。已封装的资源就包含了虚拟机、容器。未封装的资源就是物理机提…...
【信息系统项目管理师-论文真题】2015下半年论文详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论题一:大项目或多项目的成本管理解题思路写作要点论题二:项目的采购管理解题思路写作要点论题一:大项目或多项目的成本管理 随着移动互联网、物联网、云计算、大数据等新一代信息技术的广泛应用,我国目前…...
C# 面试中常见递归算法
前言 今天我们主要总结一下C#面试中常见递归算法。 C#经典十大排序算法(完结) C#递归算法计算阶乘的方法 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。180…...
qemu源码解析【02】qom基本概念
目录 qemu源码解析【02】qom基本概念参考资料基本数据结构TypeImplObjectClassObjectTypeInfo qemu源码解析【02】qom基本概念 参考资料 https://blog.csdn.net/u011364612/article/details/53485856qemu中为了模拟各种虚拟设备和总线,采用了面向对象的思想&#…...
C++算法第八天
本篇文章我们继续学习c算法 目录 第一题 题目链接 题目展示 代码原理 代码编写 第二题 题目链接 题目展示 代码原理 代码编写 第三题 题目链接 题目展示 代码原理 代码编写 第一题 题目链接 69. x 的平方根 - 力扣(LeetCode) 题目展示…...
大语言模型的常用微调方法
文章目录 数据构造与清洗数据构造方法1.基于 Self-Instruct 方法的数据构造2.面向结构化知识的数据构造 数据清洗方法1.IFD 指标法2. MoDS 方法 2.2 分词器构造2.2.1 分词器概述BPE 分词器WordPiece 分词器Unigram 分词器 2.3 大型语言模型的微调方法前缀调优提示调优P-Tuning …...
安卓获取所有可用摄像头并指定预览
在Android设备中,做预览拍照的需求的时候,我们会指定 CameraSelector DEFAULT_FRONT_CAMERA前置 或者后置CameraSelector DEFAULT_BACK_CAMERA 如果你使用的是平板或者工业平板,那么就会遇到多摄像头以及外置摄像头问题,简单的指…...
Jwt和Session的区别和优缺点
目录 一、Authentication和Authorization的区别 二、用户认证的两种主流方法 ① 、基于session认证流程如下: ②、基于token(令牌)用户认证如下: 三、区别和优缺点 JWT的优点: JWT的缺点: 安全性 …...
如何使用 Python 读取和写入 CSV 文件?
在Python中,处理CSV文件是一项常见的任务,通常用于数据交换和数据存储。 Python的标准库csv模块提供了一种方便的方式来读取和写入CSV文件。 下面我将详细介绍如何使用Python的csv模块来读取和写入CSV文件,并提供一些实际开发中的建议和注意…...
FR2012富芮坤PMU:设置PMU GPIO为输入读取状态;在睡眠功能中读取IO;PMU GPIO设置唤醒源中断
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
私有云dbPaaS为何被Gartner技术成熟度曲线标记为“废弃”?
当云计算席卷而来,基于云基础设施的数据库部署也改变了数据库。在传统的私有化部署(On-premises)和公有云部署(Public Cloud)之间,不断融合的混合IT(Mixed IT)形式成为最常见的企业级…...
RabbitMQ 高级特性——延迟队列
文章目录 前言延迟队列延迟队列的概念TTL 死信队列模拟延迟队列设置队列的 TTL设置消息的 TTL 延迟队列插件安装并且启动插件服务使用插件实现延迟功能 前言 前面我们学习了 TTL 和死信队列,当队列中的消息达到了过期时间之后,那么这个消息就会被死信交…...
Perl 引用
Perl 引用 Perl,作为一种灵活而强大的编程语言,广泛用于系统管理、网络编程、GUI开发等领域。在Perl编程中,引用(References)是一个核心概念,它允许变量引用其他数据,从而创建复杂的数据结构&a…...
llama2——微调lora,第一次参考教程实践完成包括训练和模型
前言:磕磕绊绊,不过收获很多,最大的收获就是解决报错error的分析方法和解决思路 1、首先,我参考的是这篇博客:怎样训练一个自己的大语言模型?全网最简单易懂的教程!_开源模型训练出一个语言模型…...
【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用
目录 1. 引言 2. 矩阵分解概述 2.1 矩阵分解的意义 3. 奇异值分解(SVD) 3.1 定义与数学基础 3.2 SVD 的性质 3.3 SVD 在数据降维中的应用 3.4 示例代码:使用 SVD 进行图像压缩 3.5 结果分析 4. 主成分分析(PCA࿰…...
C++常见面试题-初级2
1. C和C有什么区别? C是面向对象的语言,而C是面向过程的语言;C引入new/delete运算符,取代了C中的malloc/free库函数;C引入引用的概念,而C中没有;C引入类的概念,而C中没有࿱…...
R square 的计算方法和一点思考
模型的性能评价指标有几种方案:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、R2_score 其中,当量纲不同时,RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score࿱…...
梳理你的思路(从OOP到架构设计)_简介EIT造形
目录 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码结构 <基类/子类>代码结构的变形 2、 从<基类/子类>结构到EIT造形 3、 EIT造形的基本形与变形 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码…...
梳理你的思路(从OOP到架构设计)_认识EIT造形与内涵
目录 1、 认识类(Class)与内涵 2、 认识EIT造形与内涵 EIT造形: 类造形的组合编辑 复习EIT的基本形与变形编辑 不同内涵 EIT造形 1、 认识类(Class)与内涵 回顾 类(Class)是比较小的造形 各种不同内涵,可以透过类(Class)的形式(Form)来呈现出…...
【FTP】FTP基础知识点
文章目录 一、概述二、 工作原理2.1 两个连接2.2 安全性 三、代码实现:1. 选择合适的库2. 连接配置和初始化3. 连接状态检查4. 重连机制5. 文件操作6. 安全性7. 资源管理 参考: 一、概述 将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机…...
排序算法(7):堆排序
问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 堆排序 堆排序是一种基于堆数据结构的排序算法。堆是一个近似完全二叉树的结构,即除了最后一层外,每一层都必须填满,且最后一层从左往右填充。 堆可以分为大根堆和小根堆。在大根堆中&…...
BERT模型入门(6)语言建模
文章目录 自回归语言建模自编码语言建模 BERT模型在以下两个任务上进行预训练: (1)掩蔽语言建模 (2)下一句预测 让我们逐一了解这两种预训练策略是如何工作的。在介绍掩蔽语言模型任务之前,首先让我们了…...
RNN LSTM Seq2Seq Attention
非端到端: data -》 cleaning -》 feature Engining (70%-80%工作 设计特征)-》 分类器 -》预测 端到端 End-to-End: data -》 cleaning -》Deep learning(表示学习,从数据中学习特征) -》…...
go语言使用websocket发送一条消息A,持续接收返回的消息
在Go语言中实现一个WebSocket客户端,可以使用gorilla/websocket这个非常流行的库来处理WebSocket连接。下面是一个简单的示例,展示了如何创建一个WebSocket客户端,向服务器发送消息"A",并持续接收来自服务器的响应。 首…...
音频进阶学习八——傅里叶变换的介绍
文章目录 前言一、傅里叶变换1.傅里叶变换的发展2.常见的傅里叶变换3.频域 二、欧拉公式1.实数、虚数、复数2.对虚数和复数的理解3.复平面4.复数和三角函数5.复数的运算6.欧拉公式 三、积分运算1.定积分2.不定积分3.基本的积分公式4.积分规则线性替换法分部积分法 5.定积分计算…...
沟通的艺术,学会转移矛盾
我的一位好友,资深项目经理,同时也是我公益课程的热心志愿者,最近向我倾诉了他在团队沟通上的挑战。 他发现,尽管辅导学员时感到轻松愉快,但与自己团队成员的沟通却充满挫折。 我询问了他的沟通方式,他解释…...
测评|携程集团25年社招在线测评北森题库、真题分析、考试攻略
携程集团社招入职测评北森题库主要考察以下几个方面: 1. **言语理解**:这部分主要测试应聘者运用语言文字进行思考和交流、迅速准确地理解和把握文段要旨的能力。 2. **资料分析**:包括文字题和图表题,考察应聘者快速找出关键信息…...
C++(进阶) 第4章 map和set的使⽤
C(进阶) 第4章 map和set的使⽤ 文章目录 前言一、序列式容器和关联式容器二、set1. insert2.迭代器遍历3.范围for4.erase5.count6.lower_bound和upper_bound 三、multiset总结 前言 上一篇博客写了二叉搜索树,这一篇博客会在上一篇博客原来的上在深入介…...
数独游戏app制作拆解(之三)——数字候选区实现
所谓的数据候选区就是这个: 数字候选区功能及实现: 说明:这部分其实也是textview. 本区功能: 一、实现数字显示到显示区。点击显示区选定某个格子后,再点击这里的数字,会在格子内显示相应的数字。在编辑…...
数据结构——排序
*排序属于数据的运算 1、定义:将一组杂乱无章的数据按一定规律顺次排列一起,即将无序序列排成一个有序序列的运算。 (如果参加排序的数据结构包含多个数据域,那么排序往往是针对其中某个域而言) 2、排序的应用十分广泛:程序中间接应用(二分查找、最短路径、最小生成树…...
制造业4.0:AI与机器人如何重塑生产线
引言:从传统到未来的转型 在轰鸣的生产线上,传统制造业曾以规模化生产和成本效益为核心竞争力,推动了全球工业化进程。然而,面对现代市场的多样化需求和激烈竞争,这种模式正暴露出越来越多的局限性:产能过剩…...
Fastdfs V6.12.1集群部署(arm/x86均可用)
文章目录 一、 Fastdfs 介绍二、部署 信息三、步骤tracker/storage 机器的 compose 内容storage 机器的 composetracker 与 storage 启动目录层级与配置文件测试测试集群扩容与缩减注意事项 一、 Fastdfs 介绍 FastDFS 是一款高性能的分布式文件系统,特别适合用于存…...
【学习笔记】深入浅出详解Pytorch中的View, reshape, unfold,flatten等方法。
文章目录 一、写在前面二、Reshape(一)用法(二)代码展示 三、Unfold(一)torch.unfold 的基本概念(二)torch.unfold 的工作原理(三) 示例代码(四&a…...
解决Presto dirver timestamp时区问题
#bigdata/metabase 一、背景介绍 1、Presto版本 使用阿里云集群的版本 EMR-5.4.2,Presto的版本为338; Facebook后续不再维护,Trino 351为首个版本 2、Metabase版本 历史版本为0.38.4,新版本为0.51.5 3、0.38.4 cast to time…...
【优选算法】Prefix-Kage:前缀和的算法影(上)
文章目录 1.概念解析2.代码实现2.1【模版】前缀和(一维)2.1.1 原理2.1.2 代码实现 2.2【模版】前缀和(二维)2.2.1 原理2.2.2 代码实现 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本篇是优选算…...
中阳科技:量化交易模型的技术革新与实践应用
在金融市场日益复杂化的今天,量化交易作为数据驱动的现代化交易方式,已成为金融领域发展的关键方向。中阳科技凭借深厚的技术积累与创新能力,积极探索量化交易模型的优化与应用,开辟了智能金融新局面。 量化交易的优势与市场前景…...
golang 判断一个点是否在一个多边形内
我有一需求为:判断一个点(经纬度范围)是否在一个多边形范围内(多个经纬度点) 这里我借助几何库( github.com/paulmach/orb)来处理地理空间数据 可以通过在线获取经纬度来确认代码正确性 packa…...
图论笔记1
1.1邻接矩阵储存法 //创建:二维数组vector<vector<int>> graph(n,vector<int>(n,0));//储存for(int i0;i<m;i){int x1,x2;cin>>x1>>x2;graph[x1-1][x2-1]1;}1.2邻接表储存法 补充:c中的list是链表 链接 //创建:数组…...
大模型QLoRA微调——基于Qwen2-7B的自动化病历摘要生成系统
01 项目简介 (1)项目背景 医疗文档中包含大量的诊疗信息,例如疾病诊断、手术名称、解剖部位、药物使用以及影像和实验室检查结果。这些信息是医疗数据分析的核心,但由于医疗文本内容复杂、格式多样,提取这些关键内容…...
CTFHub-ssrf
技能树--Web--SSRF 内网访问 开启题目 尝试访问位于127.0.0.1的flag.php吧 进入环境 根据提示输入即可 127.0.0.1/flag.php 伪协议读取文件 开启题目 尝试去读取一下Web目录下的flag.php吧 进入环境,根据提示输入 file:///var/www/html/flag.php 鼠标右键查看…...
使用ElasticSearch实现全文检索
文章目录 全文检索任务描述技术难点任务目标实现过程1. java读取Json文件,并导入MySQL数据库中2. 利用Logstah完成MySQL到ES的数据同步3. 开始编写功能接口3.1 全文检索接口3.2 查询详情 4. 前端调用 全文检索 任务描述 在获取到数据之后如何在ES中进行数据建模&a…...