PlantUML 语法之时序图

plantUML 下载(含《plantUML语法指南手册》):http://plantuml.com/download

本站下载:官方指南英文版

plantUML 在线生成器:online demo server

Visual Studio Code 安装 plantUML 插件,在插件应用商店中搜索:PlantUML,点击安装即可。

快捷键:
Alt + D 即可快速预览,Ctrl + Shift + P 即可快速调出命令面板,选择”导出当前文件图表”即可导出成图片或者svg文件。

VS Code 安装 PlantUML 插件

安装 graphviz

使用 plantuml 画类图的时候还需要在 VS Code 中安装:Graphviz Preview, 如果还是不画类图,就需要安装graphviz

下载zip 包,将zip包解压,并移动到固定目录(常用软件安装目录即可),复制graphviz 安装包目录下的 bin 目录下的 dot.exe文件的绝对路径,设置到系统的环境变量中:
在系统环境变量中曾加GRAPHVIZ_DOT的配置,重启 VS Code。

例如:dot运行文件路径是:D:\programs\graphviz\bin\dot.exe,在系统变量列表中创建一个:GRAPHVIZ_DOT:D:\programs\graphviz\bin\dot.exe 的键值对即可。

VS Code 默认是英文系统,可安装”Chinese (Simplified) Language”中文语言插件。

一、简单例子

消息流向使用 -> 表示, 此时绘制出实线箭头; --> 则绘制点线箭头。若要绘制反向消息流向, 可以使用 <-<--

注意:没有显示申明模块的类型,默认是矩形图形模块,并且随着代码的书写顺序进行从左向右的展示。

1
2
3
4
5
6
@startuml
模块1 -> 模块2: Authentication Request
模块2 --> 模块1: Authentication Response
模块1 -> 模块2: Another authentication Request
模块2 <-- 模块1: another authentication Response
@enduml

二、申明例图(种类)

participant 声明的参与者的图形是一个矩形,还可以由其它关键字声明一个参与者,不同的关键字声明的参与绘制时使用的图形是不一样的:

  • participant
  • actor
  • boundary
  • control
  • entity
  • database
  • collections
1
2
3
4
5
6
7
8
9
10
11
12
13
@startuml
actor 角色
boundary 分界
control 控制器
entity 数据对象
database 数据库
collections 集合
角色 -> 分界 : 发送到分界
角色 -> 控制器 : 发送到控制器
角色 -> 数据对象 : 发送到数据对象
角色 -> 数据库 : 发送到数据库
角色 -> 集合 : 发送到集合
@enduml

三、使用别名及背景颜色

别名

若参与者名称过长,特别是参与者名字由多个单词组成的情况下,可以使用关键字 as 给参与者取一个别名,之后就可以使用别名指代该参与者。

参与者背景色

在参与者名称之后以 #COLOR 的形式可以设定参与者图标的背景色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@startuml
actor 管理员 #red
' 定义颜色角色的背景颜色,以区别不用的元素
participant 服务1
' 定义别名
participant "请求日志" as R #99FF99
' 也可以下面这种方式定义别名
participant S as "响应日志" #99FF00
participant 服务2

服务1->服务2: 验证请求
服务1->R: 日志记录

服务2->服务1: 验证响应
服务2->S: 日志记录
@enduml

四、设置箭头颜色

在箭头语法中间以 [#COLOR] 的形式可以设置箭头颜色:

1
2
3
4
5
6
7
@startuml
' 设置箭头颜色
服务1 -[#Red]-> 服务2: 发送请求 [虚线箭头]
'虚线箭头 -->
服务2 -[#Green]> 服务3: 发送请求 [实线箭头]
'实线箭头 ->
@enduml

五、设置箭头风格

  • x. 将其放到箭头符号前或后,UML 中表示丢失消息.
  • 使用 / 代替 > 或 使用 \ 代替 <,图标箭头只有半个.
  • 使用 //>><<\\ 将产生细箭头.
  • 使用 -- 代替 - 将产生虚线.
  • 在箭头或箭尾放置 o, 相应位置会绘制 ‘o’.
  • 可以产生双向箭头
1
2
3
4
5
6
7
8
9
10
11
12
@startuml
客户端 ->x 服务器
客户端 -> 服务器
客户端 ->> 服务器
客户端 -\ 服务器
客户端 \\- 服务器
客户端 //-- 服务器
客户端 ->o 服务器
客户端 o\\-- 服务器
客户端 <-> 服务器
客户端 <->o 服务器
@enduml

六、箭头给自己发消息

参与者可以给自己发消息

1
2
3
4
5
6
@startuml
' 若消息很长, 可以使用 "\n" 换行.
' 消息默认是或对齐.
' 参与者名称则是默认中间对齐.
服务器 -> 服务器: 若消息很长, 可以使用 "\\n" 换行 \n 消息默认是或对齐 \n 参与者名称则是默认中间对齐
@enduml

给自己发消息

七、消息自动编号

  • autonumber 从 1 开始对消息自动编号
  • autonumber START从 START 开始对消息自动编号
  • autonumber START INCREMENT从 START 开始,按 增量 INCREMENT 对消息自动编号
1
2
3
4
5
6
7
8
9
10
11
12
13
@startuml
autonumber
客户端 -> 服务器 : 第一次请求 [自动编号]
客户端 <-- 服务器 : 第一次响应 [自动编号]

autonumber 15
客户端 -> 服务器 : 第二次请求 [从编号15开始, 自动编号]
客户端 <-- 服务器 : 第二次响应 [从编号15开始, 自动编号]

autonumber 40 10
客户端 -> 服务器 : 第一次请求 [从编号40开始, 以 10 为单位自动编号]
客户端 <-- 服务器 : 第二次响应 [从编号40开始, 以 10 为单位自动编号]
@enduml

八、自定义消息编号样式

1
2
3
4
5
6
7
8
9
10
11
12
13
@startuml
autonumber "<b>[000]"
客户端 -> 服务器 : 证请求 [编号带中括号及加粗样式]
客户端 <-- 服务器 : 验证响应 [编号带中括号及加粗样式]

autonumber 15 "<b>(<u>##</u>)"
客户端 -> 服务器 : 验证请求 [编号带括号及下划线样式]
客户端 <-- 服务器 : 验证响应 [编号带括号及下划线样式]

autonumber 40 10 "<font color=red><b>消息编号 0 "
客户端 -> 服务器 : 验证请求 [编号带红色及加粗样式]
客户端 <-- 服务器 : 验证响应 [编号带红色及加粗样式]
@enduml

九、停止消息自动编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@startuml
autonumber 10 10 "<b>[000]"
客户端 -> 服务器 : 验证请求
客户端 <-- 服务器 : 验证响应

autonumber stop

客户端 -> 服务器 : 停止自动编号后的消息

autonumber resume "<font color=red><b>消息编号 0 "

客户端 -> 服务器 : 另一个验证请求
客户端 <-- 服务器 : 另一个验证响应

autonumber stop

客户端 -> 服务器 : 停止自动编号后的消息

autonumber resume 1 "<font color=blue><b>消息编号 0 "

客户端 -> 服务器 : 另一个验证请求
客户端 <-- 服务器 : 另一个验证响应
@enduml

十、消息分组

有时候可能需要对消息进行分组,那么可以使用下面的关键词来实现:

  • alt/else
  • opt
  • loop
  • par
  • break
  • critical
  • group, 这个关键词后面的文字会作为组名显示在图形上

上面的关键词后可以添加一些文本用来显示在头部(注:group 除外,因 为它后面的文本用来显示在组名称的位置)。
在组嵌套组的结构里可以用关 键词end来关闭组或者说是表示一个组符号的结束符(类似if/endif)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@startuml
客户端 -> 服务器 : 验证请求
alt 验证成功
客户端 -> 服务器 : 验证响应

else 验证失败 :第一种失败情况
客户端 -> 服务器 : 验证失败
group 自定义的分组情况
客户端 -> 日志服务 : 开始记录日志
loop 循环 1000 次
客户端 -> 服务器 : DNS 尝试
end

客户端 -> 日志服务 : 结束日志记录
end

else 验证失败:第二种失败情况
客户端 -> 服务器 : 要求客户端重新请求
end
@enduml

十一、消息注解

我们可能经常会在消息的左边或右边使用注解,要添加注解,只要使用 note left 或 note right 关键词就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
@startuml
客户端->服务器 : 请求
note left: 这是左侧注解
服务器 -->客户端 : 响应
note right: 这是右侧注解
服务器 ->服务器 : 业务流程处理
note left
注解
也可以多行编写
只需要使用 note 和 end note 即可
end note
@enduml

十二、其他注解方式

通过使用关键词 note left ofnote right ofnote over , 我们还可以把注解放置在与之相关的参与者的左边或右边,或下方。

通过改变注解的背景色,我们还可以高亮一个注解文本块。

如果要使用多行注解,可以使用关键词 end note 来表示注解的结束。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@startuml
participant 客户端
participant 服务器

note left of 客户端 #aqua
这是相对客户端模块左侧的注解
end note

note right of 客户端: 这是相对客户端模块右侧的注解

note over 客户端: 这是相对客户端模块中间的注解

note over 客户端, 服务器 #FFAAAA: 这是相对\n 服务器和客户端之间的注解

note over 客户端, 服务器
这是换行的注解
使用 note 和 end note 组合
end note
@enduml

十三、最佳样式

默认样式颜色为黄色,组件块是上下对应的,这会产生更多的视觉噪音,因此去掉底部的重复并将颜色改为素色为好:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@startuml
hide footbox
skinparam sequenceMessageAlign center
skinparam sequenceArrowFontSize 11
skinparam noteFontSize 11
skinparam monochrome true
skinparam lifelinestrategy solid
autonumber "<b>[00]"

actor 角色
boundary 分界
control 控制器
entity 数据对象
database 数据库
collections 集合
角色 -> 分界 : 发送到分界
角色 -> 控制器 : 发送到控制器
角色 -> 数据对象 : 发送到数据对象
角色 -> 数据库 : 发送到数据库
角色 -> 集合 : 发送到集合
@enduml

参考资料:

官方指南英文版

官网

官网在线制作

plantuml 之序列图(一)

使用Emacs敲出UML,PlantUML快速指南

使用 Sublime + PlantUML 高效地画图

updated updated 2020-03-10 2020-03-10
本文结束感谢阅读

本文标题:PlantUML 语法之时序图

本文作者:木鲸鱼

微信公号:木鲸鱼 | woodwhales

原始链接:https://woodwhales.cn/2019/01/13/017/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%