当前位置: 首页 > news >正文

使用mermaid画流程图

本文介绍使用mermaid画流程图,并给出几个示例。

背景

目前,除有明确格式要求的文档外,笔者一般使用markdown写文档、笔记。当文档有图片时,使用Typora等软件可实时渲染,所见即所得。但如果文档接收方没有安装相关工具,效果则会大打折扣。Typora支持导出不同格式的文件。如果导出为pdf,对文字拷贝不友好。如果导出为word,格式不友好。

笔者的部分文档,shell命令、代码版本较多,因此选定html格式,体积小,方便浏览,但对图片不友好。但是,如果只是涉及流程图,则可以考虑用mermaid绘制。

笔者先前知道这个东西,但没用起来,最近因为一份非正式文档要发布于内网,且有流程图,于是用之,便有了本文。

实践

用法

在Typora中使用mermaid即可绘制流程图。语法如下:

```mermaid
graph TD
这里开始绘制
```

如果语法正确,即时可见效果,如出错,会有提示,示例如下:
在这里插入图片描述

下面列出画图的笔记。

graph TD 方向从上(Top)到下(Down)
direction LR:方向从左(Left)到右(Right)
开始([开始做事]):椭圆形,与程序流程图的开始、结束类似。子流程:%% 这是准备工作子流程subgraph 准备工作direction LR%%...end黄色虚线:
style 打道回府 fill:#FFFFF0,stroke-dasharray:5,stroke-width:2px,stroke:#000

示例:简单的登录流程(有判断条件)

代码:

graph TDA([开始]) --> B[输入用户名和密码]B --> C{验证成功?}C -->|是| D[进入主页]C -->|否| E[显示错误信息]D --> F([结束])E --> Bstyle A fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle F fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle C fill:#FFD2D2,stroke:#333,stroke-width:2px

效果图如下:

开始
输入用户名和密码
验证成功?
进入主页
显示错误信息
结束

示例 :订单处理流程(有判断条件)

代码:

graph TDA([开始]) --> B[接收订单]B --> C[检查库存]C --> D{库存充足?}D -->|是| E[确认订单]D -->|否| F[通知库存不足]E --> G[安排发货]G --> H([结束])F --> Hstyle A fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle H fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle D fill:#FFD2D2,stroke:#333,stroke-width:2px

效果图:

开始
接收订单
检查库存
库存充足?
确认订单
通知库存不足
安排发货
结束

示例 :产品发布流程

代码:

graph TDA([项目启动]) --> B[需求分析]B --> C[设计系统架构]C --> D[开发]D --> E[测试]E --> F{测试通过?}F -->|是| G[部署上线]F -->|否| H[修复问题]H --> EG --> I([项目结束])style A fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle I fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle F fill:#FFD2D2,stroke:#333,stroke-width:2px

效果图:

项目启动
需求分析
设计系统架构
开发
测试
测试通过?
部署上线
修复问题
项目结束

示例:有子流程图的流程

代码:

graph TD%% 这是准备工作子流程subgraph 准备工作direction LR准备1 --> 检查清单检查清单 --> 确认清单endsubgraph 工作阶段1direction LR阶段1开始 --> 阶段1结束endsubgraph 出发endsubgraph 工作阶段2direction LR阶段2开始 --> 阶段2事情1阶段2事情1 --> 一个事阶段2事情1 --> 另一个事endsubgraph 再次检查direction LR检查开始 --> 检查结束endsubgraph 打道回府direction LR收拾1 -.-> 收拾2end开始([开始做事]) --> 准备工作准备工作 --> 工作阶段1工作阶段1 --> 出发出发 --> 工作阶段2工作阶段2 --> 再次检查再次检查 --> 结束([结束做事])%% 虚拟结束([结束做事]) -.-> 打道回府%% 虚线style 打道回府 fill:#FFFFF0,stroke-dasharray:5,stroke-width:2px,stroke:#000

效果图:

graph TD%% 这是准备工作子流程subgraph 准备工作direction LR准备1 --> 检查清单检查清单 --> 确认清单endsubgraph 工作阶段1direction LR阶段1开始 --> 阶段1结束endsubgraph 出发endsubgraph 工作阶段2direction LR阶段2开始 --> 阶段2事情1阶段2事情1 --> 一个事阶段2事情1 --> 另一个事endsubgraph 再次检查direction LR检查开始 --> 检查结束endsubgraph 打道回府direction LR收拾1 -.-> 收拾2end开始([开始做事]) --> 准备工作准备工作 --> 工作阶段1工作阶段1 --> 出发出发 --> 工作阶段2工作阶段2 --> 再次检查再次检查 --> 结束([结束做事])%% 虚拟结束([结束做事]) -.-> 打道回府%% 虚线style 打道回府 fill:#FFFFF0,stroke-dasharray:5,stroke-width:2px,stroke:#000

部分markdown工具正确渲染,下面是效果图的截图。
在这里插入图片描述

示例:有主流程、详细流程的流程

代码:

graph TDsubgraph 主要流程A[开始做事] --> B[准备工作]B --> C[工作阶段1]C --> D[工作阶段2]D --> E[结束做事]endsubgraph 准备工作direction RLF[准备1]G[检查清单]H[再次检查清单]endsubgraph 工作阶段1direction RLI[阶段1开始]J[阶段1结束]K[出发]endsubgraph 工作阶段2direction RLL[阶段2开始]M[阶段2事情1]N[一个事]O[另一个事]endsubgraph 结束做事direction RLP[再次检查]Q[收拾1]R[收拾2]endB --> 准备工作C --> 工作阶段1D --> 工作阶段2E --> 结束做事style A fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle B fill:#DAE8FC,stroke:#333,stroke-width:2pxstyle C fill:#DAE8FC,stroke:#333,stroke-width:2pxstyle D fill:#DAE8FC,stroke:#333,stroke-width:2pxstyle E fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle F fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle G fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle H fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle I fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle J fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle K fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle L fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle M fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle N fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle O fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle P fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle Q fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle R fill:#FFF2CC,stroke:#333,stroke-width:2px

效果图:

graph TDsubgraph 主要流程A[开始做事] --> B[准备工作]B --> C[工作阶段1]C --> D[工作阶段2]D --> E[结束做事]endsubgraph 准备工作direction RLF[准备1]G[检查清单]H[再次检查清单]endsubgraph 工作阶段1direction RLI[阶段1开始]J[阶段1结束]K[出发]endsubgraph 工作阶段2direction RLL[阶段2开始]M[阶段2事情1]N[一个事]O[另一个事]endsubgraph 结束做事direction RLP[再次检查]Q[收拾1]R[收拾2]endB --> 准备工作C --> 工作阶段1D --> 工作阶段2E --> 结束做事style A fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle B fill:#DAE8FC,stroke:#333,stroke-width:2pxstyle C fill:#DAE8FC,stroke:#333,stroke-width:2pxstyle D fill:#DAE8FC,stroke:#333,stroke-width:2pxstyle E fill:#D5E8D4,stroke:#333,stroke-width:2pxstyle F fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle G fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle H fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle I fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle J fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle K fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle L fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle M fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle N fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle O fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle P fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle Q fill:#FFF2CC,stroke:#333,stroke-width:2pxstyle R fill:#FFF2CC,stroke:#333,stroke-width:2px

总结

鉴于实践经验少,因此画的流程图也少。从上文可以看到,有些图的样式不太美观,这需再细调。

另外,除那个有虚线的图是自己手工绘制外,其它均借用AI工具生成。

相关文章:

使用mermaid画流程图

本文介绍使用mermaid画流程图,并给出几个示例。 背景 目前,除有明确格式要求的文档外,笔者一般使用markdown写文档、笔记。当文档有图片时,使用Typora等软件可实时渲染,所见即所得。但如果文档接收方没有安装相关工具…...

大模型笔记:pytorch实现MOE

0 导入库 import torch import torch.nn as nn import torch.nn.functional as F 1 专家模型 #一个简单的专家模型,可以是任何神经网络架构 class Expert(nn.Module):def __init__(self, input_size, output_size):super(Expert, self).__init__()self.fc nn.L…...

HAL库USART中断接收的相关问题

文章目录 一、使用中断的步骤二、相关函数分析1、HAL_UART_IRQHandler2、UART_Receive_IT3、HAL_UART_Receive_IT4、UART_Start_Receive_IT5、总结 三、HAL库使用心得 一、使用中断的步骤 1、配置GPIO 2、配置USART1 3、设置UART1中断优先级(不开启手动中断&#x…...

@Transational事务注解底层原理以及什么场景事务会失效

Transactional的底层是如何实现的 底层是通过动态代理实现的。Spring Boot 在运行时会生成一个代理对象,该代理对象被注解的方法调用,并在方法调用前后进行事务管理,事务管理包括开启事务,提交事务或回滚事务等操作。 1开启事务 …...

Linux扩容磁盘

启动 fdisk sudo fdisk /dev/sda输入p命令查询分区列表 输入d命令删除所有分区 需要一个一个删 输入n命令创建新分区 40G可以不用输入,直接回车使用默认 输入w命令保存操作 查看分区情况 sudo fdisk -l会发现sda1不是启动分区(Boot列不是号&a…...

全面解析鸿蒙(HarmonyOS)开发:从入门到实战,构建万物互联新时代

文章目录 引言 一、鸿蒙操作系统概述二、鸿蒙开发环境搭建三、鸿蒙核心开发技术1. **ArkUI框架**2. **分布式能力开发**3. **原子化服务与元服务** 四、实战案例:构建分布式音乐播放器五、鸿蒙开发工具与调试技巧六、鸿蒙生态与未来展望结语 引言 随着万物互联时代…...

Uniapp 原生组件层级过高问题及解决方案

文章目录 一、引言🏅二、问题描述📌三、问题原因❓四、解决方案💯4.1 使用 cover-view 和 cover-image4.2 使用 subNVue 子窗体4.3 动态隐藏原生组件4.4 使用 v-if 或 v-show 控制组件显示4.5 使用 position: fixed 布局 五、总结&#x1f38…...

Android adb测试常用命令大全

目录 一、查看最上层成activity名字: 二、查看Activity的任务栈: 三、获取安装包信息 四、性能相关 1、显示CPU信息 : 2、查看CPU使用信息 3、内存信息(meminfo package_name or pid 使用程序的包名或者进程id显示内存信息) 4、电量信…...

linux的基础入门2

linux的root用户 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中,拥有最大权限的账户名为:root(超级管理员) 而在前期,我们一直使用的账户是普通的用户 普通用户的权限,一般在其HOME目录内是不受限的 一旦出了HOME目录…...

19.4.8 数据库综合运用

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 本节中将通过实例综合展示对数据表的查询、增加、修改和删除。 【例 19.16】【项目&#xf…...

JAVA中的抽象学习

一、Java SE 中的抽象概念 在 Java 中,抽象(Abstraction)是面向对象编程的重要特性之一。抽象的核心思想是“只关注重要的特性,而忽略不重要的细节”。抽象通常通过抽象类和接口来实现,它帮助开发者将复杂的系统隐藏在…...

在 Go 中实现事件溯源:构建高效且可扩展的系统

事件溯源(Event Sourcing)是一种强大的架构模式,它通过记录系统状态的变化(事件)来重建系统的历史状态。这种模式特别适合需要高可扩展性、可追溯性和解耦的系统。在 Go 语言中,事件溯源可以通过一些简单的…...

加解密 | AES加、解密学习

加解密 | AES加、解密学习 你的代码实现了一个简单的AES(高级加密标准)加密和解密的测试程序。以下是对代码的分析和一些改进建议: 代码功能 初始化数据和密钥: 定义了一个16字节的输入数据 input_data。定义了一个16字节的AES…...

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】CSS样式解析:行内、内部与外部样式的区别与优先级分析

简介 2025年计算机视觉研究进展与应用(ACVRA 2025)将于2025年2月28-3月2日在中国广州召开,会议将汇聚世界各地的顶尖学者、研究人员和行业专家,聚焦计算机视觉领域的最新研究动态与应用成就。本次会议将探讨前沿技术,…...

MongoDB 基本操作

一、数据库操作 1. 切换或创建数据库 使用use命令切换到指定数据库,若该数据库不存在,在首次插入数据时会自动创建。 use myDatabase 2. 查看所有数据库 使用show dbs命令查看 MongoDB 实例中的所有数据库。 show dbs 3. 删除当前数据库 使用db.…...

Eclipse JSP/Servlet 深入解析

Eclipse JSP/Servlet 深入解析 引言 随着互联网的快速发展,Java Web开发技术逐渐成为企业级应用开发的主流。在Java Web开发中,JSP(JavaServer Pages)和Servlet是两个核心组件,它们共同构成了Java Web应用程序的基础。本文将深入解析Eclipse平台下的JSP/Servlet技术,帮…...

Hyperledger caliper 性能测试

前言:Hyperledger caliper 的本质是使用node对被测试网络进行压力测试,因此需要nodejs。本次使用 Hyperledger caliper 0.5 对 fabric 1.4.6进行压测 准备条件:nodejs 16 (略 linux下 解压环境变量即可) # 创建工作…...

Record-Mode 备案免关站插件,让 WordPress 备案不影响 SEO 和收录

专为 WordPress 网站设计的实用工具,旨在帮助网站在备案期间无需关闭即可正常收录所有页面的信息,利于SEO。 功能特性 免关站展示:开启插件后,非管理员用户访问网站时,会看到以半透明遮罩层或不透明全屏遮罩样式呈现的…...

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透?怎么解决?2. 你能介绍一下布隆过滤器吗?3. 什么是缓存击穿?怎么解决?4. 什么是缓存雪崩?怎么解决?5. redis做为缓存,mysql的数据如何与redis进行同步呢&…...

介绍几款免费的显示器辅助工具!

今天为大家介绍几款实用的显示器辅助软件,它们可以帮助你轻松切换显示源调节、显示器亮度,甚至优化显示效果,让你的屏幕使用体验更加便捷和舒适。 Monitor Brightness Adjuster-多屏幕亮度调节工具 如果你需要同时使用多个显示器&#xff0…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...