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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/425639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 刷题 [C++] 第215题.数组中的第K个最大元素

题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 题目分析 根据题意分析&…

C++入门和基础

目录 文章目录 前言 一、C关键字 二、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.3 标准命名空间 三、C输入&输出 四、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的分类 五、函数重载 5.1 函数重载的简介 5.2 函数重载的分类 六、引用 6.1 引用的…

WordPress介绍(开源内容管理系统(CMS),一个用于构建和管理网站的平台)

文章目录 Introduction to WordPress: Powering the Web with Simplicity and Flexibility&#xff08;WordPress简介&#xff1a;以简洁和灵活性驱动万维网&#xff09;Overview of WordPress&#xff08;WordPress概述&#xff09;Evolution of WordPress&#xff08;WordPre…

华为od机试C卷-最长表达式求值

1 题目描述 提取字符串中的最长合法简单数学表达式子串&#xff0c;字符串长度最长的&#xff0c;并计算表达式的值&#xff0c;如果没有返回0。简单数学表达式只能包含以下内容0-9 数字&#xff0c;符号* 说明: 1.所有数字&#xff0c;计算结果都不超过 long 2.如果有多个长…

基于yolov5的草莓成熟度检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的草莓成熟度检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的草莓成熟度系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目…

【XIAO ESP32S3 sense 通过 ESPHome 与 Home Assistant 连接】

XIAO ESP32S3 sense 通过 ESPHome 与 Home Assistant 连接 1. 什么是 ESPHome 和 Home Assistant&#xff1f;2. 软件准备3. 开始4. 将 Grove 模块与 ESPHome 和 Home Assistant 连接5. Grove 连接和数据传输6. Grove -智能空气质量传感器 &#xff08;SGP41&#xff09;7. OV2…

自学Python笔记总结(2——了解)

网络了解 网络调试助手 NetAssist.exe NetAssist.exe 使用方法请自行寻找 UDP协议 &#xff08;只能一来一回的的发消息&#xff0c;不可连续发送&#xff09; UDP 是User Datagram Protocol的简称&#xff0c; 中文名是用户数据报协议。在通信开始之前&#xff0c;不需要建…

【JavaEE】_Spring MVC 项目传参问题

目录 1. 传递单个参数 1.1 关于参数名的问题 2. 传递多个参数 2.1 关于参数顺序的问题 2.2 关于基本类型与包装类的问题 3. 使用对象传参 4. 后端参数重命名问题 4.1 关于RequestPara注解 1. 传递单个参数 现创建Spring MVC项目&#xff0c;.java文件内容如下&#xff…

Kubernetes-1

学习Kubernetes第一天 k8s-11、什么是Kubernetes2、配置Kubernetes2.1、准备三台全新的虚拟机2.2、关闭防火墙和SElinux2.3、修改主机名2.4、升级操作系统(三台一起操作)2.5、配置主机hosts文件&#xff0c;相互之间通过主机名互相访问2.6、配置master和node之间的免密通道2.7、…

sql 行列互换

在SQL中进行行列互换可以使用PIVOT函数。下面是一个示例查询及其对应的结果&#xff1a; 创建测试表格 CREATE TABLE test_table (id INT PRIMARY KEY,name VARCHAR(50),category VARCHAR(50) );向测试表格插入数据 INSERT INTO test_table VALUES (1, A, Category A); INSE…

关键因素:公司并购或拆分后的SAP数据迁移成功执行要点

合并、收购和资产剥离对CIO和CFO来说都是一项艰巨的任务&#xff1b;它们在业务和技术方面都具有很大影响力&#xff0c;企业并购或拆分在数据迁移方面需要考虑哪些关键因素&#xff1f; 在迁移中构建自动化 先确定要迁移、集成或剥离的SAP系统和数据集&#xff0c;然后执行这…

Notepad3:告别Windows记事本,轻松进行文本编辑

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、什么是Notepad3&#xff1f;①Notepad3②核…

【bioinformation 2】生物数据库

&#x1f31e;欢迎来到AI医学的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年3月3日&…

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

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

【c++】继承深度解剖

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么事继承&#xff0c;基类和派生类的使用和…

C语言题目讲解

一&#xff1a;力扣485. 最大连续 1 的个数 1.题目&#xff1a; 2.思路分析 先设定两个变量&#xff0c;一个变量&#xff08;ret_e&#xff09;用来存连续的1的个数&#xff0c;当nums[i]为0时&#xff0c;该变量就置为0&#xff0c;当nums【i】为1时&#xff0c;再重新&…

Spring中的数据校验---JSR303

介绍–什么是JSR303 JSR 303是Java中的一项规范&#xff0c;用于定义在Java应用程序中执行数据校验的元数据模型和API。JSR 303的官方名称是"Bean Validation"&#xff0c;它提供了一种在Java对象级别上执行验证的方式&#xff0c;通常用于确保输入数据的完整性和准…

训练2布线 玛露希尔

前言 这不是雕刻 是布线纹理绘制blender材质渲染 2D 3D 起手式 八点眼 侧峰线 三角鼻(三面鼻) 下颚角 额, 嘴 线 法令环 橄榄嘴

【LeetCode】升级打怪之路 Day 12:单调队列

今日题目&#xff1a; 239. 滑动窗口最大值 | LeetCode 今天学习了单调队列这种特殊的数据结构&#xff0c;思路很新颖&#xff0c;值得学习。 Problem&#xff1a;单调队列 【必会】 与单调栈类似&#xff0c;单调队列也是一种特殊的数据结构&#xff0c;它相比与普通的 que…

SpringBoot3-核心原理

1. 事件和监听器 1. 生命周期监听 场景&#xff1a;监听应用的生命周期 1. 监听器-SpringApplicationRunListener 自定义SpringApplicationRunListener来监听事件&#xff1b; 编写SpringApplicationRunListener 实现类在 META-INF/spring.factories 中配置 org.springfram…