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

【sgSpliter】自定义组件:可调整宽度、高度、折叠的分割线

特性:

  1. 允许设置显示折叠按钮
  2. 允许设置折叠线按钮位置
  3. 允许设置当拖拽区域到0,再点击箭头展开的默认宽度
  4. 允许设置当拖拽宽度小于此宽度,自动折叠到0
  5. 允许设置指定最小宽度
  6. 允许设置指定最大宽度
  7. 允许设置按钮风格:白色背景default、蓝色背景blue
  8. 允许设置分隔条大小,默认 2px
  9. 允许设置指定 是否可调整大小,会影响相邻
  10. 允许设置外部触发显示折叠按钮
  11. 允许设置禁止双击折叠线

sgSpliter.vue 

<template><!-- 注意:父组件position必须是relative、absolute或fixed,不建议直接在绑定:data后面用"{属性}",建议单独在script中声明data,避免拖拽过程重复调用 --><div:class="$options.name":placement="placement"@mousedown="__addWindowEvents"@dblclick="dblclickSpliterLine":unresizable="!resizable":mouseoverShowArrowBtn="mouseoverShowArrowBtn"><divv-if="showArrowBtn"class="arrow-btn"@click="clickArrowBtn"@mousedown.stop:styleType="arrowBtnStyleType":collapse="collapse"><!-- 箭头在父组件的最左侧 --><template v-if="placement === `left`"><i class="el-icon-arrow-left" v-if="collapse" /><i class="el-icon-arrow-right" v-else /></template><!-- 箭头在父组件的最右侧 --><template v-if="placement === `right`"><i class="el-icon-arrow-right" v-if="collapse" /><i class="el-icon-arrow-left" v-else /></template><!-- 箭头在父组件的最上侧 --><template v-if="placement === `top`"><i class="el-icon-arrow-up" v-if="collapse" /><i class="el-icon-arrow-down" v-else /></template><!-- 箭头在父组件的最下侧 --><template v-if="placement === `bottom`"><i class="el-icon-arrow-down" v-if="collapse" /><i class="el-icon-arrow-up" v-else /></template></div></div>
</template>
<script>
export default {name: "sgSpliter",components: {},data() {return {form: {},collapse: false,showArrowBtn: true,//显示折叠按钮placement: `right`,//折叠线按钮位置parent: null,defaultSize: 200, //当拖拽区域到0,再点击箭头展开的默认宽度nearEdgeSize: 5, //当拖拽宽度小于此宽度,自动折叠到0minSize: null, //可选,指定 最小宽度maxSize: null, //可选,指定 最大宽度size: null,size_bk: null,arrowBtnStyleType: `default`, //按钮风格:白色背景default、蓝色背景bluesplitBarSize: 1, //可选,分隔条大小,默认 2pxresizable: true, //可选,指定 是否可调整大小,会影响相邻mouseoverShowArrowBtn: false, //外部触发显示折叠按钮disabledDblclickSpliterLine: false, //禁止双击折叠线};},props: ["data"],computed: {},watch: {data: {handler(newValue, oldValue) {// console.log(`深度监听${this.$options.name}:`, newValue, oldValue);if (Object.keys(newValue || {}).length) {this.form = JSON.parse(JSON.stringify(newValue));this.$g.convertForm2ComponentParam(`showArrowBtn`, this);this.$g.convertForm2ComponentParam(`defaultSize`, this);this.$g.convertForm2ComponentParam(`nearEdgeSize`, this);this.$g.convertForm2ComponentParam(`minSize`, this);this.$g.convertForm2ComponentParam(`maxSize`, this);this.$g.convertForm2ComponentParam(`placement`, this);this.$g.convertForm2ComponentParam(`parent`, this);this.$g.convertForm2ComponentParam(`arrowBtnStyleType`, this);this.$g.convertForm2ComponentParam(`splitBarSize`, this);this.$g.convertForm2ComponentParam(`resizable`, this);this.$g.convertForm2ComponentParam(`mouseoverShowArrowBtn`, this);this.$g.convertForm2ComponentParam(`disabledDblclickSpliterLine`, this);this.form.hasOwnProperty("collapse") &&this.collapseSpliter({ collapse: this.form.collapse }); //允许外部控制默认折叠或展开this.$nextTick(() => {this.$el.style.setProperty(`--splitBarSize`, `${this.splitBarSize}px`); //js往css传递局部参数});// 不要在这里初始化size_bk,由于拖拽过程会重复触发这里的代码执行}},deep: true, //深度监听immediate: true, //立即执行},size(size) {size <= this.nearEdgeSize && (size = 0);this.collapse = size === 0;this.$emit(`sizeChange`, { size });},collapse(collapse) {this.$emit(`collapseChange`, { collapse });},},mounted() {this.$nextTick(() => {this.parent || (this.parent = this.$el.parentNode);if (this.parent) {let rect = this.parent.getBoundingClientRect();switch (this.placement) {case `left`: // 竖线在父组件的最左侧case `right`: // 竖线在父组件的最右侧this.size_bk = rect.width;break;case `top`: // 竖线在父组件的最上侧case `bottom`: // 竖线在父组件的最下侧this.size_bk = rect.height;break;default:}}});},beforeDestroy() {this.__removeWindowEvents();},methods: {//size发生变化的时候就做缓动效果changeTransitionSize() {let parent = this.parent;if (parent) {let attr = `${this.$options.name}-transitionSize`;parent.setAttribute(attr, true);setTimeout(() => parent.removeAttribute(attr), 200);}},clickArrowBtn($event) {this.collapseSpliter();},dblclickSpliterLine($event) {if (this.disabledDblclickSpliterLine || !this.resizable) return;this.collapseSpliter();},collapseSpliter({ collapse } = {}) {this.collapse = collapse === undefined ? !this.collapse : collapse;let expandSize = this.size_bk > this.nearEdgeSize ? this.size_bk : this.defaultSize;this.changeTransitionSize();this.size = this.collapse ? 0 : expandSize;this.$emit(`sizeChange`, { size: this.size }); //避免上一次size=0的时候,第二次不监听变化},bkSize(d) {this.size_bk = this.size;},__addWindowEvents() {this.__removeWindowEvents();addEventListener("mousemove", this.mousemove_window);addEventListener("mouseup", this.mouseup_window);},__removeWindowEvents() {removeEventListener("mousemove", this.mousemove_window);removeEventListener("mouseup", this.mouseup_window);},mousemove_window($event) {if (!this.resizable) return;this.parent || (this.parent = this.$el.parentNode);if (this.parent) {let { x, y } = $event,rect = this.parent.getBoundingClientRect(),size;switch (this.placement) {case `left`: // 竖线在父组件的最左侧size = rect.x + rect.width - x;break;case `right`: // 竖线在父组件的最右侧size = x - rect.x;break;case `top`: // 竖线在父组件的最上侧size = rect.y + rect.height - y;break;case `bottom`: // 竖线在父组件的最下侧size = y - rect.y;break;default:}this.minSize && size < this.minSize && (size = this.minSize);this.maxSize && size > this.maxSize && (size = this.maxSize);this.size = size;this.bkSize();} else {this.$message.error(`没有获取到父组件parent!`);}},mouseup_window($event) {this.__removeWindowEvents();},},
};
</script>
<style lang="scss" scoped>
$splitBarSize: var(--splitBarSize); //css获取js传递的参数
.sgSpliter {z-index: 1;background-color: #efefef;position: absolute;left: 0;top: 0;right: 0;bottom: 0;.arrow-btn {transition: 0.382s;opacity: 0;pointer-events: none;// transform: translateY(50%); //防止托盘最小高度的时候还冒出一小截width: 20px;height: 20px;display: flex;justify-content: center;align-items: center;color: #409eff;background-color: white;font-size: 12px;position: absolute;margin: auto;box-sizing: border-box;cursor: pointer;&:hover {filter: brightness(1.1);}&[styleType="blue"] {color: white;background-color: #4f6bdf;}&[collapse] {opacity: 1;pointer-events: auto;}}// 位置----------------------------------------&[placement="left"],&[placement="right"] {cursor: col-resize;width: $splitBarSize;height: 100%;}&[placement="top"],&[placement="bottom"] {cursor: row-resize;width: 100%;height: $splitBarSize;}&[placement="left"] {left: 0;right: revert;.arrow-btn {left: revert;right: $splitBarSize;top: 0;bottom: 0;border-radius: 8px 0 0 8px;padding: 20px 0;box-shadow: -5px 0px 10px 0 rgba(0, 0, 0, 0.1);}}&[placement="right"] {left: revert;right: 0;.arrow-btn {left: $splitBarSize;right: revert;top: 0;bottom: 0;border-radius: 0 8px 8px 0;padding: 20px 0;box-shadow: 5px 0px 10px 0 rgba(0, 0, 0, 0.1);}}&[placement="top"] {top: 0;bottom: revert;.arrow-btn {left: 0;right: 0;top: revert;bottom: $splitBarSize;border-radius: 8px 8px 0 0;padding: 0 20px;box-shadow: 0px -5px 10px 0 rgba(0, 0, 0, 0.1);}}&[placement="bottom"] {top: revert;bottom: 0;.arrow-btn {left: 0;right: 0;top: $splitBarSize;bottom: revert;border-radius: 0 0 8px 8px;padding: 0 20px;box-shadow: 0px 5px 10px 0 rgba(0, 0, 0, 0.1);}}// ----------------------------------------&[mouseoverShowArrowBtn],&:hover {background-color: #b3d8ff;.arrow-btn {opacity: 1;pointer-events: auto;}}// 按下拖拽线条后出现的半透明区域&::after {content: "";transition: 0.382s;position: absolute;background-color: #409eff22;opacity: 0;}$splitOpacityBgExpandSize: 5px; //半透明延伸宽度$splitOpacityBgSize: calc(#{$splitOpacityBgExpandSize} * 2 + #{$splitBarSize});&[placement="left"],&[placement="right"] {&::after {width: $splitOpacityBgSize;height: 100%;left: -#{$splitOpacityBgExpandSize};top: 0;}}&[placement="top"],&[placement="bottom"] {&::after {width: 100%;height: $splitOpacityBgSize;left: 0;top: -#{$splitOpacityBgExpandSize};}}&:active {opacity: 1;background-color: #409eff;&::after {opacity: 1;}}// 禁止拖拽&[unresizable] {cursor: default;background-color: transparent;&::after {content: none;}}
}
</style><style lang="scss">
[sgSpliter-transitionSize] {transition: 0.2s;
}
</style>

demo

<template><div :class="$options.name"><div class="left" :style="{ width: `${leftWidth}px` }"><sgSpliter :data="{ placement: `right` }" @sizeChange="leftWidth = $event.size" /></div><div class="right"><div class="top" :style="{ height: `${topHeight}px` }"><sgSpliter:data="{ placement: `bottom` }"@sizeChange="topHeight = $event.size"/></div><div class="bottom"><div class="left"><div class="top"></div><div class="bottom" :style="{ height: `${bottomHeight}px` }"><sgSpliter:data="{ placement: `top` }"@sizeChange="bottomHeight = $event.size"/></div></div><div class="right" :style="{ width: `${bottomWidth}px` }"><sgSpliter:data="{ placement: `left` }"@sizeChange="bottomWidth = $event.size"/></div></div></div></div>
</template>
<script>
import sgSpliter from "@/vue/components/admin/sgSpliter";
export default {name: `demoSpliter`,components: { sgSpliter },data() {return {leftWidth: 200,topHeight: 200,bottomHeight: 200,bottomWidth: 200,};},
};
</script>
<style lang="scss" scoped>
.demoSpliter {display: flex;& > .left {height: 100%;flex-shrink: 0;position: relative;box-sizing: border-box;border-right: 1px solid #eee;}& > .right {flex-grow: 1;display: flex;flex-direction: column;& > .top {flex-shrink: 0;width: 100%;position: relative;box-sizing: border-box;border-bottom: 1px solid #eee;}& > .bottom {flex-grow: 1;width: 100%;display: flex;& > .left {flex-grow: 1;height: 100%;display: flex;flex-direction: column;& > .top {flex-grow: 1;width: 100%;}& > .bottom {flex-shrink: 0;width: 100%;position: relative;box-sizing: border-box;border-top: 1px solid #eee;}}& > .right {flex-shrink: 0;height: 100%;position: relative;box-sizing: border-box;border-left: 1px solid #eee;}}}
}
</style>

相关文章:

【sgSpliter】自定义组件:可调整宽度、高度、折叠的分割线

特性&#xff1a; 允许设置显示折叠按钮允许设置折叠线按钮位置允许设置当拖拽区域到0&#xff0c;再点击箭头展开的默认宽度允许设置当拖拽宽度小于此宽度&#xff0c;自动折叠到0允许设置指定最小宽度允许设置指定最大宽度允许设置按钮风格:白色背景default、蓝色背景blue允许…...

图像预处理-插值方法

一.插值方法 当我们对图像进行缩放或旋转等操作时&#xff0c;需要在新的像素位置上计算出对应的像素值。 而插值算法的作用就是根据已知的像素值来推测未知位置的像素值。 1.1 最近邻插值 CV2.INTER_NEAREST 其为 warpAffine() 函数的参数 flags 的其一&#xff0c;表示最近…...

Adruino:传感器及步进电机

一、传感器 1、温湿度传感器 DHT11它采用专用的数字采集技术和温湿度传感器技术&#xff0c;包括一个电阻式感湿元件和NTC测温元件&#xff0c;并与一个高性能的8位单片机连接。 (1).引脚介绍 名称解释VCC供电引脚3&#xff5e;5VGND接地引脚DATA串行数据单总线 二、电机 1…...

leetcode 2787. Ways to Express an Integer as Sum of Powers

题目描述 这道题是0-1背包问题。可以理解为&#xff0c;有一个最大容量是n的背包&#xff0c;有n个物品&#xff0c;第i个物品的重量是i^x&#xff0c;问装满背包有多少种装法。题目要求必须是互不相同的数的x次幂的和等于n&#xff0c;那就表示每个数只能用一次&#xff0c;也…...

React 获得dom节点和组件通信

通过REF 实例对象的.current属性获得绑定的DOM节点 组件通信 组件通信 1 父传子 父组件传递数据 子组件接受数据 通过pros对象接受 子组件的形参列表props只读 props中数据不可修改 特殊情况 在子传父的过程中没有直接给子组件添加属性&#xff0c;而是向父组件中添加其他…...

AF3 ProteinDataset类的get_anchor_ind方法解读

AlphaFold3 protein_dataset 模块 ProteinDataset 类 get_anchor_ind 方法是一个 @staticmethod 静态方法,用来获取“锚定残基(anchor residues)”的索引,目的是在蛋白质序列中被遮蔽(masked)的区域两端找到“已知(known)”的残基,以便后续作为上下文参考。 源代码:…...

JavaScript异常机制与严格模式

目录 JavaScript 异常机制 1. 基本语法&#xff1a;try...catch...finally 2. 抛出异常&#xff1a;throw 3. 错误对象属性 4. 同步代码的异常处理 5. 异步代码的异常处理 5.1 回调函数 5.2 Promise 5.3 全局未捕获的 Promise 错误 6. 全局错误处理 7. 自定义错误与…...

【数据结构与算法】包装类初识泛型

文章目录 一.包装类1.1基本数据类型和对应的包装类1.2装箱和拆箱1.3自动拆箱和自动装箱【面试题】 二.什么是泛型三.引出泛型3.1 语法 四. 泛型的使用4.1 语法格式4.2 示例4.3 类型推导(Type Inference) 五. 裸类型(Raw Type) &#xff08;了解即可&#xff09;5.1 说明 六. 泛…...

Linux--进程信号

目录 1. 信号快速认识 1-1 ⽣活⻆度的信号 1-2 技术应⽤⻆度的信号 1-2-1 ⼀个样例 1-2-2 ⼀个系统函数 1-3 信号概念 1-3-1 查看信号​编辑 1-3-2 信号处理 2. 产⽣信号 2-1 通过终端按键产⽣信号 2-1-1 基本操作 2-2 调⽤系统命令向进程发信号 2-3 使⽤函数产⽣…...

Skynet入门(二)

常用接口说明 接口说明newservice(name, …)启动一个name的新服务&#xff0c;并返回新服务的地址start(func)用func初始换服务。编写服务时&#xff0c;都会写一句skynet.start&#xff0c;并在func写一些初始化代码dispatch(type, func为type类型的消息设定处理函数funcsend…...

TDengine 可靠性保障:数据持久化与容灾备份(二)

四、容灾备份策略揭秘 &#xff08;一&#xff09;主从复制与故障转移 在 TDengine 的高可用性架构中&#xff0c;主从复制是一种极为关键的设计模式&#xff0c;它就像是数据的 “安全复制机”&#xff0c;将数据从主节点精准无误地复制到多个从节点 。在这个过程中&#xf…...

一文讲透大模型强化学习基础:PPO、DPO、GRPO

DeepSeek-R1 的强化学习方案中&#xff0c;其亮点之一在于通过 GRPO 算法取代RLHF 常用的 PPO&#xff0c;通过尽可能减少人类标注数据&#xff0c;设计纯 RL 的环境&#xff0c;用精心设计的奖励机制来训练模型自己学会推理。 那么什么是PPO、GRPO&#xff0c;其产生的背景、…...

第十六届蓝桥杯大赛软件赛省赛 Python 大学 B 组 部分题解

题面链接Htlang/2025lqb_python_b 个人觉得今年这套题整体比往年要简单许多&#xff0c;但是G题想简单了出大问题&#xff0c;预估50101015120860&#xff0c;道阻且长&#xff0c;再接再厉 A: 攻击次数 答案&#xff1a;103&#xff1f;181&#xff1f;题目没说明白每回合是…...

5分钟搭建一个在线客服网站!免费!

快速搭建在线客服网站完整教程 本文将手把手教你如何从零开始搭建一个功能完善的在线客服系统&#xff0c;整个过程简单快速&#xff0c;适合新手操作。 一、服务器选购指南 注册雨云账号 如果您尚未注册雨云账号&#xff0c;可以通过以下方式获取优惠&#xff1a; 注册链…...

【测试】-- 测试用例

文章目录 1. 测试用例1.1 概念 2. 设计测试用例的万能公式2.1 常规思考逆向思维发散性思维2.2 万能公式 3. 设计测试用例的方法3.1 具体的设计⽅法3.1.1 等价类3.1.2 边界值3.1.3 正交法3.1.3.1 如何设计正交表 3.1.4 判定表法3.1.4.1 根据判定表法设计测用例的步骤 3.1.5 场景…...

深度剖析循环码解码:从原理到纠错实践

一、引言 循环码作为线性分组码中的重要一员,凭借其出色的纠错和检测能力,在通信领域得到了广泛应用。本文将深入探讨循环码的解码过程,详细阐述其纠错和检测的机理。 二、循环码基础回顾 2.1 循环码的定义与性质 循环码是一类具有循环特性的线性分组码,即任一码组循环…...

MySQL面试题及答案,2025最新整理

文章目录 前言1.InnoDB 与 MyISAM 在事务和索引方面有哪些主要区别&#xff1f;2.简述 MySQL 的事务隔离级别及其对并发问题的解决情况&#xff1f;3.在使用 MySQL 索引时&#xff0c;如何避免索引失效&#xff0c;提高查询效率&#xff1f; 前言 本文围绕 MySQL面试题及答案&…...

ubuntu 安装pyllama教程

最近在研究motion gpt&#xff0c;有一个环节是需要下载gpt 13b&#xff0c;然后老是安装不上去pyllama&#xff0c;ubuntu的版本为&#xff1a; $ lsb_release -a LSB Version: core-11.1.0ubuntu4-noarch:security-11.1.0ubuntu4-noarch Distributor ID: Ubuntu Description…...

Python operator 模块介绍

operator 模块是 Python 标准库中的一个模块,它提供了一系列与 Python 内置运算符对应的函数。这些函数可以用于替代一些常见的运算符操作,在某些场景下能让代码更加简洁、高效,还能方便地用于函数式编程。以下是对 operator 模块的详细介绍: 1. 导入模块 使用 operator …...

[python] reduce

reduce 是 Python 中的一个高阶函数&#xff0c;用于对可迭代对象&#xff08;如列表、元组等&#xff09;中的元素进行累积计算&#xff0c;最终返回一个单一的结果。它位于 functools 模块中&#xff0c;使用时需要先导入&#xff1a; from functools import reduce 核心功能…...

ESP32与STM32哪种更适合初学者?

目录 1、ESP32&#xff1a;物联网时代的“网红” 2、STM32&#xff1a;工业界的“常青树” 3、到底谁更容易&#xff1f; 无论是刚入坑的小白&#xff0c;还是想扩展技术栈的老鸟&#xff0c;在选择主力 MCU 时&#xff0c;学习曲线绝对是重要的考量因素。ESP32 以其强大的 …...

AI编程案例拆解|基于机器学习XX评分系统-前端篇

文章目录 1. 定价使用DeepSeek估价小红书调研 2. 确定工作事项利用DeepSeek生成具体工作事项 3. 和客户沟通约会议沟通确定内容样式 4. 前端部分设计使用DeepSeek生成UI设计在Cursor中生成并提问前置条件开始编程 关注不迷路&#xff0c;励志拆解100个AI编程、AI智能体的落地应…...

十六届蓝桥杯嵌入式省赛直播基本外设驱动

前言 本文是准备2025年4月123日嵌入式蓝桥杯直播内容准备的一篇文章 1.创建工程 选择芯片 开启烧录引脚 开启高速时钟 主频设置成80回车 工程名称&#xff08;不能有中文&#xff0c;包括路径&#xff09; 考试的时候最下面哪一行取消勾选USE 然后选择这个文件夹打开 勾选几个…...

c_c++八股(一)

C/C static 静态局部变量&#xff08;函数内&#xff09; 使局部变量的生命周期延长至整个程序运行期间&#xff0c;但作用域仍限于函数内 变量只初始化一次&#xff0c;下次调用函数时保留上次的值 void counter() {static int count 0; // 只初始化一次count;printf(&quo…...

通过websocket给服务端发送订单催单提醒消息

controller层 GetMapping("/reminder/{id}")public Result Remainder(PathVariable("id") Long id){orderService.remainder(id);return Result.success();} 实现类 Overridepublic void remainder(Long id) {Orders ordersDB orderMapper.getById(id);…...

【NumPy科学计算引擎:从基础操作到高性能实践】

目录 前言&#xff1a;技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析关键技术模块说明技术选型对比 二、实战演示环境配置核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、最佳实践推荐方案 ✅常见错误 ❌调试技巧 五、应用…...

day24 学习笔记

文章目录 前言一、OpenCV简介二、计算机中的图像表达1.图像表示2.图像存储 三、基本图像操作1.创建窗口2.读取图像3.显示图像4.保存图像5.创建黑白图像6.图像切片7.图像大小调整 四、读取视频 前言 目前&#xff0c;我开始学习OpenCV的相关概念和操作。通过今天的学习&#xf…...

OFDM CP 对解码影响

OFDM符号间会存在ISI&#xff0c;为了解决该问题在符号间插入了循环前缀&#xff0c;可以说这个发明是OFDM能够实用的关键&#xff0c;在多径信道中CP可以有效的解决符号间干扰。3GPP中对于不同SCS 定义了不同的CP长度&#xff1a; 5G Cyclic Prefix (CP) Design -5G Physical …...

Compose笔记(十六)--ExoPlayer

这一节了解一下Compose中的ExoPlayer的使用&#xff0c;我们在开发Android应用时&#xff0c;经常会使用到播放器这个ExoPlayer框架就相对成熟&#xff0c;易上手&#xff0c;现简单总结如下: 1. ExoPlayer 核心类 ExoPlayer 是 ExoPlayer库的核心类&#xff0c;负责管…...

拖拽实现3

import React, { useState, useRef, useEffect } from ‘react’; import ‘./ImageList.css’; const ImageList () > { const images [ ‘https://picsum.photos/300/200?random1’, ‘https://picsum.photos/300/200?random2’, ‘https://picsum.photos/300/200?r…...

OracleLinuxR5U5系统重启后启动数据库oracle23ai

1、切换到oracle用户 [rootOracleLinux-R9-U5 ~]# su oracle2、查看oracle是否配置了ORACLE_SID [oracleOracleLinux-R9-U5 root]$ cd ~ [oracleOracleLinux-R9-U5 ~]$ cat .bash_profile3、输出内容如下&#xff1a; [oracleOracleLinux-R9-U5 ~]$ cat .bash_profile # .ba…...

`offset_mapping` 是什么

offset_mapping 是什么 offset_mapping是 transformers 库中分词器&#xff08;tokenizer&#xff09;在进行分词操作时返回的一个重要信息&#xff0c;它用于建立原始文本中的字符位置和分词后标记&#xff08;tokens&#xff09;之间的映射关系。借助 offset_mapping&#x…...

数据结构(1)

算法代码如下&#xff1a; #include <iostream> typedef int DataType; void Reverse(DataType a[], int n, DataType b[] ){for(int i 0; i < n; i) {b[i] a[n - 1 - i];} } int main() {const int n 5; DataType a[n] {1, 2, 3, 4, 5}; DataType b[n]; Reverse…...

Linux 第三讲 --- 基础指令(三)

前言&#xff1a; 在前面我们已经讲了有十几个Linux的基础指令&#xff0c;今天我们再补充几个常用的基础指令&#xff0c;为后面的学习做准备 。 目录 前言&#xff1a; 一、两个与时间相关的指令 1.date指令 演示 &#xff1a; 时间戳 设置时间 2、cal指令 演示&#x…...

HotSpot虚拟机中对象的访问定位机制是怎样的?

HotSpot虚拟机中对象的访问定位机制 在HotSpot虚拟机中&#xff0c;对象的访问定位主要通过 直接指针&#xff08;Direct Pointer&#xff09; 实现。这种方式以性能优化为核心&#xff0c;结合内存布局和运行时机制&#xff0c;确保高效的对象数据访问。以下是详细分析&#…...

pjsip 呼叫自定义头协议(pjsua)

我们想和远端设备进行信令交互的时候可以进行自定头部协议带上数据,进行解析处理一些特殊功能,这样可以减少我们再用其他信令交互才能处理一些特殊功能。 1.1 SIP消息结构SIP消息由以下几部分组成: 起始行(Start-Line) 头部字段(Header Fields) 空行(CRLF) 消息体(Me…...

黑马点评redis改 part 2

02.商户查询缓存 比如说那么这是因为这种数据读写的能力远远的低于预算能力&#xff0c;所以说计算机性能受到了一个限制。所以为了解决这个问题&#xff0c;人们就在CPU的内部添加了一个缓存&#xff0c;什么意思&#xff1f;就是CPU会把经常需要读写的一些数据放到CPU的缓存…...

C语言复习笔记--指针(5)

在之前的复习中我们已经简单的了解了qsort函数的使用方式,下面我们接着上回的继续复习,来看看qsort函数的模拟实现. qsort函数的模拟实现 这里因为我们刚刚学习了冒泡排序,所以就先用冒泡排序来改装一下qsort函数,让冒泡排序也可以排各种各样类型的元素. #define _CRT_SECURE_…...

设计模式——工厂模式学习总结

假设现在一个场景&#xff1a; 某物流公司&#xff0c;当前有以下业务&#xff1a;汽车运输和轮船运输。客户可以选择任一运输方式进行运输。 此时&#xff0c;应该如何使用代码将这个现实业务进行抽象实现&#xff1f; 在没有学习工厂模式前&#xff0c;我是这样想的&#x…...

《Python星球日记》第27天:Seaborn 可视化

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏&#xff1a;《Python星球日记》&#xff0c;限时特价订阅中ing 目录 一、Seabor…...

获取1688商品评论接口的实践指南

在电商领域&#xff0c;商品评论是消费者了解产品真实情况的重要依据&#xff0c;对于商家来说&#xff0c;分析商品评论可以帮助他们改进产品、优化服务。1688作为国内知名的B2B电商平台&#xff0c;提供了丰富的商品评论接口&#xff0c;方便开发者获取商品的评论数据。本文将…...

c++中继承方面的知识点

继承的概念及定义 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的层次结…...

青少年编程考试 CCF GESP图形化编程 一级认证真题 2025年3月

图形化编程 一级 2025 年 03 月 一、单选题&#xff08;共 10 题&#xff0c;每题 3 分&#xff0c;共 30 分&#xff09; 1、2025 年春节有两件轰动全球的事件&#xff0c;一个是 DeepSeek 横空出世&#xff0c;另一个是贺岁片《哪吒 2》票房惊人&#xff0c;入了全球票房榜。…...

Openlayers:flat样式介绍

在前段时间我在使用WebGL矢量图层时接触到了flat样式&#xff0c;我对其十分的感兴趣&#xff0c;于是我花了几天的时间对其进行了了解&#xff0c;在这篇文章中我将简单的介绍一下flat样式的使用方式以及我对其的一些理解。 一、了解flat样式 1.什么是flat样式&#xff1f; …...

[特殊字符] 第十三讲 | 地统计模拟与空间不确定性评估

&#x1f4d8; 专栏&#xff1a;科研统计方法实战分享 | 地学/农学人的数据分析工具箱 ✍️ 作者&#xff1a;平常心0715 &#x1f3af; 关键词&#xff1a;地统计模拟、随机函数、空间不确定性、条件模拟、SGS、R语言 &#x1f9e0; 核心导语 在现实数据有限、空间异质性强的…...

Vue接口平台学习六——接口列表及部分调试页面

一、实现效果图及界面布局简单梳理 整体布局分左右&#xff0c;左边调试&#xff0c;右边显示接口列表 左侧&#xff1a; 一个输入框按钮&#xff1b;下面展示信息&#xff0c;大部分使用代码编辑器就好了&#xff0c;除了请求体传文件类型需要额外处理。然后再下方显示响应信…...

Spring 中的 @Cacheable 缓存注解

1 什么是缓存 第一个问题&#xff0c;首先要搞明白什么是缓存&#xff0c;缓存的意义是什么。 对于普通业务&#xff0c;如果要查询一个数据&#xff0c;一般直接select数据库进行查找。但是在高流量的情况下&#xff0c;直接查找数据库就会成为性能的瓶颈。因为数据库查找的…...

Context的全面解析:在不同技术应用中的通用作用与差异

Context的全面解析&#xff1a;在不同技术应用中的通用作用与差异 引言&#xff1a; 在软件开发中&#xff0c;“Context”这个概念被广泛使用。它不仅限于某个特定的技术或编程语言&#xff0c;实际上&#xff0c;Context 作为一种抽象的设计模式&#xff0c;贯穿在许多开发领…...

机器学习(2)——逻辑回归

文章目录 1. 什么是逻辑回归?2. 核心思想3. 逻辑回归模型的训练&#xff1a;4. 参数估计&#xff08;损失函数与优化&#xff09;4.1. **损失函数&#xff1a;**4.2. 极大似然估计&#xff08;MLE&#xff09;4.3. 优化方法 5. 决策边界6. 模型评估指标7 . 假设与适用条件8. 逻…...

Sentinel核心算法解析の滑动窗口算法

文章目录 前言一、回顾&#xff1a;快速失败二、固定窗口算法三、滑动窗口算法三、源码体现3.1、ArrayMetric的初始化3.2、addPass3.2.1、currentWindow3.2.2、wrap.value().addPass 总结 前言 在Sentinel中&#xff0c;流控效果有快速失败、预热和排队等待。其中快速失败的统计…...