简介

PlantUML 是一个开源工具,允许用户使用纯文本描述来创建 UML (统一建模语言) 图形。由于它使用文本来描述图形,因此可以很容易地将这些描述与源代码一起存储在版本控制系统中。然后,PlantUML 负责将这些描述转换为图形。


以下是关于 PlantUML 的一些关键点:

文本描述:

用户使用特定的语法和关键词描述 UML 图。

这种方法特别适合开发人员,因为它们可以使用自己熟悉的文本编辑器或 IDE。

多种输出格式:

PlantUML 支持多种输出格式,如 PNG、SVG 和 LaTeX。

集成能力:

由于其文本基础的特性,PlantUML 可以轻松地与各种工具集成,例如 Wikis、论坛、文档生成工具和其他应用程序。

广泛的 UML 图支持:

支持各种 UML 图,包括序列图、用例图、类图、活动图、组件图等。

其他图表类型:

除了 UML,PlantUML 还支持其他图表类型,如 Gantt 图、架构图和网络图。

扩展性:

PlantUML 不仅仅局限于 UML。它还有一个扩展系统,允许添加新的图形类型。

开源和活跃的社区:

PlantUML 是完全开源的,有一个非常活跃的社区,不断增加新的功能和改进。

依赖 Graphviz:

为了生成图形,PlantUML 依赖于 Graphviz。这意味着用户需要安装两者才能完全使用 PlantUML。

总的来说,PlantUML 是一个强大的工具,特别适合那些希望使用文本描述来创建和维护 UML 图的开发人员和团队。

前置知识

PlantUML 是一个开源项目,可以让你使用简单易读的文本描述来创建 UML 图(包括类图、活动图、用例图、顺序图等)。以下是在学习 PlantUML 之前你可能需要了解的一些技术或软件:

  1. Java Runtime Environment (JRE):PlantUML 是用 Java 编写的,因此需要 Java 运行环境来运行。
  2. Graphviz:PlantUML 使用 Graphviz 来布局生成的图像。因此,你需要安装 Graphviz 并确保它的可执行文件在你的系统路径中。
  3. 文本编辑器:你可以在任何文本编辑器中编写 PlantUML 代码,但是有些编辑器(如 Visual Studio Code、IntelliJ IDEA 等)提供了对 PlantUML 的更好支持,例如语法高亮、实时预览等。
  4. PlantUML 语法:虽然 PlantUML 的语法相对简单,但是你可能还需要花一些时间来学习和熟悉它。
  5. UML 基础知识:虽然 PlantUML 可以帮助你更容易地创建 UML 图,但是你仍然需要对 UML 的基本概念有一定的理解,才能有效地使用 PlantUML。这包括理解类图、活动图、用例图、顺序图等各种 UML 图的语义和用法。

以上就是在学习 PlantUML 之前需要了解的一些技术和软件。

PlantUML的官网

时序图的语法和功能 (plantuml.com)

官网有在线 PlantUML 编辑器,如 PlantText,可用于快速实验和预览。


快速安装和设置 PlantUML(假设你已经安装了 Graphviz)。

PlantUML安装与设置

PlantUML依赖Graphviz,所以必须先安装Graphviz。

通过插件安装

你可以在VSCode和IDEA里使用PlantUML的插件。

架构师画图神器 - PlantUML_UML


新建PU文件:

test.pu

@startuml
Bob -> Alice : hello
@enduml

架构师画图神器 - PlantUML_活动图_02

通过Jar包使用PlantUML

下载 PlantUML

访问 PlantUML 的官方下载页面:https://github.com/plantuml/plantuml/releases/download/v1.2024.4/plantuml-1.2024.4.jar

运行jar文件

将下载的 plantuml.jar 文件移动到一个合适的位置,例如 C:\tools\plantuml\plantuml.jar。

java -jar .\plantuml-1.2024.4.jar

运行结果:

架构师画图神器 - PlantUML_活动图_03


测试 PlantUML

创建一个名为 test.puml 的文件,并输入以下内容:

@startuml

Alice -> Bob: Hello

@enduml

架构师画图神器 - PlantUML_UML_04

 

打开,将生成一个名为 test.png 的图像文件,其中包含 Alice 和 Bob 之间的消息图。

架构师画图神器 - PlantUML_System_05


5. 注意

确保你已经安装了 Graphviz 并且其可执行文件(特别是 dot.exe)在你的 PATH 中,因为 PlantUML 依赖于 Graphviz 来生成某些 UML 图。

PlantUML的语法

类图

1. 创建简单的类、接口和枚举

在 PlantUML 中,你可以使用以下语法创建类、接口和枚举:

class Student
interface Person
enum Gender
{
    Male
    Female
}

显示:

架构师画图神器 - PlantUML_活动图_06

2. 添加属性和方法

你可以在类或接口中添加属性和方法,像这样:

@startuml 测试

class ClassName {

  + attribute1 : Type1

  # attribute2 : Type2

  - method1() : ReturnType1

  + method2(param1:Type1, param2:Type2) : ReturnType2

}
@enduml

其中 +、# 和 - 分别表示 public、protected 和 private 访问修饰符。

例如:


class Student {

  + studentID : int

  - name : string

  + enroll(course: Course)

  - calculateGrade() : Grade

}

3. 设置类的可见性(public、private 等)

PlantUML 使用特定的符号表示不同的可见性级别:


+ : 公开 (public)

- : 私有 (private)

# : 受保护 (protected)

~ : 包私有 (package private)

例如,下面的 Student 类有一个公开的属性 studentID 和一个私有的属性 name:


class Student {

  + studentID : int

  - name : string

}

示例


结合以上的基础知识,以下是一个完整的 PlantUML 类图示例:


@startuml


class Student {

  + studentID : int

  - name : string

  + enroll(course: Course)

  - calculateGrade() : Grade

}


interface Person {

  + getName() : string

  + getAge() : int

}


enum Gender {

  MALE,

  FEMALE

}


Student ..|> Person

Student o-- Gender


@enduml

这个示例展示了一个名为 Student 的类,它实现了 Person 接口并与 Gender 枚举有关联。

架构师画图神器 - PlantUML_UML_07

Java Web 项目类图示例

三层架构

首先,我们创建以下类:


UserEntity:这是一个实体类,代表了数据库中的用户。

UserService:这是一个服务类,处理与用户相关的业务逻辑。

UserController:这是一个控制器类,处理与用户相关的 HTTP 请求。

代码:

@startuml


package "Entity" {

  class UserEntity {

    + userId : Long

    - username : String

    - password : String

    + UserEntity()

    + getUsername() : String

    + setUsername(username: String)

    + getPassword() : String

    + setPassword(password: String)

  }

}


package "Service" {

  class UserService {

    + createUser(user: UserEntity) : UserEntity

    + getUserById(id: Long) : UserEntity

    + updateUser(user: UserEntity) : UserEntity

    + deleteUser(id: Long)

  }

}


package "Controller" {

  class UserController {

    + createUser()

    + getUserById()

    + updateUser()

    + deleteUser()

  }

}


UserController --> UserService: uses

UserService --> UserEntity: manages


@enduml

在这个类图中,UserController 依赖于 UserService 来处理 HTTP 请求。同样地,UserService 也依赖于 UserEntity 来处理与用户相关的业务逻辑。

解释

UserEntity 类有三个属性:userId、username 和 password。此外,它还有对应的 getter 和 setter 方法。

UserService 类提供了与用户相关的主要业务逻辑,如创建、获取、更新和删除用户。

UserController 类处理与用户相关的 HTTP 请求。每个方法(如 createUser() 和 getUserById())都会对应一个特定的 HTTP 请求路径。

架构师画图神器 - PlantUML_UML_08

序列图

plantuml 的序列图基础

序列图是用于表示对象之间消息传递的时间顺序的UML图。序列图特别适用于描述对象之间的交互以及交互的顺序。

1. 创建参与者和对象

在PlantUML中,你可以创建两种主要的参与者:actor和boundary。还有其他参与者,例如control、entity和database,但最常用的是前两者。

actor User

boundary System

2. 描述消息和方法调用的顺序

消息是在两个参与者之间的箭头。你可以使用->来表示一个简单的消息。为了描述方法调用的返回,你可以使用--。

User -> System: request()

System --> User: response()

完整的简单示例:

假设我们有一个用户尝试登录到系统的场景。用户输入他们的凭据,系统验证它们,并返回一个响应。


@startuml

actor User

boundary System


User -> System: inputCredentials(username, password)

System --> User: authenticationResponse(result)

@enduml

在此示例中,用户(actor)发送一个inputCredentials消息给系统(boundary),系统经过一段时间后发送一个authenticationResponse消息回用户。

架构师画图神器 - PlantUML_UML_09

高级特性:

激活和去激活:你可以使用activate和deactivate关键字来表示一个参与者正在执行一个任务。

User -> System: inputCredentials(username, password)

activate System

System --> User: authenticationResponse(result)

deactivate System

架构师画图神器 - PlantUML_UML_10

并行操作:你可以使用par和end关键字来表示并行操作。


par

  User -> System: task1()

  User -> System: task2()

end

架构师画图神器 - PlantUML_活动图_11

循环:你可以使用loop和end关键字来表示循环。


loop 3 times

  User -> System: repeatTask()

end

架构师画图神器 - PlantUML_活动图_12

条件:使用alt、else和end关键字来表示条件。


alt condition is true

  User -> System: action1()

else condition is false

  User -> System: action2()

end

架构师画图神器 - PlantUML_System_13

希望这个简单的指南能帮助你开始使用PlantUML的序列图。这只是序列图的冰山一角,但它为你提供了开始的基础。

用户登录场景的序列图

让我们为基于Spring Boot和JPA的Java Web项目创建一个复杂一些的用户登录场景的序列图。

场景描述:

用户点击登录按钮。

前端应用调用后端的LoginController。

LoginController验证输入字段的完整性。

LoginController调用UserService以验证用户凭据。

UserService查询UserRepository以获取存储的用户详细信息。

如果凭据匹配,UserService创建一个JWT令牌。

LoginController返回响应给前端,响应可以是成功的JWT令牌或错误消息。

序列图代码:


@startuml

actor User as U

boundary FrontEnd as FE

control LoginController as LC

entity UserService as US

database UserRepository as UR


U -> FE : Click Login Button

activate FE


FE -> LC : loginUser(username, password)

activate LC


LC -> LC : validateInputs(username, password)

note right: Check if inputs are empty or\n follow a certain pattern.


LC -> US : verifyUserCredentials(username, password)

activate US


US -> UR : findByUsername(username)

activate UR

UR --> US : userData

deactivate UR


note over US : Compare input password\nwith stored password hash.

US -> US : validatePassword(password, userData.passwordHash)


US -> US : createJwtToken(username)

note right : Create a JWT token for\nauthenticated user.

US --> LC : jwtToken

deactivate US


LC --> FE : authenticationResponse(jwtToken/success or error message)

deactivate LC

deactivate FE

@enduml

这个序列图描述了用户点击登录按钮后的一系列事件。它涉及到的组件包括前端应用、LoginController、UserService和UserRepository。每个组件的职责都在图中清晰地描述了出来。

架构师画图神器 - PlantUML_活动图_14

你可以使用PlantUML渲染工具将上述代码转化为图形表示。这会给你一个详细的视图,描述了用户登录过程中涉及的各个组件和它们之间的交互。

活动图

plantuml的活动图基础

PlantUML的活动图用于描述业务流程、算法或流程的操作序列。活动图主要关注条件和顺序的流程控制。

以下是创建活动图的一些基础概念:

开始和结束:每个活动图都有一个开始和一个结束。


@startuml

start

:Action 1;

stop

@enduml

架构师画图神器 - PlantUML_活动图_15

活动:使用冒号表示一个活动。

:Activity 1;

条件/决策:使用if..else..endif表示决策。


if (condition) then (yes)

 :True activity;

else (no)

 :False activity;

endif

箭头:箭头用于表示活动之间的流程。你可以使用-->或->表示一个流向。


:Activity 1;

-->  

:Activity 2;

并行活动:使用fork和endfork表示并行的活动。


fork

 :First Activity;

 :Second Activity;

endfork

循环:使用while和endwhile表示循环。


while (condition) is (yes)

 :Repeated Activity;

endwhile (no)

分组和注释:可以使用note表示注释,group表示一个活动组。


group My Group

 :Activity 1;

 note right: This is a note on the right.

end group

结束:每个活动图都应该有一个结束,表示流程结束的地方。


stop

示例:


考虑一个简单的在线购买流程,我们可以使用活动图来表示这个过程:


上述代码描述了在线购买的流程,从浏览产品到选择产品、添加到购物车,然后结账或继续购物。如果产品没有库存,或者付款失败,流程会提前结束。



用户注册流程的活动图示例

下面是一个用户注册流程的活动图:


用户开始注册。

用户输入基本信息,如电子邮件、用户名等。

系统验证电子邮件的格式是否正确。

系统检查电子邮件是否已被其他用户使用。

用户设置密码。

系统验证密码的强度。

用户确认密码。

系统验证两次输入的密码是否一致。

用户点击注册。

系统发送电子邮件验证链接。

用户点击链接确认电子邮件。

注册成功。

以下是对应的PlantUML活动图代码:

@startuml


start

:Browse Products;

:Select Product;

if (Is product available?) then (yes)

  :Add to Cart;

  if (Want to checkout?) then (yes)

    :Proceed to Checkout;

    :Enter Payment Details;

    if (Payment Successful?) then (yes)

      :Order Confirmation;

      stop

    else (no)

      :Payment Failed;

      stop

    endif

  else (no)

    :Continue Shopping;

    stop

  endif

else (no)

  :Product Out of Stock;

  stop

endif


@enduml

架构师画图神器 - PlantUML_UML_16

@startuml


start


:User starts registration;


:Enter email and username;

if (Is email format valid?) then (yes)

    if (Is email unique?) then (yes)

        :Enter password;

        if (Is password strong?) then (yes)

            :Confirm password;

            if (Are passwords matching?) then (yes)

                :Click register;

                :System sends email verification link;

                if (Is email link clicked?) then (yes)

                    :Registration successful;

                    stop

                else (no)

                    :Registration failed;

                    stop

                endif

            else (no)

                :Passwords do not match;

                stop

            endif

        else (no)

            :Weak password;

            stop

        endif

    else (no)

        :Email already in use;

        stop

    endif

else (no)

    :Invalid email format;

    stop

endif


@enduml

架构师画图神器 - PlantUML_UML_17