Lưu đồ
Markdown hỗ trợ tạo nhiều loại biểu đồ và lưu đồ bằng cú pháp Mermaid, giúp tài liệu có khả năng biểu đạt trực quan.
Giới thiệu Mermaid
Mermaid là công cụ tạo biểu đồ dựa trên văn bản, hỗ trợ nhiều loại biểu đồ:
- Lưu đồ (Flowchart)
- Sơ đồ tuần tự (Sequence Diagram)
- Biểu đồ Gantt (Gantt Chart)
- Sơ đồ lớp (Class Diagram)
- Sơ đồ trạng thái (State Diagram)
- Biểu đồ tròn (Pie Chart)
- Hành trình người dùng (User Journey)
- Sơ đồ Git (Git Graph)
Cú pháp cơ bản
Lưu đồ (Flowchart)
markdown
```mermaid
flowchart TD
A[Bắt đầu] --> B{Đã đăng nhập?}
B -->|Có| C[Hiển thị trang chủ]
B -->|Không| D[Hiển thị trang đăng nhập]
C --> E[Kết thúc]
D --> F[Người dùng đăng nhập]
F --> G{Đăng nhập thành công?}
G -->|Có| C
G -->|Không| H[Hiển thị thông báo lỗi]
H --> D
**Kết quả hiển thị**:
```mermaid
flowchart TD
A[Bắt đầu] --> B{Đã đăng nhập?}
B -->|Có| C[Hiển thị trang chủ]
B -->|Không| D[Hiển thị trang đăng nhập]
C --> E[Kết thúc]
D --> F[Người dùng đăng nhập]
F --> G{Đăng nhập thành công?}
G -->|Có| C
G -->|Không| H[Hiển thị thông báo lỗi]
H --> DSơ đồ tuần tự (Sequence Diagram)
markdown
```mermaid
sequenceDiagram
participant Người dùng
participant Frontend
participant Backend
participant CSDL
Người dùng->>Frontend: Yêu cầu đăng nhập
Frontend->>Backend: Xác thực thông tin người dùng
Backend->>CSDL: Truy vấn dữ liệu người dùng
CSDL-->>Backend: Trả về thông tin người dùng
Backend-->>Frontend: Kết quả xác thực
Frontend-->>Người dùng: Phản hồi đăng nhập
**Kết quả hiển thị**:
```mermaid
sequenceDiagram
participant Người dùng
participant Frontend
participant Backend
participant CSDL
Người dùng->>Frontend: Yêu cầu đăng nhập
Frontend->>Backend: Xác thực thông tin người dùng
Backend->>CSDL: Truy vấn dữ liệu người dùng
CSDL-->>Backend: Trả về thông tin người dùng
Backend-->>Frontend: Kết quả xác thực
Frontend-->>Người dùng: Phản hồi đăng nhậpGiải thích lưu đồ chi tiết
Loại nút
markdown
```mermaid
flowchart LR
A[Nút hình vuông]
B(Nút bo góc)
C((Nút tròn))
D{Nút hình thoi}
E[[Thủ tục con]]
F[(Cơ sở dữ liệu)]
G>Nút nhãn]
**Kết quả hiển thị**:
```mermaid
flowchart LR
A[Nút hình vuông]
B(Nút bo góc)
C((Nút tròn))
D{Nút hình thoi}
E[[Thủ tục con]]
F[(Cơ sở dữ liệu)]
G>Nút nhãn]Loại đường nối
markdown
```mermaid
flowchart TD
A --> B
C --- D
E -.-> F
G ==> H
I --o J
K --x L
**Kết quả hiển thị**:
```mermaid
flowchart TD
A --> B
C --- D
E -.-> F
G ==> H
I --o J
K --x LĐiều khiển hướng
markdown
<!-- Từ trên xuống dưới -->
```mermaid
flowchart TD
A --> Bmermaid
flowchart BT
A --> Bmermaid
flowchart LR
A --> Bmermaid
flowchart RL
A --> B
### Ví dụ lưu đồ phức tạp
```markdown
```mermaid
flowchart TD
Start([Bắt đầu dự án]) --> Analysis[Phân tích yêu cầu]
Analysis --> Design[Thiết kế hệ thống]
Design --> Dev{Giai đoạn phát triển}
Dev --> Frontend[Phát triển frontend]
Dev --> Backend[Phát triển backend]
Dev --> Database[Thiết kế cơ sở dữ liệu]
Frontend --> FrontTest[Kiểm thử frontend]
Backend --> BackTest[Kiểm thử backend]
Database --> DataTest[Kiểm thử dữ liệu]
FrontTest --> Integration[Kiểm thử tích hợp]
BackTest --> Integration
DataTest --> Integration
Integration --> Deploy{Chuẩn bị triển khai}
Deploy -->|Thông qua| Production[Môi trường sản xuất]
Deploy -->|Thất bại| Bug[Sửa lỗi]
Bug --> Integration
Production --> Monitor[Giám sát vận hành]
Monitor --> End([Hoàn thành dự án])
style Start fill:#e1f5fe
style End fill:#e8f5e8
style Bug fill:#ffebee
**Kết quả hiển thị**:
```mermaid
flowchart TD
Start([Bắt đầu dự án]) --> Analysis[Phân tích yêu cầu]
Analysis --> Design[Thiết kế hệ thống]
Design --> Dev{Giai đoạn phát triển}
Dev --> Frontend[Phát triển frontend]
Dev --> Backend[Phát triển backend]
Dev --> Database[Thiết kế cơ sở dữ liệu]
Frontend --> FrontTest[Kiểm thử frontend]
Backend --> BackTest[Kiểm thử backend]
Database --> DataTest[Kiểm thử dữ liệu]
FrontTest --> Integration[Kiểm thử tích hợp]
BackTest --> Integration
DataTest --> Integration
Integration --> Deploy{Chuẩn bị triển khai}
Deploy -->|Thông qua| Production[Môi trường sản xuất]
Deploy -->|Thất bại| Bug[Sửa lỗi]
Bug --> Integration
Production --> Monitor[Giám sát vận hành]
Monitor --> End([Hoàn thành dự án])
style Start fill:#e1f5fe
style End fill:#e8f5e8
style Bug fill:#ffebeeGiải thích sơ đồ tuần tự
Cú pháp cơ bản
markdown
```mermaid
sequenceDiagram
Alice->>Bob: Chào Bob, bạn khỏe không?
Bob-->>Alice: Mình khỏe, cảm ơn!
Alice-)Bob: Tạm biệt!
**Kết quả hiển thị**:
```mermaid
sequenceDiagram
Alice->>Bob: Chào Bob, bạn khỏe không?
Bob-->>Alice: Mình khỏe, cảm ơn!
Alice-)Bob: Tạm biệt!Khối kích hoạt và vòng đời (lifeline)
markdown
```mermaid
sequenceDiagram
participant A as Khách hàng
participant B as Máy chủ
A->>+B: Yêu cầu dữ liệu
Note right of B: Xử lý yêu cầu
B-->>-A: Trả về dữ liệu
A->>+B: Yêu cầu khác
B->>+B: Xử lý nội bộ
B-->>-B: Hoàn tất xử lý
B-->>-A: Trả về kết quả
**Kết quả hiển thị**:
```mermaid
sequenceDiagram
participant A as Khách hàng
participant B as Máy chủ
A->>+B: Yêu cầu dữ liệu
Note right of B: Xử lý yêu cầu
B-->>-A: Trả về dữ liệu
A->>+B: Yêu cầu khác
B->>+B: Xử lý nội bộ
B-->>-B: Hoàn tất xử lý
B-->>-A: Trả về kết quảVòng lặp và điều kiện
markdown
```mermaid
sequenceDiagram
participant U as Người dùng
participant S as Hệ thống
U->>S: Yêu cầu đăng nhập
alt Tồn tại tên người dùng
S->>S: Xác thực mật khẩu
alt Mật khẩu đúng
S-->>U: Đăng nhập thành công
else Mật khẩu sai
S-->>U: Mật khẩu sai
end
else Không tồn tại tên người dùng
S-->>U: Người dùng không tồn tại
end
opt Ghi nhớ mật khẩu
S->>S: Lưu trạng thái đăng nhập
end
**Kết quả hiển thị**:
```mermaid
sequenceDiagram
participant U as Người dùng
participant S as Hệ thống
U->>S: Yêu cầu đăng nhập
alt Tồn tại tên người dùng
S->>S: Xác thực mật khẩu
alt Mật khẩu đúng
S-->>U: Đăng nhập thành công
else Mật khẩu sai
S-->>U: Mật khẩu sai
end
else Không tồn tại tên người dùng
S-->>U: Người dùng không tồn tại
end
opt Ghi nhớ mật khẩu
S->>S: Lưu trạng thái đăng nhập
endSơ đồ lớp (Class Diagram)
markdown
```mermaid
classDiagram
class Animal {
+String name
+int age
+eat()
+sleep()
}
class Dog {
+String breed
+bark()
+wagTail()
}
class Cat {
+String color
+meow()
+purr()
}
Animal <|-- Dog
Animal <|-- Cat
class Owner {
+String name
+feedPet()
}
Owner --> Animal : owns
**Kết quả hiển thị**:
```mermaid
classDiagram
class Animal {
+String name
+int age
+eat()
+sleep()
}
class Dog {
+String breed
+bark()
+wagTail()
}
class Cat {
+String color
+meow()
+purr()
}
Animal <|-- Dog
Animal <|-- Cat
class Owner {
+String name
+feedPet()
}
Owner --> Animal : ownsSơ đồ trạng thái (State Diagram)
markdown
```mermaid
stateDiagram-v2
[*] --> Nhàn rỗi
Nhàn rỗi --> Chạy : Bắt đầu
Chạy --> Tạm dừng : Tạm dừng
Chạy --> Hoàn thành : Kết thúc
Tạm dừng --> Chạy : Tiếp tục
Tạm dừng --> Dừng : Dừng
Dừng --> Nhàn rỗi : Đặt lại
Hoàn thành --> Nhàn rỗi : Đặt lại
Hoàn thành --> [*]
state Chạy {
[*] --> Khởi tạo
Khởi tạo --> Đang xử lý
Đang xử lý --> Xác minh
Xác minh --> [*]
}
**Kết quả hiển thị**:
```mermaid
stateDiagram-v2
[*] --> Nhàn rỗi
Nhàn rỗi --> Chạy : Bắt đầu
Chạy --> Tạm dừng : Tạm dừng
Chạy --> Hoàn thành : Kết thúc
Tạm dừng --> Chạy : Tiếp tục
Tạm dừng --> Dừng : Dừng
Dừng --> Nhàn rỗi : Đặt lại
Hoàn thành --> Nhàn rỗi : Đặt lại
Hoàn thành --> [*]
state Chạy {
[*] --> Khởi tạo
Khởi tạo --> Đang xử lý
Đang xử lý --> Xác minh
Xác minh --> [*]
}Biểu đồ Gantt (Gantt Chart)
markdown
```mermaid
gantt
title Dòng thời gian phát triển dự án
dateFormat YYYY-MM-DD
section Phân tích yêu cầu
Thu thập yêu cầu :done, des1, 2024-01-01,2024-01-05
Phân tích yêu cầu :done, des2, after des1, 5d
Rà soát yêu cầu :done, des3, after des2, 2d
section Giai đoạn thiết kế
Thiết kế hệ thống :active, design1, 2024-01-12, 7d
Thiết kế UI : design2, after design1, 5d
Thiết kế CSDL : design3, after design1, 3d
section Giai đoạn phát triển
Phát triển frontend: dev1, after design2, 10d
Phát triển backend : dev2, after design3, 12d
Kiểm thử : test1, after dev1, 5d
**Kết quả hiển thị**:
```mermaid
gantt
title Dòng thời gian phát triển dự án
dateFormat YYYY-MM-DD
section Phân tích yêu cầu
Thu thập yêu cầu :done, des1, 2024-01-01,2024-01-05
Phân tích yêu cầu :done, des2, after des1, 5d
Rà soát yêu cầu :done, des3, after des2, 2d
section Giai đoạn thiết kế
Thiết kế hệ thống :active, design1, 2024-01-12, 7d
Thiết kế UI : design2, after design1, 5d
Thiết kế CSDL : design3, after design1, 3d
section Giai đoạn phát triển
Phát triển frontend : dev1, after design2, 10d
Phát triển backend : dev2, after design3, 12d
Kiểm thử : test1, after dev1, 5dBiểu đồ tròn (Pie Chart)
markdown
```mermaid
pie title Nguồn truy cập trang web
"Công cụ tìm kiếm" : 45
"Mạng xã hội" : 25
"Truy cập trực tiếp" : 20
"Email marketing" : 7
"Khác" : 3
**Kết quả hiển thị**:
```mermaid
pie title Nguồn truy cập trang web
"Công cụ tìm kiếm" : 45
"Mạng xã hội" : 25
"Truy cập trực tiếp" : 20
"Email marketing" : 7
"Khác" : 3Hành trình người dùng (User Journey)
markdown
```mermaid
journey
title Hành trình mua sắm của người dùng
section Khám phá
Truy cập trang chủ: 3: Người dùng
Duyệt sản phẩm: 4: Người dùng
Tìm kiếm sản phẩm: 4: Người dùng
section Cân nhắc
Xem chi tiết: 4: Người dùng
So sánh giá: 3: Người dùng
Đọc đánh giá: 5: Người dùng
section Mua hàng
Thêm vào giỏ: 4: Người dùng
Thanh toán: 3: Người dùng
Trả tiền: 2: Người dùng
section Sử dụng
Nhận hàng: 5: Người dùng
Sử dụng sản phẩm: 4: Người dùng
Viết đánh giá: 4: Người dùng
**Kết quả hiển thị**:
```mermaid
journey
title Hành trình mua sắm của người dùng
section Khám phá
Truy cập trang chủ: 3: Người dùng
Duyệt sản phẩm: 4: Người dùng
Tìm kiếm sản phẩm: 4: Người dùng
section Cân nhắc
Xem chi tiết: 4: Người dùng
So sánh giá: 3: Người dùng
Đọc đánh giá: 5: Người dùng
section Mua hàng
Thêm vào giỏ: 4: Người dùng
Thanh toán: 3: Người dùng
Trả tiền: 2: Người dùng
section Sử dụng
Nhận hàng: 5: Người dùng
Sử dụng sản phẩm: 4: Người dùng
Viết đánh giá: 4: Người dùngSơ đồ Git (Git Graph)
markdown
```mermaid
gitgraph
commit id: "Commit khởi tạo"
commit id: "Thêm mô-đun người dùng"
branch feature/auth
commit id: "Thêm chức năng đăng nhập"
commit id: "Thêm chức năng đăng ký"
checkout main
commit id: "Sửa lỗi trang chủ"
merge feature/auth
commit id: "Phiên bản v1.0"
branch hotfix
commit id: "Sửa gấp"
checkout main
merge hotfix
commit id: "Phiên bản v1.0.1"
**Kết quả hiển thị**:
```mermaid
gitgraph
commit id: "Commit khởi tạo"
commit id: "Thêm mô-đun người dùng"
branch feature/auth
commit id: "Thêm chức năng đăng nhập"
commit id: "Thêm chức năng đăng ký"
checkout main
commit id: "Sửa lỗi trang chủ"
merge feature/auth
commit id: "Phiên bản v1.0"
branch hotfix
commit id: "Sửa gấp"
checkout main
merge hotfix
commit id: "Phiên bản v1.0.1"Tình huống áp dụng thực tế
Sơ đồ kiến trúc hệ thống
markdown
```mermaid
flowchart TB
subgraph "Tầng người dùng"
Web[Trình duyệt Web]
Mobile[Ứng dụng di động]
API[Khách hàng API]
end
subgraph "Tầng cổng"
Gateway[Cổng API]
Auth[Dịch vụ xác thực]
end
subgraph "Tầng dịch vụ"
UserService[Dịch vụ người dùng]
OrderService[Dịch vụ đơn hàng]
PaymentService[Dịch vụ thanh toán]
NotificationService[Dịch vụ thông báo]
end
subgraph "Tầng dữ liệu"
UserDB[(CSDL người dùng)]
OrderDB[(CSDL đơn hàng)]
Cache[(Bộ nhớ đệm Redis)]
Queue[Hàng đợi thông điệp]
end
Web --> Gateway
Mobile --> Gateway
API --> Gateway
Gateway --> Auth
Gateway --> UserService
Gateway --> OrderService
Gateway --> PaymentService
UserService --> UserDB
OrderService --> OrderDB
PaymentService --> Queue
NotificationService --> Queue
UserService --> Cache
OrderService --> Cache
style Gateway fill:#e1f5fe
style Auth fill:#fff3e0
style Cache fill:#f3e5f5
### Quy trình gọi API
```markdown
```mermaid
sequenceDiagram
participant C as Khách hàng
participant G as Cổng API
participant A as Dịch vụ xác thực
participant U as Dịch vụ người dùng
participant D as Cơ sở dữ liệu
participant R as Redis
C->>G: Yêu cầu thông tin người dùng
G->>A: Xác thực Token
A->>R: Kiểm tra bộ nhớ đệm Token
R-->>A: Token hợp lệ
A-->>G: Xác thực thành công
G->>U: Lấy thông tin người dùng
U->>R: Kiểm tra bộ nhớ đệm người dùng
alt Có trong bộ nhớ đệm
R-->>U: Trả về dữ liệu người dùng
else Không có trong bộ nhớ đệm
U->>D: Truy vấn CSDL
D-->>U: Trả về thông tin người dùng
U->>R: Cập nhật bộ nhớ đệm
end
U-->>G: Trả về thông tin người dùng
G-->>C: Phản hồi dữ liệu người dùng
### Lưu đồ nghiệp vụ
```markdown
```mermaid
flowchart TD
Start([Người dùng đặt hàng]) --> Check{Kiểm tra tồn kho}
Check -->|Còn hàng| Reserve[Dự trữ hàng]
Check -->|Hết hàng| OutOfStock[Không đủ hàng]
OutOfStock --> Notify[Thông báo người dùng]
Notify --> End1([Kết thúc])
Reserve --> Payment[Xử lý thanh toán]
Payment -->|Thành công| ConfirmOrder[Xác nhận đơn hàng]
Payment -->|Thất bại| ReleaseStock[Giải phóng tồn kho]
ReleaseStock --> PaymentFailed[Thanh toán thất bại]
PaymentFailed --> End2([Kết thúc])
ConfirmOrder --> UpdateInventory[Cập nhật tồn kho]
UpdateInventory --> SendNotification[Gửi thông báo]
SendNotification --> Logistics[Sắp xếp vận chuyển]
Logistics --> End3([Hoàn tất đơn hàng])
style Start fill:#e8f5e8
style End1 fill:#ffebee
style End2 fill:#ffebee
style End3 fill:#e8f5e8
style OutOfStock fill:#ffebee
style PaymentFailed fill:#ffebee
## Kiểu dáng và chủ đề
### Kiểu nút
```markdown
```mermaid
flowchart LR
A[Kiểu mặc định] --> B[Kiểu 1]
A --> C[Kiểu 2]
A --> D[Kiểu 3]
style B fill:#f9f,stroke:#333,stroke-width:4px
style C fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
style D fill:#f96,stroke:#333,stroke-width:4px,color:#fff
### Kiểu theo lớp (class)
```markdown
```mermaid
flowchart LR
A[Nút A]:::classA --> B[Nút B]:::classB
A --> C[Nút C]:::classC
classDef classA fill:#e1f5fe,stroke:#01579b,stroke-width:2px
classDef classB fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
classDef classC fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px
## Cấu hình và tương thích
### Cấu hình VitePress
```javascript
// .vitepress/config.js
export default {
markdown: {
mermaid: true
}
}Hỗ trợ trên GitHub
GitHub hỗ trợ Mermaid nguyên bản, có thể dùng trực tiếp trong tệp Markdown:
markdown
```mermaid
graph LR
A --> B
### Hỗ trợ trên nền tảng khác
| Nền tảng | Trạng thái hỗ trợ | Yêu cầu cấu hình |
|----------|-------------------|------------------|
| **GitHub** | ✅ Hỗ trợ nguyên bản | Không cần cấu hình |
| **GitLab** | ✅ Hỗ trợ nguyên bản | Không cần cấu hình |
| **VitePress** | ✅ Hỗ trợ qua plugin | Cần cấu hình |
| **Jekyll** | ✅ Hỗ trợ qua plugin | Cài đặt plugin |
| **Hugo** | ✅ Hỗ trợ qua theme | Phụ thuộc theme |
## Thực hành tốt nhất
### Gợi ý thiết kế
```markdown
✅ Khuyến nghị:
1. **Giữ đơn giản**:
- Tránh biểu đồ quá phức tạp
- Dùng nhãn và đường nối rõ ràng
2. **Bố cục hợp lý**:
- Chọn hướng biểu đồ phù hợp
- Giữ luồng logic rõ ràng
3. **Thống nhất kiểu dáng**:
- Dùng chủ đề màu sắc nhất quán
- Duy trì phong cách biểu đồ đồng nhất
4. **Thêm chú thích**:
- Thêm tiêu đề cho biểu đồ phức tạp
- Cung cấp mô tả cần thiết
❌ Tránh:
1. Biểu đồ quá phức tạp, khó hiểu
2. Quá nhiều đường nối chồng chéo
3. Nhãn mơ hồ, không rõ ràng
4. Thiếu chú giải (legend) cần thiếtCân nhắc hiệu năng
markdown
- **Tối ưu biểu đồ lớn**:
- Cân nhắc tách nhỏ biểu đồ phức tạp
- Dùng sơ đồ con để tổ chức cấu trúc
- **Hiệu năng tải**:
- Tránh nhúng quá nhiều biểu đồ trong một trang
- Cân nhắc áp dụng lazy-load
- **Tương thích di động**:
- Đảm bảo biểu đồ dễ đọc trên màn hình nhỏ
- Cân nhắc thiết kế cuộn ngangCú pháp liên quan
- Nhúng HTML - Tăng cường HTML
- Công thức toán - Biểu thức LaTeX
- Thực hành tốt nhất - Gợi ý soạn tài liệu
Công cụ và tài nguyên
Trình soạn thảo trực tuyến
- Mermaid Live Editor: Trình soạn trực tuyến chính thức
- Draw.io: Công cụ vẽ sơ đồ đa dụng
- Lucidchart: Nền tảng vẽ sơ đồ chuyên nghiệp
- Excalidraw: Công cụ sơ đồ phong cách vẽ tay
Công cụ phát triển
- Mermaid CLI: Công cụ dòng lệnh
- VS Code Mermaid: Tiện ích VS Code
- Atom Mermaid: Tiện ích cho Atom
- IntelliJ Mermaid: Tiện ích JetBrains IDE
Tài nguyên tham khảo
- Tài liệu chính thức Mermaid: Tham khảo cú pháp đầy đủ
- Thư viện ví dụ Mermaid: Nhiều ví dụ biểu đồ
- GitHub Mermaid: Sử dụng trên GitHub
- Awesome Mermaid: Tổng hợp tài nguyên liên quan
Bằng cách nắm vững cú pháp lưu đồ, bạn có thể tạo các biểu đồ trực quan chuyên nghiệp, nâng cao khả năng trình bày và mức độ dễ hiểu của tài liệu.