--- title: PlantUML icon: arcticons:uml-class-editor createTime: 2025/03/01 15:02:08 permalink: /guide/chart/plantuml/ --- ## 概述 主题支持在 文章中 嵌入由 [PlantUML](https://plantuml.com/) 。 该功能由 [@vuepress/plugin-markdown-chart](https://ecosystem.vuejs.press/plugins/markdown/markdown-chart/) 提供支持。 ## 配置 主题默认不启用该功能。 在 `.vuepress/config.ts` 配置文件中,启用该功能: ```ts title=".vuepress/config.ts" export default defineUserConfig({ theme: plumeTheme({ markdown: { plantuml: true, // [!code ++] }, }) }) ``` ::: note 以下文档 Fork 自 [@vuepress/plugin-markdown-chart](https://ecosystem.vuejs.press/plugins/markdown/markdown-chart/plantuml.html), 遵循 [MIT](https://github.com/vuepress/ecosystem/blob/main/LICENSE) 许可证。 ::: ## 格式 你可以插入[plantuml](https://plantuml.com/) 支持的相同内容,例如: ```md @startuml 内容 @enduml ``` ## 示例 ::: demo markdown title="序列图" ```md @startuml Alice -> Bob: 认证请求 alt 成功情况 Bob -> Alice: 认证接受 else 某种失败情况 Bob -> Alice: 认证失败 group 我自己的标签 Alice -> Log : 开始记录攻击日志 loop 1000次 Alice -> Bob: DNS 攻击 end Alice -> Log : 结束记录攻击日志 end else 另一种失败 Bob -> Alice: 请重复 end @enduml ``` ::: ::: demo markdown title="用例图" ```md @startuml :Main Admin: as Admin (Use the application) as (Use) User -> (Start) User --> (Use) Admin ---> (Use) note right of Admin : This is an example. note right of (Use) A note can also be on several lines end note note "This note is connected\nto several objects." as N2 (Start) .. N2 N2 .. (Use) @enduml ``` ::: ::: demo markdown title="类图" ```md @startuml abstract class AbstractList abstract AbstractCollection interface List interface Collection List <|-- AbstractList Collection <|-- AbstractCollection Collection <|- List AbstractCollection <|- AbstractList AbstractList <|-- ArrayList class ArrayList { Object[] elementData size() } enum TimeUnit { DAYS HOURS MINUTES } annotation SuppressWarnings annotation Annotation { annotation with members String foo() String bar() } @enduml ``` ::: ::: demo markdown title="活动图" ```md @startuml start :ClickServlet.handleRequest(); :new page; if (Page.onSecurityCheck) then (true) :Page.onInit(); if (isForward?) then (no) :Process controls; if (continue processing?) then (no) stop endif if (isPost?) then (yes) :Page.onPost(); else (no) :Page.onGet(); endif :Page.onRender(); endif else (false) endif if (do redirect?) then (yes) :redirect process; else if (do forward?) then (yes) :Forward request; else (no) :Render page template; endif endif stop @enduml ``` ::: ::: demo markdown title="组件图" ```md @startuml package "Some Group" { HTTP - [First Component] [Another Component] } node "Other Groups" { FTP - [Second Component] [First Component] --> FTP } cloud { [Example 1] } database "MySql" { folder "This is my folder" { [Folder 3] } frame "Foo" { [Frame 4] } } [Another Component] --> [Example 1] [Example 1] --> [Folder 3] [Folder 3] --> [Frame 4] @enduml ``` ::: ::: demo markdown title="状态图" ``` md @startuml state start1 <> state choice1 <> state fork1 <> state join2 <> state end3 <> [*] --> choice1 : from start\nto choice start1 --> choice1 : from start stereo\nto choice choice1 --> fork1 : from choice\nto fork choice1 --> join2 : from choice\nto join choice1 --> end3 : from choice\nto end stereo fork1 ---> State1 : from fork\nto state fork1 --> State2 : from fork\nto state State2 --> join2 : from state\nto join State1 --> [*] : from state\nto end join2 --> [*] : from join\nto end @enduml ``` ::: ::: demo markdown title="对象图" ```md @startuml object London object Washington object Berlin object NewYork map CapitalCity { UK *-> London USA*--> Washington Germany *---> Berlin } NewYork --> CapitalCity::USA @enduml ``` ::: ::: demo markdown title="部署图" ```md @startuml node node1 node node2 node node3 node node4 node node5 node1 -- node2 : label1 node1 .. node3 : label2 node1 ~~ node4 : label3 node1 == node5 @enduml ``` ::: ::: demo markdown title="时序图" ```md @startuml scale 5 as 150 pixels clock clk with period 1 binary "启用" as en binary "读/写" as rw binary "数据有效" as dv concise "数据总线" as db concise "地址总线" as addr @6 as :write_beg @10 as :write_end @15 as :read_beg @19 as :read_end @0 en is low db is "0x0" addr is "0x03f" rw is low dv is 0 @:write_beg-3 en is high @:write_beg-2 db is "0xDEADBEEF" @:write_beg-1 dv is 1 @:write_beg rw is high @:write_end rw is low dv is low @:write_end+1 rw is low db is "0x0" addr is "0x23" @12 dv is high @13 db is "0xFFFF" @20 en is low dv is low @21 db is "0x0" highlight :write_beg to :write_end #Gold:写 highlight :read_beg to :read_end #lightBlue:读 db@:write_beg-1 <-> @:write_end : 设置时间 db@:write_beg-1 -> addr@:write_end+1 : 保持 @enduml ``` ::: ::: demo markdown title="正则图" ```md @startregex /([\s\S]+)<\/style> @endregex ``` ::: ::: demo markdown title="网络图" ```md @startuml nwdiag { network dmz { address = "210.x.x.x/24" web01 [address = "210.x.x.1"]; web02 [address = "210.x.x.2"]; } network internal { address = "172.x.x.x/24"; web01 [address = "172.x.x.1"]; web02 [address = "172.x.x.2"]; db01; db02; } } @enduml ``` ::: ::: demo markdown title="图形界面" ```md @startsalt {+ {/ 通用 | 全屏 | 行为 | 保存 } { { 图片打开模式: | ^智能模式^ } [X] 缩放时平滑显示图片 [X] 图片删除确认 [ ] 显示隐藏图片 } [关闭] } @endsalt ``` ::: ::: demo markdown title="架构图" ```md @startuml skinparam rectangle<> { roundCorner 25 } sprite $bProcess jar:archimate/business-process sprite $aService jar:archimate/application-service sprite $aComponent jar:archimate/application-component rectangle "Handle claim" as HC <<$bProcess>><> #Business rectangle "Capture Information" as CI <<$bProcess>><> #Business rectangle "Notify\nAdditional Stakeholders" as NAS <<$bProcess>><> #Business rectangle "Validate" as V <<$bProcess>><> #Business rectangle "Investigate" as I <<$bProcess>><> #Business rectangle "Pay" as P <<$bProcess>><> #Business HC *-down- CI HC*-down- NAS HC *-down- V HC*-down- I HC *-down- P CI -right->> NAS NAS -right->> V V -right->> I I -right->> P rectangle "Scanning" as scanning <<$aService>><> #Application rectangle "Customer admnistration" as customerAdministration <<$aService>><> #Application rectangle "Claims admnistration" as claimsAdministration <<$aService>><> #Application rectangle Printing <<$aService>><> #Application rectangle Payment <<$aService>><> #Application scanning -up-> CI customerAdministration -up-> CI claimsAdministration -up-> NAS claimsAdministration -up-> V claimsAdministration -up-> I Payment -up-> P Printing -up-> V Printing -up-> P rectangle "Document\nManagement\nSystem" as DMS <<$aComponent>> #Application rectangle "General\nCRM\nSystem" as CRM <<$aComponent>> #Application rectangle "Home & Away\nPolicy\nAdministration" as HAPA <<$aComponent>> #Application rectangle "Home & Away\nFinancial\nAdministration" as HFPA <<$aComponent>> #Application DMS .up.|> scanning DMS .up.|> Printing CRM .up.|> customerAdministration HAPA .up.|> claimsAdministration HFPA .up.|> Payment legend left Example from the "Archisurance case study" (OpenGroup). See ==== <$bProcess> :business process ==== <$aService> : application service ==== <$aComponent> : application component endlegend @enduml ``` ::: ::: demo markdown title="甘特图" ```md @startgantt Project starts the 2020-12-01 [Task1] requires 10 days sunday are closed note bottom memo1 ... memo2 ... explanations1 ... explanations2 ... end note [Task2] requires 20 days [Task2] starts 10 days after [Task1]'s end -- Separator title -- [M1] happens on 5 days after [Task1]'s end -- end -- @endgantt ``` ::: ::: demo markdown title="思维导图" ```md @startmindmap caption figure 1 title My super title * <&flag>Debian **<&globe>Ubuntu ***Linux Mint *** Kubuntu ***Lubuntu *** KDE Neon ** <&graph>LMDE **<&pulse>SolydXK ** <&people>SteamOS ** <&star>Raspbian with a very long name ***Raspmbc => OSMC *** Raspyfi => Volumio header My super header endheader center footer My super footer legend right Short legend endlegend @endmindmap ``` ::: ::: demo markdown title="工作分解结构图" ```md @startwbs + New Job ++ Decide on Job Requirements +++ Identity gaps +++ Review JDs ++++ Sign-Up for courses ++++ Volunteer ++++ Reading ++- Checklist +++- Responsibilities +++- Location ++ CV Upload Done +++ CV Updated ++++ Spelling & Grammar ++++ Check dates ---- Skills +++ Recruitment sites chosen @endwbs ``` ::: ::: demo markdown title="JSON" ```md @startjson # highlight "lastName" # highlight "address" / "city" # highlight "phoneNumbers" / "0" / "number" { "firstName": "John", "lastName": "Smith", "isAlive": true, "age": 28, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100" }, "phoneNumbers": [ { "type": "home", "number": "212 555-1234" }, { "type": "office", "number": "646 555-4567" } ], "children": [], "spouse": null } @endjson ``` ::: ::: demo markdown title="YAML" ```md @startyaml doe: "a deer, a female deer" ray: "a drop of golden sun" pi: 3.14159 xmas: true french-hens: 3 calling-birds: - huey - dewey - louie - fred xmas-fifth-day: calling-birds: four french-hens: 3 golden-rings: 5 partridges: count: 1 location: "a pear tree" turtle-doves: two @endyaml ``` :::