PlantUML - 时序图

news2024/12/21 17:10:12

时序图主要内容

下面是一个简单的时序图,我们可以很容易并且美观的表达我们的交互流程,只需要在箭头的两边指定一个名字,加上描述即可:

@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.coloradmin.cn/o/1487583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息系统安全与对抗-作业2

目录 1、使用自己姓名拼音创建一个账户&#xff0c; 并使用命令和图形化查看 2、使用自己拼音打头字母创建一个隐藏账户 &#xff0c;并使用命令和图形化查看 3、使用命令启动 telnet 服务 4、使用命令打开防火墙 23 端口 5、熟悉LINUX系统&#xff0c;使用命令行创建用户…

排序(1)——直接插入排序+冒泡排序

目录 1 排序的概念及其应用 1.1 排序的概念 1.2 排序的应用 1.3 常见的排序算法 2 直接插入排序 2.1 基本思想 2.2 基本思路 2.3 代码实现 2.4 时间复杂度 3 冒泡排序&#xff08;回顾&#xff09; 3.1 思路分析 3.2 时间复杂度 4 比较 1 排序的概念及其应用 1.…

STP保护机制

1、BPDU保护: 为了保护边缘端口,因为当一个边缘端口收到一个BPDU时,会状变为非边缘端口,会参与生成树的计算,如果频繁的UP/DOWN,就使网络一直处于生成树的计算。 解决方法:在交换机的端口开启BPDU保护,当设置为BPDU保护的端口收到BPDU时,系统会将该端口变为down状态。…

网络安全: Kali Linux 使用 nmap 扫描目标主机

目录 一、实验 1.环境 2. Kali Linux (2024.1) 使用 namp 扫描目标主机 3.Kali Linux (2024.1)远程登录 Windows Server 4.Kali Linux (2024.1) 使用crunch字典工具 5.Kali Linux (2024.1)使用hydra密码工具 6.Kali Linux (2022.3) 通过SSH端口获取 Ubuntu 密码 二、问题…

蓝桥杯嵌入式2015年第六届省赛主观题解析

1 题目 2 解析 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body********************************************************************…

STM32(11)按键产生中断

1.初始化IO引脚&#xff0c;设置模式&#xff0c;速度等 2.设置AFIO&#xff08;配置EXTI的引脚映射&#xff09;&#xff0c;记得开启时钟 3.配置EXTI的通道&#xff08;EXTI0和EXTI1&#xff09; 4.配置NVIC 4.1 中断优先级分组 4.2 配置中断 5.编写中断响应函数 在中断向量…

Vue前端的工作需求

加油&#xff0c;新时代打工人&#xff01; 需求&#xff1a; 实现带树形结构的表格&#xff0c;父数据显示新增下级&#xff0c;和父子都显示编辑。 技术&#xff1a; Vue3 Element Plus <template><div><el-table:data"tableData"style"width…

《数字图像处理(MATLAB版)》相关算法代码及其分析(2)

目录 1 将8连通边界转换为4连通边界 1.1 移除对角线转折 1.2 插入额外像素 1.3 总结 2 将边界信息转换为二进制图像 2.1 函数定义 2.2 参数处理和验证 2.3 默认大小参数设置 2.4 根据参数调整边界位置 2.5 生成二进制图像 2.6 错误处理 2.7 总结 3 对二值图像边界…

【EAI 028】Video as the New Language for Real-World Decision Making

Paper Card 论文标题&#xff1a;Video as the New Language for Real-World Decision Making 论文作者&#xff1a;Sherry Yang, Jacob Walker, Jack Parker-Holder, Yilun Du, Jake Bruce, Andre Barreto, Pieter Abbeel, Dale Schuurmans 作者单位&#xff1a;Google DeepMi…

Sqli-labs靶场第16关详解[Sqli-labs-less-16]自动化注入-SQLmap工具注入

Sqli-labs-Less-16 #自动化注入-SQLmap工具注入 SQLmap用户手册&#xff1a;文档介绍 - sqlmap 用户手册 以非交互式模式运行 --batch 当你需要以批处理模式运行 sqlmap&#xff0c;避免任何用户干预 sqlmap 的运行&#xff0c;可以强制使用 --batch 这个开关。这样&#xff0…

如何使用恢复软件恢复删除的文件?回收站文件恢复攻略

随着计算机在日常生活中的普及&#xff0c;文件的管理和存储成为我们不可或缺的技能。在Windows操作系统中&#xff0c;回收站作为一个帮助我们管理文件删除的重要工具&#xff0c;在误删了一些重要文件之后&#xff0c;我们可能会因为找不到回收站中恢复的文件而感到困惑。本文…

动态规划DP之背包问题3---多重背包问题

目录 DP分析&#xff1a; 优化&#xff1a; 二进制优化 例题&#xff1a; 01背包是每个物品只有一个&#xff0c;完全背包问题是每个物品有无限个。 那么多重背包问题就是 每个物品有有限个。 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件&#xff0c;每件体…

安卓手机安装termux、kali linux及基本配置

相关阅读&#xff1a;Termux 高级终端安装使用配置教程 | 国光 百度安全验证 该文安装的 kali liunx 应该是简易版的&#xff0c;没有相关工具 一、下载安装termux 建议通过 f-droid 应用市场下载链接termux&#xff0c;点击即直接下载。 二、配置termux 1.更换镜像源 te…

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境&#xff0c;它们各自的定义、区别、联系以及实现的关键技术如下&#xff1a; 1. 开发环境&#xff08;Development Environment&#xff09…

深入理解Docker自定义网络:构建高效的容器网络环境

文章目录 一、docker自定义网络介绍1.1 docker自定义网络介绍1.2 使用技术的优势1.3 基本使用流程 二、实战操作2.1 模式理论介绍bridge模式(默认模式)host模式 2.2 模式特点查看桥接模式的特点查看仅主机模式的特点 2.3 实战操作bridge模式host模式自定义网络 一、docker自定义…

STM32单片机基本原理与应用(十)

汉字显示实验 显示原理 字库文件的实际上包含了每个汉字的模。单片机应用经常会用到液晶显示或者LED点阵屏&#xff0c;是用点阵的方式显示的&#xff0c;要显示汉字或字符的时候会用到字模&#xff0c;字模就是字在点阵上显示时对应的编码。以字模的方式存储图形或者文字&am…

【本科组冠名奖】2023年第八届数维杯数学建模挑战赛获奖感言

美国大学生数学建模竞赛已结束过半&#xff0c;现在又迎来了2024年第九届数维杯国赛&#xff0c;准备参加今年数维杯国赛的同学&#xff0c;今天我们一起看看去年优秀的选手都有什么获奖感言吧~希望能帮到更多热爱数学建模的同学。据说文末在看点赞的大佬都会直冲国奖呢&#x…

【.NET Core】.NET中的流(Stream)

【.NET Core】.NET中的流&#xff08;Stream&#xff09; 文章目录 【.NET Core】.NET中的流&#xff08;Stream&#xff09;一、流&#xff08;Stream&#xff09;1.1 FileStream类1.2 IsolatedStorageFileStream类1.3 MemoryStream类1.4 BufferedStream类1.5 NetworkStream类…

BUUCTF---[极客大挑战 2019]Http1

1.题目描述&#xff0c;在地址框输入下面的网址 2.来到页面&#xff0c;ctrlu查看源码&#xff0c;仔细观察会看到一个.php的跳转页面 3.点进去页面提示It doesnt come from https://Sycsecret.buuoj.cn 4.页面提示它不是来源于这个网址&#xff0c;我们需要用bp抓包对数据进行…

matlab 写入格式化文本文件

目录 一、save函数 二、fprintf函数 matlab 写入文本文件可以使用save和fprintf函数 save输出结果: fprintf输出结果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf输出结果更加人性化,符合要求,下面分别介绍。 一、save函数 …