PlantUML - 時序圖

時序圖主要內容

下面是一個簡單的時序圖,我們可以很容易并且美觀的表達我們的交互流程,只需要在箭頭的兩邊指定一個名字,加上描述即可:

@startuml

bkloanapply -> bkloanapprove : request
bkloanapprove --> bkloanapply : response?

@enduml

參與者

在上面的例子里,我們不用聲明一個參與者,也可以很好的運行,但是存在以下問題:

  • 名字如果定義太長,下面的代碼會一直用很長的名字來編寫,不夠清晰。(我們可以使用 as 關鍵字來重命名)
  • 無法改變參與者類型,默認參與者為 participant
  • 如果要改變參與者名字,需要全局搜索所有名字一起替換。

所以,建議大家在編寫時統一在最上方定義好參與者。

@startuml

participant bkloanapply as a
participant bkloanapprove as b

a -> b : request
b --> a : response

@enduml

除了 participant 外,我們還可以使用其他一些關鍵字來聲明參與者,看大家喜好使用:

@startuml

actor Foo1
boundary Foo2
control Foo3
entity Foo4
database Foo5
collections Foo6

Foo1 -> 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 b

a -> b : request
create bkloandecision as c
b -> c : request2

create 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 d

a -> b : request
b -> c ** : request2

b -> 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 c

a -> b : request
b -> c : request2
return response2
b --> a : response
@enduml

箭頭樣式

@startuml

participant bkloanapply as a
participant bkloanapprove as b

a ->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 b

a -> 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 b

a -> b : request
b --> a : response

newpage

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 e

a -> b : 前準入咨詢
b -> d : 前準入咨詢
return 前準入是否準入

opt 可選條件
b -> d : 會員準入咨詢
end

alt 前準入準入
? ? b --> a : 準入
else 前準入不準入
? ? b --> a : 不準入異常碼
end

a -> b : 提交申請
return : 提交成功,返回單號

b -> c : 開啟調查

loop 所有采集項
? ? c -> e : 開始采集
end

c -> d : 授信準入
c -> d : 固化授信

@enduml

消息序列編號

我們可以使用 autonumber 自動對消息進行編號,這里列舉的是最通用也是最簡單,如果想使用復雜的編號,自行去官網查閱。

@startuml

autonumber
participant bkloanapply as a
participant bkloanapprove as b

a -> 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 b

a -> b : request
note left : note left a
note left of b: note left b

return response
note right : line1\nline2

b -> b : 自言自語
note left
? ? line1
? ? line2
? ? line3
end note

note 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 b

rnote left a : 長方形
hnote over b : 六邊形

@enduml

生命線的激活與撤銷

關鍵字 activate 和 deactivate 用來表示參與者的生命活動。一旦參與者被激活,它的生命線就會顯示出來。

@startuml

participant bkloanapply as a
participant bkloanapprove as b
participant bkloandecision as c

a -> b : request
activate b

b -> c : request2
activate c
return response2
deactivate c

b --> a : response
deactivate b

@enduml

同樣,我們還可以使用嵌套的生命線。

@startuml

participant bkloanapply as a
participant bkloanapprove as b
participant bkloandecision as c

a -> b : request
activate b

b -> b : invoke self
activate b
b -> c : request2
activate c
return response2
deactivate c
deactivate b

b --> a : response
deactivate b

@enduml

當然,我們也可以使用 ++ 和 -- 來作為 activate 和 deactivate 的縮略符號(如果使用 return 作為返回,不需要使用 --),同樣,上面的例子也可以簡寫成:

@startuml

participant bkloanapply as a
participant bkloanapprove as b
participant bkloandecision as c

a -> 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 #99FF99

a -[#green]> b ++#green : request
note left #green : green note

b --[#brown]> a-- : response

b -> c : request2

@enduml

修改字體或者其他樣式

因為用的場景不多,默認的樣式還蠻好看的,再說UML圖的目的就是清晰表達思路,過多的樣式會占用我們比較多的時間,如果實在想修改,可以自行在官網查閱。

案例

只看不練假把式,我們通過一個例子實際的去運用它,這個例子中包含了80%上面說的內容,練完后幾乎可以應對一切時序圖啦。

本例通過貸前系統的采集流程進行一個梳理:

@startuml
title 重構后的采集流程
autonumber
skinparam roundcorner 30
skinparam sequenceArrowThickness 2

actor 用戶 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 box

box "流程" #DarkSalmon
? ? control 流程引擎 as flow
end box

participant bkloandecision as decision
participant 產品工廠 as factory
participant bkdmc as dmc

user -> 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718897.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ map用法

int main() {void *p;str *st;st (str*)malloc(sizeof(str));st->a 23;st->b 24;p st;//使用void指針需強制類型轉換printf("%d\n%d\n",((str*)p)->a, ((str*)p)->b);free(st);map<char, int> mpci;mpci[m] 20;mpci.insert(pair<char, int…

#WEB前端(盒子模型)

1.實驗&#xff1a;盒子 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; margin&#xff08;外邊距&#xff09; border&#xff08;邊框&#xff09; padding&#xff08;內邊距&#xff09; 4.代碼&#xff1a; <!DOCTYPE html> <html lang"en"> &…

【C++】類與對象(static、explicit、友元、隱式類型轉換、內部類、匿名對象)

&#x1f308;個人主頁&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列專欄&#xff1a;http://t.csdnimg.cn/eCa5z 目錄 再談構造函數 初始化列表 隱式類型轉換 explicit關鍵字 static成員 概念 計算程序中創建出了多少個類…

開源軟件的商業模式探析:開放與盈利的平衡

寫在開頭 開源軟件的概念和應用已經成為了現代科技領域中的一個重要組成部分。然而&#xff0c;雖然開源軟件的價值和影響力得到了廣泛認可&#xff0c;但如何在開放的環境中找到商業盈利的平衡卻是一個頗具挑戰性的問題。本文將深入探討開源軟件的商業模式&#xff0c;從基本…

力扣61:旋轉鏈表

題目 給你一個鏈表的頭節點 head &#xff0c;旋轉鏈表&#xff0c;將鏈表每個節點向右移動 k 個位置。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], k 2輸出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 輸入&#xff1a;head [0,1,2], k 4輸出&#xff1a;…

卷積神經網絡(CNN)原理與實現

卷積神經網絡(CNN) 卷積神經網絡原理卷積神經網絡的數學推導卷積層反向傳播算法數學推導卷積層實現代碼 卷積神經網絡(CNN) 卷積神經網絡原理 卷積神經網絡是一種用于圖像、語音、自然語言等數據的深度學習模型&#xff0c;其核心思想是使用卷積操作提取輸入數據的特征&…

4、通達OA代碼審計

一、文件操作 1、文件上傳配合文件包含審計 文件上傳首先確定存在漏洞的文件。和文件上傳相關的函數比如upload。在從上到下分析構造的條件1. 從 POST 請求中提取變量 P 的值。 2. 檢查 P 是否已設置且不為空字符串。 3. 如果 P 已設置且非空&#xff0c;進入包含 "inc/…

JavaScript定義函數,創建函數實例時的內部原理

1、定義一個函數&#xff0c;JavaScript內部各做了哪些事情 定義一個函數時&#xff0c;JavaScript內部執行了以下步驟&#xff1a; 解析函數聲明: 當你定義一個函數時&#xff0c;JavaScript的解析器會首先解析函數聲明。這意味著它會檢查函數聲明的語法是否正確&#xff0c;…

[NSSCTF 2nd]MyJs

做一題ejs原型鏈污染 首先是登錄界面 源碼里面提示了源碼的路由 js不熟先審計一下 const express require(express); #導入Express框架&#xff0c;用于構建Web應用程序的服務器和路由 const bodyParser require(body-parser); #導入body-parser中間件&#xff0c;用于解析…

軟考證書=職稱證書?

官方的回答 根據《計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試暫行規定》&#xff08;國人部發〔2003〕39號&#xff09;規定&#xff0c;通過考試并獲得相應級別計算機專業技術資格&#xff08;水平&#xff09;證書的人員&#xff0c;表明其已具備從事相…

學習Android的第二十二天

目錄 Android ContextMenu 上下文菜單 ContextMenu 范例 參考文檔 Android SubMenu 子菜單 范例 參考文檔 Android PopupMenu 彈出菜單 范例 參考文檔 Android ContextMenu 上下文菜單 在Android開發中&#xff0c;ContextMenu&#xff08;上下文菜單&#xff09;為…

使用Javassist 在android運行時生成類

序言 最近在寫框架&#xff0c;有一個需求就是動態的生成一個類&#xff0c;然后查閱了相關文獻&#xff0c;發現在android中動態生成一個類還挺麻煩。因次把一些內容分享出來&#xff0c;幫助大家少走彎路。 方案一 DexMaker DexMaker 是一個針對 Android 平臺的庫&#xf…

Myqsort:基于冒泡排序算法的C語言實現

我們將詳細介紹一個基于冒泡排序算法的自定義排序函數——Mysqrt。該函數通過使用用戶提供的比較函數進行元素間的比較&#xff0c;并結合swap交換函數對任意類型的數據進行排序。下面是對代碼的逐行解析。 邏輯導圖 代碼實現 // 頭文件 #include<stdio.h>// 定義比較函…

華為自動駕駛技術詳解報告分享

ADS2.0首發搭載問界M5智駕版&#xff0c;城市NCA計劃年底全國開通。2023年4月16日華為在智能汽車解決方案發布會上發布了最新的ADS2.0產品&#xff0c;硬件數量減少至27個(11個攝像頭12個超聲波雷達3個毫米波雷達1個激光雷達,ADS1.0有34個)&#xff0c;車載計算平臺改為MDC610&…

python自學2

第一階段第三章 if&#xff0c;elif&#xff0c;else語句 這個是有順序的&#xff0c;如果第一個滿足下面的就不會執行&#xff0c;else也可以不寫&#xff0c;執行的效果等同于三個獨立的if。 還可以寫的更加簡潔一些 直接輸入的參數帶入到判斷里面去 小練習&#xff1a; 做…

打造專屬投屏體驗:Windows系統投屏到iOS系統

想要將電腦投屏共享給同事或朋友&#xff0c;又擔心隱私內容泄露&#xff1f;來來來&#xff0c;這里有妙招&#xff01; AirDroid Cast網頁版讓電腦投屏變得挑剔&#xff0c;只展示你允許共享的內容。會議資料、個人照片、敏感文件&#xff0c;都將得到嚴格的篩選&#xff0c;…

云原生之容器編排實踐-ruoyi-cloud項目部署到K8S:Nacosv2.2.3

背景 前面搭建好了 Kubernetes 集群與私有鏡像倉庫&#xff0c;終于要進入服務編排的實踐環節了。本系列拿 ruoyi-cloud 項目進行練手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

傳輸層Transport layer (ISO15118-20:2022) (7.7 part1) -- TCPUDP

7.7 Transport layer 這段描述闡明了文檔中子條款及其所有子條款的特定要求,這些要求分別適用于私有SECC(Supply Equipment Communication Controller)和公共SECC。除非在特定子條款或其內部的任何子條款中另有說明,否則不應將私有SECC和公共SECC視為可互換的。 這意味著…

問題解決 | RuntimeError: CUDA error: invalid device ordinalCUDA kernel errors

錯誤&#xff1a; RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING1. Compile with TO…

windows環境下Grafana+loki+promtail入門級部署日志系統,收集Springboot(Slf4j+logback)項目日志

&#x1f339;作者主頁&#xff1a;青花鎖 &#x1f339;簡介&#xff1a;Java領域優質創作者&#x1f3c6;、Java微服務架構公號作者&#x1f604; &#x1f339;簡歷模板、學習資料、面試題庫、技術互助 &#x1f339;文末獲取聯系方式 &#x1f4dd; 往期熱門專欄回顧 專欄…