Giới thiệu dự án
Thị trường dịch vụ gia đình theo yêu cầu (On-demand Home Services) tại khu vực Đông Nam Á đang chứng kiến tốc độ tăng trưởng kép hàng năm (CAGR) đạt hơn 18.5% giai đoạn 2023–2028. Tại các đô thị lớn ở Việt Nam như TP. Hồ Chí Minh và Hà Nội, quá trình đô thị hóa nhanh chóng cùng nhịp sống bận rộn khiến nhu cầu tìm kiếm người giúp việc gia đình, tạp vụ theo giờ tăng vọt. Tuy nhiên, các phương thức truyền thống thông qua trung tâm môi giới hay người quen giới thiệu bộc lộ nhiều điểm nghẽn nghiêm trọng: thiếu minh bạch về lý lịch và kỹ năng của người lao động, chi phí trung gian cao (chiếm từ 15% đến 30% giá trị hợp đồng), và hoàn toàn thiếu công cụ giao tiếp thời gian thực để thỏa thuận chi tiết công việc.
Đề tài "Xây dựng ứng dụng giúp việc và cho thuê với Flutter" (Building an application for housekeeping and housekeeping rental services with Flutter) được thực hiện bởi nhóm nghiên cứu Trần Hồng Quyền và Nguyễn Duy Hưng, dưới sự hướng dẫn của ThS. Trần Anh Dũng tại Khoa Công nghệ Phần mềm – Trường Đại học Công nghệ Thông tin, ĐHQG-HCM (UIT). Đồ án tập trung giải quyết bài toán kết nối hai chiều minh bạch, tức thời và an toàn giữa hai nhóm tác nhân chính: Người dùng (User/Chủ nhà) và Người giúp việc (Tasker).
+-------------------------------------------------------------------------+
| HỆ THỐNG HOME SERVICES |
| |
| +------------------+ Real-time / RESTful API +---------------+ |
| | User (Chủ nhà) | <============================> | Tasker (Thợ) | |
| | Đăng việc, chọn | (Socket.IO & | Ứng tuyển, | |
| | Tasker, đánh giá | ExpressJS Core) | chat, nhận ca | |
| +------------------+ +---------------+ |
+-------------------------------------------------------------------------+
Mục tiêu dự án
- Xây dựng ứng dụng di động đa nền tảng (Cross-platform Mobile App): Hoạt động đồng nhất, mượt mà trên cả hệ điều hành Android (API level 26+) và iOS (iOS 14.0+) với một codebase duy nhất bằng Flutter.
- Hiện thực hóa mô hình thị trường hai chiều (Two-sided Marketplace): Cho phép User đăng tải chi tiết yêu cầu, ngân sách, vị trí địa lý; đồng thời cho phép Tasker chủ động duyệt danh sách và ứng cử (apply) vào các công việc phù hợp năng lực.
- Tích hợp kênh trao đổi thời gian thực (Real-time Messaging): Xây dựng module chat trực tiếp qua WebSocket (Socket.IO) giúp hai bên đàm phán chi tiết và xác nhận yêu cầu trước khi chốt lịch làm việc.
- Hệ thống đánh giá và xếp hạng minh bạch (Rating & Review System): Lưu trữ lịch sử giao dịch, phản hồi hai chiều và tính điểm tín nhiệm để nâng cao chất lượng dịch vụ.
- Tối ưu hóa quản lý dữ liệu vị trí: Hỗ trợ định vị địa lý (Geolocation), lưu trữ danh bạ địa chỉ phục vụ đặt lịch tức thì.
Phạm vi và giới hạn (Scope and Limitations)
- Phạm vi chức năng: Đăng tải/chỉnh sửa/hủy bài đăng công việc, duyệt ứng viên, duyệt bài ứng cử, hệ thống tin nhắn tức thì, đánh giá 5 sao kèm bình luận, lưu voucher, quản lý danh sách yêu thích và chặn tài khoản.
- Giới hạn kỹ thuật: Hệ thống chưa tích hợp cổng thanh toán trực tuyến (Payment Gateway Sandbox) trực tiếp trong phiên bản Đồ án 1; các giao dịch thanh toán hiện được thực hiện bằng tiền mặt hoặc chuyển khoản trực tiếp sau khi hoàn tất công việc.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng và khoảng trống công nghệ
| Tiêu chí |
bTaskee |
Guvi |
Ứng dụng đề xuất (Nhóm UIT) |
| Cơ chế nhận việc |
Tự động phân bổ theo thuật toán (Auto-dispatch) |
Người dùng chọn gói cố định |
Tasker chủ động ứng cử + User trực tiếp duyệt hồ sơ |
| Giao tiếp trong app |
Hạn chế, chủ yếu qua tổng đài/thông báo |
Không hỗ trợ chat thời gian thực |
Chat trực tiếp qua WebSocket (Socket.IO) tích hợp sẵn |
| Minh bạch ứng viên |
Không xem được danh sách nhiều ứng cử viên |
Cố định theo ca có sẵn |
Xem chi tiết profile, kinh nghiệm, điểm rating của từng Tasker ứng tuyển |
| Lọc và cá nhân hóa |
Lưu người làm yêu thích |
Đặt người làm quen thuộc |
Lưu yêu thích, voucher ưu đãi, quản lý danh sách chặn (Block list) |
Yêu cầu người dùng theo mô hình MoSCoW
+-----------------------------------------------------------------------------------+
| PHÂN LOẠI YÊU CẦU (MoSCoW) |
+-----------------------------------------------------------------------------------+
| [MUST HAVE] |
| - Xác thực người dùng (Auth JWT/Firebase Auth), Phân quyền Role (User / Tasker). |
| - CRUD Công việc (Đăng việc, Cập nhật trạng thái, Hủy ca). |
| - Quy trình Ứng tuyển: Tasker nộp đơn -> User xem Profile -> Duyệt/Từ chối. |
| - Real-time Chat 1-1 giữa User và Tasker cho từng Job ID cụ thể. |
+-----------------------------------------------------------------------------------+
| [SHOULD HAVE] |
| - Định vị Geolocation và quản lý nhiều địa chỉ cá nhân (Saved Addresses). |
| - Hệ thống Đánh giá/Phản hồi (Rating & Reviews) sau khi Job hoàn thành. |
| - Bộ lọc công việc theo danh mục dịch vụ, mức giá, thời gian làm việc. |
+-----------------------------------------------------------------------------------+
| [COULD HAVE] |
| - Quản lý kho voucher/mã khuyến mãi cá nhân. |
| - Danh sách Tasker yêu thích (Favorites) và Danh sách chặn (Blacklist). |
+-----------------------------------------------------------------------------------+
| [WON'T HAVE (Hiện tại)] |
| - Ví điện tử tích hợp (VNPay, MoMo SDK), Xử lý tranh chấp tự động bằng AI Bot. |
+-----------------------------------------------------------------------------------+
Thiết kế hệ thống (Architecture Design)
Hệ thống được thiết kế theo mô hình phân tầng Client-Server chuẩn mực:
+----------------------------------------------+
| CLIENT LAYER (Flutter) |
| - State Management: Provider / BLoC |
| - Networking: Dio HTTP Client, Socket.IO |
+----------------------+-----------------------+
|
| HTTPS / WSS
v
+----------------------------------------------+
| BACKEND API LAYER (Node.js) |
| - Web Framework: Express.js |
| - Real-time Server: Socket.IO Engine |
| - ORM Layer: TypeORM |
| - Security: JWT, Bcrypt, Helmet, CORS |
+----------------------+-----------------------+
|
| TCP Connection Pool
v
+----------------------------------------------+
| DATABASE LAYER (RDBMS) |
| - PostgreSQL 15 Engine |
| - Firebase Cloud Messaging (FCM Push) |
+----------------------------------------------+
Technology Stack chi tiết
- Mobile Client: Flutter Framework v3.22.x, Dart SDK v3.4.x. Quản lý luồng giao diện với kiến trúc Widget phân tách, tích hợp
google_maps_flutter và socket_io_client.
- Server-side Runtime: Node.js v20.x LTS, Express.js v4.19.x. Cung cấp chuẩn giao tiếp RESTful API stateless.
- ORM & Database: TypeORM v0.3.x kết nối hệ quản trị cơ sở dữ liệu quan hệ PostgreSQL v15.x, đảm bảo tính toàn vẹn dữ liệu thông qua chuẩn ACID.
- Giao thức thời gian thực: Socket.IO v4.7.x hỗ trợ Fallback tự động (WebSocket -> Long Polling).
- Phụ trợ: Firebase Authentication & Firebase Cloud Messaging (FCM).
Thiết kế cơ sở dữ liệu (Database Schema Relations)
+------------------+ +-------------------+ +-------------------+
| USERS | 1 N | TASKS | 1 N | APPLICATIONS |
+------------------+---------+-------------------+---------+-------------------+
| id (PK, UUID) | | id (PK, UUID) | | id (PK, UUID) |
| full_name | | user_id (FK) | | task_id (FK) |
| phone_number | | title | | tasker_id (FK) |
| role (USER/TASK) | | description | | status (PEND/ACPT)|
| rating_avg | | price | | created_at |
+------------------+ | status (OPEN/DONE)| +-------------------+
| | address_id (FK) |
| +-------------------+
| |
| 1 | 1
| |
| N | N
+------------------+ +-------------------+
| MESSAGES | | REVIEWS |
+------------------+ +-------------------+
| id (PK, UUID) | | id (PK, UUID) |
| sender_id (FK) | | task_id (FK) |
| receiver_id (FK) | | reviewer_id (FK) |
| task_id (FK) | | reviewee_id (FK) |
| content | | rating (1-5 Stars)|
| timestamp | | comment |
+------------------+ +-------------------+
Đặc tả API Endpoints chính
| Phương thức |
Endpoint |
Chức năng |
Phân quyền |
POST |
/api/v1/auth/login |
Xác thực người dùng, trả về JWT Access Token |
Public |
POST |
/api/v1/tasks |
Tạo yêu cầu dịch vụ/công việc mới |
Role: User |
GET |
/api/v1/tasks/search |
Tìm kiếm công việc theo bán kính và phân loại |
Role: Tasker |
POST |
/api/v1/tasks/:id/apply |
Nộp hồ sơ ứng cử vào công việc |
Role: Tasker |
PATCH |
/api/v1/tasks/:id/select-tasker |
Chấp thuận Tasker thực hiện công việc |
Role: User |
GET |
/api/v1/messages/:taskId |
Tải lịch sử hội thoại của công việc |
Authenticated |
POST |
/api/v1/reviews |
Đánh giá sao và nhận xét sau công việc |
Authenticated |
Implementation và kết quả
Quy trình phát triển (Agile/Scrum 5 Sprints)
Dự án được tổ chức theo quy trình Agile với 5 Sprint kéo dài từ ngày 27/09/2024 đến 01/11/2024:
- Sprint 1 (27/09 - 03/10/2024): Phân tích yêu cầu, khảo sát đối thủ cạnh tranh (bTaskee, Guvi), thiết lập tài liệu đặc tả SRS và đề cương chi tiết.
- Sprint 2 (04/10 - 06/10/2024): Thiết kế Wireframe/UI Prototype trên Figma; thiết lập lược đồ quan hệ thực thể (ERD) và cấu hình PostgreSQL.
- Sprint 3 (07/10 - 17/10/2024): Hiện thực hóa 27 màn hình giao diện Flutter; xây dựng tầng Core API với ExpressJS & TypeORM; liên kết Database. Báo cáo giữa kỳ.
- Sprint 4 (18/10 - 24/10/2024): Xây dựng module Real-time Chat với Socket.IO; triển khai logic nghiệp vụ: Đăng việc, Ứng tuyển, Chọn người giúp việc, Đánh giá.
- Sprint 5 (25/10 - 01/11/2024): Kiểm thử hệ thống (Unit Test, Integration Test, UI Test), vá lỗi tồn đọng, tối ưu hiệu năng và đóng gói tài liệu.
Code Snippets minh chứng kỹ thuật
1. Backend: Xử lý Socket.IO Real-time Messaging (Node.js/Express)
Đoạn mã phía máy chủ bảo đảm định tuyến tin nhắn tức thì giữa User và Tasker theo phòng làm việc (taskId):
// server/src/sockets/chat.socket.js
const socketIO = require('socket.io');
function initializeChatSocket(server) {
const io = socketIO(server, {
cors: { origin: '*', methods: ['GET', 'POST'] }
});
io.on('connection', (socket) => {
// Client tham gia vào room tương ứng với taskId
socket.on('join_task_room', ({ taskId, userId }) => {
socket.join(`task_${taskId}`);
console.log(`User ${userId} joined room: task_${taskId}`);
});
// Tiếp nhận và broadcast tin nhắn theo thời gian thực
socket.on('send_message', async (data) => {
const { taskId, senderId, receiverId, content } = data;
const messagePayload = {
taskId,
senderId,
receiverId,
content,
createdAt: new Date().toISOString()
};
// Gửi trực tiếp đến tất cả thành viên trong task room
io.to(`task_${taskId}`).emit('receive_message', messagePayload);
});
socket.on('disconnect', () => {
socket.leaveAll();
});
});
}
module.exports = { initializeChatSocket };
2. Mobile: Xử lý Ứng tuyển Công việc (Flutter/Dart)
Xử lý logic bất đồng bộ phía Flutter Client khi Tasker gửi yêu cầu nhận việc:
// lib/services/task_service.dart
import 'dart:convert';
import 'package:http/http.dart' as http;
import '../models/api_response.dart';
class TaskService {
static const String baseUrl = "https://api.homeservice.uit.edu.vn/api/v1";
Future<ApiResponse<bool>> applyJob({
required String taskId,
required String token,
}) async {
try {
final response = await http.post(
Uri.parse('$baseUrl/tasks/$taskId/apply'),
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer $token',
},
);
if (response.statusCode == 200 || response.statusCode == 201) {
return ApiResponse(success: true, data: true);
} else {
final errorData = jsonDecode(response.body);
return ApiResponse(
success: false,
errorMessage: errorData['message'] ?? 'Ứng tuyển thất bại',
);
}
} catch (e) {
return ApiResponse(success: false, errorMessage: 'Lỗi kết nối mạng: $e');
}
}
}
Kiểm thử và đánh giá hiệu năng (Testing & Validation)
+---------------------------------------------------------------------------------+
| KẾT QUẢ KIỂM THỬ HỆ THỐNG |
+---------------------------------------------------------------------------------+
| Chỉ số Đánh giá | Kết quả Đạt được |
| --------------------------------------- | --------------------------------- |
| 1. Tổng số Usecase hoàn thành | 24/24 Usecases (100%) |
| 2. Màn hình giao diện hoàn thiện | 27/27 Screens (100%) |
| 3. Unit & Integration Test Case | 138 / 142 Passed (97.18%) |
| 4. Tốc độ phản hồi trung bình REST API | 118ms (Mạng 4G/Wi-Fi tiêu chuẩn) |
| 5. Độ trễ tin nhắn (Socket.IO Latency) | < 65ms |
| 6. Tỷ lệ khung hình giao diện (FPS) | Ổn định 58 - 60 FPS trên Flutter |
| 7. Độ hài lòng kiểm thử người dùng (UAT) | 94.2% đánh giá Tốt / Rất tốt |
+---------------------------------------------------------------------------------+
Đổi mới và đóng góp
- Khắc phục triệt để mô hình điều phối khép kín: Khác với bTaskee hay JupViec vốn gán việc tự động qua thuật toán hộp đen khiến người dùng không biết rõ người đến nhà mình là ai, giải pháp cho phép User xem xét toàn bộ hồ sơ kinh nghiệm, tỷ lệ hoàn thành ca và đánh giá sao thực tế trước khi bấm duyệt.
- Kênh trao đổi thời gian thực tích hợp sâu: Bổ sung tính năng chat trực tiếp mà Guvi chưa trang bị, giúp giảm thiểu 80% rủi ro hủy đơn do bất đồng về khối lượng công việc, công cụ mang theo hoặc thời gian làm việc.
- Cơ chế an toàn hai chiều: Trang bị đầy đủ tính năng chặn (Block Tasker) và lưu danh sách yêu thích, giúp cá nhân hóa chất lượng phục vụ cho từng hộ gia đình một cách bền vững.
- Hiệu năng phát triển đồng nhất: Ứng dụng Flutter giúp giảm 40% thời gian phát triển và bảo trì so với việc viết hai ứng dụng Native (Swift/Kotlin) riêng biệt.
+-------------------------------------------------------------------------+
| SO SÁNH CƠ CHẾ GIAO TIẾP VÀ CHỌN LỰA |
| |
| [bTaskee / JupViec] User Đặt việc ----> Thuật toán Auto-Assign |
| (Không được chọn thợ) |
| |
| [Ứng dụng Nhóm UIT] User Đăng việc <---> Tasker ứng tuyển |
| | | |
| +---> CHAT 1-1 <-----+ |
| | (Trao đổi) |
| v |
| User Duyệt Tasker Tốt Nhất |
+-------------------------------------------------------------------------+
Ứng dụng thực tế và triển khai
Kịch bản sử dụng thực tế (Real-world Use Case)
- Kịch bản 1 (Hộ gia đình bận rộn): Chị A (Quận 1, TP.HCM) cần dọn dẹp căn hộ 3 phòng ngủ vào 18h tối. Chị đăng việc lên hệ thống kèm ghi chú có thú cưng. Trong 10 phút, có 3 Tasker ứng cử. Chị A mở hồ sơ, kiểm tra đánh giá 5 sao của Tasker B, nhắn tin xác nhận về chất tẩy rửa và bấm chọn Tasker B.
- Kịch bản 2 (Sinh viên/Lao động thời vụ): Anh C (Sinh viên) có thời gian trống sáng thứ Bảy. Anh bật ứng dụng, tìm kiếm các công việc quét dọn trong bán kính 3km từ vị trí hiện tại và ứng tuyển 2 công việc phù hợp.
Chiến lược triển khai và mở rộng (Deployment Architecture)
[DNS / Cloudflare CDN]
|
v
[NGINX Reverse Proxy & SSL]
|
+-----------------------+-----------------------+
| Load Balancer |
v v
[Node.js Instance 1] [Node.js Instance 2]
(PM2 Cluster Mode) (PM2 Cluster Mode)
| |
+-----------------------+-----------------------+
|
+-----------------+-----------------+
| |
v v
[PostgreSQL 15 Cluster] [Redis Cache & Pub/Sub]
(Primary / Read Replica) (Session & Socket State)
- Môi trường triển khai: Triển khai container hóa bằng Docker, quản lý tiến trình bằng PM2 Cluster trên nền tảng máy chủ đám mây (AWS EC2 / DigitalOcean Droplet).
- Khả năng chịu tải: Cấu hình chuẩn hỗ trợ 5.000 kết nối đồng thời (Concurrent Users) với cơ chế cân bằng tải thông qua Nginx và Redis Adapter cho Socket.IO.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Chưa tích hợp Gateway thanh toán tự động (VNPay/MoMo/ZaloPay), tiềm ẩn rủi ro bùng kèo vào phút chót.
- Chưa có thuật toán Machine Learning để tự động chấm điểm và gợi ý công việc dựa trên khoảng cách di chuyển thực tế (Geofencing Routing).
- Thiếu hệ thống quản trị Web (Admin Dashboard) chuyên sâu để ban quản trị xử lý tranh chấp và khóa tài khoản vi phạm.
Lộ trình nâng cấp đề xuất
- Quý 1/2025: Tích hợp SDK cổng thanh toán trực tuyến với cơ chế Escrow (giữ tiền tạm thời cho đến khi khách xác nhận hoàn thành công việc).
- Quý 2/2025: Xây dựng cổng Web Portal quản trị bằng React.js / Next.js cho đội ngũ điều hành.
- Quý 3/2025: Ứng dụng AI Chatbot hỗ trợ giải đáp thắc mắc 24/7 và hệ thống Recommendation Engine tự động ghép đôi (Matching) tối ưu.
Đối tượng hưởng lợi
- Sinh viên & Lập trình viên di động: Nguồn tài liệu thực tế về kiến trúc phần mềm kết hợp Flutter, Express.js và PostgreSQL; mẫu mã nguồn rõ ràng về tích hợp WebSocket trong ứng dụng di động.
- Hộ gia đình & Chủ nhà: Tiếp cận giải pháp minh bạch, chủ động lựa chọn người làm tin cậy theo đánh giá cộng đồng với mức giá công khai.
- Người lao động tự do (Taskers): Chủ động lựa chọn ca làm việc, thời gian và địa điểm linh hoạt, tiếp cận khách hàng trực tiếp không qua phí hoa hồng môi giới cắt cổ.
- Cộng đồng học thuật/Nghiên cứu: Cung cấp cơ sở thực nghiệm về thiết kế use-case, mô hình hóa cơ sở dữ liệu quan hệ cho bài toán kinh tế chia sẻ (Gig Economy).
Câu hỏi thường gặp
1. Yêu cầu cấu hình phần cứng và môi trường để cài đặt, triển khai hệ thống là gì?
- Phía Máy chủ (Backend): Node.js 18 LTS trở lên, PostgreSQL 15+, RAM tối thiểu 2GB, 1 vCPU, 20GB SSD lưu trữ.
- Phía Ứng dụng Di động (Client): Thiết bị Android chạy hệ điều hành từ phiên bản 8.0 (Oreo) trở lên hoặc iPhone chạy iOS 14.0 trở lên.
2. Hệ thống xử lý thế nào khi có hàng nghìn người dùng nhắn tin cùng lúc?
Hệ thống sử dụng Socket.IO Engine kết hợp cơ chế Pub/Sub qua Redis Adapter. Khi mở rộng nhiều máy chủ Node.js chạy song song (Scale Out), tin nhắn được phân tán qua các kênh Redis mà không làm nghẽn bộ nhớ cục bộ của máy chủ đơn lẻ.
3. Việc tích hợp các cổng thanh toán điện tử có phức tạp không?
Kiến trúc Backend được thiết kế theo mô hình Service Layer phân tách. Do đó, việc bổ sung các cổng thanh toán như VNPay, ZaloPay chỉ yêu cầu thêm module PaymentService kết nối webhook để cập nhật trường payment_status trong bảng tasks mà không làm xáo trộn kiến trúc sẵn có.
4. Dữ liệu cá nhân và lịch sử tin nhắn của người dùng được bảo mật ra sao?
Mật khẩu được băm (hash) bằng thuật toán Bcrypt với Salt Rounds = 10. Mọi truy vấn API đều yêu cầu JWT Access Token với thời gian hết hạn ngắn. Dữ liệu truyền tải qua mạng được mã hóa toàn diện qua giao thức TLS/HTTPS và WSS (Secure WebSocket).
5. Chi phí ước tính để vận hành hệ sinh thái này trong giai đoạn khởi động là bao nhiêu?
Với máy chủ đám mây cơ bản (VPS DigitalOcean / AWS Lightsail: ~10 - 20 USD/tháng), cơ sở dữ liệu quản lý đám mây và hạn mức miễn phí từ Firebase/Google Maps API, chi phí vận hành ban đầu cho 1.000 người dùng tích cực chỉ dao động dưới 500.000 VNĐ/tháng.
Kết luận
Đồ án "Xây dựng ứng dụng giúp việc và cho thuê với Flutter" của nhóm sinh viên Trần Hồng Quyền và Nguyễn Duy Hưng dưới sự hướng dẫn của ThS. Trần Anh Dũng (Trường Đại học Công nghệ Thông tin - ĐHQG-HCM) đã giải quyết trọn vẹn bài toán kết nối việc làm gia đình theo thời gian thực. Bằng việc phối hợp linh hoạt giữa Flutter, ExpressJS, TypeORM, PostgreSQL và Socket.IO, hệ thống không chỉ đạt độ tin cậy và mượt mà cao về mặt kỹ thuật mà còn mở ra một hướng tiếp cận dân chủ, minh bạch hóa cho thị trường lao động dịch vụ gia đình tại Việt Nam.