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.mzph.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成员 概念 计算程序中创建出了多少个类…

力扣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/…

[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;表明其已具备从事相…

使用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;…

windows环境下Grafana+loki+promtail入门级部署日志系统,收集Springboot(Slf4j+logback)项目日志

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

动态规划DP之背包问题4---分组背包问题

目录 DP分析&#xff1a; 例题&#xff1a; 01背包&#xff1a; 一种物品只有一件 动态规划DP之背包问题1---01背包问题-CSDN博客 完全背包&#xff1a;一种物品有无限件 动态规划DP之背包问题2---完全背包问题-CSDN博客 多重背包&#xff1a;一种物品有有限…

【三维重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM(CVPR 2024)

题目&#xff1a;SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址&#xff1a;spla-tam.github.io 机构&#xff1a;CMU&#xff08;卡内基梅隆大学&#xff09;、MIT&#xff08;美国麻省理工&#xff09; 总结&#xff1a;SplaTAM&#xff0c;一个新…

十个勤天生菜原价4.9元被炒到300元,2024新商机!新兴创业项目!

近日&#xff0c;一则关于生菜价格暴涨的新闻引起了广泛关注。原价4.9元的生菜&#xff0c;在短短时间内被炒至300元&#xff0c;令人咋舌。在这背后&#xff0c;除了市场供需失衡、炒作等因素外&#xff0c;我们不禁思考&#xff1a;这样的现象背后是否隐藏着更大的商机&#…

LaTeX插入图片占位符

关于插入图片更多说明&#xff08;多图并排、子标题设置等&#xff09;可参考链接 LaTeX插入图片 插入图片占位符 参考链接&#xff1a;https://blog.csdn.net/yq_forever/article/details/129431799 在论文草稿阶段有的时候想先插入图片占位符拟定大纲或写作思路&#xff0…

张宇30讲学习笔记

初等数学 x \sqrt{x} x ​是算数平方根&#xff0c;一定≥0&#xff1b; x 2 \sqrt{x^2} x2 ​|x| x2|x2||x|2 x3≠|x3||x|3 不等式 a>0&#xff0c;b>0&#xff0c;则ab≥2 a b \sqrt{ab} ab ​ 对数 ln a b \frac{a}{b} ba​lna-lnb 高等数学 单调性 线性代数