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

鸿蒙OSUniApp 制作简洁高效的标签云组件#三方框架 #Uniapp

UniApp 制作简洁高效的标签云组件

在移动端应用中,标签云(Tag Cloud)是一种常见的UI组件,它以视觉化的方式展示关键词或分类,帮助用户快速浏览和选择感兴趣的内容。本文将详细讲解如何在UniApp框架中实现一个简洁高效的标签云组件,并探讨其实际应用场景。

前言

最近在做一个社区类App时,产品经理提出了一个需求:需要在首页展示热门话题标签,并且要求这些标签能够根据热度有不同的展示样式。起初我想到的是直接用现成的组件库,但翻遍了各大组件市场,却没找到一个既美观又符合我们需求的标签云组件。

无奈之下,只能自己动手来实现这个功能。经过几天的摸索和优化,终于做出了一个既简洁又实用的标签云组件。今天就把这个过程分享给大家,希望能对你有所帮助。

需求分析

在开始编码前,我们先来明确一下标签云组件应具备的核心功能:

  1. 灵活的布局:标签能够自动换行,适应不同尺寸的屏幕
  2. 可定制的样式:支持自定义颜色、大小、边框等样式
  3. 支持点击事件:点击标签能触发相应的操作
  4. 热度展示:能够根据标签的权重/热度展示不同的样式
  5. 性能优化:即使有大量标签,也不会影响应用性能

有了这些需求后,我们就可以开始设计并实现这个组件了。

基础组件实现

首先,我们创建一个标签云组件文件 tag-cloud.vue

<template><view class="tag-cloud-container"><view v-for="(item, index) in tags" :key="index"class="tag-item":class="[`tag-level-${item.level || 0}`, item.active ? 'active' : '']":style="getTagStyle(item)"@tap="handleTagClick(item, index)"><text>{{ item.name }}</text><text v-if="showCount && item.count" class="tag-count">({{ item.count }})</text></view></view>
</template><script>
export default {name: 'TagCloud',props: {// 标签数据tags: {type: Array,default: () => []},// 是否显示标签数量showCount: {type: Boolean,default: false},// 自定义颜色配置colorMap: {type: Array,default: () => ['#8a9aa9', '#61bfad', '#f8b551', '#ef6b73', '#e25c3d']},// 最大字体大小 (rpx)maxFontSize: {type: Number,default: 32},// 最小字体大小 (rpx)minFontSize: {type: Number,default: 24}},methods: {// 处理标签点击事件handleTagClick(item, index) {this.$emit('click', { item, index });},// 获取标签样式getTagStyle(item) {const level = item.level || 0;const style = {};// 根据level确定字体大小if (this.maxFontSize !== this.minFontSize) {const fontStep = (this.maxFontSize - this.minFontSize) / 4;style.fontSize = `${this.minFontSize + level * fontStep}rpx`;}// 设置标签颜色if (this.colorMap.length > 0) {const colorIndex = Math.min(level, this.colorMap.length - 1);style.color = this.colorMap[colorIndex];style.borderColor = this.colorMap[colorIndex];}return style;}}
}
</script><style lang="scss">
.tag-cloud-container {display: flex;flex-wrap: wrap;padding: 20rpx 10rpx;.tag-item {display: inline-flex;align-items: center;padding: 10rpx 20rpx;margin: 10rpx;border-radius: 30rpx;background-color: #f8f8f8;border: 1px solid #e0e0e0;font-size: 28rpx;color: #333333;transition: all 0.2s ease;&.active {color: #ffffff;background-color: #007aff;border-color: #007aff;}.tag-count {margin-left: 6rpx;font-size: 0.9em;opacity: 0.8;}}// 为不同级别的标签设置默认样式.tag-level-0 {opacity: 0.8;}.tag-level-1 {opacity: 0.85;}.tag-level-2 {opacity: 0.9;font-weight: 500;}.tag-level-3 {opacity: 0.95;font-weight: 500;}.tag-level-4 {opacity: 1;font-weight: 600;}
}
</style>

这个基础组件实现了我们需要的核心功能:

  • 标签以流式布局展示,自动换行
  • 根据传入的level属性设置不同级别的样式
  • 支持自定义颜色和字体大小
  • 点击事件封装,可传递给父组件处理

标签数据处理

标签云组件的核心在于如何根据标签的权重/热度来设置不同的视觉效果。一般来说,我们会根据标签出现的频率或者其他自定义规则来计算权重。下面是一个简单的处理函数:

/*** 处理标签数据,计算每个标签的级别* @param {Array} tags 原始标签数据* @param {Number} levelCount 级别数量,默认为5* @return {Array} 处理后的标签数据*/
function processTagData(tags, levelCount = 5) {if (!tags || tags.length === 0) return [];// 找出最大和最小count值let maxCount = 0;let minCount = Infinity;tags.forEach(tag => {if (tag.count > maxCount) maxCount = tag.count;if (tag.count < minCount) minCount = tag.count;});// 如果最大最小值相同,说明所有标签权重一样if (maxCount === minCount) {return tags.map(tag => ({...tag,level: 0}));}// 计算每个标签的级别const countRange = maxCount - minCount;const levelStep = countRange / (levelCount - 1);return tags.map(tag => ({...tag,level: Math.min(Math.floor((tag.count - minCount) / levelStep),levelCount - 1)}));
}

这个函数会根据标签的count属性,将所有标签分为0-4共5个级别,我们可以在使用组件前先对数据进行处理。

使用标签云组件

接下来,让我们看看如何在页面中使用这个组件:

<template><view class="page-container"><view class="section-title">热门话题</view><tag-cloud :tags="processedTags" :color-map="colorMap":show-count="true"@click="onTagClick"></tag-cloud></view>
</template><script>
import TagCloud from '@/components/tag-cloud.vue';export default {components: {TagCloud},data() {return {tags: [{ name: '前端开发', count: 120 },{ name: 'Vue', count: 232 },{ name: 'UniApp', count: 180 },{ name: '小程序', count: 156 },{ name: 'React', count: 98 },{ name: 'Flutter', count: 76 },{ name: 'JavaScript', count: 210 },{ name: 'CSS', count: 89 },{ name: 'TypeScript', count: 168 },{ name: '移动开发', count: 143 },{ name: '云开发', count: 58 },{ name: '性能优化', count: 112 }],colorMap: ['#8a9aa9', '#61bfad', '#f8b551', '#ef6b73', '#e25c3d']}},computed: {processedTags() {// 调用上面定义的处理函数return this.processTagData(this.tags);}},methods: {processTagData(tags, levelCount = 5) {// 这里是上面定义的标签处理函数// ...函数内容同上...},onTagClick({ item, index }) {console.log(`点击了标签: ${item.name}, 索引: ${index}`);uni.showToast({title: `你选择了: ${item.name}`,icon: 'none'});// 这里可以进行页面跳转或其他操作// uni.navigateTo({//   url: `/pages/topic/topic?name=${encodeURIComponent(item.name)}`// });}}
}
</script><style lang="scss">
.page-container {padding: 30rpx;.section-title {font-size: 34rpx;font-weight: bold;margin-bottom: 20rpx;color: #333;}
}
</style>

进阶:随机颜色与布局

标签云还有一种常见的效果是随机颜色和随机大小。下面我们来实现这个功能:

// 在组件的methods中添加如下方法// 获取随机颜色
getRandomColor() {const colors = ['#61bfad', '#f8b551', '#ef6b73', '#8a9aa9', '#e25c3d', '#6cc0e5', '#fb6e50', '#f9cb8b'];return colors[Math.floor(Math.random() * colors.length)];
},// 修改getTagStyle方法
getTagStyle(item) {const style = {};if (this.random) {// 随机模式style.fontSize = `${Math.floor(Math.random() * (this.maxFontSize - this.minFontSize) + this.minFontSize)}rpx`;style.color = this.getRandomColor();style.borderColor = style.color;} else {// 原有的level模式const level = item.level || 0;if (this.maxFontSize !== this.minFontSize) {const fontStep = (this.maxFontSize - this.minFontSize) / 4;style.fontSize = `${this.minFontSize + level * fontStep}rpx`;}if (this.colorMap.length > 0) {const colorIndex = Math.min(level, this.colorMap.length - 1);style.color = this.colorMap[colorIndex];style.borderColor = this.colorMap[colorIndex];}}return style;
}

然后在props中添加random属性:

// 添加到props中
random: {type: Boolean,default: false
}

这样,当设置 randomtrue 时,标签就会以随机颜色和大小展示,增加视觉的多样性。

实现可选中的标签云

在某些场景下,我们需要标签支持选中功能,比如在筛选器中。我们可以对组件进行扩展:

<template><!-- 添加多选模式 --><view class="tag-cloud-container"><view v-for="(item, index) in internalTags" :key="index"class="tag-item":class="[`tag-level-${item.level || 0}`, item.selected ? 'selected' : '',selectable ? 'selectable' : '']":style="getTagStyle(item)"@tap="handleTagClick(item, index)"><text>{{ item.name }}</text><text v-if="showCount && item.count" class="tag-count">({{ item.count }})</text></view></view>
</template><script>
export default {// ... 现有代码 ...props: {// ... 现有props ...// 是否支持选中selectable: {type: Boolean,default: false},// 最大可选数量,0表示不限制maxSelectCount: {type: Number,default: 0},// 选中的标签值数组value: {type: Array,default: () => []}},data() {return {// 内部维护的标签数据,添加selected状态internalTags: []};},watch: {tags: {immediate: true,handler(newVal) {this.initInternalTags();}},value: {handler(newVal) {this.syncSelectedStatus();}}},methods: {// 初始化内部标签数据initInternalTags() {this.internalTags = this.tags.map(tag => ({...tag,selected: this.value.includes(tag.name)}));},// 同步选中状态syncSelectedStatus() {if (!this.selectable) return;this.internalTags.forEach(tag => {tag.selected = this.value.includes(tag.name);});},// 修改标签点击处理逻辑handleTagClick(item, index) {if (this.selectable) {// 处理选中逻辑const newSelected = !item.selected;// 检查是否超出最大选择数量if (newSelected && this.maxSelectCount > 0) {const currentSelectedCount = this.internalTags.filter(t => t.selected).length;if (currentSelectedCount >= this.maxSelectCount) {uni.showToast({title: `最多只能选择${this.maxSelectCount}个标签`,icon: 'none'});return;}}// 更新选中状态this.$set(this.internalTags[index], 'selected', newSelected);// 构建新的选中值数组const selectedValues = this.internalTags.filter(tag => tag.selected).map(tag => tag.name);// 触发input事件,支持v-modelthis.$emit('input', selectedValues);}// 触发点击事件this.$emit('click', { item: this.internalTags[index], index,selected: this.internalTags[index].selected});}}
}
</script><style lang="scss">
.tag-cloud-container {// ... 现有样式 ....tag-item {// ... 现有样式 ...&.selectable {cursor: pointer;user-select: none;&:hover {opacity: 0.8;}}&.selected {color: #ffffff;background-color: #007aff;border-color: #007aff;}}
}
</style>

这样,我们的标签云就支持了多选模式,并且可以通过v-model进行双向绑定。

实战案例:兴趣标签选择器

最后,我们来看一个实际应用案例 - 用户注册时的兴趣标签选择:

<template><view class="interest-selector"><view class="title">选择你感兴趣的话题</view><view class="subtitle">选择3-5个你感兴趣的话题,我们将为你推荐相关内容</view><tag-cloud:tags="interestTags":selectable="true":max-select-count="5"v-model="selectedInterests"@click="onInterestTagClick"></tag-cloud><view class="selected-count">已选择 {{ selectedInterests.length }}/5 个话题</view><button class="confirm-btn" :disabled="selectedInterests.length < 3"@tap="confirmSelection">确认选择</button></view>
</template><script>
import TagCloud from '@/components/tag-cloud.vue';export default {components: {TagCloud},data() {return {interestTags: [{ name: '科技', count: 1250 },{ name: '体育', count: 980 },{ name: '电影', count: 1560 },{ name: '音乐', count: 1320 },{ name: '美食', count: 1480 },{ name: '旅行', count: 1280 },{ name: '摄影', count: 860 },{ name: '游戏', count: 1420 },{ name: '时尚', count: 760 },{ name: '健身', count: 890 },{ name: '阅读', count: 720 },{ name: '动漫', count: 830 },{ name: '宠物', count: 710 },{ name: '财经', count: 680 },{ name: '汽车', count: 590 },{ name: '育儿', count: 520 },{ name: '教育', count: 780 },{ name: '历史', count: 650 }],selectedInterests: []}},created() {// 处理标签数据,设置levelthis.interestTags = this.processTagData(this.interestTags);},methods: {processTagData(tags, levelCount = 5) {// ... 标签处理函数,同上 ...},onInterestTagClick({ item, selected }) {console.log(`${selected ? '选中' : '取消选中'}标签: ${item.name}`);},confirmSelection() {if (this.selectedInterests.length < 3) {uni.showToast({title: '请至少选择3个感兴趣的话题',icon: 'none'});return;}// 保存用户选择的兴趣标签uni.showLoading({title: '保存中...'});// 模拟API请求setTimeout(() => {uni.hideLoading();uni.showToast({title: '保存成功',icon: 'success'});// 跳转到首页setTimeout(() => {uni.reLaunch({url: '/pages/index/index'});}, 1500);}, 1000);}}
}
</script><style lang="scss">
.interest-selector {padding: 40rpx;.title {font-size: 40rpx;font-weight: bold;margin-bottom: 20rpx;}.subtitle {font-size: 28rpx;color: #666;margin-bottom: 50rpx;}.selected-count {text-align: center;margin: 30rpx 0;font-size: 28rpx;color: #666;}.confirm-btn {margin-top: 60rpx;background-color: #007aff;color: #fff;&[disabled] {background-color: #cccccc;color: #ffffff;}}
}
</style>

性能优化

当标签数量很多时,可能会遇到性能问题。以下是几个优化建议:

  1. 虚拟列表:对于特别多的标签(如上百个),可以考虑使用虚拟列表,只渲染可视区域内的标签。
  2. 懒加载:分批次加载标签,初始只加载一部分,用户滑动时再加载更多。
  3. 避免频繁重新渲染:减少不必要的标签状态更新,特别是在选中标签时。

下面是一个简单的虚拟列表实现思路:

// 在标签云组件中添加懒加载支持
props: {// ... 现有props ...lazyLoad: {type: Boolean,default: false},loadBatchSize: {type: Number,default: 20}
},
data() {return {// ... 现有data ...visibleTags: [],loadedCount: 0}
},
watch: {internalTags: {handler(newVal) {if (this.lazyLoad) {// 初始加载第一批this.loadMoreTags();} else {this.visibleTags = newVal;}},immediate: true}
},
methods: {// ... 现有methods ...loadMoreTags() {if (this.loadedCount >= this.internalTags.length) return;const nextBatch = this.internalTags.slice(this.loadedCount,this.loadedCount + this.loadBatchSize);this.visibleTags = [...this.visibleTags, ...nextBatch];this.loadedCount += nextBatch.length;},// 监听滚动到底部onScrollToBottom() {if (this.lazyLoad) {this.loadMoreTags();}}
}

然后在模板中使用 visibleTags 替代 internalTags,并监听滚动事件。

总结与优化建议

通过本文,我们实现了一个功能完善的标签云组件,它具有以下特点:

  1. 灵活的布局:自动换行,适应不同尺寸的屏幕
  2. 多样化的样式:支持根据标签热度/权重展示不同样式
  3. 交互功能:支持点击、选中等交互
  4. 性能优化:考虑了大数据量下的性能问题

实际应用中,还可以根据具体需求进行以下优化:

  1. 动画效果:添加标签hover/点击动画,提升用户体验
  2. 拖拽排序:支持拖拽调整标签顺序
  3. 搜索过滤:添加搜索框,快速筛选标签
  4. 分类展示:按类别分组展示标签
  5. 数据持久化:将用户选择的标签保存到本地或服务器

标签云组件看似简单,但能够在很多场景中发挥重要作用,比如:

  • 用户兴趣标签选择
  • 文章标签展示
  • 商品分类快速入口
  • 数据可视化展示
  • 关键词筛选器

希望这篇文章能够帮助你在UniApp中实现自己的标签云组件。如果有任何问题或改进建议,欢迎在评论区交流讨论!

相关文章:

鸿蒙OSUniApp 制作简洁高效的标签云组件#三方框架 #Uniapp

UniApp 制作简洁高效的标签云组件 在移动端应用中&#xff0c;标签云&#xff08;Tag Cloud&#xff09;是一种常见的UI组件&#xff0c;它以视觉化的方式展示关键词或分类&#xff0c;帮助用户快速浏览和选择感兴趣的内容。本文将详细讲解如何在UniApp框架中实现一个简洁高效的…...

【测试】用例篇

目录 1、如何编写测试用例&#xff1a; 1.1、设计测试用例时&#xff1a;正向思维逆向思维发散思维 2.2、万能公式 2、设计测试用例的方法 2.1、基于需求设计方法 1&#xff09;等价类: 2&#xff09;边界类 3&#xff09;场景法 4&#xff09;正交表法 5&#xff09;…...

力扣-46.全排列

题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 class Solution {List<List<Integer>> res new ArrayList<>();List<Integer> path new ArrayList<>();void backtracking(i…...

【氮化镓】HfO2钝化优化GaN 器件性能

2025年,南洋理工大学的Pradip Dalapati等人在《Applied Surface Science》期刊发表了题为《Role of ex-situ HfO2 passivation to improve device performance and suppress X-ray-induced degradation characteristics of in-situ Si3N4/AlN/GaN MIS-HEMTs》的文章。该研究基…...

STL?list!!!

一、引言 之前我们一起完成了STL库中的vector&#xff0c;本期我们将一起完成list这一容器&#xff0c;在本期学习中&#xff0c;我们会更加加深对于模板的认识&#xff0c;让我们更加能感受到模板的魅力&#xff01; 二、list的介绍与相关接口 list是STL库中提供的一个链表容…...

2025.05.14华为机考笔试题-第一题-100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 优先级任务调度系统 问题描述 LYA公司的开发团队正在设计一个智能任务调度系统。该系统需要根据任务优先级动态调整执行顺序,以提高团队工作效率。系统需要支持以下三种操作:…...

紫外相机工作原理及可应用范围

紫外相机是一种利用紫外线&#xff08;UV&#xff09;波段进行成像的设备&#xff0c;紫外线可用于机器视觉应用中&#xff0c;以检测使用可见光无法检测到的特征&#xff0c;工业上使用最常见的紫外波长是365nm和395nm。紫外相机通常用于高分辨率视频显微镜、电晕检测、半导体…...

海外短剧H5/App开源系统搭建指南:多语言+国际支付+极速部署

在全球短视频与短剧内容消费热潮下&#xff0c;搭建一个支持多语言、集成国际支付且能快速部署的海外短剧平台&#xff0c;已成为内容创作者和运营者的核心需求。本文将结合行业前沿技术与开源方案&#xff0c;提供一套完整的系统搭建指南&#xff0c;助您高效实现全球化布局 …...

AWS EC2 微服务 金丝雀发布(Canary Release)方案

为什么需要实现金丝雀发布? 在当前项目的工程实践中, 已经有了充分的单元测试, 预发布环境测试, 但是还是会在线上环境出现非预期的情况, 导致线上事故, 因此, 为了提升服务质量, 需要线上能够有一个预验证的机制. 如何实现金丝雀发布? 使用AWS code deploy方案 AWS code…...

2025年5月华为H12-821新增题库带解析

IS-IS核心知识 四台路由器运行IS-IS且已经建立邻接关系&#xff0c;区域号和路由器的等级如图中标记&#xff0c;下列说法中正确的有? R2和R3都会产生ATT置位的Level-1的LSPR1没有R4产生的LSP&#xff0c;因此R1只通过缺省路由和R4通信R2和R3都会产生ATT置位的Leve1-2的LSPR2和…...

从单体架构到微服务:架构演进之路

引言&#xff1a;当“大货车”遇上“集装箱运输” 在软件开发领域&#xff0c;单体架构曾像一辆载满货物的大货车&#xff0c;将所有功能打包在一个应用中。但随着业务复杂度飙升&#xff0c;这辆“大货车”逐渐陷入泥潭&#xff1a;启动慢如蜗牛、故障波及全局、升级如履薄冰……...

从 Excel 到 Data.olllo:数据分析师的提效之路

背景&#xff1a;Excel 的能力边界 对许多数据分析师而言&#xff0c;Excel 是入门数据处理的第一工具。然而&#xff0c;随着业务数据量的增长&#xff0c;Excel 的一些固有限制逐渐显现&#xff1a; 操作容易出错&#xff0c;难以审计&#xff1b; 打开或操作百万行数据时&…...

Uniapp开发鸿蒙购物项目教程之样式选择器

大家好&#xff0c;今天依然为大家带来鸿蒙跨平台开发教程的分享&#xff0c;我们本系列的教程最终要做一个购物应用&#xff0c;通过这个项目为大家分享uniapp开发鸿蒙应用从配置开发环境到应用打包上架的完成过程。 昨天的文章实现了应用首页的轮播图&#xff0c;其中涉及到…...

AI全域智能监控系统重构商业清洁管理范式——从被动响应到主动预防的监控效能革命

一、四维立体监控网络技术架构 1. 人员行为监控 - 融合人脸识别、骨骼追踪与RFID工牌技术&#xff0c;身份识别准确率99.97% - 支持15米超距夜间红外监控&#xff08;精度0.01lux&#xff09; 2. 作业过程监控 - UWB厘米级定位技术&#xff08;误差&#xff1c;0.3米&…...

协作赋能-1-制造业生产流程重构

制造业生产流程重构——从“信息孤岛”到“全链协同” 在制造业的数字化转型浪潮中&#xff0c;一个看似矛盾的现象正在蔓延&#xff1a;企业部署了ERP、MES、PLM等管理系统&#xff0c;却仍未摆脱“纸质工单满天飞、跨部门扯皮不断”的困境。以汽车制造业为例&#xff0c;其…...

游戏行业DDoS攻击类型及防御分析

游戏行业作为DDoS攻击的高发领域&#xff0c;攻击类型复杂多样&#xff0c;结合多个来源的信息&#xff0c;以下是其主要攻击类型及特征分析&#xff1a; 1. 传统流量型DDoS攻击 UDP洪水攻击&#xff1a;通过大量UDP报文淹没服务器端口&#xff0c;消耗带宽资源&#xff0c;导…...

嵌入式学习的第二十一天-数据结构-双向链表

一、双向链表 1.定义 双向链表是在单链表的每个结点中&#xff0c;再设置一个指向其钱去节点的指针域。 typedef struct DulNode {ElemType date;struct DulNode *pri;//直接前驱指针sturct DulNode *next&#xff1b;//直接后继指针 }DulNode,*DuLinkList;2.双向链表的创建 …...

Python爬虫第21节- 基础图形验证码识别实战

目录 前言 一、学习目标 二、环境准备 2.1 安装依赖 2.2 验证安装 三、获取验证码图片 3.1 常见获取方式 3.2 图片格式要求 四、基础识别流程 4.1 基础流程 4.2 常见问题及解决方案 五、 图像预处理提升识别率 5.1 灰度化 5.2 二值化 5.3 自定义阈值二值化 5.4…...

【React全栈进阶】从组件设计到性能优化实战指南

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…...

基于EFISH-SCB-RK3576/SAIL-RK3576的消防机器人控制器技术方案‌

&#xff08;国产化替代J1900的应急救援智能化解决方案&#xff09; 一、硬件架构设计‌ ‌极端环境防护系统‌ ‌防爆耐高温设计‌&#xff1a; 采用陶瓷纤维复合装甲&#xff08;耐温1200℃持续1小时&#xff09;&#xff0c;通过GB 26784-2023消防设备防爆认证IP68防护等级…...

插件双更新:LeetCode 刷题支持正式上线,JetBrains IDE 插件持续升级!

为了让更多开发者在真实开发与算法练习中体验 MoonBit 的高效表达与编译性能&#xff0c;MoonBit 语言现已实现对 JetBrains 开发环境与 LeetCode 答题平台的全面支持&#xff01; 无论你是习惯用 IDE 编写项目的开发者&#xff0c;还是希望通过 LeetCode 刷题提升算法能力的程…...

编译OpenSSL时报错,Can‘t locate IPC/Cmd.pm in @INC perl环境

Unix / Linux / macOS $ ./Configure $ make $ make test1、make Can‘t locate IPC/Cmd.pm in INC [ Downloads ] - /source/index.html https://www.openssl.org/source/ yum -y install perl-IPC-Cmd 2.make test Can’t locate Test/More.pm in INC perl环境 yum -…...

新型智慧园区技术架构深度解析:数字孪生与零碳科技的融合实践

&#x1f3ed;在杭州亚运村零碳园区&#xff0c;光伏板与氢燃料大巴构成的能源网络&#xff0c;正通过数字孪生技术实现智能调度。这不仅是格力电器与龙源电力在新能源领域的创新实践&#xff0c;更是智慧园区4.0时代的标杆案例。当AI算法开始接管能源调度&#xff0c;当BIM建模…...

2025全网首发:ComfyUI整合GPT-Image-1完全指南 - 8步实现AI图像创作革命

ComfyUI整合GPT-Image-1完全指南&#xff1a;8步实现AI图像创作革命【2025最新】 OpenAI最新发布的GPT-Image-1模型&#xff08;也就是ChatGPT-4o背后的图像生成技术&#xff09;已经通过API开放使用&#xff0c;而令人惊喜的是&#xff0c;ComfyUI已经第一时间提供了完整支持&…...

AWS Elastic Beanstalk控制台部署Spring极简工程

问题 上次通过EB CLI工具没有成功在AWS中国云部署成功&#xff0c;这次通过EB web控制台来部署。 步骤 接着上次部署失败的Spring工程&#xff1a;AWS Elastic Beanstalk部署极简Spring工程&#xff08;EB CLI失败版&#xff09;&#xff0c;准备好jar文件。 创建ec2私钥文…...

力扣-236.二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…...

LeetCode 3337.字符串转换后的长度 II:矩阵快速幂(也没有想象中的那么高级啦)

【LetMeFly】3337.字符串转换后的长度 II&#xff1a;矩阵快速幂(也没有想象中的那么高级啦) 力扣题目链接&#xff1a;https://leetcode.cn/problems/total-characters-in-string-after-transformations-ii/ 给你一个由小写英文字母组成的字符串 s&#xff0c;一个整数 t 表…...

【iOS】源码阅读(四)——isa与类关联的原理

文章目录 前言OC对象本质探索clang探索对象本质objc_setProperty源码探索 cls与类的关联原理为什么说bits与cls为互斥关系isa的类型isa_t原理探索isa与类的关联 总结 前言 本篇文章主要是笔者在学习和理解类与isa的关联关系时所写的笔记。 OC对象本质探索 在学习和理解类与isa…...

elementUI 循环出来的表单,怎么做表单校验?

数据结构如下&#xff1a; diversionParamList: [ { length: null, positionNumber: null, value: null, } ] 思路&#xff1a;可根据 index 动态绑定 :props 属性值&#xff0c;校验规则写在:rules <div class"config-item" v-for"(item, index) in form.…...

蓝桥杯11届国B 约数

题目描述 定义阶乘 n!123⋅⋅⋅n。 请问 100! &#xff08;100 的阶乘&#xff09;有多少个正约数 100! 是所有从 1 到 100 的数的乘积&#xff0c;因此&#xff1a; 质数 j 在 100! 中的总指数 质数 j 在 1 中的指数 质数 j 在 2 中的指数 ... 质数 j 在 100 中的指数 …...

【iOS】alloc的实际流程

目录 前言 为什么不按源码流程调用&#xff1f; alloc的调用流程 前言 在之前的博客中我们有学习到过alloc的底层原理&#xff0c;沿着源码一步步找到了alloc的调用链——alloc—>_objc_rootAlloc—>callAlloc—>_objc_rootAllocWithZone—>_class_createInstan…...

Maven clean 提示文件 java.io.IOException

Maven clean 提示文件 java.io.IOException 问题背景问题分析&处理问题总结 问题背景 今天在一个功能开发结束之后&#xff0c;准备通过Maven实现打包操作&#xff0c;然后打包完成后部署到测试环境进行测试。在IDEA开发工具&#xff0c;点击 clean 时提示 Failed to dele…...

QT 使用QPdfWriter和QPainter绘制PDF文件

QT如何生产pdf文件&#xff0c;网上有许多文章介绍&#xff0c;我也是看了网上的文章&#xff0c;看他们的代码&#xff0c;自己琢磨琢磨&#xff0c;才有了本编博客&#xff1b; 其他什么就不详细说了&#xff0c;本篇博客介绍的QPdfWriter和QPainter绘制PDF文件&#xff1b;…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- Manus技术解密

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs- Manus技术解密 如果你从应用程序的角度讲&#xff0c;但是如果我们从模型的角度讲&#xff0c;我们必须让模型既具有这种思考的能力&#xff0c;也具有产出这种最佳的action的这种能力。而且…...

网络安全-等级保护(等保) 2-4 GB/T 22239-2019 《信息安全技术 网络安全等级保护基础要求》-2019-05-10发布【现行】

################################################################################ 等级确定之后&#xff0c;需要根据不同的安全等级满足相关建设要求&#xff0c;《等级保护基础要求》明确了安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心、安全管…...

Ansys Zemax | 在 MATLAB 或 Python 中使用 ZOS-API 进行光线追迹的批次处理

附件下载 联系工作人员获取附件 这篇文章会说明如何在 MATLAB 或 Python 中以 Zemax OpticStudio 应用程式界面 (ZOS-API)处理光线数据库(Ray Database, ZRD)档案&#xff0c;过程中我们将使用ZRDLoader.dll。本文提供了在 Matlab 中批次处理序列光线追迹(一般、归一化、偏振…...

多链互操作性标准解析:构建下一代区块链互联生态

引言 在区块链技术快速演进的今天&#xff0c;“多链宇宙”已成为不可逆的趋势。然而&#xff0c;链与链之间的孤立性导致流动性割裂、开发成本高昂和用户体验碎片化。互操作性标准的制定&#xff0c;正是打破这一僵局的核心钥匙。本文将深入探讨主流互操作性协议的技术架构、…...

openEuler24.03 LTS下安装MySQL8.0.42

目录 前提步骤 删除原有mysql及maridb数据库 安装MySQL 启动MySQL 启动查看MySQL状态 设置MySQL开机自启动 查看登录密码 登录MySQL 修改密码及支持远程连接 远程连接MySQL 前提步骤 拥有openEuler24.03 LTS环境&#xff0c;可参考&#xff1a;Vmware下安装openEule…...

React 轻量级富文本编辑器推荐(中文版)

以下是几款适合集成到 React 项目中的轻量级富文本编辑器&#xff0c;特别针对中文用户优化推荐&#xff1a; 超轻量级选择&#xff08;小于100KB&#xff09; 1. react-simplemde-editor&#xff08;Markdown编辑器&#xff09; 特点&#xff1a;专为 Markdown 设计&#xf…...

React 第四十一节Router 中 useActionData 使用方法案例以及注意事项

一、useActionData前言 useActionData 是 React Router 提供的一个钩子函数&#xff0c;用于获取在路由的 action 函数中返回的数据。它通常与表单提交&#xff08;通过 <Form> 组件&#xff09;配合使用&#xff0c;用于处理表单提交后的服务器响应数据&#xff08;如错…...

西门子 Teamcenter13 Eclipse RCP 开发 1 工具栏

西门子 Teamcenter13 Eclipse RCP 开发 1 工具栏 1 配置文件2 插件控制3 命令框架 1 配置文件 在 Teamcenter 13 Eclipse RCP 开发中&#xff0c;plugin.xml 是插件的核心配置文件&#xff0c;定义了插件的&#xff1a; 1、唯一身份&#xff08;ID、版本&#xff09;。 2、所…...

【python实用小脚本-63】每天花费2小时修复黑白照片,Python一键转换,节省90%时间(建议收藏)

一、应用场景故事 上周&#xff0c;我的朋友小李从家里翻出了一堆老照片&#xff0c;这些照片大多是彩色的&#xff0c;但他想把它们转换成黑白风格&#xff0c;让照片更有复古感。他尝试用Photoshop一张张处理&#xff0c;但花了整整一个周末&#xff0c;才处理了不到一半的照…...

R语言的专业网站top5推荐

李升伟 以下是学习R语言的五个顶级专业网站推荐&#xff0c;涵盖教程、社区、资源库和最新动态&#xff1a; 1.R项目官网 (r-project.org) R语言的官方网站&#xff0c;提供软件下载、文档、手册和常见问题解答。特别适合初学者和高级用户&#xff0c;是获取R语言核心资源的…...

Apache JMeter API 接口压测技术指南

文章目录 前言技术积累JMeter 简介适用场景JMeter 核心组件 安装与配置线程组压测逐步加压压测安装相应jmeter 插件创建测试计划生成压测HTML 总结 前言 Apache JMeter 是一款开源的性能测试工具&#xff0c;主要用于对 Web 应用、API 接口、数据库等进行负载和压力测试。本指…...

【Java实战】IO流(转换流,打印流,数据流,序列化流)

引出问题 不同编码读取出现的乱码问题 如果是代码编码被读取的文本文件的编码是一致的&#xff0c;使用字符流读取文本文件时不会出现乱码&#xff1b; 如果不一致&#xff0c;使用字符流读取文本文件就会出现乱码。 public class BufferedReader{ public static void main(S…...

Python课程及开源项目推荐

Python课程及开源项目推荐 摘要&#xff1a;学习 Python 是一个非常好的选择&#xff0c;因为它是一种功能强大且易于上手的编程语言&#xff0c;广泛应用于数据分析、数据可视化、机器学习、网络爬虫等领域。以下是针对 Coursera 上 Python 课程和专业证书的推荐&#xff0c;以…...

内网互通原则详解!

目录 前言1. 路由 (Routing): 谁去哪儿找谁&#xff1f;&#x1f5fa;️2. 防火墙与安全组 (Firewalls & Security Groups): 门卫大爷和保安系统&#xff01;&#x1f46e;‍♂️&#x1f6aa;3. 内网 DNS (Internal DNS): 小区的通讯录/电话本&#xff01;&#x1f4d2;&a…...

[Harmony]大文件持久化

1.添加权限 在module.json5文件中添加权限 "requestPermissions": [{"name": "ohos.permission.READ_WRITE_USER_FILE", // 读写用户数据"reason": "$string:read_write_user_file_reason","usedScene": {"…...

C 语言实战:使用二维数组进行学生成绩统计与分析

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 在处理表格型数据时,二维数组是 C 语言中一种非常直观且强大的工具。学生成绩单就是一个典型的二维数据:每一行代表一个学生,每一列代表一门科目。本文将通过一个具体的案例,演示如何利用二维数组来存…...

[学习]RTKLib详解:tle.c(系列终章)

本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详解&#xff1a;pntpos.c与postpos.c [学习]RTKLib详解&…...