免费注册
流程类
图形化表达方式
脑图类
结构化表达方式
笔记类
高效化表达方式
实用工具
实用工具
业务与管理领域
软件工程与系统设计
UML
数据分析与研究
工程与技术设计
数据库与信息系统
树形图
括号图
思维笔记

时序图语法

时序图

Mermaid可以渲染时序图。时序图是一种交互图,它展示了各个过程如何相互操作以及操作的顺序。

代码:
                            
复制
嵌入
sequenceDiagram Alice->>John: Hello John, how are you? John-->>Alice: Great! Alice-)John: See you later!
信息

关于节点的说明: 由于Mermaid语言的编写方式,"end" 一词会破坏整个图形。如果必须使用 “end”,则需要使用小括号()、双引号""、大括号{} 或中括号[]来封装“end”一词,即:(end)、[end]、{end}。

语法

参与者

参与者会按照在图表源文本中出现的顺序显示。有时,你可能希望以不同于第一条消息中出现的顺序来显示参与者,可以通过以下方法来指定参与者的出场顺序:

代码:
                            
复制
嵌入
sequenceDiagram participant Alice participant Bob Bob->>Alice: Hi Alice Alice->>Bob: Hi Bob

角色

如果你想使用角色符号,而不是带有文本的矩形,则可以通过使用角色语句来实现,如下所示。

代码:
                            
复制
嵌入
sequenceDiagram actor Alice actor Bob Alice->>Bob: Hi Bob Bob->>Alice: Hi Alice

别名

你可以在参与者声明后使用 as 来定义别名

代码:
                            
复制
嵌入
sequenceDiagram participant A as Alice participant J as John A->>J: Hello John, how are you? J->>A: Great!

参与者创建和销毁

可以通过消息创建和销毁参与者。因此,请在消息前添加创建或销毁指令。

                            
复制
嵌入
participant B A --> B: Hello

创建指令时支持区分参与者与别名。消息的发送者或接收者可被销毁,但接收者只能被创建。

代码:
                            
复制
嵌入
sequenceDiagram Alice->>Bob: Hello Bob, how are you ? Bob->>Alice: Fine, thank you. And you? create participant Carl Alice->>Carl: Hi Carl! create actor D as Donald Carl->>D: Hi! destroy Carl Alice-xCarl: We are too many destroy Bob Bob->>Alice: I agree

分组/框

参与者可以分组放在垂直框中。你可以使用符号定义颜色(如果没有定义,它将是透明的)。

                            
复制
嵌入
box Aqua Group Description ... actors ... end box Group without description ... actors ... end box rgb(33,66,99) ... actors ... end box rgba(33,66,99,0.5) ... actors ... end
信息

如果你的组名是有色的,你可以将该颜色强制设为透明:

                            
复制
嵌入
box transparent Aqua ... actors ... end
代码:
                            
复制
嵌入
sequenceDiagram box Orange Alice & John participant A participant J end box Another Group participant B participant C end A->>J: Hello John, how are you? J->>A: Great! A->>B: Hello Bob, how is Charley? B->>C: Hello Charley, how are you?

消息

消息可以是实线显示,也可以是虚线显示。

线条可以是实线或虚线,并且支持以各种类型的箭头、十字或开口箭头结束。

                            
复制
嵌入
[Actor][Arrow][Actor]:Message text

十种标准箭头类型

类型 描述
-> 无箭头实线
--> 无箭头虚线
->> 带箭头实线
-->> 带箭头虚线
<<->> 双向箭头的实线
<<-->> 双向箭头的虚线
-x 末端有十字的实线
--x 末端有十字的虚线
-) 末尾带有空心箭头的实线(异步)
--) 末尾带有空心箭头的虚线(异步)

激活

可以激活和停用一个角色,停用或激活可以是专用声明:

代码:
                            
复制
嵌入
sequenceDiagram Alice->>Bob: Hello Bob, how are you? activate Alice Bob->>Alice: Hi Alice! deactivate Alice

还有一种快捷表示法,即在消息箭头后添加 + 或 -

代码:
                            
复制
嵌入
sequenceDiagram Alice->>+John: Hello John, how are you? John-->>-Alice: Great!

同一角色的激活可以叠加:

代码:
                            
复制
嵌入
sequenceDiagram Alice->>+John: Hello John, how are you? Alice->>+John: John, can you hear me? John-->>-Alice: Hi Alice, I can hear you! John-->>-Alice: I feel great!

注释

可以向时序图添加注释。可以通过以下符号实现:Note[right of]或[left of]或[over][参与者]:注释内容

代码:
                            
复制
嵌入
sequenceDiagram participant John Note right of John: Text in note

还可以创建涵盖两个参与者的注释:

代码:
                            
复制
嵌入
sequenceDiagram Alice->John: Hello John, how are you? Note over Alice,John: A typical interaction

换行符

可以在注释和消息中添加换行符:

代码:
                            
复制
嵌入
sequenceDiagram Alice->John: Hello John,<br/>how are you? Note over Alice,John: A typical interaction<br/>But now in two lines

角色名称中的换行符需要定义别名:

代码:
                            
复制
嵌入
sequenceDiagram participant Alice as Alice<br/>Johnson Alice->John: Hello John,<br/>how are you? Note over Alice,John: A typical interaction<n/>But now in two lines

循环

在时序图中可以通过以下符号来表达循环。

                            
复制
嵌入
loop Loop text ... statements ... end

请参阅下面的示例

代码:
                            
复制
嵌入
sequenceDiagram Alice->John: Hello John, how are you? loop Every minute John-->Alice: Great! end

替代

在时序图中可以通过符号来表达替代路径。

                            
复制
嵌入
alt Describing text... statements else statements end

或者如果存在可选序列:

                            
复制
嵌入
opt Describing text... statements end

请参阅下面的示例

代码:
                            
复制
嵌入
sequenceDiagram Alice->>Bob: Hello Bob, how are you? alt is sick Bob->>Alice: Not so good :( else is well Bob->>Alice: Feeling fresh like a daisy end opt Extra response Bob->>Alice: Thanks for asking end

平行

可以通过以下符号表示并行发生的动作。

代码:
                            
复制
嵌入
par Action 1 statements and Action 2 statements and Action N statements end

请参阅下面的示例

代码:
                            
复制
嵌入
sequenceDiagram par Alice to Bob Alice->>Bob: Hello guys! and Alice to John Alice->>John: Hello guys! end Bob-->>Alice: Hi Alice! John-->>Alice: Hi Alice!

也可以嵌套并行块。

代码:
                            
复制
嵌入
sequenceDiagram par Alice to Bob Alice->>Bob: Go help John and Alice to John Alice->>John: I want this done today par John to Charlie John->>Charlie: Can we do this today? and John to Diana John->>Diana: Can you help us today? end end

临界区

可以通过对各种情况进行条件化处理,来展示必须自动执行的操作。

这是通过以下符号完成的:

                            
复制
嵌入
critical [Action that must be performed] ... statements ... option [Circumstance A] ... statements ... option [Circumstance B] ... statements ... end

请参阅下面的示例:

代码:
                            
复制
嵌入
sequenceDiagram critical Establish a connection to the DB Service-->DB: connect option Network timeout Service-->Service: Log error option Credentials rejected Service-->Service: Log different error end

也有可能完全没有选项。

代码:
                            
复制
嵌入
critical Establish a connection to the DB Service-->DB: connect end

这个关键块也可以嵌套,相当于上面看到的 par 语句。

中断

可以在流程中指示序列的停止(通常用于建模异常情况)。

这是通过以下符号完成的:

                            
复制
嵌入
break [something happened] ... statements ... end

请参阅下面的示例:

代码:
                            
复制
嵌入
sequenceDiagram Consumer-->API: Book something API-->BookingService: Start booking process break when the booking process fails API-->Consumer: show failure end API-->BillingService: Start billing process

背景高亮

可以设置彩色背景矩形来高亮流程,通过以下符号完成:

                            
复制
嵌入
rect COLOR ... content ... end

颜色是使用 rgb 和 rgba 语法定义的。

                            
复制
嵌入
rect rgb(0, 255, 0) ... content ... end
                            
复制
嵌入
rect rgba(0, 0, 255, .1) ... content ... end

请参阅下面的示例:

代码:
                            
复制
嵌入
sequenceDiagram participant Alice participant John rect rgb(191, 178, 255) note right of Alice: Alice calls John. Alice->>+John: Hello John, how are you? rect rgb(142, 182, 89) Alice->>+John: John, can you hear me? John-->>-Alice: Hi Alice, I can hear you! end John-->>-Alice: I feel great! end Alice ->>+ John: Did you want to go to the game tonight? John -->>- Alice: Yeah! See you there.

注释

可以在时序图中输入注释,编辑器将忽略这些注释。 注释需要独占一行,并且必须以双百分号 %% 开头。 从注释开始到下一个换行符之间的何文本都将被视为注释,包括任何图表语法。

代码:
                            
复制
嵌入
sequenceDiagram Alice->>John: Hello John, how are you? %% this is a comment John-->>Alice: Great!

用于转义字符的实体编码

可以使用以下语法对字符进行转义。

代码:
                            
复制
嵌入
sequenceDiagram A->>B: I #9829; you! B->>A: I #9829; you #infin; times more!

给出的数字是十进制,因此(#)可以编码为(#35;),还支持使用HTML字符名称。

由于分号可以代替换行符来定义标记,因此在消息文本中包含分号时,你需要使用(#59;)。

编号

可以在时序图中的每个箭头上附加一个序列号。如下所示:

代码:
                            
复制
嵌入
sequenceDiagram autonumber Alice->>John: Hello John, how are you? loop HealthCheck John->>John: Fight against hypochondria end Note right of John: Rational thoughts! John-->>Alice: Great! John->>Bob: How about you? Bob-->>John: Jolly good!

参与者菜单

参与者可以包含弹出式菜单,其中列有指向外部页面的个性化链接。例如,如果一个角色代表一个网络服务,有用的链接可能包括指向服务健康仪表板的链接、包含该服务代码的仓库,或描述该服务的维基页面的链接。

可以通过添加一条或多条链接行来配置,格式如下:

                            
复制
嵌入
link <actor>: <link-label> @ <link-url>
代码:
                            
复制
嵌入
sequenceDiagram participant Alice participant John link Alice: Dashboard @ https://dashboard.contoso.com/alice link Alice: Wiki @ https://wiki.contoso.com/alice link John: Dashboard @ https://dashboard.contoso.com/john link John: Wiki @ https://wiki.contoso.com/john Alice->>John: Hello John, how are you? John-->>Alice: Great! Alice-)John: See you later!

高级菜单语法

有一种依赖于JSON格式的高级语法。如果你熟练掌握JSON格式,那么这也可以使用。

可以通过添加以下格式的链接行来配置:

                            
复制
嵌入
links <actor>: <json-formatted link-name link-url pairs>

示例如下:

代码:
                            
复制
嵌入
sequenceDiagram participant Alice participant John links Alice: {"Dashboard": "https://dashboard.contoso.com/alice", "Wiki": "https://wiki.contoso.com/alice"} links John: {"Dashboard": "https://dashboard.contoso.com/john", "Wiki": "https://wiki.contoso.com/john"} Alice->>John: Hello John, how are you? John-->>Alice: Great! Alice-)John: See you later!