SpringBoot项目集成MinIO
最近在学习MinIO,所以想让自己的SpringBoot项目集成MinIO,在网上查阅资料,并进行操作的过程中遇到一些问题,所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。
一. MinIO的下载安装以及基本使用
1. 下载地址:https://dl.min.io/server/minio/release/windows-amd64/minio.exe
2. 下载好后需要手动创建data文件夹用于存储MinIO中的数据。
3. 键入cmd
4. 设置MinIO的一些变量
set MINIO_ROOT_USER=admin
set MINIO_ROOT_PASSWORD=admin123
set MINIO_ACCESS_KEY=admin
set MINIO_SECRET_KEY=admin123
下面是我踩的坑,如果只设置了MINIO_ROOT_USER和MINIO_ROOT_PASSWORD的值,而不设置MINIO_ACCESS_KEY和MINIO_SECRET_KEY的值,当启动minio服务的时候就会报以下异常:
所以一定要设置好后面两个变量的值。
5. 启动minio服务
> minio.exeserver data
启动后就会出现minio服务的地址,按住ctrl再点击即可访问该网址。
6.进入登录页面后,输入对应的用户名和密码,也就是之前设置的MINIO_ROOT_USER和MINIO_ROOT_PASSWORD的值。
7. 进入主界面后,点击左侧导航栏中的Buckets,然后点击Create Bucket。
8. 创建好之后,点击左侧导航栏中的Object Browser就可以看到创建好的桶了。
9. 进入该桶,点击upload,上传一个文件,桶的默认权限是private,所以外界访问不到,需要修改访问权限为public,但是要注意安全问题。
10. 点击左侧导航栏中的Buckets,进入该桶,修改权限为public,这样外界就可以访问上传的文件了。
二. SpringBoot集成MinIO
- 引入依赖
2. 编写配置文件
server:
port: 8081
spring:
配置文件上传大小限制
servlet:
multipart:
max-file-size: 200MB
max-request-size: 200MB
minio:
host: http://127.0.0.1:9000
url: m i n i o . h o s t / {minio.host}/ minio.host/{minio.bucket}/
access-key: minioadmin
secret-key: minioadmin
bucket: public
3. 添加配置文件
package com.suwell.serv.ocr.component;
?
import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.PutObjectOptions;
import io.minio.Result;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.util.UriUtils;
?
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
?
?
@Component
public class MinioConfig implements InitializingBean {
?? ?@Value(value = "${minio.bucket}")? ?private String bucket;
?? ?@Value(value = "${minio.host}")? ?private String host;
?? ?@Value(value = "${minio.url}")? ?private String url;
?? ?@Value(value = "${minio.access-key}")? ?private String accessKey;
?? ?@Value(value = "${minio.secret-key}")? ?private String secretKey;
?? ?private MinioClient minioClient;
?? ?@Override? ?public void afterPropertiesSet() throws Exception {? ? ? ?Assert.hasText(url, "Minio url 为空");? ? ? ?Assert.hasText(accessKey, "Minio accessKey为空");? ? ? ?Assert.hasText(secretKey, "Minio secretKey为空");? ? ? ?this.minioClient = new MinioClient(this.host, this.accessKey, this.secretKey);? }
?
?
?? ?/**? ? * 上传? ? */? ?public String putObject(MultipartFile multipartFile) throws Exception {? ? ? ?// bucket 不存在,创建? ? ? ?if (!minioClient.bucketExists(this.bucket)) {? ? ? ? ? ?minioClient.makeBucket(this.bucket);? ? ? }? ? ? ?try (InputStream inputStream = multipartFile.getInputStream()) {? ? ? ? ? ?// 上传文件的名称? ? ? ? ? ?String fileName = multipartFile.getOriginalFilename();? ? ? ? ? ?// PutObjectOptions,上传配置(文件大小,内存中文件分片大小)? ? ? ? ? ?PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);? ? ? ? ? ?// 文件的ContentType? ? ? ? ? ?putObjectOptions.setContentType(multipartFile.getContentType());? ? ? ? ? ?minioClient.putObject(this.bucket, fileName, inputStream, putObjectOptions);? ? ? ? ? ?// 返回访问路径? ? ? ? ? ?return this.url + UriUtils.encode(fileName, StandardCharsets.UTF_8);? ? ? }? }
?? ?/**? ? * 文件下载? ? */? ?public void download(String fileName, HttpServletResponse response){? ? ? ?// 从链接中得到文件名? ? ? ?InputStream inputStream;? ? ? ?try {? ? ? ? ? ?MinioClient minioClient = new MinioClient(host, accessKey, secretKey);? ? ? ? ? ?ObjectStat stat = minioClient.statObject(bucket, fileName);? ? ? ? ? ?inputStream = minioClient.getObject(bucket, fileName);? ? ? ? ? ?response.setContentType(stat.contentType());? ? ? ? ? ?response.setCharacterEncoding("UTF-8");? ? ? ? ? ?response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));? ? ? ? ? ?byte[] buffer = new byte[1024];? ? ? ? ? ?int length;? ? ? ? ? ?while ((length = inputStream.read(buffer)) > 0) {? ? ? ? ? ? ? ?response.getOutputStream().write(buffer, 0, length);? ? ? ? ? }? ? ? ? ? ?inputStream.close();? ? ? } catch (Exception e){? ? ? ? ? ?e.printStackTrace();? ? ? ? ? ?System.out.println("有异常:" + e);? ? ? }? }
?? ?/**? ? * 列出所有存储桶名称? ? *? ? * @return? ? * @throws Exception? ? */? ?public List<String> listBucketNames()? ? ? ? ? ?throws Exception {? ? ? ?List<Bucket> bucketList = listBuckets();? ? ? ?List<String> bucketListName = new ArrayList<>();? ? ? ?for (Bucket bucket : bucketList) {? ? ? ? ? ?bucketListName.add(bucket.name());? ? ? }? ? ? ?return bucketListName;? }
?? ?/**? ? * 查看所有桶? ? *? ? * @return? ? * @throws Exception? ? */? ?public List<Bucket> listBuckets()? ? ? ? ? ?throws Exception {? ? ? ?return minioClient.listBuckets();? }
?? ?/**? ? * 检查存储桶是否存在? ? *? ? * @param bucketName? ? * @return? ? * @throws Exception? ? */? ?public boolean bucketExists(String bucketName) throws Exception {? ? ? ?boolean flag = minioClient.bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?return true;? ? ? }? ? ? ?return false;? }
?? ?/**? ? * 创建存储桶? ? *? ? * @param bucketName? ? * @return? ? * @throws Exception? ? */? ?public boolean makeBucket(String bucketName)? ? ? ? ? ?throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (!flag) {? ? ? ? ? ?minioClient.makeBucket(bucketName);? ? ? ? ? ?return true;? ? ? } else {? ? ? ? ? ?return false;? ? ? }? }
?? ?/**? ? * 删除桶? ? *? ? * @param bucketName? ? * @return? ? * @throws Exception? ? */? ?public boolean removeBucket(String bucketName)? ? ? ? ? ?throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?Iterable<Result<Item>> myObjects = listObjects(bucketName);? ? ? ? ? ?for (Result<Item> result : myObjects) {? ? ? ? ? ? ? ?Item item = result.get();? ? ? ? ? ? ? ?// 有对象文件,则删除失败? ? ? ? ? ? ? ?if (item.size() > 0) {? ? ? ? ? ? ? ? ? ?return false;? ? ? ? ? ? ? }? ? ? ? ? }? ? ? ? ? ?// 删除存储桶,注意,只有存储桶为空时才能删除成功。? ? ? ? ? ?minioClient.removeBucket(bucketName);? ? ? ? ? ?flag = bucketExists(bucketName);? ? ? ? ? ?if (!flag) {? ? ? ? ? ? ? ?return true;? ? ? ? ? }
?? ? ? }? ? ? ?return false;? }
?? ?/**? ? * 列出存储桶中的所有对象? ? *? ? * @param bucketName 存储桶名称? ? * @return? ? * @throws Exception? ? */? ?public Iterable<Result<Item>> listObjects(String bucketName) throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?return minioClient.listObjects(bucketName);? ? ? }? ? ? ?return null;? }
?? ?/**? ? * 列出存储桶中的所有对象名称? ? *? ? * @param bucketName 存储桶名称? ? * @return? ? * @throws Exception? ? */? ?public List<String> listObjectNames(String bucketName) throws Exception {? ? ? ?List<String> listObjectNames = new ArrayList<>();? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?Iterable<Result<Item>> myObjects = listObjects(bucketName);? ? ? ? ? ?for (Result<Item> result : myObjects) {? ? ? ? ? ? ? ?Item item = result.get();? ? ? ? ? ? ? ?listObjectNames.add(item.objectName());? ? ? ? ? }? ? ? }? ? ? ?return listObjectNames;? }
?? ?/**? ? * 删除一个对象? ? *? ? * @param bucketName 存储桶名称? ? * @param objectName 存储桶里的对象名称? ? * @throws Exception? ? */? ?public boolean removeObject(String bucketName, String objectName) throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?if (flag) {? ? ? ? ? ?List<String> objectList = listObjectNames(bucketName);? ? ? ? ? ?for (String s : objectList) {? ? ? ? ? ? ? ?if(s.equals(objectName)){? ? ? ? ? ? ? ? ? ?minioClient.removeObject(bucketName, objectName);? ? ? ? ? ? ? ? ? ?return true;? ? ? ? ? ? ? }? ? ? ? ? }? ? ? }? ? ? ?return false;? }
?? ?/**? ? * 文件访问路径? ? *? ? * @param bucketName 存储桶名称? ? * @param objectName 存储桶里的对象名称? ? * @return? ? * @throws Exception? ? */? ?public String getObjectUrl(String bucketName, String objectName) throws Exception {? ? ? ?boolean flag = bucketExists(bucketName);? ? ? ?String url = "";? ? ? ?if (flag) {? ? ? ? ? ?url = minioClient.getObjectUrl(bucketName, objectName);? ? ? }? ? ? ?return url;? }
?
}
4. 编写测试类进行测试
package com.suwell.serv.ocr.controller;
?
import com.suwell.serv.ocr.component.MinioConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
?
import javax.servlet.http.HttpServletResponse;
import java.util.List;
?
@RestController
@CrossOrigin
@RequestMapping("/test")
public class MinioController {
?? ?@Autowired? ?MinioConfig minioConfig;
?? ?// 上传? ?@PostMapping("/upload")? ?public Object upload(@RequestParam("file") MultipartFile multipartFile) throws Exception {? ? ? ?return this.minioConfig.putObject(multipartFile);? }
?? ?// 下载文件? ?@GetMapping("/download")? ?public void download(@RequestParam("fileName")String fileName, HttpServletResponse response) {? ? ? ?this.minioConfig.download(fileName,response);? }
?? ?// 列出所有存储桶名称? ?@PostMapping("/list")? ?public List<String> list() throws Exception {? ? ? ?return this.minioConfig.listBucketNames();? }
?? ?// 创建存储桶? ?@PostMapping("/createBucket")? ?public boolean createBucket(String bucketName) throws Exception {? ? ? ?return this.minioConfig.makeBucket(bucketName);? }
?? ?// 删除存储桶? ?@PostMapping("/deleteBucket")? ?public boolean deleteBucket(String bucketName) throws Exception {? ? ? ?return this.minioConfig.removeBucket(bucketName);? }
?? ?// 列出存储桶中的所有对象名称? ?@PostMapping("/listObjectNames")? ?public List<String> listObjectNames(String bucketName) throws Exception {? ? ? ?return this.minioConfig.listObjectNames(bucketName);? }
?? ?// 删除一个对象? ?@PostMapping("/removeObject")? ?public boolean removeObject(String bucketName, String objectName) throws Exception {? ? ? ?return this.minioConfig.removeObject(bucketName, objectName);? }
?? ?// 文件访问路径? ?@PostMapping("/getObjectUrl")? ?public String getObjectUrl(String bucketName, String objectName) throws Exception {? ? ? ?return this.minioConfig.getObjectUrl(bucketName, objectName);? }
}
5. 使用postman进行本地测试
6. 最后查看public桶中是否有刚才上传的文件就可以了。如果有则表明你的项目已经成功集成minio了。
以上就是springboot项目如何集成minio的全部内容了,如果对你有帮助我会感到非常荣幸。
相关文章:
SpringBoot项目集成MinIO
最近在学习MinIO,所以想让自己的SpringBoot项目集成MinIO,在网上查阅资料,并进行操作的过程中遇到一些问题,所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。 一. MinIO的下载安装以及基本使用 1. 下载地址:https://d…...
【Flutter】常用样式、方法、组件(长期更新中)
一、样式设置 设置颜色透明度:color: Color(0xff4B9E32).withOpacity(0.08) 二、常用方法 数组排序:list.sort(); **升序**:(obj1, obj2) > obj1.compareTo(obj2) **降序**:(obj1, obj2) > obj2.compareTo(obj1)obj1.co…...
dbus接口方法的variant类型传参详解
python实现c++中so库调用及dbus服务开发-CSDN博客 之前写的这篇博文介绍了如何创建一个dbus服务,但是注册的接口方法的入参还是比较简单的,实际上dbus的参数类型有很多种,调用方式也有多种,我们来逐一介绍下。 其实基础数据类型,如字符串、整型、浮点型、布尔型等大多数…...
【时时三省】(NIT计算机考试)Word的使用方法
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 一、软件简介 Microsoft Word,简称Word,是微软公司开发的一款文字处理软件,广泛应用于文档编辑、排版、打印等领域。无论是撰写论文、报告、简历…...
spring技术点
引入对象 Autowired 和 Resource的区别 Autowired 和 Resource的区别 valid 参数校验 jarkata进行SpringMVC校验 常规当前进行校验的配置操作,参考文档如下进行操作。 SpringMVC校验注解不生效 List类型参数校验 由于list类型默认不能进行标注校验实现&#x…...
工业—使用Flink处理Kafka中的数据_ChangeRecord1
使用 Flink 消费 Kafka 中 ChangeRecord 主题的数据,当某设备 30 秒状态连续为 “ 预警 ” ,输出预警 信息。当前预警信息输出后,最近30...
实验日志——DETR
DETR训练日志 1. 代码来源 代码源自作者的Github: https://github.com/facebookresearch/detr?tabreadme-ov-file 2. 数据来源 在DETR中只使用了COCO2017数据集,其中训练集有118288张图像,验证集有5001张数据,测试集有40671张数据&#…...
前端常用缓存技术深度剖析
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
汽车IVI中控开发入门及进阶(三十七):基于HFP协议的蓝牙电话
概述: HFP全称Hands-free Profile,是一款让蓝牙设备控制电话的软件,多用于汽车上。此类设备最常见的例子是车载免提装置与蜂窝电话或可穿戴无线耳机一起使用。该配置文件定义了支持免提配置文件的两个设备如何在点对点的基础上相互交互。免提模式的实现通常使耳机或嵌入式免…...
分布式系统架构1:共识算法Paxos
1.背景 今天开始更新分布式的文章,工作几年后还没系统的学习分布式的内容,趁着还有时间学习沉淀的时候多输出些文章 2.为什么需要分布式共识算法 思考:现在你有一份随时变动的数据,需要确保它正确存储在网络的几台不同机器上&a…...
大语言模型应用Text2SQL本地部署实践初探
自从两年前OpenAI公司发布ChatGPT后,大模型(Large Language Model,简称LLM)相关技术在国内外可谓百家争鸣,遍地开花,在传统数据挖掘、机器学习和深度学习的基础上,正式宣告进入快速发展的人工智能(Artificial Intellig…...
C# WPF抽奖程序
C# WPF抽奖程序 using Microsoft.Win32; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.…...
linux运维命令
防火墙相关命令 防火墙规则查看 firewall-cmd --list-all 禁ping firewall-cmd --permanent --add-rich-rulerule protocol valueicmp drop firewall-cmd --reload 执行完以上命令后,通过firewall-cmd --list-all查看规则生效情况 firewall-cmd --list-all 其…...
环境兼容: Vue3+ELement-plus
题目:环境兼容: Vue3ELement-plus 前言 身为小白的我也在负责一个项目咯,开发的是Vue3项目,然后就搜阅多篇文章,整理了这个。内容很多是转载的,拼成的我这个文章。 Element-plus简介 Element-plus 是基于…...
解决 PyTorch 中的 AttributeError: ‘NoneType‘ object has no attribute ‘reshape‘ 错误
这里写目录标题 一、错误分析二、错误原因三、解决方案1. 检查损失函数2. 检查前向传播3. 检查 backward 函数4. 检查梯度传递 四、前向传播与反向传播1. 前向传播2. 反向传播3. 自定义 backward 函数示例反向传播过程:常见的错误:1:损失函数…...
Unity 设计模式-命令模式(Command Pattern)详解
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成对象,从而使得可以使用不同的请求、队列或日志请求,以及支持可撤销的操作。命令模式通常包含四个主要角色:命令(Command…...
如何解决maven项目使用Ctrl + /添加注释时的顶格问题
一、问题描述 相信后端开发的程序员一定很熟悉IDEA编译器和Maven脚手架,使用IDEA新建一个Maven工程,通过SpringBoot快速构建Spring项目。在Spring项目pom.xml文件中想添加注释,快捷键Ctrl /,但是总是顶格书写。 想保证缩进统一…...
网络安全信息收集(总结)更新
目录 重点: 前言: 又学到了,就是我们什么时候要子域名收集,什么时候收集域名,重点应该放前面 思考: 信息收集分为哪几类,什么是主域名,为什么要收集主域名,为什么要收…...
微服务-seata分布式事务
1.简述 1.1.什么是分布式事务 事务:是应用程序中一系列严密的操作,所有操作必须成功完成,要么全部失败,ACID 特性。本地事务:关系型数据库中,由一组SQL组成的一个执行单元,该单元要么整体成功,要么整体失败ÿ…...
(亲测好用)YOLO格式txt数据集转COCO格式json
1、数据集结构形式 YOLO格式数据集: b文件夹下有images和labels两个文件夹,分别存放图片和标签格式的数据。 两个文件夹下分别有train、val、test三个文件夹,里面存放对应的数据。 COCO数据集格式: COCO格式数据文件夹下有三个…...
LVS的DR模式是否依赖内核的数据包转发
LVS的DR模式是否依赖内核的数据包转发 是的,LVS(Linux Virtual Server) 的 DR(Direct Routing)模式 依赖于 内核的数据包转发。在 DR 模式下,数据包的转发行为是由 Linux 内核进行的,因此正确配…...
沿着数组的指定轴对每行(列)应用一个函数np.apply_along_axis
【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 沿着数组的指定轴 对每行(列)应用一个函数 np.apply_along_axis [太阳]选择题 根据题目代码,执行的结果是? import numpy as np array np.array([[1, 2, 3],…...
BEPUphysicsint定点数3D物理引擎使用
原文:BEPUphysicsint定点数3D物理引擎使用 - 哔哩哔哩 上一节給大家介绍了BEPUphysicsint的一些基本的情况,这节课我们来介绍它的基本使用,本节主要从以下5个方面来介绍: (1) 创建一个物理世界Space,并开启模拟迭代; (2) 添加一个物理物体…...
LinuxUDP编程
由于UDP是无连接、尽力传输的,所以Server端绑定完IP、端口号后,使用recvfrom可以阻塞等待客户端的数据,而且Client端通过sendto发送的数据包直接发送到互联网(也是基于IP、端口号)这种操作是不担保Server端是否收到的&…...
Elasticsearch vs 向量数据库:寻找最佳混合检索方案
图片来自Shutterstock上的Bakhtiar Zein 多年来,以Elasticsearch为代表的基于全文检索的搜索方案,一直是搜索和推荐引擎等信息检索系统的默认选择。但传统的全文搜索只能提供基于关键字匹配的精确结果,例如找到包含特殊名词“Python3.9”的文…...
Android显示系统(07)- OpenGL ES - 纹理Texture
Android显示系统(02)- OpenGL ES - 概述 Android显示系统(03)- OpenGL ES - GLSurfaceView的使用 Android显示系统(04)- OpenGL ES - Shader绘制三角形 Android显示系统(05)- OpenGL…...
C#加速Bitmap存图
如果希望大幅提高图像保存速度,特别是在处理非常大的图像时,可以尝试以下更直接、更高效的方法: 1. 避免使用 Bitmap 类的 Save 方法 Bitmap.Save 方法的速度受限于 GDI 库的操作,尤其是对于非常大的图像,它可能会经历…...
打通Vue3+Flask(python3)+Mysql-实现简单数据交互
一、需要准备的工具 下载python3,Vscode,pycharm(这里用的社区版),phpstudy_pro,Node.js(建议下载长期支持版本,版本不宜过低,比如18,20),Vue.js…...
PT8M2102 触控型 8Bit MCU
1 产品概述 ● PT8M2102 是一款基于 RISC 内核的8位 MTP 单片机,内部集成了电容式触摸感应模块、TIMER,PWM、LVR、LVD、WDT等外设,其主要用作触摸按键开关,广泛适用于触控调光、电子玩具、消费电子、家用电器等领域,具…...
【PyQt5教程 一】Qt Designer 安装及其使用方法说明,附程序源码
目录 一、PyQt5介绍: (1)PyQt简介: (2)PyQt API: (3)支持的环境: (4)安装: (5)配置环境变量…...
Spark on Yarn安装配置,大数据技能竞赛(容器环境)
Spark on Yarn模式,即把Spark作为一个客户端,将作业提交给Yarn服务,由于在生产环境中,很多时候都要与Hadoop使用同一个集群,因此采用Yarn来管理资源调度,可以有效提高资源利用率。 环境说明: 服…...
★ 数据结构 ★ 排序
Ciallo~(∠・ω< )⌒☆ ~ 今天,我将和大家一起学习数据结构中的各种排序~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页:椎名澄嵐-CSDN博客 数据结构专栏:https://blog.csdn.net/2302_80328146/categ…...
数据结构 (26)图的遍历
前言 数据结构中的图遍历是指从图中的任一顶点出发,按照某种方法访问图中的所有顶点,且每个顶点只访问一次。 一、遍历方法 遍历主要有两种方法:深度优先搜索(DFS)和广度优先搜索(BFS)。 1.深度…...
用vue框架写一个时钟的页面
你可以使用Vue框架来创建一个简单的时钟页面。首先,你需要在HTML文件中引入Vue框架的CDN: <script src"https://cdn.jsdelivr.net/npm/vue"></script>然后,创建一个包含时钟功能的Vue实例: <div id&qu…...
【Android】View的工作流程——measure
1.View的工作流程入口 1.1DecorView被加载到Window中 看到这里你对Activity的构成有一定的了解,每个 Activity 都有一个与之关联的 Window 对象,而 DecorView 是这个 Window 的根视图。当DecorView被创建以及加载资源的时候,此时它的内容还…...
day35—蓝桥杯2024年第16届校赛模拟第二期-T4(最小花费)
【问题描述】 小蓝有一个整数,初始值为 1 ,他可以花费一些代价对这个整数进行变换。 小蓝可以花费 1 的代价将整数增加 1 。 小蓝可以花费 3 的代价将整数增加一个值,这个值是整数的数位中最大的那个(1 到 9)。 小蓝可…...
Java 中 List 接口的学习笔记
1. 什么是 List? 在 Java 中,List 是一个接口,属于 Java Collections Framework。它表示一个有序的集合,可以包含重复元素。List 接口允许通过索引访问元素,提供了多种实现方式,如 ArrayList 和 LinkedLis…...
朗新科技集团如何用云消息队列 RocketMQ 版“快、准、狠”破解业务难题?
作者:邹星宇、刘尧 朗新科技集团:让数字化的世界更美好 朗新科技集团股份有限公司是领先的能源科技企业,长期深耕电力能源领域,通过新一代数字化、人工智能、物联网、电力电子技术等新质生产力,服务城市、产业、生活中…...
hive hms和hs2的sql执行日志分析
HMS日志: 2024-12-02 15:39:20,811 INFO org.apache.hadoop.hive.metastore.HiveMetaStore: [pool-8-thread-114]: 114: source:10.11.17.999 get_all_databases 2024-12-02 15:39:20,812 INFO org.apache.hadoop.hive.metastore.HiveMetaStore.audit: [pool-8-thre…...
Mybatis-plus 多租户插件
前言 本篇主要分析Mybatis-plus 多租户插件,然后根据多租户插件在延伸到其他场景 案例 Mybatis-plus官网对多租户插件已有详细讲解,这里就不在附上使用案例。 源码分析 MybatisPlus官方是由TenantLineInnerInterceptor这个拦截器进行多租户功能处理…...
浅谈新能源汽车感应钥匙一键启动的步骤和特点
随着汽车智能化技术的发展,无钥匙启动系统还可以与其他智能系统进行集成,如智能车载系统、远程控制系统等。这使得车主可以通过智能手机等智能设备远程控制车辆的启动、解锁、上锁等操作,进一步提升了使用的便捷性和智能化水平。新能源汽车…...
012 路由信息协议RIP
路由信息协议RIP 作为度量(Metric)来衡量到达目的网络的距离 RIP是一种基于距离矢量D-V(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。 默认情况下,路由器到与它直接相连网络的跳数为0,因此…...
008.精读《Apache Paimon Docs - Table w/o PK》
文章目录 1. 引言2. 基本概念2.1 定义2.2 使用场景 3. 流式处理3.1 自动小文件合并3.2 流式查询 4. 数据更新4.1 查询4.2 更新4.3 分桶附加表 5 总结 1. 引言 通过本文,上篇我们了解了Apache Paimon 主键表,本期我们将继续学习附加表(Append…...
在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208
🛠️ 在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践 ⭐ 引言 随着大语言模型(LLM)和人工智能技术的迅猛发展,开发者们越来越多地尝试在本地环境中部署模型进行实验。 但部署过程中常…...
微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算
微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…...
网络原理——HTTPS
一、什么是HTTPS 1.1 HTTPS的概念 HTTPS 也是⼀个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层(即HTTP SSL/TLS,SSL、TLS也是一个应用层协议,专门负责加密) HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输…...
数据结构之四:堆和二叉树
堆的实现:SData/Heap/heap.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 树 树的概念 树:是一个非线性数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树,也就…...
语音识别flask接口开发
要开发一个flask语音识别接口,首先要解决语音文件在网络中的传输问题,然后选识别算法进行识别 文章目录 1、以二进制文件流方式上次语音2、网页端长连接流式上传语音文件3、语音识别接口 1、以二进制文件流方式上次语音 python服务端代码,以…...
MISRA C2012学习笔记(10)-Rules 8.15
文章目录 8.15 控制流(Control flow)Rule 15.1 不应使用 goto 语句Rule 15.2 goto 语句仅允许跳到在同一函数中声明的稍后位置的标签Rule 15.3 goto 语句引用的标签必须在 goto 语句所在代码块或包含该代码块的上级代码块中声明Rule 15.4 最多只能有一个用于终止循环语句的 bre…...
《深入浅出HTTPS》读书笔记(16):消息验证码算法分类
MAC算法有两种形式,分别是CBC-MAC算法和HMAC算法。 CBC-MAC算法从块密码算法的CBC分组模式演变而来,简单地说就是最后一个密文分组的值就是MAC值。 HMAC(Hash-based Message Authentication Code)算法使用Hash算法作为加密基元&am…...