Giới thiệu dự án

Thị trường bất động sản cho thuê tại các đô thị lớn như TP. Hồ Chí Minh và Hà Nội ghi nhận hơn 70% sinh viên và người lao động ngoại tỉnh gặp khó khăn trong việc tiếp cận nguồn tin phòng trọ minh bạch, chính xác. Các phương thức tìm kiếm truyền thống hoặc qua mạng xã hội thường đối mặt với vấn nạn thông tin ảo, giá cả không đồng nhất, thiếu định vị trực quan và rủi ro lừa đảo tiền cọc. Đề tài "Tìm hiểu xây dựng ứng dụng tìm kiếm nhà trọ trên di động" (Khóa luận tốt nghiệp Kỹ sư CNTT, Trường Đại học Sư phạm Kỹ thuật TP.HCM - SVTH: Lê Hoàng Công, Nguyễn Quang Thọ; GVHD: TS. Lê Văn Vinh) được triển khai nhằm giải quyết triệt để bài toán kết nối giữa người thuê và chủ nhà trọ.

+-------------------------------------------------------------------------+
|                              HỆ THỐNG TÌM KIẾM NHÀ TRỌ                  |
|                                                                         |
|  [Android App (Kotlin)]   <--->   [API Gateway (Node.js/Express)]       |
|  - Google Maps SDK                - JWT Authentication                  |
|  - WebRTC Video Call              - RESTful Endpoints                   |
|                                            |                            |
|                                            v                            |
|  [Admin Portal (Python/Django)]  <---> [MySQL Database]                |
|  - Recommendation Engine (RS)          - User / Room / Review Schema   |
+-------------------------------------------------------------------------+

Mục tiêu dự án

  1. Xây dựng ứng dụng di động Android native bằng ngôn ngữ Kotlin cho phép người thuê tìm kiếm, lọc, xem bản đồ và tương tác trực tiếp với chủ trọ.
  2. Thiết kế RESTful API bằng Node.js/Express.js đảm bảo xử lý đồng thời (concurrent requests) với cơ chế bất đồng bộ Non-blocking I/O.
  3. Tích hợp giải thuật gợi ý phòng trọ thông minh (Recommendation System - RS) dựa trên lọc cộng tác (Collaborative Filtering) với hệ số tương quan Pearson viết bằng Python.
  4. Tích hợp giao thức truyền thông thời gian thực WebRTC/XMPP hỗ trợ nhắn tin và gọi video trực tiếp giữa người thuê và chủ trọ.
  5. Phát triển hệ thống quản trị Web Admin bằng Python/Django phân quyền đa cấp (Admin và Super Admin) nhằm kiểm duyệt bài đăng và quản lý dữ liệu.

Kết quả dự kiến và phạm vi

  • Kết quả đo lường được: Giảm 45% thời gian tìm trọ, độ trễ phản hồi API $\le 150\text{ ms}$, hệ thống gợi ý đạt độ chính xác (Precision@K) trên 82%.
  • Phạm vi & Giới hạn: Triển khai trên nền tảng Android (tối thiểu Android 6.0 Marshmallow, API level 23) và máy chủ Linux; dữ liệu khởi tạo tập trung tại các quận trung tâm và vùng ven TP. Hồ Chí Minh.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Khảo sát các giải pháp hiện hành trên thị trường chỉ ra nhiều khoảng trống công nghệ:

Tiêu chí App Ahana App Nhà Trọ 360 App Nhà Tốt Giải pháp đề tài
Giao diện & Trải nghiệm Đẹp, danh mục rõ ràng Đơn giản, cơ bản Tối giản, thiếu bắt mắt Hiện đại, tối ưu UX theo Material Design
Tìm kiếm trên Bản đồ Hạn chế bộ lọc map Chưa mượt mà Có Google Maps nhưng tải chậm Google Maps SDK + Marker Clustering
Giao tiếp chủ trọ Gọi điện thoại qua mạng viễn thông Gọi thoại thông thường Chat cơ bản Chat tức thời (XMPP) & Video Call (WebRTC)
Cơ chế gợi ý (RS) Danh sách tuần tự Không có Lọc theo tiêu chí tĩnh Lọc cộng tác (Pearson Correlation)
Xác thực & Bảo mật Cơ bản Không bắt buộc đăng nhập Tài khoản chuẩn JWT + Mã hóa mật khẩu BCrypt

Phân loại yêu cầu theo mô hình MoSCoW

  • Must-have: Đăng ký/đăng nhập qua JWT & Google Auth, tìm kiếm/lọc đa tiêu chí, định vị phòng trọ qua Google Maps SDK, quản lý bài đăng, phân quyền Admin/Super Admin.
  • Should-have: Gọi video thời gian thực qua WebRTC, nhắn tin tức thời XMPP, gợi ý phòng trọ cá nhân hóa bằng thuật toán Pearson.
  • Could-have: Đánh giá/bình luận đa chiều, lưu danh sách tin trọ yêu thích, định giá điện nước tự động theo khu vực.
  • Won't-have (giai đoạn này): Thanh toán tiền cọc trực tuyến qua cổng trung gian (VNPay/Momo), hợp đồng điện tử ký số.

Thiết kế hệ thống

Hệ thống được tổ chức theo kiến trúc phân tầng (Multi-tier Client-Server Architecture):

+-------------------------------------------------------------+
|                     PRESENTATION LAYER                      |
|  - Android Client (Kotlin, View Binding, Retrofit 2)       |
|  - Web Admin Dashboard (Django Template Engine, Bootstrap)  |
+-------------------------------------------------------------+
                              | HTTPS / WSS
+-------------------------------------------------------------+
|                      APPLICATION LAYER                      |
|  - API Gateway / Core API: Node.js v12.18.x + Express.js 4  |
|  - Auth Middleware: JSON Web Token (JWT) + BCrypt           |
|  - Analytics & Recommendation Service: Python 3.8           |
|  - Signaling Server: WebRTC PeerConnection + XMPP Protocol |
+-------------------------------------------------------------+
                              | Connection Pool
+-------------------------------------------------------------+
|                         DATA LAYER                          |
|  - Relational Database: MySQL 8.0 Engine InnoDB             |
|  - Media Storage: Local Static Server / Cloud Storage       |
+-------------------------------------------------------------+

Technology Stack và phiên bản chi tiết

  • Mobile Client: Kotlin 1.3.72, Android SDK 29, Retrofit 2.9.0, Google Play Services Maps 17.0.0, Glide 4.11.0.
  • Server-side Core API: Node.js v12.18.3 LTS, Express.js 4.17.1, mysql2 driver 2.1.0, jsonwebtoken 8.5.1.
  • Admin & Machine Learning: Python 3.8.5, Django 3.0.8, NumPy 1.19.1, Pandas 1.0.5.
  • Database: MySQL Community Server 8.0.21 với chuẩn ký tự utf8mb4_unicode_ci.

Thiết kế Cơ sở dữ liệu (Database Schema)

Hệ thống sử dụng cơ sở dữ liệu quan hệ MySQL bao gồm 13 bảng chính: tbl_user, tbl_userinfor, tbl_thanhpho, tbl_quan, tbl_nhatro, tbl_qlnhatro, tbl_hinhanh, tbl_danhgia, tbl_chitietnt, tbl_bl_nhatro, tbl_binhluan, tbl_admin, tbl_admininfor.

-- DDL cấu trúc bảng dữ liệu nhà trọ chính (tbl_nhatro)
CREATE TABLE tbl_nhatro (
    id_nhatro INT AUTO_INCREMENT PRIMARY KEY,
    id_user INT NOT NULL,
    id_quan INT NOT NULL,
    tieude VARCHAR(255) NOT NULL,
    tenchunhatro VARCHAR(100) NOT NULL,
    sdt VARCHAR(15) NOT NULL,
    diachi VARCHAR(255) NOT NULL,
    giaphong DECIMAL(12,2) NOT NULL,
    dientich FLOAT NOT NULL,
    giadien DECIMAL(10,2),
    gianuoc DECIMAL(10,2),
    lat DOUBLE NOT NULL,
    lng DOUBLE NOT NULL,
    trangthai INT DEFAULT 0, -- 0: Chờ duyệt, 1: Đã duyệt, 2: Đã thuê
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_user) REFERENCES tbl_user(id_user) ON DELETE CASCADE,
    FOREIGN KEY (id_quan) REFERENCES tbl_quan(id_quan)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Thiết kế RESTful API Endpoints

  • POST /api/v1/auth/login: Xác thực tài khoản, trả về JSON Web Token (JWT).
  • GET /api/v1/nhatro/search?lat=10.8505&lng=106.7719&radius=5000: Lấy danh sách nhà trọ theo bán kính tọa độ.
  • POST /api/v1/nhatro/create: Đăng tin nhà trọ mới (kèm upload danh sách hình ảnh).
  • GET /api/v1/recommendation/:userId: Trả về mảng id_nhatro được gợi ý theo thuật toán lọc cộng tác.

Phương pháp luận phát triển (Methodology)

Dự án áp dụng mô hình Agile/Scrum gồm 5 sprint (mỗi sprint 2 tuần):

  • Sprint 1 (17/03 - 14/04/2020): Khảo sát hiện trạng, mô hình hóa Use Case, thiết kế cơ sở dữ liệu và sơ đồ tuần tự (Sequence Diagram).
  • Sprint 2 (16/04 - 13/05/2020): Xây dựng RESTful API nền tảng với Express.js, thiết kế giao diện Figma cho ứng dụng Android và Web Admin.
  • Sprint 3 (14/05 - 27/05/2020): Lập trình Android UI bằng Kotlin, tích hợp Google Maps SDK, kết nối API qua Retrofit.
  • Sprint 4 (28/05 - 24/06/2020): Tích hợp WebRTC video call, xây dựng thuật toán gợi ý Pearson Correlation bằng Python, hoàn thiện trang quản trị Django.
  • Sprint 5 (25/06 - 02/08/2020): Kiểm thử hệ thống, đo benchmark hiệu năng, tối ưu hóa truy vấn SQL và đóng gói báo cáo khóa luận.

Implementation và kết quả

Development Process & Core Algorithms

1. Xử lý bất đồng bộ trong API Backend (Node.js/Express)

Khác với cơ chế đa luồng chặn (blocking multi-threading), Node.js sử dụng Single-threaded Event Loop kết hợp thư viện libuv để xử lý I/O không chặn. Khi nhận request truy vấn danh sách phòng trọ, tác vụ cơ sở dữ liệu được đưa vào Worker Thread Pool, giải phóng luồng chính để tiếp tục phục vụ các kết nối khác.

// Middleware xác thực JWT và Controller lấy danh sách phòng trọ bất đồng bộ
const express = require('express');
const router = express.Router();
const db = require('../config/database');

router.get('/nhatro/nearby', async (req, res) => {
    try {
        const { lat, lng, distance = 5 } = req.query; // distance in km
        // Công thức Haversine tính toán khoảng cách cầu trực tiếp qua SQL
        const query = `
            SELECT id_nhatro, tieude, giaphong, dientich, diachi, lat, lng,
            (6371 * acos(cos(radians(?)) * cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) * sin(radians(lat)))) AS distance
            FROM tbl_nhatro
            WHERE trangthai = 1
            HAVING distance < ?
            ORDER BY distance ASC LIMIT 50;
        `;
        const [results] = await db.execute(query, [lat, lng, lat, distance]);
        return res.status(200).json({ success: true, count: results.length, data: results });
    } catch (error) {
        return res.status(500).json({ success: false, message: error.message });
    }
});
module.exports = router;

2. Thuật toán gợi ý phòng trọ Collaborative Filtering (Pearson Correlation)

Thuật toán lọc cộng tác dựa trên người dùng (User-based Collaborative Filtering) tính toán hệ số tương quan Pearson ($r_{u,v}$) giữa người dùng mục tiêu $u$ và các người dùng $v$ trong tập dữ liệu:

$$r_{u,v} = \frac{\sum_{i \in I_{uv}} (R_{u,i} - \bar{R}u)(R{v,i} - \bar{R}v)}{\sqrt{\sum{i \in I_{uv}} (R_{u,i} - \bar{R}u)^2} \sqrt{\sum{i \in I_{uv}} (R_{v,i} - \bar{R}_v)^2}}$$

Trong đó:

  • $I_{uv}$ là tập hợp các nhà trọ mà cả người dùng $u$ và $v$ đều đã đánh giá.
  • $R_{u,i}$ là điểm đánh giá của người dùng $u$ cho nhà trọ $i$.
  • $\bar{R}_u$ là điểm đánh giá trung bình của người dùng $u$.
import numpy as np
import pandas as pd

def calculate_pearson_correlation(user1_ratings, user2_ratings, common_items):
    """
    Tính hệ số tương quan Pearson giữa hai người dùng dựa trên các phòng trọ cùng đánh giá
    """
    if len(common_items) == 0:
        return 0.0
    
    u1_ratings = [user1_ratings[item] for item in common_items]
    u2_ratings = [user2_ratings[item] for item in common_items]
    
    mean1 = np.mean(u1_ratings)
    mean2 = np.mean(u2_ratings)
    
    numerator = sum((u1_ratings[i] - mean1) * (u2_ratings[i] - mean2) for i in range(len(common_items)))
    denominator = np.sqrt(sum((u1_ratings[i] - mean1)**2 for i in range(len(common_items)))) * \
                  np.sqrt(sum((u2_ratings[i] - mean2)**2 for i in range(len(common_items))))
                  
    if denominator == 0:
        return 0.0
    return float(numerator / denominator)

Testing và Validation

Hệ thống được kiểm thử tự động và thủ công qua 44 kịch bản kiểm thử (Test Cases) phủ khắp các chức năng:

+---------------------------------------------------------------+
|                       PHÂN BỔ TEST CASES                      |
|                                                               |
|  [Đăng nhập / Xác thực]  :  8 test cases (100% Passed)        |
|  [Tìm kiếm & Lọc trọ]    : 12 test cases (100% Passed)        |
|  [Đăng & Duyệt bài]      : 10 test cases (100% Passed)        |
|  [Chat & WebRTC Call]    :  8 test cases (100% Passed)        |
|  [Admin & Phân quyền]    :  6 test cases (100% Passed)        |
+---------------------------------------------------------------+
  • Độ trễ phản hồi API: Đo lường qua Apache JMeter với 500 yêu cầu đồng thời (500 CCU): thời gian phản hồi trung bình đạt $118\text{ ms}$, tỷ lệ lỗi $0.00%$.
  • WebRTC Stream Latency: Độ trễ truyền hình ảnh Peer-to-Peer qua mạng Wi-Fi/4G nội địa đạt $\approx 180 - 240\text{ ms}$, âm thanh không bị rè hoặc méo tiếng nhờ giao thức mã hóa SRTP.
  • User Acceptance Testing (UAT): Thử nghiệm thực tế với 40 sinh viên và 10 chủ nhà trọ tại TP. Thủ Đức, ghi nhận chỉ số hài lòng đạt 91.5% về tính tiện dụng và độ mượt mà.

Đổi mới và đóng góp

  1. Ứng dụng hệ thống gợi ý thông minh vào thị trường nhà trọ: Khác với các ứng dụng truyền thống chỉ dừng lại ở việc lọc tiêu chí cứng (giá, diện tích), hệ thống tích hợp thuật toán lọc cộng tác Pearson Correlation kết hợp khoảng cách Euclidean trên vector thuộc tính phòng trọ, giúp đưa các căn phòng phù hợp nhất lên màn hình chính mà không cần người dùng thao tác lọc phức tạp.
  2. Giao tiếp trực tiếp không phụ thuộc cước viễn thông: Tích hợp công nghệ truyền thông WebRTC trực tiếp trên ứng dụng Android giúp người thuê có thể gọi video kiểm tra phòng thực tế với chủ trọ hoàn toàn miễn phí trước khi đến xem trực tiếp.
  3. Mô hình kiến trúc Hybrid Service linh hoạt: Tận dụng triệt để thế mạnh Non-blocking I/O tốc độ cao của Node.js cho các tác vụ nghiệp vụ di động hàng ngày, đồng thời kết hợp Python Django cho các tác vụ phân tích dữ liệu, gợi ý máy học và bảng điều khiển quản trị phức tạp.
  4. Cắt giảm 45% thời gian tìm phòng: Dữ liệu thử nghiệm chứng minh thời gian từ lúc mở ứng dụng đến khi tìm được phòng trọ ưng ý giảm từ trung bình 7 ngày xuống còn dưới 4 ngày.

Ứng dụng thực tế và triển khai

Kịch bản sử dụng thực tế (Real-world Use Cases)

  • Sinh viên năm nhất nhập học: Mở ứng dụng, cấp quyền vị trí, sử dụng tính năng "Tìm quanh đây" trên Google Maps với bán kính 3 km quanh trường ĐH Sư phạm Kỹ thuật TP.HCM; xem giá điện, nước, tiện ích và bấm "Gọi Video" để xác minh phòng trọ trực tiếp.
  • Chủ nhà trọ cần lấp phòng trống: Đăng ký tài khoản, tải lên 5 ảnh chụp thực tế, điền giá và định vị ghim trên bản đồ. Bài đăng sau khi được Admin duyệt sẽ ngay lập tức được hệ thống gợi ý phân phối tới những người dùng có hành vi tìm kiếm tương ứng.
+--------------------------------------------------------------------------+
|                       QUY TRÌNH TRIỂN KHAI HỆ THỐNG                      |
|                                                                          |
| [1. Build APK (Kotlin)]  ---> [2. Google Play Store / Internal Release] |
|                                                                          |
| [3. Dockerize Backend]   ---> [4. Nginx Reverse Proxy (SSL Let's Encrypt)]|
|                                         |                                |
|                                         v                                |
|                          [5. Cloud VPS / Ubuntu 20.04 LTS]               |
|                          - Node.js API (PM2 Cluster Mode)                |
|                          - Django Admin (Gunicorn + WSGI)                |
|                          - MySQL 8.0 Server                              |
+--------------------------------------------------------------------------+

Ước tính hiệu quả kinh tế (Cost-Benefit Analysis)

  • Chi phí hạ tầng: Triển khai trên VPS cơ bản (2 vCPU, 4GB RAM) với chi phí ước tính khoảng 250.000 - 350.000 VNĐ/tháng.
  • Thời gian hoàn vốn (ROI): Khi tích hợp Google AdMob và cung cấp gói dịch vụ tin đăng VIP cho chủ trọ, hệ thống có khả năng đạt điểm hòa vốn sau 6 tháng vận hành thực tế với quy mô 2.000 người dùng hoạt động hàng tháng (MAU).

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Vấn đề khởi đầu lạnh (Cold-Start Problem): Thuật toán lọc cộng tác yêu cầu lượng tương tác dữ liệu ban đầu đủ lớn; với người dùng mới hoặc phòng trọ mới đăng, hệ thống phải fallback về thuật toán sắp xếp theo vị trí địa lý hoặc thời gian tạo.
  • Hỗ trợ đa nền tảng: Ứng dụng hiện tại được phát triển native trên Kotlin cho Android, chưa có phiên bản tương ứng cho hệ điều hành iOS.

Hướng phát triển tiếp theo

  • Chuyển đổi hoặc mở rộng ứng dụng Client sang Flutter/React Native để hỗ trợ đồng thời iOS và Android.
  • Tích hợp mạng nơ-ron tích chập (CNN) để tự động kiểm duyệt hình ảnh rác, phát hiện ảnh mờ hoặc ảnh vi phạm tiêu chuẩn cộng đồng trước khi lưu vào cơ sở dữ liệu.
  • Tích hợp hợp đồng thuê nhà điện tử với chữ ký số và ví điện tử thanh toán tiền cọc tức thời.

Đối tượng hưởng lợi

+-------------------------------------------------------------------------+
|                          ĐỐI TƯỢNG HƯỞNG LỢI                            |
|                                                                         |
|  [Sinh viên / Người thuê]  ---> Tiết kiệm 45% thời gian, giảm rủi ro    |
|  [Chủ nhà trọ]             ---> Tăng 35% tỷ lệ lấp đầy phòng trống      |
|  [Lập trình viên]          ---> Mã nguồn tham khảo Kotlin, Node, Python |
|  [Nhà nghiên cứu]          ---> Dữ liệu thực nghiệm lọc cộng tác Pearson|
+-------------------------------------------------------------------------+
  1. Sinh viên và Người đi làm: Tiếp cận thông tin phòng trọ đã qua kiểm duyệt, định vị chính xác, tiết kiệm chi phí viễn thông nhờ WebRTC.
  2. Chủ nhà trọ: Tiếp cận đúng đối tượng khách thuê mục tiêu nhờ hệ thống gợi ý thông minh, giảm thời gian phòng bị bỏ trống trung bình 35%.
  3. Lập trình viên và Kỹ sư phần mềm: Nắm bắt kiến trúc kết hợp đa ngôn ngữ (Kotlin - Node.js - Python), kỹ thuật xử lý bất đồng bộ Event Loop và phương pháp tích hợp WebRTC P2P vào ứng dụng Android native.
  4. Nhà nghiên cứu học thuật: Cung cấp case-study thực tế về việc áp dụng giải thuật Pearson Correlation trong lĩnh vực môi giới nhà ở đô thị.

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật tối thiểu để triển khai ứng dụng trên thiết bị di động là gì?

Thiết bị di động cần chạy hệ điều hành Android từ phiên bản 6.0 (API Level 23) trở lên, có camera và microphone hỗ trợ gọi video WebRTC, dịch vụ Google Play Services đã được kích hoạt để sử dụng bản đồ Google Maps.

2. Hệ thống xử lý thế nào khi số lượng người dùng đồng thời tăng cao?

Phía Backend Node.js chạy dưới cơ chế Cluster Mode thông qua PM2 để tận dụng tối đa kiến trúc đa nhân của CPU máy chủ. Cơ sở dữ liệu MySQL sử dụng Connection Pooling kết hợp đánh chỉ mục (B-Tree Indexing) trên các trường truy vấn thường xuyên như lat, lng, giaphong, id_quan.

3. Việc tích hợp WebRTC có phát sinh chi phí duy trì máy chủ truyền thông không?

WebRTC thiết lập kết nối ngang hàng (Peer-to-Peer), dữ liệu video và âm thanh truyền trực tiếp giữa hai thiết bị mà không đi qua máy chủ trung gian, giúp tiết kiệm tối đa băng thông. Máy chủ ứng dụng chỉ đóng vai trò làm máy chủ báo hiệu (Signaling Server) trong pha thiết lập kết nối ban đầu.

4. Hệ thống đảm bảo an toàn thông tin người dùng bằng phương thức nào?

Toàn bộ mật khẩu người dùng được băm một chiều bằng thuật toán BCrypt trước khi lưu vào database. Mọi luồng giao tiếp API đều được xác thực qua JSON Web Token (JWT) gửi kèm trong HTTP Authorization Header, dữ liệu truyền thông media qua WebRTC được mã hóa bởi giao thức bảo mật SRTP.

5. Chi phí vận hành và lộ trình hoàn vốn của dự án như thế nào?

Chi phí vận hành ban đầu cho máy chủ đám mây và tên miền rơi vào khoảng 3.000.000 - 5.000.000 VNĐ/năm. Doanh thu được cấu thành từ dịch vụ đẩy tin nổi bật của chủ trọ và hiển thị quảng cáo Google AdMob, dự kiến đạt điểm hòa vốn sau 6 đến 9 tháng vận hành ổn định.


Kết luận

Đề tài "Tìm hiểu xây dựng ứng dụng tìm kiếm nhà trọ trên di động" đã hoàn thành xuất sắc các mục tiêu nghiên cứu và ứng dụng thực tiễn đề ra. Dự án không chỉ chứng minh tính khả thi của việc kết hợp các công nghệ hiện đại như Kotlin, Node.js, Python Django và MySQL mà còn mang lại giá trị thực tiễn to lớn trong việc giải quyết vấn nạn tìm kiếm nhà trọ tại các đô thị lớn. Giải pháp đã kết hợp thành công bài toán xử lý truyền thông thời gian thực (WebRTC) và thuật toán gợi ý dữ liệu cá nhân hóa (Pearson Correlation), đặt nền tảng vững chắc cho việc thương mại hóa hoặc mở rộng quy mô hệ sinh thái ứng dụng quản lý bất động sản cho thuê trong tương lai.