java开发需要掌握的maven相关知识和Junit单元测试

news2024/11/24 17:04:57

maven简介


    什么是maven:


        maven是一款管理和构建java项目的工具,是apache旗下的一个开源项目。


    maven的作用:

        依赖管理:


            方便快捷的管理项目依赖的资源(jar包)。


        项目构建:


            标准化的跨平台(Linux,windows,macOs)的自动化项目构建方式。
      

 统一项目结构:


            提供标准,统一的项目结构。


    maven概述:

        仓库:

用于存储资源,管理各种jar包


            本地仓库:自己计算机上的一个目录
            中央仓库:由maven团队维护的全球唯一的。仓库地址(https://repo1.maven.org/maven2/)
            远程仓库(私服):一般由公司团队搭建的私有仓库



        安装:

  • 1,解压  apache-maven-3.9.4-bin.zip
  • 2,配置本地仓库:创建一个本地仓库文件夹
  • 3,修改 conf/settings.xml 中的 <localRepository> 为一个指定目录
  • 4,配置阿里云私服:修改 conf/settings.xml 中的 <mirrors> 标签,为其添加如下子标签

                <mirror>  
                        <id>alimaven</id>  
                        <name>aliyun maven</name>  
                        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                        <mirrorOf>central</mirrorOf>          
        </mirror>

  • 5,指定jdk版本

   <profile>
    <id>jdk-21</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>21</jdk>
    </activation>
    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <maven.compiler.compilerVersion>21</maven.compiler.compilerVersion>
    </properties>
</profile>

  • 6,配置环境变量: MAVEN_HOME 为maven的解压目录,并将其bin目录加入PATH环境变量

第一步:解压

第二步:创建本地仓库

 第三步:修改conf/settings.xml

第四步:配置阿里云私服

 第五步:指定jdk版本

第六步:配置环境变量  MAVEN_HOME

 

 在path里面配置bin

测试:window+r 输入mvn -v

能看见版本信息就代表成功 

IDEA集成maven

第一步:close Project

第二步:点击 customize 右下角的 All settings

第三步:点击 Build,Exception,Depliyment下面的Build Tools下面的maven进行配置

第四步:点击 Build,Exception,Depliyment下面的Build Tools下面的Runner 进行配置

 

第五步:点击 Build,Exception,Depliyment下面的 Compiler里面的java Compiler

 现在IDEA已经集成maven了


        创建maven项目:

                第一步:先创建一个空项目

                

第二步:点击在右上角的设置。找到Project Structure

 第三步:在project里面设置jdk版本

导入模块:

第一步:在新创建的工程右击,

第二步:选择 new Module 

第三步:导入module

第二步选择要导入的模块:

 第三步:选择 import module

 

第四步:点击pom.xml添加:

第二种方式导入模块:

还是点击pom.xml

移除模块:

第一步:点击要移除的module右击

第二步:在compiler.xml删除缓存文件


        maven坐标:

            什么是坐标?

  •    maven中的坐标是资源(jar)包的唯一标识,通过该坐标可以唯一定位资源位置。
  •     使用坐标来定义项目或者引入项目中需要的依赖。
  •             maven坐标主要组成

                groupId:定义当前maven项目隶属组织名称(通常是域名反写,例如:com.baidu)
                artifactId:定义当前maven项目名称(通常是模块名称,例如 user-service、user-service)

  •                 version:定义当前项目版本号

                    SNAPAHOT:功能不稳定,处于开发中的版本,即快照版本
                    RELEASE:功能趋于稳定,当前更新停止,可以用于发行版本。


      
        依赖配置:


            依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
            配置:
                1,在pom.xml中编写<dependencies>标签
                2,在<dependencies>标签中使用<dependcy>引入坐标
                3,定义坐标的groupId,artifiactId,version
                4,点击刷新按钮,引入最新的加入的坐标

示例:


        依赖传递:


            直接依赖:在当前项目中通过依赖配置建立的依赖关系
            间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

            排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。

 这样点就出来了

 

排除依赖


        生命周期:


            maven中有三套相互独立的生命周期
                clean:清理工作
                default:核心工作,如:编译,打包,测试,安装,部署
                site:生成报告,发布站点

clean操作: 把已经编译好的target目录删除

compile操作:编译项目,出现target文件

test:单元测试:

package打包:在target里面会出现一个jar包

install:把项目打包到本地仓库


        依赖范围:


            依赖范围的jar包:默认情况下,可以在任何地方使用。可以通过<scope>设置其作用范围。
            作为范围:
                主程序范围有效。(main文件夹范围内)

                测试程序范围有效。(test文件夹范围内)

                是否参与打包运行。(package指令范围内)

    单元测试:


        测试概述:


            是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。
            阶段划分:单元测试、集成测试、系统测试、验收测试。

            测试方法:白盒测试、黑盒测试 及 灰盒测试。

        快速入门:单元测试:就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试。
JUnit:最流行的Java测试框架之一,提供了一些功能,方便程序进行单元测试(第三方公司提供)。

            使用步骤:


                1,在pom.xml中,引入Junit的依赖
                2,在test/java目录下,创建测试类,并编写对应的测试方法,并在方法上声明@Test注解。
                3,运行单元测试 (测试通过:绿色;测试失败:红色)。

        常见注解:


            @Test:测试类中的方法用它修饰才能成为测试方法,才能启动执行

            @BeforeEach:用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。
            @AfterEach:用来修饰一个实例方法,该方法会在每一个方法执行之后执行。
            @BeforeAll:用来修饰静态方法,该方法会在所有测试方法执行之前只执行一次。
            @AfterAll:用来修饰一个静态方法,该方法会在所有实例方法之前只会执行一次。
            @ParameterizedTest:参数化测试的注解 (可以让单个测试运行多次,每次运行时仅参数不同)

            @ValueSource:参数化测试的参数来源,赋予测试方法参数

            @DisplayName:指定测试类、测试方法显示的名称 (默认为类名、方法名)

代码示例1:

package com.sde.test.test2;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@DisplayName("用户相关的测试")
public class UserService1Test {
    private final String card1 = "610110201909091231";
    private final String card2 = "110110201509091109";
    private final String card3 = "510310198812120931";

    /**
     * 测试是否是北京
     */
    @DisplayName("测试是否是北京地区")
    @Test
    public void testIsBeijing(){
        boolean flag1 = new UserService().isBeijing(card1);
        boolean flag2 = new UserService().isBeijing(card2);
        boolean flag3 = new UserService().isBeijing(card3);
        System.out.println(flag1);
        System.out.println(flag2);
        System.out.println(flag3);
    }

    /**
     * 测试年龄
     */
    @DisplayName("测试用户的年龄")
    @Test
    public void testGetAge(){
        Integer age1 = new UserService().getAge(card1);
        Integer age2 = new UserService().getAge(card2);
        Integer age3 = new UserService().getAge(card3);
        System.out.println(age1);
        System.out.println(age2);
        System.out.println(age3);
    }

    /**
     * 测试性别
     */
    @DisplayName("测试用户的性别")
    @Test
    public void testGetGender(){
        String gender1 = new UserService().getGender(card1);
        String gender2 = new UserService().getGender(card2);
        String gender3 = new UserService().getGender(card3);
        System.out.println(gender1);
        System.out.println(gender2);
        System.out.println(gender3);
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生年份")
    @Test
    public void testYear(){
        String year1 = new UserService().getYear(card1);
        String year2 = new UserService().getYear(card2);
        String year3 = new UserService().getYear(card3);
        System.out.println(year1);
        System.out.println(year2);
        System.out.println(year3);
    }

    /**
     * 测试出生月份
     */
    @DisplayName("测试出生月份")
    @Test
    public void testGetMonth(){
        String month1 = new UserService().getMonth(card1);
        String month2 = new UserService().getMonth(card2);
        String month3 = new UserService().getMonth(card3);
        System.out.println(month1);
        System.out.println(month2);
        System.out.println(month3);
    }

}

测试案例2:

package com.sde.test.test2;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

@DisplayName("用户相关的测试")
public class UserService2Test {

    @DisplayName("测试是否是北京地区")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testIsBeijing(String cardId){
        boolean b = new UserService().isBeijing(cardId);
        System.out.println(b);
    }

    @DisplayName("测试用户的年龄")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testGetAge(String cardId){
        Integer age = new UserService().getAge(cardId);
        System.out.println(age);
    }

    @DisplayName("测试用户的性别")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testGetGender(String cardId){
        String gender = new UserService().getGender(cardId);
        System.out.println(gender);
    }

    @DisplayName("测试出生年份")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testGetYear(String cardId){
        String year = new UserService().getYear(cardId);
        System.out.println(year);
    }

    @DisplayName("测试出生月份")
    @ParameterizedTest
    @ValueSource(strings = {"610110201909091231","110110201509091109","510310198812120931"})
    public void testGetMonth(String cardId){
        String month = new UserService().getMonth(cardId);
        System.out.println(month);
    }

}

案例3:

package com.sde.test.test2;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@DisplayName("用户相关的测试")
public class UserServer3Test {
    private final String card1 = "610110201909091231";
    private final String card2 = "110110201509091109";
    private final String card3 = "510310198812120931";

    /**
     * 测试是否是北京
     */
    @DisplayName("测试是否是北京地区")
    @Test
    public void testIsBeijing(){
        boolean flag1 = new UserService().isBeijing(card1);
        boolean flag2 = new UserService().isBeijing(card2);
        boolean flag3 = new UserService().isBeijing(card3);
        System.out.println(flag1);
        System.out.println(flag2);
        System.out.println(flag3);
        Assertions.assertFalse(flag1);
        Assertions.assertTrue(flag2);
        Assertions.assertFalse(flag3);
    }

    /**
     * 测试年龄
     */
    @DisplayName("测试用户的年龄")
    @Test
    public void testGetAge(){
        Integer age1 = new UserService().getAge(card1);
        Integer age2 = new UserService().getAge(card2);
        Integer age3 = new UserService().getAge(card3);
        System.out.println(age1);
        System.out.println(age2);
        System.out.println(age3);
        Assertions.assertEquals(4,age1,"4岁");
        Assertions.assertEquals(8,age2,"8岁");
        Assertions.assertEquals(34,age3,"34岁");
    }

    /**
     * 测试性别
     */
    @DisplayName("测试用户的性别")
    @Test
    public void testGetGender(){
        String gender1 = new UserService().getGender(card1);
        String gender2 = new UserService().getGender(card2);
        String gender3 = new UserService().getGender(card3);
        System.out.println(gender1);
        System.out.println(gender2);
        System.out.println(gender3);
        Assertions.assertEquals("男",gender1,"男");
        Assertions.assertEquals("女",gender2,"女");
        Assertions.assertEquals("男",gender3,"男");
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生年份")
    @Test
    public void testYear(){
        String year1 = new UserService().getYear(card1);
        String year2 = new UserService().getYear(card2);
        String year3 = new UserService().getYear(card3);
        System.out.println(year1);
        System.out.println(year2);
        System.out.println(year3);
        Assertions.assertEquals("2019",year1,"2019");
        Assertions.assertEquals("2015",year2,"2015");
        Assertions.assertEquals("1988",year3,"1988");
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生月份")
    @Test
    public void testGetMonth(){
        String month1 = new UserService().getMonth(card1);
        String month2 = new UserService().getMonth(card2);
        String month3 = new UserService().getMonth(card3);
        System.out.println(month1);
        System.out.println(month2);
        System.out.println(month3);
        Assertions.assertEquals("09",month1,"09");
        Assertions.assertEquals("09",month2,"09");
        Assertions.assertEquals("12",month3,"12");
    }
}

        断言:


            assertEquals(Object exp, Object act, String msg)---检查两个值是否相等,不相等就报错。


            assertNotEquals(Object unexp, Object act, String msg)---检查两个值是否不相等,相等就报错。

            assertNull(Object act, String msg):---    检查对象是否为null,不为null,就报错。
            assertNotNull(Object act, String msg)---检查对象是否不为null,为null,就报错。

            assertTrue(boolean condition, String msg)---检查条件是否为true,不为true,就报错。

            assertFalse(boolean condition, String msg)---检查条件是否为false,不为false,就报错。

            assertSame(Object exp, Object act, String msg)---检查两个对象引用是否相等,不相等,就报错。

案例:

package com.sde.test.test2;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@DisplayName("用户相关的测试")
public class UserServer3Test {
    private final String card1 = "610110201909091231";
    private final String card2 = "110110201509091109";
    private final String card3 = "510310198812120931";

    /**
     * 测试是否是北京
     */
    @DisplayName("测试是否是北京地区")
    @Test
    public void testIsBeijing(){
        boolean flag1 = new UserService().isBeijing(card1);
        boolean flag2 = new UserService().isBeijing(card2);
        boolean flag3 = new UserService().isBeijing(card3);
        System.out.println(flag1);
        System.out.println(flag2);
        System.out.println(flag3);
        Assertions.assertFalse(flag1);
        Assertions.assertTrue(flag2);
        Assertions.assertFalse(flag3);
    }

    /**
     * 测试年龄
     */
    @DisplayName("测试用户的年龄")
    @Test
    public void testGetAge(){
        Integer age1 = new UserService().getAge(card1);
        Integer age2 = new UserService().getAge(card2);
        Integer age3 = new UserService().getAge(card3);
        System.out.println(age1);
        System.out.println(age2);
        System.out.println(age3);
        Assertions.assertEquals(4,age1,"4岁");
        Assertions.assertEquals(8,age2,"8岁");
        Assertions.assertEquals(34,age3,"34岁");
    }

    /**
     * 测试性别
     */
    @DisplayName("测试用户的性别")
    @Test
    public void testGetGender(){
        String gender1 = new UserService().getGender(card1);
        String gender2 = new UserService().getGender(card2);
        String gender3 = new UserService().getGender(card3);
        System.out.println(gender1);
        System.out.println(gender2);
        System.out.println(gender3);
        Assertions.assertEquals("男",gender1,"男");
        Assertions.assertEquals("女",gender2,"女");
        Assertions.assertEquals("男",gender3,"男");
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生年份")
    @Test
    public void testYear(){
        String year1 = new UserService().getYear(card1);
        String year2 = new UserService().getYear(card2);
        String year3 = new UserService().getYear(card3);
        System.out.println(year1);
        System.out.println(year2);
        System.out.println(year3);
        Assertions.assertEquals("2019",year1,"2019");
        Assertions.assertEquals("2015",year2,"2015");
        Assertions.assertEquals("1988",year3,"1988");
    }

    /**
     * 测试出生年份
     */
    @DisplayName("测试出生月份")
    @Test
    public void testGetMonth(){
        String month1 = new UserService().getMonth(card1);
        String month2 = new UserService().getMonth(card2);
        String month3 = new UserService().getMonth(card3);
        System.out.println(month1);
        System.out.println(month2);
        System.out.println(month3);
        Assertions.assertEquals("09",month1,"09");
        Assertions.assertEquals("09",month2,"09");
        Assertions.assertEquals("12",month3,"12");
    }
}

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

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

相关文章

MacBook如何远程控制华为手机?

将手机屏幕投影到电脑上可以提供更大的屏幕空间&#xff0c;方便观看电影、浏览照片、阅读文档等。然而&#xff0c;除了想将手机投屏到电脑&#xff0c;还想要在电脑上直接操作手机&#xff0c;有方法可以实现吗&#xff1f; 现在使用AirDroid Cast的远程控制手机功能就可以实…

【数据结构】树与二叉树(廿五):树搜索给定结点的父亲(算法FindFather)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子、大兄弟结点2. 搜索给定结点的父亲a. 算法FindFatherb. 算法解析c. 代码实现 3. 代码整合 5.3.1 树的存储结构 5. 左儿子右兄弟链接结构 【数据结构】树与二叉树&#xff08;十九&…

Linux dig指令的十三种用法

文章目录 dig指令有哪些作用dig 具体用法推荐阅读 dig指令有哪些作用 DIG命令(Domain Information Groper命令)是一个网络工具&#xff0c;具有基本的命令行接口&#xff0c;用于进行不同的DNS(域名系统)查询。您可以使用DIG命令: 诊断您的域名服务器。检查所有这些服务器或每…

《数据结构与测绘程序设计》试题详细解析(仅供参考)

一. 选择题&#xff08;每空2分&#xff0c;本题共30分&#xff09; &#xff08;1&#xff09;在一个单链表中&#xff0c;已知q所指结点是p所指结点的前驱结点&#xff0c;若在q和p之间插入结点s&#xff0c;则执行( B )。 A. s->nextp->next; p->nexts; …

Qt路径和Anaconda中QT路径冲突(ubuntu系统)

最近做一个项目需要配置QT库&#xff0c;本项目配置环境如下&#xff1a; Qt version 5 Operating system, version and so on ubuntu 20.04 Description 之前使用过anaconda环境安装过QT5&#xff0c;所以在项目中CMakeLists文件中使用find_package时候&#xff0c;默认使用An…

C#,数值计算——插值和外推,径向基函数插值(RBF_inversemultiquadric)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class RBF_inversemultiquadric : RBF_fn { private double r02 { get; set; } public RBF_inversemultiquadric(double scale 1.0) { this.r02 Globals.SQR(scale); …

Spring Boot实现图片上传和展示

Spring Boot实现图片上传和展示 本文将介绍如何使用Spring Boot框架搭建后端服务&#xff0c;实现接收前端上传的图片并保存到resources/images目录下。同时&#xff0c;我们还将展示如何在前端编写一个HTML页面&#xff0c;实现上传图片和从resources/images目录下获取图片并…

PHP+vue+elementui高校学生社团信息管理系统o7q4a

社团是由高校用户依据兴趣爱好自愿组成&#xff0c;按照章程自主开展活动的用户组织。高校社团是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高用户综合素质、引导用户适应社会、促进用户交流等方面发挥着重要作用&#xff0c;是新形势下有效凝聚用户…

[Python入门系列之十一]在windows上安装OpenCV

1-安装OpenCV 如果是python3.7–python3.9(已测试)&#xff0c;直接安装即可 注&#xff1a;conda需要先激活虚拟环境后再安装 pip install opencv-python如果安装速度慢&#xff0c;使用下面的指令&#xff1a; pip install opencv-python -i https://pypi.tuna.tsinghua.e…

AIGC-文生视频

stable diffusion&#xff1a; stable diffusion原理解读通俗易懂&#xff0c;史诗级万字爆肝长文&#xff0c;喂到你嘴里 - 知乎个人网站一、前言&#xff08;可跳过&#xff09;hello&#xff0c;大家好我是 Tian-Feng&#xff0c;今天介绍一些stable diffusion的原理&#…

Micropython STM32F4外部中断实验

Micropython STM32F4外部中断实验 &#x1f4cc;固件刷可参考前面一篇《STM32刷Micropython固件参考指南》&#x1f33f; 相关篇《Micropython STM32F4入门点灯》&#x1f4cd;固件下载&#xff1a;https://micropython.org/download/?mcustm32f4&#x1f516;本例程基于STM32…

「C++」红黑树的插入(手撕红黑树系列)

&#x1f4bb;文章目录 &#x1f4c4;前言红黑树概念红黑树的结构红黑树节点的定义红黑树的定义红黑树的调整 红黑树的迭代器迭代器的声明operator( )opeartor--( ) 完整代码 &#x1f4d3;总结 &#x1f4c4;前言 作为一名程序员相信你一定有所听闻红黑树的大名&#xff0c;像…

【区块链】产品经理的NFT初探

常见的FT如比特币&#xff08;BTC&#xff09;&#xff0c;以太币&#xff08;ETH&#xff09;等&#xff0c;两个代币之间是完全可替换的。而NFT具有唯一性&#xff0c;不可以互相替换。本文作者对NET的发展现状、相关协议、应用场景等方面进行了分析&#xff0c;一起来看一下…

修复debain/ Ubuntu 中的“密钥存储在旧版 trust.gpg 密钥环中”问题

如果您在 Ubuntu 22.04 及更高版本中使用 PPA 或添加外部存储库&#xff0c;您很可能会看到如下消息&#xff1a; W: https://packagecloud.io/slacktechnologies/slack/debian/dists/jessie/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg),…

springcloud nacos配置优先级研究及配置管理最佳实践

目录 背景工具版本SpringCloud配置存放位置及相应优先级代码中nacosjar包外挂 多种配置共同存在时的优先级项目配置管理最佳实践无nacos的情况有nacos的情况 参考文献 背景 公司有很多应用是基于SpringBoot/SpringCloud开发。由于在配置文件中经常会涉及数据库账号密码之类的敏…

Gson的用法详解

一、简介 Gson&#xff08;又称Google Gson&#xff09;是Google公司发布的一个开放源代码的Java库&#xff0c;主要用途为序列化Java对象为JSON字符串&#xff0c;或反序列化JSON字符串成Java对象。 Gson官网&#xff1a;gson Gson源码地址&#xff1a;google/gson 二、依赖…

Long-Context下LLM模型架构全面介绍

深度学习自然语言处理 原创作者&#xff1a;cola 随着ChatGPT的快速发展&#xff0c;基于Transformer的大型语言模型(LLM)为人工通用智能(AGI)铺平了一条革命性的道路&#xff0c;并已应用于知识库、人机界面和动态代理等不同领域。然而&#xff0c;存在一个普遍的限制:当前许多…

Linux处理文件常见命令

目录 1 cp 2 rm 3 zip与unzip 3.1 zip 3.2 unzip 4 cd 5 ls 6 chmod 7 scp 7.1 文件在你操作的机器上&#xff0c;你要传给另一个机器 7.1.1 文件 7.1.2 文件夹 7.2 文件在另一个机器上&#xff0c;你要把文件搞到你操作的机器上 7.2.1 文件 7.2.…

NX二次开发UF_CURVE_create_arc_3point 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_3point Defined in: uf_curve.h int UF_CURVE_create_arc_3point(tag_t point1, tag_t point2, tag_t point3, UF_CURVE_limit_p_t limit_p [ 2 ] , tag_t supp…

开发知识点-CSS样式

CSS样式 fontCSS 外边距 —— 围绕在元素边框的空白区域# linear-gradient() ——创建一个线性渐变的 "图像"# transform ——旋转 元素![在这里插入图片描述](https://img-blog.csdnimg.cn/20191204100321698.png)# rotate() [旋转] # 边框 (border) —— 围绕元素内…