SpringBoot : ch06 整合 web(二)

前言

SpringBoot作为一款优秀的框架,不仅提供了快速开发的能力,同时也提供了丰富的文档和示例,让开发者更加容易上手。在本博客中,我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术,并通过实例代码来演示如何实现这些功能。本篇博客是系列文章的第一篇,主要介绍SpringBoot整合Web模块的概述和基础知识,方便读者进一步深入学习和应用。
 

本次案例讲解替换默认的白色错误页面、JSON日期格式化、文件上传、自定义过滤器、open-api设置。

一、替换默认的白色页面

 error:
    whitelabel:
      enabled: true
  1. whitelabel.enabled:这是一个Spring Boot特定的配置项,用于控制默认的错误页面。当应用程序发生错误时,默认情况下,Spring Boot会显示一个简单的错误页面,其中包含错误的详细信息。通过设置whitelabel.enabledtrue,您可以启用这个默认错误页面,如果设置为false,则禁用它。

  2. error.whitelabel.enabled:与上述配置项类似,这是另一个Spring Boot的配置项,用于控制错误页面的显示。通过设置error.whitelabel.enabledtrue,您可以启用默认的错误页面,如果设置为false,则禁用它。

这些配置项通常用于自定义错误处理和错误页面的行为。您可以根据您的需求,选择是否使用默认的错误页面,或者根据自己的设计来创建自定义的错误页面。

禁用或打开springboot的白色错误页面,默认是打开的,如果禁用后当产生404或者500错误时候将返回容器默认的错误页面,如果想替换默认的白色错误页面,只要在静态资源目录下新建一个error文件夹,并在文件夹中创建404.html或者500.html即可

项目目录:

没有替换前的白色页面:

 替换后:

这个路径是我随便打的,打一个错误的路径引发404,就可以查看我们自定义的404错误页面。 

 二、替换白色页面(默认错误页面)的好处如下:

  1. 品牌一致性:通过使用自定义的错误页面,您可以将应用程序的外观与品牌一致。这有助于提升用户体验和让用户更容易识别应用程序。

  2. 用户友好性:自定义错误页面可以提供更友好和易于理解的错误信息,以便用户能够快速了解发生了什么问题,并采取适当的行动。默认的白色页面可能只提供简单的错误信息,而自定义页面可以提供更具体和有用的提示。

  3. 错误处理和导航:自定义错误页面可以提供更多的错误处理选项和导航链接,帮助用户解决问题。您可以提供返回首页、联系支持、查看常见问题等选项,以减轻用户的困惑和不便。

  4. 提高用户满意度:通过提供个性化和专业的错误页面,您可以增强用户对应用程序的信任感和满意度。一个令人印象深刻的错误页面可能会使用户对您的应用程序留下良好的印象,并增加他们继续使用的可能性。

需要注意的是,替换白色页面并非必需,这取决于您的应用程序需求和设计目标。默认的白色页面在很多情况下已经可以满足基本的错误处理需求。如果您决定进行自定义,请确保设计出简洁、易于理解和有用的错误页面,以提供更好的用户体验。

三、文件上传

1、yml配置
spring:
  # JSON日期格式化
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  servlet:
    # 文件上传
    multipart:
      #启用文件上传功能
      enabled: true
      # 每个文件限制100MB
      max-file-size: 10MB
      #单次请求中所有文件的总大小
      max-request-size: 1000MB
  1. spring.jackson.date-format:这是用于配置Jackson库的日期格式化的配置项。在示例中,日期格式被设置为"yyyy-MM-dd HH:mm:ss",这意味着日期会以这种格式进行序列化和反序列化操作。

  2. spring.jackson.time-zone:这是用于配置Jackson库的时区的配置项。在示例中,时区被设置为"GMT+8",这意味着日期的处理将基于东八区的时区设置。

  3. spring.servlet.multipart.enabled:这是用于启用或禁用Spring的文件上传功能的配置项。在示例中,该功能被启用,允许应用程序处理文件上传。

  4. spring.servlet.multipart.max-file-size:这是用于限制单个文件大小的配置项。在示例中,文件大小被限制为10MB,超过这个大小的文件将无法上传。

  5. spring.servlet.multipart.max-request-size:这是用于限制整个请求中所有文件总大小的配置项。在示例中,所有文件的总大小被限制为1000MB(1GB),超过这个大小的请求将无法处理。

 2、controller实现,即可以上传单个也可以多个

@Slf4j
@RestController
public class FileUploadController {

    /**
     * 测试多文件上传
     */
    @PostMapping("/upload2")
    public String upload2 (@RequestParam("file") MultipartFile[] fileList){
        try{
            if (fileList.length > 0){
                for (MultipartFile file:fileList){
                    // 打印文件基础信息
                    log.info("Name == >>{}",file.getName());
                    log.info("OriginalFilename == >>{}",file.getOriginalFilename());
                    log.info("ContentType == >>{}",file.getContentType());
                    log.info("Size == >>{}",file.getSize());
                    // 文件输出地址
                    String filePath = "d:/imag/" ;
                    new File(filePath).mkdirs();
                    File writeFile = new File(filePath, file.getOriginalFilename());
                    file.transferTo(writeFile);
                }
            }
            return "success" ;
        } catch (Exception e){
            return "fail" ;
        }
    }


}

这段代码是一个使用Spring框架实现的文件上传的控制器类。下面是对代码的解释:

  1. @Slf4j 注解:这是Lombok库提供的注解,用于自动生成日志记录器(Logger)。通过在类上添加 @Slf4j 注解,你可以直接使用 log 对象进行日志记录。

  2. @RestController 注解:这表示这是一个RESTful风格的控制器类,它会直接返回数据而不是视图。

  3. FileUploadController 类:这是文件上传的控制器类。

  4. upload2 方法:这是一个处理文件上传的方法,使用 @PostMapping 注解指定了请求路径为 /upload2,并接收一个名为 file 的文件参数。该方法返回一个字符串作为响应结果。

  5. 文件上传逻辑:在方法内部,首先检查传入的文件参数 fileList 是否为空,如果不为空,则遍历文件列表,对每个文件进行处理。

  6. 打印文件信息:使用日志记录器 log 打印文件的基本信息,包括文件名、原始文件名、内容类型和文件大小。

  7. 设置文件输出地址:将文件输出到指定的目录下,这里设置的目录为 "d:/imag/",并确保该目录存在。

  8. 创建文件对象并保存文件:通过 file.transferTo(writeFile) 将文件保存到指定的目录下。

  9. 返回结果:如果文件上传成功,返回字符串 "success",否则返回字符串 "fail"。

3、创建一个uploadStatus.html的文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/JQuery文件.txt.js"></script>
</head>
<body>


<form id="f1"  enctype="multipart/form-data" >

    Name:<input type="text" name="productName"/><br>
    Image:<input type="file" name="file" multiple/><br>
    <input type="button" value="提交"/><br>

</form>

<script>
    $(function () {
        $(':button').on('click',function () {
            // 构建 formData 对象
            let formData = new FormData($('#f1')[0]);
            $.ajax({
                url:'/upload2',
                type:'post',
                data:formData,
                processData:false, // 告诉 jquery 不要处理发送的数据类型
                contentType:false, // 告诉 jquery 不要设置请求头的 contentType
                success:function ( result ) {
                    console.log(result + "saddsada");
                    if ( result === 'success' ){
                        alert("上传成功");
                    } else {
                        alert("上传失败");
                    }
                },
                error:function (error) {
                  alert(JSON.stringify(error));
                }
            })
        })
    })
</script>

</body>
</html>

这段代码是一个简单的HTML页面,包括一个表单用于上传文件,并使用JavaScript中的jQuery库来实现文件上传的逻辑。下面是对代码的解释:

  1. enctype="multipart/form-data":在 <form> 标签中设置了 enctype 属性为 "multipart/form-data",表示表单数据会以 multipart/form-data 的形式进行编码,支持文件上传。

  2. 表单元素:在表单中包含了两个输入框,一个用于输入产品名称(Name),另一个是用于选择文件(Image)。文件输入框设置了 multiple 属性,表示可以选择多个文件进行上传。

  3. JavaScript部分:使用了jQuery库,引入了名为 "js/JQuery文件.txt.js" 的JavaScript文件。

  4. 事件绑定:通过jQuery,在页面加载完成后绑定了一个按钮点击事件的处理函数。当按钮被点击时,会执行相应的文件上传逻辑。

  5. 文件上传逻辑:在按钮点击事件处理函数中,构建了一个 FormData 对象,将表单数据包括文件信息传递给后端。然后使用 jQuery 的 ajax 方法向 "/upload2" 发送 POST 请求,并传递 FormData 对象作为请求数据。

  6. processDatacontentType:这两个属性被设置为 false,告诉 jQuery 不要处理发送的数据类型和不要设置请求头的 contentType,因为我们已经使用了 FormData 对象来传递数据。

  7. 请求成功和失败处理:根据后端返回的结果,在成功或失败时弹出相应的提示框。

需要注意的是,代码中有一个错误,即按钮的类型应该是 "submit" 而不是 "button",这样才能触发表单的提交事件。另外,引入的JavaScript文件名 "JQuery文件.txt.js" 可能存在错误,应当确认文件路径和文件名是否正确。

 4、运行结果

 四、自定义过滤器

1、写一个过滤器

@Slf4j
@WebServlet
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("请求经过 TestFilter.... ");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

这是一个基于 Java Servlet API 的过滤器(Filter)示例代码。过滤器是一种可以在 Servlet 容器中对请求和响应进行预处理和后处理的组件。可以使用过滤器来实现许多功能,例如身份验证、日志记录、编码转换、性能监测等。

在这个示例代码中,TestFilter 实现了 Filter 接口并重写了其中的三个方法:init()、doFilter() 和 destroy()。init() 方法在过滤器初始化时被调用,可以在其中进行一些初始化操作;doFilter() 方法是过滤器的主要方法,用于处理请求和响应;destroy() 方法在过滤器销毁时被调用,可以在其中进行一些清理操作。

在这个具体的示例中,doFilter() 方法只是简单地输出了一条日志,表示请求经过了 TestFilter 这个过滤器。这个示例代码并没有做任何有用的处理,但它可以作为一个基础框架,用于实现更加复杂和实际的过滤器功能。

2、注册过滤器 

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    /**
     * FilterRegistrationBean 用于动态注册自定义的 Filter
     * @return
     */
    @Bean
    public FilterRegistrationBean testFilter(){
        FilterRegistrationBean filterFilterRegistrationBean = new FilterRegistrationBean();
        // 装配自定义的过滤器
        filterFilterRegistrationBean.setFilter(new TestFilter());
        // 设置 filter 的 name
        filterFilterRegistrationBean.setName("testFilter");
        // 映射 filter 的请求 url
        filterFilterRegistrationBean.addUrlPatterns("/*");
        // 可以设置过滤器的 优先级别,数值越小,优先级别越高
        filterFilterRegistrationBean.setOrder(1);
        return filterFilterRegistrationBean;
    }

}

这是一个用于注册过滤器的Spring MVC配置类。该类使用FilterRegistrationBean动态注册自定义的过滤器TestFilter

testFilter()方法中,首先创建了一个FilterRegistrationBean对象filterFilterRegistrationBean。然后,将自定义的过滤器TestFilter装配到该对象中。接着,设置了过滤器的名称为"testFilter",并将过滤器映射到所有请求URL上。最后,通过setOrder()方法设置了过滤器的优先级别为1。

这样,当应用启动时,该过滤器就会被自动注册并生效,对所有请求进行过滤处理。

请注意,以上代码仅展示了过滤器的注册配置,并不包含过滤器的具体实现逻辑。

 3、测试

把项目跑起来后,访问了两个地址都可以经过自定义过滤器,在做项目有特殊需求是需要用到过滤器就可以这么写。

 

五、open-api设置

1、配置 yml 
# open-api设置
springdoc:
  # 设置需要要扫描生成api的包
  packages-to-scan: edu.nf.ch06.controller.api
  api-docs:
    # 是否禁用api文档,true是打开,false是禁用
    # 如果是开发环境则设置为true,生产环境则禁用掉
    enabled: true

这是一个用于配置Springdoc OpenAPI的配置文件。Springdoc是一个用于生成和展示API文档的库。

在该配置文件中,设置了需要扫描生成API文档的包路径为edu.nf.ch06.controller.api。这意味着只有该包下的控制器类会被扫描生成API文档。

同时,api-docs部分设置了是否启用API文档的选项。在这里,将其设置为true,即打开API文档的生成和展示功能。

需要注意的是,根据注释中的说明,建议在开发环境中启用API文档生成,而在生产环境中禁用。这是为了避免将API文档暴露给未经授权的用户。

2、设置配置类
@Configuration
//使用注解配置OpenApi
@OpenAPIDefinition(info = @Info(
        title = "项目接口文档",
        version = "v1.0",
        description = "基于springboot开发的API接口",
        license = @License(name = "MIT", url = "http://springdoc.org")
),
        externalDocs = @ExternalDocumentation(description = "参看文档", url = "https://gitee.com")
)
public class OpenApiConfig {
}

 这是一个用于配置OpenAPI的Spring配置类。在该类上使用了注解@OpenAPIDefinition,用于定义OpenAPI规范中的信息、文档和许可证等相关内容。

@OpenAPIDefinition注解中,通过info属性设置了API文档的基本信息,包括文档的标题、版本、描述和许可证信息。其中,@Info注解用于设置文档的基本信息,@License注解用于设置许可证信息。

此外,还通过externalDocs属性设置了API文档的外部参考文档。其中,@ExternalDocumentation注解用于设置外部参考文档的描述和URL。

需要注意的是,@OpenAPIDefinition@Info@License@ExternalDocumentation等注解都属于Springdoc OpenAPI库中的注解,用于简化OpenAPI规范的配置和生成。

3、编写 controller

@RestController
@RequestMapping("/api/v1")
@Tag(name = "UserApiController", description = "用户API接口")
public class UserApiController extends BaseController {

    @GetMapping("/users")
    @Operation(method = "GET", summary = "用户查询",
            description = "查询所有用户信息")
    @ApiResponses({
            @ApiResponse(responseCode = "200", description = "查询完成"),
            @ApiResponse(responseCode = "500", description = "内部查询错误")
    })
    public ResultVo<List<User>> listUser() {
        User u1 = new User("1001", "user1", 21);
        User u2 = new User("1002", "user2", 20);
        List<User> list = Arrays.asList(u1, u2);
        return success(list);
    }

    @GetMapping("/user/{id}")
    @Operation(method = "GET", summary = "用户查询",
            description = "根据用户ID查询详细信息")
    @Parameters({
            @Parameter(name = "id", description = "用户ID",
                    required = true, in = ParameterIn.PATH)
    })
    @ApiResponses({
            @ApiResponse(responseCode = "200", description = "查询完成"),
            @ApiResponse(responseCode = "500", description = "内部查询错误")
    })
    public ResultVo<User> getUser(@PathVariable("id") String uid) {
        User user = new User(uid, "user1", 19);
        return success(user);
    }



}
  1. @RestController:这个注解表示这是一个RESTful风格的控制器类,用于处理HTTP请求并返回RESTful风格的响应。它相当于将@Controller@ResponseBody两个注解结合在一起使用,省去了在每个请求处理方法上都加上@ResponseBody的麻烦。

  2. @RequestMapping("/api/v1"):这个注解用于指定整个控制器类的基本路径为"/api/v1",也就是说该控制器处理的URL都会以"/api/v1"开头。例如,如果有一个处理GET请求的方法映射了"/users"路径,那么实际的URL路径就是"/api/v1/users"。

  3. @Tag(name = "UserApiController", description = "用户API接口"):这个注解来自于Springdoc OpenAPI库,用于为该控制器类设置OpenAPI文档中的标签名称和描述信息。通过这个注解,你可以在生成的API文档中对该控制器进行分类和描述。

  4. public class UserApiController extends BaseController:这是控制器类的定义,继承自BaseController类。BaseController可能是一个自定义的基础控制器类,用于封装一些通用的功能和方法,让子类的控制器类继承并复用这些功能和方法。

  5. @GetMapping("/users"):这个注解表示处理HTTP的GET请求,并且指定了具体的路径为"/users"。它是@RequestMapping(method = RequestMethod.GET, value = "/users")的简写形式。在Spring MVC中,这个注解通常用于标记处理GET请求的方法。

  6. @Operation:这个注解用于描述操作的信息,包括HTTP方法、摘要和描述等。它可以用在请求处理方法上,为方法提供一些额外的元数据,用于生成API文档。例如,你可以使用@Operation(summary = "获取所有用户", description = "用于查询系统中的所有用户信息")来描述一个获取所有用户的方法。

  7. @ApiResponses:这个注解用于定义可能的响应信息,包括响应码和描述等。你可以在该注解内部使用@ApiResponse注解来定义具体的响应信息。例如,你可以使用@ApiResponses(value = { @ApiResponse(responseCode = "200", description = "成功"), @ApiResponse(responseCode = "404", description = "未找到用户") })来定义一个获取用户信息的方法可能返回的两种响应。

  8. public ResultVo<List<User>> listUser():这是处理"/users"路径的GET请求的方法,返回一个ResultVo对象,其中包含了一个User对象列表。ResultVo可能是一个自定义的类,用于封装响应结果的数据和元数据,例如状态码、消息等。

  9. @GetMapping("/user/{id}"):这个注解表示处理HTTP的GET请求,并且指定了具体的路径为"/user/{id}",其中{id}是一个占位符,表示参数化的URL路径。例如,如果实际请求的URL路径为"/user/123",那么{id}的值就是"123"。

  10. @Parameter:这个注解用于描述方法的参数信息,包括参数名称、描述、是否必须等。它可以用在方法的参数上,为参数提供一些额外的元数据,用于生成API文档。例如,你可以使用@Parameter(name = "id", description = "用户ID", required = true)来描述一个获取用户信息的方法的id参数。

  11. public ResultVo<User> getUser(@PathVariable("id") String uid):这是处理"/user/{id}"路径的GET请求的方法,通过@PathVariable注解将路径中的{id}参数映射到方法的uid参数上,返回一个ResultVo对象,其中包含了一个User对象。@PathVariable注解用于将路径中的占位符参数映射到方法的参数上,例如将"/user/123"中的"123"映射到uid参数上。

总的来说,这段代码使用了Spring MVC的注解来定义RESTful API控制器,同时利用了Springdoc OpenAPI库中的注解来简化OpenAPI规范的配置和生成,使得代码更加清晰和易于理解

 

 4、测试

访问路径为:http://localhost:8080/上下文/swagger-ui/index.html

 

六、设置open-api的作用 

OpenAPI是一种用于描述和定义RESTful API的规范。它提供了一种标准化的方式来描述API的各个方面,包括请求方法、路径、参数、响应等。通过使用OpenAPI规范,可以帮助开发者更好地理解和使用API,并且使得API的文档和代码保持同步。

设置OpenAPI的作用主要有以下几点:

  1. 文档生成:使用OpenAPI规范可以方便地生成API文档,包括接口的路径、请求方法、参数、响应等信息。这样,开发者可以通过查阅API文档了解每个接口的使用方法和预期的返回结果。

  2. 接口调试:OpenAPI规范可以作为接口的约定,开发人员可以根据规范来构造请求、处理响应,并进行接口的调试和测试。这样可以确保接口在开发阶段能够正确地运行并返回期望的结果。

  3. 代码生成:基于OpenAPI规范,可以生成客户端或服务器端的代码框架,减少手写代码的工作量。通过代码生成,可以快速搭建起与API对接的程序框架,提高开发效率。

  4. 接口管理和版本控制:OpenAPI规范可以帮助团队管理和维护大量的API接口。通过定义和维护OpenAPI规范文件,可以清晰地了解所有接口的定义和使用情况,并且能够进行版本控制和升级。

  5. 提供自动化工具支持:OpenAPI规范被广泛支持,有很多开源工具可以根据规范来进行接口测试、文档生成、代码生成等操作。这些工具可以提高开发效率和质量,并且保持与行业标准的一致性。

总的来说,设置OpenAPI规范可以帮助开发者更好地管理、使用和维护API,提高开发效率和代码质量,并且促进团队间的合作和沟通。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全新爱蜗影视优码双端影视源码v9.1/影视视频APP源码+支持代理/在线支付+支持对应苹果CMS

源码简介&#xff1a; 这个是最新爱蜗影视优码双端影视源码&#xff0c;作为实用方便的影视视频APP源码&#xff0c;它不仅支持代理/在线支付&#xff0c;而且也支持对应苹果CMS。 爱蜗影视优码双端影视支持对应苹果CMS支持代理在线支付 带图文教程&#xff0c;全新美化多功能…

盘点最新的十大地推拉新app推广接单平台,一手接单渠道分享

小编主推&#xff1a;聚量推客 一手官签直营 随着网络的发展&#xff0c;越来越多的app运应而生社交类、购物类、娱乐类、资讯类、教育类、健康类、金融类为了将这些应用程序推广给更多的人使用&#xff0c;地推拉新app推广接单平台应运而生。本文将介绍十大地推拉新app推广接…

几何教学工具 Sketchpad几何画板 mac软件特色

Sketchpad几何画板 for Mac是一款适用于macOS系统的几何教学工具&#xff0c;用户可以在其画板上进行各种几何图形的绘制、演示&#xff0c;帮助教师了解学生的思路和对概念的掌握程度。此外&#xff0c;Sketchpad更深层次的功能则是可以用来进行几何交流、研究和讨论&#xff…

单片机学习11——矩阵键盘

矩阵键盘&#xff1a; 这个矩阵键盘可以接到P0、P1、P2、P3都是可以的。 使用矩阵键盘是能节省单片机的IO口。 P3.0 P3.1 P3.2 P3.3 称之为行号。 P3.4 P3.5 P3.6 P3.7 称之为列号。 矩阵键盘检测原理&#xff1a; 1、检查是否有键按下&#xff1b; 2、键的抖动处理&#xf…

电机工作制

电机工作制 1.什么是电机工作制2.电机工作制的分类 最近在做电机控制器&#xff0c;看到很多电机铭牌上写着工作制&#xff1a;S*&#xff0c;有S1&#xff0c;有S2&#xff0c;查了一下&#xff0c;学习一下是什么意思。 1.什么是电机工作制 根据GBT 755-2019《旋转电机定额…

机器学习的复习笔记4-岭回归与多项式回归

一、岭回归 在简单的线性回归中&#xff0c;一味追求平方误差最小化&#xff0c;R2值尽可能大&#xff0c;可能会受到噪声的严重干扰。噪声&#xff0c;即偶发的错误的值。 如图&#xff0c;若为满足所有点的拟合&#xff08;虚线&#xff09;&#xff0c;表面上看R2值小&…

springboot+vue实现websocket通信实例,进入页面建立连接

springbootvue实现websocket通信实例 进入页面建立连接 前端代码&#xff1a; <template><div class"app-container"><el-form :model"queryParams" ref"queryForm" size"small" :inline"true" v-show&qu…

数据治理:数据交换与数据集成

数据交换 基本概念 数据交换是将符合一个源模式的数据转换为符合目标模式数据的问题&#xff0c;该目标模式尽可能准确并且以与各种依赖性一致的方式反映源数据。 早期数据交换的一个主要方向是在关系模式之间从数据交换的上下文中寻求一阶查询的语义和复杂性。2008 年&…

java选择排序和冒泡排序

1.区别 选择排序和冒泡排序的区别主要在于算法逻辑、稳定性和交换成本。 算法逻辑&#xff1a;选择排序和冒泡排序都属于比较排序&#xff0c;但在具体算法逻辑上有所不同。冒泡排序是通过相邻元素之间的比较和交换&#xff0c;将较大&#xff08;或较小&#xff09;的元素逐…

一起学docker系列之十三使用Dockerfile构建带有Java 8、Vim和Ifconfig功能的CentOS镜像

目录 1 前言2 构建流程3 Dockerfile说明4 解释Dockerfile5 构建Docker镜像6 运行Docker容器7 总结8 参考地址 1 前言 Docker是一个强大的工具&#xff0c;可以创建一致、可移植和隔离的环境。在本指南中&#xff0c;我们将介绍如何创建一个基于CentOS的Docker镜像&#xff0c;…

从容应对高并发:RabbitMQ与消息限流策略的完美结合

在当今互联网时代&#xff0c;高并发访问已成为许多应用系统面临的常见挑战之一。对于需要处理大量请求的系统来说&#xff0c;如何保证系统的稳定性和可靠性是一个关键问题。RabbitMQ作为一种可靠的消息队列中间件&#xff0c;可以帮助解决高并发环境下的消息处理问题。而结合…

好用的基于layui的免费开源后台模版layuimini

发现一个好用的后台模版 基于layui的免费开源后台模版layuimini layuimini - 基于Layui的后台管理系统前端模板 easyadmin开源项目 EasyAdmin是基于ThinkPHP6.0Layui的快速开发的后台管理系统。 演示站点 演示地址&#xff1a;跳转提示&#xff08;账号&#xff1a;admin&a…

最佳软件配置管理工具(16款SCM工具)

配置管理&#xff08;CM&#xff09;是一种系统工程方法&#xff0c;用于在产品的整个生命周期内建立和维持产品的性能&#xff0c;功能和物理属性与其设计&#xff0c;要求和操作信息的一致性。 它们为您的组织带来了成本效益和更好的时间管理。 当今市场充斥着各种配置管理工…

orcad模块化绘制电路

当我们的板子上需要绘制大量的重复电路的时候&#xff0c;手动去绘制就很浪费时间。 orcad 的软件可以进行模块化绘制&#xff0c;将几个原理图包装成一个模块&#xff0c;然后直接去复制模块就可以。 相对来说大大的简化了原理图的设计麻烦程度 下面就是整个的操作流程 最后做…

SVG图片选择库组件封装及使用

需求 需求&#xff1a; 在项目中通常需要做菜单管理&#xff0c;想要让左侧菜单好看一点&#xff0c;一般都会选择添加图标&#xff0c;需要自定义选择喜欢的图标&#xff0c;得提供一个有选择项的图标库 延伸需求&#xff1a;在项目中通常可能有好几个图标选择库&#xff0c;可…

第5代PCIe技术PCIe 5.0详解

前言 PCIe 5.0 第5代PCIe技术PCIe5.0速度是 PCIe 4.0 的两倍&#xff0c;并具有向下兼容性。PCIe 5.0 协议分析仪能够支持 32GT/秒的数据链路速度操作&#xff0c;同时具有卓越的内存、存储容量和分段功能&#xff0c;可捕获更大容量的上行和下行流量。什么是 PCIe 5.0&#x…

mysql账户密码获取

数据库安装目录 MySQL\data\mysql 里面的user.MYD文件&#xff0c;需要编译查看 数据库里的user表 库下面的user表拿到后&#xff0c;直接解密密码即可 网站配置文件 conn、config、data、sql、common 、inc这些文件 比如pikachu\inc目录下的config.inc.php文件的内容会显示…

Docker和Kubernetes:区别与优势对比

在现代软件开发和部署中&#xff0c;Docker和Kubernetes是两个备受关注的技术。本文将对Docker和Kubernetes进行比较&#xff0c;探讨它们的区别和各自的优势。 引言 在过去的几年中&#xff0c;容器技术得到了迅速的发展&#xff0c;并且在现代软件交付和部署中扮演着越来越重…

智能优化算法应用:基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.正余弦算法4.实验参数设定5.算法结果6.参考文献7.…

Vue3-pnpm包管理器创建项目

一些优势&#xff1a;比同类工具快2倍左右、节省磁盘空间 官网&#xff1a;pnpm - 速度快、节省磁盘空间的软件包管理器 | pnpm中文文档 | pnpm中文网 npm升级到yarn再升级到pnpm&#xff08;速度更快&#xff09; 安装方式&#xff1a;npm install -g pnpm 创建项目&#…