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

鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp

UniApp 实现图片上传与压缩功能

前言

在移动应用开发中,图片上传是一个非常常见的需求。无论是用户头像、朋友圈图片还是商品图片,都需要上传到服务器。但移动设备拍摄的图片往往尺寸较大,直接上传会导致流量消耗过大、上传时间过长,影响用户体验。因此,图片压缩成为了移动应用开发中的必备技能。

通过 UniApp 实现图片上传与压缩功能,既能满足用户体验需求,又能减轻服务器负担。今天就来分享一下我在实际项目中使用的图片上传与压缩方案,希望能对大家有所帮助。

技术方案分析

在 UniApp 中实现图片上传与压缩,主要涉及以下几个方面:

  1. 图片选择:通过 uni.chooseImage() 实现
  2. 图片压缩:通过 canvas 实现
  3. 图片上传:通过 uni.uploadFile() 实现

这个方案的优点是:

  • 压缩在客户端进行,减轻了服务器压力
  • 减少了网络流量,提高了上传速度
  • 可以根据不同场景设置不同的压缩参数

具体实现

1. 图片选择

首先实现图片选择功能:

// 选择图片
chooseImage() {return new Promise((resolve, reject) => {uni.chooseImage({count: 9, // 最多可选择的图片张数sizeType: ['original', 'compressed'], // 可选择原图或压缩后的图片sourceType: ['album', 'camera'], // 从相册选择或使用相机拍摄success: (res) => {resolve(res.tempFilePaths);},fail: (err) => {reject(err);}});});
}

2. 图片压缩实现

压缩图片是整个功能的核心,我们使用 canvas 来实现:

/*** 图片压缩* @param {String} src 图片路径* @param {Number} quality 压缩质量(0-1)* @param {Number} maxWidth 最大宽度* @param {Number} maxHeight 最大高度*/
compressImage(src, quality = 0.8, maxWidth = 800, maxHeight = 800) {return new Promise((resolve, reject) => {// 获取图片信息uni.getImageInfo({src: src,success: (imgInfo) => {// 计算压缩后的尺寸let width = imgInfo.width;let height = imgInfo.height;// 等比例缩放if (width > maxWidth || height > maxHeight) {const ratio = Math.max(width / maxWidth, height / maxHeight);width = Math.floor(width / ratio);height = Math.floor(height / ratio);}// 创建canvas上下文const ctx = uni.createCanvasContext('compressCanvas', this);// 绘制图片到canvasctx.drawImage(src, 0, 0, width, height);// 将canvas转为图片ctx.draw(false, () => {setTimeout(() => {uni.canvasToTempFilePath({canvasId: 'compressCanvas',fileType: 'jpg',quality: quality,success: (res) => {// 获取压缩后的图片路径resolve(res.tempFilePath);},fail: (err) => {reject(err);}}, this);}, 300); // 延迟确保canvas绘制完成});},fail: (err) => {reject(err);}});});
}

在页面中需要添加对应的 canvas 元素:

<canvas canvas-id="compressCanvas" style="width: 0px; height: 0px; position: absolute; left: -1000px; top: -1000px;"></canvas>

3. 图片上传实现

图片上传时,我们往往需要添加额外的参数,比如表单字段、用户 token 等:

/*** 上传图片到服务器* @param {String} filePath 图片路径* @param {String} url 上传地址* @param {Object} formData 附加数据*/
uploadFile(filePath, url, formData = {}) {return new Promise((resolve, reject) => {uni.uploadFile({url: url,filePath: filePath,name: 'file', // 服务器接收的字段名formData: formData,header: {// 可以添加自定义 header,如 token'Authorization': 'Bearer ' + uni.getStorageSync('token')},success: (res) => {// 这里需要注意,返回的数据是字符串,需要手动转为 JSONlet data = JSON.parse(res.data);resolve(data);},fail: (err) => {reject(err);}});});
}

4. 完整的上传流程

将以上三个步骤组合,实现完整的图片上传流程:

// 实现完整的上传流程
async handleUpload() {try {// 显示加载提示uni.showLoading({title: '上传中...',mask: true});// 选择图片const imagePaths = await this.chooseImage();// 用于存储上传结果const uploadResults = [];// 循环处理每张图片for (let i = 0; i < imagePaths.length; i++) {// 压缩图片const compressedPath = await this.compressImage(imagePaths[i],0.7,  // 压缩质量800,  // 最大宽度800   // 最大高度);// 获取原图和压缩后的图片大小进行对比const originalInfo = await this.getFileInfo(imagePaths[i]);const compressedInfo = await this.getFileInfo(compressedPath);console.log(`原图大小: ${(originalInfo.size / 1024).toFixed(2)}KB, 压缩后: ${(compressedInfo.size / 1024).toFixed(2)}KB`);// 上传压缩后的图片const uploadResult = await this.uploadFile(compressedPath,'https://your-api.com/upload',{type: 'avatar', // 附加参数userId: this.userId});uploadResults.push(uploadResult);}// 隐藏加载提示uni.hideLoading();// 提示上传成功uni.showToast({title: '上传成功',icon: 'success'});// 返回上传结果return uploadResults;} catch (error) {uni.hideLoading();uni.showToast({title: '上传失败',icon: 'none'});console.error('上传错误:', error);}
}// 获取文件信息
getFileInfo(filePath) {return new Promise((resolve, reject) => {uni.getFileInfo({filePath: filePath,success: (res) => {resolve(res);},fail: (err) => {reject(err);}});});
}

进阶优化

以上代码已经可以基本满足图片上传与压缩需求,但在实际项目中,我们还可以进一步优化:

1. 添加图片预览功能

在上传前,通常需要让用户预览选择的图片:

// 预览图片
previewImage(current, urls) {uni.previewImage({current: current, // 当前显示图片的路径urls: urls, // 需要预览的图片路径列表indicator: 'number',loop: true});
}

2. 使用 uniCloud 上传

如果你使用 uniCloud 作为后端服务,可以利用其提供的云存储功能简化上传流程:

// 使用 uniCloud 上传
async uploadToUniCloud(filePath) {try {const result = await uniCloud.uploadFile({filePath: filePath,cloudPath: 'images/' + Date.now() + '.jpg'});return result.fileID; // 返回文件ID} catch (error) {throw error;}
}

3. 添加上传进度显示

对于大图片,添加上传进度能提升用户体验:

uploadFileWithProgress(filePath, url, formData = {}) {return new Promise((resolve, reject) => {const uploadTask = uni.uploadFile({url: url,filePath: filePath,name: 'file',formData: formData,success: (res) => {let data = JSON.parse(res.data);resolve(data);},fail: (err) => {reject(err);}});uploadTask.onProgressUpdate((res) => {console.log('上传进度', res.progress);// 更新进度条this.uploadProgress = res.progress;});});
}

4. 针对鸿蒙系统的适配

随着国产操作系统鸿蒙的普及,我们也需要考虑在鸿蒙系统上的兼容性。虽然目前 UniApp 官方还没有专门针对鸿蒙系统的适配文档,但我们可以通过一些方法来优化:

// 检测当前系统
checkSystem() {const systemInfo = uni.getSystemInfoSync();console.log('当前系统:', systemInfo.platform);// 鸿蒙系统目前会被识别为 android,可以通过 brand 和 model 辅助判断const isHarmonyOS = systemInfo.brand === 'HUAWEI' && /HarmonyOS/i.test(systemInfo.system);if (isHarmonyOS) {console.log('当前是鸿蒙系统');// 针对鸿蒙系统进行特殊处理// 例如:调整压缩参数、使用不同的 API 等}return systemInfo;
}

根据我的测试,在鸿蒙系统上,有时 canvas 绘制需要更长的延迟时间,可以适当调整:

// 针对鸿蒙系统的 canvas 延迟调整
const delay = isHarmonyOS ? 500 : 300;
setTimeout(() => {uni.canvasToTempFilePath({// 配置项...});
}, delay);

实际案例

下面是一个完整的实际案例,用于实现商品发布页面的图片上传功能:

<template><view class="container"><view class="image-list"><!-- 已选图片预览 --><view class="image-item" v-for="(item, index) in imageList" :key="index"><image :src="item.path" mode="aspectFill" @tap="previewImage(index)"></image><view class="delete-btn" @tap.stop="deleteImage(index)">×</view></view><!-- 添加图片按钮 --><view class="add-image" @tap="handleAddImage" v-if="imageList.length < 9"><text class="add-icon">+</text><text class="add-text">添加图片</text></view></view><!-- 上传按钮 --><button class="upload-btn" @tap="submitUpload" :disabled="imageList.length === 0">上传图片 ({{imageList.length}}/9)</button><!-- 压缩画布(隐藏) --><canvas canvas-id="compressCanvas" style="width: 0px; height: 0px; position: absolute; left: -1000px; top: -1000px;"></canvas><!-- 上传进度条 --><view class="progress-bar" v-if="isUploading"><view class="progress-inner" :style="{width: uploadProgress + '%'}"></view><text class="progress-text">{{uploadProgress}}%</text></view></view>
</template><script>
export default {data() {return {imageList: [], // 已选图片列表isUploading: false, // 是否正在上传uploadProgress: 0, // 上传进度isHarmonyOS: false // 是否鸿蒙系统};},onLoad() {// 检测系统const systemInfo = this.checkSystem();this.isHarmonyOS = systemInfo.brand === 'HUAWEI' && /HarmonyOS/i.test(systemInfo.system);},methods: {// 添加图片async handleAddImage() {try {const imagePaths = await this.chooseImage();// 添加到图片列表for (let path of imagePaths) {this.imageList.push({path: path,compressed: false,compressedPath: '',uploaded: false,fileID: ''});}} catch (error) {console.error('选择图片失败:', error);}},// 预览图片previewImage(index) {const urls = this.imageList.map(item => item.path);uni.previewImage({current: this.imageList[index].path,urls: urls});},// 删除图片deleteImage(index) {this.imageList.splice(index, 1);},// 提交上传async submitUpload() {if (this.imageList.length === 0) {uni.showToast({title: '请至少选择一张图片',icon: 'none'});return;}this.isUploading = true;this.uploadProgress = 0;uni.showLoading({title: '准备上传...',mask: true});try {// 上传结果const uploadResults = [];// 总进度let totalProgress = 0;// 遍历所有图片进行压缩和上传for (let i = 0; i < this.imageList.length; i++) {let item = this.imageList[i];// 如果还没压缩过,先压缩if (!item.compressed) {uni.showLoading({title: `压缩第 ${i+1}/${this.imageList.length} 张图片`,mask: true});try {const compressedPath = await this.compressImage(item.path,0.7,800,800);// 更新图片信息this.imageList[i].compressed = true;this.imageList[i].compressedPath = compressedPath;// 获取压缩前后的大小对比const originalInfo = await this.getFileInfo(item.path);const compressedInfo = await this.getFileInfo(compressedPath);console.log(`图片 ${i+1}: 原图 ${(originalInfo.size / 1024).toFixed(2)}KB, 压缩后 ${(compressedInfo.size / 1024).toFixed(2)}KB, 压缩率 ${((1 - compressedInfo.size / originalInfo.size) * 100).toFixed(2)}%`);} catch (error) {console.error(`压缩第 ${i+1} 张图片失败:`, error);// 如果压缩失败,使用原图this.imageList[i].compressedPath = item.path;this.imageList[i].compressed = true;}}// 准备上传uni.showLoading({title: `上传第 ${i+1}/${this.imageList.length} 张图片`,mask: true});try {// 使用压缩后的图片路径,如果没有则使用原图const fileToUpload = item.compressedPath || item.path;// 上传图片const result = await this.uploadFileWithProgress(fileToUpload,'https://your-api.com/upload',{type: 'product',index: i});// 更新图片信息this.imageList[i].uploaded = true;this.imageList[i].fileID = result.fileID || result.url;uploadResults.push(result);// 更新总进度totalProgress = Math.floor((i + 1) / this.imageList.length * 100);this.uploadProgress = totalProgress;} catch (error) {console.error(`上传第 ${i+1} 张图片失败:`, error);uni.showToast({title: `第 ${i+1} 张图片上传失败`,icon: 'none'});}}uni.hideLoading();this.isUploading = false;uni.showToast({title: '所有图片上传完成',icon: 'success'});// 返回上传结果,可以传给父组件或进行后续处理this.$emit('uploadComplete', uploadResults);} catch (error) {uni.hideLoading();this.isUploading = false;console.error('上传过程出错:', error);uni.showToast({title: '上传失败,请重试',icon: 'none'});}},// 其他方法实现(chooseImage, compressImage, uploadFile等,同前面的实现)}
};
</script><style lang="scss">
.container {padding: 20rpx;
}.image-list {display: flex;flex-wrap: wrap;
}.image-item {width: 220rpx;height: 220rpx;margin: 10rpx;position: relative;border-radius: 8rpx;overflow: hidden;image {width: 100%;height: 100%;}.delete-btn {position: absolute;top: 0;right: 0;width: 44rpx;height: 44rpx;background-color: rgba(0, 0, 0, 0.5);color: #ffffff;text-align: center;line-height: 44rpx;font-size: 32rpx;z-index: 10;}
}.add-image {width: 220rpx;height: 220rpx;margin: 10rpx;background-color: #f5f5f5;display: flex;flex-direction: column;justify-content: center;align-items: center;border-radius: 8rpx;border: 1px dashed #dddddd;.add-icon {font-size: 60rpx;color: #999999;}.add-text {font-size: 24rpx;color: #999999;margin-top: 10rpx;}
}.upload-btn {margin-top: 40rpx;background-color: #007aff;color: #ffffff;border-radius: 8rpx;&:disabled {background-color: #cccccc;}
}.progress-bar {margin-top: 30rpx;height: 40rpx;background-color: #f5f5f5;border-radius: 20rpx;overflow: hidden;position: relative;.progress-inner {height: 100%;background-color: #007aff;transition: width 0.3s;}.progress-text {position: absolute;top: 0;left: 0;right: 0;bottom: 0;display: flex;justify-content: center;align-items: center;font-size: 24rpx;color: #ffffff;}
}
</style>

鸿蒙系统适配经验

前面已经简单提到了鸿蒙系统的适配,下面来详细说一下我在实际项目中遇到的问题和解决方案:

  1. 画布延迟问题:在鸿蒙系统上,canvas 绘制后转图片需要更长的延迟时间,建议延长 setTimeout 时间。

  2. 文件系统差异:有些文件路径的处理方式可能与 Android 有所不同,建议使用 UniApp 提供的 API 进行文件操作,而不要直接操作路径。

  3. 图片格式支持:在鸿蒙系统上,对 WebP 等格式的支持可能有限,建议统一使用 JPG 或 PNG 格式。

  4. 内存管理:鸿蒙系统对内存的管理略有不同,处理大图片时需要注意内存释放。可以在完成上传后,主动清空临时图片:

// 清空临时文件
clearTempFiles() {for (let item of this.imageList) {// 如果存在压缩后的临时文件,尝试删除if (item.compressedPath && item.compressedPath !== item.path) {uni.removeSavedFile({filePath: item.compressedPath,complete: () => {console.log('清理临时文件');}});}}
}

总结

通过本文介绍的方法,我们可以在 UniApp 中实现图片上传与压缩功能,主要包括以下几个步骤:

  1. 使用 uni.chooseImage() 选择图片
  2. 使用 canvas 进行图片压缩
  3. 使用 uni.uploadFile() 上传图片
  4. 添加进度显示和预览功能
  5. 针对鸿蒙系统做特殊适配

在实际项目中,可以根据需求调整压缩参数,比如对头像类图片可以压缩得更小,而对需要展示细节的商品图片,可以保留更高的质量。

希望本文能够帮助大家更好地实现 UniApp 中的图片上传与压缩功能。如果有任何问题或建议,欢迎在评论区交流讨论!

参考资料

  1. UniApp 官方文档:https://uniapp.dcloud.io/
  2. Canvas API 参考:https://uniapp.dcloud.io/api/canvas/CanvasContext

相关文章:

鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp

UniApp 实现图片上传与压缩功能 前言 在移动应用开发中&#xff0c;图片上传是一个非常常见的需求。无论是用户头像、朋友圈图片还是商品图片&#xff0c;都需要上传到服务器。但移动设备拍摄的图片往往尺寸较大&#xff0c;直接上传会导致流量消耗过大、上传时间过长&#x…...

SymPy | 如何提取指定项的系数

SymPy 是 Python 中一个强大的符号计算库&#xff0c;广泛应用于数学、物理和工程领域的符号运算。在代数表达式的处理中&#xff0c;提取特定项的系数是一项常见且重要的操作。本文将详细介绍 SymPy 中提取指定项系数的多种方法&#xff0c;并通过丰富的示例帮助读者掌握这些技…...

MUSE Pi Pro 更换kernel内核及module模块

视频讲解&#xff1a; MUSE Pi Pro 更换kernel内核及module模块 脚本仓库&#xff1a; https://github.com/LitchiCheng/MUSE-Pi-Pro-Learning 结合上期编译内核&#xff0c;编译成功后的输出如下&#xff1a; 输入 uname -a 可以看到如下信息&#xff0c;未修改的内核时间在 …...

java每日精进 5.14【参数校验】

参数校验 1.1概述 本文使用 Hibernate Validator 框架对 RESTful API 接口的参数进行校验&#xff0c;确保数据入库的正确性。 例如&#xff0c;在用户注册时&#xff0c;校验手机号格式、密码强度等。如果校验失败&#xff0c;抛出 ConstraintViolationException 或相关异…...

CPS联盟+小程序聚合平台分销返利系统开发|小红书番茄网盘CPA拉新推广全解析

导语&#xff1a; 在私域流量与社交电商爆发的时代&#xff0c;CPS联盟分销返利系统与小红书CPA拉新推广成为企业增长的核心引擎。本文深度解析如何通过小程序聚合平台开发、多层级返利机制搭建及精准CPA推广策略&#xff0c;快速占领市场&#xff0c;实现用户裂变与收益倍增。…...

基于EFISH-SCB-RK3576/SAIL-RK3576的光伏逆变器控制器技术方案

&#xff08;国产化替代J1900的能源物联网解决方案&#xff09; 一、硬件架构设计‌ ‌电力转换与控制模块‌ ‌高精度功率控制‌&#xff1a; Cortex-M0硬实时核驱动多相PWM&#xff08;频率>200kHz&#xff09;&#xff0c;动态调节DC-AC转换误差<0.5%FPGA实现MPPT算法…...

HarmonyOS NEXT 适配高德地图FlutterSDK实现地图展示,添加覆盖物和移动Camera

HarmonyOS NEXT 适配高德地图 Flutter SDK 实现地图展示&#xff0c;添加覆盖物和移动 Camera 在现代移动应用开发中&#xff0c;地图功能是许多应用的核心组成部分之一。HarmonyOS NEXT 提供了强大的跨平台开发能力&#xff0c;而高德地图 Flutter SDK 则为开发者提供了丰富的…...

计算机网络:手机和基站之间是通过什么传递信息的?怎么保证的防衰减,抗干扰和私密安全的?

手机与基站之间的通信依赖无线电磁波信号,其传输介质、频率选择、抗衰减/抗干扰技术及隐私保护机制共同构成了现代移动通信的核心。以下从技术原理到实际应用逐一解析: 一、信号本质与传输介质 1. 信号类型 电磁波:手机与基站通过射频(RF)电磁波传递信息,采用数字调制技…...

C#调用C++dll 过程记录

C#调用Cdll 过程记录 问题&#xff1a;1、设置修改记录2 修改对应问题3 继续出问题4 许久之后的转机5 最后的成功 如题&#xff0c;过程记录 问题&#xff1a; 提示&#xff1a;main 已经在 dllmain.obj 中定义&#xff0c;针对该问题作进一步的处理 1、设置修改记录 &…...

Vue百日学习计划Day4-8——Gemini版

番茄时钟&#xff1a; 每个番茄钟为25分钟学习&#xff0c;之后休息5分钟。每完成4个番茄钟&#xff0c;进行一次15-30分钟的长休息。灵活性&#xff1a; 这仍然是一个建议性计划。某些主题&#xff08;尤其是 Flexbox 和 Grid&#xff09;可能需要比预期更多的时间来练习和理解…...

DHCP协议

DHCP协议 1、掌握DHCP的工作原理 2、会在Windows server上去部署DHCP服务 3、抓流量 正常收到攻击后 一、DHCP 1、DHCP基本概念 dhcp(动态主机配置协议)&#xff1a;主要就是给客户机提供TCP/IP参数(IP地址、子网掩码、网关、DNS等&#xff09; 2、好处 减少管理员工作…...

级联与端到端对话系统架构解析:以Moshi为例

一、对话系统架构对比 1.1 级联对话系统&#xff08;Cascaded Dialogue Systems&#xff09; 传统级联系统采用多阶段处理流程&#xff1a; 语音识别&#xff08;ASR&#xff09;&#xff1a;将24kHz音频信号通过卷积神经网络&#xff08;CNN&#xff09;和Transformer转换为…...

3、ubantu系统docker常用命令

1、自助查看docker命令 1.1、查看所有命令 docker 客户端非常简单&#xff0c;可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 angqiangwangqiang:~$ dockerUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:ru…...

【leetcode】349. 两个数组的交集

文章目录 代码1.set&#xff08;&#xff09;2. 哈希表3. 数组 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输…...

BGP联邦和发射试验

一、要求 二、需求分析 1. **拓扑与地址规划** - **AS1**&#xff1a;环回16.1.1.0/24需宣告&#xff0c;192.168.1.0/24不宣告。 - **AS3**&#xff1a;环回11.1.1.0/24需宣告&#xff0c;192.168.2.0/24不宣告。 - **AS2**&#xff1a;使用172.16.0.0/16划分子…...

LeetCode Hot100 (1/100)

目录 一、有关数组和动态数组的排序&#xff08;sort函数&#xff09; 1.普通数组的排序 基本用法 降序排序 2.vector的排序 基本用法 降序排序 二、数组长度和一些vector的基本语法 1. 静态数组长度计算​ 2. 安全获取数组长度&#xff08;C17 起&#xff09;​ 3.vecto…...

LeetCode热题100--234.回文链表--简单

1. 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xf…...

Java—接口和抽象类

一、接口 Java 接口&#xff08;Interface&#xff09; 是面向对象编程中用于定义行为规范的核心机制。接口通过抽象方法约定“能做什么”&#xff0c;而不关心“如何做”&#xff0c;从而实现多态和代码解耦。 1.1 接口的特点 接口用interface定义接口中全为抽象方法默认用p…...

CycleISP: Real Image Restoration via Improved Data Synthesis通过改进数据合成实现真实图像恢复

摘要 大规模数据集的可用性极大释放了深度卷积神经网络&#xff08;CNN&#xff09;的潜力。然而&#xff0c;针对单图像去噪问题&#xff0c;获取真实数据集成本高昂且流程繁琐。因此&#xff0c;图像去噪算法主要基于合成数据开发与评估&#xff0c;这些数据通常通过广泛假设…...

算法题(146):最大子段和

、 审题&#xff1a; 本题需要我们找到给定数组中子段之和和最大的sum值 思路&#xff1a; 方法一&#xff1a;暴力解法 我们可以使用双层for循环&#xff0c;第一层循环负责遍历每一个数组元素&#xff0c;然后分别以他们为子段起点&#xff0c;第二层循环从第一层循环的索引开…...

centos6.10在Macbook m芯片上使用

非常好&#xff01;用 CentOS 6.10 替代 6.4 是一个明智的选择 ✅&#xff0c;原因如下&#xff1a; ⸻ ✅ 为什么选 CentOS 6.10 更好 对比项 CentOS 6.4 CentOS 6.10 发布年份 2013 年 2018 年&#xff08;CentOS 6 系列最终版&#xff09; 内核版本 2.6.32-358 2.6.32-75…...

OA 系统办公自动化包含哪些内容,关键功能模块与操作要点说明

在企业数字化转型浪潮中&#xff0c;OA 系统常被片面认知为请假审批、文件收发的工具&#xff0c;未能发挥其核心价值。部分企业引入 OA 后&#xff0c;出现员工抵触、流程卡顿、系统闲置等问题&#xff0c;根源在于对其功能定位模糊、应用模式僵化&#xff0c;导致无法实现预期…...

AI智能体的现状和应用前景

AI智能体的现状 AI智能体(AI Agents)是指能够感知环境、做出决策并执行任务的智能系统。它们通常结合了机器学习、自然语言处理、计算机视觉等技术,能够在复杂环境中自主运行。目前,AI智能体已经在多个领域取得了显著进展。 在工业领域,AI智能体被用于自动化生产线、质量…...

操作系统实验 实验3 存储器分配与回收

1.实验目的 了解动态分区分配方式中使用的数据结构和分配算法&#xff0c;并进一步加深动态分区存储管理方式及其实现过程的理解。 2.实验要求 用C语言实现首次适应算法的动态分区分配过程alloc()和回收过程free()。 一、实验内容&#xff1a; 1&#xff0e;实验内容 用C语言实…...

408考研逐题详解:2009年第13题

2009年第13题 浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判溢出等步骤。设浮点数的阶码和尾数均采用补码表示&#xff0c;且位数分别为 5 位和 7 位&#xff08;均含 2 位符号位)。若有两个数 X 2 7 29 / 32 X2^7\times29/32 X2729/32&#xff0c; Y 2 …...

什么是虚拟同步发电机

虚拟同步发电机&#xff08;Virtual Synchronous Generator, VSG&#xff09; 是一种基于电力电子技术的先进控制策略&#xff0c;通过模拟传统同步发电机的机电特性和动态行为&#xff0c;使逆变器或储能系统能够像传统发电机一样为电网提供惯性支撑、频率调节和电压稳定性支持…...

性能比拼: Linkerd vs. Istio

本内容是对知名性能评测博主 Anton Putra Linkerd vs. Istio (Rust vs. C) performance benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本内容中&#xff0c;我们将对比 Kubernetes 服务网格中的 Istio 和 Linkerd。 相关代码详见 github 我们将运行…...

FPGA: Xilinx Kintex 7实现PCIe接口

在Xilinx Kintex-7系列FPGA上实现PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;接口&#xff0c;通常使用Xilinx提供的7 Series Integrated Block for PCIe IP核&#xff0c;结合Vivado设计流程。以下是实现PCIe接口的详细步骤和关键点&#xff0c;适…...

《Effective Python》第2章 字符串和切片操作——Python 字符串格式化的现代选择f-strings

引言 本篇博客基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 的 Item 11 “Prefer Interpolated F-Strings Over C-style Format Strings and str.format” 的总结与延伸。 字符串格式化是 Python 编程中的常见操作&#xff0c;用于动态生成可读性高的…...

vue 去掉右边table的下拉条与下面的白色边框并补充满

::v-deep table {width: 100% !important; } ::v-deep .el-table::after, .el-table::before {display: none !important; }/* 隐藏滚动条但保留滚动功能 */ ::v-deep .el-table__body-wrapper::-webkit-scrollbar {width: 0 !important;height: 0 !important; }::v-deep .el-t…...

RabbitMq消息阻塞,立即解决方案

如果目前你的 RabbitMQ 消费者 被卡住不再消费消息&#xff0c;且消息已经到达消费者绑定队列&#xff0c;但Spring Cloud Stream 没有继续触发 StreamListener 的方法执行。这类问题一般是因为消费者线程阻塞或消息被 RabbitMQ 拒绝投递。我们可以按照下面的步骤紧急处理&…...

单片机-STM32部分:14、SPI

飞书文档https://x509p6c8to.feishu.cn/wiki/VYYnwOc9Zi6ibFk36lYcPQdRnlf 什么是SPI SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI&#xff0c;是一种高速的&…...

Selenium-Java版(操作元素)

选择和操控元素的基本方法 前言 选择元素 选择元素的方法 根据 id属性选择元素 根据class属性选择元素 根据tag名选择元素 通过WebElement对象选择元素 示例 等待界面元素出现 原因 解决 操控元素 点击元素 输入框 获取元素信息 获取元素文本内容 获取…...

20052012世界银行中国企业调查数据-社科数据

2005&2012世界银行中国企业调查数据-社科数据https://download.csdn.net/download/paofuluolijiang/90623828https://download.csdn.net/download/paofuluolijiang/90623828 世界银行中国企业调查数据&#xff08;World Bank Enterprise Surveys Data&#xff09;是国际金…...

学习黑客NFC技术详解

NFC技术详解&#xff1a;近距离通信的无线桥梁 &#x1f4f1;&#x1f4b3; 学习目标&#xff1a;了解NFC技术的基本原理、应用场景及安全注意事项&#xff0c;掌握这一日益普及的近场通信技术 1. NFC的概念与基础 &#x1f4e1; NFC&#xff08;Near Field Communication&…...

Java问题排查常用命令行工具速查表

Java问题排查常用命令行工具速查表 工具典型用途常用命令示例说明/场景jps列出本机所有Java进程jps -l获取Java进程PID和主类名&#xff0c;配合其它工具使用jcmd动态诊断、堆heap dump、线程dump等jcmd helpjcmd VM.flagsjcmd GC.heap_infojcmd Thread.print功能最全&#xf…...

近期搬了个家,停更了几天,明天继续哈~

近期搬了个家&#xff0c;停更了几天&#xff0c;明天继续哈&#xff5e; 近期搬家比较离谱&#xff0c;第一天下暴雨&#xff0c;冰雹&#xff0c;停电&#xff0c;第二天又停电两小时&#xff0c;截止14号晚上11:30终于完工 了&#xff0c;从西二的20 号楼到西三的19号楼&am…...

C#高级编程:IO和序列化

在 C# 编程中,输入输出(IO)和序列化是两个至关重要的概念,它们为数据的存储、读取以及在不同环境间的传输提供了强大的支持。无论是开发小型应用程序,还是构建复杂的企业级系统,深入理解并熟练运用 IO 和序列化技术都是必不可少的。​ 一、C# 中的 IO 基础​ 1、文件流…...

PyQt5完整指南:从入门到实践

引言 PyQt5是Python编程语言的一个GUI&#xff08;图形用户界面&#xff09;工具包&#xff0c;它是Qt5应用程序框架的Python绑定。Qt是一个跨平台的C应用程序开发框架&#xff0c;被广泛用于开发GUI程序和非GUI程序。PyQt5让Python开发者能够使用Python语言享受到Qt框架的强大…...

C#高级编程:加密解密

在数字化时代,数据安全是每个应用程序都必须重视的环节。无论是用户的个人信息、敏感的商业数据,还是重要的系统配置,都需要得到妥善的保护。C# 作为一种广泛应用的编程语言,提供了丰富且强大的加密解密功能,帮助开发者构建安全可靠的应用。本文将深入探讨 C# 高级编程中的…...

银行卡真伪验证助力金融合规-银行卡实名认证接口

在数字化时代&#xff0c;金融交易日益频繁&#xff0c;用户身份与银行卡信息的真实性核验成为保障资金安全、防止欺诈行为的关键环节。无论是在线支付、网络借贷、电商平台&#xff0c;还是社交软件、金融服务APP&#xff0c;均需对用户的银行卡进行严格的实名认证。为满足企业…...

html5+css3实现傅里叶变换的动态展示效果(仅供参考)

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>傅里叶变换的动态展示效果</title><sty…...

SysConfig修改后`ti_msp_dl_config`文件未更新问题的解决方法(已解决)

SysConfig修改后ti_msp_dl_config文件未更新问题的解决方法 在使用SysConfig工具配置TI MSPM0系列MCU时&#xff0c;有时会遇到一个令人困惑的问题&#xff1a;在SysConfig中修改配置后&#xff0c;生成的ti_msp_dl_config.c文件内容却没有更新。这可能会导致工程无法正确编译…...

深入浅出 IPFS 在 DApps 和 NFT 中的应用:以 Pinata 实战为例

目录 IPFS背景什么是 IPFS?IPFS 在 DApps 与 NFT 中的作用什么是 Pinata?为什么使用它?使用原生IPFS上传下载文件(HTML + JavaScript 示例)使用Pinata上传下载文件(HTML + JavaScript 示例)注册并创建APIKey使用 Pinata 上传文件和JSON(HTML + JavaScript 示例)总结IP…...

深度剖析LLM的“大脑”:单层Transformer的思考模式探索

简单说一下哈 —— 咱们打算训练一个单层 Transformer 加上稀疏自编码器的小型百万参数大型语言模型&#xff08;LLM&#xff09;&#xff0c;然后去调试它的思考过程&#xff0c;看看这个 LLM 的思考和人类思考到底有多像。 LLMs 是怎么思考的呢&#xff1f; 开源 LLM 出现之后…...

(4)python开发经验

文章目录 1 使用ctypes库调用2 使用pybind11 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 使用ctypes库调用 说明&#xff1a;ctypes是一个Python内置的库&#xff0c;可以提供C兼容的数据类型…...

卷积神经网络全连接层详解:特征汇总、FCN替代与性能影响分析

【内容摘要】 本文聚焦卷积神经网络&#xff08;CNN&#xff09;的全连接层&#xff0c;详细介绍其将二维特征图转化为一维向量的过程&#xff0c;阐述全卷积网络&#xff08;FCN&#xff09;如何通过转置卷积替代全连接层以实现像素级分类&#xff0c;并分析全连接层对图像分类…...

通义千问-langchain使用构建(一)

目录 序言通义千问1获取通义千问api_key2Conda构建下本地环境3 构建一下多轮对话 LangChain1使用Langchain调用通义千问接口实现翻译 结论 序言 25年5月&#xff0c;现在基本每个大厂都有涉及大模型(Large Language Model)&#xff0c;然后在大模型基础上构建应用框架。 参考…...

六西格玛觉醒:一场数据思维的启蒙运动​

​ 当生产线上的不良品率曲线第一次在我眼前具象化为统计波动图时&#xff0c;我意识到自己正站在新旧认知的断层带上。从对着MINITAB界面手足无措的菜鸟&#xff0c;到能独立完成过程能力分析的绿带学员&#xff0c;这段学习旅程不仅重塑了我的问题解决逻辑&#xff0c;更让我…...

BitMart合约交易体验 BitMart滑点全赔的底层逻辑

美国新泽西州泽西市&#xff0c;2025年5月13日 – BitMart&#xff0c;全球领先的数字资产交易平台&#xff0c;推出了其开创性的滑点保护计划&#xff0c;旨在解决加密市场中最具挑战性且常常被忽视的风险之一&#xff1a;滑点。该计划为交易者提供了在 USDT 保证金永续合约交…...