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

【sgFloatDialog】自定义组件:浮动弹窗,支持修改尺寸、拖拽位置、最大化、还原、最小化、复位

sgFloatDialog 

<template><div :class="$options.name" v-if="visible" :size="size" :style="style"><!-- 托盘头部 --><div class="header" ref="header" @dblclick.stop.prevent="dblclickHeader"><div class="left"><div class="title"><i :class="titleIcon" style="margin-right: 5px" /><span>{{ title }}</span></div></div><div class="right" @mousedown.stop><!-- 控制托盘的图标按钮 --><div class="tray-btns"><divclass="icon-btn"v-if="show_rb_btn"v-show="![`rb`, `mn`, `lg`].includes(size)"@dblclick.stop@click.stop="size = `rb`"title="回到原来的位置"><i class="el-icon-bottom-right"></i></div><divclass="icon-btn"v-if="show_mn_btn"v-show="size !== `mn`"@dblclick.stop@click.stop="size = `mn`"title="最小化"><i class="el-icon-minus"></i></div><divclass="icon-btn"v-show="[`mn`, `lg`].includes(size)"@dblclick.stop@click.stop="size = `md`"title="还原"><i :class="size === `lg` ? `el-icon-copy-document` : `el-icon-d-caret`"></i></div><divclass="icon-btn"v-show="size !== `lg`"@dblclick.stop@click.stop="size = `lg`"title="全屏"><i class="el-icon-full-screen"></i></div><div class="icon-btn" @dblclick.stop @click.stop="close"><i class="el-icon-close"></i></div></div></div></div><div class="body"><slot /></div><!-- 拖拽移动窗体 --><sgDragMove:data="dragMoveDoms":cursor="{grab: 'default',grabbing: 'default',}"nearPadding="10":disabled="size === `lg` && disabledDragMove"@dragStart="$emit(`dragStart`, dragMoveDoms)"@dragging="draggingMove"@dragEnd="$emit(`dragEnd`, dragMoveDoms)"mousemoveNearSide/><!-- 拖拽改变窗体尺寸 --><sgDragSizev-if="resizeable":disabled="size === `lg`"@dragStart="disabledDragMove = true"@dragging="draggingSize"@dragEnd="disabledDragMove = false":minWidth="minWidth":minHeight="minHeight"/></div>
</template>
<script>
import sgDragMove from "@/vue/components/admin/sgDragMove";
import sgDragSize from "@/vue/components/admin/sgDragSize";
export default {name: "sgFloatDialog",components: {sgDragMove,sgDragSize,},data() {return {titleIcon: `el-icon-question`,title: `浮动窗口标题`,// ----------------------------------------defaultRight: 100, //默认出现的位置defaultBottom: 20, //默认出现的位置defaultWidth: 400, //默认宽度defaultHeight: 500, //默认高度minWidth: 300, //最小宽度minHeight: 50, //最小高度// ----------------------------------------style_bk: null,style: {},visible: false,show_rb_btn: true, //是否显示回到右下角按钮show_mn_btn: true, //是否显示最小化按钮size: ``, //lg全屏|md普通|mn最小|rb右下角disabledDragMove: false, //屏蔽移动dragMoveDoms: [/* {canDragDom: elementDOM,//可以拖拽的位置元素moveDom: elementDOM,//拖拽同步移动的元素} */], //可以拖拽移动的物体resizeable: true,};},props: ["data", "value"],computed: {},watch: {value: {handler(d) {this.visible = d;},deep: true,immediate: true,},visible(d) {this.$emit("input", d);},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(`titleIcon`, this);this.$g.convertForm2ComponentParam(`title`, this);this.$g.convertForm2ComponentParam(`defaultRight`, this);this.$g.convertForm2ComponentParam(`defaultBottom`, this);this.$g.convertForm2ComponentParam(`defaultWidth`, this);this.$g.convertForm2ComponentParam(`defaultHeight`, this);this.$g.convertForm2ComponentParam(`minWidth`, this);this.$g.convertForm2ComponentParam(`minHeight`, this);this.$g.convertForm2ComponentParam(`resizeable`, this);this.$nextTick(() => {this.$el.style.setProperty("--defaultRight", `${this.defaultRight}px`); //js往css传递局部参数this.$el.style.setProperty("--defaultBottom", `${this.defaultBottom}px`); //js往css传递局部参数this.$el.style.setProperty("--defaultWidth", `${this.defaultWidth}px`); //js往css传递局部参数this.$el.style.setProperty("--defaultHeight", `${this.defaultHeight}px`); //js往css传递局部参数this.$el.style.setProperty("--minWidth", `${this.minWidth}px`); //js往css传递局部参数this.$el.style.setProperty("--minHeight", `${this.minHeight}px`); //js往css传递局部参数this.dragMoveDoms = [{canDragDom: this.$refs.header, //托盘的头部可以拖拽moveDom: this.$el, //拖拽的时候,整个上传列表一起跟随移动},];});}},deep: true, //深度监听immediate: true, //立即执行},resizeable: {handler(newValue, oldValue) {newValue === undefined || (this.resizeable = newValue === "" || newValue);},deep: true, //深度监听immediate: true, //立即执行},size: {handler(newValue, oldValue) {switch (newValue) {case "lg":case "mn":break;case "md":this.toMd();break;case "rb":break;}},deep: true, //深度监听immediate: true, //立即执行},style_bk: {handler(newValue, oldValue) {if (Object.keys(newValue || {}).length) {let { width, height, left, top } = newValue;width = parseInt(width);height = parseInt(height);left = parseInt(left);top = parseInt(top);if (width <= this.minWidth && height <= this.minHeight) {this.show_mn_btn = false;} else {this.show_mn_btn = true;}let right = innerWidth - left - width;let bottom = innerHeight - top - height;if (right <= this.defaultRight && bottom < this.defaultBottom) {this.show_rb_btn = false;} else {this.show_rb_btn = true;}} else {this.show_mn_btn = true;}},deep: true, //深度监听immediate: true, //立即执行},},created() {},mounted() {},destroyed() {},methods: {toMd() {this.style_bk && (this.style = JSON.parse(JSON.stringify(this.style_bk)));},bkStyle() {this.style && (this.style_bk = JSON.parse(JSON.stringify(this.style)));},draggingMove() {let el = this.$el;if (el) {let rect = el.getBoundingClientRect();let { left, top, width, height } = rect;this.style = {left: `${left}px`,top: `${top}px`,width: `${width}px`,height: `${height}px`,};}this.bkStyle();this.size = null;},draggingSize({ style }) {this.disabledDragMove = true;this.style = style;this.bkStyle();this.size = null;},dblclickHeader(d) {switch (this.size) {case "lg":this.size = "md";break;case "md":this.size = "lg";break;case "mn":this.size = "md";break;default:this.size = "lg";break;}},// 关闭托盘close() {this.visible = false;this.$emit(`close`, this.style);},},
};
</script>
<style lang="scss" scoped>
.sgFloatDialog {$headerHeight: 40px; //头部高度$defaultRight: var(--defaultRight); //托盘默认距离右下角的位置$defaultBottom: var(--defaultBottom); //托盘默认距离右下角的位置$defaultWidth: var(--defaultWidth); //托盘默认宽度$defaultHeight: var(--defaultHeight); //托盘默认高度$minWidth: var(--minWidth); //托盘最小宽度$minHeight: var(--minHeight); //托盘最小高度// ----------------------------------------transition: none;position: fixed;z-index: 2001; //根据情况自己拿捏(太大了会遮住element的其他弹窗组件),v-loading默认是2000的z-indexuser-select: none;margin: 0;padding: 0;right: 100px;bottom: 20px;width: $defaultWidth;height: $defaultHeight;background-color: white;min-width: $minWidth;min-height: $minHeight;box-shadow: 0 0 35px 0 rgba(0, 0, 0, 0.08);//   border-radius:0 0 8px 8px;overflow: hidden;font-size: 14px;//   border: 1px solid #172d4533;//   box-shadow: 0 4px 6px 0 #172d4533;// 最大化&[size="lg"] {left: 0 !important;top: 0 !important;width: 100vw !important;height: 100vh !important;.upload-file-list {max-height: calc(100vh - 60px) !important;}}// 还原&[size="md"] {}// 最小化&[size="mn"] {left: revert !important;top: revert !important;right: $defaultRight !important;bottom: $defaultBottom !important;width: $minWidth !important;height: $minHeight !important;}// 右下角&[size="rb"] {left: revert !important;top: revert !important;right: $defaultRight !important;bottom: $defaultBottom !important;}&::before {content: "";width: 100%;height: 5px;/*从左往右线性渐变背景*/background: linear-gradient(to right, #409eff, #f56c6c);position: absolute;top: 0;left: 0;width: 100%;}.header {margin-top: 5px;flex-shrink: 0;font-size: 16px;font-weight: bold;width: 100%;height: $headerHeight;box-sizing: border-box;padding: 10px 20px;/*从上往下线性渐变背景*/background: linear-gradient(#409eff11, white);color: #409eff;display: flex;justify-content: space-between;align-items: center;&:hover {background: linear-gradient(#409eff22, white);}.left {display: flex;align-items: center;flex-grow: 1;.title {display: flex;align-items: center;flex-wrap: nowrap;}.icon-btns {display: flex;align-items: center;flex-wrap: nowrap;.icon-btn {cursor: pointer;margin-right: 5px;&:last-of-type {margin-right: 0;}i {pointer-events: none;}&:hover {opacity: 0.618;}}}}.right {display: flex;align-items: center;justify-content: flex-end;flex-shrink: 0;pointer-events: auto;.icon-btn {margin-left: 10px;cursor: pointer;i {pointer-events: none;}&:hover {opacity: 0.618;}&:first-of-type {margin-left: 0;}}.file-btns {margin-left: 10px;display: flex;flex-wrap: nowrap;justify-content: flex-end;box-sizing: border-box;padding: 0 10px;border-right: 1px solid #eee;}.tray-btns {margin-left: 10px;display: flex;flex-wrap: nowrap;justify-content: flex-end;}}}.body {box-sizing: border-box;padding: 20px;padding-top: 0;display: flex;flex-wrap: nowrap;width: 100%;height: calc(100% - #{$headerHeight});}
}
</style>

demo

<template><!-- 指导帮助悬浮弹窗 --><sgFloatDialog:data="data_sgFloatDialog"v-model="show_sgFloatDialog"v-if="show_sgFloatDialog"@close="close"><divstyle="width: 100%;height: 100%;overflow-y: auto;font-size: 16px;text-indent: 32px;line-height: 1.6;"><p>我一路向北,离开有你的季节,你说你好累,已无法再爱上谁。风在山路吹,过往的画面全都是不对,细数惭愧,我伤你几回。</p><p>我想我是太过依赖,在挂电话的刚才,坚持学单纯的小孩,静静看守这份爱,知道不能太依赖,怕你会把我宠坏,你的香味一直徘徊,我舍不得离开。</p><p>缓缓飘落的枫叶像思念,为何挽回要赶在冬天来之前,爱你穿越时间,两行来自秋末的眼泪,让爱渗透了地面我要的只是你在我身边。</p><p>我知道你我都没有错,只是忘了怎么退后,信誓旦旦给的承诺,全被时间扑了空。我知道我们都没有错,只是放手会比较好过,最美的爱情回忆里待续。</p></div></sgFloatDialog>
</template>
<script>
import sgFloatDialog from "@/vue/components/admin/sgFloatDialog";export default {components: { sgFloatDialog },data() {return {data_sgFloatDialog: {titleIcon: `el-icon-info`,title: `标题`,defaultRight: 10,defaultBottom: 10,defaultWidth: 400,defaultHeight: 600,},show_sgFloatDialog: true,};},methods: {close(d) {// console.log(``, d);},},
};
</script>

依赖

【sgDragMove】自定义组件:自定义拖拽组件,仅支持拖拽、设置吸附屏幕边界距离。_自定义拖拽位置-CSDN博客文章浏览阅读245次。sgDragMove是一个支持拖拽元素并能吸附到屏幕边界的Vue.js组件。它允许用户自定义吸附距离,可以设置拖拽行为是否禁用,以及停靠边界距离。组件在拖拽过程中提供了半透明效果,并能在不同阶段监听和处理鼠标事件以实现拖拽、吸附和停靠功能。 https://blog.csdn.net/qq_37860634/article/details/131721634【sgDragSize】自定义组件:自定义拖拽修改DIV尺寸组件,适用于窗体大小调整_div拖拽调整大小-CSDN博客文章浏览阅读505次。核心原理就是在四条边、四个顶点加上透明的div,给不同方向提供按下移动鼠标监听 ,对应计算宽度高度、坐标变化。_div拖拽调整大小 https://blog.csdn.net/qq_37860634/article/details/132347222

相关文章:

【sgFloatDialog】自定义组件:浮动弹窗,支持修改尺寸、拖拽位置、最大化、还原、最小化、复位

sgFloatDialog <template><div :class"$options.name" v-if"visible" :size"size" :style"style"><!-- 托盘头部 --><div class"header" ref"header" dblclick.stop.prevent"dblclic…...

conda 常用命令

常用 Conda 命令整理环境管理 conda create --name 环境名 &#xff1a;创建新环境 conda activate 环境名 &#xff1a;激活环境 conda deactivate&#xff1a;退出环境 conda env list&#xff1a;列出所有环境 conda remove --name 环境名 --all &#xff1a;删除环…...

神聖的綫性代數速成例題10. N維矢量綫性運算、矢量由矢量組綫性表示、N個N維矢量相關性質

N 維矢量綫性運算&#xff1a; 設&#xff0c;是維矢量&#xff0c;是數。加法&#xff1a;。數乘&#xff1a;。 矢量由矢量組綫性表示&#xff1a; 設是n維矢量&#xff0c;若存在一組數&#xff0c;使得&#xff0c;則稱矢量可由矢量組綫性表示。 N 個 N 維矢量相關性質&…...

力扣977. 有序数组的平方(双指针技巧)

Problem: 977. 有序数组的平方 文章目录 题目描述思路Code 题目描述 思路 由于数组是非递减且包含正、负数&#xff0c;则假如我们将数组中的每一个元素取平方并且将其从原始的某一个位置分开成两个数组来看待&#xff08;一个数组从前往后看&#xff0c;一个数组从后往前看&am…...

单片机flash存储也做磨损均衡

最近在做一个项目&#xff0c;需要保存设置数据&#xff0c;掉电不丢失。那么首先想到的是加个24c02&#xff0c;是一个eeprom&#xff0c;但是客户板太小&#xff0c;没有办法进行扩展。后面就找了一个带ee的OTP单片机&#xff0c;发现擦写次数有限&#xff0c;只有1000次&…...

第7章 类与面向对象

6-1 二维平面上的点操作&#xff08;Python3&#xff09; 题目描述 设计一个表示二维平面上点的类 Point。该类应该包含以下功能&#xff1a; 两个私有属性 _x 和 _y&#xff0c;分别表示点的横坐标和纵坐标。 一个构造函数 __init__&#xff0c;用于初始化点的坐标。 一个…...

【算法】力扣 713题:乘积小于 K 的子数组之深入思考

文章目录 前言题目&#xff1a;乘积小于 K 的子数组参考思路方法一&#xff1a;滑动窗口方法二&#xff1a;二分查找 参考题解方法一&#xff1a;滑动窗口解法方法二&#xff1a;二分查找解法 深入思考浮点精度&#xff1f;right - left 1&#xff1f;二分法&#xff1f;哈希优…...

Milvus vs. ElasticSearch:向量库检索性能测试

目录 1. 构建检索库2. 测试条件3. 测试结果4. 性能分析5. 结论 1. 构建检索库 构建通用场景库总计约2万张。构建车辆数据库总计约12万张。构建公共数据库&#xff0c;包括Flickr30k、COCO、nlvr2、vqa等数据集约43万张。 2. 测试条件 环境说明&#xff1a;分别单机部署Milvu…...

高级数据结构应用:并查集、跳表、布隆过滤器与缓存结构

高级数据结构应用:并查集、跳表、布隆过滤器与缓存结构 在解决复杂问题时,选择合适的数据结构往往是成功的关键。本文将深入探讨四种强大而实用的高级数据结构:并查集、跳表、布隆过滤器和高效缓存结构(LRU和LFU),包括它们的原理、实现、复杂度分析和实际应用场景。 1.…...

CVPR2025 | 蚂蚁浙大提出MP-GUI算法:全方位增强MLLM的GUI理解能力

近日&#xff0c;计算机视觉和模式识别领域国际顶会CVPR 2025公布了论文录用结果&#xff0c;蚂蚁集团与浙江大学EAGLE实验室合作的论文 “MP-GUI: Modality Perception with MLLMs for GUI Understanding” 被成功录用。 IEEE国际计算机视觉与模式识别会议&#xff08;CVPR&a…...

过河卒cpp动态规划

题目如下 思路 利用二维数组存储棋盘的各个点的位置&#xff0c;首先初始化所有位置为0&#xff0c;然后记马的位置为1&#xff0c;将m&#xff0c;n同时加2&#xff0c;避免马的位置溢出&#xff0c;然后对二维数组进行递推算出dp[n][m] 代码及解析如下 谢谢观看&#xff01;…...

春天咋会像冬天一样

2025年3月20日&#xff0c;阴&#xff0c;天寒 遇见的事&#xff1a;21&#xff5e;24号去曲靖招生&#xff0c;打电话给我说换一下&#xff0c;换了后又没有车了&#xff0c;这么坑。 感受到的情绪&#xff1a;你知道么&#xff0c;换的前提是有车。开车不给报销&#xff0c;…...

DooTask在Linux的离线部署教程

DooTask在Linux的离线部署教程 下载安装包 从网盘中将安装包下载到本地&#xff0c;下载地址 通过网盘分享的文件&#xff1a;DooTask项目管理工具 链接: https://pan.baidu.com/s/1hGmLXonT4c8hLiDP1QBr8w?pwdgdp6 提取码: gdp6 通过网盘分享的文件&#xff1a;DooTask项目…...

分享下web3j 常见用法

转账 fun sendEthTransaction(privateKey: String,toAddress: String,amount: BigDecimal) {//chainIdval chainId:Long 1//url 可以从https://chainlist.org/里面获取可用节点//eth转账&#xff0c;bnb同理&#xff0c;但需发送到bnb对应节点val url "https://xxx"…...

跨域问题确认及处理

背景如下&#xff1a; 近期在做的项目中&#xff0c;有个奇怪的需求&#xff0c;需要在JSP项目中嵌套一个VUE项目&#xff0c;原因是&#xff1a;JSP项目是在运且不大方便重构的一个项目&#xff0c;新需求又想为了未来着想做一套单独的项目&#xff0c;无奈只能嵌套。 当项目开…...

PyCharm如何添加已有的conda环境

1、点击文件中的设置 2、在右侧选中项目下的Python解释器 3、在右侧解释器一栏找到添加解释器选项 4、选择本地解释器 5、填写信息 环境&#xff1a;选择现有 类型&#xff1a;conda conda路径&#xff1a;...\Anaconda\Scripts\conda.exe 环境&#xff08;python路径&…...

揭开最大子段和问题的神秘面纱:从暴力法到极致优化的算法之旅

最大子段和问题&#xff1a;从暴力法到优化的算法解析 题目链接 题目描述 给出一个长度为 nn 的序列 aa&#xff0c;选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数&#xff0c;表示序列的长度 n。第二行有 n 个整数&#xff0c;第 i 个整数表示序列的…...

MySQL原理:逻辑架构

目的&#xff1a;了解 SQL执行流程 以及 MySQL 内部架构&#xff0c;每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层&#xff1a;连接层 3.1 数据库连接池(Conn…...

提升模型性能:数据增强与调优实战

‌一、为什么需要数据增强&#xff1f; 数据增强通过对训练图像进行‌随机变换‌&#xff0c;能够有效&#xff1a; 增加数据多样性&#xff0c;防止过拟合提升模型对不同视角、光照条件的鲁棒性在数据量不足时显著提升模型性能 二、MNIST手写数字识别实战‌ ‌1. 加载数据…...

Emacs 折腾日记(十八)——改变Emacs的样貌

截止到上一篇文章为止&#xff0c;之前教程 的内容都看完了&#xff0c;虽然它的后记部分提供了一些后续进阶的内容需要我们自己读手册。但是我不太想继续在elisp上死磕了。看着自己学了那么久的elisp&#xff0c;但是自己的emacs仍然没有半点改变&#xff0c;这个时候各位读者…...

VNA操作使用学习-14 再测晶振特性

再测一下4Mhz晶振&#xff0c;看看特性曲线&#xff0c;熟悉一下vna使用。 s11模式&#xff0c;找遍了各种format都无法显示&#xff0c;只有这一种&#xff08;s11&#xff0c;Resistance&#xff09;稍微显示出一个谐振&#xff0c;但是只有一个点。 s21模式 这是201p&#…...

CentOS7 离线下载安装 GitLab CE

依赖下载 https://vault.centos.org/7.9.2009/os/x86_64/Packages/policycoreutils-python-2.5-34.el7.x86_64.rpm 依赖安装 rpm -ivh policycoreutils-python-2.5-34.el7.x86_64.rpm 查看是否安装依赖 rpm -qa | grep policycoreutils-pythongitlab下载 https://packag…...

LeetCode 热题 100_跳跃游戏 II(79_45_中等_C++)(贪心算法)

LeetCode 热题 100_跳跃游戏 II&#xff08;79_45&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;贪心选择&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;贪心算法&#xff09;…...

《Linux系统编程篇》Linux Socket 网络编程01 API介绍(Linux 进程间通信(IPC))——基础篇

文章目录 引言1. **创建Socket**2. **绑定Socket**3. **监听Socket**4. **接受客户端连接**5. **连接服务器**6. **发送数据**7. **接收数据**8. **发送数据&#xff08;UDP&#xff09;**9. **接收数据&#xff08;UDP&#xff09;**10. **关闭Socket**11. **设置/获取Socket选…...

系统思考—啤酒游戏经营决策沙盘模拟

再次感谢文华学院的邀请&#xff0c;为经纬集团管理层带来 《啤酒游戏经营决策沙盘》&#xff01; 很多朋友问&#xff1a;“最近是不是啤酒游戏上的少了&#xff1f;” 其实&#xff0c;真正的关键不是游戏本身&#xff0c;而是——如何让大家真正看见复杂系统中的隐性结构。 …...

利用设计模式构建事件处理系统

在现代软件开发中&#xff0c;设计模式提供了一种可重用的解决方案来解决常见的设计问题。在这篇博客中&#xff0c;我们将探讨如何利用模板方法模式、责任链模式、建造者模式以及线程安全设计来构建一个灵活且可扩展的事件处理系统。 设计模式及其应用 1. 模板方法模式 应用…...

ThreadLocal 的详细使用指南

一、ThreadLocal 核心原理 ThreadLocal 是 Java 提供的线程绑定机制&#xff0c;为每个线程维护变量的独立副本。其内部通过 ThreadLocalMap 实现&#xff0c;每个线程的 Thread 对象都有一个独立的 ThreadLocalMap&#xff0c;存储以 ThreadLocal 对象为键、线程局部变量为值…...

全员DeepSeek时代,前端能做些什么?

全员DeepSeek时代&#xff0c;前端能做些什么&#xff1f; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc #mermaid-svg-VNyL95jkz9jEXgUq {font-family:&…...

阿里云 AI 搜索产品荣获 Elastic Innovation Award 2024

阿里云AI搜索产品荣获Elastic Innovation Award 2024&#xff0c;该奖项于近日在新加坡ElasticON 2025的Elastic合作伙伴峰会上颁发&#xff0c;旨在表彰基于Elastic平台开发企业级生成式人工智能&#xff08;GenAI&#xff09;应用的顶尖合作伙伴&#xff0c;这些应用有效帮助…...

html5制作2048游戏开发心得与技术分享

2048游戏开发心得与技术分享 这里写目录标题 2048游戏开发心得与技术分享项目概述技术架构1. 核心技术栈2. 项目结构 核心功能实现1. 数据结构设计2. 移动逻辑实现3. 触摸支持 性能优化1. DOM操作优化2. 事件处理优化 开发心得1. 代码组织2. 调试技巧3. 用户体验优化 项目亮点技…...

AI日报 - 2025年3月21日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | OpenAI成立安全委员会&#xff0c;加速AGI治理框架构建 ▎&#x1f4bc; 商业动向 | 微软发布医疗大模型DAX Copilot 3.0&#xff0c;覆盖全球临床场景 ▎&#x1f4dc; 政策追踪 | 中国发布…...

MyBatis-Plus:告别手写 SQL 的高效之道

目录 1. MyBatis-plus 简介 2. MyBatis-Plus 快速上手 2.1 项目准备 2.2 导入 MyBatis-Plus 依赖 2.3 配置数据库连接 2.4 配置 MyBatis-Plus 日志打印 3. 使用 MyBatis-Plus 3.1 创建 model 类 3.2 创建 mapper 接口 3.3 MyBatis-Plus 映射机制 3.3.1 TableName &a…...

【AI News | 20250320】每日AI进展

AI Repos 1、servers 该仓库提供详细入门指南&#xff0c;用户可通过简单步骤连接Claude客户端&#xff0c;快速使用所有服务器功能。此项目由Anthropic管理&#xff0c;展示MCP的多样性与扩展性&#xff0c;助力开发者为大语言模型提供安全、可控的工具与数据访问。 2、awe…...

让“树和二叉树”埋在记忆土壤中--性质和概念

Nice to meet your! 目录 树的介绍&#xff1a; 树的创建&#xff1a; 二叉树的概念和结构&#xff1a; 二叉树的存储结构&#xff1a; 树的介绍&#xff1a; 概念和结构&#xff1a; 不知你们是否在现实中看见过分为两个叉的枯树&#xff0c;大概长这样&#xff1a; 那…...

210、【图论】课程表(Python)

题目 思路 这道题本质上是一个拓扑排序。每次先统计每个点的入度个数、然后再统计点与点之间的邻接关系&#xff0c;找到入度为0的点作为起始遍历点。之后每遍历到这个点之后&#xff0c;就把这个点后续的邻接关系边的点入度减去一。当某个点入度为0时&#xff0c;继续被加入其…...

【Linux篇】进程控制

&#x1f4cc; 个人主页&#xff1a; 孙同学_ &#x1f527; 文章专栏&#xff1a;Liunx &#x1f4a1; 关注我&#xff0c;分享经验&#xff0c;助你少走弯路&#xff01; 1. 进程创建 1.1 fork函数 在linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个…...

freeswitch(在呼叫失败的情况下如何播放语⾳提⽰)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch⼀般我们在打电话时会听到『您拨的电话正在通话中,请稍后再 拨.』,或『电话⽆应答』之类的提⽰,我们在 FreeSWITCH ⾥也可以这样做。 …...

软考系统架构设计师之计算机组成与体系结构笔记

一、计算机硬件组成 1. 冯诺依曼结构与哈佛结构 冯诺依曼结构&#xff1a;以存储器为中心&#xff0c;指令和数据统一存储&#xff0c;通过总线连接运算器、控制器、输入输出设备。其核心思想是“存储程序控制”&#xff0c;但存在存储器访问瓶颈问题。哈佛结构&#xff1a;指…...

gonet开源游戏服务器环境配置

1.mysql搭建 搜索mysql-server apt安装包名 sudo apt search mysql-server 安装mysql-server sudo apt-get install mysql-server 安装完成后会&#xff0c;启动mysql服务及创建系统服务 查看服务状态 systemctl status mysql.service 使用超级权限登陆mysql sudo mysql 授…...

软件工程之软件验证计划Software Verification Plan

个人主页&#xff1a;云纳星辰怀自在 座右铭&#xff1a;“所谓坚持&#xff0c;就是觉得还有希望&#xff01;” 本文为基于ISO26262软件验证计划模板&#xff0c;仅供参考。 软件验证计划&#xff0c;包括&#xff1a; 1. 软件需求验证计划 2. 软件架构设计验证计划 3. 软件单…...

大模型详细配置

Transformer结构 目前主力大模型都是基于Transformer的&#xff0c;以下是Transformer的具体架构 它由编码器(Encoder)以及解码器(Decoder)组成&#xff0c;前者主要负责对输入数据进行理解&#xff0c;将每个输入 词元都编码成一个上下文语义相关的表示向量&#xff1b;后者…...

Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取

Web爬虫利器FireCrawl&#xff1a;全方位助力AI训练与高效数据抓取 一、FireCrawl 项目简介二、主要功能三、FireCrawl应用场景1. 大语言模型训练2. 检索增强生成&#xff08;RAG&#xff09;&#xff1a;3. 数据驱动的开发项目4. SEO 与内容优化5. 在线服务与工具集成 四、安装…...

产业观察:ASML2025.3.21

一.发展历程 1.1 创业背景 在半导体行业的快速发展背景下&#xff0c;ASML的创业故事拉开了帷幕。1983年&#xff0c; 飞利浦S&I技术总监Georg de Kruyff 与 ASM创始人Arthur del Prado 重启合作讨论&#xff0c;为ASML的创立奠定了基础。双方迅速达成协议&#xff0c;计…...

go语言学习教程推荐,零基础到做项目

一、基础入门阶段 官方教程&#xff08;免费&#xff09; • A Tour of Go&#xff1a;交互式入门教程&#xff0c;边学边练 • Go by Example&#xff1a;通过300代码片段学习语法 入门书籍 • &#x1f4d8;《Go语言圣经》中文版&#xff08;免费在线阅读&#xff09;&#…...

设计模式 二、创建型设计模式

GoF是 “Gang of Four”&#xff08;四人帮&#xff09;的简称&#xff0c;它们是指4位著名的计算机科学家&#xff1a;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。他们合作编写了一本非常著名的关于设计模式的书籍《Design Patterns: Elements of Reusable…...

51c大模型~合集73

我自己的原文哦~ https://blog.51cto.com/whaosoft/12318419 #Emu3 视频、图像、文本&#xff0c;只需基于下一个Token预测&#xff1a;智源Emu3发布&#xff0c;验证多模态模型新范式 OpenAI 前首席科学家、联合创始人 Ilya Sutskever 曾在多个场合表达观点&#xff1…...

【el-upload】el-upload组件 - list-type=“picture“ 时,文件预览展示优化

目录 问题图el-upload预览组件 PicturePreview效果展示 问题图 el-upload <el-uploadref"upload"multipledragaction"#":auto-upload"false":file-list"fileList"name"files":accept".png,.jpg,.jpeg,.JGP,.JPEG,.…...

STM32F103系列配置中断向量表偏移(Keil/STM32CubeIDE)

需要在flash中添加bootloader的话&#xff0c;需要对flash进行分区&#xff0c;即bootloader区和app区(程序运行区)&#xff0c;主要记录在 Keil 平台和 STM32CubeIDE平台 上的中断向量表偏移配置&#xff0c;以偏移 0x2800 为例&#xff0c;即预留10k大小的空间给bootloader …...

Redis常用数据类型和使用常见以及基本操作举例(适合初学者,以医药连锁管理系统为背景)

Redis的常见数据类型&#xff0c;包括String、Hash、List、Set、Zset等&#xff0c;这些数据类型都有各自的特点和适用场景。接下来&#xff0c;将这些数据类型与医药连锁管理系统的业务场景进行匹配。 String类型&#xff0c;适合存储单个值。在医药连锁管理系统中&#xff0…...

ASL扩展坞方案|Type-c转换器方案|ASL原厂代理商

安格瑞科技代理的ASL主板组件系列包括CS5211、CS5311、CS5232、CS5263、CS621x、CS5523、CS5518等产品&#xff1b; CS5228ANDP to HDMI(4K60HZ)CS5262ANDP (4lanes) to HDMI2.0 4k60Hz VGACS5263ANDP(4lanes) to HDMI2.0 4k60HzCS5363ANDP (4lanes) to HDMI2.0 4k60Hz CS521…...