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

日常学习开发记录-slider组件

日常学习开发记录-slider组件

  • 从零开始实现一个优雅的Slider滑块组件
    • 前言
    • 一、基础实现
      • 1. 组件结构设计
      • 2. 基础样式实现
      • 3. 基础交互实现
    • 二、功能增强
      • 1. 添加拖动功能
      • 2. 支持范围选择
      • 3. 添加垂直模式
    • 三、高级特性
      • 1. 键盘操作支持
      • 2. 禁用状态
    • 五、使用示例
    • 六、总结

从零开始实现一个优雅的Slider滑块组件

前言

在Web开发中,滑块组件是一个常见的UI控件,用于数值范围的选择。本文将带领大家从零开始实现一个类似Element UI的Slider组件,我们将采用渐进式开发的方式,从基础功能开始,逐步添加更多特性。

一、基础实现

1. 组件结构设计

首先,我们需要设计一个基础的滑块组件结构:

<template><div class="my-slider"><div class="my-slider__runway"><div class="my-slider__bar"></div><div class="my-slider__button-wrapper"><div class="my-slider__button"></div></div></div></div>
</template>

这个结构包含:

  • my-slider: 组件容器
  • my-slider__runway: 滑块轨道
  • my-slider__bar: 已选择区域的进度条
  • my-slider__button-wrapper: 滑块按钮容器
  • my-slider__button: 可拖动的滑块按钮

2. 基础样式实现

<style lang="scss" scoped>.my-slider {width: 100%;height: 10px;cursor: pointer;&__runway {width: 100%;height: 100%;border-radius: 5px;background-color: #f0f0f0;position: relative;.my-slider__bar {position: absolute;top: 0;left: 0;height: 100%;border-radius: 5px;}.my-slider__button-wrapper {height: 36px;width: 36px;position: absolute;top: -13px;transform: translateX(-50%);display: flex;align-items: center;justify-content: center;.my-slider__button {height: 16px;width: 16px;border-radius: 50%;border: 2px solid #007bff;background-color: #fff;transition: transform 0.2s;}&:hover {cursor: grab;.my-slider__button {transform: scale(1.2);}}}}}
</style>

结果:
在这里插入图片描述

3. 基础交互实现

<template><div class="my-slider" :class="{ disabled: disabled }"><div class="my-slider__runway" @click="handleSliderClick" ref="slider"><div class="my-slider__bar" :style="barStyle"></div><div class="my-slider__button-wrapper" :class="{ disabled: disabled }" :style="wrapperStyle"><div class="my-slider__button"></div></div></div></div>
</template><script>export default {name: 'MySlider',props: {min: {type: Number,default: 0,},max: {type: Number,default: 100,},value: {type: [Array, Number],default: 0,},disabled: {type: Boolean,default: false,},step: {type: Number,default: 1,},},data() {return {currentValue: this.value,sliderSize: 1, // 滑块大小}},computed: {// 滑块的样式,高亮展示已移动的区域(单个滑块-左侧,多个滑块-中间高亮)barStyle() {return {width: `${this.currentValue}%`,left: `0%`,}},wrapperStyle() {return {left: `${this.currentValue}%`,}},precision() {//确定 min、max 和 step 中最大的小数位数let precisions = [this.min, this.max, this.step].map(item => {let decimal = ('' + item).split('.')[1]return decimal ? decimal.length : 0})return Math.max.apply(null, precisions)},},mounted() {this.resetSliderSize()},methods: {handleSliderClick(event) {if (this.disabled) returnconst sliderOffsetLeft = this.$refs.slider.getBoundingClientRect().leftthis.setPosition(((event.clientX - sliderOffsetLeft) / this.sliderSize) * 100)},setPosition(percentage) {//percentage为百分比位置this.currentValue = this.min + ((this.max - this.min) * percentage) / 100//每步的步长 max 50 min 0 ,每步步长 100 / 50 = 2const lengthPerStep = 100 / ((this.max - this.min) / this.step)//根据当前滑块的百分比位置(percentage)和每一步的长度(lengthPerStep),计算出当前所在的步数(steps) 四舍五入const steps = Math.round(percentage / lengthPerStep)//当前显示值 步长 * 步数* 每步的步长+最小值let value = steps * lengthPerStep * (this.max - this.min) * 0.01 + this.minvalue = parseFloat(value.toFixed(this.precision))this.currentValue = value//this.$emit('update:value', this.currentValue)//v-model 默认监听的是 input 事件,而不是 update:value 事件this.$emit('input', this.currentValue)},resetSliderSize() {this.sliderSize = this.$refs.slider.offsetWidth},},}
</script>

结果:
在这里插入图片描述
实现思路:

1. 模板结构
外层容器:<div class="my-slider">,用于包裹整个滑块组件,支持根据 disabled 属性动态添加禁用样式。
滑道:<div class="my-slider__runway">,表示滑块的背景轨道,点击滑道可以快速定位滑块位置。
滑块高亮区域:<div class="my-slider__bar">,表示滑块已移动的区域,宽度根据 currentValue 动态计算。
滑块按钮:<div class="my-slider__button-wrapper">,包含一个圆形按钮,用于拖动滑块,支持禁用状态样式。
2. Props 属性
min:滑块的最小值,默认 0。
max:滑块的最大值,默认 100。
value:滑块的当前值,支持数字或数组类型,默认 0。
disabled:是否禁用滑块,默认 false。
step:滑块的步长,默认 13. 数据与计算属性
currentValue:滑块的当前值,初始值为 props.value。
sliderSize:滑道的宽度,用于计算滑块的百分比位置。
barStyle:计算滑块的样式,动态设置高亮区域的宽度和位置。
wrapperStyle:计算滑块按钮的样式,动态设置按钮的左侧位置。
precision:计算 min、max 和 step 中最大的小数位数,用于确保数值精度。
4. 方法
handleSliderClick(event):处理滑道点击事件,计算点击位置的百分比并设置滑块位置。
setPosition(percentage):根据百分比位置计算滑块的当前值,并触发 input 事件更新父组件的 v-model 绑定值。
resetSliderSize():在组件挂载时重置滑道的宽度。
5. 样式
滑道:灰色背景,圆角矩形。
高亮区域:蓝色背景,表示滑块已移动的区域。
滑块按钮:圆形按钮,支持悬停放大效果,禁用状态下变为灰色。
禁用状态:滑道和高亮区域变为灰色,按钮不可拖动。
6. 交互逻辑
点击滑道:快速定位滑块到点击位置。
拖动滑块:通过 setPosition 方法动态更新滑块位置,并触发 input 事件。
步长控制:根据 step 属性调整滑块的移动步长,确保滑块位置符合步长要求。
禁用状态:当 disabled 为 true 时,禁止所有交互操作。
7. 事件
input 事件:当滑块值发生变化时触发,用于实现 v-model 双向绑定。

主要是在于动态style的计算达到视觉上的效果。

二、功能增强

1. 添加拖动功能

<template><div class="my-slider" :class="{ disabled: disabled }"><div class="my-slider__runway" @click="handleSliderClick" ref="slider"><div class="my-slider__bar" :style="barStyle"></div><divclass="my-slider__button-wrapper":class="{ disabled: disabled, dragging: dragging }":style="wrapperStyle"@mousedown="onButtonDown"@touchstart="onButtonDown"ref="button"><div class="my-slider__button"></div></div></div></div>
</template><script>export default {name: 'MySlider',///data() {return {currentValue: this.value, // 当前值sliderSize: 1, // 滑块大小dragging: false, // 是否正在拖拽startX: 0, // 开始拖拽时的 x 坐标currentX: 0, // 当前拖拽时的 x 坐标startPosition: 0, // 开始拖拽时的位置newPosition: null, // 新位置oldValue: this.value, // 旧值}},computed: {// 滑块的样式,高亮展示已移动的区域(单个滑块-左侧,多个滑块-中间高亮)barStyle() {return {width: `${this.currentValue}%`,left: `0%`,}},wrapperStyle() {return {left: `${this.currentValue}%`,}},precision() {//确定 min、max 和 step 中最大的小数位数let precisions = [this.min, this.max, this.step].map(item => {let decimal = ('' + item).split('.')[1]return decimal ? decimal.length : 0})return Math.max.apply(null, precisions)},},watch: {value(val) {this.currentValue = val},},mounted() {this.resetSliderSize()},methods: {/*** 点击滑块* @param {Event} event - 事件对象*/handleSliderClick(event) {if (this.disabled) return// 防止点击滑块按钮时触发if (this.$refs.button && this.$refs.button.contains(event.target)) {return}const sliderOffsetLeft = this.$refs.slider.getBoundingClientRect().leftthis.setPosition(((event.clientX - sliderOffsetLeft) / this.sliderSize) * 100)this.emitChange()},onButtonDown(event) {if (this.disabled) returnevent.preventDefault() // 阻止默认行为this.dragging = true // 标记开始拖动// 处理触屏事件if (event.type === 'touchstart') {event.clientX = event.touches[0].clientX}// 记录初始位置this.startX = event.clientXthis.startPosition = parseFloat(this.currentValue)this.newPosition = this.startPosition// 添加全局事件监听window.addEventListener('mousemove', this.onDragging)window.addEventListener('touchmove', this.onDragging)window.addEventListener('mouseup', this.onDragEnd)window.addEventListener('touchend', this.onDragEnd)window.addEventListener('contextmenu', this.onDragEnd)this.resetSliderSize() // 重新计算滑块尺寸},/*** 拖拽中*/onDragging(event) {if (this.dragging) {// 获取当前鼠标位置let clientXif (event.type === 'touchmove') {clientX = event.touches[0].clientX} else {clientX = event.clientX}// 计算移动距离并转换为百分比const diff = ((clientX - this.startX) / this.sliderSize) * 100// 计算新位置this.newPosition = this.startPosition + diff// 更新滑块位置this.setPosition(this.newPosition)}},/*** 拖拽结束*/onDragEnd() {if (this.dragging) {// 使用setTimeout确保在mouseup事件之后执行setTimeout(() => {this.dragging = falsethis.setPosition(this.newPosition)this.emitChange() // 触发change事件}, 0)// 移除所有事件监听window.removeEventListener('mousemove', this.onDragging)window.removeEventListener('touchmove', this.onDragging)window.removeEventListener('mouseup', this.onDragEnd)window.removeEventListener('touchend', this.onDragEnd)window.removeEventListener('contextmenu', this.onDragEnd)}},/*** 设置滑块位置* @param {number} position - 滑块位置 0-100*/setPosition(position) {if (position === null || isNaN(position)) returnif (position < 0) {position = 0} else if (position > 100) {position = 100}//每步的步长 max 50 min 0 ,每步步长 100 / 50 = 2const lengthPerStep = 100 / ((this.max - this.min) / this.step)//根据当前滑块的百分比位置(percentage)和每一步的长度(lengthPerStep),计算出当前所在的步数(steps) 四舍五入const steps = Math.round(position / lengthPerStep)//当前显示值 步长 * 步数* 每步的步长+最小值let value = steps * lengthPerStep * (this.max - this.min) * 0.01 + this.minvalue = parseFloat(value.toFixed(this.precision))this.currentValue = value// 更新 v-model 绑定值,但不触发 change 事件this.$emit('input', this.currentValue)},emitChange() {// 拖动结束时触发 change 事件this.$emit('change', this.currentValue)},resetSliderSize() {this.sliderSize = this.$refs.slider.offsetWidth},},}
</script>

效果:
在这里插入图片描述

实现思路:

使用 mousedown/touchstart 开始拖动
使用 mousemove/touchmove 处理拖动过程
使用 mouseup/touchend 结束拖动

2. 支持范围选择

添加range方法,重点是拖动至重合时候的处理,要记住当前拖动的是哪一个滑块

   // 判断当前点击的是哪个滑块const target = event.target.closest('.my-slider__button-wrapper')if (target === this.$refs.button) {this.startPosition = this.firstValuethis.currentSlider = 'first'} else if (target === this.$refs.button1) {this.startPosition = this.secondValuethis.currentSlider = 'second'}

3. 添加垂直模式

通过prop属性vertical来判断是否开启垂直模式
在这里插入图片描述

三、高级特性

1. 键盘操作支持

@keydown.left,@keydown.right, @keydown.up,@keydown.down,根据键盘方向事件,更新调用setposition方法直接更新滑块位置

2. 禁用状态

.my-slider {&.is-disabled {cursor: not-allowed;opacity: 0.6;.my-slider__button-wrapper {cursor: not-allowed;}}
}

五、使用示例

最后实现的效果:

在这里插入图片描述

六、总结

通过这个渐进式的实现过程,我们完成了一个功能完整的Slider组件。主要特点包括:

  1. 基础功能:

    • 单滑块/双滑块支持
    • 自定义数值范围
    • 平滑的拖动效果
  2. 增强功能:

    • 刻度标记
    • 禁用状态
  3. 高级特性:

    • 键盘操作支持
    • 垂直模式
    • 自定义格式化
  4. 性能优化:

    • 防抖处理
    • 计算属性缓存

这个实现不仅满足了基本需求,还考虑到了用户体验、可访问性和性能优化等多个方面。通过这样的渐进式开发,我们可以确保每一步都有坚实的基础,同时逐步增加功能复杂度。

相关文章:

日常学习开发记录-slider组件

日常学习开发记录-slider组件 从零开始实现一个优雅的Slider滑块组件前言一、基础实现1. 组件结构设计2. 基础样式实现3. 基础交互实现 二、功能增强1. 添加拖动功能2. 支持范围选择3. 添加垂直模式 三、高级特性1. 键盘操作支持2. 禁用状态 五、使用示例六、总结 从零开始实现…...

AIDL 中如何传递 Parcelable 对象

目录 1. 直接在 AIDL 中定义 Parcelable 对象2. 自定义 Parcelable 对象的传递3. 以 Rect 类为例的 Parcelable 实现4. 注意安全性5. 小结1. 直接在 AIDL 中定义 Parcelable 对象 背景说明 从 Android 10(API 级别 29)开始,AIDL 允许直接在 .aidl 文件中定义 Parcelable 对…...

LVGL实战训练——计算器实现

目录 一、简介 二、部件知识 2.1 按钮矩阵部件(lv_btnmatrix) 2.1.1 按钮矩阵部件的组成 2.1.2 按钮文本设置 2.1.3 按钮索引 2.1.4 按钮宽度 2.1.5 按钮属性 2.1.6 按钮互斥 2.1.7 按钮文本重着色 2.1.8 按钮矩阵部件的事件 2.1.9 按钮矩阵部件的 API 函数 2.2…...

代码随想录算法训练营Day30

力扣452.用最少数量的箭引爆气球【medium】 力扣435.无重叠区间【medium】 力扣763.划分字母区间【medium】 力扣56.合并区间【medium】 一、力扣452.用最少数量的箭引爆气球【medium】 题目链接&#xff1a;力扣452.用最少数量的箭引爆气球 视频链接&#xff1a;代码随想录 题…...

AIDL 语言简介

目录 软件包类型注释导入AIDL 的后端AIDL 语言大致上基于 Java 语言。AIDL 文件不仅定义了接口本身,还会定义这个接口中用到的数据类型和常量。 软件包 每个 AIDL 文件都以一个可选软件包开头,该软件包与各个后端中的软件包名称相对应。软件包声明如下所示: package my.pac…...

经典算法 判断一个图中是否有环

判断一个图中是否有环 问题描述 给一个以0 0结尾的整数对列表&#xff0c;除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图中是否存在环。存在输出YES&#xff0c;不存在输出NO。 输入样例1 6 8 5 3 …...

Transformer-PyTorch实战项目——文本分类

Transformer-PyTorch实战项目——文本分类 ———————————————————————————————————————————— 【前言】 这篇文章将带领大家使用Hugging Face里的模型进行微调&#xff0c;并运用在我们自己的新项目——文本分类中。需要大家提前下…...

Linux-服务器负载评估方法

在 Linux 服务器中&#xff0c;top 命令显示的 load average&#xff08;平均负载&#xff09;反映了系统在特定时间段内的负载情况。它通常显示为三个数值&#xff0c;分别代表过去 1 分钟、5 分钟和 15 分钟的平均负载。 1. 什么是 Load Average&#xff1f; Load average …...

Transformer编程题目,结合RTX 3060显卡性能和市场主流技术

以下是10道针对4年经验开发者的Transformer编程题目&#xff0c;结合RTX 3060显卡性能和市场主流技术&#xff0c;每题包含模型选择和实现逻辑描述&#xff1a; 题目1&#xff1a;医疗报告结构化提取 模型选择&#xff1a;BioBERT-base 要求&#xff1a; 开发从PDF医疗报告中提…...

Web三漏洞学习(其二:sql注入)

靶场&#xff1a;NSSCTF 、云曦历年考核题 二、sql注入 NSSCTF 【SWPUCTF 2021 新生赛】easy_sql 这题虽然之前做过&#xff0c;但为了学习sql&#xff0c;整理一下就再写一次 打开以后是杰哥的界面 注意到html网页标题的名称是 “参数是wllm” 那就传参数值试一试 首先判…...

VLAN的知识

1.什么是VLAN&#xff1f; VLAN是虚拟局域网&#xff0c;逻辑隔离广播域和网络区域 是一种通过将局域网内的设备逻辑地划分为一个个网络的技术 2.对比逻辑网络分割和物理网络分割&#xff1f; 逻辑网络分割是VLAN&#xff0c;隔离广播域和网络区域 物理网络分割是路由&…...

RFID 赋能部队智能物联网仓储建设:打造信息化高效解决方案

在当今军事现代化进程的宏大背景下&#xff0c;部队后勤保障工作无疑占据着举足轻重的地位&#xff0c;而仓储管理作为其中的核心环节&#xff0c;更是至关重要。传统的仓储管理模式在面对当下物资种类繁杂、数量庞大的现状时&#xff0c;已显得力不从心&#xff0c;效率低下、…...

结构型屏蔽在高频电子设备中的应用与优化

在当今高度电子化的时代&#xff0c;随着电子产品工作频率不断提高&#xff0c;设备内部温度上升&#xff0c;电磁环境日趋复杂&#xff0c;电磁兼容&#xff08;EMC&#xff09;问题成为设计和制造过程中必须重点解决的问题。EMC不仅关系到设备自身的稳定运行&#xff0c;更涉…...

【教程】Ubuntu修改ulimit -l为unlimited

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 问题描述 解决方法一 解决方法二 解决方法三 (终极) 问题描述 查系统资源限制 ulimit -l如果返回的是 64 或其他较小值&#xff0c;那么RDM…...

【HDFS】BlockPlacementPolicyRackFaultTolerant#getMaxNode方法的功能及具体实例

方法参数说明: numOfChosen:已经选择的节点数numOfReplicas:还需要选择的副本数方法的返回值是一个长度为2的数组:[调整后的要选出多少个节点(不包括已经选择的), 每个机架最大能选择的节点数] @Overrideprotected int[] getMaxNodesPerRack(int numOfChosen, int numOfR…...

水污染治理(生物膜+机器学习)

文章目录 **1. 水质监测与污染预测****2. 植物-微生物群落优化****3. 系统设计与运行调控****4. 维护与风险预警****5. 社区参与与政策模拟****挑战与解决思路****未来趋势** 前言&#xff1a; 将机器学习&#xff08;ML&#xff09;等人工智能技术融入植树生物膜系统&#xff…...

数模小白变大神的日记2025.4.15日

分工 1.论文:mathtype (Latex) 2.建模&#xff1b;相应的建模知识与撰写方法&#xff0c;写摘要 3.编程:matlab、SPSs、(Python) 评价模型 1. 层次分析法 ①层次分析法是一种多目标、多准则的决策问题 ②层次分析法是一种主观加权法 ③层次分析法通过以下步骤实现: 1.构…...

STM32提高篇: 以太网通讯

STM32提高篇: 以太网通讯 一.以太网通讯介绍二.W5500芯片介绍1.W5500芯片特点2.W5500应用目标3.接入框图 三.驱动移植四.tcp通讯五.udp通讯六.http_server 一.以太网通讯介绍 以太网&#xff08;Ethernet&#xff09;是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以…...

4-15记录(冒泡排序,快速选择排序)

算法稳定 简单选择排序的实质就是最后一个和第一个比较&#xff0c;小&#xff0c;就换位置&#xff0c;然后继续用最后一个数字和第二个比较&#xff0c;以此类推。 但是算法不稳定&#xff0c;本来下划线的2在后面&#xff0c;但是经过算法后去了前面 快速排序 实现过程&am…...

Ubuntu系统18.04更新驱动解决方法

原始是&#xff1a;ubuntu18.04里面的驱动是470&#xff0c;对应cuda11.4 现在需要更新为525&#xff0c;对应cuda为12.0 实现&#xff1a; 1、打开终端 Ctrl Alt T2、使用 lspci 命令&#xff08;快速查看显卡型号&#xff09; lspci | grep -i vga3、终端输入 ubuntu-d…...

Rocky Linux 9.x 基于 kubeadm部署k8s

搭建集群使用docker下载K8s&#xff0c;使用一主两从模式 主机名IP地址k8s- master192.168.1.141k8s- node-1192.168.1.142k8s- node-2192.168.1.143 一&#xff1a;准备工作 VMware Workstation Pro新建三台虚拟机Rocky Linux 9&#xff08;系统推荐最小化安装&#xff09; …...

MATLAB程序实现了一个物流配送优化系统,主要功能是通过遗传算法结合四种不同的配送策略,优化快递订单的配送方案

%% 主函数部分 % function main()clear; clc; close all;% 生成或加载算例 filename = D:\快递优化\LogisticsInstance.mat; if ~exist(filename, file)instance = generate_instance();save(filename, -struct, instance); elseinstance = load(filename); end% 遗传算法参数配…...

利用宝塔面板搭建RustDesk服务

一、介绍 1.1官网 https://rustdesk.com/ 1.2github仓库 https://github.com/rustdesk/rustdesk 1.3特点 RustDesk 支持多种操作系统&#xff0c;包括 Windows、macOS、Linux、Android 和 iOS。它甚至提供网页版客户端&#xff0c;可以在浏览器中直接使用。 用户可以通过…...

前端与Java后端交互出现跨域问题的14种解决方案

跨域问题是前端与后端分离开发中的常见挑战&#xff0c;以下是14种完整的解决方案&#xff1a; 1 前端解决方案( 开发环境代理) 1.1 Webpack开发服务器代理 // vue.config.js 或 webpack.config.js module.exports {devServer: {proxy: {/api: {target: http://localhost:8…...

PBKDF2全面指南(SpringBoot实现版)

文章目录 第一部分:PBKDF2基础概念1. 什么是PBKDF2?2. 为什么需要PBKDF2?3. PBKDF2的工作原理4. PBKDF2与其他密码散列函数的比较第二部分:在Java和SpringBoot中使用PBKDF21. Java内置的PBKDF2支持2. SpringBoot中集成PBKDF22.1 添加依赖2.2 配置PBKDF2密码编码器2.3 自定义…...

基于RV1126开发板的rknn-toolkit-lite使用方法

1. rknn-toolkit-lite介绍 rknn-toolkit-lite是用于python算法的推理的组件&#xff0c;当前已经在EASY-EAI-Nano完成适配&#xff0c;用户可以用它进行深度学习算法的纯python开发。而且同时支持已经进行了预编译的模型&#xff0c;短短几行代码即可完成算法的推理&#xff0c…...

一款轻量级的PHP地址发布页面源码

源码介绍 一款轻量级的PHP链接发布页面源码&#xff0c;适合快速搭建个性化的链接导航网站&#xff0c;支持动态链接管理和多种风格模板切换 1&#xff1a;后台登录地址为/admin/login.php&#xff0c;提供便捷的配置入口。 2&#xff1a;默认用户名是admin&#xff0c;密码为…...

分布式计算领域的前沿工具:Ray、Kubeflow与Spark的对比与协同

在当今机器学习和大数据领域&#xff0c;分布式计算已成为解决大规模计算问题的关键技术。本文将深入探讨三种主流分布式计算框架——Ray、Kubeflow和Spark&#xff0c;分析它们各自的特点、应用场景以及如何结合它们的优势创建更强大的计算平台。 Spark批量清洗快&#xff0c;…...

【专题刷题】双指针(一)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;1&#xff0c;本人解法 本人屎山代码&#xff1b;2&#xff0c;优质解法 优质代码&#xff1b;3&#xff0c;精益求精&#xff0c;…...

火山引擎旗下防御有哪些

首先&#xff0c;我需要确认用户是不是打错了&#xff0c;比如把“引擎”当成了“云”&#xff0c;或者他们真的想了解火山引擎的防御机制。火山引擎是字节跳动旗下的云服务平台&#xff0c;类似于阿里云或腾讯云&#xff0c;所以用户可能想了解的是其安全防护措施。 接下来&am…...

python程序打包——nuitka使用

目前python打包成exe的工具主要有&#xff1a;PyInstaller Briefcase py2exe py2app Nuitka CX_Freeze等。 不同于C代码&#xff0c;可以直接编译成可执行的exe文件&#xff0c;或者js代码在浏览器中就能执行&#xff0c;python代码必须通过python解释器来运行&#xff0c…...

编写了一个专门供强化学习玩的贪吃蛇小游戏,可以作为后续学习的playgraound

文章目录 **试玩效果****项目背景****核心设计思路****代码亮点解析****与强化学习算法的对接示例****扩展方向****总结****完整代码**把训练一个会玩小游戏的智能体,作为学习强化学习的一个目标,真的是很有乐趣的一件事。我已经不知为此花费了多少日夜了。如今已是着魔了一般…...

chain_type=“stuff 是什么 ? 其他方式有什么?

chain_type="stuff 是什么 ? 其他方式有什么? 目录 chain_type="stuff 是什么 ? 其他方式有什么?1. `chain_type="stuff"`2. `chain_type="map_reduce"`3. `chain_type="refine"`4. `chain_type="map_rerank"`在 LangCh…...

在IDEA里面建立maven项目(便于java web使用)

具体步骤&#xff1a; 第一次有的电脑你再创建项目的时候右下角会提醒你弹窗&#xff1a;让你下载没有的东西 一定要下载&#xff01;&#xff01;可能会很慢 运行结果&#xff1a; 因为他是默认的8080端口所以在运行的时候输入的url如下图&#xff1a; 新建了一个controller代…...

MyBatis 详解

1. 什么是 MyBatis&#xff1f; MyBatis 是一款优秀的 持久层框架&#xff0c;它通过 XML 或注解配置&#xff0c;将 Java 对象&#xff08;POJO&#xff09;与数据库操作&#xff08;SQL&#xff09;进行灵活映射&#xff0c;简化了 JDBC 的复杂操作。 核心思想&#xff1a;S…...

郑州工程技术学院党委书记甘勇一行莅临埃文科技调研交流

为深化产教融合、推动人工智能领域人才培养与产业需求精准对接&#xff0c;2025年4月9日下午&#xff0c;郑州工程技术学院党委书记甘勇、河南省人工智能产业创新发展联盟执行秘书长孟松涛等一行莅临埃文科技调研交流。 一、聚焦技术前沿 共话AI产业变革 座谈会上&#xff0c;…...

AI应用开发之扣子第一课-夸夸机器人

首先&#xff0c;进入官网&#xff1a;点击跳转至扣子。 1.创建智能体 登录进网站后&#xff0c;点击左上角&#xff0b;图标&#xff0c;创建智能体&#xff0c;输入智能体名称、功能介绍 2.输入智能体提示词 在“人设与回复逻辑”输入以下内容&#xff1a; # 角色 你是一…...

Node.js 数据库 CRUD 项目示例

希望使用Nodejs操作数据库做CRUD&#xff0c;用deepseek实战搜索“使用Nodejs对数据库表做CRUD的项目例子”&#xff0c;找到了解决方案&#xff0c;如下图所示&#xff1a; 项目结构 nodejs-crud-example/ ├── config/ │ └── db.js # 数据库连接配置 ├──…...

ESP8266/32作为AVR编程器(ISP programmer)的使用介绍

ESP8266作为AVR编程器( ISP programmer)的使用介绍 &#x1f33f;ESP8266自带库例程&#xff1a;https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP&#x1f4cd;支持ESP8266/32的ESP_AVRISP其它开源工程&#xff08;个人没有再去验证&#xff09;&…...

union all几个常见问题及其解决方案

UNION ALL 是 SQL 中用于合并两个或多个 SELECT 语句结果集的操作符。与 UNION 不同&#xff0c;UNION ALL 不会去除重复的记录&#xff0c;它简单地将一个查询的结果附加到另一个查询的结果之后。尽管 UNION ALL 相对来说更高效&#xff08;因为它不需要检查重复项&#xff09…...

21.C++11

1.列表初始化 1.1C11中的{} •C11以后想统⼀初始化⽅式&#xff0c;试图实现⼀切对象皆可⽤{}初始化&#xff0c;{}初始化也叫做列表初始化。 • 内置类型⽀持&#xff0c;⾃定义类型也⽀持&#xff0c;⾃定义类型本质是类型转换&#xff0c;中间会产⽣临时对象&#xff0c;最…...

【交叉编译】目标机编译安装对应依赖库总结

1、解压目标机交叉编译工具链 # 创建工具链存放目录&#xff08;可选&#xff09; sudo mkdir -p /opt/toolchain# 解压到目标路径&#xff08;示例路径&#xff1a;/opt/toolchain&#xff09; sudo tar -xzvf 目标主机编译工具链.tar.gz -C /opt/toolchain# 查看解压后的目录…...

Docker华为云创建私人镜像仓库

Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 &#xff1a; 或者在其他页面的搜索栏中搜索 容器镜像服务 &#xff1a; 进入到页面后&#xff0c;点击 创建组织 &#xff08;华为云的镜像仓库称为组织&#xff09;&#xff1a; 设置组织名字后&…...

【15】数据结构之基于树的查找算法篇章

目录标题 二叉排序树 Binary Sort Tree二叉排序树的插入二叉树排序树的删除二叉排序树的查找二叉排序树的调试与代码集合 平衡二叉树-AV树平衡二叉树的平衡化旋转平衡二叉树的代码调试与代码集合 B树&#xff22;树的查找B树的插入B树和B*树 二叉排序树 Binary Sort Tree 二叉…...

自定义类型之结构体

1.结构体类型概述 结构体类型是一种用户自定义的数据类型&#xff0c;用于将不同类型的数据组合成一个整体。在C语言中&#xff0c;结构体使用struct关键字定义&#xff0c;由一系列具有相同类型或不同类型的数据构成的数据集合&#xff0c;也称为结构。结构体中的数据在逻辑上…...

SGFormer:卫星-地面融合 3D 语义场景补全

论文介绍 题目&#xff1a;SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议&#xff1a;IEEE / CVF Computer Vision and Pattern Recognition Conference 论文&#xff1a;https://www.arxiv.org/abs/2503.16825 代码&#xff1a;https://githu…...

应急响应篇钓鱼攻击邮件与文件EML还原蠕虫分析线索定性处置封锁

钓鱼邮件的eml中会有 邮件服务器地址域名&#xff08;发信人&#xff09;发送的本地IP和主机名发送的内容以及附件 邮件钓鱼&#xff1a; 攻击者目的&#xff1a;通过发信人&#xff0c;附件&#xff0c;取得突破 定性钓鱼邮件 威胁情报&#xff0c;人工分析来源&#xff0c…...

利用纯JS开发浏览器小窗口移动广告小功能

效果展示 直接上代码 如果要用到vue项目里面&#xff0c;直接按照vue的写法改动就行&#xff0c;一般没有多大的问题&#xff0c;顶部的占位是我项目需求&#xff0c;你可以按照要求改动。 <!DOCTYPE html> <html> <head><meta charset"utf-8"…...

java Stream流

Stream流 双列集合无法直接使用stream流&#xff0c;可以通过keyset&#xff08;&#xff09;或enteyset转换为单列集合&#xff0c;再进行操作 1.单列集合 package mystream;import java.util.ArrayList; import java.util.Collections;public class StreamDemo1 {public sta…...

【实战中提升自己】 防火墙篇之VPX部署–L2TP over IPSEC

1 VPx部署【L2TP Over ipsec】 说明&#xff1a;在VPX上面&#xff0c;我们希望与分部建立VPX&#xff0c;保证与分部的财务部正常通信&#xff0c;另外还提供L2TP Over ISPEC功能&#xff0c;方便远程接入访问内部服务器等。当然我们也可以做详细的控制&#xff…...