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

MinIo前后端实现

这几天想玩玩Minio,整体来说简单使用起来不复杂(当然也有可能是我配置的太少了)

Minio下载

我是通过Dokcer在虚拟机上下载的(Docker真好用啊)
拉取Minio镜像

docker pull minio/minio

启动Minio容器

docker run -d --name minio -p 9000:9000 -p 9001:9001
-v /root/minio/data:/data 
-v /root/minio/config:/root/.minio 
-e MINIO_ROOT_USER=账号名 -e MINIO_ROOT_PASSWORD=密码 
minio/minio server /data --console-address ":9001"

Minio需要暴露两个端口,9000是API接口,9001是浏览器界面,后端通过9000端口发送请求,9001端口是可视化界面
还需要设置账号和密码MINIO_ROOT_USER MINIO_ROOT_PASSWORD
(密码至少8位)
以及配置数据卷,Bucket(MinIo中的文件夹)会建立在/data目录下
启动完成后可以打开9001端口查看

后端配置

Minio通过okhttp发送请求,okhttp版本过低会报错

        <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.3</version></dependency><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.5</version></dependency>

编写配置文件
access-keysecret-key需要在9001端口上手动获取,登录Minio后,点击AccessKey点击CreateAccessKey点击CreateaccessKeysecretKey记住就行

minio:endpoint: ip:9000access-key: eSKt88NNU3PNKs8htCtfsecret-key: YadifAfciM8Q5OaShJcSmG0NkEm5dN58UJYFPmO7

编写配置类(记得加上set和get,配置数据注入依赖这两)


@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinIoConfig {public String endpoint;public String accessKey;public String secretKey;@Beanpublic MinioClient minioClient(){return MinioClient.builder().endpoint(endpoint).credentials(accessKey,secretKey).build();}
}

此时就可以通过自动注入获取到MinioClient对象,完成文件的上传下载等
Minio中的几乎所有方法都是通过构造器模式编写的,参数大多都是xxxArgs.builder().build();

private final MinioClient minio;// 通过构造器注入public MinioService(MinioClient minio) {this.minio = minio;}// 创建Bucket 相当于创建一个文件夹public boolean createBucket(String bucketName) {boolean exist = minio.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if (!exist){minio.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}return exist;}// 在指定桶中上传文件public boolean uploadFile(String bucketName,MultipartFile file,String newFileName) {InputStream inputStream = null;try{inputStream = file.getInputStream();minio.putObject(PutObjectArgs.builder().bucket(bucketName).object(newFileName).stream(inputStream,file.getSize(),-1).contentType(file.getContentType()).build());} catch (Exception e){return false;}finally {inputStream.close();}return true;}// 根据文件名获取对应桶中的文件public InputStream downloadFile(String bucketName,String objectName) {return minio.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());}// 删除指定桶中的文件public boolean deleteFile (String bucketName,String objectName){try{minio.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());}catch (Exception e){return false;}return true;}// 获取指定桶中的全部数据public List<String> getAllFilesInBucket(String bucketName){Iterable<Result<Item>> results = minio.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());List<String> items = new ArrayList<>();for (Result<Item> result : results) {Item item = result.get();items.add(item.objectName());}return items;}

编写完Service类后可以通过访问Controller去创建文件删除文件等操作
因为上传文件名不应该重复,又不确定Minio是否会对文件名重复进行什么操作,所以我将上传的文件通过UUID进行重命名,并通过建立一张sql表存储新文件名和旧文件名之间的对应关系

    // 获取指定桶中的全部文件@GetMapping("/fileList")public Result<List<String>> fileList() {List<String> fileList = minIo.getAllFilesInBucket("test");return Result.success(fileNameConvert(fileList));}// 上传文件是旧的文件名,通过SQL查询将文件名转换成新文件名public List<String> fileNameConvert(List<String> fileList){for(int i = 0;i<fileList.size();i++){String oldNameByNewName = sqlMapper.getOldNameByNewName(fileList.get(i));fileList.set(i,oldNameByNewName);}return fileList;}// 获取指定桶中的指定文件// 文件的下载需要通过HttpServletResponse类完成,返回数据无所谓(写不写return都行)@GetMapping("/getFile")public Result<String> getFile(@RequestParam("fileName") String fileName, HttpServletResponse response) {MinIoFile file = sqlMapper.getFile(fileName, "1");InputStream inputStream = minIo.downloadFile("test", file.getNewFileName());response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(fileName, "UTF-8"));ServletOutputStream outputStream = response.getOutputStream();inputStream.transferTo(outputStream);return Result.success("ok");}// 文件上传@Transactional@PostMapping("/hello/upload")public Result<String> upload(@RequestParam("file") MultipartFile multipartFile){String oldFileName = multipartFile.getOriginalFilename();String[] files = oldFileName.split("\\.");String endName = files[files.length-1];if (!endName.equals("md")){return Result.error("返回一个md结尾的数据");}String uuid = UUID.randomUUID().toString();// 文件存储,原名: 新名 每次查询时从数据库中查找对应的原名String newName = uuid +"."+endName;// 将数据存储到SQL中MinIoFile minIoFile = new MinIoFile();minIoFile.setOldFileName(oldFileName);minIoFile.setNewFileName(newName);minIoFile.setIsDelete(0);minIoFile.setCreateTime(new java.sql.Date(System.currentTimeMillis()));String userId = "1";minIoFile.setCreateUser(userId);boolean createFileSuccess = sqlMapper.createNewFile(minIoFile);if (!createFileSuccess){throw new BaseException("创建文件失败");}try {minIo.uploadFile("test",multipartFile,newName);} catch (Exception e) {throw new BaseException("创建文件失败");}return Result.success("创建文件成功");}

创表语句

create table file(id int primary key auto_increment,old_file_name varchar(50) not null,new_file_name varchar(50) not null unique,is_delete int default 0,create_time datetime,create_user varchar(50)
)

Mapper接口

    @Insert("insert into file values(null,#{oldFileName},#{newFileName},#{isDelete},#{createTime},#{createUser})")boolean createNewFile (MinIoFile minIoFile);@Select("select * from file where old_file_name = #{oldFileName} and create_user = #{userId}")MinIoFile getFile(@Param("oldFileName") String oldFileName,@Param("userId") String userId);@Select("select old_file_name from file where new_file_name = #{newFileName}")String getOldNameByNewName(String newFileName);

前端

前端直接调用后端Controller接口就可以,没有什么特殊写法,所以我界面写的很简陋
唯二需要注意的是后端接收不到file的问题和Liunx系统下换行符是\r\n需要用正则匹配替换成\n
因为我上传下载的都是纯文本文件,如果有需要的话可以整个富文本框架展示


<body><button id="fileList">查看文件列表</button><input type="file" id="file"><button id="uploadFile">上传文件</button><input type="text" id="fileName" placeholder="输入文件名"><button id="downloadFile">查看文件</button><p></p><script>const fileListButton = document.querySelector('#fileList')const uploadFileButton = document.querySelector('#uploadFile')const p = document.querySelector('p')fileListButton.addEventListener("click", () => {axios({method: 'get',url: "http://localhost:8080/fileList"}).then((res) => {console.log(res)})})uploadFileButton.addEventListener("click", () => {const file = document.querySelector('#file').files[0]const data = new FormData();data.append('file', file);axios({method: 'post',url: 'http://localhost:8080/upload',data: data,headers: {'Content-Type': 'multipart/form-data'}})})const downloadFileButton = document.querySelector('#downloadFile')downloadFileButton.addEventListener("click", () => {const fileName = document.querySelector('#fileName').valueaxios({method: 'get',url: "http://localhost:8080/getFile",params: { fileName: fileName }}).then((res) => {const str = res.data.replace('/\r\n/g', '\n')console.log(str)p.innerText = strconsole.log(res)})})</script>
</body>

总结

用起来还是十分方便的,我没有做JWT之类区分用户,正常来说估计需要通过用户信息创建不同的桶实现数据隔离(多租户),以及前端界面的展示,数据的流式上传下载等
Minio还有许多功能比如设置桶的权限,文件访问权限等,大伙可以自行研究

相关文章:

MinIo前后端实现

这几天想玩玩Minio&#xff0c;整体来说简单使用起来不复杂&#xff08;当然也有可能是我配置的太少了&#xff09; Minio下载 我是通过Dokcer在虚拟机上下载的&#xff08;Docker真好用啊&#xff09; 拉取Minio镜像 docker pull minio/minio启动Minio容器 docker run -d …...

mesh开发解析

开源的Mesh网络协议栈及相关项目&#xff1a; 1.B.A.T.M.A.N.(Better Approach to Mobile Ad-hoc Networking)• 简介&#xff1a;B.A.T.M.A.N.是一种用于多跳自组织网络的路由协议&#xff0c;适用于无线Mesh网络。它通过优化数据传输路径&#xff0c;确保网络的高可靠性和动…...

使用netlify部署github的vue/react项目或本地的dist,国内也可以正常访问

提供简洁的部署流程和丰富功能&#xff0c;如自定义域名、自动构建和服务器端功能。通过连接到 Git 仓库实现持续部署&#xff0c;每次推送代码都会自动构建和发布&#xff0c;支持无服务器函数&#xff0c;允许在前端项目中实现后端逻辑&#xff0c;提供直观的用户界面来管理和…...

LinuX---Shell正则表达式

正则表达式 正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里&#xff0c;正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中&#xff0c;grep&#xff0c;sed&#xff0c;awk等命令都支持通过正则表达式进行模式匹配…...

[Hello-CTF]RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)

温馨提示 这关涉及的知识点较多, 写的很长, 中间留了很多错误引导(本人在实验时遇到的问题, 或许你们也会遇到), 在后文才逐步解释源码分析 跟前几关一样, 更改了 WAF 的过滤字段这个关卡, 只有0, 1, (单引号), $, <, \ , ( , )可以用解题分析(实验这些命令, 可以先在自己本…...

基于PySide6与CATIA Automation的批量截图处理系统开发实践

引言 本文完整实现了基于PySide6 GUI框架与CATIA Automation技术的批量截图处理系统。系统支持对CATIA文件&#xff08;.CATPart/.CATProduct&#xff09;的自动化截图、图像优化及批量导出&#xff0c;通过模块化架构设计实现了超过200%的效率提升。本文将从技术架构、核心算…...

AI开发软件:开启智能时代的钥匙

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已不再是一个遥远的概念&#xff0c;而是深入到我们生活和工作的方方面面&#xff0c;成为推动各行业变革与发展的核心力量。AI 开发软件作为实现人工智能技术落地的关键工具&#xff0c;正引领着一场前所未有的…...

73.HarmonyOS NEXT PicturePreviewImage组件深度剖析:高级功能扩展与性能优化策略(三)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT PicturePreviewImage组件深度剖析&#xff1a;高级功能扩展与性能优化策略(三) 文章目录 HarmonyOS NEXT PicturePreviewImage组件…...

【模拟算法】

目录 替换所有的问号 提莫攻击 Z 字形变换 外观数列 数青蛙&#xff08;较难&#xff09; 模拟算法&#xff1a;比葫芦画瓢。思路较简单&#xff0c;考察代码能力。 1. 模拟算法流程&#xff0c;一定要在演草纸上过一遍流程 2. 把流程转化为代码 替换所有的问号 1576. 替…...

Spring Cloud 中的服务注册与发现: Eureka详解

1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时&#xff0c;URL 是写死的&#xff0c;例如&#xff1a; String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时&#xff0c;这个 URL 就需要相应地变…...

WireShark自动抓包

背景 异常流量检测是当前保护网络空间安全的重要检测方法。 对流量的研究&#xff0c;首先需要在系统中进行抓包&#xff0c;并对包进行分析。 这里对WireShark自动抓包进行简要介绍。 操作步骤 1、选择“捕获”>“选项”。 2、在Input下&#xff0c;选择要抓包的网络接…...

Redis 的应用场景

缓存&#xff1a; 作为缓存层&#xff0c;加速数据访问&#xff0c;减轻数据库压力&#xff0c;常用于网页、数据库查询结果的缓存。 会话存储&#xff1a; 存储用户会话信息&#xff0c;支持分布式系统中的会话共享。 消息队列&#xff1a; 利用列表和发布/订阅功能&#xf…...

React使用路由表

目录 前言 实现步骤 1. 安装依赖 2. 创建路由配置文件 高级配置 嵌套路由配置 对比两种配置方式 传统 JSX 方式 路由表方式优势 完整功能示例 带路由守卫的配置 注意事项 总结 前言 React Router 从 v6 版本开始支持类似 Vue 的集中式路由表配置方式&#xff0c;通…...

嵌入式C语言中堆栈管理与数据存储的精髓

在嵌入式开发中,理解C语言的内存管理和数据存储机制是至关重要的。本文将从堆栈管理和数据存储两个方面,深入探讨C语言在嵌入式Linux开发中的应用。 一、堆栈管理 1.1 栈的初始化与作用 栈是C语言运行的基础,主要用于存储函数参数、局部变量、函数返回值和编译器生成的临时…...

Linux系统之less命令的基本使用

Linux系统之less命令的基本使用 一、less命令介绍二、less命令的使用帮助2.1 less命令的帮助信息2.2 less命令主要选项解释 三、less命令的基本使用3.1 查看文件内容3.2 结合管道使用 四、注意事项 一、less命令介绍 在Linux和Unix类操作系统中&#xff0c;文件浏览是一项常见的…...

【免费】1949-2020年各省人均GDP数据

1949-2020年各省人均GDP数据 1、时间&#xff1a;1952-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;各省人均GDP 4、范围&#xff1a;31省 5、指标解释&#xff1a;人均GDP&#xff08;Gross Domestic Product per capita&#xff09;是指一个国家…...

三分钟掌握视频剪辑 | 在 Rust 中优雅地集成 FFmpeg

前言 在当今的短视频时代&#xff0c;高效的视频剪辑已成为内容创作者和开发者的迫切需求。无论是裁剪视频开头结尾、提取高光时刻&#xff0c;还是制作 GIF、去除广告&#xff0c;剪辑都是必不可少的一环。 然而&#xff0c;批量处理大量视频并非易事&#xff0c;常见的挑战…...

angular中下载接口返回文件

目录 一、URL.createObjectURL() 一、URL.createObjectURL() createObjectURL属于js的原生方法&#xff0c;位于window.URL上&#xff0c;用于将Blob或者File文件转换为可以临时的URL地址进行显示 **注意**&#xff1a;Angular 的 HttpClient 默认将响应解析为 JSON 对象‌16。…...

自定义tiptap插件

本文为开发开源项目的真实开发经历&#xff0c;感兴趣的可以来给我的项目点个star&#xff0c;谢谢啦~ 具体博文介绍&#xff1a; 开源&#xff5c;Documind协同文档&#xff08;接入deepseek-r1、支持实时聊天&#xff09;Documind &#x1f680; 一个支持实时聊天和接入 - 掘…...

爬虫基础之爬取豆瓣同城信息(保存为csv excel 数据库)

网站:长沙最近一周戏剧活动_豆瓣 温馨提示: 本案例仅供学习交流使用 本案例所使用的模块 requests(发送HTTP请求)pandas(数据保存模块)lxml(用于解析数据模块)csv(用于保存为csv文件)pymysql(用于操作数据库)parsel(解析数据的模块) 确定爬取的信息内容&#xff1a; 戏剧的名称…...

MongoDB Vs Elasticsearch

文章目录 前言一、核心区别二、优缺点MongoDBElasticsearch 三、如何选择四、结合使用总结 前言 MongoDB 和 Elasticsearch 在存储、查询方式、使用场景等方面有较大区别&#xff0c;以下是它们的核心区别、各自优缺点以及实际使用中的选择建议。 一、核心区别 对比项MongoDB…...

《蓝耘容器全栈技术指南:企业级云原生与异构计算实战大全》

在数字化转型的浪潮中&#xff0c;容器技术已成为企业构建云原生架构的核心引擎&#xff0c;而蓝耘容器凭借其轻量化内核、异构计算支持及混合云调度能力&#xff0c;正成为企业级应用的首选方案。本文基于《蓝耘容器全栈技术指南》&#xff0c;结合实战案例与技术原理&#xf…...

【Android】RuntimeShader 应用

1 简介 RuntimeShader 是 Android 13&#xff08;T&#xff09;中新增的特性&#xff0c;用于逐像素渲染界面&#xff0c;它使用 AGSL&#xff08;Android Graphics Shading Language&#xff09;编写着色器代码&#xff0c;底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…...

python 提取视频中的音频

在Python中提取视频中的音频&#xff0c;你可以使用moviepy库&#xff0c;这是一个非常强大且易于使用的库&#xff0c;专门用于视频编辑。以下是如何使用moviepy来提取视频中的音频的步骤&#xff1a; 安装moviepy 首先&#xff0c;你需要安装moviepy。你可以通过pip安装它&a…...

HTML+CSS基础(了解水平)

html 的介绍 学习目标 能够知道html的作用 1. html的定义 2. html的定义 HTML 的全称为&#xff1a;HyperText Mark-up Language, 指的是超文本标记语言。 标记&#xff1a;就是标签, <标签名称> </标签名称>, 比如: <html></html>、<h1><…...

提示词工程(Prompt Engineering)

https://www.bilibili.com/video/BV1PX9iYQEry 一、懂原理&#xff0c;要知道 为什么有的指令有效&#xff0c;有的指令无效为什么同样的指令有时有效&#xff0c;又是无效怎么提升指令有效的概率 大模型应用架构师想什么&#xff1f; 怎样能更准确&#xff1f;答&#xff1…...

MySQL中的B+树索引经验总结

一、什么是B树 B树是一种二叉树&#xff0c;由二叉查找树&#xff0c;平衡二叉树&#xff0c;B树演化而来。 请看上图 B树的特点&#xff1a; 1&#xff09;非叶子节点不存放数据&#xff0c;只存放键值&#xff0c;数据都存放在叶子节点中。 2&#xff09;叶子节点都在同一…...

社交网络分析实战(NetworkX分析Twitter关系图)

目录 社交网络分析实战(NetworkX分析Twitter关系图)1. 引言2. 项目背景与意义3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法3.3 数据集示例4. 社交网络分析理论4.1 节点度数与度分布4.2 网络密度4.3 中心性指标5. GPU加速在社交网络分析中的应用6. PyQt GUI与交互式可视…...

Windows功能之FTP服务器搭建

一、创作背景 之前有用linux系统搭建过ftp服务器&#xff0c;最近想着用windows系统也顺便搭建一个&#xff0c;看网上有第三方服务软件一键部署&#xff0c;记得windows可以不借助第三方软件就可以搭建&#xff0c;就想顺便操作试试&#xff0c;结果老是连接不上&#xff0c;费…...

linux系统命令——权限

一、有哪些权限 读&#xff08;r&#xff09;——对应数字4 写&#xff08;w&#xff09;——对应数字2 执行&#xff08;x&#xff09;——对应数字1 二、权限及数字的对应 4对应r-- 2对应-w- 1对应--x 5对应r-x 6对应rw- 7对应rwx 三、文件的基本属性 如图&#…...

DeepSeek本地部署 (Windows+Ollama+Docker Desktop+ RAGFlow)

适用场景&#xff1a; 1、商城的小机器人自动根据实际情况回复 2、需要7*24小时运行在线回复&#xff0c;如&#xff1a;在线购物、在线咨询、在线招生等 3、无人值守环境 2025年1月&#xff0c;DeepSeek 正式发布 DeepSeek-R1 推理大模型&#xff0c;DeepSeek-R1 成本价格低…...

H3C无线控制器二层注册典型配置举例

介绍AP与AC间通过二层网络完成注册的配置举例 组网需求 如图所示&#xff0c;集中式转发架构下&#xff0c;AC旁挂在L2 switch1上&#xff0c;L3 switch做DHCP server为AP、Client和Host分配IP地址。需要实现无线客户端Client通过AP连接到AC上&#xff0c;并能与有线客户端Hos…...

前端面试笔试

前端面试笔试 1 相对路径和绝对路径的区别 区别&#xff1a;他们描述文件或目录位置的方式不同 ‌绝对路径‌&#xff1a;绝对路径是指从系统的根目录开始的完整路径&#xff0c;无论当前工作目录在哪个位置&#xff0c;绝对路径始终指向文件或目录的确切位置。绝对路径适用…...

java的split分隔,使用regex

split(String regex) 是 Java 中 String 类的一个方法&#xff0c;用于根据正则表达式&#xff08;regex&#xff09;将字符串分割为子字符串数组。以下是一些常用的正则表达式及其用途&#xff1a; 按空格分割 正则表达式&#xff1a;“\s” 作用&#xff1a;匹配一个或多个…...

写时拷贝技术

目录 写时拷贝 核心思想 基本原理 基本过程 一个例子深入理解 补充知识--引用计数 小总结 写时拷贝实现 宏观理解&#xff08;进程、线程角度&#xff09; 资源共享 只读访问 写操作触发拷贝 独立修改 微观理解&#xff08;fork系统调用角度&#xff09; 进程创…...

HarmonyOS NEXT开发进阶(十二):build-profile.json5 文件解析

文章目录 一、前言二、Hvigor脚本文件三、任务与任务依赖图四、多模块管理4.1 静态配置模块 五、分模块编译六、配置多目标产物七、配置APP多目标构建产物八、定义 product 中包含的 target九、拓展阅读 一、前言 编译构建工具DevEco Hvigor&#xff08;以下简称Hvigor&#x…...

ubuntu系统下添加pycharm到快捷启动栏方法

一、背景 之前在ubuntu系统下使用pycharm时&#xff0c;总是要进入/home/dlut/pycharm-community-2022.1/bin文件夹下&#xff0c;然后终端执行命令下面的命令才可修改代码&#xff1a; ./pycharm.sh为了以后方便&#xff0c;这里给出添加pycharm到快捷启动栏的方法 二、添加…...

简述计算机网络中的七层模型和四层模型

在计算机网络中&#xff0c;网络协议栈的设计通常采用分层结构来处理不同的通信任务。常见的分层结构有OSI七层模型和TCP/IP四层模型。虽然它们的层次数量不同&#xff0c;但本质上都在解决如何有效地进行计算机间通信。本文将分别介绍这两种结构的功能和各层的协议。 一、OSI七…...

golang开发支持onlyoffice的token功能

一直都没去弄token这块&#xff0c;想着反正docker run的时候将jwt置为false即可。 看了好多文章&#xff0c;感觉可以试试&#xff0c;但是所有文件几乎都没说思路。 根据我的理解和成功的调试&#xff0c;思路是&#xff1a; 我们先定义2个概念&#xff0c;一个是文档下载…...

【Linux】:封装线程

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来封装线程相关的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…...

OpenCV多分辨率模板匹配与容错优化实战指南

第一章&#xff1a;问题背景与挑战 1.1 传统模板匹配的局限性 模板匹配&#xff08;Template Matching&#xff09;是计算机视觉中基础且广泛使用的技术&#xff0c;其核心思想是通过滑动窗口在目标图像中寻找与模板最相似的位置。然而&#xff0c;传统方法&#xff08;如Ope…...

「为爱发电」的硬核打开方式,涂鸦智能用AIoT引领智慧能源变革

全球能源危机与气候变化的双重压力下&#xff0c;人类正面临着一场前所未有的考验。据国际能源署预测&#xff0c;到2050年&#xff0c;若要实现碳中和目标&#xff0c;清洁能源需贡献全球电力结构的90%以上。在这场关乎人类未来的能源革命中&#xff0c;不仅需要技术创新&…...

uniapp-x 子组件样式覆盖

不支持scoped 默认不支持scoped&#xff0c;所以写也没用 那如果我想修改子孙节点的样式是不是很方便&#xff0c;不需要v-deep了&#xff1f; 的确如此 自带页面样式隔离 在 uni-app x 中&#xff0c;不支持 css scoped&#xff0c;样式的作用范围遵循以下规则&#xff1a;…...

word处理控件Aspose.Words教程:使用 Python 删除 Word 中的空白页

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理&#xff0c;并…...

MIDI,AI 3D场景生成技术

MIDI&#xff08;Multi-Instance Diffusion for Single Image to 3D Scene Generation&#xff09;是先进的3D场景生成技术&#xff0c;能在短时间内将单张图像转化为高保真度的3D场景。通过智能分割输入图像&#xff0c;识别出场景中的独立元素&#xff0c;再基于多实例扩散模…...

ICLR2025 | SLMRec: 重新思考大语言模型在推荐系统中的价值

note 问题背景&#xff1a;序列推荐&#xff08;SR&#xff09;任务旨在预测用户可能的下一个交互项目。近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在SR系统中表现出色&#xff0c;但它们巨大的规模使得在实际平台中应用变得低效和不切实际。 研究动机&…...

走路碎步营养补充贴士

走路碎步&#xff0c;这种步伐不稳的现象&#xff0c;在日常生活中并不罕见&#xff0c;特别是对于一些老年人或身体较为虚弱的人来说&#xff0c;更是一种常见的行走状态。然而&#xff0c;这种现象可能不仅仅是肌肉或骨骼的问题&#xff0c;它还可能是身体在向我们发出营养缺…...

【bug日记】 编译错误

在我使用vscode的时候&#xff0c;我想用一个头文件和两个cpp文件&#xff0c;头文件是用来声明一个类的&#xff0c;一个cpp是用来类的成员函数&#xff0c;一个cpp是主函数 但是我写完编译发现会弹出找不到这个类成员函数这个cpp文件&#xff0c;爆出这样的错误 提示我找不到…...

计算机视觉cv2入门之边缘检测

检测原理 边缘检测是指检测图像中的一些像素点&#xff0c;它们周围的像素点的灰度发生了急剧的变化&#xff0c;因此可以将这些像素点作为一个集合,用于标注图像中不同物体的边界。 边缘是图像上灰度级变化很快的点的集合。这些点的梯度往往很大。因此我们可以使用一阶导数和二…...

python脚本实现服务器内存和cpu使用监控,并记录日志,可以设置阈值和采样频率

Python 脚本&#xff0c;实现以下功能&#xff1a; 按日期自动生成日志文件&#xff08;例如 cpu_mem_20231001.csv&#xff09;当 CPU 或内存超过阈值时触发记录独立记录报警事件&#xff08;保存到 alert.log&#xff09;支持自定义阈值和监控间隔 脚本代码 import psutil …...