PlantUML - 时序图
时序图主要内容
下面是一个简单的时序图,我们可以很容易并且美观的表达我们的交互流程,只需要在箭头的两边指定一个名字,加上描述即可:
@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

相关文章:
PlantUML - 时序图
时序图主要内容 下面是一个简单的时序图,我们可以很容易并且美观的表达我们的交互流程,只需要在箭头的两边指定一个名字,加上描述即可: startuml bkloanapply -> bkloanapprove : request bkloanapprove --> bkloanapply :…...
VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行
VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行功能,即滚动 UI 显示当前源代码范围。便于在代码行数比较多的时候更好的知道自己所在的位置。粘性滚动UI 显示用户在滚动期间所处的范围,将显示编辑器顶部所在的类/接口/命名空间/函数/方法/构造函数&a…...
Java中的List
List集合的特有方法 方法介绍 方法名描述void add(int index,E element)在此集合中的指定位置插入指定的元素E remove(int index)删除指定索引处的元素,返回被删除的元素E set(int index,E element)修改指定索引处的元素,返回被修改的元素E get(int inde…...
Spring 框架模块深度解析:核心容器、数据访问、Web 层与其他关键模块
Spring 可能成为您的所有企业应用程序的一站式商店。但是,Spring 是模块化的,允许您挑选适用于您的模块,而无需引入其他模块。下面的部分提供了 Spring Framework 中所有可用模块的详细信息。Spring Framework 提供了大约20个模块,…...
前端配置开发环境,新电脑配置前端开发环境,Vue开发环境配置的详细过程(前端开发环境配置,电脑重置后配置前端开发环境)
简介:有时候,我们需要在新电脑 或者 电脑重置后,配置前端开发环境,具体都需要安装什么软件和插件,这里来记录一下(文章适合新手和小白,大佬可以带过)。 ✨前端开发环境,需…...
大模型(LLM)的量化技术Quantization原理学习
在自然语言处理领域,大型语言模型(LLM)在自然语言处理领域的应用越来越广泛。然而,随着模型规模的增大,计算和存储资源的需求也急剧增加。为了降低计算和存储开销,同时保持模型的性能,LLM大模型…...
2024.03.01作业
1. 基于UDP的TFTP文件传输 #include "test.h"#define SER_IP "192.168.1.104" #define SER_PORT 69 #define IP "192.168.191.128" #define PORT 9999enum mode {TFTP_READ 1,TFTP_WRITE 2,TFTP_DATA 3,TFTP_ACK 4,TFTP_ERR 5 };void get_…...
力扣hot100:42.接雨水
什么时候能用双指针? (1)对撞指针: ①两数和问题中可以使用双指针,先将两数和升序排序,可以发现规律,如果当前两数和大于target,则右指针向左走。 ②接雨水问题中,左边最…...
搜索回溯算法(DFS)1------递归
目录 简介: 递归问题解题的思路模板 例题1:汉诺塔 例题2:合并两个有序链表 例题3:反转链表 例题4:两两交换链表中的节点 例题5:Pow(x,n)-快速幂 结语: 简介&…...
workstation 用途
一 workstation 用途 强大的桌面虚拟化 允许创造多种操作系统可以不用重启就跨不同操作系统进行操作可以提供隔离的安全环境 连接到vsphere 可以远程登陆服务器管理物理主机和虚拟主机任何时间都可登陆提高虚拟机效率 为任何平台开发和测试 1)借助一台单一本地…...
【三维重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM(CVPR 2024)
题目:SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址:spla-tam.github.io 机构:CMU(卡内基梅隆大学)、MIT(美国麻省理工) 总结:SplaTAM,一个新…...
Go Barrier栅栏
1. 简介 实现与pythonthreading.Barrier库类似的功能,多线程同时等待达到指定数量一起放行。 有待改进地方: wait方法没有支持context控制。 2. 代码 import ("context""golang.org/x/sync/semaphore""sync/atomic" …...
[蓝桥杯 2023 省 B] 冶炼金属
P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 参考题解: #C3150——蓝桥杯2023年第十四届省赛真题-冶炼金属(分块)-Dotcpp编程社区 https://www.bilibili.com/video/BV1wc411x7KU/?spm_id_from333.1007.top_right_bar_windo…...
续Java的执行语句、方法--学习JavaEE的day07
day07 一、特殊的流程控制语句 break(day06) continue 1.理解: 作用于循环中,表示跳过循环体剩余的部分,进入到下一次循环 做实验: while(true){ System.out.println(“111”); System.out.println(“222”); if(true){ conti…...
公网IP怎么获取?
公网IP是网络中设备的唯一标识符,用于在Internet上进行通信和定位。对于普通用户来说,了解如何获取自己的公网IP是很有必要的,本文将介绍几种获取公网IP的方法。 方法一:通过路由器查询 大多数家庭和办公室使用的路由器都会有一个…...
连接未来:探索嵌入式系统的智能化之路
连接未来:探索嵌入式系统的智能化之路 嵌入式系统的智能化是连接未来的关键之一。以下是对这一主题的小点论述: 1. 嵌入式系统的定义和特点 嵌入式系统是一种特殊用途的计算机系统,通常嵌入在其他设备中,具有小巧、低功耗、实时…...
基于STM32制作的示波器(可对任意信号进行描点)
基于STM32制作的示波器(可对任意信号进行描点) 注意:用的屏幕是TFT-LCD(MCU 屏)正点原子同款屏幕 液晶显示器,即 Liquid Crystal Display,利用了液晶导电后透光性可变的特性,配合显…...
WEB APIs (5)
window对象 BOM(浏览器对象模型) 其为js操作浏览器提供了方法 window对象是一个全局变量,是BOM树根节点 BOM的属性和方法都是window的,如document、console.log()等 var定义在全局全局作用域中的变量、函数都会变成window对象…...
物联网常见协议篇
在物联网环境中,物联网协议承担着关键作用,而新手了解物联网协议如传输协议、通讯协议和行业协议等。 一、物联网协议 物联网协议是物联网环境中的关键组成部分,它承担着设备间通信和数据传输的重要任务。这些协议根据其作用的不同ÿ…...
Kubernetes-1
学习Kubernetes第一天 k8s-11、什么是Kubernetes2、配置Kubernetes2.1、准备三台全新的虚拟机2.2、关闭防火墙和SElinux2.3、修改主机名2.4、升级操作系统(三台一起操作)2.5、配置主机hosts文件,相互之间通过主机名互相访问2.6、配置master和node之间的免密通道2.7、…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...

