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

鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp

使用UniApp打造多功能图表展示组件

在当前移动应用开发领域,数据可视化已成为不可或缺的一部分。无论是展示销售数据、用户增长趋势还是其他业务指标,一个优秀的图表组件都能有效提升用户体验。UniApp作为一款跨平台开发框架,如何在其中实现功能强大且灵活的图表组件呢?本文将分享我在实际项目中的经验与思考。

为什么选择UniApp开发图表组件

传统的移动应用开发往往面临多端适配的问题。开发团队需要分别为Android、iOS甚至H5端编写不同的代码,这无疑增加了开发成本和维护难度。而UniApp提供"一次开发,多端发布"的能力,特别适合需要跨平台展示数据的应用场景。

在我参与的一个企业数据分析项目中,客户要求应用能够在各种设备上展示相同的数据图表,并且具备交互能力。这正是UniApp的优势所在。

技术选型:echarts-for-uniapp

经过调研,我选择了echarts-for-uniapp作为基础图表库。它是Apache ECharts在UniApp环境下的实现,保留了ECharts强大的功能同时解决了跨平台适配问题。

安装非常简单:

npm install echarts-for-uniapp

组件设计思路

设计一个好的图表组件,需要考虑以下几点:

  1. 高内聚低耦合 - 组件应该是独立的,只接收必要的数据和配置
  2. 易于扩展 - 能够支持多种图表类型
  3. 响应式适配 - 在不同尺寸的设备上都能良好展示
  4. 性能优化 - 处理大量数据时保持流畅

基于这些原则,我设计了一个名为ChartComponent的通用组件。

核心代码实现

首先创建基础组件结构:

<!-- components/chart/chart.vue -->
<template><view class="chart-container" :style="{ height: height, width: width }"><canvas v-if="canvasId" :canvas-id="canvasId" :id="canvasId" class="chart-canvas"></canvas><view v-if="loading" class="loading-mask"><view class="loading-icon"></view></view></view>
</template><script>
import * as echarts from 'echarts-for-uniapp';
import themes from './themes.js';export default {name: 'ChartComponent',props: {// 图表类型:line, bar, pie等type: {type: String,default: 'line'},// 图表数据chartData: {type: Object,required: true},// 图表配置项options: {type: Object,default: () => ({})},// 画布IDcanvasId: {type: String,default: 'chart' + Date.now()},// 图表宽度width: {type: String,default: '100%'},// 图表高度height: {type: String,default: '300px'},// 主题theme: {type: String,default: 'default'}},data() {return {chart: null,loading: true,resizeObserver: null};},watch: {chartData: {handler: 'updateChart',deep: true},options: {handler: 'updateChart',deep: true},theme() {this.initChart();}},mounted() {this.$nextTick(() => {this.initChart();// 监听窗口变化,实现响应式this.resizeObserver = uni.createSelectorQuery().in(this).select('.chart-container').boundingClientRect().exec((res) => {if (res[0]) {const { width, height } = res[0];this.handleResize(width, height);}});// 添加全局窗口变化监听window.addEventListener('resize', this.onWindowResize);});},beforeDestroy() {if (this.chart) {this.chart.dispose();this.chart = null;}window.removeEventListener('resize', this.onWindowResize);},methods: {initChart() {this.loading = true;// 确保上一个实例被销毁if (this.chart) {this.chart.dispose();}// 获取DOM元素uni.createSelectorQuery().in(this).select(`#${this.canvasId}`).fields({ node: true, size: true }).exec((res) => {if (!res[0] || !res[0].node) {console.error('获取canvas节点失败');return;}const canvas = res[0].node;const chart = echarts.init(canvas, themes[this.theme] || '');this.chart = chart;this.updateChart();this.loading = false;});},updateChart() {if (!this.chart) return;const options = this.generateOptions();this.chart.setOption(options, true);// 通知父组件图表已更新this.$emit('chart-ready', this.chart);},generateOptions() {// 根据不同图表类型生成基础配置let baseOptions = {};switch(this.type) {case 'line':baseOptions = this.generateLineOptions();break;case 'bar':baseOptions = this.generateBarOptions();break;case 'pie':baseOptions = this.generatePieOptions();break;// 其他图表类型...default:baseOptions = this.generateLineOptions();}// 合并用户自定义配置return {...baseOptions,...this.options};},generateLineOptions() {const { series = [], xAxis = [], legend = [] } = this.chartData;return {tooltip: {trigger: 'axis'},legend: {data: legend,bottom: 0},grid: {left: '3%',right: '4%',bottom: '10%',top: '8%',containLabel: true},xAxis: {type: 'category',boundaryGap: false,data: xAxis},yAxis: {type: 'value'},series: series.map(item => ({name: item.name,type: 'line',data: item.data,...item}))};},generateBarOptions() {const { series = [], xAxis = [], legend = [] } = this.chartData;return {tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},legend: {data: legend,bottom: 0},grid: {left: '3%',right: '4%',bottom: '10%',top: '8%',containLabel: true},xAxis: {type: 'category',data: xAxis},yAxis: {type: 'value'},series: series.map(item => ({name: item.name,type: 'bar',data: item.data,...item}))};},generatePieOptions() {const { series = [] } = this.chartData;return {tooltip: {trigger: 'item',formatter: '{a} <br/>{b}: {c} ({d}%)'},series: [{name: series.name || '数据分布',type: 'pie',radius: '50%',data: series.data || [],emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}},...series}]};},handleResize(width, height) {if (this.chart) {this.chart.resize({width,height});}},onWindowResize() {uni.createSelectorQuery().in(this).select('.chart-container').boundingClientRect().exec((res) => {if (res[0]) {const { width, height } = res[0];this.handleResize(width, height);}});}}
};
</script><style scoped>
.chart-container {position: relative;width: 100%;height: 300px;
}
.chart-canvas {width: 100%;height: 100%;
}
.loading-mask {position: absolute;top: 0;left: 0;right: 0;bottom: 0;background-color: rgba(255, 255, 255, 0.7);display: flex;justify-content: center;align-items: center;
}
.loading-icon {width: 40px;height: 40px;border: 3px solid #f3f3f3;border-top: 3px solid #3498db;border-radius: 50%;animation: spin 1s linear infinite;
}
@keyframes spin {0% { transform: rotate(0deg); }100% { transform: rotate(360deg); }
}
</style>

实际应用案例

在一个企业数据大屏项目中,我需要展示公司全年的销售数据,包括不同地区的销售额对比、月度趋势等。以下是实际使用示例:

<template><view class="dashboard"><view class="chart-item"><text class="chart-title">各地区销售额占比</text><chart-component type="pie" :chartData="regionData" height="350px"@chart-ready="onChartReady"/></view><view class="chart-item"><text class="chart-title">月度销售趋势</text><chart-component type="line" :chartData="trendData" height="350px"/></view><view class="chart-item"><text class="chart-title">产品销量对比</text><chart-component type="bar" :chartData="productData" height="350px"theme="dark"/></view></view>
</template><script>
import ChartComponent from '@/components/chart/chart.vue';export default {components: {ChartComponent},data() {return {regionData: {series: {name: '地区销售额',data: [{value: 1048, name: '华东'},{value: 735, name: '华北'},{value: 580, name: '华南'},{value: 484, name: '西北'},{value: 300, name: '西南'}]}},trendData: {xAxis: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],legend: ['目标', '实际'],series: [{name: '目标',data: [150, 130, 150, 160, 180, 170, 190, 200, 210, 200, 195, 250],smooth: true},{name: '实际',data: [120, 125, 145, 170, 165, 180, 195, 210, 205, 215, 225, 240],smooth: true}]},productData: {xAxis: ['产品A', '产品B', '产品C', '产品D', '产品E'],legend: ['2022年', '2023年'],series: [{name: '2022年',data: [120, 200, 150, 80, 70]},{name: '2023年',data: [150, 180, 200, 135, 90]}]}};},methods: {onChartReady(chart) {console.log('图表实例已就绪', chart);// 可以进行额外的图表实例操作}}
};
</script><style>
.dashboard {padding: 20rpx;
}
.chart-item {background-color: #fff;border-radius: 10rpx;margin-bottom: 20rpx;padding: 20rpx;box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
}
.chart-title {font-size: 32rpx;font-weight: bold;margin-bottom: 20rpx;display: block;color: #333;
}
</style>

性能优化与注意事项

在实际开发中,我遇到并解决了以下问题:

  1. 大数据量渲染卡顿:当数据量超过1000个点时,图表渲染会变慢。解决方法是实现数据抽样或聚合,仅展示关键点。

  2. 高频更新问题:实时数据频繁更新导致性能下降。解决方法是使用节流(Throttle)技术限制更新频率。

  3. Canvas在某些机型上渲染异常:部分低端安卓设备上出现渲染问题。解决方法是提供降级方案,例如表格展示。

  4. 主题适配:不同项目有不同的设计风格。解决方法是创建themes.js文件,预设多种主题配置。

写在最后

通过UniApp开发图表组件,确实能够大幅降低跨平台开发成本。但任何技术都有两面性,开发者需要在特定场景下权衡利弊。

对于高性能要求的专业数据分析应用,可能原生开发仍是更好的选择;而对于大多数业务场景,UniApp + ECharts的组合足以满足需求,且开发效率更高。

希望这篇文章能给正在考虑UniApp数据可视化开发的同学一些参考,也欢迎在评论区分享你的经验和想法。


代码已经过实际项目验证,如有问题欢迎指正。

相关文章:

鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp

使用UniApp打造多功能图表展示组件 在当前移动应用开发领域&#xff0c;数据可视化已成为不可或缺的一部分。无论是展示销售数据、用户增长趋势还是其他业务指标&#xff0c;一个优秀的图表组件都能有效提升用户体验。UniApp作为一款跨平台开发框架&#xff0c;如何在其中实现…...

海量数据Top k 与查重问题

海量数据求top k 问题&#xff1a; - 求最大的前k个元素、求最小的前k个元素 - 求最大的第k个元素、求最小的第k个元素 解法&#xff1a; - 大根堆、小跟堆 -》 优先级队列&#xff08;priority_queue&#xff09; - 快速分割函数 priority_queue<int,vector<int>…...

Beats

Beats是一个开放源代码的数据发送器。我们可以把Beats作为一种代理安装在我 们的服务器上&#xff0c;这样就可以比较方便地将数据发送到Elasticsearch或者Logstash 中。Elastic Stack提供了多种类型的Beats组件。 Beats可以直接将数据发送到Elasticsearch或者发送到Logstash&a…...

微型PCB打样厂家选型指南

智能手机、可穿戴设备、医疗电子等高精尖领域&#xff0c;微型PCB&#xff08;印制电路板&#xff09;如同设备的“神经中枢”&#xff0c;承载着信号传输、电源分配、元件互联等核心功能。其设计精度与制造质量直接决定了产品的性能上限与可靠性。而打样环节&#xff0c;则是从…...

ISP有感自发

一、黑电平 由于传感器&#xff0c;即便在无光的情况下&#xff0c;依然会产生微小的暗电流&#xff0c;这些暗电流可能是噪点会影响后期的调试。因此&#xff0c;我们便将这些电流处理为0&#xff0c;成为纯黑的颜色。可以在源头消除这些误差。 如何矫正黑电平&#xff1a; …...

编程技能:字符串函数04,直接使用 strcpy,解决报错

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数03&#xff0c;strncpy 回到目录…...

网络编程超时检测,unix域套接字,粘包

刷题&#xff1a; # 超时检测核心要点## 1. 基本类型### 阻塞模式- 永久等待数据&#xff0c;无超时机制- 典型函数&#xff1a;recv()阻塞调用### 非阻塞模式- 立即返回结果&#xff08;成功/错误&#xff09;- 设置方式&#xff1a;fcntl(fd, F_SETFL, O_NONBLOCK)### 超时检…...

springboot AOP 接口限流(基于IP的接口限流和黑白名单)

使用 Spring Boot 自定义注解和AOP实现基于IP的接口限流和黑白名单 在我们日常开发的项目中为了保证系统的稳定性&#xff0c;很多时候我们需要对系统做限流处理&#xff0c;它可以有效防止恶意请求对系统造成过载。常见的限流方案主要有&#xff1a; 网关限流&#xff1a; NG…...

Python uv包管理器使用指南:从入门到精通

Python uv包管理器使用指南&#xff1a;从入门到精通 作为一名Python开发者&#xff0c;你是否曾经为虚拟环境管理和依赖包安装而头疼&#xff1f;今天我要向大家介绍一个强大的工具——uv包管理器&#xff0c;它将彻底改变你的Python开发体验。 什么是uv包管理器&#xff1f…...

【计算机网络】TLS中的对称加密和非对称加密的应用,应对第三方抓包的双向https认证

TLS工作流程简化版 证书验证流程 客户端通过CA的公钥验证服务器数字证书的签名&#xff0c;确保服务器身份可信&#xff0c;防止中间人攻击。 预主密钥加密传输 客户端生成预主密钥&#xff0c;用服务器证书中的公钥加密后发送给服务器&#xff0c;只有服务器&#xff08;持有…...

Stable Diffusion WebUI 插件大全:功能详解与下载地址

Stable Diffusion WebUI 的强大之处在于其丰富的插件生态&#xff0c;这些插件可以大幅提升 AI 绘画的效率和质量。本文将详细介绍 21 个常用插件&#xff0c;包括它们的功能、效果说明以及下载地址&#xff0c;帮助你更好地使用 Stable Diffusion WebUI。 插件的安装方式 直…...

【行为型之策略模式】游戏开发实战——Unity灵活算法架构的核心实现策略

文章目录 &#x1f3ae; 策略模式&#xff08;Strategy Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;动态伤害计算系统&#xff09;1. 定义策略接口与上下文2. 实现具体策略3. 客户端使用 四、模式进阶技巧1. 策略组合2. 策…...

第二十九节:直方图处理-直方图均衡化

在数字图像处理中,直方图均衡化(Histogram Equalization)是一种经典的对比度增强技术。它通过重新分配图像像素的亮度值,使图像的灰度级分布更加均匀,从而显著提升图像的视觉效果。 一、直方图基础 1.1 什么是直方图? 直方图(Histogram)是图像处理中用于描述图像像素…...

性能比拼: Nginx vs. Envoy

本内容是对知名性能评测博主 Anton Putra Nginx vs. Envoy performance benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 Envoy 被设计为服务网格中的高性能代理。 你可以将它部署在虚拟机&#xff08;VM&#xff09;中&#xff0c;或作为 sidecar 方式部…...

在 C 语言中,U、UL、ULL、L、LL 等符号使用说明

在 C 语言中&#xff0c;U、UL、ULL、L、LL 等符号是用于明确指定整数字面量类型的后缀&#xff0c;其核心作用是避免数据类型隐式转换导致的溢出或未定义行为。以下是具体分类和使用场景&#xff1a; 一、整数字面量后缀分类 后缀全称适用场景示例说明Uunsigned100U无符号整数…...

一般枚举题目合集

一般枚举题目合集 枚举NOIP 2011 提高组 铺地毯P2327 [SCOI2005] 扫雷蓝桥真题 跑步蓝桥真题 猜年龄 二进制枚举常用的技巧整理子集 - 力扣P10449 费解的开关UVA11464 Even Parity通过Virtual Judge提交代码正解 日期枚举蓝桥真题 跑步NOIP 2016 普及组 回文日期日期统计 写这段…...

MCP(Model Context Protocol,模型上下文协议)

1. 起因&#xff0c; 目的: MCP, 貌似最近很火&#xff0c;简单了解一下&#xff0c; 跟上时代节奏。看似是一个工具&#xff0c;一个新概念&#xff0c;其实是个鸡肋&#xff08;仅仅代表个人观点&#xff09;。 2. 先看效果 这里插入图片 3. 过程: 问题1, 什么是 MCP h…...

MQTT 在Spring Boot 中的使用

在 Spring Boot 中使用 MQTT 通常会借助 Spring Integration 项目提供的 MQTT 支持。这使得 MQTT 的集成可以很好地融入 Spring 的消息驱动和企业集成模式。 以下是如何在 Spring Boot 中集成和使用 MQTT 的详细步骤&#xff1a; 前提条件&#xff1a; MQTT Broker&#xff…...

uniapp使用全局组件,

在 Uniapp 中&#xff0c;如果你的组件是应用层组件&#xff08;例如全局悬浮按钮、全局通知栏等&#xff09;&#xff0c;并且希望它自动出现在所有页面而无需在每个页面模板中手动添加组件标签&#xff0c;可以通过以下两种方案实现&#xff1a; 方案一&#xff1a;通过 app.…...

【三维重建】三维场景生成:综述

标题&#xff1a;《3D Scene Generation: A Survey》 来源&#xff1a;新加坡南洋理工大学 项目&#xff1a;https://github.com/hzxie/Awesome-3D-Scene-Generation 文章目录 摘要一、前言二、准备工作2.1 任务定义2.2 三维场景表示2.3 生成模型 三、方法&#xff1a;分层分类…...

怎样将MM模块常用报表设置为ALV默认格式(MB52、MB5B、ME2M、ME1M等)

【SAP系统研究】 对SAP系统中的报表,最方便的格式就是ALV了,可排序、可导出,非常友好。 但有些常见报表却不是默认ALV界面的,譬如MB52: 是不是有点别扭?但其实是可以后台配置进行调整的。 现将一些常用报表修改为默认ALV的方法进行总结,便于大家使用。 一、MB52、MB5…...

Flutter 开发入门:从一个简单的计数器应用开始

在当今快速发展的移动应用开发领域&#xff0c;Flutter 框架以其高效、跨平台的特点脱颖而出&#xff0c;成为许多开发者的首选。本文将通过一个简单的 Flutter 项目代码&#xff0c;带你深入了解 Flutter 开发的基本概念和流程。这个项目是一个简单的计数器应用&#xff0c;它…...

Python解释器、REPL与脚本的区别

用ChatGPT做软件测试 “初学者写代码&#xff0c;高手理解运行。” 要成为真正理解代码的人&#xff0c;必须透彻理解&#xff1a;Python 是如何运行你的代码的&#xff1f;解释器、REPL 和脚本之间的界限与联系究竟是什么&#xff1f; 一、编程学习常见误区&#xff1a;把“运…...

总共76dp 空出20dp然后放一个控件的写法

<FrameLayout android:id"id/bt_user_agree" android:layout_width"120dp" android:layout_height"76dp" > <ImageView android: 这里里上一个 android:layout_width"wrap_content" android:layout_height"40dp" …...

【PmHub后端篇】PmHub集成 Sentinel+OpenFeign实现网关流量控制与服务降级

在微服务架构中&#xff0c;保障服务的稳定性和高可用性至关重要。本文将详细介绍在 PmHub 中如何利用 Sentinel Gateway 进行网关限流&#xff0c;以及集成 Sentinel OpenFeign 实现自定义的 fallback 服务降级。 1 熔断降级的必要性 在微服务架构中&#xff0c;服务间的调…...

C#扩展方法的入门理解

public static class CanGetModelExtension {public static T GetModel<T>(this ICanGetModel self) where T : class, IModel >self.GetArchitecture().GetModel<T>(); } 前言&#xff1a; 在学习QFramework时&#xff0c;看底层框架代码注意到这个函数&#…...

HTML应用指南:利用POST请求获取全国圆通快递服务网点位置信息

圆通快递作为国内物流行业的领军企业&#xff0c;自2000年成立以来&#xff0c;始终秉持 “客户要求&#xff0c;圆通使命” 的服务宗旨&#xff0c;致力于为客户提供高效、优质的物流服务。凭借其庞大的物流网络、先进的信息技术以及卓越的运营管理&#xff0c;圆通快递在激烈…...

vulnhub靶场——secarmy

靶机&#xff1a;secarmy靶机&#xff0c;IP地址为192.168.230.18 攻击&#xff1a;kali&#xff0c;IP地址为192.168.230.134 靶机和攻击机都采用VMware虚拟机&#xff0c;都采用NAT模式 端口扫描&#xff1a; nmap 192.168.230.18 -O -A -p- --reason -sV 21/tcp (ftp): 开…...

Daily AI 20250514 (迁移学习与元学习)

参考资料&#xff1a;神经网络与深度学习 目录 迁移学习 &#xff08;Transfer Learning&#xff09;归纳迁移学习转导迁移学习 元学习 &#xff08;Meta Learning&#xff09;基于优化器的元学习模型无关的元学习&#xff08;Model-AgnosticMeta-Learning&#xff0c;MAML&am…...

牛市买卖数字货币逻辑

在牛市中进行数字货币交易&#xff0c;核心逻辑是顺势而为、控制风险、把握周期。以下是关键策略和逻辑框架&#xff1a; 一、牛市的核心逻辑 资金驱动 牛市由增量资金&#xff08;新投资者、机构资金、杠杆资金&#xff09;推动&#xff0c;流动性充裕时&#xff0c;市场情绪乐…...

7.DTH11和PWM波

目录 室内/本地温湿度检测 温湿度传感器介绍 获取手册和例程的方法 从手册中提取重要信息 传感器的分类 温度传感器类型 DHT11 的介绍 温湿度传感器的接口 温湿度传感器的时序 温湿度传感器电路介绍 IO 的配置 定时器输出 PWM 波 PWM 波介绍 PWM 波的作用&#x…...

在UI 原型设计中,交互规则有哪些核心要素?

在UI 原型设计中&#xff0c;交互规则主要有三个核心要素&#xff0c;分别为重要性、原则与实践&#xff0c;具体表现在&#xff1a; 一、交互规则在 UI 原型设计中的重要性 明确交互逻辑&#xff1a;设计阶段制定交互规则&#xff0c;清晰定义界面元素操作响应。 如社交应用…...

树的直径 | 树的最长路径

树的直径&#xff1a; 树上任意两节点之间最长的简单路径即为树的「直径」。 定理&#xff1a; 在一棵树上&#xff0c;从任意节点 u 开始进行一次 DFS&#xff0c;到达的距离其最远的节点 v 必为直径的一端。 B4016 树的直径 - 洛谷 思路&#xff1a; 由于这题中每条边的…...

AbMole解读:脂质体的关键组分和主要合成方法

脂质体&#xff08;Liposome&#xff09;是一种由磷脂等两性分子自发形成的封闭囊泡结构&#xff0c;随着纳米技术、材料科学等多学科的交叉发展&#xff0c;脂质体的研究与应用进入了一个新的阶段&#xff0c;并在肿瘤研究、疫苗研发、基因递送等多个领域发挥着关键作用。AbMo…...

Python爬虫之品牌口碑数据抓取

上一篇我们介绍了爬虫营销的优势&#xff0c;这次我就展开详细的说说&#xff0c;如何通过爬取社交媒体或电商平台的公开评论来分析自己或竞争对手的品牌声誉。 选择微博这样的平台&#xff0c;因为它的数据相对公开&#xff0c;而且有API支持&#xff0c;但要注意频率限制和反…...

【android bluetooth 协议分析 12】【A2DP详解 1】【车机侧蓝牙音乐免切源介绍】

“车机蓝牙音乐免切源” 是近年来车载系统&#xff08;IVI&#xff0c;In-Vehicle Infotainment&#xff09;中常见的一个用户体验优化功能。它主要是为了简化蓝牙音乐播放流程、减少用户操作&#xff0c;提升使用便捷性。 一、什么是“切源”&#xff1f; 在车机系统中&#…...

眼镜店哪个品牌好,你会选择哪一款眼镜

有些人买眼睛是为了耍帅&#xff0c;有些人买眼镜&#xff0c;可能就是为了调节视力。现在手机以及其他的电子产品越来越普及&#xff0c;近视眼的人群是越来越多了&#xff0c;那么要准备去配眼镜的话&#xff0c;就要找到一个正规的眼镜店&#xff0c;一起来了解一下眼镜店哪…...

基于EFISH-SCB-RK3576/SAIL-RK3576的畜禽养殖监控仪技术方案‌

&#xff08;国产化替代J1900的农业物联网解决方案&#xff09; 一、硬件架构设计‌ ‌多源环境感知模块‌ ‌空气质量监测‌&#xff1a; 集成NH₃/CO₂/H₂S三合一气体传感器&#xff08;量程0-500ppm&#xff0c;精度2%FS&#xff09;&#xff0c;采样间隔≤1秒激光粉尘检测…...

linux - 权限的概念

目录 用户权限 超级用户与普通用户的区别 超级用户&#xff08;root&#xff09;&#xff1a; 普通用户&#xff1a; 切换用户身份 使用sudo执行高权限命令 用户管理 用户组管理 文件权限 文件访问者类别 基本权限 权限表示方法 权限修改 chmod chown chgrp u…...

LeRobot 框架的核心架构概念和组件(中)

本文档概述构成 LeRobot 框架的核心架构概念和组件。它介绍主要的子系统&#xff0c;并解释它们如何相互作用以实现机器人学习。 。。。。。。继续。。。。。。 环境接口 环境系统提供与模拟环境交互的统一接口。这些环境允许在部署到物理机器人之前&#xff0c;在受控环境中…...

鸿蒙5.0项目开发——鸿蒙天气项目的实现(主页1)

【高心星出品】 文章目录 页面效果&#xff1a;页面功能&#xff1a;页面执行流程&#xff1a;1. 页面初始化阶段2. 定位获取阶段3. 天气数据加载阶段 这个页面是整个天气应用的核心&#xff0c;集成了天气查询、定位、搜索等主要功能&#xff0c;提供了完整的天气信息服务。 …...

虚幻引擎5-Unreal Engine笔记之摄像机与场景捕获相关概念的解析

虚幻引擎5-Unreal Engine笔记之摄像机与场景捕获相关概念的解析 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之摄像机与场景捕获相关概念的解析1. UE中SceneCapture和UCameraComponent的关系是什么&#xff1f;Camera和SceneCapture2D的关系是什么1.1 UCameraComponen…...

【vim】--- vim 插件说明 超详细持续更新中

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【vim】--- vim 插件说明 超详细持续更新中 开发环境一、vim 插件管理器1、Vim-Plug2…...

医学影像系统的集成与工作流优化

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

Vue 和 React 状态管理的性能优化策略对比

一、Vue 状态管理优化策略 合理使用 Vuex 模块化 将全局状态拆分为模块&#xff0c;按需加载&#xff0c;避免单一 Store 文件过大。通过命名空间隔离状态&#xff0c;减少状态冗余和无效更新。 const moduleA { namespaced: true, state: { /* ... */ } }; const store new …...

python打包exe报错:处理文件时错误:Excel xlsx file; not supported

背景&#xff1a;最近用python写一个excel解析工具&#xff0c;然后打包成exe可执行文件的时候&#xff0c;遇到这样的问题 1.在我自己编译器运行是可以正常将上传后的excel进行解析&#xff0c;但是在打包成exe后&#xff0c;就无法正常解析excel 问题排查&#xff1a; 1.切换…...

libmemcached库api接口讲解一

前言&#xff1a;好多接口的用法都不怎么会&#xff0c;得学习一下具体的用法 memcached_st ✅ 一个连接 memcached 服务集群的“客户端实例”对象&#xff0c;用于管理连接、执行读写操作、设置行为、维护哈希环等一切功能。 它在使用中通常通过下面的方式创建&#xff1a; …...

【RabbitMQ】发布确认机制的具体实现

文章目录 模式介绍建立连接单独确认代码实现逻辑运行结果 批量确认代码实现逻辑运行结果 异步确认实现逻辑介绍代码实现逻辑运行结果 三种策略对比以及完整代码 模式介绍 作为消息中间件&#xff0c;都会面临消息丢失的问题&#xff0c;消息丢失大概分为三种情况&#xff1a; …...

RabbitMQ是什么?应用场景有哪些?

RabbitMQ 是一款开源的消息代理中间件,基于 AMQP(高级消息队列协议)实现,用于在分布式系统中进行异步通信和消息传递。它通过将消息的发送者和接收者解耦,提高了系统的可扩展性、可靠性和灵活性。 核心特点 多协议支持:不仅支持 AMQP,还兼容 STOMP、MQTT 等多种消息协议…...

数学实验(Matlab符号运算)

一、符号对象的建立 Matlab符号运算特点 计算以推理方式进行&#xff0c;因此不受计算误差积累所带来的困扰 符号计算指令的调用比较简单&#xff0c;与数学教科书上的公式相近 Matlab符号运算举例 符号对象与符号表达式 在进行符号运算时&#xff0c;必须先定义基本的符号…...