diff --git a/clean-code/Clean Code Book.md b/clean-code/Clean Code Book.md new file mode 100644 index 0000000000000000000000000000000000000000..be7afad08679a0bd6a227f2dc6a4a76b42736cd4 --- /dev/null +++ b/clean-code/Clean Code Book.md @@ -0,0 +1,164 @@ +# 代码整洁之道笔记 + +## 参考文档 + +- [Clean Code 中文](https://www.bookstack.cn/read/Clean-Code-zh/docs-README.md) + +## Later equals never,稍后等于永不 + +- 童子军军规:让营地比你来时更干净。 +- 不要因为一些原因而留下糟糕的代码。 +- 糟糕的代码会使得今后的开发和维护更加的困难,浪费自己时间,也同样浪费别人的时间。 + +## 第 1 章 整洁代码 + +代码是必要的,时刻都要保持整洁的代码。 + +什么是整洁的代码? + +优雅和高效的代码。代码逻辑应当直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来。 + +起码要做到以下几点: + +- 能通过所有的测试。 +- 没有重复代码。 +- 体现系统中的全部设计理念。 +- 包含尽量少的实体、比如类、方法、函数等。 + +即整洁的代码需要做到: + +- 职责明确,没有多余 +- 减少依赖,便于维护 +- 高效 + +## 第 2 章 有意义的命名 + +- 名副其实。 + - 一个好的命名可以省去大量的时间。 + - 命名一定要做到,词要达意! + - 说起来很简单。选个好名字需要花时间,但省下的时间比花掉的多。 + - 注意命名,一旦有好的命名,就换掉旧的。 + - 示例: + + ```java + int d;// 消失的时间,以日计。 + int elapsedTimeInDays; + ``` + +- 避免思维映射 + - 例如循环中的 i、j、k 等单字母名称不是个好选择,读者必须在脑中将它映射为真实概念。最好用 filter、map 等方法代替 for循环。 +- 避免误导 + - 比如不是 List 类型,就不要用个 accountList 来命名,这样形成误导。 +- 做有意的区分 + - Variable 一词 永远不应当出现在变量名中。 + - Table 一词永远不应当出现在表名中。 + - NameString 会比 Name 好吗,难道 Name 会是一个浮点数不成。 + - 如有一个 Customer 的类,有又一个 CustomerObject 的类。 +- 类名应该是名词或短语 + - 像 Customer,Account,避免使用 Manager,Processor,Data 或者 Info 这样的类名。 + - 类名不应当是动词。 + - 方法名应该是动词或动词短语。 + - 如 postPayment,deletePage 或 Save,属性访问、修改和断言应该根据其值来命名,并加上 get,set,is 这些前缀。 +- 每个概念对应一个词 + - 在一堆代码中有 Controller,又有 manager,driver 就会令人困惑。 +- 好的名字相当于为代码写了一段有用的注释。 + +## 第 3 章 函数 + +Function should do one thing. They should do it well. They should do it only. + +函数只应该做一件事情,把一件事情做好,而且只由它来做这一件事情。 + +一个好的函数应该满足以下规则: + +- 短小 + - 函数的第一规则是要短小。 + - 第二条规则是还要更短小。 + - 例如 if、else、while 等语句,其中的代码应该只有一行。该行大抵应该是一个函数调用语句。因为块内的函数拥有较具体说明性的名称,从而增加了文档上的价值。 +- 只做一件事,做好这件事 + - 无副作用 + - 确保函数功能就像函数名描述的一样,不要做函数名描述以外的事情。应该为起一个更能描述函数功能的函数名。 +- 参数 + - 尽量少的函数参数。 + - 有两个参数的函数要比一元函数的难懂。 + - 如果需要三个或者三个以上的参数应该封装成类了。 + - 最理想的参数数量是零。 +- 不要重复一段代码 + - 如果一段相同的代码出现了两次,想一想是不是应该抽取方法了。 + +如何写出好函数: + +- 分解函数,抽象分层 +- 一个好的命名 +- 消除重复代码 + +## 第 4 章 注释 + +Comments Do Not Make Up for Bad Code. + +注释不是对劣质代码的补救。 + +- 与其花时间编写解释糟糕的代码注释,不如花时间清洁糟糕的代码。 +- TODO 注释虽好,但也要定期查看,删除不再需要的。 +- 警示,告诉别人要注意这个方法之类的。 +- 放大,有的代码可能看着有点多余,但编码者当时是有他自己的考虑,这个时候需要注释下这个代码的重要性。避免后面被优化掉。 +- 注释掉的代码。 + - 不要的代码应该立即删掉。(有 VCS 可以找回) + +## 第 5 章 格式 + +### 垂直格式 + +- 函数与函数之间留空行 +- 变量声明 + - 变量声明应该尽可能靠近其使用位置。 + - 因为函数很短,本地变量应该在函数的顶部出现。 + - 实体变量应该在内的顶部,相当于我们的 field 字段,会被使用的多。 +- 相关函数 + - 若某个函数调用了另一个函数,就应该把它们放到一起,而且调用者应该尽可能放在被调用者上面。这样程序就有个自然顺序。 +- 概念相关的代码应该放到一起 + - 相关性越强,彼此之间的距离就该越短。 + +### 横向格式 + +- 一行的长度不要太长 +- 赋值语句两端留空 + - `a = b;` +- 不在函数名和左括号间加空格 + - 因为函数与其参数密切相关。 +- 缩进 + - 要体现层级的概念。 + +## 第 6 章 对象和数据结构 + +## 第 7 章 错误处理 + +- try catch语句块的范围不要太大,这样不利于对异常的分析 +- 别返回null值,这样可以减少调用者的防御性检测。与其返回null,不如抛出异常,或是返回特例对象(特例对象详见 p101) +- 别传递null值,传递null就要求被调用函数需要一系列防御性检测,也就意味着程序有更大可能出错 + +## 第 8 章 边界 + +## 第 9 章 单元测试 + +## 第 10 章 类 + +## 第 11 章 系统 + +Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test. + +复杂要人命,它消磨开发者的生命,让产品难于规划、构建和测试。 + +## 第 12 章 迭进 + +## 第 13 章 并发编程 + +## 第 14 章 逐步改进 + +## 第 15 章 JUnit 内幕 + +## 第 16 章 重构 SerialDate + +## 第 17 章 味道与启发 + +## 附录 A 并发编程 II diff --git a/docker/Docker.md b/docker/Docker.md new file mode 100644 index 0000000000000000000000000000000000000000..3e8479b5f97727c97d1242bccc01efe970adac07 --- /dev/null +++ b/docker/Docker.md @@ -0,0 +1,280 @@ +# Docker 笔记 + +## 参考文档 + +- [Docker 菜鸟](https://www.runoob.com/docker/docker-tutorial.html) + +## CI/CD + +- continuous integration,持续集成 +- continuous delivery,持续交付 +- continuous deployment,持续部署 + +## Docker 简介 + +### 三个基本概念 + +- 镜像(Image):Docker 镜像, + - 相当于是一个 root 文件系统。 + - 比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。 +- 容器(container): + - 镜像和容器的关系,就像是类和实例的关系一样。 + - 镜像是静态的定义,容器就像是镜像运行时的实体。 + - 容器可以创建、启动、停止、删除、暂停等。 +- 仓库(Repository): + - 仓库可以看成是一个代码控制中心,用来保存镜像。 + +### STATUS 容器状态 + +状态有7种: + +- `created`(已创建) +- `restarting`(重启中) +- `running` 或 `Up`(运行中) +- `removing`(迁移中) +- `paused`(暂停) +- `exited`(停止) +- `dead`(死亡) + +## 命令的使用 + +- 直接输入 `docker` 命令来查看到 Docker 客户端的所有命令选项。 +- 通过命令 `docker command --help` 更深入的了解指定的 Docker 命令使用方法。 + +## 容器的使用 + +### 获取镜像 + +- 如果我们本地没有 ubuntu 镜像,我们可以使用 `docker pull` 命令来载入 ubuntu 镜像: + - `docker pull ubuntu` + +### 启动容器 + +- 以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器: + - `docker run -it ubuntu /bin/bash` + - 参数说明: + - -i: 交互式操作。 + - -t: 终端。 + - ubuntu: ubuntu 镜像。 + - `/bin/bash`:放在镜像名后的是命令 + - 这里我们希望有个交互式 Shell,因此用的是 `/bin/bash`。 +- 要退出终端,直接输入 `exit`。 + +### 启动已停止运行的容器 + +- `docker ps -a`,查看所有容器。 +- `docker ps`, +- 启动一个已停止的容器,`docker start`。 + +### 后台运行 + +在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。 + +- `docker run -itd --name ubuntu-test ubuntu /bin/bash` +- `-d` 参数默认不会进入容器。 + +### 停止 / 重启一个容器 + +- `docker stop <容器 ID>`,停止 +- `docker restart <容器 ID>`,重启 + +### 进入容器 + +在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入: + +- `docker attach` + - `docker attach 1e560fca3906` +- `docker exec` + - `docker exec -it 243c32535da7 /bin/bash` +- 推荐使用 `docker exec` 命令,因为这个退出容器终端,不会导致容器的停止。 + +### 导出和导入容器 + +#### 导出 + +- `docker export` 命令,导出本地某个容器。 + - `docker export 1e560fca3906 > ubuntu.tar` + - 导出容器 1e560fca3906 快照到本地文件 ubuntu.tar。 + +#### 导入 + +- `docker import` 从容器快照文件中再导入为镜像。 + - `cat docker/ubuntu.tar | docker import - test/ubuntu:v1` + - 将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1 + +#### 指定 url 进行导入 + +- `docker import http://example.com/exampleimage.tgz example/imagerepo` + +### 删除容器 + +- `docker rm ID` +- `docker container prune`,清理掉所有处于终止状态的容器。 + +## 运行一个 WEB 应用 + +- `docker pull training/webapp` # 载入镜像 +- `docker run -d -P training/webapp python app.py` + - `-d`:让容器在后台运行。 + - `-P`:将容器内部使用的网络端口随机映射到我们使用的主机上。 +- 也可以通过 `-p` 参数来设置不一样的端口: + - `docker run -d -p 5000:5000 training/webapp python app.py` + +### 查看网络端口 + +1. `docker ps` +1. `docker <容器 ID 或者 容器 name>` + +### 查看 WEB 应用程序日志 + +- `docker logs [ID 或者名字]`,可以查看容器内部的标准输出。 +- 例如 + - `docker logs -f bf08b7f2cd89` + - `-f` + - 让 `docker logs` 像使用 `tail -f` 一样来输出容器内部的标准输出。 + - `-t`,显示时间戳 + +### 查看容器内的进程 + +- `docker top [name / id]` + +### 检查 WEB 应用程序 + +- `docker inspect [name / id]`,检查 Docker 的底层信息。 +- 它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 + +### 停止 / 重启 WEB 应用容器 + +- `docker stop [name / id]` +- `docker restart [name / id]` + +### 移除 WEB 应用容器 + +- `docker rm [name / id]` +- 删除容器时,容器的状态必须是停止状态。 + +## 镜像的使用 + +当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。 + +Docker 的默认存储位置 var/lib/docker + +### 列出镜像列表 + +- `docker images`,列出本地主机的镜像。 +- 各个选项说明: + - `REPOSITORY`:表示镜像的仓库源 + - `TAG`:镜像的标签 + - `IMAGE ID`:镜像ID + - `CREATED`:镜像创建时间 + - `SIZE`:镜像大小 +- 使用 `REPOSITORY:TAG` 来定义不同的镜像。 + +### 获取一个新的镜像 + +- `docker pull ubuntu:13.10` + +### 查找镜像 + +- `docker search httpd` +- 参数说明: + - `NAME`: 镜像仓库源的名称 + - `DESCRIPTION`: 镜像的描述 + - `OFFICIAL`: 是否 docker 官方发布 + - `stars`: 类似 Github 里面的 star,表示点赞、喜欢的意思。 + - `AUTOMATED`: 自动构建。 + +### 删除镜像 + +- `docker rmi hello-world` +- 注意,这里是 **`rmi`**,rm iamge,删除容器是 rm。 + +### 创建镜像 + +当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。 + +1. 从已经创建的容器中更新镜像,并且提交这个镜像。 +1. 使用 Dockerfile 指令来创建一个新的镜像。 + +### 更新镜像 + +更新镜像之前,需要使用镜像来创建一个容器。 + +1. 在运行的镜像内使用 `apt-get update` 来更新镜像。 +1. 完成操作,输入 exit 退出这个容器。 +1. `docker commit`,提交容器副本。 + - 例如,`docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2` + - 参数说明: + - `-m`: 提交的描述信息 + - `-a`: 指定镜像作者 + - `e218edb10161`:容器 ID + - `runoob/ubuntu:v2`: 指定要创建的目标镜像名 +1. 查看新镜像,`docker images`。 +1. 使用新镜像来启动一个容器。 + - 例如:`docker run -t -i runoob/ubuntu:v2 /bin/bash` + +### 构建镜像 + +使用命令 `docker build`, 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。 + +1. 创建 Dockerfile 文件。 + + ```bash + FROM centos:6.7 + MAINTAINER Fisher "fisher@sudops.com" + + RUN /bin/echo 'root:123456' |chpasswd + RUN useradd runoob + RUN /bin/echo 'runoob:123456' |chpasswd + RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local + EXPOSE 22 + EXPOSE 80 + CMD /usr/sbin/sshd -D + ``` + + - 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。 + - 第一条 FROM,指定使用哪个镜像源 + - RUN 指令告诉 docker 在镜像内执行命令,安装了什么。 + +1. 使用 docker build 命令进行构建。 + - `docker build -t runoob/centos:6.7 .` + - `-t`:指定要创建的目标镜像名 + - `.`:Dockerfile 文件所在目录,可以指定 Dockerfile 的绝对路径 + +### 设置镜像标签 + +- `docker tag 860c279d2fec runoob/centos:dev` +- `docker tag [容器 ID] [用户名]/[镜像源名]:[新标签名]` + +## 容器连接 + +### 网络端口映射 + +- 本地端口:容器端口 +- `-P`:是容器内部端口 *随机* 映射到主机的端口。 +- `-p`:是容器内部端口绑定到 *指定* 的主机端口。 + +## 仓库管理 + +目前 Docker 官方维护了一个公共仓库 Docker Hub。 + +大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。 + +在 https://hub.docker.com 免费注册一个 Docker 账号。 + +登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。 + +- 登录,docker login +- 退出,docker logout + +### 拉取镜像 + +- 使用 docker search 查找镜像,然后使用 docker pull 将它下载到本地。 + +### 推送镜像 + +1. `docker push username/ubuntu:18.04` + - `docker push [用户名]/[镜像名]:[标签名]` +2. `docker search username/ubuntu` + +## Dockerfile diff --git a/git/Git.md b/git/Git.md index c77621fbf16820e72cb6a1e3547f6dfd7b69a3f5..48e53002281727745d691987110d4bc59e2179d8 100644 --- a/git/Git.md +++ b/git/Git.md @@ -3,3 +3,46 @@ ## 参考文档 - [Pro Git](https://git-scm.com/book/en/v2) + +## HEAD + +所有的操作都是在 HEAD 进行。 + +git checkout 分支名,那么 HEAD -> 分支 -> commitId(hash) +git checkout hash ,那么 HEAD -> commitId(hash) + +## branch + +git branch -f 分支名 如何移动 + +## cherry-pick + +git cherry-pick 要获取的 commitId ...<可以多个> + +## rebase + +git rebase A B,意思是 B 以 A 为基,并切换到 B 分支。(B 在 A 后面) + +## origin/branch + +当你 git fetch 的时候,拉下来的是远程的 o/branch,这里的 o/branch 不会自己移动,只有远程的 branch 有了新的提交,它才会移动。 + +一般使用 git fetch,将远程分支的当前位置拉下来,然后现在本地会有 o/branch,这时候,你执行 git rebase o/branch,将当前分支变基到 o/branch 再进行提交,就不会出错了。 + +## checkout -- filename + +撤销现有的所有修改,将未暂存的修改撤销。 + +- 如果已经 add,这时候再写 aaa,这时候撤销只会撤销 aaa。 +- 如果没有 add,这时候撤销会回到上一次 commit 的状态。 + +## restore + +将暂存区的内容撤销。 + +- git restore,清空未暂存的修改 +- git restore --staged,仅将文件撤销暂存 + +## reset + +- git reset --hard,清空暂存区和本地 diff --git a/java/Java.md b/java/Java.md index 49c28adcc1c746680ed521369e338ba9ced29d58..9505652f80aabfbafea6314e8cd30cb576bdace9 100644 --- a/java/Java.md +++ b/java/Java.md @@ -368,6 +368,15 @@ Queue 实际上是实现了一个先进先出(FIFO:First In First Out)的 ## 日期与时间 +### Java 时区问题: + +- `/etc/localtime` 是用来描述本机时间 +- `/etc/timezone` 是用来描述本机所属的时区 + +在 linux 中,有一些程序会自己计算时间,不会直接采用带有时区的本机时间格式,会根据 UTC 时间和本机所属的时区等计算出当前的时间。 + +比如 jdk 应用,时区为 `Etc/UTC`,本机时间改为北京时间,通过 java 代码中 new 出来的时间还是 utc 时间,所以必须得修正本机的时区。 + ### 本地化 - 在计算机中,通常使用 `Locale` 表示一个国家或地区的日期、时间、数字、货币等格式。`Locale` 由 **语言_国家** 的字母缩写构成,例如,`zh_CN` 表示中文 + 中国,`en_US` 表示英文 + 美国。语言使用小写,国家使用大写。 diff --git a/linux/Linux Command.md b/linux/Linux Command.md new file mode 100644 index 0000000000000000000000000000000000000000..bfd268962df41aa8f81665b2a6968acd0a2a8b44 --- /dev/null +++ b/linux/Linux Command.md @@ -0,0 +1,71 @@ +# Linux 命令行 + +## 参考文档 + +- [Linux 命令行 Book](http://billie66.github.io/TLCL/book/index.html) + +## systemctl + +系统服务控制,systemd control,它提供了一组子命令来管理单个的 unit,其命令格式为: + +`systemctl [command] [unit]` + +command 主要有: + +- `start`:立刻启动后面接的 unit。 +- `stop`:立刻关闭后面接的 unit。 +- `restart`:立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思。 +- `reload`:不关闭 unit 的情况下,重新载入配置文件,让设置生效。 +- `enable`:设置下次开机时,后面接的 unit 会被启动。 +- `disable`:设置下次开机时,后面接的 unit 不会被启动。 +- `status`:目前后面接的这个 unit 的状态,会列出有没有正在执行、开机时是否启动等信息。 +- `is-active`:目前有没有正在运行中。 +- `is-enable`:开机时有没有默认要启用这个 unit。 +- `kill`:不要被 kill 这个名字吓着了,它其实是向运行 unit 的进程发送信号。 +- `show`:列出 unit 的配置。 +- `mask`:注销 unit,注销后你就无法启动这个 unit 了。 +- `unmask`:取消对 unit 的注销。 + +## curl + +`CommandLine URL` 或 `CommandLine Uniform Resource Locator`,顾名思义,`curl` 命令是在命令行方式下工作,利用 `URL` 的语法进行数据的传输或者文件的传输。 + +- 不带参数,默认发送 GET 请求。 + - `curl http://www.baidu.com` +- `-A`,即 `User-Agent`,指定客户端的用户代理标头。 +- `-b`,用来向服务器发送 Cookie。 + - `curl -b 'foo=bar' https://google.com` + - 上面的会生成一个标头 `Cookie: foo=bar` +- `-c`,将服务器设置的 Cookie 写入一个文件。 +- `-d`,用于发送 POST 请求的数据体。 + +- `-X` 选项,指定请求方式,包括 `GET`、`PUT`、`POST`、`DELETE` 四种方式。 + + ```bash + curl -XGET www.baidu.com + curl -XPOST www.baidu.com + curl -XDELETE www.baidu.com + curl -XPUT www.baidu.com + ``` + +## 守护进程 daemon + +- 前台任务(foreground job),它会独占命令行窗口,只有运行完了或者手动中止,才能执行其他命令。 +- `jobs` 显示当前暂停的进程 +- 在一个命令后面加上 `&`,可以将一个前台任务变成后台任务。 +- 如果想将一个正在运行的任务改成后台任务 + 1. `CTRL + Z`,强制当前进程转为后台,并使之挂起(暂停) + 1. `bg` 命令(让最近一个暂停的"后台任务"继续执行)。 + +### 使用 nohup 启动后台进程 + +nohup,no hang up,不挂起。 + +这个命令不会将启动的任务变成一个后台任务,所以在命令的最后要加一个 & 符号,使启动的任务变成一个后台任务。 + +- `nohup java -jar classwork-0.0.1-SNAPSHOT.jar &> classwork.text &` +- `nohup java -jar classwork-0.0.1-SNAPSHOT.jar > classwork.text 2>&1 &` +- 上面两种方式一样效果。 +- `0` 标准输入 +- `1` 标准输出 +- `2` 标准错误输出 diff --git a/swagger/Swagger.md b/swagger/Swagger.md new file mode 100644 index 0000000000000000000000000000000000000000..47b71292fbb2bf8f2de82263d98862a8f5e474f4 --- /dev/null +++ b/swagger/Swagger.md @@ -0,0 +1,74 @@ +# Swagger 笔记 + +## 参考文档 + +- [Swagger 官网](https://swagger.io/) + +## 是什么 + +- 一种接口文档定义规范。 +- 帮助开发人员设计、构建、记录和使用 RESTful Web 服务。 +- 工具集支持自动文档、代码生成和测试用例生成。 + +## 基本格式 + +- 同时支持 yaml、json 的写法,推荐使用 yaml。 +- 文档结构 + - info:文档描述信息。 + - host:接口域名。 + - basePath:接口基础路径。 + - 一般为接口版本号。 + - 如果接口没有独立域名,也可以是自定义的一个路径,如 api。 + - tags:接口标签,用于接口分类,可以简单描述一类接口的用途,增强文档可读性。 + - schemes:传输协议,一般为 http、https,群脉只支持 https。 + - consumes:请求数据类型,群脉只支持 application/json。 + - produces:返回数据类型,群脉只支持 application/json。 + - securityDefinitions:权限认证方式定义,群脉采用 api_key 的方式,在 http header 中设置 x-access-token。 + - paths:接口定义,采用 RESTful 风格。 + - definitions:对象定义。 + +## Swagger Editor + +1. **基础信息** + - `swagger`:swagger版本 + - `info`: + - `title`:标题 + - `description`:文档说明 + - `version`:文档版本 +1. **基本 url** + - `host`:主机地址 + - `basePath`:url 前缀 + - `schemes`:网络请求协议:http/https +1. **API 标签** + - `tags`: +1. **接口定义** + - `paths`: + - `/user`: + - `post`:新增接口 + - `tags`:所属标签 + - `operationId`:方法名(生成代码后即是controller层的接口方法名) + - `produces`:生产格式:json/xml + - `consumes`:消费格式:json/xml + - `parameters`:请求参数定义 + - `-name`:参数名 + - `in`:参数类型:可选:body/query/path,分别代表:请求体 /url 拼接参数 /url 占位符替换 + - `required`:是否必需:true/false + - `schema`:参数结构,可引用 definitions 中定义的数据模型 + - `$ref:'#/definitions/User'` + - `responses`:返回格式定义 + - `get`:查询接口 + - `delete`:删除接口 + - `put`:修改接口 + - `'/user/{userId}'`: + - `get`:查询详情接口 +1. **数据模型定义** + - `definitions`: + - `User`:用户 User 类 + - `type`:类型:object + - `properties`:参数列表 + - `userId`:用户 ID + - `type`:参数类型:object/integer/string/array等 + - `format`:参数格式:int32/date-time + - `items`:若是前序的 type 为 array,则需要定义 items 中的数据类型 + - `type`: + - `description`:参数描述