C4图
:目前这是一个实验性的图表。语法和属性可能会在未来版本中发生更改,当语法稳定后,将提供适当的文档说明。
CSDN
目前版本(mermaid v8.14.0
)不支持此语法,以下所有示例都是在mermaid v9.4.0
进行测试。
Mermaid
的C4图
语法与plantUML
兼容。以下是示例:
** 代码:**
C4Context
title 互联网银行系统的系统上下文图
Enterprise_Boundary(b0, "企业边界") {
Person(customerA, "标签:银行客户A", "描述:银行的客户,拥有个人银行账户。")
Person(customerB, "标签:银行客户B")
Person_Ext(customerC, "标签:银行客户C", "描述:小微企业代表")
Person(customerD, "标签:银行客户D", "描述:银行的客户,
拥有个人银行账户。")
System(SystemAA, "标签:互联网银行系统", "描述:允许客户查看有关其银行账户的信息并进行付款。")
Enterprise_Boundary(b1, "标签:银行企业边界") {
SystemDb_Ext(SystemE, "标签:银行主系统", "描述:存储关于客户、账户、交易等所有核心银行信息的系统。")
System_Boundary(b2, "标签:银行系统边界") {
System(SystemA, "标签:银行系统A")
System(SystemB, "标签:银行系统B", "描述:一种银行系统,带有个人银行账户。")
}
System_Ext(SystemC, "标签:电子邮件系统", "描述:微软Exchange内部电子邮件系统。")
SystemDb(SystemD, "标签:银行数据库系统D", "描述:一种银行系统,带有个人银行账户")
Boundary(b3, "标签:银行队列系统边界", "描述:队列系统") {
SystemQueue(SystemF, "标签:银行队列系统F", "描述:一种银行系统。")
SystemQueue_Ext(SystemG, "标签:银行队列系统G", "描述:一种银行系统,带有个人银行账户。")
}
}
}
BiRel(customerA, SystemAA, "标签:交互")
BiRel(SystemAA, SystemE, "标签:交互")
Rel(SystemAA, SystemC, "标签:创建邮件任务", "技术:SMTP")
Rel(SystemC, customerA, "标签:发送邮件到")
UpdateElementStyle(customerA, $fontColor="red", $bgColor="grey", $borderColor="red")
UpdateRelStyle(customerA, SystemAA, $textColor="blue", $lineColor="blue", $offsetX="5")
UpdateRelStyle(SystemAA, SystemE, $textColor="blue", $lineColor="blue", $offsetY="-10")
UpdateRelStyle(SystemAA, SystemC, $textColor="blue", $lineColor="blue", $offsetY="-40", $offsetX="-50")
UpdateRelStyle(SystemC, customerA, $textColor="red", $lineColor="red", $offsetX="100", $offsetY="20")
UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="1")
例如,要查看源代码演示demos/index.html
的示例。
支持5种类型的C4图表。
C4图是固定样式,如css颜色,因此不提供不同的css在不同的皮肤下。 updateElementStyle
和UpdateElementStyle
是在图表的最后一部分编写的。 updateElementStyle
与原始定义不一致,并更新关系的样式,包括相对于原始位置的文本标签的偏移量。
布局不使用完全自动化的布局算法。通过更改语句编写的顺序来调整形状的位置。因此,没有计划支持以下布局语句。可以使用UpdateLayoutConfig来调整每行中的形状数量和边界数量。
以下未完成的功能短期内不受支持。
sprite
tags
link
Legend
系统上下文
Person(alias, label, ?descr, ?sprite, ?tags, $link)
:人物。通常渲染为深蓝色
背景带有人物符号的矩形框Person_Ext
:人物(已存在),参数与 Person
函数一致。通常渲染为灰色
背景带有人物符号的节点。System(alias, label, ?descr, ?sprite, ?tags, $link)
:系统。通常渲染为蓝色
矩形框SystemDb
:数据库系统,参数与 System
函数一致。通常渲染为蓝色
立式圆柱。SystemQueue
:队列系统,参数与 System
函数一致。通常渲染为蓝色
横式圆柱。System_Ext
:普通系统(已存在),参数与 System
函数一致。通常渲染为灰色
矩形。SystemDb_Ext
:数据库系统(已存在),参数与 System
函数一致。通常渲染为灰色
立式圆柱。SystemQueue_Ext
:队列系统(已存在),参数与 System
函数一致。通常渲染为灰色
横式圆柱。Boundary(alias, label, ?type, ?tags, $link)
:边界。默认type
为system
通常渲染为虚线框。Enterprise_Boundary(alias, label, ?tags, $link)
:企业的边界。type
为ENTERPRISE
通常渲染为虚线框。System_Boundary
:系统的边界。通常渲染为虚线框。容器图
Container(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
: 普通容器。通常渲染为蓝色
矩形框。ContainerDb
: 数据库容器,参数与 Container
函数一致。通常渲染为蓝色
立式圆柱。ContainerQueue
: 队列容器,参数与 Container
函数一致。通常渲染为蓝色
横式圆柱。Container_Ext
: 普通容器(已存在),参数与 Container
函数一致。通常渲染为灰色
矩形。ContainerDb_Ext
: 数据库容器(已存在),参数与 Container
函数一致。通常渲染为灰色
立式圆柱。ContainerQueue_Ext
: 队列容器(已存在),参数与 Container
函数一致。通常渲染为灰色
横式圆柱。Container_Boundary(alias, label, ?tags, $link)
:容器的边界。通常渲染为虚线框。组件图
Component(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
: 普通组件。通常渲染为浅蓝色
矩形。ComponentDb
: 数据库组件,参数与 Component
函数一致。通常渲染为浅蓝色
立式圆柱。ComponentQueue
: 队列组件,参数与 Component
函数一致。通常渲染为浅蓝色
横式圆柱。Component_Ext
: 普通组件(已存在),参数与 Component
函数一致。通常渲染为灰色
矩形。ComponentDb_Ext
: 数据库组件(已存在),参数与 Component
函数一致。通常渲染为灰色
立式圆柱。ComponentQueue_Ext
: 队列组件(已存在),参数与 Component
函数一致。通常渲染为灰色
横式圆柱。动态图
RelIndex(index, from, to, label, ?tags, $link)
:单边关系,渲染效果与Rel
一致。index
不是显示的序号,序列号是由rel
声明的顺序决定的。部署图
Deployment_Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link)
Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link)
:Deployment_Node()
的简称Node_L(alias, label, ?type, ?descr, ?sprite, ?tags, $link)
:左对齐Node()
Node_R(alias, label, ?type, ?descr, ?sprite, ?tags, $link):
右对齐Node()
关系类型
Rel(from, to, label, ?techn, ?descr, ?sprite, ?tags, $link)
: 单边关系。通常渲染为从from
指向to
的箭头BiRel
: 双向关系,参数与 Rel
函数一致。通常渲染为从from
指向to
以及从to
指向from
的双向箭头。Rel_U
,Rel_Up
:单边关系,参数与 Rel
函数一致。渲染效果与Rel
一致。Rel_D
,Rel_Down
:单边关系,参数与 Rel
函数一致。渲染效果与Rel
一致。Rel_L
,Rel_Left
:单边关系,参数与 Rel
函数一致。渲染效果与Rel
一致。Rel_R
,Rel_Right
:单边关系,参数与 Rel
函数一致。渲染效果与Rel
一致。Rel_Back
: 反向单边关系,参数与 Rel
函数一致。通常渲染为从to
指向from
的箭头RelIndex *
与C4-Plantuml
语法兼容,但忽略索引参数。序列号是由rel
声明的顺序决定的。 自定义tags/stereotypes
支持和皮肤参数更新
AddElementTag(tagStereo, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite)
:引入新的元素标签。已标记元素的样式将更新,并在计算出的图例中显示标签。AddRelTag(tagStereo, ?textColor, ?lineColor, ?lineStyle, ?sprite, ?techn, ?legendText, ?legendSprite)
:引入新的关系标签。已标记关系的样式将得到更新,并在计算的图例中显示标签。UpdateElementStyle(elementName, ?bgColor, ?fontColor, ?borderColor, ?shadowing, ?shape, ?sprite, ?techn, ?legendText, ?legendSprite)
:此调用更新元素(组件等)的默认样式,并不创建其他图例条目。UpdateRelStyle(from, to, ?textColor, ?lineColor, ?offsetX, ?offsetY)
:此调用更新默认关系颜色,并不创建其他图例条目。添加了两个新参数offsetX
和offsetY
来设置文本原始位置的偏移量。RoundedBoxShape()
:此调用返回圆形框架的名称,并可用作?shape
参数。EightSidedShape()
:此调用返回八边形的名称,并可用作?shape
参数。DashedLine()
:此调用返回虚线的名称,并可用作?lineStyle
参数。DottedLine()
:此调用返回点线的名称,并可用作?lineStyle
参数。BoldLine()
:此调用返回粗体线的名称,并可用作?lineStyle
参数。UpdateLayoutConfig(?c4ShapeInRow, ?c4BoundaryInRow)
:新。此调用更新默认c4ShapeInRow(4)和c4BoundaryInRow(2)。如:UpdateLayoutConfig($c4ShapeInRow="1",$c4BoundaryInRow="2")
参数含义及说明
参数 | 说明 |
---|---|
index | 序号 |
alias | 别名/变量名 |
label | 标签 |
type | 类型 |
techn | 技术 |
descr | 描述 |
sprite | 图文符号 |
tags | 标记 |
link | 链接 |
Legend | 图例 |
from | 头节点 |
to | 尾节点 |
bgColor | 背景颜色 |
fontColor | 字体颜色 |
borderColor | 边框颜色 |
shadowing | 阴影 |
shape | 形状 |
legendText | 图列文本 |
legendSprite | 图列图文符号 |
textColor | 文本颜色 |
lineColor | 线条颜色 |
offsetX | X方向偏移值 |
offsetY | Y方向偏移值 |
c4ShapeInRow | 一行显示的形状数量 |
c4BoundaryInRow | 一行显示的边界数量 |
有两种方法可以使用问号分配参数。一种是按参数顺序使用非命名参数分配方法,另一种是使用命名参数分配方法,其中名称必须以$
符号开头。
例如:UpdateRelStyle(from, to, ?textColor, ?lineColor, ?offsetX, ?offsetY)
UpdateRelStyle(customerA, bankA, "red", "blue", "-40", "60")
UpdateRelStyle(customerA, bankA, $offsetX="-40", $offsetY="60", $lineColor="blue", $textColor="red")
UpdateRelStyle(customerA, bankA, $offsetY="60")
** 代码:**
C4Context
title 互联网银行系统的系统上下文图
Enterprise_Boundary(b0, "企业边界") {
Person(customerA, "标签:银行客户A", "描述:银行的客户,拥有个人银行账户。")
Person(customerB, "标签:银行客户B")
Person_Ext(customerC, "标签:银行客户C", "描述:小微企业代表")
Person(customerD, "标签:银行客户D", "描述:银行的客户,
拥有个人银行账户。")
System(SystemAA, "标签:互联网银行系统", "描述:允许客户查看有关其银行账户的信息并进行付款。")
Enterprise_Boundary(b1, "标签:银行企业边界") {
SystemDb_Ext(SystemE, "标签:银行主系统", "描述:存储关于客户、账户、交易等所有核心银行信息的系统。")
System_Boundary(b2, "标签:银行系统边界") {
System(SystemA, "标签:银行系统A")
System(SystemB, "标签:银行系统B", "描述:一种银行系统,带有个人银行账户。")
}
System_Ext(SystemC, "标签:电子邮件系统", "描述:微软Exchange内部电子邮件系统。")
SystemDb(SystemD, "标签:银行数据库系统D", "描述:一种银行系统,带有个人银行账户")
Boundary(b3, "标签:银行队列系统边界", "描述:队列系统") {
SystemQueue(SystemF, "标签:银行队列系统F", "描述:一种银行系统。")
SystemQueue_Ext(SystemG, "标签:银行队列系统G", "描述:一种银行系统,带有个人银行账户。")
}
}
}
BiRel(customerA, SystemAA, "标签:交互")
BiRel(SystemAA, SystemE, "标签:交互")
Rel(SystemAA, SystemC, "标签:创建邮件任务", "技术:SMTP")
Rel(SystemC, customerA, "标签:发送邮件到")
UpdateElementStyle(customerA, $fontColor="red", $bgColor="grey", $borderColor="red")
UpdateRelStyle(customerA, SystemAA, $textColor="blue", $lineColor="blue", $offsetX="5")
UpdateRelStyle(SystemAA, SystemE, $textColor="blue", $lineColor="blue", $offsetY="-10")
UpdateRelStyle(SystemAA, SystemC, $textColor="blue", $lineColor="blue", $offsetY="-40", $offsetX="-50")
UpdateRelStyle(SystemC, customerA, $textColor="red", $lineColor="red", $offsetX="-50", $offsetY="20")
UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="1")
** 代码:**
C4Container
title 网上银行系统容器图
System_Ext(email_system, "标签:电子邮件系统", "描述:内部 Microsoft Exchange 系统。", $tags="v1.0")
Person(customer, "标签:客户", "描述:银行的客户,拥有个人银行账户。", $tags="v1.0")
Container_Boundary(c1, "网上银行") {
Container(spa, "标签:单页面应用", "技术:JavaScript, Angular", "描述:通过网络浏览器向客户提供所有的网上银行功能。")
Container_Ext(mobile_app, "标签:移动应用", "技术:C#, Xamarin", "描述:通过客户的移动设备为其提供有限的网上银行功能子集。")
Container(web_app, "标签:Web应用程序", "技术:Java, Spring MVC", "描述:提供静态内容和网上银行单页面应用(SPA)。")
ContainerDb(database, "标签:数据库", "技术:SQL Database", "描述:存储用户注册信息、哈希认证凭据、访问日志等。")
ContainerDb_Ext(backend_api, "标签:接口应用程序", "技术:Java, Docker Container", "描述:通过API提供网上银行功能。")
}
System_Ext(banking_system, "标签:银行主系统", "描述:存储关于客户、账户、交易等所有核心银行信息。")
Rel(customer, web_app, "标签:使用", "技术:HTTPS")
UpdateRelStyle(customer, web_app, $offsetY="60", $offsetX="90")
Rel(customer, spa, "标签:使用", "技术:HTTPS")
UpdateRelStyle(customer, spa, $offsetY="-40")
Rel(customer, mobile_app, "标签:使用")
UpdateRelStyle(customer, mobile_app, $offsetY="-30")
Rel(web_app, spa, "Delivers")
UpdateRelStyle(web_app, spa, $offsetX="130")
Rel(spa, backend_api, "标签:使用", "技术:async, JSON/HTTPS")
Rel(mobile_app, backend_api, "标签:使用", "技术:async, JSON/HTTPS")
Rel_Back(database, backend_api, "标签:读取和写入", "技术:sync, JDBC")
Rel(email_system, customer, "标签:发送电子邮件")
UpdateRelStyle(email_system, customer, $offsetX="-45")
Rel(backend_api, email_system, "标签:创建电子邮件任务", "技术:sync, SMTP")
UpdateRelStyle(backend_api, email_system, $offsetY="-60")
Rel(backend_api, banking_system, "标签:使用", "技术:sync/async, XML/HTTPS")
UpdateRelStyle(backend_api, banking_system, $offsetY="-50", $offsetX="-140")
** 代码:**
C4Component
title 互联网银行系统API应用程序的组件图
Container(spa, "标签:单页应用程序", "技术:javascript 和 angular", "描述:通过网络浏览器,为客户提供所有互联网银行功能。")
Container(ma, "标签:移动应用", "技术:Xamarin", "描述:通过移动设备,向客户提供互联网银行功能的有限子集。")
ContainerDb(db, "标签:数据库", "技术:关系数据库模式", "描述:存储用户注册信息、哈希认证凭证、访问日志等等。")
System_Ext(mbs, "银行主系统", "存储有关客户、账户、交易等核心银行信息的全部数据。")
Container_Boundary(api, "接口应用程序") {
Component(sign, "标签:登录控制器", "技术:MVC Rest Controller", "描述:允许用户登录网上银行系统")
Component(accounts, "标签:账户汇总控制器", "技术:MVC Rest Controller", "描述:为客户提供银行账户汇总")
Component(security, "标签:安全组件", "技术:Spring Bean", "描述:提供与登录、更改密码等相关的功能。")
Component(mbsfacade, "标签:银行主系统入口", "技术:Spring Bean", "描述:银行主系统的入口")
Rel(sign, security, "标签:使用")
Rel(accounts, mbsfacade, "标签:使用")
Rel(security, db, "标签:读取和写入", "技术:JDBC")
Rel(mbsfacade, mbs, "标签:使用", "技术:XML/HTTPS")
}
Rel_Back(spa, sign, "标签:使用", "技术:JSON/HTTPS")
Rel(spa, accounts, "标签:使用", "技术:JSON/HTTPS")
Rel(ma, sign, "标签:使用", "技术:JSON/HTTPS")
Rel(ma, accounts, "标签:使用", "技术:JSON/HTTPS")
UpdateRelStyle(spa, sign, $offsetX="-50", $offsetY="20")
UpdateRelStyle(spa, accounts, $offsetX="-50", $offsetY="40")
UpdateRelStyle(ma, sign, $offsetX="0", $offsetY="-40")
UpdateRelStyle(ma, accounts, $offsetY="-0")
UpdateRelStyle(sign, security, $offsetX="-180", $offsetY="10")
UpdateRelStyle(accounts, mbsfacade, $offsetX="160", $offsetY="10")
UpdateRelStyle(security, db, $offsetY="-40")
UpdateRelStyle(mbsfacade, mbs, $offsetY="-40")
** 代码:**
C4Dynamic
title 互联网银行系统 - API应用的动态图
ContainerDb(c4, "标签:数据库", "技术:关系数据库模式", "描述:存储用户注册信息、哈希认证凭证、访问日志等等。")
Container(c1, "标签:单页面应用", "技术:JavaScript 和 Angular", "描述:通过客户的Web浏览器为客户提供所有互联网银行功能。")
Container_Boundary(b, "标签:接口应用") {
Component(c3, "标签:安全组件", "技术:Spring Bean", "描述:提供与登录、更改密码等功能相关的功能。")
Component(c2, "标签:登录控制器", "技术:Spring MVC Rest Controller", "描述:允许用户登录互联网银行系统。")
}
Rel(c1, c2, "标签:提交凭证", "技术:JSON/HTTPS")
Rel(c2, c3, "标签:调用 isAuthenticated()接口")
Rel(c3, c4, "标签:select * from users where username = ?", "技术:JDBC")
UpdateRelStyle(c1, c2, $textColor="red", $offsetY="-40")
UpdateRelStyle(c2, c3, $textColor="red", $offsetX="-40", $offsetY="60")
UpdateRelStyle(c3, c4, $textColor="red", $offsetY="-40", $offsetX="10")
** 代码:**
C4Deployment
title 网上银行系统部署示意图-Live
Deployment_Node(mob, "标签:客户移动设备", "系统类型:苹果IOS或安卓"){
Container(mobile, "标签:移动应用程序", "技术:Xamarin", "描述:为客户在他们的移动设备上提供有限的互联网银行功能。")
}
Deployment_Node(comp, "标签:客户电脑", "系统类型:Windows或MacOS"){
Deployment_Node(browser, "标签:网络浏览器", "浏览器类型:Google Chrome, Mozilla Firefox,
Apple Safari 或者 Microsoft Edge"){
Container(spa, "标签:单页面应用程序", "技术:JavaScript 和 Angular", "描述:通过客户的网络浏览器为客户提供所有互联网银行功能。")
}
}
Deployment_Node(plc, "标签:大银行股份有限公司", "公司部门类型:大银行股份有限公司数据中心"){
Deployment_Node(dn, "标签:大银行接口*** x8", "系统类型:Ubuntu 16.04 LTS(长期支持版本)"){
Deployment_Node(apache, "标签:Apache Tomcat", "版本类型:Apache Tomcat 8.x"){
Container(api, "标签:接口应用程序", "技术:Java 和 Spring MVC", "描述:通过JSON / HTTPS API提供互联网银行功能。")
}
}
Deployment_Node(bb2, "标签:大银行网页*** x4", "系统类型:Ubuntu 16.04 LTS(长期支持版本)"){
Deployment_Node(apache2, "标签:Apache Tomcat", "版本类型:Apache Tomcat 8.x"){
Container(web, "标签:Web 应用程序", "技术:Java和 Spring MVC", "描述:提供静态内容和互联网银行单页面应用程序。")
}
}
Deployment_Node(bigbankdb01, "标签:大银行数据库1", "系统类型:Ubuntu 16.04 LTS(长期支持版本)"){
Deployment_Node(oracle, "标签:Oracle主库", "版本类型:Oracle 12c"){
ContainerDb(db, "标签:数据库", "技术:关系数据库模式", "描述:存储用户注册信息、哈希认证凭证、访问日志等等。")
}
}
Deployment_Node(bigbankdb02, "标签:大银行数据库2", "系统类型:Ubuntu 16.04 LTS(长期支持版本)") {
Deployment_Node(oracle2, "标签:Oracle从库", "版本类型:Oracle 12c") {
ContainerDb(db2, "标签:数据库", "技术:关系数据库模式", "描述:存储用户注册信息、哈希认证凭证、访问日志等等。")
}
}
}
Rel(mobile, api, "标签:调用API", "技术:json/HTTPS")
Rel(spa, api, "标签:调用API", "技术:json/HTTPS")
Rel_R(web, spa, "标签:传输到客户的Web浏览器")
Rel(api, db, "标签:从api读取或写入数据库", "技术:JDBC")
Rel(api, db2, "标签:从api读取或写入数据库", "技术:JDBC")
Rel_R(db, db2, "标签:复制数据")
UpdateRelStyle(spa, api, $offsetY="-40")
UpdateRelStyle(web, spa, $offsetY="-40")
UpdateRelStyle(api, db, $offsetY="-20", $offsetX="5")
UpdateRelStyle(api, db2, $offsetX="-40", $offsetY="-20")
UpdateRelStyle(db, db2, $offsetY="-10")