時序圖主要內容
下面是一個簡單的時序圖,我們可以很容易并且美觀的表達我們的交互流程,只需要在箭頭的兩邊指定一個名字,加上描述即可:
@startuml
bkloanapply -> bkloanapprove : request
bkloanapprove --> bkloanapply : response?@enduml
參與者
在上面的例子里,我們不用聲明一個參與者,也可以很好的運行,但是存在以下問題:
- 名字如果定義太長,下面的代碼會一直用很長的名字來編寫,不夠清晰。(我們可以使用 as 關鍵字來重命名)
- 無法改變參與者類型,默認參與者為 participant
- 如果要改變參與者名字,需要全局搜索所有名字一起替換。
所以,建議大家在編寫時統一在最上方定義好參與者。
@startuml
participant bkloanapply as a
participant bkloanapprove as ba -> b : request
b --> a : response@enduml
除了 participant 外,我們還可以使用其他一些關鍵字來聲明參與者,看大家喜好使用:
@startuml
actor Foo1
boundary Foo2
control Foo3
entity Foo4
database Foo5
collections Foo6Foo1 -> Foo2 : To boundary
Foo1 -> Foo3 : To control
Foo1 -> Foo4 : To entity
Foo1 -> Foo5 : To database
Foo1 -> Foo6 : To collections@enduml
圖中展示的參與者順序和代碼寫的先后順序一致,雖然官方提供了 order 關鍵字來定義順序,但是不建議使用(能少記一點是一點,改一下代碼順序就完了~)
上面的參與者在一開始就定義好了,我們還可以使用關鍵字 create 放在第一次接收到消息之前,以強調本次消息實際上是在創建新的對象(圖中的表現是箭頭指向參與者而不是生命線)。
@startuml
participant bkloanapply as a
participant bkloanapprove as ba -> b : request
create bkloandecision as c
b -> c : request2create control bkdmc as d
b -> d : request3
note right: this is note!b --> a : response
@enduml
如果覺得使用關鍵字太繁瑣了,我們還可以使用縮寫符號 ** 來代替,比如上圖還可以這么寫:
@startuml
participant bkloanapply as a
participant bkloanapprove as b
participant bkloandecision as c
control bkdmc as da -> b : request
b -> c ** : request2b -> d ** : request3
note right: this is note!b --> a : response
@enduml
包裹參與者
可以使用 box 和 end box 畫一個盒子將參與者包裹起來。
@startuml
box "貸前" #LightBlue
? ? participant bkloanapply as a
? ? participant bkloanapprove as b
end box
participant bkloandecision as ca -> b : request
b -> c : request2
return response2
b --> a : response
@enduml
箭頭樣式
@startuml
participant bkloanapply as a
participant bkloanapprove as ba ->x b
a -> b
a ->> b
a -\ b
a \\- b
a //-- b
a ->o b
a o\\-- b
a <-> b
a <->o b@enduml
當消息的接收源或發送源不確定時,我們可以使用 [ 或 ] 符號來代替。
@startuml
participant bkloanapply as a
[o-> a : 接收到消息
a -> a : 處理邏輯
a ->o] : 發出消息@enduml
標題、頁頭、頁尾
我們可以使用 title 來表示標題,header 和 footer 表示頁頭和頁尾。
@startuml
header 一期
footer Page %page% of %lastpage%
title 掃碼付participant bkloanapply as a
participant bkloanapprove as ba -> b : request
b --> a : response@enduml
分割多張圖
上面說頁頭頁尾時我們舉了個例子,頁尾顯示為 Page 1 of 1 ,那什么時候會出現多頁呢?newpage 關鍵字就是用來分頁使用的,它可以使所有頁面共用相同的參與者以及標題、頁頭、頁尾、樣式等所有元素。
@startuml
header 一期
footer Page %page% of %lastpage%
title 掃碼付participant bkloanapply as a
participant bkloanapprove as ba -> b : request
b --> a : responsenewpage
a -> b : request2
b --> a : response2@enduml
組合消息
我們可以通過以下關鍵詞將組合消息:
- alt/else
- opt
- loop
- par
- break
- critical
- group, 后面緊跟著消息內容
關鍵詞 end 用來結束分組。(注:分組可以嵌套使用)
@startuml
participant bkloanportal as a
participant bkloanapply as b
participant bkloanapprove as c
participant bkloandecision as d
participant bkdmc as ea -> b : 前準入咨詢
b -> d : 前準入咨詢
return 前準入是否準入opt 可選條件
b -> d : 會員準入咨詢
endalt 前準入準入
? ? b --> a : 準入
else 前準入不準入
? ? b --> a : 不準入異常碼
enda -> b : 提交申請
return : 提交成功,返回單號b -> c : 開啟調查
loop 所有采集項
? ? c -> e : 開始采集
endc -> d : 授信準入
c -> d : 固化授信@enduml
消息序列編號
我們可以使用 autonumber 自動對消息進行編號,這里列舉的是最通用也是最簡單,如果想使用復雜的編號,自行去官網查閱。
@startuml
autonumber
participant bkloanapply as a
participant bkloanapprove as ba -> b : request
b --> a : response@enduml
分隔符
你可以通過使用 == 關鍵詞來將你的圖表分割多個步驟。
@startuml
participant bkloanapply as a
participant bkloanapprove as b==分隔符1==
a -> b : request1
return : response1==分隔符2==
a -> b : request2
return : response2@enduml
添加注釋
我們可以在消息的左邊、右邊、消息中間增加注釋,大體有以下幾種:
- note left : msg 和 note left of a : msg ,在消息左側添加注釋,不同的是右邊的 of a 可以指定在哪個消息的左邊添加注釋,如果是當前發消息的主體,這兩者作用一樣。
- note right : msg 和 note right of a : msg ,在消息右側添加注釋,同上。
- note over a : msg ,在消息中間增加注釋。
- note over a,b : msg ,在多個消息中間增加注釋。
如果注釋內容過多,想讓它換行展示,我們可以使用兩種方式:
- 直接在注釋的內容里添加 \n 即可。
- 直接換行分兩行注釋
@startuml
participant bkloanapply as a
participant bkloanapprove as ba -> b : request
note left : note left a
note left of b: note left breturn response
note right : line1\nline2b -> b : 自言自語
note left
? ? line1
? ? line2
? ? line3
end notenote over b : note over b
note over a,b : note over a and b@enduml
如果你覺得默認的注釋框不好看,PUML還提供了另外兩種形狀,hnote 六邊形和 rnote 長方形:
@startuml
participant bkloanapply as a
participant bkloanapprove as brnote left a : 長方形
hnote over b : 六邊形@enduml
生命線的激活與撤銷
關鍵字 activate 和 deactivate 用來表示參與者的生命活動。一旦參與者被激活,它的生命線就會顯示出來。
@startuml
participant bkloanapply as a
participant bkloanapprove as b
participant bkloandecision as ca -> b : request
activate bb -> c : request2
activate c
return response2
deactivate cb --> a : response
deactivate b@enduml
同樣,我們還可以使用嵌套的生命線。
@startuml
participant bkloanapply as a
participant bkloanapprove as b
participant bkloandecision as ca -> b : request
activate bb -> b : invoke self
activate b
b -> c : request2
activate c
return response2
deactivate c
deactivate bb --> a : response
deactivate b@enduml
當然,我們也可以使用 ++ 和 -- 來作為 activate 和 deactivate 的縮略符號(如果使用 return 作為返回,不需要使用 --),同樣,上面的例子也可以簡寫成:
@startuml
participant bkloanapply as a
participant bkloanapprove as b
participant bkloandecision as ca -> b++ : request
b -> b++ : invoke self
b -> c++ : request2
return response2
b--return response
@enduml
構造類型和圈點
我們可以使用 << 和 >> 給參與者添加構造類型。在構造類型中,你可以使用 (X,color) 格式的語法添加一個圓圈圈起來的字符。
@startuml
participant bkloanapply as a <<System>>
participant LoanApplyService as applyService << (C,#ADD1B2) Class>>
participant LoanAdmitService as admitService << (C,#ADD1B2) >>a -> applyService : request
applyService -> admitService : request2
return response2
applyService --> a : response@enduml
樣式設置
修改顏色
如果你想修改默認參與者的顏色,可以在參與者名字后面加上 #顏色 。
如果你想修改默認箭頭的顏色,只需要在箭和頭之間加上 [#顏色] 就可以了。
如果你想修改備注的顏色,只需要在備注后加上 #顏色 就可以了,其他類型需要修改顏色的同理。
@startuml
participant bkloanapply as a #red
participant bkloanapprove as b #green
participant bkloandecision as c #99FF99a -[#green]> b ++#green : request
note left #green : green noteb --[#brown]> a-- : response
b -> c : request2
@enduml
修改字體或者其他樣式
因為用的場景不多,默認的樣式還蠻好看的,再說UML圖的目的就是清晰表達思路,過多的樣式會占用我們比較多的時間,如果實在想修改,可以自行在官網查閱。
案例
只看不練假把式,我們通過一個例子實際的去運用它,這個例子中包含了80%上面說的內容,練完后幾乎可以應對一切時序圖啦。
本例通過貸前系統的采集流程進行一個梳理:
@startuml
title 重構后的采集流程
autonumber
skinparam roundcorner 30
skinparam sequenceArrowThickness 2actor 用戶 as user #red
participant bkloanportal as portal
box "貸前" #LightBlue
? ? participant bkloanapply as apply
? ? participant bkautoapprove as autoapprove
? ? participant bkpreloancore as preloancore
? ? database 貸前DB as db
end boxbox "流程" #DarkSalmon
? ? control 流程引擎 as flow
end boxparticipant bkloandecision as decision
participant 產品工廠 as factory
participant bkdmc as dmcuser -> portal : 申請貸款
portal -> apply : 前準入咨詢
apply -> decision++ : 前準入咨詢
return 前準入是否準入alt 前準入不準入
? ? apply --> portal : 不準入
? ? portal --> user : 提示前端彈出\n【當前沒有申貸資格】\n提示用戶
else 前準入準入
? ? portal -> apply : 提交申請
? ? apply -> decision++ : 會員準入咨詢
? ? return 會員準入結果
? ? note left : 需要支持輪詢采集\n需要的分組和排序
? ? apply -> db : 提交申請
? ? apply -> autoapprove : 廣播申請成功消息
? ? autoapprove -> flow : 開啟并行采集流程
? ? autoapprove -> preloancore : 采集節點初始化
? ? preloancore -> factory ** : 讀取調查審批產品
? ? preloancore -> preloancore : 節點解析
? ? preloancore -> db : 持久化所有節點信息
? ? autoapprove -> preloancore : 咨詢所有采集是否完成? ? alt 所有采集沒有完成
? ? ? ? autoapprove -> preloancore : 獲取下一批節點
? ? ? ? loop 一批節點
? ? ? ? ? ? autoapprove -> flow : 啟動采集子流程
? ? ? ? ? ? autoapprove -> preloancore : 查詢該采集項在dmc內是否存在有效數據
? ? ? ? ? ? activate preloancore
? ? ? ? ? ? preloancore -> dmc ** : getObject
? ? ? ? ? ? activate dmc
? ? ? ? ? ? return 數據
? ? ? ? ? ? deactivate dmc
? ? ? ? ? ? preloancore --> autoapprove : 是否存在有效數據
? ? ? ? ? ? deactivate preloancore
? ? ? ? ? ? alt 存在有效數據
? ? ? ? ? ? ? ? autoapprove -> preloancore : 更新節點狀態EXIST_DATA
? ? ? ? ? ? ? ? autoapprove -> flow : 喚醒主流程
? ? ? ? ? ? else 不存在有效數據
? ? ? ? ? ? ? ? autoapprove -> preloancore : 授權咨詢
? ? ? ? ? ? ? ? autoapprove -> preloancore : 發起采集
? ? ? ? ? ? ? ? preloancore -> db : 創建采集請求
? ? ? ? ? ? ? ? preloancore -> dmc : 發起采集collectObject
? ? ? ? ? ? ? ? autoapprove o-> autoapprove : 接到采集完成消息
? ? ? ? ? ? ? ? autoapprove -> preloancore : 根據rqsNo查詢采集請求
? ? ? ? ? ? ? ? activate preloancore
? ? ? ? ? ? ? ? preloancore -> db++ : 查詢采集請求
? ? ? ? ? ? ? ? return 采集請求
? ? ? ? ? ? ? ? preloancore --> autoapprove : 采集請求
? ? ? ? ? ? ? ? deactivate preloancore
? ? ? ? ? ? ? ? autoapprove -> flow : 喚醒子流程繼續執行
? ? ? ? ? ? ? ? autoapprove -> preloancore : 完成采集
? ? ? ? ? ? end
? ? ? ? end
? ? end
end@enduml