时序图
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!