🎉 为什么会有这篇教程:熟悉 IDEA 并能灵活熟练使用 IDEA 能极大提高您的开发效率!!!
📍 本文教程基于当前 idea 的最新版本 2023.2.2。
📍 本文教程的所有操作图片均是实操测试截图或 gif 动态演示,合计 314 张图片,呈现的截图使用的 IDEA 的 Dark 主题。
📍 您的任何设置在配置后记得点击
Apply
或Ok
进行保存。📍 本文教程更适用于 IDEA 2023 及以上版本,如果您的 IDEA 版本是 2022 及以下,由于不同版本 IDEA 操作可能存在一定差异,请参考我的另一篇教程:2022版IDEA的下载、安装、配置、快捷键与使用。当然,如果您的 IDEA 版本是 2022 及以下,建议您阅读完 2022 版 IDEA 教程后再来看这篇文章,因为相较于 2022 版肯定是增加了更多的实用操作并对内容进一步优化完善。
1.认识 IntelliJ IDEA
1.1 JetBrains 公司介绍
IDEA 是 JetBrains 公司的产品,该公司成立于 2000 年,总部位于捷克的布拉格,致力于为开发者打造最高效智能的开发工具。
公司旗下还有其它产品,比如:
- WebStorm:用于开发 JavaScript、HTML5、CSS3 等前端技术
- PyCharm:用于开发 python
- PhpStorm:用于开发 PHP
- RubyMine:用于开发 Ruby/Rails
- AppCode:用于开发 Objective - C/Swift
- CLion:用于开发 C/C++
- DataGrip:用于开发数据库和 SQL
- Rider:用于开发 .NET
- GoLand:用于开发 Go
用于开发 Android 的 Android Studio,也是 Google 基于 IDEA 社区版进行迭代的。
1.2 IntelliJ IDEA 介绍
IDEA,全称 IntelliJ IDEA
,是 Java 语言的集成开发环境,目前已经(基本)代替了 Eclipse 的使用。IDEA 在业界被公认为是最好的 Java 开发工具(之一),因其功能强悍、设置人性化,而深受 Java、大数据、移动端 程序员的喜爱。尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS 整合、代码审查、创新的 GUI 设计 等方面的功能可以说是超常的。
IntelliJ IDEA 在 2015 年的官网上这样介绍自己:
Excel at enterprise, mobile and web development with Java, Scala and Groovy,with all the latest modern technologies and frameworks available out of thebox.
IntelliJ IDEA 主要用于支持 Java、Scala、Groovy 等语言的开发工具,同时具备支持目前主流的技术和框架,擅长于企业应用、移动应用和 Web 应用的开发。
1.3 IDEA 的主要优势:(vs Eclipse)
🍀 功能强大
-
强大的整合能力。比如:Git、Maven、Spring 等;
-
开箱即用的体验(集成版本控制系统、多语言支持的框架随时可用,无需额外安装插件)。
🍀 符合人体工程学
- 高度智能(快速的智能代码补全、实时代码分析、可靠的重构工具);
- 提示功能的快速、便捷、范围广;
- 好用的快捷键和代码模板;
- 精准搜索。
1.4 IDEA 的下载
🏠 下载网址: https://www.jetbrains.com.cn/idea/download/?section=windows
IDEA 分为两个版本:**旗舰版(Ultimate)**和 社区版(Community)。两个不同版本的详细对比,可以参照官网文档。
IDEA 的大版本每年迭代一次,大版本下的小版本(如:2023.x)迭代时间不固定,一般每年 3 个小版本。
同时,JetBrains 官网也提供了 IDEA 的详细使用文档。
2.IDEA 卸载与安装
2.1 卸载过程
在本机的『设置』找到『应用』,搜索『idea』,进行卸载即可。
如果需要保留下述数据,就不要打 √。如果想彻底删除 IDEA 所有数据,那就打上 √。
软件卸载完以后,还需要删除其它几个位置的残留:
-
路径:C:\Users\【本机用户名】\AppData\Local\JetBrains
-
路径:C:\Users\【本机用户名】\AppData\Roaming\JetBrains
2.2 安装前的准备(系统要求)
- 64 位 Windows 10 1809 及更高版本,或 Windows Server 2019 及更高版本;
- 最低 2 GB 可用 RAM,推荐 8 GB 系统总 RAM;
- 3.5 GB 硬盘空间,推荐 SSD;
- 最低屏幕分辨率 1024 x 768。
从安装上来看,IntelliJ IDEA 对硬件的要求似乎不是很高。可是在实际开发中并不是这样的,因为 IntelliJ IDEA 执行时会有大量的缓存、索引文件。所以如果你正在使用 Eclipse / MyEclipse,想通过 IntelliJ IDEA来解决计算机的卡、慢等问题,这基本上是不可能的,本质上你应该对自己的硬件设备进行升级。
2.3 安装过程
-
下载完安装包,双击 exe 文件直接安装。
-
欢迎安装。
-
是否删除电脑上低版本的 IDEA(如果有,可以选择忽略。如果电脑上没有了低版本的 IDEA,则不会出现该步骤)。
-
选择安装目录,默认 C 盘,尽量更改安装目录,改放到 D 盘。
-
设置 IDEA。
-
Create Desktop Shortcut
:创建桌面快捷方式图标,建议勾选; -
Update context menu
:是否将从文件夹打开项目添加至鼠标右键,根据需要勾选; -
Create Associations
:idea 关联文件格式,不推荐勾选,由于 idea 是重量级的软件,因此打开单个文件一般都是使用如 Sublime Text、EditPlus 等轻量级文本编辑器打开; -
Update PATH variable (restart needed)
:是否将 IDEA 启动目录添加到环境变量中,即可以从命令行中启动 IDEA,根据需要勾选。但是我们一般都用自己的,即我们在安装 JDK 时都会自己配置好与下载的 JDK 相关联的环境变量。
-
-
使用默认的 JetBrains 来管理 IDEA 的相关内容。
-
安装中。
-
完成安装,重启电脑(在点击『Finish』前保证你没有未保存的文件或任务)。
2.4 运行 IDEA
双击 IDEA 运行,初次点击会弹出“是否导入设置文件”。
是否同意发送用户数据(特性、使用的插件、硬件与软件配置等),以便于 JetBrains 官方对 IDEA 的继续改进。这里建议选择:不发送。
选择『Accept』以信任服务器的证书。
这里由于我有学生教育邮箱并在 JetBrains 进行了申请,因此可以直接 JetBrains Accout
。
如果你现在是大学生,则可以通过申请教育邮箱来获取 IDEA 的免费使用,教程参考:中南林注册教育邮箱加获取JetBrains个人许可证,续订许可证
当然,如果你没有教育邮箱,则需要参考其它途径获取使用。
3.Hello World 的实现
3.1 新建 Project - Class
打开项目的三种方式:
-
New Project
:创建一个新项目; -
Open
:打开一个已有的项目; -
Get from VCS
:通过版本控制工具可以将 git 托管服务器上的项目拉取到本地并打开。
这里我们选择“New Project”:
接着创建 Java 类:
3.2 编写代码
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
在 IDEA 中写完代码后,不用手动保存。因为 IDEA 会进行实时代码保存。
3.3 运行
-
方式一
-
方式二
-
方式三:使用快捷键 『Ctrl + Shift + F10』
4.JDK 相关设置
4.1 项目的 JDK 设置
🏠 File --> Project Structure --> Platform Settings --> SDKs
- SDKs 全称是
Software Development Kit
,即软件开发工具包。这里一定是选择 JDK 的安装根目录,不是 JRE 的目录。 - 这里还可以从本地添加多个 JDK。使用“+”即可实现。
我们还有另一种方式来查看当前项目使用的 JDK 版本:
4.2 out 目录和编译版本
🏠 File --> Project Structure --> Project Settings --> Project
5.详细设置
5.1 如何打开详细配置界面
🍀 显示工具栏
未勾选与勾选的区别:
-
未勾选的视图展示
-
勾选的视图展示(建议勾选)
🍀 选择详细配置菜单或按钮
5.2 系统设置
🍀 默认启动项目配置
🏠 Settings --> Appearance & Behavior --> System Settings
启动 IDEA 时,如果你是希望自动打开上次开发的项目,则勾选“Reopen last project on startup
”,这是默认的设置。
如果你希望自己选择打开的项目,则取消勾选,那么每次启动 IDEA 就会出现如下界面:
🍀 取消自动更新
🏠 Settings --> Appearance & Behavior --> System Settings --> Updates
默认都打 √ 了,建议检查 IDE 更新的 √ 去掉,检查插件更新的 √ 选上。
5.3 设置整体主题
🍀 选择主题
🏠 Settings --> Appearance & Behavior --> Appearance
🍀 设置菜单和窗口字体和大小
🏠 Settings --> Appearance & Behavior --> Appearance
🍀 设置 IDEA 背景图
🏠 Settings --> Appearance & Behavior --> Appearance
效果:
如果你不想再使用背景图片,则可以如下操作取消背景图:
5.4 设置编辑器主题样式
🍀 编辑器主题
🏠 Settings --> Editor --> Color Scheme
🍀 字体大小
🏠 Settings --> Editor --> General
-
Active editor
:只对当前代码视图页面生效,或者说只对当前所在的视图文件生效; -
All editor
:所有代码视图页面均会生效。
更详细的字体与颜色设置:
🏠 Settings --> Editor --> Color Scheme --> *
⚠️ 注意:如果选择某个 font 字体,发生了中文乱码,可以在 fallback font(备选字体)中选择一个支持中文的字体。
🍀 注释的字体颜色
🏠 Settings --> Editor --> Color Scheme --> Language Defaults
-
Block comment
:修改多行注释的字体颜色; -
Doc Comment --> Text
:修改文档注释的字体颜色; -
Line comment
:修改单行注释的字体颜色。
5.5 显示行号与方法分隔符
🏠 Settings --> Editor --> General --> Appearance
效果:
5.6 代码智能提示功能
🏠 Settings --> Editor --> General --> Code Completion
IntelliJ IDEA 的代码提示和补充功能有一个默认特性:区分大小写。
如果想不区分大小写的话,就把这个勾选去掉。我们建议不勾选。
5.7 自动导包配置
🍀 Java 类自动导入
默认需要自己手动导包,Alt+Enter 快捷键。
自动导包设置:
- 动态导入明确的包:
Add unambiguous imports on the fly
,该设置具有全局性; - 优化动态导入的包:
Optimize imports on the fly
,该设置只对当前项目有效。
🏠 Settings --> Editor --> General --> Auto Import
🍀 maven 依赖自动导入
当我们在 maven 项目中添加或删除依赖时,默认需要我们手动刷新一下 pom.xml 的依赖配置进行依赖更新:
Project、Module 新创建或 pom.xml 每次修改时都应该让 IDEA 重新加载 Maven 信息。这对 Maven 目录结构认定、Java 源程序编译、依赖 jar 包的导入都有非常关键的影响。这个过程对我们来说是比较繁琐和容易忘记的,因此我们建议开启自动导入,将这个过程交给 IDEA 来实时监控完成:
🏠 Settings --> Build, Execution, Deployment --> Build Tools
此外,我们还可以关注一下以下两个设置:
🏠 Settings --> Build, Execution, Deployment --> Build Tools --> Maven --> Importing
-
Automatically download
:在 Maven 导入依赖包的时候是否自动下载源码和文档。默认是没有勾选的,也不建议勾选,原因是这样可以加快项目从外网导入依赖包的速度,如果我们需要源码和文档的时候我们到时候再针对某个依赖包进行联网下载即可。IntelliJ IDEA 支持直接从公网下载源码和文档的。 -
VM options for importer
:可以设置导入的 VM 参数。一般这个都不需要主动改,除非项目真的导入太慢了我们再增大此参数。
5.8 设置项目文件编码(必须改)
🏠 Settings --> Editor --> File Encodings
Transparent native-to-ascii conversion
主要用于转换 ascii,显式原生内容,一般都要勾选。否则像 Properties 文件中的注释显示的不会是中文。
5.9 设置控制台的字符编码
🏠 Settings --> Editor --> General --> Console
5.10 修改类头的文档注释信息
🏠 Settings --> Editor --> File and Code Templates
/**
* Description:
* @Author 狐狸半面添
* @Create ${DATE} ${TIME}
* @Version 1.0
*/
将以上配置保存后,新建一个 Java 文件,就会自动出现我们以上的文档注释:
📍 常用的预设的变量:
${PACKAGE_NAME} - the name of the target package where the new class or interface will be created.
${PROJECT_NAME} - the name of the current project.
${FILE_NAME} - the name of the PHP file that will be created.
${NAME} - the name of the new file which you specify in the New File dialog box during the file creation.
${USER} - the login name of the current user.
${DATE} - the current system date.
${TIME} - the current system time.
${YEAR} - the current year.
${MONTH} - the current month.
${DAY} - the current day of the month.
${HOUR} - the current hour.
${MINUTE} - the current minute.
${PRODUCT_NAME} - the name of the IDE in which the file will be created.
${MONTH_NAME_SHORT} - the first 3 letters of the month name. Example: Jan, Feb, etc.
${MONTH_NAME_FULL} - full name of a month. Example: January, February, etc.
5.11 设置自动编译
🏠 Settings --> Build, Execution, Deployment --> Compiler
5.12 设置为省电模式
🏠 File --> Power Save Mode
IntelliJ IDEA 有一种叫做 省电模式 的状态,开启这种模式之后 IntelliJ IDEA 会关掉 代码检查 和 代码提示 等功能。所以一般也可认为这是一种 阅读模式 ,如果你在开发过程中遇到突然代码文件不能进行检查和提示,可以来看看这里是否有开启该功能。在实际开发中,我们不推荐开启省电模式。当然,如果你是刚学习 Java 的小伙伴,可以开启省点模式来练习编写 Java 的能力。
5.13 取消双击 shift 搜索
🏠 Settings --> Advanced Settings
因为我们按 shift 切换中英文输入方式,经常被按到,总是弹出搜索框,太麻烦了。因此建议勾选,可以取消它。(这个强烈推荐!!!)
5.14 是否在单行显式编辑器选项卡与最多打开的标签数
🏠 Settings --> Editor --> General --> Editor Tabs
我们建议使用多行显示,即勾选 Multiple rows
。
5.15 设置 import 显示 * 时的个数
🏠 Settings --> Editor --> Code Style --> Java
5.16 设置 Java 文件注释位置适当代码缩进
默认情况下,我们使用快捷键添加注释都是在行的首列进行添加:
但很明显,这不是我们想要的。我们希望注释的格式是这样的:
因此,我们需要设置 Java 文件注释位置适当代码缩进:
🏠 Settings --> Editor --> Code Style --> Java
此时我们再使用快捷键来添加注释:
5.17 设置 XML 文件注释位置适当代码缩进
默认情况下,我们使用快捷键添加注释都是在行的首列进行添加:
但很明显,这不是我们想要的。我们希望注释的格式是这样的:
因此,我们需要设置 Java 文件注释位置适当代码缩进:
🏠 Settings --> Editor --> Code Style --> XML
此时我们再使用快捷键来添加注释:
6.工程与模块管理
6.1 IDEA 项目结构
层级关系:project(工程) - module(模块) - package(包) - class(类)
具体的:
- 一个 project 中可以创建多个 module;
- 一个 module 中可以创建多个 package;
- 一个 package 中可以创建多个 class。
这些结构的划分,是为了方便管理功能代码。
6.2 Project 和 Module 的概念
在 IntelliJ IDEA 中,提出了 Project
和 Module
这两个概念。
在 IntelliJ IDEA 中 Project
是最顶级的结构单元,然后就是 Module
。目前,主流的大型项目结构基本都是多 Module 的结构,这类项目一般是按功能划分的,比如:user-core-module、user-facade-module 和 userhessian-module 等等,模块之间彼此可以相互依赖,有着不可分割的业务关系。因此,对于一个 Project 来说:
- 当为单 Module 项目的时候,这个单独的 Module 实际上就是一个 Project;
- 当为多 Module 项目的时候,多个模块处于同一个 Project 之中,此时彼此之间具有 互相依赖 的关联关系;
- 当然多个模块没有建立依赖关系的话,也可以作为单独一个“小项目”运行。
6.3 创建 Module
建议创建“Empty空工程“,然后创建多模块,每一个模块可以独立运行,相当于一个小项目。JavaSE 阶段不涉及到模块之间的依赖。后期在 JAVAEE 中会学习到模块之间的依赖。
步骤:
-
创建一个空工程。
-
选择创建模块。
-
选择模块类型:这里选择创建 Java 模块,给模块命名,确定存放位置。
-
效果。
6.4 删除模块
-
移除模块:只是将模块从 Project 中移除,但并不是从物理磁盘上删除该 module01 文件夹。
-
彻底删除模块。
6.5 导入其他人模块到自己项目
为了方便演示,我们先创建一个空项目 OtherProject,在这个空项目中创建一个 other_module 模块,然后把这个模块拷贝到我们的 JavaCode 项目中,即将 other_module 文件夹拷贝到 JavaCode 文件夹。
接着打开自己 IDEA 的项目,会在项目目录下看到拷贝过来的 other_module,只不过不是以模块的方式呈现,文件图标是“橙色咖啡”。即表示 other_module 还不是本项目的模块。
查看 File --> Project Structure --> Project Settings --> Modules
我们将 other_module 模块导入到本项目:
此时再查看 other_module 下的 Hello.java,就呈现了正常的 Java 类图标:
6.6 同时打开两个 IDEA 项目工程
🍀 在已经打开一个 Project 情况下打开新工程的方式
比如我们当前已经在 IDEA 中打开了 JavaCode 项目:
这时候需要创建一个新项目或者打开一个已有项目,比如打开一个已有项目 OtherProject:
我们看下选择“New Window”的效果:
🍀 设置打开方式
🏠 Settings --> Appearance & Behavior --> System Settings
7.代码模板的使用
7.1 查看 Postfix Completion 模板(后缀补全)
🏠 Settings --> Editor --> General --> Postfix Completion
后缀补全模板的效果示例,以输入 .if
进行演示:
7.2 查看 Live Templates 模板(实时代码模板)
实时代码模板的原理是配置一些常用代码字母缩写,在输入简写时可以出现你预定义的固定模式的代码,使得开发效率大大提高,同时也可以增加个性化。最简单的例子就是在 java 中输入 sout 会出现 System.out.println();
🏠 Settings --> Editor --> Live Templates
实时模板的效果示例,以输入 main
和 sout
进行演示:
7.3 常用代码模板
- 非空判断
- 变量.null:if(变量 == null)
- 变量.nn:if(变量 != null)
- 变量.notnull:if(变量 != null)
- ifn:if(xx == null)
- inn:if(xx != null)
- 遍历数组和集合
- 数组或集合变量.fori:for 循环
- 数组或集合变量.for:增强 for 循环
- 数组或集合变量.forr:反向 for 循环
- 数组或集合变量.iter:增强 for 循环遍历数组或集合
- 输出语句
- sout:相当于 System.out.println
- soutm:打印当前方法的名称
- soutp:打印当前方法的形参及形参对应的实参值
- soutv:打印方法中声明的最近的变量的值
- 变量.sout:打印当前变量值
- 变量.soutv:打印当前变量名及变量值
- 对象操作
- 创建对象
- Xxx.new .var :创建 Xxx 类的对象,并赋给相应的变量
- Xxx.new .field:会将方法内刚创建的 Xxx 对象抽取为一个属性
- 强转
- 对象.cast:将对象进行强转
- 对象.castvar:将对象强转后,并赋给一个变量
- 创建对象
- 静态常量声明
- psf:public static final
- psfi:public static final int
- psfs:public static final String
- prsf:private static final
7.4 自定义代码模板
🍀 自定义后缀补全模板
🏠 Settings --> Editor --> General --> Postfix Completion
例如,输入 String.list
,回车后生成 List<String> = new ArrayList<>();
,演示效果:
🍀 自定义 Live Templates
🏠 Settings --> Editor --> Live Templates
例如:定义 say 代表 System.out.print(); 语句。
-
在 Live Templates 中增加模板,需要先定义一个模板的组,这样方便管理我们所有自定义的代码模板。
-
在模板组里新建模板。
-
定义模板生效的语言。
-
定义模板其它内容
-
Abbreviation
:模板的缩略名称; -
Description
:模板的描述; -
Template text
:模板的代码片段; -
模板应用范围
:比如点击 Define,选择应用在 java 代码中。
-
-
效果演示:
🍀 其它自定义 Live Templates 模板
📌 单元测试模板
@Test
public void test$var1$(){
$var2$
}
效果演示:
📌 创建多线程
new Thread() {
public void run() {
$var$
}
}
效果演示:
📌 冒泡排序
for(int $INDEX$ = 1; $INDEX$ < $ARRAY$.length; $INDEX$++) {
for(int $INDEX2$ = 0; $INDEX2$ < $ARRAY$.length-$INDEX$; $INDEX2$++) {
if($ARRAY$[$INDEX2$] > $ARRAY$[$INDEX2$+1]){
$ELEMENT_TYPE$ temp = $ARRAY$[$INDEX2$];
$ARRAY$[$INDEX2$] = $ARRAY$[$INDEX2$+1];
$ARRAY$[$INDEX2$+1] = temp;
}
}
}
效果演示:
8.快捷键的使用
8.1 常用的默认快捷键
🍀 日常快捷键
📌 通用型
说明 | 快捷键 |
---|---|
复制代码-copy | ctrl + c |
粘贴-paste | ctrl + v |
剪切-cut | ctrl + x |
撤销-undo | ctrl + z |
反撤销-redo | ctrl + shift + z |
保存-save all | ctrl + s |
全选-select all | ctrl + a |
📌 提高编写速度
说明 | 快捷键 |
---|---|
智能提示-edit | alt + enter |
提示代码模板-insert live template | ctrl + j |
使用 xx 块环绕-surround with … | ctrl + alt + t |
调出生成 getter/setter/构造器 等结构-generate … | alt + insert |
自动生成返回值变量-introduce with … | ctrl + alt + v |
复制并拷贝指定行的代码-duplicate line or selection | ctrl + d |
删除指定行的代码-delete line | ctrl + y |
切换到下一行代码空位-start new line | shift + enter |
切换到上一行代码空位-start new line before current | ctrl + alt + enter |
向上移动代码-move statement up | ctrl + shift + ↑ |
向下移动代码-move statement down | ctrl + shift + ↓ |
向上移动一行-move line up | alt + shift + ↑ |
向下移动一行-move line down | alt + shift + ↓ |
方法的形参列表提醒-parameter info | ctrl + p |
批量修改指定的变量名、方法名、类名等-rename | shift + f6 |
抽取代码重构方法-extract method … | ctrl + alt + m |
重写父类的方法-override methods … | ctrl + o |
实现接口的方法-implements methods … | ctrl + i |
选中的结构的大小写的切换-toggle case | ctrl + shift + u |
批量导包-optimize imports | ctrl + alt + o |
📌 类结构、查找和查看源码
说明 | 快捷键 |
---|---|
如何查看源码-go to class … | ctrl + 选中指定的结构 或 ctrl + n 搜索 |
显示当前类结构,支持搜索指定的方法、属性等-file structure | ctrl + f12 |
退回到前一个编辑的页面-back | ctrl + alt + ← |
进入到下一个编辑的页面-forward | ctrl + alt + → |
打开的类文件之间切换-select previous/next tab | alt + ←/→ |
光标选中指定的类,查看继承树结构-Type Hierarchy | ctrl + h |
查看方法文档-quick documentation | ctrl + q |
类的 UML 关系图-show uml popup | ctrl + alt + u |
定位某行-go to line/column | ctrl + g |
回溯变量或方法的来源-go to implementation(s) | ctrl + alt + b |
折叠方法实现-collapse all | ctrl + shift + - |
展开方法实现-expand all | ctrl + shift + + |
📌 查找、替换与关闭
说明 | 快捷键 |
---|---|
查找指定的结构 | ctrl + f |
快速查找:选中的 Word 快速定位到下一个-find next | ctrl + l |
查找与替换-replace | ctrl + r |
直接定位到当前行的首位-move caret to line start | ctrl + home |
直接定位到当前行的末位-move caret to line end | ctrl + end |
查询当前元素在当前文件中的引用,然后按 F3 可以选择 | ctrl + f7 |
全项目搜索文本-find in path … | ctrl + shift + f |
关闭当前窗口-close | ctrl + f4 |
📌 调整格式
说明 | 快捷键 |
---|---|
格式化代码-reformat code | ctrl + alt + l |
使用单行注释-comment with line comment | ctrl + / |
使用/取消多行注释-comment with block comment | ctrl + shift + / |
选中数行,整体往后移动-tab | tab |
选中数行,整体往前移动-prev tab | shift + tab |
🍀 Debug 快捷键
说明 | 快捷键 |
---|---|
单步调试(不进入函数内部)-step over | F8 |
单步调试(进入函数内部)-step into | F7 |
强制单步调试(进入函数内部)-force step into | alt + shift + f7 |
选择要进入的函数-smart step into | shift + F7 |
跳出函数-step out | shift + F8 |
运行到断点-run to cursor | alt + F9 |
继续执行,进入下一个断点或执行完程序-resume program | F9 |
停止-stop | ctrl + F2 |
查看断点-view breakpoints | ctrl + shift + F8 |
关闭 - close | ctrl + F4 |
8.2 查看快捷键
🏠 Settings --> Keymap
🍀 已知快捷键操作名,未知快捷键
🍀 已知快捷键,不知道对应的操作名
8.3 自定义快捷键
🍀 修改运行程序的快捷键
我们先去观察下运行程序的默认快捷键:
因此我们已知快捷键 ctrl + shift + f10
去搜索:
那么我们这里先添加新的快捷键 alt + r
,再把把 ctrl + shift + f10
快捷键移除。
这是再观察提示的快捷键,就变成了 alt + r
,并且可以生效:
🍀 修改多行注释的快捷键
我们这次通过操作名 comment with block comment
进行搜索:
直接添加快捷键 ctrl + alt + /
,就不移除原来的了。
选中一段代码,按 ctrl + alt + /
,发现是可以生效的:
⚠️ 注意事项
我们修改快捷键后,idea 会为我们生成一套基于 默认配置 + 自定义配置 的新配置方案,如下图:
也就是说,我们所有的自定义配置需要在 windows copy 配置方案中进行修改,并将我们的配置方案切换到 windows copy,你的自定义配置才能生效。
你也可以对自己的新配置方案进行一系列其它操作:
8.4 使用其它平台快捷键
苹果电脑或者是用惯 Eclipse、Visual Studio 等快捷的,可以选择其他快捷键插件。
9.IDEA 断点调试(Debug)
9.1 为什么需要 Debug
编好的程序在执行过程中如果出现错误,该如何查找或定位错误呢?简单的代码直接就可以看出来,但如果代码比较复杂,就需要借助程序调试来查找错误了。
运行编写好的程序时,可能出现的几种情况:
- 情况 1:没有任何 bug,程序执行正确;
- 情况 2:运行以后,出现了错误或异常信息。但是通过日志文件或控制台,显示了异常信息的位置;
- 情况 3:运行以后,得到了结果,但是结果不是我们想要的;
- 情况 4:运行以后,得到了结果,结果大概率是我们想要的。但是多次运行的话,可能会出现不是我们想要的情况。比如:多线程情况下,处理线程安全问题。
如果出现了情况 2、3、4,都又必要使用 debug。
9.2 设置 Debug 连接方式
默认是 Socket。Shared memory
是 Windows 特有的一个属性,一般在 Windows 系统下建议使用此设置,内存占用相对较少。
🏠 Settings --> Build, Execution, Deployment --> Debugger
9.3 Debug 的步骤
Debug(调试)程序步骤如下:
- 添加断点;
- 启动调试;
- 单步执行;
- 观察变量和执行流程,找到并解决问题。
🍀 添加断点
在源代码文件中,在想要设置断点的代码行的前面的标记行处,单击鼠标左键就可以设置断点,在相同位置再次单击即可取消断点。
添加与取消断点演示:
🍀 启动调试
IDEA 提供多种方式来启动程序(Launch)的调试,分别是通过菜单(Run –> Debug)、图标(“绿色臭虫” )等等。
🍀 单步调试工具介绍
在默认情况下,显示的调试工具并不全:
我们可以先对调试工具栏做处理:
-
Step Over(F8)
:进入下一步,如果当前行断点是调用一个方法,则不进入当前方法体内; -
Step Into(F7)
:进入下一步,如果当前行断点是调用一个自定义方法,则进入该方法体内; -
Force Step Into(Alt + Shift + F7)
:进入下一步,如果当前行断点是调用一个核心类库方法,则进入该方法体内; -
Step Out(Shift + F8)
:跳出当前方法体; -
Run to Cursor(Alt + F9)
:直接跳到光标处继续调试; -
Resume Program(F9)
:恢复程序运行,但如果该断点下面代码还有断点则停在下一个断点上; -
Stop(Ctrl + F2)
:结束调试; -
View Breakpoints(Ctrl + Shift + F8)
:查看所有断点; -
Mute Breakpoints
:使得当前代码后面所有的断点失效, 一下执行到底。
说明:在 Debug 过程中,可以动态的下断点。
9.4 多种 Debug 情况介绍
🍀 行断点
断点打在代码所在的行上。执行到此行时,会停下来。
🍀 方法断点
断点设置在方法的签名上,默认当进入时,断点可以被唤醒;也可以设置在方法退出时,断点也被唤醒。
在多态的场景下,在父类或接口的方法上打断点,会自动调入到子类或实现类的方法。
public class DebugDemo {
public static void main(String[] args) {
Person person = new Man();
person.show();
}
}
class Person {
// 在此方法的签名处加断点
public void show() {
System.out.println("Person");
}
}
class Man extends Person {
@Override
public void show() {
System.out.println("man");
}
}
🍀 字段断点
在类的属性声明上打断点,默认对属性的修改操作进行监控(只有默认初始化不会被监控,显示初始化、构造器初始化、set 等都会被监控)。
默认情况下是监听属性的修改,我们也可以去监听属性的调用(使用),只需要在“红色眼睛”处鼠标右击,弹出的编辑框中勾选“Field access
”即可。
🍀 条件断点
针对以下代码,在满足 i == 3 的条件下,执行断点。
🍀 异常断点
对异常进行跟踪。如果程序出现指定异常,程序就会执行断点,自动停住。
📑 这里以监听 ArithmeticException 为例:
添加异常断点:
debug 演示:
🍀 线程调试
public class DebugDemo {
public static void main(String[] args) {
test("thread1");
test("thread2");
}
public static void test(String threadName) {
new Thread(
() -> {
// 在此处加断点
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
},
threadName
);
}
}
在断点处添加条件:“thread2”.equals(Thread.currentThread().getName())
当 debug 执行程序时,thread1 线程会正常执行,但 thread2 会被卡住。
🍀 强制结束
控制台打印:
获取请求的数据
调用写入数据库的方法
进入insert()方法
获取数据库连接
程序结束
可以看到,insert 方法强制结束执行(强制执行相当于方法 return 了),但 main 方法依旧会继续执行。
9.5 自定义调试数据视图
public class DebugDemo {
public static void main(String[] args) {
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "狐狸半面添");
// 在此处加断点,此时已经将 "1-狐狸半面添" 加入了 map 中
map.put(2, "https://www.zhulang.love");
System.out.println(map);
}
}
默认情况下 debug 的展示:
我们也可以自定义展示的数据结构:
此时再看 map 结构,就是清晰的原始 map 数据结构:
9.6 计算表达式
9.7 常见问题
force step into 和 step into 的区别:step into 不会进入到 JDK 实现的方法中,而 force step into 会进入到 JDK 实现的方法中。force step into 可以进入到任何方法中单步执行。
那么使用 Step Into
时,会出现无法进入源码的情况。如何解决?
-
方案1:使用 force step into 即可;
-
方案2:点击 Setting -> Build,Execution,Deployment -> Debugger -> Stepping。把
Do not step into the classess
中的java.*
、javax.*
取消勾选即可。
📍 初学者对于在哪里加断点,缺乏经验,这也是调试程序最麻烦的地方,需要一定的经验。简单来说,在可能发生错误的代码的前面加断点。如果不会判断,就在程序执行的起点处加断点。
10.创建不同类型的工程
10.1 创建多模块 Java 工程
在工程上,鼠标右击 - New - Module:
指明 Java 工程的名称及使用的 JDK 版本:
10.2 创建 Java Web 工程
⚠️ 注意:不同版本的 IDEA,创建 Java Web 工程的方式可能会有所不同。
🍀 IDEA 中配置 Tomcat
在 IDEA 中配置 Tomcat 之前,需要保证已经下载并解压了 Tomcat 到磁盘。
接下来,我们在 IDEA 中配置 Tomcat:
🏠 Settings --> Build, Execution, Deployment --> Application Servers
配置 Tomcat Server 的位置(根据自己 Tomcat 在磁盘上的安装位置决定):
🍀 创建 Web 工程
我们先创建一个普通项目(或模块),命名为 javaweb02:
为当前项目(或模块)添加模块支持:
🏠 Project Structure --> Project Settings --> Facets
添加 Servlet 相关库:
此时我们再来看项目(或模块结构):
为了稍后方便测试,我们在 web 文件夹下新增一个 index.jsp
文件:
<%--
Created by IntelliJ IDEA.
User: 狐狸半面添
Date: 2023/10/6
Time: 17:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>狐狸半面添的客栈</title>
</head>
<body>
欢迎来到<a href="https://www.zhulang.love" target="_blank">狐狸半面添的客栈</a>,持续的实战开发技术分享与编程指南。
</body>
</html>
🍀 配置 web 工程
🍀 运行服务
🏠 浏览器访问:http://localhost:8080/javaweb02_Web_exploded/
🍀 乱码的解决
如果 Tomcat 日志出现乱码:
解决方案:
-
点击 Help --> Edit custom VM Options
-
在文件最后面添加:
-Dfile.encoding=UTF-8
-
在当前 Tomcat 实例中配置 VM option,添加:
-Dfile.encoding=UTF-8
-
在当前 Tomcat 实例配置界面的 Startup/Connection 页签的 Run 和 Debug 添加一个 key 为
JAVA_TOOL_OPTIONS
,value 为-Dfile.encoding=UTF-8
的环境变量。 -
重启 IDEA;
-
启动服务。
10.3 创建 Maven Java 工程
🍀 Maven 的介绍
Maven 是一款自动化构建工具,专注服务于 Java 平台的 项目构建 和 依赖管理 。在 JavaEE 开发的历史上构建工具的发展也经历了一系列的演化和变迁:Make --> Ant --> Maven --> Gradle --> 其他……
构建环节:
- 清理:删除以前的编译结果,为重新编译做好准备。
- 编译:将 Java 源程序编译为字节码文件。
- 测试:运行单元测试用例程序,确保项目在迭代开发过程中关键点的正确性。
- 报告:测试程序的结果。
- 打包:将 Java 项目打成 jar 包;将 Web 项目打成 war 包。
- 安装:将 jar 包或 war 包安装到本地仓库中。
- 部署:将 jar 或 war 从 Maven 仓库中部署到 Web 服务器上运行。
🍀 Maven 的配置
Maven 详细配置教程:maven配置阿里镜像与本地仓库,解决IDEA配置maven恢复默认配置问题-CSDN博客
🏠 Settings --> Build, Execution, Deployment --> Build Tools --> Maven
选择自己 Maven 的目录 和 settings 文件,然后配置自己的仓库 reposiroty。
🍀 Maven Java 工程的创建
指明当前 maven 工程的名称、模板等信息。这里要求一个项目组的 jdk 版本必须一致。
通过坐标,就可以定位仓库中具体的 jar 包。如下:
运行 App.java 即可。
当然,我们还需要补全 test 文件夹 和 resources 文件夹,并将 resources 文件夹 mark Directory as
设置为 Resources Root
。
Maven 的 java 工程的目录结构:
src
----main
--------java
--------resources
----test
--------java
--------resources
pom.xml
- main 目录用于存放主程序;
- test 目录用于存放测试程序;
- java 目录用于存放源代码文件;
- resources 目录用于存放配置文件和资源文件;
🍀 基本的 Maven 命令
目录下也会有对应的生命周期。其中常用的是:clean、compile、package、install。
比如这里 install,如果其他项目需要将这里的模块作为依赖使用,那就可以 install。安装到本地仓库的位置。
10.4 创建 Maven Web 工程
🍀 创建 Maven 的 Web 工程步骤
指明 Maven 的 web 工程的名称和模板。
配置 Tomcat:
🍀 开发 jsp 依赖 jar 包
📌 找不到 HttpServlet 错误
如果看到 JSP 报错:The superclass “javax.servlet.http.HttpServlet” was not found onthe Java Build Path.
可以加入如下依赖解决。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
📌 EL 表达式没有提示问题
${pageContext}
这个EL表达式中通过 pageContext 对象访问 reuqest 属性时本身是应该有提示的,但如果没有的话加入下面依赖即可。
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1.3-b06</version>
<scope>provided</scope>
</dependency>
同时针对 index.jsp 文件,修改一下文件头信息为:
<%@page language="java" pageEncoding="utf-8" contentType="text/html;UTF-8" %>
11.关联数据库
前提说明:想要关联数据库,首先你需要在自己的本机电脑或服务器上有数据库系统,如果你还没有在本机上安装过 MySQL,可以参考:MySQL下载与安装、mysql服务启动与停止、mysql使用cmd命令行登录、SQLyog下载与安装,sqlyog登录与操作mysql_cmd命令启动sqlyog服务-CSDN博客
11.1 关联方式
添加指定数据库:
配置 MySQL 数据库的详细信息:
表面上很多人认为配置 Database 就是为了有一个 GUI 管理数据库功能,但是这并不是 IntelliJ IDEA 的 Database 最重要特性。数据库的 GUI 工具有很多,IntelliJ IDEA 的 Database 也没有太明显的优势。
IntelliJ IDEA 的 Database 最大特性就是对于 Java Web 项目来讲,常使用的 ORM 框架,如 Hibernate、Mybatis 有很好的支持,比如配置好了 Database 之后,IntelliJ IDEA 会自动识别 domain 对象与数据表的关系,也可以通过 Database 的数据表直接生成 domain 对象等。
11.2 常用操作
- 图标1:同步当前的数据库连接。这个是最重要的操作。配置好连接以后或通过其他工具操作数据库以后,需要及时同步;
- 图标2:配置当前的连接;
- 图标3:断开当前的连接;
- 图标4:显示相应数据库对象的数据;
- 图标5:编辑修改当前数据库对象。
展示 ER 图:
支持将 ER 图导出为文件:
12.版本控制(Version Control)
不管是个人开发还是团队开发,版本控制都会被使用。而 IDEA 也很好的集成了版本控制的相关结构。
很多人认为 IntelliJ IDEA 自带了 SVN 或是 Git 等版本控制工具,认为只要安装了 IntelliJ IDEA 就可以完全使用版本控制应有的功能。这完全是一种错误的解读,IntelliJ IDEA 是自带对这些版本控制工具的插件支持,但是该装什么版本控制客户端还是要照样装的。
IntelliJ IDEA 对版本控制的支持是以插件化的方式来实现的。旗舰版默认支持目前主流的版本控制软件:CVS、Subversion(SVN)、Git
、Mercurial、Perforce、TFS。又因为目前太多人使用 Github 进行协同或是项目版本管理, 所以 IntelliJ IDEA 同时自带了 Github 插件,方便 Checkout 和管理你的 Github 项目。
在实际开发中,发现在 IDEA 中使用 SVN 的经历不算愉快,经常会遇到很多问题,比如紧急情况下 IDEA 无法更新、提交等。所以这里,谈下在 IDEA 中使用 Git。
12.1 提前安装好 Git 的客户端
🏠 Git下载与安装教程:git介绍,安装(手把手),命令与使用(包含IDEA操作,github,gitee的万字图文详述)_是谢添啊的博客-CSDN博客
12.2 关联 git.exe
🏠 Settings --> Version Control --> Git
12.3 关联 GitHub 上的账户,并测试连接
🏠 Settings --> Version Control --> GitHub
进行登录:
配置信息,将 Expiration 设置为 No expiration
,并全部勾选:
全部勾选后,点击 Generate token
:
12.4 演示使用
🍀 在 GitHub 上创建账户下的一个新的仓库作为测试
创建成功:
🍀 支持从当前登录的 Github 账号上直接 Checkout 项目
🍀 在 IDEA 中 clone GitHub 上的仓库
将上图复制得到的 url 粘贴至 idea 中:
成功拉取到本地:
🍀 本地代码分享到 GitHub
此时会在 GitHub 上创建一个新的仓库,而非更新已经存在的仓库。
查看一下我们的 GitHub 仓库:
12.5 推送代码到远程仓库
- clone:拷贝远程仓库
- commit:本地提交
- push:远程提交
- pull:更新到本地
例如我们在 IDEA 中更新了代码,想要推送到远程仓库,可进行如下仓库:
13.IDEA 推荐/常用插件
IDEA 本身很多功能也都是通过插件的方式来实现的。IDEA 已经内置了许多默认的插件。
在国内的网络下,经常出现显示不了插件列表,或者显示了插件列表但无法完成下载安装的情况。这时候你需要自行打开 VPN,一般都可以得到解决。
13.1 Alibaba Java Coding Guidelines
阿里巴巴 Java 编码规范检查插件,检测代码是否存在问题,以及是否符合规范。
使用:在类中,鼠标右键,选择编码规约扫描,在下方显示扫描规约和提示。根据提示规范代码,提高代码质量。
遗憾的是,目前最新版本的阿里巴巴规范插件仍会时不时报错:
所以我们先卸载刚才安装的阿里巴巴规范插件:
再去安装并使用 Alibaba Java Coding Guidelines(Fix Some Bug)
:
由于该插件只是对阿里巴巴规范插件进行了 bug 修复,因此使用方式是一样的。我们鼠标右击,点击“编码规范扫描”,可以看到更详细的规范说明:
13.2 jclasslib bytecode viewer
可视化的字节码查看器。
使用:
-
在 IDEA 打开想研究的类。
-
编译该类或者直接编译整个项目( 如果想研究的类在 jar 包中,此步可略过)。也可以选择运行一次该项目。目的是得到类的字节码文件给插件进行分析使用。
-
打开“view”菜单,选择“Show Bytecode With jclasslib” 选项。
-
选择上述菜单项后 IDEA 中会弹出 jclasslib 工具窗口。
英文设置:
-
打开 Help -->
Edit Custom VM Options …
-
加上英文配置:
-Duser.language=en
-
重启 IDEA,再次查看 jclasslib 工具窗口。
13.3 Translation
插件生效步骤:
-
🏠 Settings --> Tools --> Translation
-
设置翻译服务商,这里以
Youdao Translate(有道翻译)
为例。注意不要使用 Google Translate,因为谷歌已经停止了对中国大陆的翻译服务。 -
注册翻译服务(有道智云、百度翻译开放平台、阿里云机器翻译)帐号,开通翻译服务并获取其应用 ID 和 密钥。
-
将 ID 与 密钥 配置到 IDEA。
使用:鼠标选中文本,点击右键即可自动翻译成多国语言。(想使用该插件进行翻译需要联网)
13.4 GenerateAllSetter
实际开发中还有一个非常常见的场景: 我们创建一个对象后,想依次调用 Setter 函数对属性赋值,如果属性较多很容易遗漏或者重复。
可以使用这 GenerateAllSetter 提供的功能,快速生成对象的所有 Setter 函数(可填充默认值)/ Getter 函数,然后自己再跟进实际需求设置属性值。
13.5 Rainbow Brackets Lite - Free and OpenSource
给括号添加彩虹色,使开发者通过颜色区分括号嵌套层级,便于阅读。
13.6 CodeGlance Pro
在编辑器右侧生成代码小地图,可以拖拽小地图光标快速定位代码,阅读行数很多的代码文件时非常实用。
13.7 Statistic
代码统计工具。
13.8 Presentation Assistant
实时显示使用的快捷键操作的按键。(对开发者没有多大作用,主要适用于讲课人员)
13.9 Key Promoter X
快捷键提示插件。当你执行鼠标操作时,如果该操作可被快捷键代替,会在界面右下角提示,帮助你自然形成使用快捷键的习惯,告别死记硬背。(适用于 IDEA 新手)
同时,我们在右边的工具栏可以看到快捷键提示历史:
13.10 JavaDoc
添加文档注释,按 alt+insert
,执行操作:
13.11 LeetCode Editor
在 IDEA 里刷力扣算法题。
我们需要先配置一下 LeeCode 的用户信息:
🏠 Settings --> Tools --> LeeCode Plugin
刷新题目:
获取题目信息:
账号登录(用户名和密码使用的是前几步在 Settings 中配置的,只有登录账号才能提交我们的代码):
13.12 GsonFormatPlus
根据 json 生成对象。
使用:快捷键 alt + s
或 alt + insert
调取。
生成的字段设置:
将如下信息拷贝到 JSON 区域:
{
"name": "狐狸半面添",
"age": 20,
"gender": '男',
"hometown": {
"province": "湖南省",
"city": "湘潭市",
"county": "湘潭县"
}
}
效果:
13.13 Material Theme UI
对于很多人而言,写代码时略显枯燥的,如果能够安装自己喜欢的主题将为开发工作带来些许乐趣。IDEA 支持各种主题插件,其中最出名的当属 Material Theme UI。
13.14 MyBatisX
该插件配合 mybatis 框架进行使用。作用是将 xml 与 接口关联,可以快速开发、生成代码与进行跳转。
13.15 Chinese (Simplified) Language Pack / 中文语言包
IDEA 默认是英文界面,安装此插件可以设置为中文界面。很多新手比较喜欢对 IDEA 进行汉化,但我们并不推荐。在开发者社区和官方文档中,大部分的学习资源和教程都是基于英文版本的 IntelliJ IDEA。如果使用汉化版本,可能会面临资源匮乏、文档不全或者难以获取帮助的问题。
因此,此插件建议不使用,程序员应该慢慢去适应英文界面。
14.实用操作
14.1 缓存和索引的清理
IntelliJ IDEA 首次加载项目的时候,都会创建索引,而创建索引的时间跟项目的文件多少成正比。在 IntelliJ IDEA 创建索引过程中即使你编辑了代码也是编译不了、运行不起来的,所以还是安安静静等 IntelliJ IDEA 创建索引完成。
IntelliJ IDEA 的缓存和索引主要是用来加快文件查询,从而加快各种查找、代码提示等操作的速度,所以 IntelliJ IDEA 的索引的重要性再强调一次也不为过。但是,IntelliJ IDEA 的索引和缓存并不是一直会良好地支持 IntelliJ IDEA 的, 某些特殊条件下,IntelliJ IDEA 的缓存和索引文件也是会损坏的,比如:断电、蓝屏引起的强制关机,当你重新打开 IntelliJ IDEA,很可能 IntelliJ IDEA 会报各种莫名其妙错误,甚至项目打不开,IntelliJ IDEA 主题还原成默认状态。即使没有断电、蓝屏,也会有莫名奇怪的问题的时候,也很有可能是 IntelliJ IDEA 缓存和索引出现了问题,这种情况还不少。遇到此类问题也不用过多担心。我们可以清理缓存和索引。如下:
清除缓存、索引本质也就是去删除 C 盘下的 system 目录下的对应的文件而已,所以如果你不用上述方法也可以删除整个 system。当 IntelliJ IDEA 再次启动项目的时候会重新创建新的 system 目录以及对应项目缓存和索引。
14.2 本地历史记录的查看
即使我们项目没有使用版本控制功能,IntelliJ IDEA 也给我们提供了本地文件历史记录。无论是文件夹还是单个文件,都具备查看操作历史的功能。
14.3 IDEA 中打开文件或文件夹在文件资源管理器中位置
14.4 包折叠与分层显示
包折叠实际指的是“Compact Middle Packages(紧凑型中间包)
”结构,即:
如果我们想让这几层包进行分层显示,就需要:
14.5 设置代码界面水平或垂直显示(界面分屏显示)
-
Split Right
:将该标签页分离到右边,但在左边依旧会保留该标签页。 -
Split and Move Right
:将该标签页分离到右边,在左边不会保留该标签页。 -
Split Down
:将该标签页分离到下面,但在上面依旧会保留该标签页。 -
Split and Move Down
:将该标签页分离到下面,在上面不会保留该标签页。
水平显示:
当然,你也可以手动进行分屏,例如:
14.6 获取 java 类的各种路径
14.7 定位类在项目或 jar 中的位置
比如我想定位 Map 在 jar 包中的位置,我可以先进入到 Map 的源码文件,然后点击 Select Opened File
图标进行定位:
文章来源:https://www.toymoban.com/news/detail-715966.html
文章来源地址https://www.toymoban.com/news/detail-715966.html
到了这里,关于2023版IDEA的下载、安装、配置、快捷键、模板、插件与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!