uml-diagram-design
29
总安装量
29
周安装量
#7242
全站排名
安装命令
npx skills add https://github.com/aaaaqwq/claude-code-skills --skill uml-diagram-design
Agent 安装分布
claude-code
21
gemini-cli
17
codex
16
cursor
16
antigravity
15
Skill 文档
UML å¾è¡¨è®¾è®¡
åè½è¯´æ
æ¤æè½ä¸é¨ç¨äº UML(ç»ä¸å»ºæ¨¡è¯è¨)å¾è¡¨ç设计åç»å¶,å æ¬:
- ç³»ç»æ¶æè®¾è®¡
- ç±»å¾å对象å¾
- æ¶åºå¾ååä½å¾
- ç¨ä¾å¾åæ´»å¨å¾
- ç¶æå¾åé¨ç½²å¾
- ç»ä»¶å¾åå å¾
使ç¨åºæ¯
- “设计ä¸ä¸ªçµåç³»ç»ç类徔
- “ç»å¶ç¨æ·ç»å½çæ¶åºå¾”
- “åå»ºç³»ç»æ¶æå¾”
- “è®¾è®¡æ°æ®åº ER å¾”
- “ç»å¶ä¸å¡æµç¨å¾”
- “å建ç¨ä¾å¾å±ç¤ºç³»ç»åè½”
UML å¾è¡¨ç±»å
1. ç±»å¾(Class Diagram)
ç¨äºå±ç¤ºç³»ç»ä¸çç±»ã屿§ãæ¹æ³åå ¶å ³ç³»ã
@startuml
class User {
- id: Long
- username: String
- email: String
- password: String
+ login(): boolean
+ logout(): void
+ updateProfile(): void
}
class Order {
- id: Long
- orderNumber: String
- totalAmount: Decimal
- status: OrderStatus
+ create(): void
+ cancel(): void
+ pay(): boolean
}
class Product {
- id: Long
- name: String
- price: Decimal
- stock: Integer
+ updateStock(quantity: Integer): void
+ getPrice(): Decimal
}
User "1" -- "*" Order : places
Order "*" -- "*" Product : contains
@enduml
å ³ç³»ç±»å:
- å ³è(Association):å®çº¿,表示类ä¹é´çå ³ç³»
- èå(Aggregation):空å¿è±å½¢,表示æ´ä½-é¨åå ³ç³»
- ç»å(Composition):å®å¿è±å½¢,表示强æ´ä½-é¨åå ³ç³»
- ç»§æ¿(Inheritance):空å¿ä¸è§ç®å¤´,表示is-aå ³ç³»
- å®ç°(Realization):è线空å¿ä¸è§ç®å¤´,表示æ¥å£å®ç°
- ä¾èµ(Dependency):è线ç®å¤´,表示使ç¨å ³ç³»
2. æ¶åºå¾(Sequence Diagram)
å±ç¤ºå¯¹è±¡ä¹é´ç交äºé¡ºåºåæ¶æ¯ä¼ éã
@startuml
actor User
participant "Web Browser" as Browser
participant "API Server" as API
participant "Database" as DB
User -> Browser: è¾å
¥ç»å½ä¿¡æ¯
Browser -> API: POST /api/login
activate API
API -> DB: æ¥è¯¢ç¨æ·ä¿¡æ¯
activate DB
DB --> API: è¿åç¨æ·æ°æ®
deactivate DB
alt éªè¯æå
API -> API: çæ JWT Token
API --> Browser: è¿å Token
Browser --> User: ç»å½æå
else éªè¯å¤±è´¥
API --> Browser: è¿åé误信æ¯
Browser --> User: æ¾ç¤ºé误æç¤º
end
deactivate API
@enduml
å ç´ è¯´æ:
- Actor:åä¸è (ç¨æ·æå¤é¨ç³»ç»)
- Participant:对象æç»ä»¶
- Message:æ¶æ¯ä¼ é(忥/弿¥)
- Activation:å¯¹è±¡æ¿æ´»æé´
- Alt/Opt/Loop:æ¡ä»¶ãå¯éã循ç¯
3. ç¨ä¾å¾(Use Case Diagram)
å±ç¤ºç³»ç»åè½ååä¸è ä¹é´çå ³ç³»ã
@startuml
left to right direction
actor ç¨æ· as User
actor 管çå as Admin
rectangle çµåç³»ç» {
usecase "æµè§åå" as UC1
usecase "æç´¢åå" as UC2
usecase "æ·»å å°è´ç©è½¦" as UC3
usecase "ä¸åè´ä¹°" as UC4
usecase "æ¯ä»è®¢å" as UC5
usecase "管çåå" as UC6
usecase "æ¥ç订å" as UC7
usecase "å¤ç鿬¾" as UC8
}
User --> UC1
User --> UC2
User --> UC3
User --> UC4
User --> UC5
User --> UC7
Admin --> UC6
Admin --> UC7
Admin --> UC8
UC4 ..> UC3 : <<include>>
UC5 ..> UC4 : <<include>>
@enduml
å ³ç³»ç±»å:
- å ³è:åä¸è ä¸ç¨ä¾ä¹é´çå ³ç³»
- å å«(include):å¿ é¡»æ§è¡çç¨ä¾
- æ©å±(extend):å¯éæ§è¡çç¨ä¾
- æ³å:ç¨ä¾ä¹é´çç»§æ¿å ³ç³»
4. æ´»å¨å¾(Activity Diagram)
å±ç¤ºä¸å¡æµç¨æç®æ³çæ§è¡æµç¨ã
@startuml
start
:ç¨æ·æäº¤è®¢å;
if (åºåå
è¶³?) then (æ¯)
:éå®åºå;
:å建订å;
fork
:åé确认é®ä»¶;
fork again
:æ´æ°åºå;
fork again
:è®°å½æ¥å¿;
end fork
:çå¾
æ¯ä»;
if (æ¯ä»æå?) then (æ¯)
:确认订å;
:宿åè´§;
else (å¦)
:åæ¶è®¢å;
:éæ¾åºå;
endif
else (å¦)
:æç¤ºåºåä¸è¶³;
endif
stop
@enduml
å ç´ è¯´æ:
- å¼å§/ç»æ:æµç¨çèµ·ç¹åç»ç¹
- æ´»å¨:æ§è¡çæä½
- å³ç:æ¡ä»¶å¤æ
- 忝/åå¹¶:å¹¶è¡æ§è¡
- æ³³é:责任åå
5. ç¶æå¾(State Diagram)
å±ç¤ºå¯¹è±¡å¨çå½å¨æä¸çç¶æååã
@startuml
[*] --> å¾
æ¯ä» : å建订å
å¾
æ¯ä» --> å·²æ¯ä» : æ¯ä»æå
å¾
æ¯ä» --> 已忶 : è¶
æ¶/ç¨æ·åæ¶
å·²æ¯ä» --> é
è´§ä¸ : å¼å§é
è´§
é
è´§ä¸ --> å·²åè´§ : åè´§
å·²åè´§ --> 已宿 : 确认æ¶è´§
å·²åè´§ --> 鿬¾ä¸ : ç³è¯·é款
鿬¾ä¸ --> 已鿬¾ : 鿬¾æå
鿬¾ä¸ --> å·²åè´§ : æç»é款
已宿 --> [*]
已忶 --> [*]
已鿬¾ --> [*]
å¾
æ¯ä» : entry / éå®åºå
å¾
æ¯ä» : exit / éæ¾åºå
å·²æ¯ä» : entry / æ£ååºå
@enduml
6. ç»ä»¶å¾(Component Diagram)
å±ç¤ºç³»ç»çç»ä»¶ç»æåä¾èµå ³ç³»ã
@startuml
package "å端å±" {
[Web åºç¨]
[ç§»å¨åºç¨]
}
package "API å±" {
[API Gateway]
[è®¤è¯æå¡]
}
package "ä¸å¡å±" {
[ç¨æ·æå¡]
[订åæå¡]
[ååæå¡]
[æ¯ä»æå¡]
}
package "æ°æ®å±" {
database "MySQL" as DB
database "Redis" as Cache
queue "æ¶æ¯éå" as MQ
}
[Web åºç¨] --> [API Gateway]
[ç§»å¨åºç¨] --> [API Gateway]
[API Gateway] --> [è®¤è¯æå¡]
[API Gateway] --> [ç¨æ·æå¡]
[API Gateway] --> [订åæå¡]
[API Gateway] --> [ååæå¡]
[订åæå¡] --> [æ¯ä»æå¡]
[订åæå¡] --> DB
[ç¨æ·æå¡] --> DB
[ååæå¡] --> DB
[ç¨æ·æå¡] --> Cache
[ååæå¡] --> Cache
[订åæå¡] --> MQ
[æ¯ä»æå¡] --> MQ
@enduml
7. é¨ç½²å¾(Deployment Diagram)
å±ç¤ºç³»ç»çç©çé¨ç½²æ¶æã
@startuml
node "ç¨æ·è®¾å¤" {
[æµè§å¨]
[ç§»å¨ App]
}
node "è´è½½åè¡¡å¨" {
[Nginx]
}
node "åºç¨æå¡å¨é群" {
node "æå¡å¨ 1" {
[Node.js å®ä¾ 1]
}
node "æå¡å¨ 2" {
[Node.js å®ä¾ 2]
}
}
node "æ°æ®åºæå¡å¨" {
database "MySQL 主åº"
database "MySQL ä»åº"
}
node "ç¼åæå¡å¨" {
database "Redis é群"
}
node "æä»¶åå¨" {
[OSS/S3]
}
[æµè§å¨] --> [Nginx]
[ç§»å¨ App] --> [Nginx]
[Nginx] --> [Node.js å®ä¾ 1]
[Nginx] --> [Node.js å®ä¾ 2]
[Node.js å®ä¾ 1] --> [MySQL 主åº]
[Node.js å®ä¾ 2] --> [MySQL 主åº]
[MySQL 主åº] --> [MySQL ä»åº] : 主ä»å¤å¶
[Node.js å®ä¾ 1] --> [Redis é群]
[Node.js å®ä¾ 2] --> [Redis é群]
[Node.js å®ä¾ 1] --> [OSS/S3]
[Node.js å®ä¾ 2] --> [OSS/S3]
@enduml
ç»å¾å·¥å ·
PlantUML
ææµè¡çææ¬é©±å¨ UML å·¥å ·ã
å®è£ :
# ä½¿ç¨ npm
npm install -g node-plantuml
# ä½¿ç¨ Java
# ä¸è½½ plantuml.jar
java -jar plantuml.jar diagram.puml
å¨çº¿å·¥å ·:
- PlantUML Online Server
- PlantText
- PlantUML QEditor
Mermaid
Markdown å好çå¾è¡¨å·¥å ·ã
classDiagram
class User {
+String username
+String email
+login()
+logout()
}
class Order {
+String orderNumber
+Decimal amount
+create()
+cancel()
}
User "1" --> "*" Order : places
å ¶ä»å·¥å ·
- Draw.io/diagrams.net:å¨çº¿å¾è¡¨å·¥å ·
- Lucidchart:ä¸ä¸å¾è¡¨è½¯ä»¶
- Visual Paradigm:ä¼ä¸çº§å»ºæ¨¡å·¥å ·
- StarUML:弿º UML å·¥å ·
设计æä½³å®è·µ
1. ç±»å¾è®¾è®¡
â éµå¾ªåä¸èè´£åå
â ä½¿ç¨æ¸
æ°çå½å
â æ 注å
³é®å±æ§åæ¹æ³
â æ¾ç¤ºéè¦çå
³ç³»
â 使ç¨å
ç»ç»å¤§åç³»ç»
â é¿å
è¿åº¦è®¾è®¡
â ä¸è¦å
嫿æç»è
â é¿å
循ç¯ä¾èµ
2. æ¶åºå¾è®¾è®¡
â ä»å·¦å°å³æååä¸è
â ææ¶é´é¡ºåºæåæ¶æ¯
â ä½¿ç¨æ¸
æ°çæ¶æ¯åç§°
â æ 注éè¦çæ¡ä»¶å循ç¯
â ä¿æå¾è¡¨ç®æ´
â é¿å
è¿å¤çåä¸è
â ä¸è¦éæ¼è¿åæ¶æ¯
â é¿å
交åçæ¶æ¯çº¿
3. ç¨ä¾å¾è®¾è®¡
â 使ç¨ç¨æ·è§è§æè¿°åè½
â ä¿æç¨ä¾ç²åº¦éä¸
â æç¡®åä¸è
è§è²
â æ 注å
³é®çå
³ç³»
â æåè½æ¨¡åç»ç»
â é¿å
ææ¯æ¯è¯
â ä¸è¦è¿äºç»å
â é¿å
éæ¼éè¦ç¨ä¾
å®é åºç¨åºæ¯
çµåç³»ç»è®¾è®¡
@startuml
' æ ¸å¿é¢å模å
class User {
- id: Long
- username: String
- email: String
- phone: String
+ register()
+ login()
+ updateProfile()
}
class Product {
- id: Long
- name: String
- description: String
- price: Decimal
- stock: Integer
+ updateStock()
+ getPrice()
}
class Order {
- id: Long
- orderNumber: String
- totalAmount: Decimal
- status: OrderStatus
- createdAt: DateTime
+ create()
+ cancel()
+ pay()
+ ship()
}
class OrderItem {
- id: Long
- quantity: Integer
- price: Decimal
+ calculateSubtotal()
}
class Payment {
- id: Long
- amount: Decimal
- method: PaymentMethod
- status: PaymentStatus
+ process()
+ refund()
}
class Address {
- id: Long
- province: String
- city: String
- detail: String
- phone: String
}
enum OrderStatus {
PENDING
PAID
SHIPPED
COMPLETED
CANCELLED
}
enum PaymentMethod {
ALIPAY
WECHAT
CREDIT_CARD
}
User "1" -- "*" Order : places
User "1" -- "*" Address : has
Order "1" *-- "*" OrderItem : contains
OrderItem "*" -- "1" Product : references
Order "1" -- "1" Payment : pays with
Order "1" -- "1" Address : ships to
@enduml
å¾®æå¡æ¶æå¾
@startuml
!define RECTANGLE class
package "客æ·ç«¯" {
[Web å端]
[ç§»å¨ App]
}
package "API ç½å
³å±" {
[API Gateway]
[认è¯ä¸å¿]
}
package "å¾®æå¡å±" {
RECTANGLE "ç¨æ·æå¡" {
[ç¨æ·ç®¡ç]
[æé管ç]
}
RECTANGLE "ååæå¡" {
[åå管ç]
[åºå管ç]
}
RECTANGLE "订åæå¡" {
[订å管ç]
[订åç¶æ]
}
RECTANGLE "æ¯ä»æå¡" {
[æ¯ä»å¤ç]
[鿬¾å¤ç]
}
}
package "åºç¡è®¾æ½å±" {
database "MySQL é群"
database "Redis é群"
queue "Kafka"
[é
ç½®ä¸å¿]
[æå¡æ³¨å]
}
[Web å端] --> [API Gateway]
[ç§»å¨ App] --> [API Gateway]
[API Gateway] --> [认è¯ä¸å¿]
[API Gateway] --> [ç¨æ·ç®¡ç]
[API Gateway] --> [åå管ç]
[API Gateway] --> [订å管ç]
[订å管ç] --> [æ¯ä»å¤ç]
[订å管ç] --> [åºå管ç]
[ç¨æ·ç®¡ç] --> [MySQL é群]
[åå管ç] --> [MySQL é群]
[订å管ç] --> [MySQL é群]
[ç¨æ·ç®¡ç] --> [Redis é群]
[åå管ç] --> [Redis é群]
[订å管ç] --> [Kafka]
[æ¯ä»å¤ç] --> [Kafka]
[ç¨æ·ç®¡ç] --> [é
ç½®ä¸å¿]
[åå管ç] --> [é
ç½®ä¸å¿]
[订å管ç] --> [é
ç½®ä¸å¿]
[ç¨æ·ç®¡ç] --> [æå¡æ³¨å]
[åå管ç] --> [æå¡æ³¨å]
[订å管ç] --> [æå¡æ³¨å]
@enduml
ææ¡£éæ
Markdown ä¸åµå ¥
# ç³»ç»è®¾è®¡ææ¡£
## ç±»å¾
\`\`\`plantuml
@startuml
class User {
+login()
}
@enduml
\`\`\`
## æ¶åºå¾
\`\`\`mermaid
sequenceDiagram
User->>API: 请æ±
API->>DB: æ¥è¯¢
DB-->>API: è¿å
API-->>User: ååº
\`\`\`
ä»£ç æ³¨éä¸ä½¿ç¨
/**
* ç¨æ·æå¡ç±»
*
* @startuml
* class UserService {
* +register(user: User): boolean
* +login(username: String, password: String): Token
* }
* @enduml
*/
public class UserService {
// å®ç°ä»£ç
}
注æäºé¡¹
- éæ©åéçå¾è¡¨ç±»å
- ä¿æå¾è¡¨ç®æ´æ¸ æ°
- 使ç¨ä¸è´çå½åè§è
- åæ¶æ´æ°ææ¡£
- èèå¾è¡¨çå¯è¯»æ§
- é¿å è¿åº¦è®¾è®¡
- 使ç¨çæ¬æ§å¶ç®¡çå¾è¡¨æä»¶
- ä¸å¢éä¿ææ²é