Spring Boot 项目的创建、配置文件、日志

2023-12-16

Spring Boot 优点

  • 快速集成框架,Spring Boot 提供了启动添加依赖的功能,用于
  • 内置运行容器,无需配置 Tomcat 等 Web 容器,直接运行和部署程序
  • 快速部署项目,无需外部容器也可启动并运行项目
  • 可以完全抛弃繁琐的 XML,使用注解和配置的方式进行开发
  • 支持更多的监控的指标,可以更好地了解项目的运行情况

创建 Spring Boot 项目

创建项目

IDEA 社区版需要安装 Spring Boot Helper 插件,专业版不需要。

新建项目,选择 Spring Initializr,给项目取名,项目类型这里使用 Maven

img

选择 Next,在下面的页面选择 Spring Boot 版本和需要的依赖

img

这边选择了三个依赖,Lombok 可以用来快速构建Getter Setter方法。Spring Boot DevTools 用来支持热部署,Spring Web 用来实现网络编程。

选择 Create 开始创建项目,第一次创建会比较慢,需要下载的东西比较多,建议配置国内源。

启动项目,正常启动说明创建成功:

img

认识目录

首先将下面 4 个无用的文件删除

img

关于各目录的介绍:

img

网页创建(了解)

前往官网:https://start.spring.io/

img

在这里将选项配置好后,点击 GENERATE,会下载一个压缩包,解压,然后用 IDEA 打开即可。

约定大于配置

Spring 核心设计思想——约定大于配置,也就是说,能通过约定解决就不要去动配置文件。

比如我们在创建项目时自动生成的启动文件:

img

Spring Boot 约定,和这个文件同目录或在该目录的子目录下,对象才可以被注入到容器中。

在之前学习的 Spring 中,我们还需要在 xml 中注册 bean、配置扫描路径,Spring Boot 就不需要了。

例:

在 demo 下面创建 TestController 文件:

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @RequestMapping("/hi")
    public String hi() {
        return "Hello";
    }
}

访问 http://localhost:8080/hi,输出 Hello

img

如果你把 TestController 文件移动到上级目录,比如 com 下面,再次访问就访问不到了。

img

Spring Boot 配置文件

配置文件格式

Spring Boot 配置文件主要分为以下两种格式:

  • .properties (项目创建时的默认格式)
  • .yml(新版配置文件格式)

在 Spring Boot 中,配置文件命名为 application.properties 或 application.yml

这两种配置文件的语法不一样,比如我们要设置端口号:

在 application.properties 下:

server.port=9090

在 application.yml 下

server:
  port: 9090

特别说明:

  • properties 和 yml 可以同时存在一个项目中,当它们同时存在一个项目中时,都会被加载,如果两个配置文件中出现了同样的配置,此时为以 properties 中的配置为主,也就是说 properties 配置文件的优先级最高。
  • 虽然两个格式的配置文件可以共存,但是实际业务中通常采取一种配置文件格式
  • 更多配置项,见官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.server
  • 用户可以自定义配置项

读取配置项

自定义一个配置项:

#自定义配置项
mykey.key1=hahaha

读取配置项:

使用 ${} 来读取配置项的值,非自定义配置项也可以通过这种方式来读取

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Value("${mykey.key1}")
    private String mykey;

    @RequestMapping("/hi")
    public String hi() {
        return mykey;
    }
}

结果:

img

注:这种方式只能读取基本数据类型,关于其他数据类型在下面的 yml 中会涉及到。

properties 配置文件

使用 # 来注释,使用键值对来进行配置。

例,配置数据库信息:

#设置端口号
server.port=9090
#设置数据库的连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

优点:

  • 写法简单

缺点:

  • 不够灵活

  • 容易乱码:

    比如我写的中文注释,重新打开的时候都变成了 ?

    #?????
    server.port=9090
    #??????????
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
    spring.datasource.username=root
    spring.datasource.password=123456
    
    #??????
    mykey.key1=hahaha
    

    这是编码问题导致的,properties 的默认编码格式是 ISO-8859-1

    解决方法,在设置里将编码改成 UTF-8(注意当前项目设置和新项目设置都要设置):

    img

yml 配置文件

基本语法

yml 是 YAML 的缩写,全称 Yet Another Markup Language

优点:

  • yml 可读性高,写法简单,语法和 JSON 类似
  • 支持更多的数据类型,可以简单表达清单(数组)、散列表、标题等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等
  • 支持更多的编程语言

yml 语法格式:

一级目录

key: value

: 后面的空格不可省略

多级目录

key:
  key2:
    key3: value

例:多级目录的系统配置项(数据库连接)

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
    username: root
    password: 123456

进阶语法

yml 支持很多数据类型:

#字符串
string: 'Hello, World!'
#整数
number: 42
#布尔
boolean: true
#null
null_value: null
#列表
list:
  - item1
  - item2
  - item3
#字典
dictionary:
  key1: value1
  key2: value2
#多行字符串
multiline_string: |
  This is a multiline
  string in YAML.
#日期时间
date_time: 2023-12-06T12:34:56Z

注:

字符串使用不同的引号会有不同的效果,只有使用双引号的时候,特殊字符都会发挥作用。

例:

mykey:
  str1: aaa \n bbb
  str2: 'aaa \n bbb'
  str3: "aaa \n bbb"
package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Value("${mykey.str1}")
    private String mykey1;

    @Value("${mykey.str2}")
    private String mykey2;

    @Value("${mykey.str3}")
    private String mykey3;


    @RequestMapping("/hi")
    public String hi() {
        System.out.println("str1: " + mykey1);
        System.out.println("str2: " + mykey2);
        System.out.println("str3: " + mykey3);
        return null;
    }
}
/*输出:
str1: aaa \n bbb
str2: aaa \n bbb
str3: aaa 
 bbb
*/

配置对象

  1. 原始写法

    student:
      id: 1
      name: zhangsan
      age: 18
    
  2. 行内写法

    student: {id: 1, name: zhangsan, age: 18}
    

读取配置的对象:

首先要把 Student 类定义出来,给这个类添加 @Component 注解,存到 Spring 中,添加 @ConfigurationProperties(prefix = "student") 注解,表示将配置文件中的 student 配置赋值给当前的对象(为了完成这一步,一定要添加 Setter 方法)。

package com.example.demo.model;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

接下来我们去获取这个对象,这里采取属性注入的方式:

@RestController
public class TestController {
    @Autowired
    private Student student;

    @RequestMapping("/hi")
    public String hi() {
        return student.getName() + " age: " + student.getAge();
    }
}

结果:

img

注意事项

  1. 读取配置文件的实体类不能没有 Setter 方法,@ConfigurationProperties 注解在实现时是通过 Setter 将配置文件中的内容赋值 给字段的
  2. @ConfigurationProperties 需要配合类注解一起使用

配置集合

  1. 原始写法

    mylist:
      dbtype:
        - mysql
        - sqlserver
        - db2
    
  2. 行内写法

    mylist: {dbtype: [mysql, sqlserver, db2]}
    

例:

首先定义 MyList 类,这次我们使用 lombok 中的 @Data 注解来自动生成 Getter 和 Setter 方法。

package com.example.demo.model;


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

@Data
@ConfigurationProperties(prefix = "mylist")
@Component
public class MyList {
    private List dbtype;
}

获取并读取:

@RestController
public class TestController {
    @Autowired
    private MyList myList;

    @RequestMapping("/hi")
    public String hi() {
        return "size: " + myList.getDbtype().size() + " get(0): " + myList.getDbtype().get(0);
    }
}

结果:

img

yml 设置不同环境的配置文件

创建 application-{profile}.yml 格式的配置文件,其中, {profile} 是指激活的环境配置文件的名称。例如, application-dev.yml 将用于开发环境,而 application-prod.yml 将用于生产环境。

application.properties application.yml 中设置 spring.profiles.active 属性来指定激活的环境。例如:

# application.properties
spring.profiles.active=dev

或者

# application.yml
spring:
  profiles:
    active: dev

这将使 Spring Boot 使用 application-dev.yml 中的配置。

Spring Boot 日志文件

看日志

Spring Boot 项目在启动时就有日志输出:

img

日志格式

img

输出自定义日志

  1. 得到日志对象
  2. 打印日志

例:

package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    // 1.得到日志对象,注意是 slf4j 包里的,转入的参数表示日志来源于哪个类
    private static Logger log = LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/hi")
    public String hi() {
        // 打印日志
        log.info("Hello");
        return null;
    }
}

结果:

img

将日志持久化

设置日志名称

#日志保存名称
logging:
  file:
    name: springboot.log

启动项目即可在项目根目录下面找到 springboot.log 文件,打开就能看到日志

特别注意:

  • 日志不会丢失,会一直追加
  • 当日志比较大的时候,会自动分割成多个文件

设置日志保存路径

也可以设置日志的路径:

logging:
  file:
    name: D:\Test\

启动项目,可以看到这个路径下自动生成了一个 spring.log 文件

设置日志级别 & 筛选日志

通过调用日志对象的不同方法输出不同级别的日志信息

log.trace("I am trace");
log.debug("I am debug");
log.info("I am info");
log.warn("I am warn");
log.error("I am error");

日志级别(从低到高)

  • trace:微量,少许的意思,级别最低
  • debug:调试信息
  • info:普通的打印信息
  • warn:警告,不影响使用,但需要注意的问题
  • error:错误,级别较高的错误日志信息
  • fatal:致命的,因为代码异常导致程序退出执行的事件

fatal 没有相应的方法来主动打印出来,fatal 级别的日志只有在程序发生严重错误的时候自动打印。


在之前的操作中,我们没有见过 debug 日志和 trace 日志,因为默认的日志级别是 info,trace 和 debug 日志都被筛选掉了。

在配置文件中设置 logging.level 配置项来筛选日志,输出指定日志级别以及比它级别高的日志信息,屏蔽比它级别低的日志。

logging.level.root 表示根日志,可以理解为所有的日志,默认值为 info。

如下配置,程序只会输出 debug 及级别更高的日志信息

logging:
  level:
    root: debug

更精细化的设置:

logging:
  level:
    root: warn
    com:
      example:
        demo: debug

以上配置表示,将日志输出的最低级别设置成 warn,而 com.example.demo 下的日志最低级别设置为 debug

更简单的日志输出——lombok

每个类都要 LoggerFactory.getLogger(xxx.class); 来获取日志对象太麻烦了,使用 lombok 可以实现更简单的输出。

使用 @Slf4j 注解,会自动给你提供一个名为 log 的日志对象

package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class TestController {
    @RequestMapping("/hi")
    public String hi() {
        // 打印日志
        log.trace("I am trace");
        log.debug("I am debug");
        log.info("I am info");
        log.warn("I am warn");
        log.error("I am error");
        return null;
    }
}

Lombok 的常用注解

基本注解

注解 作用
@Getter 自动添加 Getter 方法
@Setter 自动添加 Setter 方法
@ToString 自动添加 toString 方法
@EqualsAndHashCode 自动添加 equals 和 hashCode 方法
@NoArgsConstructor 自动添加无参构造方法
@AllArgsConstructor 自动添加全属性构造方法,顺序按照属性定义顺序
@NonNull 属性不能为 null
@RequiredArgsConstructor 自动添加必需属性的构造方法

组合注解

注解 作用
@Data 等效于 @Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode

日志注解

注解 作用
@Slf4j 添加一个名为 log 的日志对象
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 项目的创建、配置文件、日志 的相关文章

  • 具有默认值的 Java JAX-RS 自定义参数

    假设我有这个 这只是一个示例 GET Path value address Produces application json public Response getAddress QueryParam user User user 用户是
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 手动编辑 Jar 以更改包名称

    我有一个来自外部源的 jar 文件 jar 中的所有类都位于 com xyz 包中 我想将所有类移动到 com xyzold 包中 这是否像解压缩 jar 将 xzy 文件夹重命名为 xyzold 并重新压缩它一样简单 或者我还需要修改每个
  • 防止 Spring Boot 注册 Spring Security 过滤器之一

    我想禁用安全链中的 Spring Security 过滤器之一 我已经看到了防止 Spring Boot 注册 servlet 过滤器 https stackoverflow com questions 28421966 prevent s
  • 使用 Java 在 WebDriver 中按 Ctrl+F5 刷新浏览器

    我已经使用 java 刷新了 WebDriver 中的浏览器 代码如下 driver navigate refresh 如何使用 Java 在 WebDriver 中按 Ctrl F5 来做到这一点 我认为您可以使用 WebDriver 和
  • 使用 ChannelExec 的命令未执行 - Jsch

    我正在使用 Jsch 在服务器中创建一个文件并执行一些命令 对于文件创建 它工作正常 但是对于命令执行 则不然 它保持状态 1 仍在处理它 并永远保持该状态 这种情况发生在 shell 执行或我尝试成为 root 时 请按照以下方法操作 p
  • Spring3/Hibernate3/TestNG:有些测试给出 LazyInitializationException,有些则没有

    前言 我在单元测试中遇到了 LazyInitializationException 的问题 而且我很难理解它 正如你从我的问题中看到的那样Spring 中的数据库会话 https stackoverflow com questions 13
  • Java 正则表达式 - 字母数字,最多一个连字符,句点或下划线,七个字符长

    我是 Java 正则表达式工具的新手 尽管它们潜力巨大 但我很难完成这项任务 我想编写一个正则表达式来验证遵循以下语法的输入字符串 小写字母和数字的任意组合 仅一个下划线 一个破折号或一个句号 无其他特殊字符 最小长度为 5 我想出了以下解
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • JTable 和 JScrollpane 大小的问题

    我有一个JScrollPane with a JTable在里面 在里面JTable我最初有 3 行 稍后添加行 默认JTable我的 3 行很难看 因为JScrollPane calls getPreferredScrollableVie
  • 如何导入 org.apache.commons.lang3.ArrayUtils;进入 Eclipse [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我如何导入 org apache commons lang3 ArrayUtils 将库添加到 Ecl
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 发生错误。请参阅日志文件 - eclipse juno

    每当我启动 Eclipse Juno 时 都会出现错误 发生错误 请查看日志文件 C Program Files eclipse configuration 1362989254411 log 有的网站说卸载jdk重新安装 我这样做了 但没
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • Java:由 HTTP 连接创建的等待连接线程存活时间很长

    我有一个服务器端代码 用于检查 SOAP 服务是否已启动 代码如下 String response while response length 0 try final URL url new URL DummySoapServiceURL
  • 使用 JAD 反编译 java - 限制

    我正在尝试使用 Java 中的 JAD 反编译几个 jar 文件 我也尝试过 JD GUI 但运气更差 但出现了很多错误 一种类型 易于修复 似乎是内部类 但我也发现了这段代码 static int SWITCH TABLE atp com
  • 如何用表达式语言获取布尔属性?

    如果我有一堂这样的课 class Person private int age public int getAge return age public boolean isAdult return age gt 19 我可以得到age像这样
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分

随机推荐

  • CleanMyMac X2024(Mac优化清理工具)v4.14.5中文版

    CleanMyMac X是一款颇受欢迎的专业清理软件 拥有十多项强大的功能 可以进行系统清理 清空废纸篓 清除大旧型文件 程序卸载 除恶意软件 系统维护等等 并且这款清理软件操作简易 非常好上手 特别适用于那些刚入手苹果系统的宝宝们 只需两
  • flstudio21.3.2304高级版水果编曲音乐软件

    flstudio高级版是一款适用于广泛领域的音频编辑软件 它支持多通道混音器和VST插件 包括数百种乐器和效果插件 它还为您提供了一个乐谱编辑器 需要对不同乐器的节奏进行必要的编辑 Flstudio具有许多内置电子合成声音 可提供更广泛的电
  • fl studio2024水果21.3免费汉化版

    fl studio2024全称Fruity Loops Studio2024 这款软件也被人们亲切的称之为水果 它是一款功能强大的音乐创作编辑软件 拥有全功能的录音室 大混音盘以及先进的音乐制作工具 用户通过使用该软件 就可以轻松制作出自己
  • 【408】计算机学科专业基础 - 计算机组成原理

    一 计算机系统概述 复习提示 本章是组成原理的概述 考查时易针对有关概念或性能指标出选择题 也可能综合后续章节的内容出有关性能分析的综合题 掌握本章的基本概念 是学好后续章节的基础 部分知识点在初学时理解不深刻也无须担忧 相信随着后续章节的
  • 汽车EDI:Chrysler EDI项目案例

    菲亚特克莱斯勒汽车Fiat Chrysler Automobiles FCA 是一家全球性汽车制造商 主营产品包括轿车 SUV 皮卡车 商用车和豪华车等多种车型 其旗下品牌包括菲亚特 克莱斯勒 道奇 Jeep Ram 阿尔法 罗密欧和玛莎拉
  • 物流EDI:COSCO的EDI对接

    当产品的原产地和最终目的地之间以及生产商和分销商之间实现了即时 安全和高效通信 意味着业务已经取得成功 无论是在物理层面的货物运输 还是在数据层面的信息交互 物流在供应链中都是至关重要的一环 物流发展进程的加快能够促进供应链各个环节实现完美
  • 解决 vue3 使用mitt(发布订阅库)时,多次触发事件订阅问题

    问题起源 在日常vue项目开发中 有时会用到mitt 前身事件总线mittBus 进行事件传递 然而使用经常就是mitt emit mitt on 就结束了 未考虑到取消订阅事件 订阅事件会创建回调函数 并将其添加到事件总线中 如果在实例卸
  • MyBatis——Java 持久层框架

    文章目录 MyBatis 是什么 准备工作 创建一个数据库和表 引入依赖 配置连接字符串和 MyBatis MyBatis 组成 MyBatis 使用步骤 定义一个类
  • VSCode中如何查看EDI报文?

    VSCode是开发人员常用的一款软件 为了降低EDI报文的阅读门槛 知行的开发人员设计了EDI插件 可以在VSCode中下载使用 如何打开一个EDI报文 VSCode EDI插件介绍 EDI插件下载流程 进入VSCode 打开Extensi
  • 【腾讯云AI绘画】与AI绘画和解,和AI绘画共成长

    前言 六月份的时候 买了腾讯AI绘画的资源包 可当通过API去使用AI绘画后 我顿时就被整破防了 于是写了一篇文章 算是无声控诉 被腾讯云AI绘画整破防了 再回首 腾讯绘画不仅提供了API调用 还构建了 智能图像创作平台 用于提供AI绘画在
  • Spring MVC

    文章目录 Spring MVC 是什么 什么是 MVC 如何学习 Spring MVC Spring MVC 创建和连接 获取参数 传统方式 简便的方式 获取一个自定义类的对象 从 json 字符
  • 快速入手 vue3 defindeModel 双向绑定数据,赶快了解下

    彩蛋 在vue3 3x 版本中 官方 RFC 放出了 一个新特性 defineModel 它将让我们在自定义组件上双向绑定数据更加快捷 举个 以前我们父子组件双向数据绑定要在子组件里声明对应的props emts computed 子组件
  • 前端非常好用的免费网页工具推荐(值得收藏)

    1 iloveimg 可在线进行图片编辑 压缩 转换等功能 操作方便 完全免费 2 草料二维码 可在线进行文本 网站 文件 图片 微信等二维码生成 3 比特虫 在线制作网站 ico 图标 4 facicongrabber 免费网页 favi
  • Daimler EDI 项目案例

    戴姆勒Daimler包括梅赛德斯 奔驰汽车 梅赛德斯 奔驰轻型商用车 戴姆勒载重车和戴姆勒金融服务等四大业务单元 戴姆勒Daimler早在1983年就开始使用EDI电子数据交换了 EDI那时还是数据交互一个新兴技术 如今早已成为商业往来中一
  • 如何通过EDI向Daimler发送发票?

    此前的文章 Daimler EDI 项目案例 中 我们已经成功对接Daimler 接下来我将为大家介绍如何将发票由Daimler的发票系统切换至EDI EDI需求背景 在Daimler的前期需求中 只涉及到了VDA4905交付预测以及VDA
  • 大数据毕业设计之前端03:logo、menu的折叠展开实现

    关键字 BuildAdmin pinia logo aside menu 菜单折叠 Vue ElementUI 前言 上一篇文章中 借助aside的实现讲了一些开发的小技巧 以及css的解读 本篇文章主要写一下如何填充aside的内容 as
  • 大数据毕业设计之前端02:架构布局和aside的设计

    前言 上一篇主要讲了我学习前端的一个经历 以及为什么选择BuildAdmin作为深入前端学习的原因 同事也大致聊了一下学习前端需要使用哪些技术栈 本篇文章来拆解一下BuildAdmin的前端代码结构 和布局实现的细节 前端代码结构 必须先了
  • 常见贸易术语Incoterms都有哪些?

    Incoterms 是国际贸易中使用的一组缩写 代表 International Commercial Terms 即 国际贸易术语 这是由国际商会 International Chamber of Commerce 简称 ICC 制定的一
  • 还在找高级网站模板?看这篇就够了!!!相信对网站设计,动效设计有所帮助

    简单聊下 在这个卷王时代 作为前端开发人员 提升自身审美设计还是挺有必要的 我们不是设计师 但我们可以从别人优秀的案例中找到灵感 学习其设计的精髓 勘察其优秀的交互 这对提升自身能力 提升网站建设的高度都是不错的 下面分享的一些网站 里面不
  • Spring Boot 项目的创建、配置文件、日志

    文章目录 Spring Boot 优点 创建 Spring Boot 项目 创建项目 认识目录 网页创建 了解 约定大于配置 Spring Boot 配置文件 配置文件格式