简介
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 之前你可能需要了解的一些技术或软件:
- Java Runtime Environment (JRE):PlantUML 是用 Java 编写的,因此需要 Java 运行环境来运行。
- Graphviz:PlantUML 使用 Graphviz 来布局生成的图像。因此,你需要安装 Graphviz 并确保它的可执行文件在你的系统路径中。
- 文本编辑器:你可以在任何文本编辑器中编写 PlantUML 代码,但是有些编辑器(如 Visual Studio Code、IntelliJ IDEA 等)提供了对 PlantUML 的更好支持,例如语法高亮、实时预览等。
- PlantUML 语法:虽然 PlantUML 的语法相对简单,但是你可能还需要花一些时间来学习和熟悉它。
- UML 基础知识:虽然 PlantUML 可以帮助你更容易地创建 UML 图,但是你仍然需要对 UML 的基本概念有一定的理解,才能有效地使用 PlantUML。这包括理解类图、活动图、用例图、顺序图等各种 UML 图的语义和用法。
以上就是在学习 PlantUML 之前需要了解的一些技术和软件。
PlantUML的官网
官网有在线 PlantUML 编辑器,如 PlantText,可用于快速实验和预览。
快速安装和设置 PlantUML(假设你已经安装了 Graphviz)。
PlantUML安装与设置
PlantUML依赖Graphviz,所以必须先安装Graphviz。
通过插件安装
你可以在VSCode和IDEA里使用PlantUML的插件。
新建PU文件:
test.pu
@startuml
Bob -> Alice : hello
@enduml
通过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
创建一个名为 test.puml 的文件,并输入以下内容:
@startuml
Alice -> Bob: Hello
@enduml
打开,将生成一个名为 test.png 的图像文件,其中包含 Alice 和 Bob 之间的消息图。
5. 注意
确保你已经安装了 Graphviz 并且其可执行文件(特别是 dot.exe)在你的 PATH 中,因为 PlantUML 依赖于 Graphviz 来生成某些 UML 图。
PlantUML的语法
类图
1. 创建简单的类、接口和枚举
在 PlantUML 中,你可以使用以下语法创建类、接口和枚举:
class Student
interface Person
enum Gender
{
Male
Female
}
显示:
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 枚举有关联。
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图。序列图特别适用于描述对象之间的交互以及交互的顺序。
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消息回用户。
高级特性:
激活和去激活:你可以使用activate和deactivate关键字来表示一个参与者正在执行一个任务。
User -> System: inputCredentials(username, password)
activate System
System --> User: authenticationResponse(result)
deactivate System
并行操作:你可以使用par和end关键字来表示并行操作。
par
User -> System: task1()
User -> System: task2()
end
循环:你可以使用loop和end关键字来表示循环。
loop 3 times
User -> System: repeatTask()
end
条件:使用alt、else和end关键字来表示条件。
alt condition is true
User -> System: action1()
else condition is false
User -> System: action2()
end
希望这个简单的指南能帮助你开始使用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渲染工具将上述代码转化为图形表示。这会给你一个详细的视图,描述了用户登录过程中涉及的各个组件和它们之间的交互。
活动图
plantuml的活动图基础
PlantUML的活动图用于描述业务流程、算法或流程的操作序列。活动图主要关注条件和顺序的流程控制。
以下是创建活动图的一些基础概念:
开始和结束:每个活动图都有一个开始和一个结束。
@startuml
start
:Action 1;
stop
@enduml
活动:使用冒号表示一个活动。
: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
@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