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

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作

1、本地部署MinIO服务

2、创建MinIO的Access Key

3、创建.net 项目

4、下载MinIO sdk

5、相关文档

二、编写MinIO工具类

三、管理存储桶

1、MyBucket类

(1)判断bucket是否存在

(2)新建bucket

(3)删除bucket 

(4)获取bucket列表

2、BucketController

3、实现效果

(1)判断bucket是否存在

(2)新建bucket

(3)删除bucket

(4)获取bucket列表

四、管理文件

1、MyObject类

(1)下载文件对象

(2)上传文件对象

(3)删除文件对象

(4)获取文件对象URL

2、ObjectController 

3、实现效果

(1)下载指定文件

(2)上传指定文件

(3)删除指定文件 

(4)获取指定文件URL 


一、准备工作

1、本地部署MinIO服务

需要在本地部署MinIO,并启动服务;可以参考这篇文章

Windows部署MinIO,搭建本地对象存储服务-CSDN博客

2、创建MinIO的Access Key

在MinIO控制台,选择【Access Keys】,点击【Create access key】;

点击【Create】创建用于连接MinIO服务的Key和Secret(很重要,一定要另存下来);

3、创建.net 项目

打开Visual Studio,新建项目,选择Web Api框架

选择.net8.0

4、下载MinIO sdk

使用NuGet包管理器找到并安装MinIIO的sdk,如下图所示,

这里安装的是最新版6.0.2;

5、相关文档

.NET API 开发文档(英文)

.NET API 参考文档(中文)

以官网的英文文档为主,中文文档为辅;

二、编写MinIO工具类

在代码中编写一个用来连接MinIO服务的工具类【MinIO.cs】,放在项目的【Helper】文件夹中;

【Helper/MinIO.cs】

using Minio;namespace Zyl_MinIO_Demo.Helper
{public class MinIO{private static string endPoint = "127.0.0.1:9001";  private static string accessKey = "连接minio服务的key";   private static string secretKey= "连接minio服务的secret";private static bool secure = false; public static MinioClient CreateMinioClient(){MinioClient minioClient = (MinioClient)new MinioClient().WithEndpoint(endpoint).WithCredentials(accessKey, secretKey).WithSSL(secure)   .Build();return minioClient;}}
}
// 该方法用来初始化MinIO对象。
MinioClient minioClient = new MinioClient().WithEndpoint(endPoint).WithCredentials(accessKey, secretKey).WithSSL(secure).Build(); 
  • endPoint :MinIO服务启动的URL,注意自己启动服务的端口号;

  • accessKey :在MinIO控制台申请的Access Key;
  • secretKey:在MinIO控制台申请的Access Secret;

  • secure :布尔值(默认值  true),是否启用HTTPS;

三、管理存储桶

1、MyBucket类

在【Managers】文件夹中新建【MyBucket】类,用来管理存储桶;

【Managers/MyBucket.cs】

using Minio.DataModel.Args;
using Minio.Exceptions;
using Minio;
using Zyl_MinIO_Demo.Helper;
using Minio.DataModel.Result;namespace Zyl_MinIO_Demo.Managers
{public class MyBucket{// 实例化 minioClientprivate static MinioClient minioClient = MinIO.CreateMinioClient();/// <summary>/// 1、判断bucket是否存在/// </summary>/// <param name="bucketName"></param>/// <returns></returns>public static async Task<string> IsExistStr(string bucketName){try{BucketExistsArgs args = new BucketExistsArgs().WithBucket(bucketName);bool found = await minioClient.BucketExistsAsync(args).ConfigureAwait(false);Console.WriteLine("found。。。。。。", found);if (found){Console.WriteLine($"{bucketName}桶已存在");return $"{bucketName}桶已存在";}else{Console.WriteLine($"{bucketName}桶不存在");return $"{bucketName}桶不存在";}}catch (MinioException e){Console.WriteLine("[Bucket]  Exception: {0}", e);return "出错啦!!!";}}/// <summary>/// 2、创建一个bucket/// </summary>/// <param name="bucketName"></param>/// <returns></returns>public static async Task<string> Create(string? bucketName){try{BucketExistsArgs args = new BucketExistsArgs().WithBucket(bucketName);bool found = await minioClient.BucketExistsAsync(args).ConfigureAwait(false);if (found){return $"{bucketName}桶已存在";}else{MakeBucketArgs makeBucketArgs = new MakeBucketArgs().WithBucket(bucketName);await minioClient.MakeBucketAsync(makeBucketArgs).ConfigureAwait(false);return $"{bucketName}桶已成功创建";}}catch (MinioException e){Console.WriteLine("[Bucket]  Exception: {0}", e);return "出错啦!!!";}}/// <summary>/// 3、移除一个bucket/// </summary>/// <param name="bucketName"></param>/// <returns></returns>public static async Task<string> Delete(string? bucketName){try{BucketExistsArgs args = new BucketExistsArgs().WithBucket(bucketName);bool found = await minioClient.BucketExistsAsync(args).ConfigureAwait(false);if (!found){return $"{bucketName}桶不存在";}else{RemoveBucketArgs removeBucketArgs = new RemoveBucketArgs().WithBucket(bucketName);await minioClient.RemoveBucketAsync(removeBucketArgs);return $"{bucketName}桶删除成功";}}catch (MinioException e){Console.WriteLine("[Bucket]  Exception: {0}", e);return "出错啦!!!";}}/// <summary>/// 4、获取已有的bucket列表/// </summary>/// <returns></returns>public static async Task<ListAllMyBucketsResult?> GetList(){try{return await minioClient.ListBucketsAsync();}catch (MinioException e){Console.WriteLine("Error occurred: " + e);return null ;}}}
}

(1)判断bucket是否存在

Task<bool> BucketExistsAsync(BucketExistsArgs args)
  • 判断一个指定名称的存储桶是否存在
  • 返回一个布尔值true(存在),或false(不存在); 

(2)新建bucket

Task MakeBucketAsync(MakeBucketArgs args)
  • 创建一个指定名称的存储桶;
  • 创建失败,则返回异常信息;

(3)删除bucket 

Task RemoveBucketAsync(RemoveBucketArgs args)
  • 移除一个指定名称的存储桶;
  • 任务返回移除失败时的异常信息;
  • 当桶中有内容时,则不会被删除;

(4)获取bucket列表

Task<ListAllMyBucketsResult> ListBucketsAsync()
  • 用来获取buckets列表数据; 

2、BucketController

在Controllers文件夹下,新建一个空的API控制器,用来给前端人员暴露接口;

【Controllers/BucketController.cs】

using Microsoft.AspNetCore.Mvc;
using Minio;
using Minio.DataModel.Result;
using Zyl_MinIO_Demo.Managers;namespace Zyl_MinIO_Demo.Controllers
{/// <summary>/// 管理 MinIO 中的 Bucket/// </summary>[Route("api/[controller]/[action]")][ApiController]public class BucketController : ControllerBase{/// <summary>/// 1、判断指定bucket是否存在/// </summary>/// <param name="bucketName">bucket 名称</param>/// <returns></returns>[HttpPost]public async Task<string> IsBucketExit(string bucketName){return await MyBucket.IsExist(bucketName) ?  $"{bucketName}桶已存在" : $"{bucketName}桶不存在";}/// <summary>/// 2、 创建bucket/// </summary>/// <param name="bucketName">bucket 名称</param>/// <returns></returns>[HttpPost]public async Task<string> CreateBucket(string bucketName){return await MyBucket.Create(bucketName);}/// <summary>/// 3、移除bucket/// </summary>/// <param name="bucketName">bucket 名称</param>/// <returns></returns>[HttpDelete]public async Task<string> DeleteBucket(string bucketName){return await MyBucket.Delete(bucketName);}/// <summary>/// 4、获取bucket列表/// </summary>/// <returns></returns>[HttpGet]public async Task<ListAllMyBucketsResult?> GetBucketList(){return await MyBucket.GetList();}}
}

3、实现效果

启动项目,使用Swagger进行接口测试;

注意:

  • 需要确保,项目中已经配置了Swagger;
  • 需要确保,MinIO服务已经启动;

项目启动后的swagger页面:

.net 项目中配置 Swagger-CSDN博客 

可参考上方链接配置swagger;

先在MinIO控制台中创建一个名为zyl的bucket;

(1)判断bucket是否存在

输入桶名,点击测试;

 执行后可以看到数据正常返回;

(2)新建bucket

(3)删除bucket

(4)获取bucket列表

四、管理文件

1、MyObject类

在【Managers】文件夹中新建【MyObject】类,用来管理存储桶中的文件对象;

【Managers/MyObject.cs】

using Minio.DataModel.Args;
using Minio;
using Zyl_MinIO_Demo.Helper;
using Minio.Exceptions;namespace Zyl_MinIO_Demo.Managers
{public class MyObject{private static readonly MinioClient minioClient = MinIO.CreateMinioClient();/// <summary>/// 1、下载文件 到本地/// </summary>public async static Task<String> DownloadFile(string bucketName, string objectName) {try{string folderPath = "D:\\minio-download-files\\";if (!Directory.Exists(folderPath)) {DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);directoryInfo.Create();}StatObjectArgs statObjectArgs = new StatObjectArgs().WithBucket(bucketName).WithObject(objectName);await minioClient.StatObjectAsync(statObjectArgs);GetObjectArgs getObjectArgs = new GetObjectArgs().WithBucket(bucketName).WithObject(objectName).WithFile(folderPath + objectName);await minioClient.GetObjectAsync(getObjectArgs);return "Success";}catch (MinioException e){return $"Failure\r\n{e.Message}";}}/// <summary>/// 2、上传文件 指定文件/// </summary>public async static Task<string> UploadFile(string bucketName,string fileFullPath){try{// 判断bucket是否存在bool isExit = await MyBucket.IsExist(bucketName);if (!isExit){Console.Out.WriteLine($"{bucketName}桶不存在");return $"{bucketName}桶不存在,文件上传失败";}string objectName = fileFullPath.Split("\\")[^1];// 上传文件PutObjectArgs putObjectArgs = new PutObjectArgs().WithBucket(bucketName).WithObject(objectName).WithFileName(fileFullPath).WithContentType("application/octet-stream");await minioClient.PutObjectAsync(putObjectArgs).ConfigureAwait(false);return $"{objectName}上传成功";}catch (Exception e){return $"Failure\r\n{e.Message}";}}/// <summary>/// 3、删除 指定文件/// </summary>public async static Task<string> DeleteFile(string bucketName, string objectName){try{// 判断bucket是否存在bool isExit = await MyBucket.IsExist(bucketName);if (!isExit){return $"{bucketName}桶不存在,文件删除失败";}RemoveObjectArgs removeObjectArgs = new RemoveObjectArgs().WithBucket(bucketName).WithObject(objectName);await minioClient.RemoveObjectAsync(removeObjectArgs);return $"{bucketName}桶中的{objectName}文件删除成功";}catch (MinioException e){return $"Failure\r\n{e.Message}";}}/// <summary>/// 4、获取指定文件的url链接/// </summary>public async static Task<String> GetFileUrl(string bucketName, string objectName){try{PresignedGetObjectArgs args = new PresignedGetObjectArgs().WithBucket(bucketName).WithObject(objectName).WithExpiry(60 * 60 * 24 * 7);return await minioClient.PresignedGetObjectAsync(args);}catch (MinioException e){return $"Failure\r\n{e.Message}";}}}
}

(1)下载文件对象

Task GetObjectAsync(GetObjectArgs args)
  •  用来下载一个文件对象,并保存到本地;

(2)上传文件对象

Task PutObjectAsync(PutObjectArgs args)
  •  若上传的文件名于之前相同,则会覆盖;

(3)删除文件对象

Task RemoveObjectAsync(RemoveObjectArgs args)

(4)获取文件对象URL

Task<string> PresignedGetObjectAsync(PresignedGetObjectArgs args)
  • 返回的URL可用来直接下载该文件对象;
  • 返回的URL有效期为7天(默认),也可以自行设置(秒数);

2、ObjectController 

【Controllers/ObjectController.cs】

using Microsoft.AspNetCore.Mvc;
using Zyl_MinIO_Demo.Managers;namespace Zyl_MinIO_Demo.Controllers
{/// <summary>/// 管理 MinIO对象(默认zyl bucket桶)/// </summary>[Route("api/[controller]/[action]")][ApiController]public class ObjectController : ControllerBase{/// <summary>/// 1、下载 bucket中的文件/// </summary>/// <remarks>/// 会保存在 D:\\minio-download-files 文件夹内;/// 若本地D盘中没有该文件夹,则会自动创建;/// </remarks>/// <param name="objectName">文件名</param>/// <param name="bucketName">桶名,默认zyl</param>[HttpPost]public async Task<string> DownloadObject( string objectName, string bucketName = "zyl"){return await MyObject.DownloadFile(bucketName, objectName);}///<summary>/// 2、上传 本地指定文件/// </summary>/// <remarks>/// 上传同名文件,会覆盖之前的/// </remarks>/// <param name="fileFullPath">上传文件的完整绝对路径,例如:D:\test\test.txt</param>/// <param name="bucketName">桶名,默认zyl</param>[HttpPost]public async Task<string> UploadObject(string fileFullPath, string bucketName = "zyl"){return await MyObject.UploadFile(bucketName, fileFullPath);}/// <summary>/// 3、删除 指定桶中的指定文件/// </summary>/// <param name="objectName">文件名</param>/// <param name="bucketName">桶名,默认zyl</param>[HttpDelete]public async Task<string> DeleteObject(string objectName, string bucketName = "zyl"){return await MyObject.DeleteFile(bucketName, objectName);}/// <summary>/// 4、获取 指定文件的Url链接 (有效期 7天)/// </summary>/// <remarks>/// 只能是已经存在于minio中的任意文件/// </remarks>/// <param name="objectName">文件名</param>/// <param name="bucketName">桶名,默认zyl</param>/// <returns></returns>[HttpPost]public async Task<string> GetObjectUrl(string objectName, string bucketName = "zyl") {return await MyObject.GetFileUrl(bucketName, objectName);}}
}

3、实现效果

在Swagger页面,可以看到我们新增的文件对象相关接口;

(1)下载指定文件

  • 这里的默认bucket,确保在使用之前已经创建;
  • 文件会下载到本地D盘的【minio-downlo-files】文件夹中,没有该文件夹会自动创建;

(2)上传指定文件

  • 第一个参数应该填写待上传文件的完整绝对路径,这里上传的是D盘下test文件夹中的text.txt文件;
  • 上传到minio服务中的文件名取自待上传的文件名,若与之前的文件名相同,会进行覆盖;

(3)删除指定文件 

(4)获取指定文件URL 

  • 需要确保minio中已经上传了该文件;
  • 将返回的URL链接放在浏览器的地址栏,按回车即可下载查看;

 ​

======================================================================

每天进步一点点,记录一下MinIO的学习笔记;

刚开始接触后端,代码略显生涩,嘻嘻嘻;

还望走过路过的各位大佬多多指点~ 

相关文章:

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 &#xff08;1&#xff09;判断bucket是否存在 &#xff08;2&#xff09;新建bucket &#xff08…...

Three.js机器人与星系动态场景:实现3D渲染与交互式控制

内容摘要&#xff1a;使用Three.js库构建了一个交互式的3D场景。组件中创建了一个机器人模型&#xff0c;包括头部、眼睛、触角、身体和四肢&#xff0c;以及两个相同的机器人实例以实现动态效果。场景中还加入了粒子效果&#xff0c;模拟星系环境&#xff0c;增强了视觉效果。…...

Android系统集成和使用FFmpeg

文章目录 前言FFmpeg源码下载交叉编译NDK下载x264编译源码下载编译 FFmpeg编译脚本 AOSP继承FFmpeg 前言 原生AOSP中并未继承FFmpeg&#xff0c;所以要想在android上使用&#xff0c;需要自己编译集成。 FFmpeg源码下载 git clone https://git.ffmpeg.org/ffmpeg.git目前最新…...

水果商城外卖微信小程序模板

手机微信水果外卖&#xff0c;水果电商&#xff0c;水果商城网页小程序模板。包含&#xff1a;主页、列表页、详情页、购物车、个人中心。 水果商城外卖小程序模板...

【前端】面试八股文——输入URL到页面展示的过程

【前端】面试八股文——输入URL到页面展示的过程 1. DNS解析 当用户在浏览器中输入URL并按下回车时&#xff0c;首先需要将域名转换为IP地址&#xff0c;这个过程称为DNS&#xff08;域名系统&#xff09;解析。具体步骤如下&#xff1a; 浏览器缓存&#xff1a;浏览器首先检…...

什么是应用安全态势管理 (ASPM):综合指南

软件开发在不断发展&#xff0c;应用程序安全也必须随之发展。 传统的应用程序安全解决方案无法跟上当今开发人员的工作方式或攻击者的工作方式。 我们需要一种新的应用程序安全方法&#xff0c;而ASPM在该方法中发挥着关键作用。 什么是 ASPM&#xff1f; 应用程序安全…...

认识100种电路之耦合电路

在电子电路的世界中&#xff0c;耦合电路宛如一座精巧的桥梁&#xff0c;连接着各个功能模块&#xff0c;发挥着至关重要的作用。 【为什么电路需要耦合】 在复杂的电子系统中&#xff0c;不同的电路模块往往需要协同工作&#xff0c;以实现特定的功能。然而&#xff0c;这些模…...

c++【入门】三数的乘积

限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 你已经学了一些程序的输入&#xff0c;这次&#xff0c;你需要在没有老师的任何帮助下完成这次的任务啦。这次任务&#xff0c;我们要读入三个整数&#xff0c;并且计算它们的乘积。 这是一个非常简单的题目&#xff0c;意在…...

C++实现简化版Qt的QObject(4):增加简单实用的事件机制

前面的文章已经实现了许多QObject的功能了&#xff1a; C实现一个简单的Qt信号槽机制 C实现简化版Qt信号槽机制&#xff08;2&#xff09;&#xff1a;增加内存安全保障 C实现简化版Qt的QObject&#xff08;3&#xff09;&#xff1a;增加父子关系、属性系统 但是&#xff0c;…...

JTracker IDEA 中最好的 MyBatis 日志格式化插件

前言 如果你使用 MyBatis ORM 框架&#xff0c;那么你应该用过 MyBatis Log 格式化插件&#xff0c;它可以让我们的程序输出的日志更人性化。 但是有一个问题&#xff0c;通常我们只能看到格式化后的效果&#xff0c;没办法知道这个 SQL 是谁执行的以及调用的链路。 如下图所…...

物联网工业级网关解决方案 工业4G路由器助力智慧生活

随着科技的飞速发展&#xff0c;无线通信技术正逐步改变我们的工作与生活。在这个智能互联的时代&#xff0c;一款高性能、稳定可靠的工业4G路由器成为了众多行业不可或缺的装备。工业4G路由器以其卓越的性能和多样化的功能&#xff0c;助力我们步入智慧新纪元。 一、快速转化&…...

IoTDB Committer+Ratis PMC Member:“两全其美”的秘诀是?

IoTDB & Ratis 双向深耕&#xff01; 还记得一年前我们采访过拥有 IoTDB 核心研发 Ratis Committer “双重身份”的社区成员宋子阳吗&#xff1f;&#xff08;点此阅读&#xff09; 我们高兴地发现&#xff0c;一年后&#xff0c;他在两个项目都更进一步&#xff0c;已成为…...

【链表】- 移除链表元素

1. 对应力扣题目连接 移除链表元素 2. 实现案例代码 public class RemoveLinkedListElements {public static void main(String[] args) {// 示例 1ListNode head1 new ListNode(1, new ListNode(2, new ListNode(6, new ListNode(3, new ListNode(4, new ListNode(5, new …...

云原生之使用Docker部署RabbitMQ消息中间件

云原生之使用Docker部署RabbitMQ消息中间件 一、RabbitMQ介绍1.1 RabbitMQ简介1.2 RabbitMQ特点1.3 RabbitMQ使用场景 二、检查Docker环境2.1 检查Docker版本2.2 检查操作系统版本2.3 检查Docker状态 三、下载RabbitMQ镜像四、部署RabbitMQ服务4.1创建挂载目录4.2 运行RabbitMQ…...

opengl箱子的显示

VS环境配置&#xff1a; /JMC /ifcOutput "Debug\" /GS /analyze- /W3 /Zc:wchar_t /I"D:\Template\glfwtemplate\glfwtemplate\assimp" /I"D:\Template\glfwtemplate\glfwtemplate\glm" /I"D:\Template\glfwtemplate\glfwtemplate\LearnOp…...

Oracle 视图、存储过程、函数、序列、索引、同义词、触发器

优质博文&#xff1a;IT-BLOG-CN 一、视图 从表中抽出的逻辑上相关的数据集合&#xff0c;视图是一种虚表&#xff0c;视图是建立在已有表的基础之上&#xff0c;视图赖以建立的这些表称为基表。向视图提供数据的是 SELECT语句&#xff0c;可以将视图理解为存储起来的SELECT语…...

网站被浏览器提示“不安全”的解决办法

在互联网时代&#xff0c;网站的安全性直接关系到用户体验和品牌形象。当用户访问网站时&#xff0c;如果浏览器出现“您与此网站之间建立的连接不安全”的警告&#xff0c;这不仅会吓跑潜在客户&#xff0c;还可能对网站的SEO排名造成等负面影响。 浏览器发出的“不安全”警告…...

typescript定义函数的传参、返回值

Render 函数中定义函数传参 interface List {id: number;name: string; }interface Result {data: List[]; //表示由 List 接口组成的数组 }function Render(result: Result) {result.data.forEach(value > {console.log(value);}); }let result {data: [{id: 1,name: 张三…...

GlimmerHMM安装与使用-生信工具24

GlimmerHMM 01 概述 GlimmerHMM是一种基于广义隐马尔科夫模型&#xff08;GHMM&#xff09;的新型基因预测工具。虽然该基因预测工具符合GHMM的总体数学框架&#xff0c;但它还结合了从GeneSplicer程序中改编的剪接位点模型。可变长度的特征状态&#xff08;例如外显子、内含…...

Elasticsearch架构基本原理

Elasticsearch的架构原理可以详细分为以下几个方面进行介绍&#xff1a; 一、Elasticsearch基本概念 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene构建的开源、分布式、RESTful搜索和分析引擎。它支持全文搜索、结构化搜索、半结构化搜索、数据分析、地理位…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

C#中用于控制自定义特性(Attribute)

我们来详细解释一下 [AttributeUsage(AttributeTargets.Class, AllowMultiple false, Inherited false)] 这个 C# 属性。 在 C# 中&#xff0c;Attribute&#xff08;特性&#xff09;是一种用于向程序元素&#xff08;如类、方法、属性等&#xff09;添加元数据的机制。Attr…...

LeetCode 0386.字典序排数:细心总结条件

【LetMeFly】386.字典序排数&#xff1a;细心总结条件 力扣题目链接&#xff1a;https://leetcode.cn/problems/lexicographical-numbers/ 给你一个整数 n &#xff0c;按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。…...