markdown 目前已经成为轻量级编辑器的代表,依靠markdown可以解决日常生活中写文档的基本需求,并且对于一些日常使用的流程图和序列图也有一定的支持!目前本人使用的是 Typora 写个人文章,在公司内用的是飞书文档,基本都是markdown语法!而使用目前比较好用的ProcessOn(网页版)
、Visio/PowerPoint(microsoft)
、Draw.io(开源)
使用下来的体验就是文章和流程图分离!也就是导致使用体验大打折扣,目前飞书文档支持的PlantUML
很不错!我个人一般是PlantUML
和Mermaid
!
1. UML
1. 基本介绍
UML 是统一建模语言的简称,它是一种由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员阐明,展示,构建和记录软件系统的产出。UML代表了一系列在大型而复杂系统建模中被证明是成功的做法,是开发面向对象软件和软件开发过程中非常重要的一部分。UML主要使用图形符号来表示软件项目的设计,使用UML可以帮助项目团队沟通、探索潜在的设计和验证软件的架构设计。以下我们将向您详细介绍什么是UML、UML的历史以及每个UML图类型的描述,辅之以UML示例。
2. 作用
- 为用户提供现成的、有表现力的可视化建模语言,主要就是可视化,直观!!
- 逻辑思维的整理吧,如果你可以画图清晰的表述出逻辑,那么一定方案可执行会很好!
- 画图也是一门学问和技巧!
3. 分类
大概上有13种,下面我列出我们常用的!
1. 结构图
1. 类图 (Class Diagram)

2. 行为性图
1. 活动图 (Activity Diagram)
这里主要多了一个概念叫做泳道,泳道可以很好的隔离开流程!

2. 状态机图 (State Machine Diagram)
其实这个就和流程图!

3. 序列图 (Sequence Diagram)

2. 流程图 (Flow Chart)
markdown 支持流程图(Flow Chart) 是用的开源的 flowchart 语法进行的支持! 流程图一般是用来清晰的表达出流程逻辑的一个可视化工具,比如你要跟同事沟通一个技术方案,你文档文字写的满满的,但是导致有些专业性的隔阂或者你表述不清晰,导致同事很难理解你在说什么,这时候可能就需要流程图进行弥补下!
1. 简单语法介绍
流程图一般有几个关键的节点,也一般是开始和结束两个节点!其次是有多个不同类型的节点组成!具体可以看官方文档: flowchart
节点定义语法如 : 节点名称=>节点类型: 节点显示的内容[:> 超链接URL]
是空格敏感的!
1. 节点类型
节点类型主要有: 常用的其实就前5个
start (开始)
end (结束)
operation (操作节点,表示你要执行的步骤,比如平时顺序结构 步骤A->步骤B->步骤C)
condition (条件节点,表示判断条件)
inputoutput (输入输出节点,类似于前端的input框,输入个账户名称和密码之类的!)
subroutine(子流程,即表示一个流程,但是流程比较复杂,直接通过自流程代替,表示这块逻辑只是没有展开而已,其实很复杂!)
parallel (并行流,允许多个流程同时发生)
2. 流程控制
类型说明符:
基本操作流:
startVar(<direction>)->nextNode
direction
表示方位,有left、right、top、bottompreviousNode->endVar
operationVar(<direction>)->nextNode
inputoutputVar(<direction>)->nextNode
subroutineVar(<direction>)->nextNode
conditionalVar(yes, <direction>)->nextNode1
conditionalVar(no, <direction>)->nextNode2
parallel
控制流介绍
1 | parallelVar(path1, <direction>)->nextNode1 |
condition
控制流介绍
1 | @ 表示覆写描述,比如正在这个line上描述的是true,@可以覆写描述为 正确 |
3. 官方例子介绍
下图为官方介绍的流程图:
1 | st=>start: Start:>http://www.google.com[blank] |
展示效果如下:
2. 简单例子介绍
例如一个网关发布(分级发布)的前置流程,主要就是用户选择发布版本,然后进行判断,提交发布信息的流程,流程图如下:
我觉得flowchart
好处就是可以像写代码一样,清晰的描述流程图,要比 mermaid
实用的多!
1 | start=>start: 开始流程 |
3. PlantUML(UML)
markdown 支持时序图基本上用的都是 PlantUML ! 目前飞书文档支持使用 PlantUML
,但是我个人使用的typora
不支持,而且我的博客也不支持,所以目前主流的解决方案就是通过网站:https://g.gravizo.com/ 画 svg 实现!
不过可以配合 vscode
进行使用!不过我觉得PlantUML
渲染比较棒!
1 | @startuml; |

4. Mermaid (UML)
1. 流程图(flowchart)
- 头部需要定义
graph|flowchart [direction]
, 其中direction
主要由LR
和TB
组合上下左右! - 内容部分只需要定义流程即可
a --> b --> c
表示 顺序引用a --> |注释|b
表示 a -> b 中间需要加注释a(show_name)
表示 a需要通过show_name
进行展示,也就是节点内容
- 单向箭头主要有
-->
实线,-.->
虚线,==>
加粗线; 双向箭头就是<==>
和…, 无箭头是==
,很形象! - 节点可以通过
{condition name}
和[operation name]
和(start|end name)
和((multi condition name))
进行渲染形状! - 和上面我们讲的
flowchart
区别就是他不需要再去定义节点了!但是这个流程图定义的并不严格!
1. 普通流程图
例子1:
1 | graph LR |
graph LR a-->|注释|b(开始结束类型)-->c[operation类型] -->d{condition类型} -.->|虚线|e((圆型节点))==>|加粗线|f <--> |双向箭头|g(end)
例子2:
1 | graph LR |
graph LR A{A} --> |a->b普通线|B(B) B --> C --> F((F)) --> |输入|G>G] --> D C --> D A ==> |a->d block|D(D) A --> |a->e 注释|E[e注释] E -.-> |e-d 虚线|D
例子3:
1 | flowchart LR |
flowchart LR A[Hard] <-->|Text| B(Round) B --> C{Decision} C -->|One| D[Result 1] C -->|Two| E[Result 2]
例子4: 可以通过关键字 &
来表示 a->c
, b->d
, c->d
1 | flowchart LR |
flowchart LR a --> b & c--> d
2. 子图表
可以通过 subgraph 名称
+end
关键字来构建子图标,你可以理解为就是加了个框框!可以区分流程图
1 | graph LR |
graph LR a(a) --> b subgraph one模块 b --> c end c --> d subgraph two模块 d --> e end e --> f(f)
2. 序列图 (Sequence Diagram)
时序图由简称UML
图,
- 首先需要定义参与者:
participant [name] as [show_name]
或者直接participant name
, 或者可以直接不定义participant
- 连接线:
->>
实线,-->>
虚线,一般请求用实线,return 用虚线, -
+
和-
表示加入会话[activate]和结束会话[deactivate],例如a -> + b
表示b开启会话(会话是俩人都可以开启的,这个a->>+b
只是表示b开启,如果a也要开启,需要activate a
),例如activate a
表示a开启会话! - 添加node:
Note 位置描述 参与者: 标注文字
1 | over a,b,c 多个人 |
1. 普通序列图
例子一:
1 | sequenceDiagram |
sequenceDiagram participant Alice as Alice # 定义参与者: participant [name] as [show_name] participant John # 定义参与者: participant [name] Alice->> + John: Hello John, how are you? # 表示和john进行会话,同时a和j开始会话 John-->> Alice: Great! Note over John,Alice: note: 嘻嘻嘻,over 😊! # 表示添加注释 Note left of John: note: 嘻嘻嘻, left 😊! Note right of John: note: 嘻嘻嘻, wright 😊! Alice->> John: Hi John, I can hear you! John-->> - Alice: I feel great! # 表示john断开了会话
2. 序列图例子
例子2:
1 | sequenceDiagram |
sequenceDiagram participant fe as 小程序 participant service as 服务器 participant wx_service as 微信服务器 loop 失败重试 fe ->> fe: wx.login()获取code end fe ->> service: wx.request() 发送code activate service service ->> wx_service: 发送code+appid+签名 activate wx_service wx_service -->> service: 返回code id deactivate wx_service service ->> service: 生成token service -->> fe: 返回token deactivate service