ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
Nguyễn Thanh Thọ – 17521093
Đồng Việt Tùng - 17521231
ĐỒ ÁN 2
Tìm hiểu Docker và xây dựng ứng dụng
KỸ SƯ NGÀNH KỸ THUẬT PHẦN MỀM
GIẢNG VIÊN HƯỚNG DẪN
Ths. Nguyễn Cơng Hoan
TP. HỒ CHÍ MINH, 2021
1
LỜI CẢM ƠN
Lời đầu tiên, chúng em xin chân thành cảm ơn thầy Nguyễn Công Hoan – giảng
viên phụ trách – đã hướng dẫn tận tình chúng em trong thời gian thực hiện đồ án. Nhờ có
sự giúp đỡ tận tình của thầy chúng em có thể hồn thành được đồ án một cách tốt nhất
Tuy chúng em đã cố gắng hạn chế những sai sót hết mức có thể nhưng vì kiến thức
cịn hạn hẹp nên chúng em khó tránh khỏi những sai sót trong q trình thực hiện cũng
như là lúc báo cáo đồ án. Do đó, chúng em mong nhận được ý kiến đóng góp từ thầy để
chúng em có thể khắc phục, sửa chữa.
Chúng em xin chân thành cảm ơn thầy!
2
LỜI NHẬN XÉT CỦA GIẢNG VIÊN
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
3
MỤC LỤC
LỜI CẢM ƠN ...................................................................................................................... 2
LỜI NHẬN XÉT CỦA GIẢNG VIÊN ............................................................................... 3
MỤC LỤC ........................................................................................................................... 4
DANH MỤC HÌNH............................................................................................................. 6
TĨM TẮT ĐỒ ÁN 2 ........................................................................................................... 7
Chương 1: Kiến thức về Docker .......................................................................................... 8
1.1. Giới thiệu sơ lược về Docker ................................................................................. 8
1.1.1. Docker là gì? ...................................................................................................... 8
1.1.2. Lịch sử ra đời ..................................................................................................... 8
1.1.3. Roadmap phát triển............................................................................................ 8
1.2. Kiến trúc tổng thể ................................................................................................... 9
1.2.1. Docker Engine ................................................................................................... 9
1.2.2. Docker Hub...................................................................................................... 10
1.2.3. Một số thuật ngữ .............................................................................................. 10
1.3. Cách thức hoạt động ............................................................................................ 11
1.4. Docker mang lại lợi ích gì? Cho ai? Trong hồn cảnh nào? ................................ 13
1.3.1. Lợi ích và hồn cảnh sử dụng .......................................................................... 13
1.3.2. Ai sử dụng Docker........................................................................................... 13
1.5. Một số công cụ phổ biến ...................................................................................... 13
1.5.1. Docker Compose ............................................................................................. 13
1.5.2. Docker Swarm ................................................................................................. 13
1.6. So sánh Docker với các công nghệ tương tự ....................................................... 14
4
Chương 2: Áp dụng Docker .............................................................................................. 16
2.1. Setup Dockerfile ..................................................................................................... 16
2.1.1. NestJs - backend .............................................................................................. 16
Giải thích thơng số..................................................................................................... 17
Run project với nestjs ................................................................................................ 17
2.1.2. VueJs - frontend .............................................................................................. 17
Run Project cho VueJs............................................................................................... 18
2.2. Setup Docker-Compose .......................................................................................... 19
2.2.1. Quy trình cơ bản .............................................................................................. 19
2.2.2. Docker-compose file ....................................................................................... 19
Chương 3: Phát triển Website học tiếng anh ..................................................................... 21
3.1. Mô tả ứng dụng....................................................................................................... 21
3.2. Sơ đồ Use case ........................................................................................................ 22
3.2.1. Tổng quát ......................................................................................................... 22
3.2.2. Đặc tả Use Case ............................................................................................... 24
3.3. Sơ đồ Lớp ............................................................................................................... 44
Chương 4: Kết luận và Hướng phát triển .......................................................................... 45
4.1. Kết quả đạt được ..................................................................................................... 45
4.2. Hạn chế ................................................................................................................... 45
4.3. Hướng phát triển ..................................................................................................... 45
Chương 5: Tài liệu tham khảo ........................................................................................... 46
5
DANH MỤC HÌNH
Hình 1.1: Kiến trúc Docker ........................................................................................ 9
Hình 1.2: Trang Docker hub ....................................................................................... 10
Hình 1.3: So sánh kiến trúc của container và Virtual Machines ................................ 11
Hình 1.4: Kiến trúc phân lớp của container................................................................ 12
Hình 2.1: Build dockerfile cho VueJs ........................................................................ 18
Hình 2.2: Run dockerfile ............................................................................................ 18
Hình 3.1: Sơ đồ Use case tổng quát............................................................................ 23
Hình 3.2: Đặc tả Use case quản lý học viên ............................................................... 24
Hình 3.3: Đặc tả Use case quản lý khóa học .............................................................. 26
Hình 3.4: Đặc tả Use case quản lý tài khoản người dùng .......................................... 28
Hình 3.5: Đặc tả Use case quản lý speaker ................................................................ 30
Hình 3.6: Đặc tả Use case tìm kiếm khóa học ............................................................ 31
Hình 3.7: Đặc tả Use case quản lý khóa học cho User ............................................... 33
Hình 3.8: Đặc tả Use case quản lý khóa học cho Speaker ......................................... 35
Hình 3.9: Đặc tả Use case quên mật khẩu .................................................................. 36
Hình 3.10: Đặc tả Use case cập nhật thơng tin tài khoản ........................................... 38
Hình 3.11: Đặc tả Use case livestream ....................................................................... 39
Hình 3.12: Đặc tả Use case quản lý buổi học ............................................................. 40
Hình 3.13: Đặc tả Use case xem livestream ............................................................... 41
Hình 3.14: Đặc tả Use case đăng ký trở thành speaker .............................................. 43
Hình 3.15: Sơ đồ lớp................................................................................................... 44
6
TÓM TẮT ĐỒ ÁN 2
Hiện nay, Docker dần trở thành một cơng cụ khơng thể thiếu cho các lập trình
viên, đặc biệt là các lập trình viên chuyên về web. Do đó, mục tiêu của đồ án này là tìm
hiểu về Docker, kiến trúc công nghệ và các chức năng nổi bật của Docker. Sau đó thơng
qua việc tích hợp Docker vào quá trình phát triển một website để làm bật lên những ưu
điểm của Docker.
Website được dùng làm ứng dụng minh họa cho công nghệ Docker là website học
tiếng Anh. Trong quá trình phát triển, chúng em sẽ sử dụng các máy với các hệ điều hành
cũng như môi trường phát triển khác nhau. Sau đó sử dụng Docker để hỗ trợ cho việc
phát triển website. Từ đó rút ra được những lợi ích mà Docker mang lại.
Sau quá trình sử dụng Docker ở đồ án 2, chúng em nhận thấy việc sử dụng Docker
đã giúp chúng em giảm thiểu đáng kể những lỗi khơng đáng có do bất đồng bộ giữa các
môi trường cài đặt, kiểm thử, phát triển.
7
Chương 1: Kiến thức về Docker
1.1.
Giới thiệu sơ lược về Docker
1.1.1. Docker là gì?
Docker là một nền tảng cho nhà phát triển và sysadmin để phát triển, triển khai các
ứng dụng với container. Nó cho phép tạo các mơi trường độc lập và tách biệt để khởi
chạy và phát triển ứng dụng và môi trường này được gọi là container. Khi cần triển khai
lên bất kỳ server nào chỉ cần run container của Docker thì ứng dụng của bạn sẽ được hoạt
động ngay lập tức.
1.1.2. Lịch sử ra đời
Docker được thành lập bởi ông Solomon Hykes and Sebastien Pahl. Nó là sản
phẩm của nhóm startup Y Combinator phát triển và được công bố năng 2011.
Lúc đầu Docker project là dự án nội bộ của công ty dotCloud, platform-as-aservice ở Pháp
Lần đầu tiên docker được công bố dưới dạng open-source là tháng 3 năm 2013.
Từ phiên bản 0.9 thì docker đã dùng những component riêng được biết bằng Go (
Golang ) để thay thế cho việc dùng LXC(linux system) làm môi trường thực thi.
Vào năm 2017 thì docker đã tạo ra Moby project để phát triển vấn đề đa nhân thay
cho việc dùng docker engine.
1.1.3. Roadmap phát triển
Tháng 9-2013 Red hat và docker công bố hợp tác xoay quanh Fedora, RHEL,
OpenShift.
Tháng 10-2014 công bố tích hợp Docker engine vào windows server và hỗ trợ
native cho docker client trong windows.
Tháng 11-2014 Docker công bố hợp tác với Stratoscale(công ty làm về data
center operating system. Vmware là 1 trong các sản phẩm).Ngoài ra, Docker
container đã có thể support cho EC2 của Amazon.
Tháng 12-2014, IBM cơng bố hợp tác với Docker và tích hợp docker vào Cloud
của IBM.
8
Tháng 6-2015, Docker và 1 số công ty như: CoreOS, Google, Microsoft,
AWS, đã công bố liên kết với nhau để cung cấp giải pháp tiêu chuẩn của hệ điều
hành cho software containers.
Tháng 5-2016 nghiên cứu cho thấy những tổ chức chính tham gia đónng góp cho
docker là: The Docker Teamm Cisco, Google, Huawei,IBM, Microsoft and Red
Hat.
Tháng 6-2016, Microsoft cơng bố docker có thể sử dụng trên Windown 10.
Tháng 5-2019 WSL2 của windows có thể hỗ trợ chạy Docker.
1.2.
Kiến trúc tổng thể
Hình 1.1: Kiến trúc Docker
Docker có 2 thành phần chính: Docker Engine và Docker Hub. Docker Engine là
giải pháp ảo hóa (virtualization) dựa trên cơng nghệ container, còn tại Docker Hub là
platform Software-as-a-Service để chia sẻ images
1.2.1 Docker Engine
Docker Engine là ứng dụng dựa trên kiến trúc client-server với các thành phần chính:
Docker daemon đóng vai trị như một server. Docker daemon có thể build, run và
distribute docker container
9
Một REST API đóng vai trị như interface để giao tiếp với docker daemon
Một command line interface (CLI) đóng vai trị như một client
Docker client sẽ giao tiếp với docker daemon thông qua REST API, cả 2 sẽ kết nối
với nhau thông qua UNIX socket hoặc qua giao tiếp mạng. Việc giao tiếp theo phương
thức này cho phép Docker Client và Docker Daemon có thể chạy trên cùng một hệ thống
hoặc khác hệ thống.
1.2.2. Docker Hub
Docker hub là nơi lưu trữ các image (public hoặc private). Ở đây người dùng có
thể chia sẻ các customized image. Ngồi ra, người dùng có thể tìm và tải các image thơng
qua docker client
Hình 1.2: Trang Docker hub
1.2.3. Một số thuật ngữ
Image: Là một package chứa tất cả các thông tin, thư viện, framework,... cần thiết
để tạo ra một container. Thông thường, các image được tạo ra dựa trên các image
cha (based image) – image cha được cung cấp sẵn bởi docker.
Container: Về cơ bản, container là một công nghệ ảo hóa nhưng thay vì phải giả
lập phần cứng như Vmware thì container sẽ chia sẻ hệ điều hành với host. Mỗi
10
container đều chạy độc lập với các container khác và hệ thống mà docker đang
chạy. Do đó người dùng có thể thêm, xóa, sửa container; Kết nối với network;
Thậm chí là tạo một image dựa trên trạng thái hiện tại của container mà không ảnh
hưởng tới hệ thống host và các container khác.
Hình 1.3: So sánh kiến trúc của container và Virtual Machines
Daemon: là một loại chương trình trên các hệ điều hành Like-Unix hoạt động ẩn
mà không cần sự kiểm soát bởi user
Docker Registry: là nơi lưu trữ riêng của Docker Images. Images được push vào
registry và client sẽ pull images từ registry. Có thể sử dụng registry của riêng bạn
hoặc registry của nhà cung cấp như : AWS, Google Cloud, Microsoft Azure
1.3.
Cách thức hoạt động
Để cho mỗi container có thể chạy như một process độc lập và chiếm khơng gian ít
thì docker sử dụng kiến trúc phân lớp (layer). Những layer này còn được gọi là layer
trung gian, chúng được tạo từ những câu lệnh trong Dockerfile khi build một docker
image
Ví dụ:
11
FROM
node:stable
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN npm install grpc
RUN npm install
ENTRYPOINT [“npm”, “start”]
Với mỗi câu lệnh trên, docker sẽ tạo ra một layer nằm chồng lên container image.
Các layer sẽ được hash, có nghĩa là docker sẽ lưu các layer vào bộ nhớ cache. Điều này
sẽ tối ưu thời gian build cho các layer mà không thay đổi giữa những lần build. Tức là
người dùng sẽ không phải rebuild và copy các file ở bước COPY nếu như câu lệnh
COPY không thay đổi.
Sau khi build xong các câu lệnh, Docker sẽ tạo ra một lớp trắng mới. Người dùng
có thể truy cập tới layer này sử dụng câu lệnh docker exec –it <container> <command>
. Bằng cách này người dùng có thể thay đổi image và có thể commit những thay đổi đó
bằng câu lệnh docker commit
Hình 1.4: Kiến trúc phân lớp của container
12
1.4.
Docker mang lại lợi ích gì? Cho ai? Trong hồn cảnh nào?
1.4.1. Lợi ích và hồn cảnh sử dụng
Việc sử dụng Docker cho phép ta vận chuyển mã nhanh hơn, tiêu chuẩn hóa hoạt
động của ứng dụng, di chuyển mã một cách trơn tru và tiết kiệm tiền bằng cách cải
thiện khả năng tận dụng tài nguyên.
Với Docker, ta sẽ được nhận một đối tượng duy nhất có khả năng chạy ổn định ở
bất kỳ đâu. Cú pháp đơn giản và không phức tạp của Docker sẽ cho ta quyền kiểm
sốt hồn tồn.
Thứ tư là dễ dàng automate (tự động hóa) việc quản lý các docker container
thơng qua Kubernetes hoặc Docker Swarm.
Container Docker giúp cho việc chạy nhiều mã hơn trên từng máy chủ trở nên dễ
dàng hơn, cải thiện khả năng tận dụng và tiết kiệm tiền bạc cho chúng ta, giúp dự
án có khả năng mở rộng cao.
1.4.2. Ai sử dụng Docker
Business Analysist: thường dùng docker để chạy môi trường demo cho khách
hàng.
QA & QC: thường dùng docker để chạy môi trường test để kiểm thử sản phầm.
Software Architect dùng để kiểm thử những cơng nghệ và tính ổn định của các
cơng nghệ trên nhiều nền tảng khác.
1.5.
Một số công cụ phổ biến
1.5.1 Docker Compose
Docker Compose là một công cụ được dùng để quản lý và chạy các Docker
Container. Docker Compose cho phép ta cấu hình các container trong một file YAML
duy nhất và chạy tất cả các container chỉ với một câu lệnh
1.5.2. Docker Swarm
Docker Swarm là một công cụ giúp gom cụm các Docker. Docker Swarm có thể
gom nhiều Docker Engine lại với nhau thành một Docker Engine “ảo”. Tức là bất cứ
13
cơng cụ nào giao tiếp với Docker Engine thì cũng có thể giao tiếp với Docker Swarm như
bình thường
1.6.
So sánh Docker với các công nghệ tương tự
LXD
OpenVZ
LinuxVServer
Windows
Containers
So sánh
Mô phỏng
Một phần mở
Sử dụng nhân được vá Docker Engine
với
trải nghiệm
rộng của nhân
để cung cấp các tính
dành cho
docker
vận hành
Linux, cung
năng ảo hóa cấp hệ
Windows
Máy ảo
cấp các công
điều hành. Mỗi Máy
Server 2016
nhưng về
cụ để ảo hóa
chủ riêng ảo được
truy cập trực
vùng chứa và
cho người
chạy như một quy
tiếp vào nhân
làm như vậy
dùng. Nó sử
trình riêng biệt trên
windows. Do
mà khơng tốn dụng Mơi
cùng một hệ thống
đó vùng chứa
chi phí mơ
trường ảo để
máy chủ lưu trữ và có
Docker gốc
phỏng tài
lưu trữ các hệ
hiệu quả cao do khơng không thể chạy
nguyên phần
thống Khách,
cần mô phỏng. Tuy
trên Vùng chứa
cứng. Mặc dù có nghĩa là nó
nhiên, nó là cổ điển về của Windows.
daemon LXD sử dụng vùng
số lượng phát hành, vì
Thay vào đó,
u cầu nhân
chứa cho tồn
chưa có bản nào kể từ
một định dạng
Linux, nó có
bộ hệ điều
năm 2007.
vùng chứa khác,
thể được cấu
hành, khơng
WSC (Vùng
hình để truy
phải các ứng
chứa Windows
cập bằng máy dụng và quy
Server), sẽ được
khách
sử dụng.
trình riêng lẻ.
Windows
hoặc macOS.
14
Trường Quyền truy
CI / CD và
hợp sử
cập phần
dụng
cứng trần cho chứa và dữ
Nhiều VPS lưu trữ và
DevOps, Vùng quản trị, và hỗ trợ
VPS, nhiều
liệu lớn, Bộ
bản phân
Ứng dụng
phối Linux
Người dùng
Legacy.
trên cùng một Biệt lập Lưu
máy chủ.
trữ, Hợp nhất
máy chủ.
dễ
dễ
trung bình
Các
Walmart
FastVPS,
DreamHost,
cơng ty
PayPal, Box.
Parallels,
Amoebasoft,
Pixar
OpenHosting Inc.,
Animation
Lycos, Pháp, Mosaix
Studios,
Communications, Inc.
Khả
năng
tích
hợp
sử dụng
Yandex.
15
Chương 2: Áp dụng Docker
2.1. Setup Dockerfile
2.1.1. NestJs – backend
FROM node:12.13-alpine As development
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install –only=development
COPY . .
RUN npm run build
FROM node:12.13-alpine as production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install –only=production
COPY . .
COPY –from=development /usr/src/app/dist ./dist
CMD [“node”, “dist/main”]
16
Giải thích thơng số
FROM — chỉ định image gốc: python, unbutu, alpine…
LABEL — cung cấp metadata cho image. Có thể sử dụng để add thông tin maintainer.
Để xem các label của images, dùng lệnh docker inspect.
ENV — thiết lập một biến mơi trường.
RUN — Có thể tạo một lệnh khi build image. Được sử dụng để cài đặt các package vào
container.
COPY — Sao chép các file và thư mục vào container.
ADD — Sao chép các file và thư mục vào container.
CMD — Cung cấp một lệnh và đối số cho container thực thi. Các tham số có thể được
ghi đè và chỉ có một CMD.
WORKDIR — Thiết lập thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD,
ENTRYPOINT, COPY, ADD,…
ARG — Định nghĩa giá trị biến được dùng trong lúc build image.
ENTRYPOINT — cung cấp lệnh và đối số cho một container thực thi.
EXPOSE — khai báo port lắng nghe của image.
VOLUME — tạo một điểm gắn thư mục để truy cập và lưu trữ data.
Run project với nestjs
Bước 1: config file Dockerfile
Bước 2: docker build –t <<app-name>> .
Bước 3: docker run –p 8080:8080 app-name
2.1.2. VueJs – frontend
FROM node:12
WORKDIR /app
COPY package*.json .
17
RUN npm install
COPY . .
RUN npm run build
EXPOSE 8080
CMD [“npm”,”run”,”serve”]
Run Project cho VueJs
Bước 1: docker build –t <<app-name>>
Hình 2.1: Build dockerfile cho VueJs
Bước 2: docker run -it -p 8080:8080 -v /app/node_modules --rm test:latest
Hình 2.2: Run dockerfile
18
2.2. Setup Docker-Compose
2.2.1. Quy trình cơ bản
Cơ bản quy trình dùng docker compose gồm ba bước:
1. Xác định môi trường ứng dụng của bạn bằng Dockerfile để nó có thể được lưu trữ
ở mọi nơi.
2. Xác định các dịch vụ tạo nên ứng dụng của bạn trong docker-compose.yml để
chúng có thể chạy cùng nhau trong một môi trường biệt lập.
3. Chạy docker-compose up và bắt đầu chạy toàn bộ ứng dụng của bạn.
2.2.2. Docker-compose file
version: "3.7"
services:
my_service:
container_name: my_service
build: ./back_end
volumes:
- .:/app
ports:
- "8080:8080"
- "9000:9000"
links:
- my_service_db
environment:
- dev=1
- db_service_name=my_service_db
- db_name=learning
- db_retry_time=3000
my_service_db:
container_name: my_service_db
image: mongo
volumes:
- ./db:/data/db
ports:
- "27017:27017"
Ghi chú:
services: để khai báo những service có trong docker-compose
build: để khai báo đường dẫn tới service và có thể thêm đường dẫn đến docker file
reset: always dùng khi db gặp sự cố thì tự khởi động lại
image: khai báo tên image khi build
container_name: khai báo tên container khi build
port: ánh xạ port từ container sang port sang máy local
19
environment: tương tự như file .env để setup môi trường
links: để chỉ ra liên kết của các image với nhau
volumes: là nơi chứa data
20
Chương 3: Phát triển Website học tiếng anh
3.1. Mô tả ứng dụng
Website là cầu nối giữa người dạy và người học. Cho phép người học tìm kiếm và đăng
ký vào một khóa học tùy theo trình độ của mình. Người học có thể xem bài học qua video
hoặc là xem livestream giảng dạy trực tiếp nếu người dùng sử dụng gói tài khoản cao cấp
hơn.
21
3.2. Sơ đồ Use case
3.2.1. Tổng quát
22
23
Hình 3.1: Sơ đồ Use case tổng quát
3.2.2. Đặc tả Use Case
3.2.2.1. Quản lý học viên
Hình 3.2: Đặc tả Use case quản lý học viên
Use case ID
USC-01
Use case name
Quản lý học viên
Description
Là admin, tôi muốn Quản lý các thông tin học viên, thực hiện
chuyển đổi các loại tài khoản
Actor(s)
Admin
Priority
Must have
24
Trigger
Khi có nhu cầu chỉnh sửa thơng tin học viên
Khi muốn thống kê số lượng học viên để báo cáo cuối năm
Pre-Condition(s)
Admin đã đăng nhập vào tài khoản admin
Đối với chức năng thăng cấp, tài khoản, học viện phải có tài
khoản trong cơ sở dữ liệu
Post-Condition(s)
Hệ thống ghi nhận lại hoạt động
Admin có thể chỉnh sửa thơng tin học viên
Admin có thể xuất báo cáo về số lượng học viên
Basic Flow
1.
2.
3.
4.
Admin truy cập vào phần quản lý học viên
Admin chọn lệnh tùy theo nhu cầu
Admin xác nhận lại thông tin đã chỉnh sửa
Hệ thống ghi lại hoạt động
Alternative Flow
2a. Admin chọn lệnh thêm, xóa, sửa thơng tin học viên
2a.1 Admin tiến hành chỉnh sửa thông tin học viên
Use case tiếp tục bước 3
2b. Admin chọn lệnh thăng cấp tài khoản
2b.1 Admin xác nhận học viên đã thanh toán
2b.2 Admin nhập thời hạn hiệu lực cho tài khoản Student Pro
2b.3 Admin chuyển loại tài khoản Student Free thành Student
Pro
Use case tiếp tục bước 3
2b.4 Hệ thống gửi mail thông báo đến người dùng
Use case tiếp tục bước 4
2c. Admin chọn lệnh giáng cấp tài khoản
2c.1 Admin chuyển loại tài khoản từ Student Pro thành
Student Free
Use case tiếp tục bước 3
2c.2 Hệ thống gửi mail thông báo đến người dùng
Use case tiếp tục bước 4
2d. Admin chọn lệnh thống kê
2d.1 Hệ thống xuất ra bản báo cáo theo định dạng cho trước
Use case tiếp tục bước 4
Exception Flow
1. Admin dùng lệnh quay lại
Use case dừng lại
2. Admin dùng lệnh hủy
Use case dừng lại
2b.1 Học viên chưa thanh tốn
Admin gửi email thơng báo nhắc nhở
25