将 iconfont 图标转换成element-plus也能使用的图标组件
在做项目时发现,element-plus的图标组件,不能像文档示例中那样使用 iconfont 的图标。经过研究发现,element-plus的图标封装成了vue组件,组件内容是一个svg,然后以组件的方式引入和调用图标。根据这个思路,我写了一个脚本,将iconfont图标,转换成vue组件,这样就可以完美地统一项目中图标的使用方式了。
ElementPlus 图标的两种使用方式
先来回顾一下 element-plus 使用图标的两种方式
- 第一种是直接以组件调用的方式使用
<el-icon><Plus /></el-icon>
- 第二种是作为组件的props使用
<el-button type="danger" :icon="Delete" circle />import { Delete } from '@element-plus/icons-vue'
读取 iconfont 图标内容
iconfont 能够生成svg图标,生成的内容在 iconfont.js
文件中
从图中可以看到,svg内容是一个字符串,只需要读取这个字符串,然后将每一个图标取出,就可以用来生成vue组件了。
核心代码:
import fs from 'fs'
import { JSDOM } from 'jsdom'
import { normalizePath } from 'vite'let file = ''
try {// 读取 iconfont.js 文件内容file = fs.readFileSync(normalizePath(sourcePath), 'utf-8')
} catch (e) {writeIconfontJsFile()modifyImportFile()return
}
// 提取svg字符串
const svgReg = /<svg>[\s\S]*?<\/svg>/g
const [svgStr] = file.match(svgReg)
// 解析svg字符串为dom对象
const dom = new JSDOM(svgStr)const document = dom.window.document
// 获取所有的symbol元素,每个symbol代表一个图标
const symbols = document.querySelectorAll('symbol')
if (!symbols.length) {return
}const iconsNames = []let str = `import { defineComponent, h } from 'vue'\n\n`symbols.forEach((symbol) => {// 获取图标名称,并转换为驼峰命名const iconName = toCamelCase(symbol.getAttribute('id')).replace(/_$/, '').replace(/-$/, '')iconsNames.push(iconName)// 获取viewBox和path,并生成对应的vue组件代码const viewBox = symbol.getAttribute('viewBox')const path = symbol.querySelectorAll('path')const pathArr = []path.forEach((p) => {const d = p.getAttribute('d')pathArr.push(`h('path', { d: '${d}' })`)})str += `const ${iconName} = defineComponent({ name: '${iconName}', render() { return h('svg', { viewBox: '${viewBox}' }, [${pathArr}]) }})\n\n`
})str += `export {\n\t${iconsNames.join(',\n\t')}\n}`
// 写入文件
writeIconfontJsFile(str)
modifyImportFile(iconsNames)
生成的结果如下
import { defineComponent, h } from 'vue'const IconChehuisekuai = defineComponent({ name: 'IconChehuisekuai', render() { return h('svg', { viewBox: '0 0 1024 1024' }, [h('path', { d: 'M64 347.552L320 128v448z' }),h('path', { d: 'M265.472 896v-112h377.824a200 200 0 1 0 0-400H240V272h403.296c172.32 0 312 139.68 312 312S815.616 896 643.296 896H265.472z' })]) }})export {IconChehuisekuai,
}
完整代码
以 vite 插件的方式使用
/*** 将iconfont转换为vue组件的插件* 在vite.config.js中使用* 如果引入新的iconfont后没有变化,重启试一下* @example* import transformIconfontToComponent from './script/vite-plugin/transform-iconfont-to-component.js'* plugins: [transformIconfontToComponent({ sourcePath: 'src/assets/iconfont/iconfont.js', targetPath: 'src/assets/vue-icons/iconfont.js', importPath: 'src/assets/vue-icons/index.js' })]** importPath文件中需要添加占位注释,如下:* 导入位置* /* import iconfont start *\/* /* import iconfont end *\/* 全局注册位置* /* register iconfont start *\/* /* register iconfont end *\/* 导出位置* /* export iconfont start *\/* /* export iconfont end *\/** 使用以上注释时,\ 需要删除掉*/import fs from 'fs'
import { JSDOM } from 'jsdom'
import { normalizePath } from 'vite'/*** 驼峰化, 支持:下划线(_)、小数点(.)、空格( )、冒号(:)、中横线(-)、斜杠(\) 等多种连续分隔符混合使用场景* @param {String} name 需要转换的名称* @param {Boolean} isFirstUppercase 是否首字母大写,默认否* @returns {String} 转换后的名称*/
function toCamelCase(name, isFirstUppercase = true) {if (!name) return nameconst SPECIAL_CHARS_REGEXP = /([:\-_. /]+(.))/g // special chars regexpconst result = name.replace(SPECIAL_CHARS_REGEXP, function (_, separator, letter, offset) {return offset ? letter.toUpperCase() : letter})// 大驼峰if (isFirstUppercase) {return result.replace(/^\w/, (p1) => p1.toUpperCase())}return result
}export default function (opt) {/*** @param {String} sourcePath 图标字体文件路径* @param {String} targetPath 生成的组件文件路径* @param {String} importPath 导入targetPath的路径*/const { sourcePath, targetPath, importPath } = optfunction writeIconfontJsFile(str = '') {// 写入文件fs.writeFileSync(normalizePath(targetPath), str)}function modifyImportFile(iconsNames = []) {// 修改注入文件,注册组件let indexFileStr = fs.readFileSync(normalizePath(importPath), 'utf-8')// 找到注入位置的标志符号,然后插入导入语句const importIconfontStartFlag = '/* import iconfont start */'const importIconfontEndFlag = '/* import iconfont end */'const index1 = indexFileStr.indexOf(importIconfontStartFlag)const index2 = indexFileStr.indexOf(importIconfontEndFlag)const importIconfontStr = iconsNames?.length? `\nimport {\n\t${iconsNames.join(',\n\t')}\n} from '${normalizePath(targetPath).replace(/^src/,'@')}'\n`: '\n'indexFileStr =indexFileStr.slice(0, index1 + importIconfontStartFlag.length) +importIconfontStr +indexFileStr.slice(index2)// 找到注册位置的标志符号,然后插入注册语句const registerIconfontStartFlag = '/* register iconfont start */'const registerIconfontEndFlag = '/* register iconfont end */'const index3 = indexFileStr.indexOf(registerIconfontStartFlag)const index4 = indexFileStr.indexOf(registerIconfontEndFlag)const registerIconfontStr = iconsNames?.length? `\n${iconsNames.map((name) => `app.component('${name}', ${name})`).join('\n')}\n`: '\n'indexFileStr =indexFileStr.slice(0, index3 + registerIconfontStartFlag.length) +registerIconfontStr +indexFileStr.slice(index4)// 找到导出位置的标志符号,然后插入导出语句const exportIconfontStartFlag = '/* export iconfont start */'const exportIconfontEndFlag = '/* export iconfont end */'const index5 = indexFileStr.indexOf(exportIconfontStartFlag)const index6 = indexFileStr.indexOf(exportIconfontEndFlag)const exportIconfontStr = iconsNames?.length? `\nexport {\n\t${iconsNames.join(',\n\t')}\n}\n`: '\n'indexFileStr =indexFileStr.slice(0, index5 + exportIconfontStartFlag.length) +exportIconfontStr +indexFileStr.slice(index6)fs.writeFileSync(normalizePath(importPath), indexFileStr)}return {name: 'transform-iconfont-to-component',buildStart() {let file = ''try {// 读取 iconfont.js 文件内容file = fs.readFileSync(normalizePath(sourcePath), 'utf-8')} catch (e) {writeIconfontJsFile()modifyImportFile()return}// 提取svg字符串const svgReg = /<svg>[\s\S]*?<\/svg>/gconst [svgStr] = file.match(svgReg)// 解析svg字符串为dom对象const dom = new JSDOM(svgStr)const document = dom.window.document// 获取所有的symbol元素,每个symbol代表一个图标const symbols = document.querySelectorAll('symbol')if (!symbols.length) {return}const iconsNames = []let str = `import { defineComponent, h } from 'vue'\n\n`symbols.forEach((symbol) => {// 获取图标名称,并转换为驼峰命名const iconName = toCamelCase(symbol.getAttribute('id')).replace(/_$/, '').replace(/-$/, '')iconsNames.push(iconName)// 获取viewBox和path,并生成对应的vue组件代码const viewBox = symbol.getAttribute('viewBox')const path = symbol.querySelectorAll('path')const pathArr = []path.forEach((p) => {const d = p.getAttribute('d')pathArr.push(`h('path', { d: '${d}' })`)})str += `const ${iconName} = defineComponent({ name: '${iconName}', render() { return h('svg', { viewBox: '${viewBox}' }, [${pathArr}]) }})\n\n`})str += `export {\n\t${iconsNames.join(',\n\t')}\n}`// 写入文件writeIconfontJsFile(str)modifyImportFile(iconsNames)}}
}
上面提到一个 importPath 的导入文件,这个文件将生成的图标组件集中导入,然后进行全局注册,内容如下:
/*** 自定义图标、iconfont图标、element-plus图标的注册文件** 注意:* iconfont 图标名称由iconfont名称驼峰化,后面不加_。如 icon-name => IconName** 示例:** 引入自定义图标:* import { SunnyFill } from '@/assets/vue-icons'** element-plus图标:* import { Search } from '@element-plus/icons-vue'*/
/* eslint-disable */
import * as ElementPlusIconsVue from '@element-plus/icons-vue'import MonthFill from './components/MonthFill.vue'// 下面这行注释不能删除,vite自定义插件会在这里插入内容
/* import iconfont start */
import {IconChehuisekuai,
} from '@/assets/vue-icons/iconfont.js'
/* import iconfont end */export default {install(app) {// 注册element-plus图标for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)}// 注册自定义图标app.component('MonthFill', MonthFill)// 下面这行注释不能删除,vite自定义插件会在这里插入内容/* register iconfont start */app.component('IconChehuisekuai', IconChehuisekuai)/* register iconfont end */}
}export { MonthFill }// 下面这行注释不能删除,vite自定义插件会在这里插入内容
/* export iconfont start */
export {IconChehuisekuai,
}
/* export iconfont end */
相关文章:
将 iconfont 图标转换成element-plus也能使用的图标组件
在做项目时发现,element-plus的图标组件,不能像文档示例中那样使用 iconfont 的图标。经过研究发现,element-plus的图标封装成了vue组件,组件内容是一个svg,然后以组件的方式引入和调用图标。根据这个思路,…...
使用程序绘制中文字体——中文字体的参数化设计方案初探
目录 写在前面基本设计思路笔画骨架参数设计笔画风格参数设计起笔风格转角风格字重变化弯曲程度 字形的“组装拟合”基于骨架的结构调整笔画绘制二三事撇的两侧轮廓绘制——不是两条贝塞尔曲线那么简单转角的处理,怎样能显得不突兀?笔画骨架关键点的拖拽…...
高频数据结构面试题总结
基础数据结构 1. 数组(Array) 特点:连续内存、固定大小、随机访问O(1)常见问题: 两数之和/三数之和合并两个有序数组删除排序数组中的重复项旋转数组最大子数组和(Kadane算法) 2. 链表(Linked List) 类型:单链表、双链表、循环链表常见问…...
工业设计破局密码:3D 可视化技术点燃产业升级引擎
3D可视化是一种将数据、信息或抽象概念以三维图形、模型和动画的形式呈现出来的技术。3D可视化技术通过构建三维数字孪生体,将设计思维转化为可交互的虚拟原型,不仅打破了传统二维设计的空间局限,更在效率、精度与用户体验层面开创了全新维度…...
【动态导通电阻】p-GaN HEMTs正向和反向导通下的动态导通电阻
2024 年,浙江大学的 Zonglun Xie 等人基于多组双脉冲测试方法,研究了两种不同技术的商用 p-GaN 栅极 HEMTs 在正向和反向导通模式以及硬开关和软开关条件下的动态导通电阻(RON)特性。实验结果表明,对于肖特基型 p-GaN 栅极 HEMTs,反向导通时动态 RON 比正向导通高 3%-5%;…...
Python代码编程基础
字符串 str.[]实现根据下标定位实现对元素的截取 for 循环可以实现遍历 while 循环可以在实现遍历的同时实现对某一下标数值的修改 字符串前加 r 可以实现对字符串的完整内容输出 字符串前加 f 可以实现对字符串内{}中包裹内容的格式化输出,仅在 v3.6 之后可用…...
基于RAG+MCP开发【企文小智】企业智能体
一、业务场景描述 1.1、背景介绍 几乎每家企业都积累了大量关于规章制度的文档资料,例如薪酬福利、绩效考核、保密协议、考勤管理、采购制度、资产管理制度等。这些文档大多以 Word、PDF 等非结构化格式存在。传统方式下,员工在查询某项具体规则时&…...
【软件测试】测试用例的设计方法
目录 一、基于需求进行测试用例的设计 1.1 功能需求测试分析 二、黑盒测试用例设计方法 2.1 等价类划分法(解决穷举) 2.1.1 等价类设计步骤 2.1.2 等价类划分法案例 2.1.2.1 验证 QQ 账号的合法性 2.1.2.2 验证某城市电话号码的正确性 2.1.3 适用场景 2.2 边界值分析…...
计算机网络笔记(十八)——3.5高速以太网
3.5.1 100BASE-T以太网 1. 基本概念 标准规范:IEEE 802.3u,是快速以太网的典型代表,运行速率100Mbps。物理介质:使用双绞线(UTP或STP),支持最大传输距离100米(Cat5/5e及以上&#…...
海外广告账号资源解析:如何选择适合业务的广告账户?
在全球化数字营销的浪潮下,海外广告投放已成为企业拓展市场的核心手段。然而,不同平台的广告账号类型复杂多样,如何选择适合自身业务的资源?本文将深度解析 Facebook、Google、TikTok 三大平台的广告账号类型,助您精准…...
Java设计模式之建造者模式:从入门到精通
1. 建造者模式概述 1.1 定义与核心概念 **建造者模式(Builder Pattern)**是一种创建型设计模式,它将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 专业术语解释表: 术语解释产品(Product)最终要构建的复杂对象建造者(Builder)定义创建产品各个…...
Faiss 索引深度解析:从基础到实战
在处理高维数据的相似性搜索时,Faiss(Facebook AI Similarity Search)无疑是一款强大且高效的工具。它为我们提供了多种索引类型,适用于不同规模和需求的数据场景。本文将结合代码实例,深入剖析 Faiss 中常见索引的原理…...
Error parsing column 10 (YingShou=-99.5 - Double) dapper sqlite
在使用sqlite 调取 dapper的时候出现这个问题提示: 原因是 在 sqlite表中设定的字段类型是 decimel而在C#的字段属性也是decimel,结果解析F负数 小数的时候出现这个错误提示: 解决办法:使用默认的sqlite的字段类型来填入 REAL描述…...
星云智控:物联网时代的设备守护者——卓伊凡详解物联网监控革命-优雅草卓伊凡
星云智控:物联网时代的设备守护者——卓伊凡详解物联网监控革命-优雅草卓伊凡 一、物联网的本质解析 1.1 什么是物联网? 当卓伊凡被问及”星云智控物联网是干嘛的”这个问题时,他首先给出了一个技术定义:物联网(Int…...
LeRobot 项目部署运行逻辑(五)——intelrealsense.py/configs.py
在运行 control_robot.py 的时候会启用相机拍摄,lerobot 中封装好了两种相机类型:realsense 和 opencv realsense 直接使用他们的脚本就可以,但需要在 lerobot/robot_devices/robots/configs.py 中修改相机 serial_number 由于我们设备采用的…...
从0开始学linux韦东山教程第一三章问题小结(1)
本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。 摘要关键词:VMware、Ubuntu、网络网口 视频链接:【【韦东山】韦东山手把手教你嵌入式Linux快速入门到精通 | Lin…...
解决 MySQL 数据库无法远程连接的问题
在使用 MySQL 数据库时,遇到这样的问题: 本地可以连接 MySQL,但远程机器连接时,总是报错 Host ... is not allowed to connect to this MySQL server。 这通常是因为 MySQL 的用户权限或配置限制了远程访问。 1. 登录 MySQL 数据…...
分享一款开源的图片去重软件 ImageContrastTools,基于Electron和hash算法
最近发现个挺实在的图片查重软件,叫ImageContrastTools。电脑手机都能用,特别适合整理乱七八糟的相册。直接去这里下载就能用: https://github.com/html365/ImageContrastTools 功能说明: 1️⃣ 选个文件夹就能自动扫重复图&…...
软件测试——用例篇(2)
目录 一、基于需求的设计方法 1.1设计账号注册、账号登录的测试用例 1.1.1功能测试 1.1.2界面测试 1.1.3性能测试 1.1.4兼容性测试 1.1.5易用性测试 1.1.6安全测试 一、基于需求的设计方法 根据参考需求文档/产品规格说明书来设计测试用例 测试人员接到需求之后、对需求…...
图像匹配导航定位技术 第 11 章
第 11 章 基 于 改 进 SIFT 的 SAR 与 可 见光 图 像 匹 配 控 制 点 定 位 算 法 HOG 描述子也只是对整幅图像的特征向量进行匹配,但是仍然存在局部匹配误差。而局部不变特征(如 SIFT,Harris 等)是对特征点局部邻域的特征进行描述来构造局部…...
安装jdk步骤
将Linux安装jdk的步骤放入shell脚本中 #!/bin/bash # 阿里云服务器专用 - 全自动安装 OpenJDK 1.8(无交互) # 仅支持 yum 系系统(CentOS/RHEL/Alibaba Cloud Linux)# 检查 root 权限 if [ "$(id -u)" -ne 0 ]; thenech…...
理解 `.sln` 和 `.csproj`:从项目结构到构建发布的一次梳理
理解 .sln 和 .csproj:从项目结构到构建发布的一次梳理 在初学 .NET 项目开发时,很多人都会对 .sln(解决方案)和 .csproj(项目)文件感到疑惑。随着开发经验的积累,我逐渐理解了这些层级的设计意…...
高频算法面试题总结
高频算法面试题总结 排序算法 1. 基础排序算法 快速排序: public void quickSort(int[] arr, int low, int high) {if (low < high) {int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 1, high);} }平均时间复杂度:O(n lo…...
SQL进阶:如何把字段中的键值对转为JSON格式?
JSON 一、问题描述二、ORACLE<一>、键值对拆分(REGEXP_SUBSTR)<二>、转为JSON<三>、不足 三、MYSQL<一>、键值对拆分(RECURSIVE)<二>、转为JSON 一、问题描述 假如某张表的某列是键值对数据,如何把这个键值对转为json格式,数据如下所示 dynast…...
vue3:十二、图形看板- echart图表-柱状图、饼图
一、效果 如图展示增加了饼图和柱状图,并且优化了浏览器窗口大小更改,图表随着改变 二、 饼图 1、新建组件文件 新增组件EchartsExaminePie.vue,用于存储审核饼图的图表 2、写入组件信息 (1)视图层 写入一个div,写入变量chart和图表宽高 <template><div ref…...
nacos-server-2.2.2.tar及使用方式
下载链接 nacos-server-2.2.2.tar包及使用资源-CSDN文库 下载与安装 下载地址:可从 Nacos 官网版本下载页面 或 Nacos GitHub Releases 获取 nacos-server-2.2.2.tar.gz 安装包。 环境准备:Nacos 依赖 Java 环境运行,需确保安装了 64 位 J…...
el-form的label星号位置如何修改
默认情况 修改后 实现代码 .el-form {.el-form-item {.el-form-item__label {padding: 0;&::before {float: none;position: relative;}}} }...
小刚说C语言刷题—1004阶乘问题
1.题目描述 编程求 123⋯n 。 输入 输入一行,只有一个整数 n(1≤n≤10); 输出 输出只有一行(这意味着末尾有一个回车符号),包括 1 个整数。 样例 输入 5 输出 120 2.参考代码(C语言版) #include <stdio…...
Java 集合体系深度解析面试篇
一、Java 集合体系核心架构与高频考点 1. 集合体系架构图(大厂必问) Java集合框架 ├─ Collection(单列集合) │ ├─ List(有序、可重复) │ │ ├─ ArrayList(动态数组,随机…...
websocketd 10秒教程
websocketd 参考地址:joewalnes/websocketd 官网地址:websocketd websocketd简述 websocketd是一个简单的websocket服务Server,运行在命令行方式下,可以通过websocketd和已经有程序进行交互。 现在,可以非常容易地构…...
PCA降维
主成分分析(Principal Component Analysis,PCA)降维是一种广泛使用的无监督机器学习技术,主要用于数据预处理阶段,其目的是在尽量保留数据重要信息的前提下,减少数据的维度。 PCA 的原理 PCA 的核心思想…...
【计算机视觉】OpenCV实战项目: opencv-text-deskew:实时文本图像校正
opencv-text-deskew:基于OpenCV的实时文本图像校正 一、项目概述与技术背景1.1 核心功能与创新点1.2 技术指标对比1.3 技术演进路线 二、环境配置与算法原理2.1 硬件要求2.2 软件部署2.3 核心算法流程 三、核心算法解析3.1 文本区域定位3.2 角度检测优化3.3 仿射变换…...
具身智能时代的机器人导航和操作仿真器综述
系列文章目录 前言 导航和操作是具身智能的核心能力,然而在现实世界中训练具有这些能力的智能体却面临着高成本和时间复杂性。因此,从模拟到现实的转移已成为一种关键方法,但模拟到现实的差距依然存在。本调查通过分析以往调查中忽略的物理模…...
Go语言Stdio传输MCP Server示例【Cline、Roo Code】
Go语言 Stdio 传输 MCP Server 示例 AI 应用开发正处于加速发展阶段,新技术和新方法不断涌现。Model Context Protocol (MCP) 作为一个开放标准,正在改变 AI 应用与数据源和工具集成的方式。 Go-MCP 是一个 MCP 协议的 GO 实现&…...
Xcode16.3配置越狱开发环境
首先先在https://developer.apple.com/xcode/resources/ 这里面登陆Apple账号,然后访问url下载 https://download.developer.apple.com/Developer_Tools/Xcode_16.3/Xcode_16.3.xip 1、安装theos https://theos.dev/docs/installation-macos 会安装到默认位置~/th…...
AWS IoT Core与MSK跨账号集成:突破边界的IoT数据处理方案
随着企业规模的扩大和业务的复杂化,跨账号资源访问成为云架构中的一个常见需求。本文将深入探讨如何实现AWS IoT Core与Amazon MSK(Managed Streaming for Apache Kafka)的跨账号集成,为您的IoT数据处理方案开辟新的可能性。无论您是正在构建多账号架构,还是需要整合不同部门的…...
【Python 列表(List)】
Python 中的列表(List)是最常用、最灵活的有序数据集合,支持动态增删改查操作。以下是列表的核心知识点: 一、基础特性 有序性:元素按插入顺序存储可变性:支持增删改操作允许重复:可存储重复元…...
在另一个省发布抖音作品,IP属地会随之变化吗?
你是否曾有过这样的疑惑:出差旅游时在外地发布了一条抖音视频,评论区突然冒出“IP怎么显示xx省了?”的提问?随着各大社交平台上线“IP属地”功能,用户的地理位置标识成为公开信息,而属地显示的“灵敏性”也…...
在线工具源码_字典查询_汉语词典_成语查询_择吉黄历等255个工具数百万数据 养站神器,安装教程
在线工具源码_字典查询_汉语词典_成语查询_择吉黄历等255个工具数百万数据 养站神器,安装教程 资源宝分享:https://www.httple.net/154301.html 一次性打包涵盖200个常用工具!无论是日常的图片处理、文件格式转换,还是实用的时间…...
D720201 PCIE 转USB HUB
1. 启动时出现了下面错误 [ 4.682595] pcieport 0004:00:00.0: Signaling PME through PCIe PME interrupt [ 4.684939] pci 0004:01:00.0: Signaling PME through PCIe PME interrupt [ 4.691287] pci 0004:01:00.0: enabling device (0000 -> 0002) [ 5.2962…...
QT事件介绍及实现字体放大缩小(滚轮)
使用update是为了回调paintEvent这个事件函数 pic.load是加载一张图片 setfixedsize(pic.siez())是为了把按键的矩形区域变成和pic一样大 painter.drawPixmap(rec(),pic)就是在按键的矩形区域画一个pic emit clicked();是用来发送clicked信号的,当然你也可以在事…...
p2p虚拟服务器
ZeroTier Central ✅ 推荐工具:ZeroTier(免费、稳定、跨平台) ZeroTier 可以帮你把多台设备(无论是否跨网)加入一个虚拟局域网,彼此间可以像在同一个 LAN 中通信,UDP 视频、文件传输、SSH 等都…...
高尔夫基本知识及规则·棒球1号位
高尔夫与棒球的结合看似跨界,但两者在规则、策略和运动哲学上存在有趣的关联性。以下从五个角度进行对比分析,揭示它们的异同与潜在联系: 一、核心目标的对比性结合 高尔夫:以最少击球次数完成18洞(标准杆72杆左右&am…...
数据结构(1)复杂度
一、数据结构概要 1.数据结构 数据结构是计算机存储、组织数据的方式,是数据相互之间存在一种或者多种特定关系的集合。没有一种单一的数据结构可以解决所有问题,因此要学习多种多样的数据结构。如:线性表、图、树等。 2.算法 算法其实就…...
多分类问题softmax传递函数+交叉熵损失
在多分类问题中,Softmax 函数通常与交叉熵损失函数结合使用。 Softmax 函数 Softmax 函数是一种常用的激活函数,主要用于多分类问题中。它将一个实数向量转换为概率分布,使得每个元素的值在 0 到 1 之间,且所有元素的和为 1。 …...
Java如何获取电脑分辨率?
以下是一个 Java 程序示例,用于获取电脑的主屏幕分辨率: import java.awt.*; public class ScreenResolutionExample { public static void main(String[] args) { // 获取默认的屏幕设备 GraphicsDevice device GraphicsEnvironm…...
【NextPilot日志移植】logged_topics.cpp解析
📘 PX4 Logger 模块注册 uORB 主题、实际订阅与数据采集流程 🧭 目的与背景 在 PX4 飞控中,日志记录模块 logger 需要记录多个 uORB 主题的数据(如 IMU、GPS、姿态等)。为了系统统一管理这些记录需求,log…...
CSS vertical-align
这里的小空白就是为了和基线对齐 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&quo…...
“工作区”升级为“磁盘”、数据集统计概览优化|ModelWhale 版本更新
本次更新围绕用户在实际项目中对平台的理解和管理体验进行了多项优化。 “工作区”升级为“磁盘”、及其管理优化 平台“工作区”概念正式更名为“磁盘”,突出其存储功能。原有以目录代称的存储区域划分同步更名,其中“work目录”更改为“个人磁盘”&am…...
mac 电脑如何打开剪切板
mac 不像 Windows 拥有官方的剪贴板应用。所以我们需要使用官方商店中的第三方应用实现剪切板管理的功能。 打开苹果电脑上的 App Store,下载 PasteMe 或 Paste 等复制历史记录的管理工具。(PasteMe 为买断制18元,Paste为订阅制,…...