【分布式文件存储系统Minio】2024.12保姆级教程

文章目录

    • 1.介绍
        • 1.分布式文件系统
        • 2.基本概念
    • 2.环境搭建
        • 1.访问网址
        • 2.账号密码都是minioadmin
        • 3.创建一个桶
        • 4.**Docker安装miniomc突破7天限制**
          • 1.拉取镜像
          • 2.运行容器
          • 3.进行配置
            • 1.格式
            • 2.具体配置
          • 4.查看桶
          • 5.给桶开放权限
    • 3.搭建minio模块
        • 1.创建一个oss模块
          • 1.在sun-common下创建
          • 2.引入minio依赖
            • 1.sun-dependencies 锁定版本
            • 2.sun-common-oss 引入依赖
        • 2.sun-common-oss 模块
          • 1.概览
          • 2.MinioConfig.java
          • 3.FileInfo.java
          • 4.MinioUtil.java
          • 5.StorageAdapter.java
          • 6.MinioStorageAdapter.java
        • 3.sun-demo操作minio
          • 1.引入sun-common-oss
          • 2.application.yml 配置minio参数
          • 3.暴露接口 MinioController.java
          • 4.测试

1.介绍

1.分布式文件系统

CleanShot 2024-08-02 at 15.21.59@2x

CleanShot 2024-08-02 at 15.22.16@2x

2.基本概念

CleanShot 2024-08-02 at 15.34.01@2x

2.环境搭建

1.访问网址

http://ip:9090/

2.账号密码都是minioadmin
3.创建一个桶

CleanShot 2024-08-02 at 15.35.14@2x

CleanShot 2024-08-02 at 15.35.50@2x

4.Docker安装miniomc突破7天限制
1.拉取镜像
docker pull minio/mc:RELEASE.2023-11-15T22-45-58Z.fips
2.运行容器
docker run -it --entrypoint=/bin/sh minio/mc:RELEASE.2023-11-15T22-45-58Z.fips
3.进行配置
1.格式
mc config host add <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY>
2.具体配置
mc config host add minio http://ip:9000 9i14IBbM2ysYVPDa52oK eXRpXcXcX5w4Tmy8HprUkemVi5zzrbpS4NksxxtU
4.查看桶
mc ls minio
5.给桶开放权限
mc anonymous set download minio/桶

3.搭建minio模块

1.创建一个oss模块
1.在sun-common下创建

CleanShot 2024-08-02 at 15.37.36@2x

2.引入minio依赖
1.sun-dependencies 锁定版本
        <minio.version>8.2.0</minio.version><!-- minio依赖 --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>${minio.version}</version></dependency>
2.sun-common-oss 引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 继承父模块的版本和通用依赖 --><parent><groupId>com.sunxiansheng</groupId><artifactId>sun-common</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>sun-common-oss</artifactId><!-- 子模块的version,如果不写就默认跟父模块的一样 --><version>${children.version}</version><dependencies><!-- minio依赖 --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId></dependency><!-- spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency></dependencies></project>
2.sun-common-oss 模块
1.概览

CleanShot 2024-08-02 at 17.55.46@2x

2.MinioConfig.java
package com.sunxiansheng.oss.config;import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Description: minio配置管理* @Author sun* @Create 2024/5/31 9:22* @Version 1.0*/
@Configuration
public class MinioConfig {/*** minioUrl*/@Value("${minio.url}")private String url;/*** minio账户*/@Value("${minio.accessKey}")private String accessKey;/*** minio密码*/@Value("${minio.secretKey}")private String secretKey;/*** 构造minioClient*/@Beanpublic MinioClient getMinioClient() {return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();}}
3.FileInfo.java
package com.sunxiansheng.oss.entity;import lombok.Data;/*** FileInfo类用于存储文件的基本信息,包括文件名、是否为目录的标志以及文件的ETag。* 这个类可以在对象存储系统中用于描述文件的属性。* @Author sun* @Create 2024/5/31 9:47* @Version 1.0*/
@Data
public class FileInfo {// 文件的名称private String fileName;// 指示该文件是否为目录的标志private Boolean directoryFlag;// 文件的ETag,用于标识文件的唯一性private String etag;}
4.MinioUtil.java
package com.sunxiansheng.oss.util;import com.sunxiansheng.oss.entity.FileInfo;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;/*** MinioUtil是一个用于与MinIO对象存储服务进行交互的工具类。* 提供了一系列方法用于管理存储桶和对象,包括创建桶、上传文件、下载文件、删除文件等操作。* @Author sun* @Create 2024/5/31 9:30* @Version 1.0*/
@Component
public class MinioUtil {@Resourceprivate MinioClient minioClient; // MinIO客户端实例,用于执行各种存储操作。/*** 创建存储桶。* 如果指定名称的存储桶不存在,则创建它。** @param bucket 存储桶的名称* @throws Exception 如果创建存储桶时发生错误*/public void createBucket(String bucket) throws Exception {boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());if (!exists) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());}}/*** 上传文件到指定存储桶。** @param inputStream 文件输入流* @param bucket 存储桶的名称* @param objectName 对象名称,即文件在存储桶中的名称* @throws Exception 如果上传文件时发生错误*/public void uploadFile(InputStream inputStream, String bucket, String objectName) throws Exception {minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName).stream(inputStream, -1, 5242889L).build());}/*** 获取所有存储桶的名称列表。** @return 存储桶名称的列表* @throws Exception 如果获取存储桶列表时发生错误*/public List<String> getAllBucket() throws Exception {List<Bucket> buckets = minioClient.listBuckets();return buckets.stream().map(Bucket::name).collect(Collectors.toList());}/*** 获取指定存储桶中的所有文件信息。** @param bucket 存储桶的名称* @return 文件信息列表,其中包含文件名、是否为目录标志和ETag* @throws Exception 如果获取文件列表时发生错误*/public List<FileInfo> getAllFile(String bucket) throws Exception {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucket).build());List<FileInfo> fileInfoList = new LinkedList<>();for (Result<Item> result : results) {FileInfo fileInfo = new FileInfo();Item item = result.get();fileInfo.setFileName(item.objectName());fileInfo.setDirectoryFlag(item.isDir());fileInfo.setEtag(item.etag());fileInfoList.add(fileInfo);}return fileInfoList;}/*** 从指定存储桶下载文件。** @param bucket 存储桶的名称* @param objectName 对象名称,即文件在存储桶中的名称* @return 文件输入流,用于读取下载的文件内容* @throws Exception 如果下载文件时发生错误*/public InputStream downLoad(String bucket, String objectName) throws Exception {return minioClient.getObject(GetObjectArgs.builder().bucket(bucket).object(objectName).build());}/*** 删除指定存储桶。* 注意:存储桶必须为空才能被删除。** @param bucket 存储桶的名称* @throws Exception 如果删除存储桶时发生错误*/public void deleteBucket(String bucket) throws Exception {minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());}/*** 删除指定存储桶中的文件。** @param bucket 存储桶的名称* @param objectName 对象名称,即要删除的文件在存储桶中的名称* @throws Exception 如果删除文件时发生错误*/public void deleteObject(String bucket, String objectName) throws Exception {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build());}/*** 获取文件的预览URL。* 该URL可以用于在浏览器中查看或下载文件。** @param bucketName 存储桶的名称* @param objectName 对象名称,即文件在存储桶中的名称* @return 文件的预签名URL* @throws Exception 如果获取预签名URL时发生错误*/public String getPreviewFileUrl(String bucketName, String objectName) throws Exception{GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(objectName).build();return minioClient.getPresignedObjectUrl(args);}
}
5.StorageAdapter.java
package com.sunxiansheng.oss.adapter;import com.sunxiansheng.oss.entity.FileInfo;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;
import java.util.List;/*** StorageAdapter接口定义了与对象存储服务交互的方法。* 这些方法提供了基本的存储操作,如创建存储桶、上传和下载文件、获取文件信息等。* @Author sun* @Create 2024/5/31 10:03* @Version 1.0*/
public interface StorageAdapter {/*** 创建存储桶。* 如果指定名称的存储桶不存在,则创建它。** @param bucket 存储桶的名称*/void createBucket(String bucket);/*** 上传文件到指定存储桶。** @param uploadFile 要上传的文件* @param bucket 存储桶的名称* @param objectName 对象名称,即文件在存储桶中的名称*/String uploadFile(MultipartFile uploadFile, String bucket, String objectName);/*** 获取所有存储桶的名称列表。** @return 存储桶名称的列表*/List<String> getAllBucket();/*** 获取指定存储桶中的所有文件信息。** @param bucket 存储桶的名称* @return 文件信息列表,其中包含文件名、是否为目录标志和ETag*/List<FileInfo> getAllFile(String bucket);/*** 从指定存储桶下载文件。** @param bucket 存储桶的名称* @param objectName 对象名称,即文件在存储桶中的名称* @return 文件输入流,用于读取下载的文件内容*/InputStream downLoad(String bucket, String objectName);/*** 删除指定存储桶。* 注意:存储桶必须为空才能被删除。** @param bucket 存储桶的名称*/void deleteBucket(String bucket);/*** 删除指定存储桶中的文件。** @param bucket 存储桶的名称* @param objectName 对象名称,即要删除的文件在存储桶中的名称*/void deleteObject(String bucket, String objectName);/*** 获取文件的访问URL。* 该URL可以用于在浏览器中查看或下载文件。* @param originalFilename 原始文件名* @param bucket 存储桶的名称* @param objectName 对象名称,即文件在存储桶中的名称* @return 文件的URL*/public String getUrl(String originalFilename, String bucket, String objectName);
}
6.MinioStorageAdapter.java
package com.sunxiansheng.oss.adapter;import com.sunxiansheng.oss.entity.FileInfo;
import com.sunxiansheng.oss.util.MinioUtil;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.io.InputStream;
import java.util.List;/*** MinioStorageAdapter类实现了StorageAdapter接口,使用MinioUtil类与MinIO对象存储服务进行交互。* 提供了一系列方法来管理存储桶和对象,包括创建桶、上传文件、下载文件、删除文件等操作。* @Author sun* @Create 2024/5/31 10:06* @Version 1.0*/
@Component
public class MinioStorageAdapter implements StorageAdapter {@Resourceprivate MinioUtil minioUtil; // 使用MinioUtil工具类来执行存储操作/*** MinIO服务的URL。* 该URL通常在配置文件中设置,用于构建文件访问的完整URL。*/@Value("${minio.url}")private String url;/*** 创建存储桶。* 使用MinioUtil工具类创建存储桶。** @param bucket 存储桶的名称*/@Override@SneakyThrowspublic void createBucket(String bucket) {minioUtil.createBucket(bucket);}// ============================== 文件上传后的URL:url + 桶名 + 上传时的objectName ==============================/*** 上传文件到指定存储桶,并返回可访问的url* 使用提供的对象名称或文件的原始名称进行上传。** @param uploadFile 要上传的文件* @param bucket 存储桶的名称* @param objectName 对象名称,表示完整的文件路径和名称*/@Override@SneakyThrowspublic String uploadFile(MultipartFile uploadFile, String bucket, String objectName) {minioUtil.createBucket(bucket);String finalObjectName = generateObjectName(uploadFile.getOriginalFilename(), objectName);minioUtil.uploadFile(uploadFile.getInputStream(), bucket, finalObjectName);return getUrl(uploadFile.getOriginalFilename(), bucket, objectName);}/*** 自定义对象名的格式,上传时的对象名是什么格式,那么下载时的对象名也是什么格式* url的格式就是 url + 桶名 + 对象名** @param originalFilename 原始文件名字* @param objectName 提供的对象名称* @return 最终用于存储的对象名称*/private String generateObjectName(String originalFilename, String objectName) {// 如果对象名为空,则使用文件的原始名称作为对象名if (objectName == null) {return originalFilename;}// 如果对象名不为空,则对象名 + / + 文件名作为对象名return objectName + "/" + originalFilename;}/*** 获取文件的访问URL。* 该URL可以用于在浏览器中查看或下载文件。** @param bucket 存储桶的名称* @param objectName 对象名称,即文件在存储桶中的名称* @return 文件的完整URL*/@Override@SneakyThrowspublic String getUrl(String originalFilename, String bucket, String objectName) {// 首先生成对象名String finalObjectName = generateObjectName(originalFilename, objectName);// url的格式就是 url + 桶名 + 对象名return url + "/" + bucket + "/" + finalObjectName;}// ============================== 文件上传后的URL:url + 桶名 + 上传时的objectName ==============================/*** 获取所有存储桶的名称列表。** @return 存储桶名称的列表*/@Override@SneakyThrowspublic List<String> getAllBucket() {return minioUtil.getAllBucket();}/*** 获取指定存储桶中的所有文件信息。** @param bucket 存储桶的名称* @return 文件信息列表,其中包含文件名、是否为目录标志和ETag*/@Override@SneakyThrowspublic List<FileInfo> getAllFile(String bucket) {return minioUtil.getAllFile(bucket);}/*** 从指定存储桶下载文件。** @param bucket 存储桶的名称* @param objectName 对象名称,即文件在存储桶中的名称* @return 文件输入流,用于读取下载的文件内容*/@Override@SneakyThrowspublic InputStream downLoad(String bucket, String objectName) {return minioUtil.downLoad(bucket, objectName);}/*** 删除指定存储桶。* 注意:存储桶必须为空才能被删除。** @param bucket 存储桶的名称*/@Override@SneakyThrowspublic void deleteBucket(String bucket) {minioUtil.deleteBucket(bucket);}/*** 删除指定存储桶中的文件。** @param bucket 存储桶的名称* @param objectName 对象名称,即要删除的文件在存储桶中的名称*/@Override@SneakyThrowspublic void deleteObject(String bucket, String objectName) {minioUtil.deleteObject(bucket, objectName);}}
3.sun-demo操作minio
1.引入sun-common-oss
        <!-- 引入sun-common-oss --><dependency><groupId>com.sunxiansheng</groupId><artifactId>sun-common-oss</artifactId><version>1.0-SNAPSHOT</version></dependency>
2.application.yml 配置minio参数
# minio配置
minio:url: http://ip:9000accessKey: minioadminsecretKey: minioadmin
3.暴露接口 MinioController.java
package com.sunxiansheng.user.controller;import com.sunxiansheng.oss.adapter.StorageAdapter;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;/*** Description:* @Author sun* @Create 2024/8/2 16:25* @Version 1.0*/
@RestController
public class MinioController {@Resourceprivate StorageAdapter storageAdapter;/*** 上传文件并返回url*/@RequestMapping("/upload")public String upload(MultipartFile uploadFile, String bucket, String objectName) throws Exception {return storageAdapter.uploadFile(uploadFile, bucket, objectName);}}
4.测试

CleanShot 2024-08-02 at 18.18.25@2x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

udp分片报文发送和接收

读文件通过udp分片发送的目的端&#xff1a;&#xff08;包含错误的分片包&#xff09; #!/usr/bin/python # -*- coding: utf-8 -*-#python send_100frag_file.py -p 55432 -f snatdownloadimport argparse import loggingfrom scapy.all import *# Define the maximum size …

好用的随机生成图片的网站

官网&#xff1a; Lorem Picsum 获取自定义大小的随机图像 https://picsum.photos/200/300 获取正方形图像 https://picsum.photos/200 获取特定类型的图像 通过添加到 /id/{image} url 的开头来获取特定图像。 https://picsum.photos/id/237/200/300 获取静态随机图像…

2024-12-31-devkit-pipeline

title: 解析 Devkit-Pipeline&#xff1a;开发流程自动化的新动力 date: ‘2024-12-31’ category: blog tags: Devkit-Pipeline开发流程自动化持续集成软件开发效率 sig: CICD archives: ‘2024-12’ author:way_back summary: Devkit-Pipeline 是一款为软件开发流程带来高效…

“进制转换”公式大集合

咱们都知道十进制是“逢10进1 ”&#xff0c;同理&#xff0c;N进制就是 “逢N进1”。进制其实就这么简单。它的麻烦之处在于各种进制之间的转换。 一、十进制整数转N进制 1&#xff0e;十进制转二进制 除2取余法&#xff1a;连续除以2&#xff0c;直到商为0&#xff0c;逆序…

解决k8s部署dashboard时一直处于Pending状态的问题

直接用离线包就行 命令 [rootk8s-master ~]# docker load -i calico-image-v3.25.0.tar [rootk8s-master ~]# kubectl apply -f calico.yaml链接在https://download.csdn.net/download/weixin_42759398/90192045 [rootk8s-master ~]# docker load -i calico-image-v3.25.0.t…

在计算机网络中,什么是集群?

在计算机网络中&#xff0c;集群&#xff08;Cluster&#xff09;指的是一组相互独立的计算机&#xff08;也称为节点&#xff09;&#xff0c;它们通过高速通信网络互联&#xff0c;共同协作以提供高性能、高可用性和可扩展性的计算资源和服务。这些计算机在逻辑上被组织成一个…

【视觉SLAM:八、后端Ⅰ】

视觉SLAM的后端主要解决状态估计问题&#xff0c;它是优化相机轨迹和地图点的过程&#xff0c;从数学上看属于非线性优化问题。后端的目标是结合传感器数据&#xff0c;通过最优估计获取系统的状态&#xff08;包括相机位姿和场景结构&#xff09;&#xff0c;在状态估计过程中…

Vue.js前端框架教程15:Vue父子组件之间的通信ref、emits

文章目录 1. 属性传递(Props)2. 事件监听( Emits)3. `ref` 引用4. `provide` 和 `inject`5. 插槽(Slots)在 Vue 3 中,父子组件之间的通信可以通过多种方式实现,包括属性传递、事件监听、插槽以及 ref 和 provide/inject。以下是这些通信方式的详解: 1. 属性传递(Pro…

SpringCloudAlibaba实战入门之路由网关Gateway过滤器(十三)

承接上篇,我们知道除了断言,还有一个重要的功能是过滤器,本节课我们就讲一下常见的网关过滤器及其一般使用。 一、Filter介绍 类似SpringMVC里面的的拦截器Interceptor,Servlet的过滤器。“pre”和“post”分别会在请求被执行前调用和被执行后调用,用来修改请求和响应信…

[C#]C# random.Next(0,1)包含0和1吗

在C#中&#xff0c;Random.Next(minValue, maxValue) 方法生成的随机数是一个在 minValue&#xff08;包含&#xff09;和 maxValue&#xff08;不包含&#xff09;之间的整数。因此&#xff0c;当你调用 Random.Next(0, 1) 时&#xff0c;它只会生成一个整数&#xff0c;这个整…

matlab-数字滤波器设计与实战

文章目录 数字滤波器设计FIR 滤波器设计IIR 滤波器设计巴特沃斯滤波器切比雪夫 I 型滤波器切比雪夫II型椭圆滤波器线性相位与非线性相位零相位响应数字滤波器实战数字滤波器产生延迟的主要原因补偿滤波引入的延迟补偿常量滤波器延迟补偿与频率有关的延迟从信号中除去不需要的频…

Clickhouse使用基础

# 查看操作系统版本 cat /etc/os-release# clickhouse版本 clickhouse -V# 登录clickhouse客户端 clickhouse-client -u xxx --password xxx -m # -m 或 --multiline&#xff1a;进入客户端后&#xff0c;运行输入多行sql语句建表 # 创建数据库 CREATE DATABASE IF NOT EXIST…

python参数传递不可变对象含可变子对象

当传递不可变对象时。不可变对象里面包含的子对象是可变的。则方法内修改了这个可变对象&#xff0c;源对象也发生了变化。 a (10, 20, [5, 6]) print("a", id(a))def test01(m):print("m", id(m))m[2][0] 888print("修改m后m的值为{}".forma…

Midjourney技术浅析(八):交互与反馈

Midjourney 的用户交互与反馈通过用户输入&#xff08;User Input&#xff09;和用户反馈&#xff08;User Feedback&#xff09;机制&#xff0c;不断优化和改进图像生成的质量和用户满意度。 一、用户交互与反馈模块概述 用户交互与反馈模块的主要功能包括&#xff1a; 1.…

如何检测PWA是否已经安装?

手头的项目有个需求需要检测PWA是否已经安装&#xff0c;安装了导航下载就不显示&#xff0c;没有安装就需要显示。在网上找了蛮久&#xff0c;也问了chatgpt&#xff0c;主要提供以下三种方法&#xff0c; 1、判断 navigator.getInstalledRelatedApps() 是否有返回值 此方法…

TB1801D 线性驱动 LED 恒流芯片

1、产品概述 TB1801D是一款专为12V灯珠设计的汽车灯专用的低压差恒流芯片&#xff0c;输出电流恒流精度≤3&#xff05;&#xff0c;外围结构简单。TB1801D 内置 130℃过温保护电路&#xff0c;可在各种散热条件下将 LED 灯珠温度控制在 140℃以内。TB1801D 内置 100V 的功率 M…

HTML5适配手机

要使 HTML5 网站适配手机设备&#xff0c;您可以遵循以下几个步骤和最佳实践&#xff1a; 1. 使用视口&#xff08;Viewport&#xff09; 在 HTML 文档的 <head> 部分添加视口元标签&#xff0c;以确保页面在移动设备上正确缩放和显示&#xff1a; <meta name"…

C# OpenCV机器视觉:凸包检测

在一个看似平常却又暗藏玄机的午后&#xff0c;阿强正悠闲地坐在实验室里&#xff0c;翘着二郎腿&#xff0c;哼着小曲儿&#xff0c;美滋滋地品尝着手中那杯热气腾腾的咖啡&#xff0c;仿佛整个世界都与他无关。突然&#xff0c;实验室的门 “砰” 的一声被撞开&#xff0c;小…

【每日学点鸿蒙知识】长时任务、HarmonyAppProvision申请、preferences、Testing工具、应用保活

1、HarmonyOS 如何解决语音聊天、通信app退后台系统采集播放回调就会停止&#xff0c;回前台未恢复&#xff1f; 关于应用切到后台系统采集播放回调停止的问题原因如下&#xff1a;为了降低设备耗电速度、保障用户使用流畅度&#xff0c;系统会对退至后台的应用进行管控&#…

vue项目中使用mockjs模拟后端接口

Vue 2中使用 Mock.js 来模拟数据是一个非常常见的做法&#xff0c;尤其是在前端开发时需要与后端接口交互但后端尚未完成的情况下。下面是一个简单的案例&#xff0c;演示如何在 Vue 2 项目中使用 Mock.js 来模拟数据。 1. 安装 Mock.js 首先&#xff0c;确保在你的项目中安装…