![A 16:10 hero banner styled graphic featuring a clean, modern illustration. The background is subtle and uses glowing accents, circuit board traces, and digital symbols with blues, greens, and white colors. Vertical columns define main participants like "Card Reader", "ATM Interface", "Bank Server", and "Cash Dispenser" across the top. Arrows with numbered steps (1, 2, 3...) indicate the sequential flow of communication, beginning with a "Customer" actor on the left. Key sections highlight the main decision structures using "alt [PIN Invalid] / [PIN Valid]" and "alt [Insufficient Funds] / [Account Approved]", clearly detailing both successful and alternative paths of interaction. No product logos are included. At the very top center, the main title in clean fonts reads "BUILDING A ROBUST ATM SEQUENCE DIAGRAM" with a subtitle "STEP-BY-STEP PLANTUML GUIDE".](https://www.vpascode.com/wp-content/uploads/2026/08/atm-sequence-diagram-plantuml-guide.jpg)
设计系统性金融交易需要绝对的清晰度。无论你是设计银行引擎、记录遗留工作流程,还是培训工程团队,一个PlantUML顺序图是可视化系统组件之间时间有序交互的最有效方式之一。
在本教程中,我将带你详细了解我从零开始构建一个全面的ATM现金取款顺序图的完整构建过程,使用PlantUML。我们将涵盖参与者设置、消息流以及用于错误处理的嵌套条件分支——全部使用VPasCode,我们免费的代码化绘图工具以及在线PlantUML编辑器.

步骤1:设置标题和自动步骤编号
我总是通过建立清晰的全局配置来开始我的PlantUML图。在建模ATM取款等金融操作时,跟踪执行顺序对开发人员和审计人员都至关重要。
为了实现这一点,我首先使用@startuml标签,定义一个描述性标题,并启用autonumber功能。
@startuml
title ATM现金取款顺序图
autonumber
为什么要使用autonumber?如果没有自动编号,审阅者必须手动追踪序列线来理解顺序。强制使用顺序编号会自动为每个请求和响应编号,使得在架构评审过程中进行交叉引用变得完全轻松。
步骤2:定义参与者和系统组件
接下来,我识别参与交易的各个独立实体。我希望将人类参与者与后端组件和硬件子系统区分开来。
我不会让PlantUML在绘制消息时隐式声明参与者,而是显式地在顶部定义它们。这确保它们以逻辑的、从左到右的顺序出现,反映出它们的架构边界:
actor Customer
participant "ATM界面" as ATM
participant "读卡器" as Reader
participant "银行服务器" as Bank
participant "出钞器" as Dispenser
设计原理:
参与者 客户: 表示发起操作的人类用户。参与者 ... 作为 别名: 分配短别名,例如ATM,读卡器,以及银行可以使脚本其余部分保持简洁易读,而无需重复使用长的显示字符串。- 通过将
读卡器置于客户和ATM 界面,我准确地反映了在软件用户界面交互之前插入卡片的物理顺序。
步骤 3:建模初始认证流程
在声明参与者后,我开始绘制正常流程的初始化过程:插入卡片、读取数据、提示输入 PIN 码,并联系中央银行服务器。
客户 -> 读卡器:插入 ATM 卡
读卡器 -> ATM:读取卡片信息
ATM -> 客户:提示输入 PIN
客户 -> ATM:输入 PIN
ATM -> 银行:验证卡片和 PIN
请注意,同步消息使用实心箭头(->)。卡片硬件触发 ATM 软件,该软件提示用户,捕获输入,并将认证凭据安全地传递给银行服务器。
步骤 4:使用alt块来构建认证分支结构
现实世界中的系统会失败,因此顺序图必须明确传达错误条件。一旦 ATM 向银行请求验证,就会出现两种结果:认证失败或成功。
为了在 PlantUML 中表示条件逻辑,我使用一个alt / else / end 块:
alt PIN 无效
银行 --> ATM:认证失败
ATM -> 客户:显示“PIN无效”消息
ATM -> 读卡器:退卡
读卡器 --> 客户:归还卡片
else PIN 有效
银行 --> ATM:认证成功
ATM -> 客户:提示选择交易类型及金额
客户 -> ATM:选择“取款”并输入金额
ATM -> 银行:请求取款授权(金额)
...
end
使用的关键技术:
- 虚线返回箭头(
-->)表示异步响应消息返回给调用组件。 - 清晰的块标签,例如
[PIN 无效]和[PIN 有效]可立即告知软件开发人员异常流程如何终止(例如,显示错误、退卡和归还硬件)。
步骤5:账户授权与现金发放的嵌套逻辑
认证通过后,用户请求取款。然而,银行必须验证账户余额和每日限额。为了表示这一二级验证,我在“PIN 有效”分支内嵌套了第二个alt块,置于PIN 有效分支内。
如果资金不足,交易将安全终止。如果批准,银行将扣除账户余额,触发现金发放装置,交付现金,退卡,并提供可选的打印收据。
alt 资金不足 / 每日限额已超
银行 --> ATM:交易被拒绝
ATM -> 客户:显示错误消息
ATM -> 读卡器:退卡
读卡器 --> 客户:归还卡片
else 账户已批准
银行 -> 银行:扣除账户余额
银行 --> ATM:交易已批准
ATM -> 发放器:发放现金
发放器 --> ATM:现金就绪
ATM -> 客户:交付现金
客户 -> ATM:取走现金
ATM -> 读卡器:退卡
读卡器 --> 客户:归还卡片
ATM -> 客户:打印收据(可选)
end
专业提示: 注意内部调用Bank -> Bank: Debit Account Balance。PlantUML中的自引用箭头非常适合突出显示不涉及外部网络消息传递的内部后端状态更新。
完整的 PlantUML 脚本
以下是我们的ATM取款序列图的完整组装源代码。您可以直接将此代码复制粘贴到您喜欢的免费 PlantUML 编辑器中进行编辑或渲染矢量图形:
@startuml
title ATM取款序列图
autonumber
actor 客户
participant "ATM界面" as ATM
participant "读卡器" as Reader
participant "银行服务器" as Bank
participant "现金出纳器" as Dispenser
客户 -> 读卡器: 插入ATM卡
读卡器 -> ATM: 读取卡信息
ATM -> 客户: 提示输入PIN码
客户 -> ATM: 输入PIN码
ATM -> 银行: 验证卡号与PIN码
alt PIN无效
银行 --> ATM: 认证失败
ATM -> 客户: 显示“无效PIN码”消息
ATM -> 读卡器: 退卡
读卡器 --> 客户: 归还卡片
else PIN有效
银行 --> ATM: 认证成功
ATM -> 客户: 提示选择交易类型及金额
客户 -> ATM: 选择“取款”并输入金额
ATM -> 银行: 请求取款授权(金额)
alt 资金不足 / 每日限额已超
银行 --> ATM: 交易被拒绝
ATM -> 客户: 显示错误消息
ATM -> 读卡器: 退卡
读卡器 --> 客户: 归还卡片
else 账户已批准
银行 -> 银行: 扣除账户余额
银行 --> ATM: 交易批准
ATM -> 现金出纳器: 发放现金
现金出纳器 --> ATM: 现金准备就绪
ATM -> 客户: 展示现金
客户 -> ATM: 取走现金
ATM -> 读卡器: 退卡
读卡器 --> 客户: 归还卡片
ATM -> 客户: 打印收据(可选)
end
end
@enduml 
为什么使用VPasCode渲染你的序列图?
使用代码创建复杂图表不应需要繁琐的本地环境配置或手动命令行编译。VPasCode由Visual Paradigm推出,可直接在您的浏览器中实现即时渲染和强大的AI辅助功能:
- 自动格式识别:粘贴PlantUML、Mermaid、Graphviz或D2脚本——VPasCode可即时识别DSL格式并实时渲染。
- AI代码错误修复:遇到语法错误卡住了?点击“由AI修复”即可查看透明的并排差异对比,并自动修复语法错误。
- 多语言AI翻译:几秒钟内即可轻松翻译图表标签和消息,适用于国际技术团队。
- 高分辨率导出:下载清晰、可缩放的SVG矢量图形或高分辨率PNG图像,用于技术文档和演示文稿。



