Để hoàn thành khóa luận này, chúng em xin gửi lời cảm ơn chân thành đến: Ban Giám hiệu trường Đại học Công nghệ Thông tin – ĐHQG TP.HCM vì đã tạo điều kiện về cơ sở vật chất với hệ thống
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
ẢNH Building Ecommerce system to support purchasing and selling
movie-related products
KỸ SƯ NGÀNH CÔNG NGHỆ PHẦN MỀM
TP HỒ CHÍ MINH, 2021
Trang 2ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
ẢNH Building Ecommerce system to support purchasing and selling
Trang 3DANH SÁCH HỘI ĐỒNG BẢO VỆ KHÓA LUẬN
Hội đồng chấm khóa luận tốt nghiệp, thành lập theo Quyết định số ……… ngày
……… của Hiệu trưởng Trường Đại học Công nghệ Thông tin
Trang 4ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC
CÔNG NGHỆ THÔNG TIN
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc Lập - Tự Do - Hạnh Phúc
TP HCM, ngày tháng năm 2021
NHẬN XÉT KHÓA LUẬN TỐT NGHIỆP (CỦA CÁN BỘ HƯỚNG DẪN) Tên khóa luận:
Xây dựng hệ thống thương mại điện tử hỗ trỡ kinh doanh các mặt hàng liên quan
đến phim ảnh
Nhóm sinh viên thực hiện: Cán bộ hướng dẫn:
NGUYỄN HUỲNH THANH TÂM 16521062 ThS NGUYỄN TẤN TOÀN
NGUYỄN TÂY TRUNG 16521319 ThS THÁI THỤY HÀN UYỂN
Đánh giá Khóa luận:
1 Về cuốn báo cáo:
Một số nhận xét về hình thức cuốn báo cáo:
●
2 Về nội dung nghiên cứu:
Trang 5Điểm từng sinh viên:
NGUYỄN HUỲNH THANH TÂM: ……… /10
NGUYỄN TÂY TRUNG: ……… /10
Người nhận xét Người nhận xét
Nguyễn Tấn Toàn Thái Thụy Hàn Uyển
Trang 6ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC
CÔNG NGHỆ THÔNG TIN
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc Lập – Tự Do – Hạnh Phúc
TP HCM, ngày tháng năm 2021
NHẬN XÉT KHÓA LUẬN TỐT NGHIỆP
(CỦA CÁN BỘ PHẢN BIỆN) Tên khóa luận:
Xây dựng hệ thống thương mại điện tử hỗ trỡ kinh doanh các mặt hàng liên quan đến phim ảnh
Nhóm sinh viên thực hiện: Cán bộ phản biện:
NGUYỄN HUỲNHTHANH TÂM 16521062
Đánh giá Khóa luận:
1 Về cuốn báo cáo:
Một số nhận xét về hình thức cuốn báo cáo:
2 Về nội dung nghiên cứu:
3 Về chương trình ứng dụng:
4 Về thái độ làm việc của sinh viên:
Trang 7Đánh giá chung:
Điểm từng sinh viên:
NGUYỄN HUỲNH THANH TÂM: ……… /10
NGUYỄN TÂY TRUNG: ……… /10
Người nhận xét
(Ký và ghi rõ họ tên)
Trang 8LỜI CẢM ƠN
Sau quá trình học tập và rèn luyện tại khoa Công nghệ phần mềm trường Đại học Công nghệ Thông tin – ĐHQG TP.HCM chúng em đã được trang bị các kiến thức cơ bản, các kỹ năng thực tế để có thể hoàn thành Khóa luận tốt nghiệp của mình
Để hoàn thành khóa luận này, chúng em xin gửi lời cảm ơn chân thành đến:
Ban Giám hiệu trường Đại học Công nghệ Thông tin – ĐHQG TP.HCM vì đã tạo điều kiện về cơ sở vật chất với hệ thống thư viện hiện đại, đa dạng các loại sách, tài liệu thuận lợi cho việc tìm kiếm, nghiên cứu thông tin
Chúng em xin gửi lời cảm ơn chân thành đến thầy Nguyễn Tấn Toàn, cô Thái Thụy Hàn Uyển đã tận tình giúp đỡ, định hướng cách tư duy và cách làm việc khoa học
Đó là những góp ý vô cùng quý báu không chỉ trong quá trình thực hiện luận văn này
mà còn là hành trang tiếp bước cho chúng em trong quá trình học tập và lập nghiệp sau này
Trong quá trình làm khóa luận này chúng em không tránh khỏi được những sai sót, chúng em kính mong nhận được sự chỉ dẫn và góp ý của quý thầy cô để khóa luận được hoàn thiện hơn
Chúng em xin chân thành cảm ơn Xin chúc những điều tốt đẹp nhất sẽ luôn đồng hành cùng mọi người
Thành phố Hồ Chí Minh, 15 tháng 01 năm 2021
Sinh viên
NGUYỄN HUỲNH THANH TÂM
Trang 9MỤC LỤC
TÓM TẮT KHÓA LUẬN 1
Chương 1: GIỚI THIỆU CHUNG 2
1.1 Lý do lựa chọn đề tài 2
1.2 Những điểm khác biệt về chức năng của đề tài so với một số trang web thương mại điển tử hiện nay 3
1.2 Đối tượng 3
1.3 Phạm vi 3
1.4 Phương pháp thực hiện 4
Chương 2: KIẾN THỨC NỀN TẢNG 5
2.1 Tổng quan về kiến trúc phần mềm Microservice 5
2.1.1 Khái niệm 5
2.1.2 Ưu điểm và nhược điểm của kiến trúc phần mềm Microservice 5
2.1.3 API Gateway: 7
2.2 Tổng quan về Nodejs 9
2.2.1 Khái niệm 9
2.2.2 Lý do lựa chọn Nodejs để xây dựng và phát triển giao diện web 10
2.3 Tổng quan về Reactjs - Redux 11
2.3.1 ReactJS 11
2.3.2 Lý do lựa chọn Reactjs để xây dựng và phát triển giao diện web 13
2.3.3 Redux 13
2.3.4 Lý do lựa chọn Redux-Saga 14
2.4 Hệ quản trị cơ sở dữ liệu MySQL 14
2.4.1 Giới thiệu về MySQL 14
2.4.2 Lý do lựa chọn 15
Trang 102.5 Hệ quản trị cơ sở dữ liệu MongoDB 16
2.5.1 Giới thiệu về MongoDB 16
2.5.2 Lý do lựa chọn MongoDb 17
2.6 JWT authentication 17
2.6.1 Giới thiệu về JWT (JSON Web Token) 17
2.6.2 Ứng dụng của JWT 18
2.7 Cloudinary 19
2.7.1 Giới thiệu về Cloudinary 20
2.7.2 Lợi ích khi sử dụng Cloudinary 20
2.8 Amazon Elastic Compute Cloud (Amazon EC2) 20
2.8.1 Khái niệm của Amazon EC2 20
2.8.2 Một số tính năng nổi bật 20
2.9 Docker 21
2.9.1 Giới thiệu về Docker 21
2.9.2 Lý do lựa chọn Docker 21
2.10 Thuật toán khuyến nghị 22
2.10.1 Utility Matrix 22
2.10.2 Cosine similarity 23
2 10.3 Root Mean Squared Error (RMSE) 25
Chương 3: XÂY DỰNG HỆ THỐNG 26
3.1 Xây dựng kiến trúc hệ thống 26
3.1.1 Xác định yêu cầu hệ thống 26
3.1.2 Phân tích yêu cầu hệ thống 28
3.2 Phân tích thiết kế hệ thống 35
3.2.1 Sơ đồ Use case 36
3.2.2 Sơ đồ lớp 103
Trang 113.2.3 Sơ đồ tuần tự 135
3.3 Thiết kế giao diện 171
3.3.1 Giao diện dành cho khách hàng 172
3.3.2 Giao diện dành cho người bán 176
3.3.3 Giao diện dành cho admin 187
Chương 4: Kết luận, đánh giá, hướng phát triển 200
4.1 Ưu điểm 200
4.2 Nhược điểm 200
4.3 Hướng phát triển 200
Trang 12DANH MỤC HÌNH VẼ
Hình 2-1: Ví dụ kiến trúc Microservice
Hình 2-2: Kiến trúc Microservice với API Gateway Hình 2-3: Lợi ích của Node.js
Hình 2-4: Cấu trúc DOM Tree
Hình 2-5: Tính năng của MongoDB
Hình 2-12: Công thức tính RMSE
Hình 3-1: Use case tổng quát của Admin
Hình 3-2: Use case tổng quát của Người bán
Hình 3-3: Use case tổng quát của Khách hàng
Hình 3-4: Use case khách hàng đăng ký tài khoản
Hình 3-5: Use case người bán đăng ký tài khoản bán hàng Hình 3-6: Use case đăng nhập
Hình 3-7: Use case quản lý phân quyền của Admin
Hình 3-8: Use case quản lý đơn hàng của Người bán Hình 3-9: Use case xử lý đơn hàng lỗi của Admin
Hình 3-10: Use case quản lý sản phẩm của Admin
Hình 3-11: Use case quản lý sản phẩm của Người bán Hình 3-12: Use case quản lý kho của Người bán
Hình 3-13: Use case quản lý nhân viên
Hình 3-14: Use case quản lý phiếu chi
Hình 3-15: Use case xem lịch sử hoạt động
Hình 3-16: Use case quản lý khách hàng
Trang 13Hình 3-17: Use case quản lý nhà bán
Hình 3-18: Use case quản lý phim
Hình 3-19: Use case quản lý thể loại phim
Hình 3-20: Use case quản lý chương trình khuyến mại Hình 3-21: Use case quản lý bài đánh giá của khách hàng Hình 3-22: Use case quản lý phản hồi của khách hàng
Hình 3-23: Use case quản lý câu hỏi của khách hàng
Hình 3-24: Use case quản lý câu trả lời của khách hàng Hình 3-25: Use case tìm kiếm sản phẩm
Hình 3-26: Use case xem chi tiết sản phẩm
Hình 3-27: Use case quản lý giỏ hàng
Hình 3-28: Use case đặt và mua hàng
Hình 3-29: Use case quản lý sản phẩm mua sau
Hình 3-30: Use case chỉnh sửa thông tin cá nhân
Hình 3-31: Use case quản lý sổ địa chỉ
Hình 3-32: Use case thống kê doanh thu
Hình 3-33: Use case hủy đơn hàng
Hình 3-34: Use case xem thông tin và sản phẩm của nhà bán Hình 3-35: Use case sửa thông tin của nhà bán
Hình 3-36: Use case đánh giá sản phẩm
Hình 3-37: Use case đặt câu hỏi cho sản phẩm
Hình 3-38: Use case phản hồi bài đánh giá
Hình 3-39: Use case trả lời câu hỏi
Hình 3-40: Use case like câu hỏi
Hình 3-41: Use case like bài đánh giá
Hình 3-42: Sơ đồ lớp tổng quát
Hình 3-43: Sơ đồ tuần tự người bán đăng nhập
Hình 3-44: Sơ đồ tuần tự Admin đăng nhập
Hình 3-45: Sơ đồ tuần tự Khách hàng đăng nhập
Trang 14Hình 3-46: Sơ đồ tuần tự Người bán đăng ký tài khoản
Hình 3-47: Sơ đồ tuần tự Khách hàng đăng ký tài khoản
Hình 3-48: Sơ đồ tuần tự Nhà bán thêm phân quyền
Hình 3-49: Sơ đồ tuần tự Nhà bán sửa phân quyền
Hình 3-50: Sơ đồ tuần tự Nhà bán xóa phân quyền
Hình 3-51: Sơ đồ tuần tự Admin thêm phân quyền
Hình 3-52: Sơ đồ tuần tự Admin sửa phân quyền
Hình 3-53: Sơ đồ tuần tự Admin xóa phân quyền
Hình 3-54: Sơ đồ tuần tự Admin duyệt sản phẩm
Hình 3-55: Sơ đồ tuần tự Admin chỉnh sửa sản phẩm
Hình 3-56: Sơ đồ tuần tự Admin xử lý đơn hàng lỗi
Hình 3-57: Sơ đồ tuần tự Admin duyệt nhà bán
Hình 3-58: Sơ đồ tuần tự Admin thêm nhà bán
Hình 3-59: Sơ đồ tuần tự Admin chỉnh sửa nhà bán
Hình 3-60: Sơ đồ tuần tự Admin duyệt bài đánh giá
Hình 3-61: Sơ đồ tuần tự Admin phản hồi bài đánh giá
Hình 3-62: Sơ đồ tuần tự Khách hàng tìm kiếm sản phẩm trên trang chủ
Hình 3-63: Sơ đồ tuần tự Khách hàng xem chi tiết sản phẩm trên trang chủ
Hình 3-64: Sơ đồ tuần tự Khách hàng thêm sản phẩm vào giỏ hàng
Hình 3-65: Sơ đồ tuần tự Khách hàng cập nhật số lượng sản phẩm trong giỏ hàng Hình 3-66: Sơ đồ tuần tự Khách hàng đặt mua hàng
Hình 3-67: Sơ đồ tuần tự Khách hàng đánh giá sản phẩm
Hình 3-68: Sơ đồ tuần tự Khách hàng hủy đơn hàng
Hình 3-69: Sơ đồ tuần tự Người bán cập nhật trạng thái đơn hàng
Hình 3-70: Sơ đồ tuần tự Người bán cập nhật thông tin vận chuyển của đơn hàng Hình 3-71: Sơ đồ tuần tự Người bán thêm sản phẩm mới
Hình 3-72: Sơ đồ tuần tự Người bán chỉnh sửa sản phẩm
Hình 3-73: Sơ đồ tuần tự Người bán nhập kho
Hình 3-74: Sơ đồ tuần tự Người bán sửa phiếu nhập kho
Trang 15Hình 3-75: Sơ đồ tuần tự Người bán xóa phiếu nhập kho
Hình 3-76: Sơ đồ tuần tự Người bán thêm nhân viên mới
Hình 3-77: Sơ đồ tuần tự Người bán chỉnh sửa nhân viên
Hình 3-78: Sơ đồ tuần tự Người bán chỉnh xóa nhân viên
Hình 3-79: Sơ đồ tuần tự Người bán thêm phiếu chi mới
Hình 3-80: Sơ đồ tuần tự Người bán sửa phiếu chi
Hình 3-81: Sơ đồ tuần tự Người bán xóa phiếu chi
Hình 3-82: Sơ đồ tuần tự Admin xem lịch sử hoạt động
Hình 3-83: Sơ đồ tuần tự Admin thêm khách hàng mới
Hình 3-84: Sơ đồ tuần tự Admin chỉnh sửa khách hàng
Hình 3-85: Sơ đồ tuần tự Admin thêm chương trình khuyến mại
Hình 3-86: Sơ đồ tuần tự Admin chỉnh sửa chương trình khuyến mại
Hình 3-87: Sơ đồ tuần tự Admin xóa chương trình khuyến mại
Hình 3-88: Sơ đồ tuần tự Admin duyệt câu hỏi của khách hàng
Hình 3-89: Sơ đồ tuần tự Admin trả lời câu hỏi
Hình 3-90: Sơ đồ tuần tự Admin duyệt câu trả lời
Hình 3-91: Sơ đồ tuần tự Admin duyệt bài đánh giá
Hình 3-92: Sơ đồ tuần tự Admin phản hồi bài đánh giá
Hình 3-93: Sơ đồ tuần tự Admin duyệt phản hồi của khách
Hình 3-94: Sơ đồ tuần tự Khách hàng thêm sản phẩm vào danh sách mua sau Hình 3-95: Sơ đồ tuần tự Khách hàng chỉnh sửa thông tin cá nhân
Hình 3-96: Sơ đồ tuần tự Người bán chỉnh sửa thông tin của nhà bán
Hình 3-97: Sơ đồ tuần tự Khách hàng thêm địa chỉ mới
Hình 3-98: Sơ đồ tuần tự Khách hàng chỉnh sửa địa chỉ
Hình 3-99: Sơ đồ tuần tự Khách hàng xóa địa chỉ
Hình 3-100: Giao diện trang chủ
Hình 3-101: Danh sách thể loại phim
Hình 3-102: Danh sách cac Deal Hot
Hình 3-103: Giao diện giỏ hàng
Trang 16Hình 3-104: Giao diện đăng nhập
Hình 3-105: Giao diện dánh sách sản phẩm mua sau
Hình 3-106: Giao diện trang cá nhân
Hình 3-107: Giao diện lịch sử đặt hàng
Hình 3-108: Giao diện sổ địa chỉ
Hình 3-109: Giao diện đặt hàng thành công
Hình 3-110: Giao diện trang chủ của Nhà Bán
Hình 3-111: Giao diện quản lý đơn hàng cần duyệt
Hình 3-112: Giao diện quản lý đơn hàng đã giao thành công hoặc hủy
Hình 3-113: Giao diện chi tiết đơn hàng
Hình 3-114: Giao diện danh sách sản phẩm đang chờ Admin duyệt
Hình 3-115: Giao diện danh sách sản phẩm đang kinh doanh
Hình 3-116: Giao diện Nhà bán đăng ký sản phẩm mới
Hình 3-117: Giao diện quản lý phiếu chi
Hình 3-118: Giao diện thêm phiếu chi mới
Hình 3-119: Giao diện sửa phiếu chi
Hình 3-120: Giao diện quản lý nhân viên
Hình 3-121: Giao diện thêm nhân viên mới
Hình 3-122: Giao diện chỉnh sửa nhân viên
Hình 3-123: Giao diện quản lý phân quyền
Hình 3-124: Giao diện thêm phân quyền mới
Hình 3-125: Giao diện chỉnh sửa phân quyền
Hình 3-126: Giao diện thống kê doanh thu
Hình 3-127: Giao diện thông tin nhà bán
Hình 3-128: Giao diện trang chủ của Admin
Hình 3-129: Giao diện đăng nhập cho Admin
Hình 3-130: Giao diện quản lý đơn hàng có trạng thái đang chờ duyệt
Hình 3-131: Giao diện quản lý đơn hàng có trạng thái đang giao thành công hoặc đã hủy
Trang 17Hình 3-132: Giao diện quản lý biển thể của sản phẩm đã được duyệt
Hình 3-133: Giao diện quản lý biển thể của sản phẩm đang chờ duyệt
Hình 3-134: Giao diện quản lý sản phẩm đang chờ duyệt
Hình 3-135: Giao diện quản lý sản phẩm đang được duyệt
Hình 3-136: Giao diện quản lý chương trình khuyến mại
Hình 3-137: Giao diện thêm chương trình khuyến mại mới
Hình 3-138: Giao diện chỉnh sửa chương trình khuyến mại
Hình 3-139: Giao diện quản lý khách hàng trong hệ thống
Hình 3-140: Giao diện quản lý nhà bán trong hệ thống
Hình 3-141: Giao diện quản lý nhân viên của các nhà bán trong hệ thống
Hình 3-142: Giao diện quản lý thể loại phim
Hình 3-143: Giao diện thêm thể loại phim mới
Hình 3-144: Giao diện sửa thể loại phim
Hình 3-145: Giao diện quản lý các bài đánh giá về sản phẩm từ khách hàng Hình 3-146: Giao diện quản lý các câu hỏi từ khách hàng
Hình 3-147: Giao diện quản lý các phản hồi đánh giá từ khách hàng
Hình 3-148: Giao diện quản lý các câu trả lời từ khách hàng
Hình 3-149: Giao diện quản lý phân quyền
Hình 3-150: Giao diện thêm phân quyền mới
Hình 3-151: Giao diện chỉnh sửa phân quyền
Hình 3-152: Giao diện quản lý lịch sử hoạt động của nhân viên trong ban quản trị
Trang 18DANH MỤC BẢNG
Bảng 1-1: Bảng so sánh sự khác biệt giữa ShopNow và các trang web khác
Bảng 3-1: Đặc tả Use case đăng kí tài khoản (Khách hàng)
Bảng 3-2: Đặc tả Use case đăng kí tài khoản bán hàng (Người bán)
Bảng 3-3: Đặc tả Use case đăng đăng nhặp
Bảng 3-4: Đặc tả Use case quản lý phân quyền
Bảng 3-5: Đặc tả Use case quản lý đơn hàng (Người bán)
Bảng 3-6: Đặc tả Use case xử lý đơn hàng lỗi (Admin)
Bảng 3-7: Đặc tả Use case quản lý sản phẩm (Người bán)
Bảng 3-8: Đặc tả Use case quản lý kho (Người bán)
Bảng 3-9: Đặc tả Use case quản lý nhân viên (Admin, Người bán)
Bảng 3-10: Đặc tả Use case quản lý phiếu chi (Người bán)
Bảng 3-11: Đặc tả Use case xem lịch sử hoạt động (Admin, Người bán)
Bảng 3-12: Đặc tả Use case quản lý tài khoản khách hàng (Admin)
Bảng 3-13: Đặc tả Use case quản lý nhà bán (Admin)
Bảng 3-14: Đặc tả Use case quản lý phim (Admin)
Bảng 3-15: Đặc tả Use case quản lý thể loại phim (Admin)
Bảng 3-16: Đặc tả Use case quản lý chương trình khuyến mại (Admin)
Bảng 3-17: Đặc tả Use case quản lý bài đánh giá sản phẩm từ khách hàng (Admin) Bảng 3-18: Đặc tả Use case quản lý phản hồi từ khách hàng (Admin)
Bảng 3-19: Đặc tả Use case quản lý câu hỏi từ khách hàng (Admin)
Bảng 3-20: Đặc tả Use case quản lý câu trả lời từ khách hàng (Admin)
khách hàng
Bảng 3-21: Đặc tả Use case tìm kiếm sản phẩm (Khách hàng)
Bảng 3-22: Đặc tả Use case xem chi tiết sản phẩm (Khách hàng)
Bảng 3-24: Đặc tả Use case đặt mua hàng
Bảng 3-25: Đặc tả Use case quản lý sản phẩm mua sau
Bảng 3-26: Đặc tả Use case chỉnh sửa thông tin cá nhân
Bảng 3-27: Đặc tả Use case đánh giá sản phẩm
Trang 19Bảng 3-28: Đặc tả Use case quản lý sổ địa chỉ cá nhân
Bảng 3-29: Đặc tả Use case thống kê doanh thu
Bảng 3-30: Đặc tả Use case hủy đơn hàng
Bảng 3-31: Đặc tả Use case xem thông tin và sản phẩm nhà bán
Bảng 3-32: Đặc tả Use case chỉnh sửa thông tin nhà bán
Bảng 3-33: Đặc tả Use case đánh giá sản phẩm
Bảng 3-34: Đặc tả Use case đặt câu hỏi cho sản phẩm (Khách hàng)
Bảng 3-35: Đặc tả Use case phản hồi các bài đánh giá sản phẩm (Khách hàng) Bảng 3-36: Đặc tả Use case trả lơi câu hỏi (Khách hàng)
Bảng 3-37: Đặc tả Use case like câu hỏi (Khách hàng)
Bảng 3-38: Đặc tả Use case like bài đánh giá (Khách hàng)
Bảng 3-39: Danh sách các actors
Bảng 3-40: Danh sách các use cases
Bảng 3-41: Bảng cơ sở dữ liệu tổng quát
Trang 21Bảng 3-86: User
Bảng 3-87: VerificationString
Bảng 3-88: Bảng Ward
Trang 221
TÓM TẮT KHÓA LUẬN
Khóa luận “XÂY DỰNG HỆ THỐNG THƯƠNG MẠI ĐIỆN TỬ KINH DOANH CÁC MẶT HÀNG LIÊN QUAN ĐẾN PHIM ẢNH” gồm 04 chương:
Chương 1: Giới thiệu về đề tài, đối tượng, phạm vi đề tài, đưa ra các điểm nổi bật so
với các ứng dụng trước, đề xuất các giải pháp để giải quyết các vấn đề đã đặt ra
Chương 2: Trình bày các kiến thức nền tảng, các công nghệ, kĩ thuật và kiến trúc
phần mềm được sử dụng để xây dựng trang web thương mại điện tử
Chương 3: Trình bày chi tiết quy trình xây dựng hệ thống, từ xác định và phân tích
yêu cầu bài toán cho đến xây dựng CSDL, cuối cùng là xây dựng giao diện cho trang web
Chương 4: Kết luận, đánh giá rút ra được các ưu nhược điểm của trang web và hướng
phát triển trong tương lai
Trang 232
Chương 1: GIỚI THIỆU CHUNG
1.1 Lý do lựa chọn đề tài
Công nghệ thông tin và thương mại điện tử đã được ứng dụng rộng rãi vào đời sống
xã hội nói chung và doanh nghiệp nói riêng Đối với doanh nghiệp, thương mại điện
tử góp phần hình thành những mô hình kinh doanh mới, tăng doanh thu, giảm chi phí, nâng cao hiệu quả kinh doanh và mở ra một thị trường rộng lớn với mọi đối tượng khách hàng trong và ngoài nước
Bên cạnh đó, đối với người tiêu dùng, thương mại điện tử giúp người mua chỉ ngồi tại nhà mà vẫn có thể lựa chọn hàng hóa, dịch vụ trên các thị trường ở mọi nơi trên thế giới bằng một vài động tác kích chuột Nhờ vậy mà gần như ở bất kì nơi nào trên thế giới, thậm chí ở một nước nghèo nhất, một vùng xa xôi hẻo lánh trên địa cầu, cũng có thể dễ dàng tiếp cận với các thị trường rộng lớn thông qua mạng Internet.Hiện nay, Thương Mại Điện Tử (TMĐT) đang được nhiều quốc gia quan tâm, trong
đó có Việt Nam, nó được coi là một trong những động lực phát triển chủ yếu của nền kinh tế và dần trở thành xu hướng tất yếu trong mùa dịch toàn cầu Covid-19 dường như đã thay đổi thói quen giải trí của hầu hết chúng ta Xem phim và mua sắm online trở thành 1 trong những lựa chọn tiêu khiển vừa có tính giải trí, lại vừa an toàn tuyệt đối Chính vì thế, ta có thể nói, các chương trình giải trí, đặc biệt là phim ảnh có thể thúc đẩy khả năng mua sắm của người dùng nếu họ nhìn thấy nhân vật yêu thích của
họ được bày bán dưới dạng mô hình hoặc đơn giản chỉ là hình vẽ trên các bộ ly, tách Trên cơ sở tìm hiểu các hệ thống thương mại điển tử cũng như xu hướng mua hàng của thị trường hiện nay, nhóm chúng em quyết định chọn đề tài “Xây dựng hệ thống thương mại điện tử kinh doanh các sản phẩm liên quan đến phim ảnh”
“Khi 1 người yêu thích điều gì, họ sẽ chi trả tiền cho nó” Đề tài này tập trung kinh doanh các mặt hàng có liên quan đến các câu chuyện, nhân vật trên phim ảnh, nhằm tạo 1 môi trường mua bán lành mạnh, hướng trực tiếp đến những người yêu thích phim ảnh và mua sắm
Trang 24doanh thu theo mỗi tháng trong năm và theo mỗi thành phố
Chưa có
Phân quyền Phân quyền chi tiết từng
thao tác (Thêm, xóa, sửa, xem, duyệt, )
Các thuộc tính được nhập
tự do Điều này sẽ khiến nhân viên kiểm duyệt không kiểm soát được lỗi
mà người dùng vô tình nhập vào
Bảng 1-1: Bảng so sánh sự khác biệt giữa ShopNow và các trang web khác
Trang 26Hình 2-1: Ví dụ kiến trúc MicroserviceKiến trúc microservice giúp người dùng triển khai, xây dựng ứng dụng lớn một cách nhanh chóng Nó cho phép người dùng thay đổi nền tảng công nghệ của mình dễ dàng hơn
2.1.2 Ưu điểm và nhược điểm của kiến trúc phần mềm Microservice
Ưu điểm :
Trang 27• Mỗi service sẽ được phát triển bởi một team riêng: Mỗi team có thể sử dụng
stack công nghệ nào tùy ý cho service của mình Điều này giúp cho team có thể sử dụng stack công nghệ mới hơn so với stack công nghệ được sử dụng ở đời đầu của project VD: Service A sử dụng MongoDB còn service B sử dụng MySQL Đồng thời mỗi team có thể phát triển, thử nghiệm, triển khai và mở
rộng quy mô service của mình một cách độc lập với tất cả các team khác
• Mỗi service có thể triển khai và vận hành độc lập Cho phép dễ dàng CI/CD các ứng dụng lớn và phức tạp
• Giảm thiểu rủi ro Nếu có lỗi trong một service thì chỉ có service đó bị ảnh
hưởng Các service khác sẽ tiếp tục xử lý yêu cầu Trong khi đó, một thành phần hoạt động sai của kiến trúc Monolith có thể làm ảnh hưởng toàn bộ hệ thống
Nhược điểm:
• Đảm bảo tính đồng nhất của dữ liệu ở mỗi service sẽ trở nên phức tạp
hơn
• Cần xử lý vấn đề giao tiếp giữa các service Developers có thể chọn 1 trong
3 cách sau: REST, Apache Thrift hoặc gRPC Ngoài ra developers còn phải cần giải quyết partial failure trong trường không nhận được phản hồi hoặc bị delay
• Triển khai phức tạp hơn vì có nhiều service Mỗi service sẽ có nhiều
instance nữa nên việc quản lý và giám sát trở nên phức tạp Hơn thế nữa
developers sẽ phải thêm service discovery mechanism để các service có thể
Trang 287
biết vị trí (host và port) của các service khác để service có thể giao tiếp với
nhau
2.1.3 API Gateway:
2.1.3.1 Giới thiệu về API Gateway
API Gateway là một service riêng biệt, nó là cổng vào duy nhất tới hệ thống
microservice API Gatewau sẽ nhận các requests từ phía client, chỉnh sửa, xác thực
và điều hướng chúng đến các API cụ thể trên các service phía sau
Hình 2-2: Kiến trúc Microservice với API Gateway
Ngoài nhiệm vụ chính là proxy request thì một hệ thống API Gateway thường sẽ đảm nhận luôn vài vai trò khác như bảo mật API, tổng hợp kết quả, monitoring, analytics số lượng requests cũng như tình trạng hệ thống phía sau
Trang 298
2.1.3.2 Ưu điểm và nhược điểm của việc sử dụng API Gateway vào kiến trúc Microservice
- Ưu điểm:
• Che giấu được cấu trúc của hệ thống microservice với bên ngoài
Client sẽ tương tác với hệ thống thông qua API Gateway chứ k gọi trực tiếp tới một service cụ thể, các endpoints của các service sẽ chỉ được gọi nội bộ Chính vì vậy cho nên phía client không biết được là các service phía backend được phân chia như nào nào
• Dễ dàng theo dõi và quản lý traffic Hầu hết các hệ thống API
Gateway phổ biến hiện nay đều sẽ đi kèm với tính năng theo dõi và quản lý lượng traffic bằng GUI hoặc thông qua các APIs
• API Gateway sẽ thực hiện luôn vai trò của load balancer Giúp các
service tránh bị quá tải
• Thêm một lớp bảo vệ cho hệ thống API Gateway giúp ngăn chặn
ccáccuoojc tấn công bằng cách thêm một lớp bảo vệ khỏi các loại tấn công như DDOS, SQL Injection,
- Nhược điểm:
• Có nguy cơ gây nghẽn cổ chai Nếu như không được scale hay config
hợp lý thì API Gateway có thể sẽ bị quá tải và làm chậm hệ thống
• Tăng thời gian response Vì phải đi qua service trung gian nên sẽ bị
trễ hơn so với việc gọi trực tiếp tới hệ thống
2.1.3.3 Kong Gateway
2.1.3.3.1 Giới thiệu về Kong Gateway
Kong Gateway là một open-source API Gateway và platform, Kong được viết bằng
ngôn ngữ Lua và xây dựng trên NGINX Kong hỗ trợ nhiều plugins giúp cho việc
Trang 309
triển khai microservices dễ dàng hơn như authentication, rate-limiting, transformation, logging, Người dùng có thể tự viết plugins cho Kong bằng Lua tùy vào nhu cầu sử dụng
2.1.3.3.2 Ưu điểm của Kong Gateway so với các API Gateway khác
- Hiệu năng hơn: Trong các bài test performance thì Kong là một trong những API
Gateway có hiệu năng cao nhất, nó có thể xử lý được một lượng rất lớn requests trong một giây
- Nhiều plugins: Kong hỗ trợ rất nhiều plugins tùy vào chức năng như authen,
logging, traffic control, analytics & monitoring giúp quản lý cũng như theo dõi các microservices được hiệu quả và dễ dàng hơn thay vì chỉ đảm nhận mỗi việc routing requests
- Miễn phí: Kong có 2 phiên bản là Community và Enterprise Bản Enterprise hỗ trợ
nhiều thứ hơn như Kong Admin GUI, hỗ trợ trực tuyến, sử dụng các Plugins Enterprises Tuy nhiên với nhu cầu sử dụng bình thường thì bản miễn phí của nó (Community) đã đủ dùng, và ta có thể sử dụng Konga để quản lý và điều chỉnh Kong bằng GUI thay cho việc gửi request tới Kong Admin (Kong Commnity không có GUI, chỉ bản Enterprise mới có)
2.2 Tổng quan về Nodejs
2.2.1 Khái niệm
Node.js là một JavaScript thời gian thực được xây dựng trên Chrome’s V8 JavaScript engine Node.js sử dụng các phần phát sinh các sự kiện (event-driven), mô Hình non-blocking I/O để tạo ra các ứng dụng nhẹ và hiệu quả cao cho các ứng dụng về dữ liệu thời gian thực chạy trên các thiết bị phân tán
Trang 3110
Hình 2-3: Lợi ích của Node.js
Node.js là một mã nguồn mở được phát triển bởi Ryan Dahl Phiên bản đầu tiên của Node.js được cho ra mắt vào năm 2009 Node.js có thể chạy được trên nhiều nền tảng khác nhau như Windows, Linux hay Mac OS
Điều đặc biệt ở Node.js mang lại là mặc dù các JavaScript thường được sử dụng trên client thì Node.js dù được xây dựng trên nền tảng JavaScript một ngôn ngữ thuần client nhưng có thể sử dụng để thực hiện các công việc trên cả client và server
2.2.2 Lý do lựa chọn Nodejs để xây dựng và phát triển giao diện web
- Không đồng bộ và phát sinh sự kiện (Event Driven): Tất cả các API của thư viện Node.js đều không đồng bộ, nghĩa là blocking (khóa) Nó rất cần thiết vì Node.js không bao giờ đợi một API trả về dữ liệu Server chuyển sang một API sau khi gọi
nó và có cơ chế thông báo về sự kiện của Node.js giúp Server nhận được phản hồi từ các API gọi trước đó
- Tốc độ xử lý nhanh: Được thực thi dựa trên V8 JavaScript Engine của Google Chorme Khả năng tự build server bằng ngôn ngữ client giúp cho việc trung chuyển
dữ liệu diễn ra nhanh hơn Đồng thời giảm khả năng rủi ro bị ngắt Ngoài ra nhờ cơ chế NonI/O Blocking, tận dụng tối đa tài nguyên của server, không tạo ra độ trễ như các ngôn ngữ server-side khác
Trang 3211
- Các tiến trình đơn giản nhưng hiệu năng cao: Node.js sử dụng một mô hình luồng đơn (single thread) với các sự kiện lặp Các cơ chế sự kiện giúp Server trả lại các phản hồi với một cách không khóa và tạo cho Server hiệu quả cao, ngược lại với các cách truyền thống tạo ra một số lượng luồng hữu hạn để quản lý request Nodejs sử dụng các chương trình đơn luồng, cung cấp các dịch vụ cho số lượng request nhiều hơn so với các Server truyền thống như Apache HTTP Server
- JavaScript là một ngôn ngữ phổ biến: điều này đã giúp node.js trở nên dễ dàng được
sử dụng và áp dụng rộng rãi hơn
- Hỗ trợ rất tốt cho việc xây dựng ứng dụng thời gian thực
2.3 Tổng quan về Reactjs - Redux
2.3.1 ReactJS
Reactjs là một thư viện Javascript được tạo ra bởi Jordan Walke, 1 kỹ sư phần mềm của Facebook, gần như thay thế hoàn toàn AngularJs, một framework khác của Javascript mà trước đây Facebook sử dụng cho việc xây dựng giao diện
Các thành phần của React:
+ DOM ảo (viết tắt của Document Object Model) là mô hình các đối tượng trong tài liệu html Các trình duyệt nhìn thấy mỗi trang web như kiểu cấu trúc DOM tree như hình dưới đây:
Trang 3312
Hình 2-4: Cấu trúc DOM Tree
Như hình ví dụ ở trên, node cha đầu tiên sẽ là thẻ document, tiếp theo là các thẻ con như <html>, <head>, <body>, Vậy khi có 1 sự kiện yêu cầu tác động đến một thành phần trong trang web, trang web sẽ chạy lại từ đầu, bao gồm cả những phần không có thay đổi trước đó Điều này khiến hiệu năng của web giảm, đôi khi chạy chậm và thiếu sự mượt mà
ReactJS sẽ sử dụng một DOM ảo, hay còn là một Object Javascript chứa đầy
đủ thông tin của trang web giống như DOM thật, khi có sự tác động đến 1 thành phần của trang web thì ReactJS sẽ so sánh DOM ảo với DOM thật để biết được node nào sẽ thay đổi và tạo ra 1 ‘bản vá’ nhằm thay đổi dữ liệu ở node đó trên DOM thật
+ Props và State
• Props: là thuộc tính read-only, giúp cho component cha có thể truyền
dữ liệu xuống cho component con Về mặt khái niệm, component của React giống như các function; nó nhận vào các tham số (ở đây là props)
và sẽ trả về các phần tử React (JSX) mô tả những gì sẽ được hiển thị lên trang web
Trang 3413
• State: khác với props, state là đặc trưng của component và lưu trữ trạng thái của component, trong khi các props là các giá trị bên ngoài được truyền vào component đó
2.3.2 Lý do lựa chọn Reactjs để xây dựng và phát triển giao diện web
- Dom ảo: như đã trình bày ở phần 2.3.1, với ReactJS khi có sự thay đổi ở 1 thành phần, thì trang web sẽ không load lại từ đầu mà chỉ thay đổi ở thành phần mà ta yêu cầu, giúp trang web hoạt động nhanh hơn, phía server không cần phải gọi truy vấn để lại lại những dữ liệu mà trước đó không hề thay đổi
- Tính tái sử dụng: Các thành phần của React được chia thành các component nhỏ, vừa có thể sử dụng lại, vừa dễ dàng bảo trì và thay đổi khi cần thiết
- JSX: cú pháp của JSX khá đặc biệt, cho phép nhúng code HTML vào Javascript, giúp lập trình viên có được sự linh hoạt trong việc xây dựng giao diện cho dự án của mình
- Độ phổ biến: React là 1 trong những framework phổ biến nhất hiện nay, vì thế mà React có cộng đồng hỏi đáp rất lớn cũng như có khá nhiều các công cụ giúp debug code, điển hình là Debugger for Chrome dược phát triển bởi Microsoft
2.3.3 Redux
Redux là thư viện Javascript mã nguồn mở được dùng để quản lý trạng thái ứng dụng, thường được sử dụng phổ biến nhất với React hoặc Angular để xây dựng giao diện người dùng
Nhờ có Redux, tất cả dữ liệu của các component trong dự án sẽ được lưu vào store của Redux, component nào muốn lấy dữ liệu ra dùng thì chỉ cần truy cập vào store
mà không phải truyền thông qua props nữa
Chính vì thế Redux giúp cho ứng dụng chạy nhất quán, quản lý trạng thái và kiểm thử dễ dàng hơn
Redux gồm 3 thành phần chính:
Trang 3514
- Action: Khi người dùng thực hiện một hành động hay một sự kiện nào đó như là gửi một form hoặc gọi một api, thì action đó sẽ được truyền vào store.dispatch()
và được gửi đến redux store
- Reducer: Reducer sẽ lấy các action, sau đó phân tích và trả về các state mới cho store
- Store: Là thành phần rất quan trọng, chứa các state (trạng thái) của các component Thông qua đó từ một component, ta kết nối với store để lấy, cập nhật các state cho các component
2.3.4 Lý do lựa chọn Redux-Saga
Trong Redux, middleware là một lớp nằm giữa Reducers và Dispatch Action, giúp quản lý các side effect (ví dụ như gọi hàm lấy dữ liệu nhưng phải đợi kết quả chứ không lấy ngay được, ) trên Redux
Redux-saga là 1 trong những middleware phổ biến được sử dụng cho các dự án có quy mô lớn
Redux-saga sử dụng Generator function của ES6 nên có thể xử lý tốt các trường hợp bất đồng bộ trong hệ thống
2.4 Hệ quản trị cơ sở dữ liệu MySQL
2.4.1 Giới thiệu về MySQL
MySQL là hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới và được các nhà phát triển rất ưa chuộng trong quá trình phát triển ứng dụng MySQL
có nhiều phiên bản cho các hệ điều hành khác nhau: phiên bản Win32 cho các hệ điều hanh dòng Windows, Linux, Mac OS X, Unix, FreeBSD, NetBSD, Novell NetWare, SGI Irix, Solaris, SunOS
MySQL là một trong những ví dụ rất cơ bản về Hệ Quản trị Cơ sở dữ liệu quan
hệ sử dụng Ngôn ngữ truy vấn có cấu trúc (SQL)
Trang 3615
MySQL được sử dụng cho việc bổ trợ NodeJs, PHP, Perl, và nhiều ngôn ngữ khác, làm nơi lưu trữ những thông tin trên các trang web viết bằng NodeJs, PHP hay Perl
2.4.2 Lý do lựa chọn
- Linh hoạt: Sự linh hoạt về platform là một đặc tính nổi bật của MySQL với
các phiên bản đang được hỗ trợ của Linux, Unix, Windows, MySQL cho phép tùy biến hoàn toàn theo ý muốn, thêm vào các yêu cầu thích hợp cho database server
- Thực thi cao: Các chuyên gia cơ sở dữ liệu có thể cấu hình máy chủ cơ sở dữ
liệu MySQL đặc trưng cho các ứng dụng đặc thù thông qua kiến trúc engine MySQL còn đưa ra các “công cụ” cần thiết cho các hệ thống doanh nghiệp khó tính bằng tiện ích tải tốc độ cao, bộ nhớ cache và các cơ chế xử lý nâng cao khác
storage Sử dụng ngay: Các tiêu chuẩn đảm bảo của MySQL giúp cho người dùng
vững tin và chọn sử dụng ngay MySQL đưa ra nhiều tùy chọn và các giải pháp để người sử dụng dùng ngay cho server cơ sở dữ liệu MySQL
- Hỗ trợ giao dịch: MySQL hỗ trợ giao dịch mạnh một cách tự động, thống
nhất, độc lập và bền vững Ngoài ra, khả năng giao dịch cũng được phân loại
và hỗ trợ giao dịch đa dạng mà người viết không gây trở ngại cho người đọc
và ngược lại Các dữ liệu được đảm bảo toàn vẹn trong suốt quá trình server
có hiệu lực và các mức giao dịch độc lập được chuyên môn hóa cao Nơi tin cậy để lưu trữ web và dữ liệu: Do MySQL có engine xử lý tốc độ cao và khả năng chèn dữ liệu nhanh, hỗ trợ tốt cho các chức năng chuyên dùng cho web, nên MySQL là lựa chọn tốt nhất cho các ứng dụng web và các ứng dụng web doanh nghiệp
- Bảo mật tốt: MySQL có các kỹ thuật mạnh trong việc xác nhận truy cập cơ
sở dữ liệu và chỉ có người dùng đã được xác nhận mới có thể truy cập vào
Trang 3716
server cơ sở dữ liệu Bên cạnh đó, tiện ích backup và recovery cho phép backup logic và recovery toàn bộ hoặc tại một thời điểm nào đó
- Dễ quản lý: Quá trình cài đặt MySQL diễn ra khá nhanh chóng trên Microsoft
Windows, Linux, Macintosh hoặc Unix Sau khi cài đặt, các tính năng tự động
mở rộng không gian, tự khởi động lại và cấu hình động được thiết lập sẵn sàng cho người quản trị cơ sở dữ liệu làm việc
- Chi phí thấp: MySQL là một chọn lựa vừa tiết kiệm chi phí vừa đáng tin cậy
Mức duy trì của MySQL cũng không chiếm nhiều thời gian sửa chữa của người quản trị cơ sở dữ liệu, thông qua việc sử dụng server cơ sở dữ liệu MySQL và kiến trúc scale-out
2.5 Hệ quản trị cơ sở dữ liệu MongoDB
2.5.1 Giới thiệu về MongoDB
MongoDB là một hệ quản trị cơ sở dữ liệu mã nguồn mở NoSQL phổ biến được viết bằng C++, được phát triển bởi MongoDB Inc Tính đến tháng 2/2015, MongoDB được xếp thứ 4 trong số các hệ thống cơ sở dữ liệu phổ biến nhất
Hình 2-5: Tính năng của MongoDB
Trang 3817
MongoDB là cơ sở dữ liệu hướng tài liệu, lưu trữ dữ liệu trong các document dạng JSON với schema động rất linh hoạt Các nhà phát triển ứng dụng có thể lưu các bản ghi mà không cần lo lắng về cấu trúc dữ liệu như là số trường, kiểu của trường lưu trữ
MongoDB là một cơ sở dữ liệu NoSQL hỗ trợ đa nền tảng, nó có thể chạy trên Windows, Linux và Mac và hỗ trợ hầu hết các ngôn ngữ lập trình phổ biến như C#, Java, PHP, Javascript trong các môi trường phát triển khác nhau
2.5.2 Lý do lựa chọn MongoDb
- Tốc độ xử lý nhanh chóng: được viết bởi C++ nên nó có khả năng tính toán với tốc độ cao chứ không giống như các hệ quản trị cở sở dữ liệu hiện nay Vì thế nhóm quyết định chọn MongoDb làm hệ quản trị cơ sở dữ liệu cho Logging Service, dùng để ghi và đọc lượng lớn dữ liệu về lịch sử hoạt động của nhân viên trong hệ thống
- Mô hình dữ liệu linh hoạt: MongoDB lưu trữ dữ liệu trong các tài liệu thay vì các bảng, cho phép thay đổi cấu trúc các document đơn giản chỉ bằng cách thêm mới các trường hoặc xóa các trường có sẵn Khả năng này của MongoDB giúp ứng dụng trình bày các quan hệ dạng thứ bậc, để lưu trữ mảng, và các cấu trúc phức tạp khác một cách dễ dàng, cung cấp khả năng mở rộng tốt
- Giảm thiểu rủi ro: đặt trong trường hợp đề tài phát triển ứng dụng di động yêu cầu thời gian thực và nhiều người dùng tương tác, nếu quá trình load bị lỗi tại một thời điểm nào đó thì nó sẽ bỏ qua phần đó nên sẽ an toàn hơn
- Phù hợp với việc phát triển ứng dụng server Node.js
2.6 JWT authentication
2.6.1 Giới thiệu về JWT (JSON Web Token)
JSON Web Token (JWT) là một chuẩn mở (RFC 7519) định nghĩa một cách nhỏ gọn và khép kín để truyền một cách an toàn thông tin giữa các bên dưới dạng đối tượng JSON Thông tin này có thể được xác minh và đáng tin cậy vì nó có chứa chữ
ký số JWTs có thể được ký bằng một thuật toán bí mật (với thuật toán HMAC)
Trang 3918
hoặc một public / private key sử dụng mã hoá RSA Nguồn gốc ban đầu của JWT là một chuỗi JSON, sau khi được mã hóa nó sẽ trở thành một chuỗi ký tự khó nhận biết
Ví dụ về 1 JWT:
tZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ SflKxwRJSMeKKF2QT4fwp MeJf36POk6yJV_adQssw5c
JWT sẽ bao gồm 3 phần: Header, Payload và Signature được liên kết với nhau
theo cấu trúc như sau:
<base64-endcoded header>.< base64-endcoded playload>
<HMACSHA256(base64-encoded signature)>
Hình 2-6: Cấu trúc của JWT
2.6.2 Ứng dụng của JWT
Ứng dụng nhiều nhất của JWT Token, và mục đích duy nhất bạn nên sử dụng JWT
là dùng nó như một cơ chế xác thực API Điều này hiện nay rất phổ biến và được sử
Trang 40- Người dùng nhận được JWT do Authentication Server vừa mới trả về làm
“chìa khóa” để thực hiện các “lệnh” tiếp theo đối với Application Server
- Application Server trước khi thực hiện yêu cầu được gọi từ phía User, sẽ verify JWT gửi lên Nếu JWT hợp lê, tiếp tục thực hiện yêu cầu được gọi
Hình 2-7: Quá trình xác thực tài khoản
2.7 Cloudinary