MỘT SỐ NGHIÊN CỨU VÀ ỨNG DỤNG LIÊN QUAN
Mở đầu
Vấn đề học nấu ăn đã được nghiên cứu từ lâu, với nhiều ứng dụng đã ra đời để giải quyết bài toán này Nhóm sẽ phân tích và nghiên cứu một số ứng dụng nổi bật, nhằm tìm ra những phương pháp tiếp cận hiệu quả trong lĩnh vực nấu ăn.
Tổng quan
Học nấu ăn là một chủ đề lâu đời, đã được nghiên cứu và ứng dụng rộng rãi Hiện nay, nhiều nghiên cứu và ứng dụng liên quan đến nấu ăn chủ yếu xuất hiện dưới dạng website, ứng dụng di động và các nhóm trên mạng xã hội.
Nhiều website chia sẻ công thức nấu ăn hiện nay, trong đó có nhiều trang do các chuyên gia ẩm thực sáng lập, cung cấp thông tin đa dạng Tuy nhiên, những trang web này thường thiếu tính năng mạng xã hội, dẫn đến sự tương tác một chiều, khiến người dùng chủ yếu chỉ tìm kiếm công thức mà không thể kết nối với những người yêu thích nấu ăn khác.
Mặc dù các mạng xã hội như Facebook và YouTube có nhiều nhóm và nội dung về nấu ăn, nhưng việc theo dõi và tiếp cận thông tin hữu ích gặp nhiều khó khăn do lượng chủ đề khổng lồ Điều này cũng dẫn đến việc hạn chế các chức năng hỗ trợ người dùng Vì vậy, ứng dụng di động chuyên về nấu ăn là giải pháp hiệu quả để khắc phục nhược điểm này Trong cộng đồng nấu ăn tại Việt Nam, hai ứng dụng nổi bật nhất là Cooky và Cookpad, cả hai đều tập trung vào chủ đề nấu ăn và cho phép người dùng tương tác với các công thức, giúp việc tìm hiểu và sử dụng nấu ăn trở nên dễ dàng hơn.
Cookpad
Cookpad là nền tảng chia sẻ hàng ngàn công thức nấu ăn ngon, đơn giản và dễ thực hiện từ cộng đồng Tại đây, bạn có thể tìm thấy đa dạng món ăn như món nước, món mặn, món ngọt và các món giải nhiệt mùa hè, cùng nhiều món hấp dẫn khác Một trong những ưu điểm nổi bật của Cookpad là kho công thức nấu ăn phong phú, đáp ứng nhu cầu của mọi người yêu thích nấu nướng.
• Người dùng có thể thoải mái chia sẻ các công thức nấu ăn của mình và tương tác như mạng xã hội
Nhược điểm • Giao diện ứng dụng chưa hấp dẫn
• Ứng dụng chưa có nhiều chức năng, chỉ tập trung vào công thức món ăn
• Chưa có hỗ trợ chatbot Bảng 2.1: Ưu và nhược điểm của ứng dụng Cookpad
Hình 2.1: Giao diện ứng dụng Cookpad
Cooky
Cooky là ứng dụng giúp lan tỏa đam mê ẩm thực và nấu nướng của người Việt Nam, cung cấp hơn 31,000 công thức món ăn đa dạng phù hợp với mọi chế độ dinh dưỡng Nguồn công thức phong phú đến từ các đầu bếp và nhãn hàng thực phẩm uy tín, mang đến cho người dùng trải nghiệm nấu nướng tuyệt vời với hình ảnh chất lượng cao.
• Dữ liệu được chia sẻ từ các dầu bếp
• Hỗ trợ nhiều chức năng giúp dễ dàng tìm kiếm Nhược điểm • Chưa hỗ trợ tương tác như một mạng xã hội
• Chưa có hỗ trợ chatbot
Bảng 2.2: Ưu và nhược điểm của ứng dụng Cooky
Hình 2.2: Giao diện ứng dụng Cooky
Kết chương
Chương này đã phân tích ưu nhược điểm của hai ứng dụng chia sẻ nấu ăn, cho thấy rằng các cộng đồng này vẫn còn thiếu sự tương tác cao giữa người dùng, chưa phát triển tính mạng xã hội và chưa được tích hợp tính năng chatbot.
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
Mở đầu
Sau khi khảo sát và đánh giá các ứng dụng liên quan, bước tiếp theo là xây dựng hệ thống nhằm đạt được mục tiêu đề tài và khắc phục những nhược điểm của các ứng dụng đã được khảo sát Chương này sẽ trình bày chi tiết về phân tích và thiết kế của hệ thống.
Sơ đồ use case
3.2.1 Sơ đồ use case tổng quan
Hình 3.1: Use case tổng quát của hệ thống
1 User Người dùng ứng dụng
Bảng 3.1: Danh sách các actors
STT Tên use case Ý nghĩa
1 Đăng nhập Yêu cầu nhập tài khoản và mật khẩu để xác thực trên hệ thống của ứng dụng
2 Đăng ký Người dùng nhập thông tin tài khoản chưa tồn tại trước đó sau đó hệ thống tạo và đăng nhập tài khoản
3 Quản lý bài viết Các chức năng cho phép người dùng quản lý bài viết của mình (Thêm, xóa, sửa, tìm kiếm)
4 Tương tác bài viết Các chức năng cho phép tương tác lên bài viết (Phản ứng, bình luận, chia sẻ)
5 Theo dõi người dùng khác
Người dùng có thể theo dõi hoặc hủy theo dõi người dùng khác, nhận được thông báo khi người dùng đang theo dõi có bài viết mới
6 Quản lý công thức nấu ăn
Các chức năng cho phép người dùng quản lý các công thức nấu ăn của mình (Thêm, xóa sửa, tìm kiếm)
7 Chat với chatbot Người dùng có thể nhắn tin với chatbot để hỏi về các kiến thức về nấu ăn
8 Cập nhật thông tin cá nhân
Người dùng cung cấp các thông tin cá nhân mới cho hệ thống cập nhật lại
Bảng 3.2: Danh sách các Use case
Tên Use Case Đăng nhập
Mô tả Đăng nhập tài khoản vào hệ thống
Tiền điều kiện Người dùng chưa đăng nhập vào hệ thống
Hậu điều kiện Đăng nhập thành công, người dùng có thể sử dụng các chức năng của hệ thống Dòng sự kiện chính 1 Nhập email và mật khẩu
3 Hệ thống thông báo đăng nhập thành công, chuyển đến màn hình các bài viết
Dòng sự kiện phụ Không có
Dòng sự kiện lỗi 4a Hệ thống thông báo đăng nhập không thành công
Bảng 3.3: Đặc tả use case “Đăng nhập”
Tên Use Case Đăng ký
Mô tả Đăng ký một tài khoản trên hệ thống
Tiền điều kiện Người dùng chưa đăng nhập hệ thống
Hậu điều kiện Tài khoản được tạo và đăng nhập thành công, người dùng có thể sử dụng hệ thống
Dòng sự kiện chính 1 Truy cập màn hình đăng ký
2 Nhập thông tin tài khoản
4 Hệ thống thông báo đăng ký thành công, chuyển đến màn hình các bài viết
Dòng sự kiện phụ Không có
Dòng sự kiện lỗi 4a Hệ thống thông báo đăng ký không thành công
Bảng 3.4: Đặc tả use case “Đăng ký”
3.2.4.3 Use case quản lý bài viết
Hình 3.2: Sơ đồ use case “Quản lý bài viết”
Tên Use Case Quản lý bài viết
Mô tả Quản lý thông tin các bài viết
Tiền điều kiện Người dùng đã đăng nhập vào hệ thống và đang ở tab
Hậu điều kiện Use case thành công và dữ liệu được cập nhật
Dòng sự kiện chính - Thêm bài viết:
1 Nhấn nút “Thêm bài viết”
2 Nhập thông tin bài viết
4 Hệ thống thông báo đăng bài thành công và cập nhật lại dữ liệu
1 Chọn bài viết của mình
3 Nhập lại thông tin bài viết
5 Hệ thống thông báo cập nhật thành công và cập nhật lại dữ liệu
1 Chọn bài viết của mình
3 Hệ thống thông báo xóa thành công và cập nhật lại dữ liệu
1 Chọn vào thanh tìm kiếm
2 Nhập văn bản tìm kiếm
3 Hệ thống tìm kiếm và hiển thị màn hình kết quả tìm kiếm
Dòng sự kiện phụ Không có
Dòng sự kiện lỗi Không có
Bảng 3.5: Đặc tả use case “Quản lý bài viết”
3.2.4.4 Use case tương tác bài viết
Hình 3.3: Sơ đồ use case “Tương tác bài viết”
Tên Use Case Tương tác bài viết
Mô tả Các hành động như phản ứng, bình luận và chia sẻ lên bài viết
Tiền điều kiện Người dùng đã đăng nhập vào hệ thống và đang ở tab
Hậu điều kiện Use case thành công và dữ liệu được cập nhật
Dòng sự kiện chính - Phản ứng:
1 Chọn loại phản ứng ở bài viết
2 Cập nhật lại dữ liệu của bài viết
1 Nhấn vào nút bình luận ở bài viết
2 Hiển thị màn hình bình luận
3 Nhập dữ liệu bình luận và nhấn nút “send”
4 Thông báo bình luận thành công và cập nhật lại dữ liệu
- Phản ứng vào bình luận:
1 Nhấn vào nút bình luận ở bài viết
2 Hiển thị màn hình bình luận
3 Chọn lại phản ứng vào các bình luận khác
2 Hiển thị các lựa chọn để chia sẻ
3 Hệ thống thông báo chia sẻ thành công Dòng sự kiện phụ Không có
Dòng sự kiện lỗi Không có
Bảng 3.6: Đặc tả use case “Tương tác bài viết”
3.2.4.5 Use case theo dõi người dùng khác
Tên Use Case Theo dõi người dùng khác
Mô tả Theo dõi hoặc hủy theo dõi hoạt động của một người dùng khác
Tiền điều kiện Người dùng đã đăng nhập vào hệ thống
Hậu điều kiện Cập nhật lại dữ liệu của người dùng
Dòng sự kiện chính 1 Nhấn vào trang cá nhân của người dùng khác hoặc nhấn nút 3 chấm ở bài viết của người đó
2 Nhấn vào nút theo dõi “Follow” hoặc “Unfollow”
3 Thông báo thành công và cập nhật lại dữ liệu người dùng
Dòng sự kiện phụ Không có
Dòng sự kiện lỗi Không có
Bảng 3.7: Đặc tả use case “Theo dõi người dùng khác”
3.2.4.6 Use case quản lý công thức nấu ăn
Hình 3.4: Sơ đồ use case “Quản lý công thức nấu ăn”
Tên Use Case Quản lý công thức nấu ăn
Mô tả Quản lý thông tin các công thức nấu ăn
Tiền điều kiện Người dùng đã đăng nhập vào hệ thống và ở tab
Hậu điều kiện Use case thành công và dữ liệu được cập nhật
Dòng sự kiện chính - Thêm công thức:
1 Nhấn nút “Thêm công thức”
2 Nhập thông tin của công thức
4 Hệ thống thông báo đăng công thức thành công và cập nhật lại dữ liệu
1 Chọn vào công thức của mình
3 Nhập lại thông tin công thức
5 Hệ thống thông báo cập nhật thành công và cập nhật lại dữ liệu
1 Chọn công thức của mình
3 Hệ thống thông báo xóa thành công và cập nhật lại dữ liệu
1 Chọn vào thanh tìm kiếm
2 Nhập văn bản tìm kiếm
3 Hệ thống tìm kiếm và hiển thị màn hình kết quả tìm kiếm
Dòng sự kiện phụ Không có
Dòng sự kiện lỗi Không có
Bảng 3.8: Đặc tả use case “Quản lý công thức nấu ăn”
3.2.4.7 Use case chat với chatbot
Tên Use Case Chat với chatbot
Mô tả Nhắn tin với chatbot của hệ thống
Tiền điều kiện Người dùng đã đăng nhập vào hệ thống
Hậu điều kiện Không có
Dòng sự kiện chính 1 Chọn vào nút “Chatbot”
2 Hiển thị màn hình chatbot
4 Chatbot trả lời tin nhắn Dòng sự kiện phụ Không có
Dòng sự kiện lỗi Không có
Bảng 3.9: Đặc tả use case “Chat với chatbot”
3.2.4.8 Use case cập nhật thông tin cá nhân
Tên Use Case Cập nhật thông tin cá nhân
Mô tả Cập nhật thông tin cá nhân
Tiền điều kiện Người dùng đã đăng nhập vào hệ thống và ở trang cá nhân Hậu điều kiện Không có
Dòng sự kiện chính 1 Chọn vào nút “Cập nhật thông tin”
2 Hiển thị màn hình cập nhật thông cá nhân
5 Hệ thống thông báo thành công, cập nhật lại dữ liệu và đóng màn hình cập nhật
Dòng sự kiện phụ Không có
Dòng sự kiện lỗi Không có
Bảng 3.10: Đặc tả use case “Cập nhật thông tin cá nhân”
Thiết kế dữ liệu
3.3.1 Sơ đồ lớp tổng quát
Hình 3.5: Sơ đồ lớp tổng quát
3.3.2 Mô tả sơ đồ lớp
STT Tên lớp Mô tả
1 Users Lớp lưu trữ thông tin của người dùng
2 Posts Lớp lưu trữ các bài viết của người dùng
3 Comments Lớp lưu trữ các bình luận của bài viết
4 Recipes Lớp lưu trữ các công thức nấu ăn
5 Products Lớp lưu trữ các sản phẩm liên quan đến nấu ăn
6 RecipeLikes Lớp lưu trữ những người dùng thích công thức
7 RecipeCook Lớp lưu trữ những người dùng đã nấu công thức
8 Ratings Lớp lưu trữ những đánh giá của công thức
9 PostReactions Lớp lưu trữ những phản ứng của với bài viết
10 CommentReactions Lớp lưu trữ những phản ứng với bình luận
11 Ingredients Lớp lưu trữ thông tin về các nguyên liệu nấu ăn
12 SpecialGoals Lớp lưu trữ các loại mục đích đặc biệt của món ăn
13 MenuTypes Lớp lưu trữ loại thực đơn của món ăn
Ẩm thực là một hệ thống đặc biệt bao gồm quan điểm truyền thống và thực hành nấu ăn, nghệ thuật bếp núc và chế biến thức ăn, thường gắn liền với nền văn hóa của một quốc gia hoặc vùng miền 14 nền ẩm thực khác nhau đại diện cho sự đa dạng và phong phú trong các phương pháp nấu nướng và hương vị độc đáo của từng nền văn hóa.
22 hóa cụ thể Nó thường được đặt tên theo vùng hoặc nền văn hóa hiện hành )
15 ProductTypes Lớp lưu trữ tên các loại sản phẩm
16 DishType Lớp lưu trữ các loại món ăn
17 Units Lớp lưu trữ các đơn vị
18 CookMethods Lớp lưu trữ các phương pháp nấu ăn
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 followingUsers Array[String] Danh sách mã những người đang được mình theo dõi
3 followerUsers Array[String] Danh sách mã những người đang theo dõi mình
4 name String Tên người dùng
5 email String Unique Địa chỉ email
6 bio String Tiểu sử người dùng
7 avatarUrl String Đường dẫn tới ảnh đại diện
8 phone String Số điện thoại
10 status String Trạng thái của tài khoản
11 hashPassword String Mật khẩu đã được mã hóa
13 updatedAt Date Ngày cập nhật
Bảng 3.11: Mô tả Users Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 creatorId ObjectId Mã người tạo
4 updatedAt Date Ngày cập nhật
7 name String Tên công thức
8 photoUrls Array[String] Danh sách đường dẫn của các ảnh
10 steps Array[Object] Danh sách các bước chế biến steps.content String Nội dung steps.photoUrls Array[String] Danh sách đường dẫn của các ảnh
11 level String Độ khó ( dễ, trung bình, khó )
The article outlines a list of 12 ingredients, each identified by a name, type ID, unit ID, and quantity These components are essential for the preparation of various dishes, ensuring accurate measurement and categorization for effective cooking.
13 specialGoals Array[ObjectId] Danh sách mã những mục tiêu đặc biệt của món
14 totalTime Number Tổng thời gian chế biến tính bằng tổng số phút
15 totalView Number Tổng số lần xem
16 menuTypes Array[ObjectId] Danh sách mã của những loại thực đơn
17 videoUrl String Đường dẫn của video
18 videoThumbnail String Đường dẫn thumbnail của video
19 cuisineId ObjectId Mã nền ẩm thực
20 dishTypeId ObjectId Mã loại món
21 cookMethodId ObjectId Mã phương pháp nấu
Bảng 3.12: Mô tả Recipes Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 creatorId ObjectId Mã người tạo
3 photoUrls Array[String] Danh sách đường dẫn của các ảnh
4 videoUrl String Đường dẫn của video
5 viewRange String Phạm vi người có thể xem
6 backgroundColor String Màu nền của nội dung
7 content String Nội dung bài viết
8 tags Array[String] Danh sách các thẻ
10 updatedAt Date Ngày cập nhật
Bảng 3.13: Mô tả Post Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 creatorId ObjectId Mã người tạo
3 postId ObjectId Mã bài viết
4 parentId ObjectId Mã bình luận cha
5 photoUrls Array[String] Danh sách đường dẫn tới các ảnh
6 videoUrl String Đường dẫn tới video
7 content String Nội dung bình luận
9 updatedAt Date Ngày cập nhật
Bảng 3.14: Mô tả Comments Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 creatorId ObjectId Mã người tạo
3 productTypeId ObjectId Mã loại sản phẩm
4 photoUrls Array[String] Danh sách đường dẫn của các ảnh
5 videoUrl String Đường dẫn tới video
6 videoThumbnail String Đường dẫn tới thumbnail của video
7 description String Mô tả sản phẩm
8 name String Tên sản phẩm
10 currencyUnit String Đơn vị tiền tệ
11 salesLocation Array[String] Danh sách địa điểm bán
13 updatedAt Date Ngày cập nhật
Bảng 3.15: Mô tả Products Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 recipeId ObjectId Unique Mã công thức
3 userId ObjectId Unique Mã người dùng
5 updatedAt Date Ngày cập nhật
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 recipeId ObjectId Unique Mã công thức
3 userId ObjectId Unique Mã người dùng
5 updatedAt Date Ngày cập nhật
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 recipeId ObjectId Unique Mã công thức
3 userId ObjectId Unique Mã người dùng
4 point Number Điểm đánh giá
6 updatedAt Date Ngày cập nhật
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 postId ObjectId Unique Mã bài viết
3 userId ObjectId Unique Mã người dùng
4 type String Loại phản ứng
6 updatedAt Date Ngày cập nhật
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 commentIds ObjectId Unique Mã bình luận
3 userId ObjectId Unique Mã người dùng
4 type String Loại phản ứng
6 updatedAt Date Ngày cập nhật
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 name String Tên loại sản phẩm
Bảng 3.16: Mô tả ProductTypes Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 name String Tên đơn vị
Bảng 3.17: Mô tả Units Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 name String Tên nguyên liệu nấu ăn
Bảng 3.18: Mô tả Ingredients Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 name String Tên của mục tiêu đặc biệt
Bảng 3.19: Mô tả SpecialGoals Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 name String Tên loại thực đơn
Bảng 3.20: Mô tả MenuTypes Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 name String Tên nền ẩm thực
Bảng 3.21: Mô tả Cuisines Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 name String Tên loại món ăn
Bảng 3.22: Mô tả DishType Collection
STT Tên Kiểu Ràng buộc Ý nghĩa
1 id ObjectId Mã nhận dạng
2 name String Tên cách nấu ăn
Kết chương
Chương này tập trung vào phân tích và thiết kế hệ thống thông qua các sơ đồ chức năng và sơ đồ lớp Trong chương tiếp theo, chúng tôi sẽ trình bày quy trình hiện thực hóa hệ thống, bao gồm việc xây dựng kiến trúc hệ thống, phát triển API, ứng dụng di động và chatbot.
HIỆN THỰC HỆ THỐNG
Mở đầu
Sau khi hoàn thành phân tích và thiết kế hệ thống, bước tiếp theo là hiện thực hóa các chức năng đã xác định Chương này sẽ trình bày kiến trúc hệ thống cùng với quy trình xây dựng các API, giao diện ứng dụng và chatbot.
Kiến trúc hệ thống
Hình 4.1: Kiến trúc hệ thống
Mobile(Client): thể hiện giao diện nơi người dùng tương tác với hệ thống
Khách hàng giao tiếp với máy chủ thông qua cơ chế Request/Response để yêu cầu xử lý thông tin và nhận kết quả hiển thị cho người dùng Ứng dụng di động (client) được phát triển bằng Flutter.
Server (Nodejs): Nhận và xử lý request từ Client Có thể tương tác với
Database (MongoDB) để tương tác dữ liệu và trả kết quả về cho Client thông qua Response Server được hiện thực hóa sử dụng ExpressJS
Chatbot Rasa sẽ kết nối trực tiếp với Restful API để xử lý các hành vi chat và tương tác của người dùng, từ đó cung cấp những mẫu câu và hành động phù hợp.
Api-Database(Edamam, Cooky): Chatbot sẽ kết nối trực tiếp với dữ liệu
APi ( để tìm kiếm công thức nấu ăn, thực đơn, )
Database (MongoDB): lưu trữ các dữ liệu người dùng (bài viết, video, ảnh, ).
Xây dựng Server
4.3.1 Mô hình ba lớp Để xây dựng server công việc đầu tiên là lựa kiến trúc lập trình Lợi ích của việc này là giúp source code rõ ràng hơn, dễ dàng quản lý, phát triển và bảo trì khi có thay đổi và mô hình nhóm lựa chọn là mô hình ba lớp Mô hình này sẽ tách biệt hoàn toàn logic nghiệp vụ cũng như truy vấn database ra khỏi API route và chuyển chúng đến các layer tương ứng
The controller layer, which includes API routes and endpoints, is a crucial module in the application that defines the API routes Its primary function is to validate incoming data and forward it to the service layer for processing.
Module lớp dịch vụ (Service Layer) cho phép tách biệt logic nghiệp vụ khỏi các API Router, giúp mỗi service thực hiện một nhiệm vụ riêng biệt, tuân thủ nguyên tắc SOLID Việc chuyển giao logic nghiệp vụ vào module này không chỉ nâng cao khả năng tái sử dụng mà còn tăng cường hiệu quả cho các API khác nhau.
Module lớp truy cập dữ liệu (data access layer) chịu trách nhiệm giao tiếp với cơ sở dữ liệu, thực hiện các truy vấn như lấy dữ liệu, cập nhật và tạo mới Ngoài ra, module này còn đảm nhiệm việc định nghĩa mô hình, sử dụng ORM và kết nối với cơ sở dữ liệu.
Sau khi lựa chọn kiến trúc lập trình, bước tiếp theo là áp dụng kiến trúc này để thiết lập cấu trúc thư mục cho mã nguồn Điều này giúp chia nhỏ các công việc và quản lý chúng một cách hiệu quả Dưới đây là cấu trúc mà nhóm đã xây dựng.
Hình 4.3: Cấu trúc thư mục của Server Theo cấu trúc này source sẽ được chia thành 10 folder, trong đó:
• Config: Chứa các cài đặt cơ bản để xử lý các vấn đề chung của mỗi request nhằm giảm bớt công việc khi xây dựng các api
• Utils: Sẽ chưa các hàm tiện ích chung sẽ được tái sử dụng ở nhiều nơi
• Routes: Chưa các api routes
Middleware là thành phần trung gian giữa yêu cầu và phản hồi, thực hiện các xử lý logic bên trong server Nó bao gồm các hàm dùng để tiền xử lý và lọc yêu cầu trước khi đưa vào xử lý logic, cũng như điều chỉnh phản hồi trước khi gửi đến người dùng.
• Permissions: Đây là nơi chứa các hàm kiểm tra quyền và cho phép sử dụng api này hay không
Khi một yêu cầu được gửi đi, validation sẽ kiểm tra tính hợp lệ của các dữ liệu kèm theo trước khi chuyển chúng đến controller để xử lý Các validation chứa các đối tượng lưu trữ cấu trúc kiểm tra cho từng yêu cầu.
• Controllers: Chứa các module với nhiệm vụ chuyển các data đến services
Dịch vụ đại diện cho lớp dịch vụ, nơi tập hợp các mô-đun chứa logic nghiệp vụ và tương tác với lớp truy cập dữ liệu Các mô-đun này cho phép tái sử dụng các API khác nhau.
• Models: Đây là nơi chưa các schema cho các collection tương ứng được lưu trữ trên MongoDB
4.3.3 Xây dựng các thành phần
Theo kết quả của phần thiết kế dữ liệu và chức năng chúng tôi đã xây dựng chúng tôi chia chia các collection thành 3 nhóm như sau
Data access: có 18 collection với:
• 5 collection chính (Users, Posts, comments, Recipes, Products)
• 5 collection chi tiết (RecipeLikes, RecipeCooks, Ratings, CommentReactions, PostReactions)
• 8 collection tra cứu (Ingredients, Units, SpecialGoals, MenuTypes, Cuisines, DishTypes, CookMethods, ProductTypes)
Sau khi phân chia các collection thành các nhóm, chúng tôi đã xây dựng Mongo Schema dựa trên thiết kế cho tất cả các collection Với dữ liệu từ ứng dụng mạng xã hội, kích thước dữ liệu sẽ tăng dần theo thời gian, do đó, việc tối ưu thời gian thực thi cho các dữ liệu lớn, với hàng chục ngàn record trở lên, là cực kỳ quan trọng để nâng cao hiệu suất ứng dụng và cải thiện trải nghiệm người dùng Trong MongoDB, việc sử dụng Indexes giúp thực thi các câu lệnh query một cách hiệu quả, tương tự như mục lục của một cuốn sách, giúp truy vấn nhanh chóng hơn Nếu không có index, một câu truy vấn sẽ phải thực hiện table scan, tức là xem qua toàn bộ các Document, dẫn đến hiệu suất chậm cho các collection lớn Vì vậy, sau khi xây dựng schema, chúng tôi đã thiết lập các indexes cho các collection để hỗ trợ các chức năng truy vấn và tìm kiếm, đồng thời gắn thêm các plugin như toJson và pagination.
Service: Sau khi đã có các collection chúng tôi xây dựng có các service để tương tác với chúng theo thứ tự như sau:
• Mỗi collection chính có 6 service gồm Create, Query, GetById, UpdateById, DeleteById, TextSearch
• Recipe xây dựng thêm các service Like, Dislike, Mark Cooked, Unmark Cooked, Vote, Unvote
• Post và comment thêm service React và Delete Reaction
• User có follow và unfollow
• Với collection chi tiết xây dựng các service query
• Mỗi collection tra cứu có 5 service Create, Query, GetById, UpdateById, DeleteById
• Với media bao gồm image và video xây dựng service upload, download, và getList
Để xây dựng các dịch vụ cho các collection chính, cần tạo các câu lệnh truy vấn nhằm lấy thông tin cần thiết từ các collection khác Trong MongoDB, chúng tôi sử dụng phương pháp Aggregate và thiết lập các pipeline phù hợp với từng collection để thực hiện điều này.
Mỗi service sẽ được xây dựng một validate để kiểm tra dữ liệu đầu vào từ request, cùng với một controller để chuyển dữ liệu cho service Sau đó, chúng tôi sẽ xây dựng các route và gắn các thành phần vào Khi đã hoàn thành các route, chúng tôi chia thành các cụm và tiến hành kiểm thử với Postman, và kết quả thu được như sau.
Hình 4.4: Kết quả xây dựng các API route
Xây dựng ứng dụng mobile
Khi xây dựng ứng dụng di động, việc lựa chọn kiến trúc phù hợp là rất quan trọng để phát triển và phát hiện lỗi dễ dàng hơn Đối với ứng dụng Flutter, BLOC pattern là lựa chọn phổ biến nhất, giúp tách biệt business logic khỏi giao diện người dùng (UI) BLoC (Business Logic Component) là hệ thống quản lý state được Google đề xuất, cho phép lập trình viên quản lý state và luồng dữ liệu hiệu quả hơn, vì các state được quản lý độc lập với UI Điều này mang lại lợi ích lớn cho việc phát triển từng màn hình trong ứng dụng Flutter.
40 nên tạo ra 1 bloc để xử lý logic của màn hình đó và quản lý state của cả màn hình đó
Hình 4.5: BLOC pattern cho flutter
Từ sơ đồ BLOC pattern và kiến thức lập trình Flutter chúng tôi ứng dụng vào source code và xây dựng cấu trúc thư mục như sau:
Hình 4.6: Cấu trúc thư mục trong ứng dụng Flutter
• Core: Đây là nơi chứa các class cơ sở để kế thừa sau này
• Blocs: Nơi chứa tất cả các bloc của ứng dụng
• Local services: Tương tác với các dữ liệu được lưu ở máy
• Remote services: Tương tác với các dữ liệu lưu trữ ở nơi khác
• Responses: Các class với hàm chuyển dữ liệu trả về từ response sang dạng model tương ứng
• Models: Các class đối tượng trên ứng dụng
• Repositories: Làm trung gian giữa Bloc và service, xử lý các dữ liệu và chuyển đến tầng tiếp theo
• Pages: Nơi hiện thực các giao diện của ứng dụng
• Widgets: Chứa các widget nhỏ có thể tái sử dụng ở nhiều nơi
• Utils: Chứa các module có thể được tái sử dụng
• Các folder khác: Style của ứng dụng như asset, color, constant, language, … 4.4.3 Xây dựng các thành phần
Dựa trên thiết kế usecase và giao diện, chúng tôi đã phát triển các giao diện và chức năng theo cấu trúc mã nguồn đã đề ra.
Công việc đầu tiên là xây dựng và kiểm tra các yêu cầu tới API bằng cách tạo ra các dịch vụ từ xa tương ứng với API và các kho dữ liệu để quản lý chúng Tiếp theo, chúng tôi phát triển một trang để kiểm tra tất cả các API này Để sử dụng kết quả trả về từ API dưới dạng JSON, cần xây dựng các lớp chuyển đổi, trong đó chúng tôi tạo ra các file response và model theo cấu trúc của đoạn JSON trả về.
Sau khi đã chuẩn bị xong phần dữ liệu cho ứng dụng chúng tôi sẽ xây dựng các Page và các Bloc tương ứng cho mỗi Page như sau:
4.4.3.1 Màn hình đăng nhập Đây là màn hình đầu tiên khi mở ứng dụng Nhập thông tin và nhấn nút đăng nhập
Hình 4.7: Màn hình đăng nhập
Màn hình hiển thị danh sách các bài viết
• Nhấn vào dấu cộng ở góc phải màn hình để mở màn hình thêm bài viết
• Tương tự, nhấn nút kính lúp kế bên để tìm kiếm
• Ở mỗi bài viết trong danh sách: o Nhấn giữ nút reaction để chọn loại react o Nhấn comment để mở màn hình bình luận o Nhấn share để chia sẻ link
4.4.3.3 Màn hình thêm và chỉnh sửa bài viết
Màn hình tạo một bài viết mới
• Nhấn “Post” đăng bài viết khi đã đủ thông tin
• Nhấn hai nút dưới TextField để chọn ảnh và video
Hình 4.9: Màn hình tạo và chỉnh sửa bài viết
4.4.3.4 Màn hình chi tiết bài viết
Hình 4.10: Màn hình chi tiết bài viết
4.4.3.5 Màn hình công thức nấu ăn
Màn hình hiển thị danh sách các công thức nấu ăn
• Đầu màn hình là thanh search để tìm kiếm
• Ngay dưới thanh search là các bộ lọc (Độ khó, loại món, nền ẩm thực)
• Nhấn vào nút cộng ở góc dưới màn hình để mở màn hình thêm công thức mới
• Mỗi công thức: o Nhấn vào nút trái tim để thả like cho công thức o Nhấn vào công thức để mở trang chi tiết của công thức
Hình 4.11: Màn hình công thức nấu ăn
4.4.3.6 Màn hình chi tiết công thức nấu ăn
Màn hình sẽ hiển thị thông tin chi tiết của công thức nấu ăn
• Nhấn nút trái tim bên dưới để thích công thức
• Nhấn nút kế bên để chia sẻ công thức
Hình 4.12: Màn hình chi tiết công thức nấu ăn
4.4.3.7 Màn hình thêm và chỉnh sửa công thức
Màn hình tạo công thức nấu ăn mới và chỉnh sửa công thức
• Nhập dữ liệu ở các TextField và DropDown
• Bấm vào “Add ingredient” để mở bảng thêm cho nguyên liệu
• Bấm vào “Add cook step” để mở bảng thêm bước nấu ăn
• Nhấn vào hai nút ngay dưới để thêm ảnh và video
• Nhấn “Submit” để đăng công thức khi đã đủ thông tin
Hình 4.13: Màn hình thêm và chỉnh sửa công thức
Màn hình hiển thị danh sách các sản phẩm
• Đầu màn hình là thanh search để tìm kiếm
• Ngay dưới thanh search là các bộ lọc (Loại sản phẩm, đơn vị tiền tệ)
• Nhấn vào nút cộng ở góc dưới màn hình để mở màn hình thêm sản phẩm mới
• Nhấn vào công thức để mở trang chi tiết của sản phẩm
Hình 4.15: Màn hình sản phẩm
4.4.3.10 Màn hình thêm và chỉnh sửa sản phẩm
Màn hình thêm sản phẩm mới và chỉnh sửa sản phẩm Tương tự với màn hình thêm công thức nấu ăn
Hình 4.16: Màn hình thêm và chỉnh sửa sản phẩm
4.4.3.11 Màn hình chi tiết sản phẩm
Hình 4.17: Màn hình chi tiết sản phẩm
4.4.3.12 Màn hình thông tin cá nhân
Click on the quantity boxes for recipes, posts, or products to access the corresponding screen The items displayed represent data created by the logged-in user Select an item to open the MenuPopup, which offers options for updating or deleting.
• Nhấn biểu tượng edit ở cuối Name, Phone, Language để cập nhật thông tin
• Nhấn followings, followers để xem danh sách các người dùng tương ứng
Hình 4.18: Màn hình thông tin cá nhân
4.4.3.13 Màn hình thông tin của người dùng khác
• Nhấn vào ô số lượng recipes, posts, products để mở màn hình tương ứng Với các item là dữ liệu được tạo bởi người dùng này
• Nhấn followings, followers để xem danh sách các người dùng tương ứng
• Nhấn nút follow để follow hoặc unfollow người dùng này
Hình 4.19: Màn hình thông tin người dùng khác
• Bấm vào tab followings, followers để xem danh sách tương ứng
• Nếu là người dùng khác thì hiển thị nút follow với tình trạng follow đối với tài khoản đang đăng nhập Nhấn nút để follow hoặc unfollow
Xây dựng chatbot
Chatbot được thiết kế nhằm hỗ trợ con người trong việc giải đáp các câu hỏi liên quan đến ăn uống, với các chức năng chính bao gồm cung cấp thông tin về dinh dưỡng, gợi ý công thức nấu ăn, và tư vấn chế độ ăn uống hợp lý.
• Tìm kiếm công thức nấu ăn
• Tạo thực đơn trong ngày
• Xem hàm lượng dinh dưỡng
Để thực hiện các chức năng trong nấu ăn, bước đầu tiên là xây dựng một tập dữ liệu huấn luyện nhằm nhận diện các ý định (intent) tương ứng.
4.5.1 Xây dựng tập dữ liệu huấn luyện
Xây dựng tập dữ liệu huấn luyện là bước quan trọng quyết định đến chatbot
“thông minh” hay không Trong Rasa, cấu trúc lưu trữ tập huấn luyện được chia thành các file: nlu.yml; stories.yml và domain.yml
- Hôm nay ăn gì ?
Để nấu món gà, việc nhận diện chính xác ý định là rất quan trọng Để đạt được điều này, cần xử lý các khó khăn trong việc hiểu văn bản Trong dữ liệu huấn luyện của Rasa, cần xây dựng các cấu trúc thành phần phù hợp để cải thiện khả năng nhận diện.
Hình 4.21: Từ đồng nghĩa Hình 4.22: Bảng tra cứu
Kịch bản là một yếu tố quan trọng quyết định hiệu quả của chatbot, giống như một câu chuyện dẫn dắt khách hàng theo hướng nhất định, giúp hạn chế các câu hỏi ngoài tập dữ liệu Các kịch bản này được soạn sẵn để dự đoán các tình huống có thể xảy ra trong quá trình trò chuyện với người dùng, tùy thuộc vào mục đích sử dụng của chatbot.
Để xây dựng một chatbot thông minh, việc thay đổi kịch bản nội dung phù hợp với yêu cầu hệ thống là rất quan trọng Nhóm đã phát triển các kịch bản hội thoại nhằm đáp ứng các chức năng chính mà chatbot hướng tới.
Hình 4.23: Sơ đồ kịch bản chatbot
Nhóm đã sử dụng dữ liệu thu thập từ API và kết hợp với cấu trúc lưu trữ của Rasa để tạo ra tập huấn luyện cho chatbot Quá trình này đòi hỏi sự tỉ mỉ và thời gian để xác định các intent, ví dụ, entities, và stories, đồng thời loại bỏ dữ liệu không phù hợp và trùng lặp Dưới đây là một phần của file dữ liệu.
Trong cấu trúc chatbot của Rasa, 60 huấn luyện được phân chia trong các file nlu.yml, domain.yml và stories Dữ liệu xây dựng dựa trên bốn chức năng chính và nguồn dữ liệu công thức từ hai API Edamam và Cooky, kết hợp với thông tin nấu ăn từ Wiki Nội dung của file nlu.yml được cấu trúc một cách cụ thể để hỗ trợ quá trình huấn luyện chatbot hiệu quả.
Trong RASA, tệp Nlu.yml được sử dụng để xác định intent và entity, giúp quá trình NLU pipeline chuyển đổi tin nhắn không có cấu trúc từ người dùng thành các ý định và thực thể một cách hiệu quả Đây là một quy trình hoàn chỉnh nhằm tối ưu hóa khả năng hiểu và phản hồi của hệ thống.
Trong quy trình xử lý ngôn ngữ tự nhiên, có 61 lựa chọn từ Tokenizers, Featurizers, Extractors đến Classifiers, tất cả đều có thể được cấu hình và tùy chỉnh bởi lập trình viên Dưới đây là các thành phần mà chúng tôi đã chọn trong pipeline và cách thức hoạt động của chúng.
Hình 4.25: Tương tác giữa các thành phần trong NLU pipeline
Tokenizers là bước khởi đầu quan trọng trong việc chia câu thành các đơn vị nhỏ hơn gọi là token Quá trình này cần thiết trước khi tiến hành trích xuất đặc trưng trong học máy, vì vậy tokenizer thường được liệt kê đầu tiên trong quy trình xử lý.
Trong tiếng Anh, WhiteSpaceTokenizer thường được sử dụng, nhưng đối với các ngôn ngữ khác, chúng ta có thể lựa chọn tokenizer phù hợp SpaCy là một lựa chọn tốt vì hỗ trợ nhiều ngôn ngữ, bao gồm cả tiếng Việt Tuy nhiên, trong đề tài này, nhóm đã quyết định sử dụng một tokenizer tự xây dựng thông qua thư viện underthesea.
Featurizers là công cụ quan trọng trong việc tạo ra các đặc trưng số cho các mô hình học máy Ví dụ, từ "Hi" có thể được mã hóa thành các đặc trưng số khác nhau, giúp cải thiện khả năng phân tích và dự đoán của mô hình Sử dụng featurizers đúng cách sẽ nâng cao hiệu quả của các thuật toán học máy.
Hình 4.27: Cách hoạt động của Featurizer (1)
Có hai loại đặc trưng:
Các đặc tính thưa thớt (Sparse Features): thường được tạo bởi Countvectorizer Các số này có thể đại diện có các từ
Các đặc tính dày đặc (Dense Features) bao gồm nhiều bộ nhúng đã được đào tạo trước cho các ngôn ngữ, thường được sử dụng qua SpaCyFeaturizers hoặc huggingface thông qua LanguageModelFeaturizers.
Featurizer hoạt động bằng cách tạo ra các đặc trưng không chỉ cho từng token mà còn cho toàn bộ câu thông qua một đặc trưng gọi là CLS token.
Các bộ phân loại ý định là một phần quan trọng trong việc xử lý ngôn ngữ tự nhiên Sau khi tạo đặc trưng cho từng token và toàn bộ câu, chúng ta có thể áp dụng mô hình phân loại ý định Rasa khuyến nghị sử dụng DietClassifier vì nó có khả năng xử lý đồng thời cả phân loại ý định và các tác vụ khác.
63 khai thác thực thể Nó cũng có thể học hỏi từ cả hai đặc trưng của token và cả câu
Hình 4.29: Cách hoạt động của Intent Classifier
Kết chương
Chương này đã trình bày kiến trúc hệ thống, thiết kế và xây dựng API, giao diện ứng dụng di động, cùng với phát triển chatbot Chương tiếp theo sẽ tổng kết và đề xuất hướng phát triển trong tương lai.