JavaWeb学习——Maven高级使用学习

一、分模块设计与开发

1、分模块设计原因

        Maven 的分模块设计主要有以下几个原因:

        1. 模块化管理:在大型项目中,代码量通常会非常大,如果将所有的代码都放在一个模块中,会使得项目结构复杂,不利于代码的管理和维护。通过分模块设计,可以将项目按照业务功能或者层次进行划分,每个模块负责一部分功能,模块之间通过接口进行通信,降低了模块之间的耦合度,提高了代码的可维护性。

        2. 并行开发:分模块设计可以支持多人或多团队并行开发。每个人或团队负责一个或多个模块的开发,可以在不影响其他模块的情况下进行开发,提高了开发效率。

        3. 复用性:分模块设计可以提高代码的复用性。如果一个功能在多个地方都有使用,可以将这个功能抽取出来作为一个模块,这样就可以在多个地方复用这个模块。

        4. 灵活性:分模块设计可以提高项目的灵活性。如果需要修改某个功能,只需要修改对应的模块即可,不需要修改整个项目。

        5. 易于测试:每个模块都可以单独进行测试,这样可以更早地发现问题,提高软件的质量。

        6. 版本控制:每个模块都可以有自己的版本号,可以单独进行版本控制和发布。

        总的来说,Maven 的分模块设计可以提高项目的可维护性、开发效率、复用性、灵活性和软件质量,同时也方便了版本控制和发布。

2、示例讲解

代码示例

<?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>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.sunny</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><lombok.version>1.18.34</lombok.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies><!--统一管理依赖--><dependencyManagement><dependencies><!--JWT令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!--阿里云OSS依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>4.0.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.3.3</version></dependency></dependencies></dependencyManagement></project><?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.sunny</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../tlias-parent/pom.xml</relativePath></parent><artifactId>tlias-pojo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency></dependencies></project><?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.sunny</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../tlias-parent/pom.xml</relativePath></parent><artifactId>tlias-utils</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--JWT令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency><!--阿里云OSS依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project><?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.sunny</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../tlias-parent/pom.xml</relativePath></parent><artifactId>tliasweb-management</artifactId><version>0.0.1-SNAPSHOT</version><name>tliasweb-management</name><description>tliasweb-management</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies><!--web起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></dependency><!--mybatis起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><!--mysql驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--springboot单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>3.0.3</version><scope>test</scope></dependency><!--pagehelper依赖--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><!--fastJSON--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.50</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>com.sunny</groupId><artifactId>tlias-pojo</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.sunny</groupId><artifactId>tlias-utils</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><testFailureIgnore>true</testFailureIgnore></configuration></plugin></plugins></build></project>

        注:上面代码是本人自己设计的,在这展示大多是为了留作后面回来复习用,如果是别人看的话应该会有难度去理解,毕竟少了很多代码。不过总的来说的话,实现分模块设计,就是拆分出多个Module,里面的代码是不变的,重要的是pom配置的改变,去实现父类或添加特有的依赖。

二、继承与聚合

1、继承关系实现

继承关系的说明

        说明:我们大多在子类的pom文件里实现<parent>的描述,可以定义相应的父类。

继承关系实现

代码示例

<!--父类--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.sunny</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><!--子类--><parent><groupId>com.sunny</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../tlias-parent/pom.xml</relativePath></parent><artifactId>tlias-pojo</artifactId><version>1.0-SNAPSHOT</version><!--子类-->
<parent><groupId>com.sunny</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../tlias-parent/pom.xml</relativePath></parent><artifactId>tlias-utils</artifactId><version>1.0-SNAPSHOT</version>

2、版本锁定功能

使用原因

        Maven的版本锁定主要有以下几个原因:

        1. 保证构建的一致性:在软件开发过程中,我们常常会依赖许多第三方的库或者插件,这些库或者插件的版本如果不进行锁定,那么在不同的环境中(比如开发环境、测试环境、生产环境)可能会使用到不同版本的库或者插件,这就可能导致在不同环境中软件的行为不一致。通过版本锁定,可以保证在所有环境中都使用相同版本的库或者插件,从而保证构建的一致性。

        2. 避免版本冲突:如果我们的项目依赖了多个库,而这些库又依赖了同一个库的不同版本,那么就可能会出现版本冲突的问题。通过版本锁定,可以明确指定我们项目使用的库的版本,从而避免版本冲突。

        3. 避免不兼容的问题:有些库在升级版本后可能会改变API,如果我们的项目没有锁定版本,那么在更新库版本后可能会出现不兼容的问题。通过版本锁定,可以避免这种问题。

        4. 易于管理:通过版本锁定,可以清楚地知道项目使用的都是哪些版本的库,便于进行版本管理和升级。

        因此,Maven的版本锁定是非常重要的,它可以保证构建的一致性,避免版本冲突和不兼容的问题,同时也便于管理。

使用方式

代码示例

<!--父类-->
<properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><lombok.version>1.18.34</lombok.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies><!--统一管理依赖--><dependencyManagement><dependencies><!--JWT令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!--子类-->
<parent><groupId>com.sunny</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../tlias-parent/pom.xml</relativePath></parent><artifactId>tlias-pojo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency></dependencies>

自定义属性/引用属性

        在Maven中,我们可以通过定义properties属性进行版本锁定。这些属性可以用来定义和管理项目中使用的各种依赖和插件版本。这样做的好处是,我们可以在一个地方集中管理所有的版本信息,然后在pom.xml文件的其他地方引用这些属性。

        以下是一个使用properties属性进行版本锁定的示例:

<project>...<properties><spring.version>5.0.8.RELEASE</spring.version><mybatis.version>3.4.6</mybatis.version><mysql.version>8.0.15</mysql.version>...</properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency>...</dependencies>...
</project>

        在这个示例中,我们定义了几个属性,如spring.version、mybatis.version和mysql.version,并在dependencies中引用这些属性来指定依赖的版本。这样,当我们需要升级或改变某个依赖的版本时,只需要修改对应的属性值即可,无需在整个pom.xml文件中搜索和替换。

补充

3、聚合实现

说明

        Maven的聚合是指一个Maven项目可以包含多个子项目,这个包含子项目的项目被称为聚合项目,或者叫做父项目。聚合主要是用来管理多个相关的项目,它们可以一起被构建和发布。

        在Maven中,聚合是通过在父项目的POM文件中添加<modules>元素来实现的。在<modules>元素下,每个<module>元素都对应一个子项目的目录名。当在父项目目录下运行Maven命令时,这些命令会依次应用到每个子模块。

        以下是一个简单的聚合实现示例:

<project>...<packaging>pom</packaging><modules><module>module1</module><module>module2</module></modules>...
</project>

        在这个例子中,我们有一个父项目,它有两个子模块:module1和module2。这两个子模块的目录应该和父项目的POM文件在同一级目录下。当我们在父项目的目录下运行Maven命令,比如mvn install,Maven会首先处理父项目,然后按照在<modules>元素中声明的顺序处理每个子模块。

        需要注意的是,聚合和继承是Maven中两个不同的概念。聚合主要是为了同时管理和构建多个项目,而继承则是为了让子项目继承父项目的某些配置。在实际使用中,聚合和继承经常会一起使用,以实现更复杂的项目结构。

作用

        Maven的聚合功能主要用于管理和构建多模块项目。其主要作用包括:

        1. 统一构建:当在父项目中执行Maven命令时,这些命令会依次应用到所有子模块。这样,我们可以一次性构建所有的模块,而不需要在每个模块的目录下分别执行构建命令。

        2. 统一管理:在父项目的POM文件中,我们可以定义一些通用的配置,比如插件的版本、编译的JDK版本等。这些配置会被所有的子模块继承,这样我们就可以在一个地方管理所有模块的这些配置。

        3. 便于协作:在大型的项目中,通常会有多个开发团队分别负责不同的模块。通过Maven的聚合功能,每个团队可以独立地开发和测试自己的模块,而不需要关心其他模块的细节。同时,由于所有的模块都是在同一个父项目下,所以整个项目的构建和发布也可以很容易地协调。

        4. 便于发布:当项目发布时,我们通常希望把所有的模块一起发布。通过Maven的聚合功能,我们可以一次性构建和发布所有的模块,而不需要分别发布每个模块。

        总的来说,Maven的聚合功能可以使项目的构建、管理、协作和发布更加方便和高效。

图片说明

4、私服

说明

        Maven私服(Maven Repository Manager)是一个专门用于存储、检索和管理构建工具(如Maven、Gradle等)使用的二进制软件工件和元数据的服务。它是一个中心化的资源管理系统,可以极大地提高构建的效率,减少构建的时间,并提供了一种可靠的方式来共享和发布软件工件。

        Maven私服主要有以下几个作用:

        1. 提高构建速度:Maven在构建项目时,需要从远程仓库下载各种依赖包。如果这些依赖包在本地的Maven私服上就有,就不需要从远程仓库下载,从而可以大大提高构建的速度。

        2. 提供稳定的环境:有时,远程仓库可能会因为各种原因无法访问,这时就无法下载依赖包,从而导致构建失败。而Maven私服可以提供一个稳定的环境,确保构建的顺利进行。

        3. 共享和发布软件工件:Maven私服不仅可以用来存储第三方的依赖包,也可以用来存储和共享我们自己开发的软件工件。这样,其他项目就可以直接从私服上获取这些工件,而不需要我们手动地去分发。

        4. 版本控制:Maven私服可以帮助我们管理软件工件的各个版本,使得我们可以方便地回溯和定位问题。

        目前,常见的Maven私服软件有Nexus、Artifactory等。

私服的上传与下载

        私服的资源上传和下载是通过Maven的deploy和resolve机制来实现的。

        1. 上传资源:上传资源到Maven私服通常是通过Maven的deploy命令来完成的。在项目的pom.xml文件中,你需要配置distributionManagement元素,指定私服的URL。然后,你可以运行mvn deploy命令,Maven会把项目的构建结果(通常是jar或war文件)上传到私服。同时,Maven也会生成一些元数据文件(如pom.xml,checksum文件等)一并上传到私服。

       你还需要在Maven的settings.xml文件中,配置私服的认证信息(用户名和密码),以便Maven可以登录到私服。

        2. 下载资源:下载资源从Maven私服是通过Maven的resolve机制来完成的。在项目的pom.xml文件中,你需要配置dependencies元素,声明项目的依赖。然后,当你运行Maven命令(如mvn compile或mvn package)时,Maven会自动从私服下载这些依赖。

      在Maven的settings.xml文件中,你需要配置repositories元素,指定私服的URL。这样,Maven就会从这个URL下载依赖,而不是从默认的中央仓库下载。

        注意,如果私服的URL需要认证,你也需要在settings.xml文件中,配置相应的认证信息。

仓库说明

        在Maven私服中,我们通常会有三种类型的仓库:Hosted Repository(托管仓库)、Proxy Repository(代理仓库)和Group Repository(组仓库)。

        1. Hosted Repository(托管仓库):托管仓库是私服中存储我们自己开发的工件(例如JAR,WAR,EAR文件等)的地方。当我们执行mvn deploy命令时,Maven会把构建的工件部署到托管仓库中。这种仓库可以是开放的,也可以是受保护的,只有经过身份验证的用户才能访问。

        2. Proxy Repository(代理仓库):代理仓库是私服中用来缓存远程仓库中的工件的地方。当我们需要使用某个远程仓库中的工件时,Maven首先会查找代理仓库,如果代理仓库中有这个工件,就直接使用,如果没有,Maven就会从远程仓库下载这个工件,并把它缓存到代理仓库中,以便下次使用。

        3. Group Repository(组仓库):组仓库是私服中用来聚合其他仓库(包括托管仓库和代理仓库)的地方。当我们配置Maven使用私服时,通常只需要配置一个组仓库的URL,Maven就可以访问到所有聚合的仓库中的工件。这样可以简化配置,也可以提高效率。

        以上,这三种仓库类型可以灵活组合使用,以满足不同的需求。例如,我们可以创建一个组仓库,聚合一个托管仓库和几个代理仓库,这样就可以既能共享我们自己的工件,又能缓存远程仓库的工件。

        注意:私服的上传操作我是有黑马提供的资料可以进行参考,在这就不多做解释,如果别人来看有疑惑的话,建议去搜索资料。

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

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

相关文章

大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【安全科普】学完网络安全出去能做什么工作?

想要了解学完网络安全工程师就业班后&#xff0c;出去能做什么工作&#xff0c;这个时候会分甲方或是乙方&#xff0c;看个人更偏向哪个岗位。 甲方指的是政府、海关、税务机构、高校及其他国有银行、商业银行&#xff0c;以及移动运营商&#xff08;如中国移动、中国联通、中…

【前缀和算法】--- 进阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 本篇我们来赏析前缀和算法的进阶题目。 &#x1f3e0; 和可被K整除的子数组 &#x1f4cc; 题目解析 和可被k整除的子数组 &#x1f4cc; …

线性回归算法详解

目录 线性回归算法 线性回归方程 误差项分析 似然函数求解 线性回归求解 梯度下降算法 下山方向选择 梯度下降优化 梯度下降策略对比 学习率对结果的影响 代码实现 线性回归算法 线性回归是回归算法中最简单、实用的算法之一&#xff0c;在机器学习中很多知识点都是…

【网络】数据链路层协议——以太网,ARP协议

目录 1.局域网转发 2.MAC地址 2.1.什么是MAC地址 2.2.Mac地址的作用 2.3.MAC地址和IP地址的区别和联系 3.以太网协议 4.MTU&#xff0c;IP MTU&#xff0c;MSS 4.1.MTU 4.2. IP MTU 4.3. MSS 4.4. 区别及联系 5.局域网的数据碰撞 5.1.局域网内通信过程 5.2.数据碰…

宏集MIRO-L230工业路由器: 一站式全球联网解决方案

在日益互联的世界中&#xff0c;全球覆盖的稳定连接已成为业务成功的关键因素。宏集非常高兴地向您介绍我们的最新创新产品——MIRO-L230工业路由器&#xff0c;这是一款为现代企业量身定制的LTE路由器&#xff0c;为用户带来前所未有的稳定连接体验。 宏集MIRO-L230工业路由器…

墨兰:花语寓意、神秘传说与独特魅力全解析

在繁花似锦的植物世界中&#xff0c;墨兰宛如一位优雅的隐士&#xff0c;静静地散发着独特的魅力。它那婀娜的身姿和淡雅的芬芳&#xff0c;仿佛在诉说着一个个古老而神秘的故事。当我们凝视着墨兰&#xff0c;不禁会被它那独特的气质所吸引&#xff0c;想要探寻它背后隐藏的花…

电容的分类

电容作为电子产品中不可或缺的元件&#xff0c;其种类繁多&#xff0c;各具特色。以下是电容的主要分类、作用及优缺点概述&#xff1a; 一、电容的分类 电容的分类方式多样&#xff0c;常见的分类方式包括按结构、用途、电解质类型及制造材料等。 按结构分类&#xff1a; 固…

C++编程-递归算法1

目录 先言 关于递归算法 例题一 题目描述 算法分析 标准程序 代码分析 例题二 题目描述 算法分析 标准程序 例题三 题目描述 算法分析 标准程序 代码分析 例题四 题目描述 标准程序 代码分析 后言 先言 从今天开始&#xff0c;我们将新的算法——递归&…

大二必做项目贪吃蛇超详解之中篇游戏设计与分析

贪吃蛇系列文章 上篇win32 中篇设计与分析 文章目录 贪吃蛇系列文章1. 地图1. 1 <locale.h>本地化1. 2 类项1. 3 setlocale函数1. 4 宽字符的打印1. 5 地图坐标 2. 蛇身和食物3. 数据结构设计4. 游戏流程设计5. 核心逻辑实现分析5. 1 游戏主逻辑5. 2 GameStart5. 2. 1 S…

145. 利用 Redis Bitmap实践: 用户签到统计

文章目录 一、Redis Bitmap简介二、Bitmap 的主要应用三、Go使用Redis实现签到统计用户签到查询用户签到状态统计今年累计签到天数统计当月的签到情况 总结 在现代应用程序中&#xff0c;用户签到是一个常见的功能。我们通常使用 MySQL 数据库来存储用户的签到记录。然而&#…

Go入门:gin框架极速搭建图书管理系统

Go入门:gin框架极速搭建图书管理系统 前言 本项目适合 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 项目源码请私信,欢迎前往博主博客torna.top免费查看。 项目结构 D:. ├─ go.mod ├─ go.sum │ ├─ cmd │ └─ main │ …

Docker 容器编排之 Docker Compose

目录 1 Docker Compose 概述 1.1 主要功能 1.2 工作原理 1.3 Docker Compose 中的管理层 2 Docker Compose 的常用命令参数 2.1 服务管理 2.1.1 docker-compose up &#xff1a; 2.1.2 docker-compose down &#xff1a; 2.1.3 docker-compose start &#xff1a; 2.1.4 docker…

OpenCV绘图函数(7)从一个椭圆定义中提取出多边形的顶点坐标函数ellipse2Poly()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 近似一个椭圆弧为一个多边形线。 函数 ellipse2Poly 计算近似指定椭圆弧的多边形线的顶点。它被 ellipse 函数所使用。如果 arcStart 大于 arcEn…

景芯SoC A72实战反馈

先说结论&#xff1a; 内容非常全面&#xff0c;讲解到位&#xff0c;会有专门的工程师一对一答疑&#xff0c;整个项目跑下来提升非常大&#xff0c;绝对物超所值&#xff01; 一些细节&#xff1a; 本人微电子专业研一在读&#xff0c;有过两次简单的数字芯片流片经历&…

spring security 相关过滤器

Spring Security 提供了 30 多个过滤器。默认情况下Spring Boot 在对 SpringSecurity 进入自动化配置时&#xff0c;会创建一个名为 SpringSecurityFilerChain 的过滤器&#xff0c;并注入到Spring容器中&#xff0c;这个过滤器将负责所有的安全管理&#xff0c;包括用户认证、…

Windows系统中批量管理Windows服务器远程桌面工具——RDCMan

一、背景 在公司没有部署对应的堡垒机系统之前,做运维测试工作的人员,需要管理大量的服务器,每天需要对服务器进行必要的巡检、系统更新发布等内容,特别是有很多Windows服务器的时候,如果我们使用Windows自带的“远程桌面连接”只能一台台连接,比较繁琐。并且不能知道那台…

十二星座男女、穿越到古代会成为什麽角色 。

白羊座&#xff08; 大将军 &#xff09;&#xff1b; 金牛座&#xff08;财务大臣&#xff09;&#xff1b; 双子座&#xff08; 奸臣 &#xff09;&#xff1b; 巨蟹座&#xff08;御厨太医&#xff09;&#xff1b; 狮子座&#xff08;皇帝&#xff09;&#xff1b; …

虚幻5|按键触发学习

一&#xff0c;如图参考 1.下移 驱动阈值 越大按时间长才会触发&#xff0c;越小很快就可以触发 2.按下 当按下超出驱动阈值大小就会触发一次&#xff0c;这里的驱动阈值只能设置再0.1~1的大小 3.已松开 当按下的时候&#xff0c;先触发单次的started&#xff0c;如果按压…

精选算法编程题

一、有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10]输出&#xff1a;[0,1,9,16,100]解释&#xff1a;平方后&am…