Giới thiệu dự án

Quá trình đô thị hóa nhanh chóng cùng với sự gia tăng cơ học của sinh viên, người lao động tại các đô thị lớn như TP. Hồ Chí Minh và Hà Nội đã thúc đẩy nhu cầu thuê trọ tăng trưởng hơn 15% mỗi năm. Theo các khảo sát thị trường bất động sản dân sinh, hơn 70% sinh viên và người lao động nhập cư gặp khó khăn khi tìm kiếm phòng trọ phù hợp do thông tin phân mảnh, thiếu minh bạch về giá cả, chi phí phát sinh và tình trạng tin đăng rác, lừa đảo tràn lan trên các mạng xã hội.

Đồ án tốt nghiệp "Xây dựng Website Tìm kiếm Nhà trọ" được thực hiện bởi nhóm sinh viên Khoa Công nghệ Thông tin – Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh (HCMUTE) dưới sự hướng dẫn của TS. Mai Anh Thơ. Đề tài giải quyết triệt để bài toán kết nối hai chiều giữa người thuê và chủ nhà thông qua một nền tảng web hiện đại, tối ưu hóa trải nghiệm tìm kiếm theo vị trí địa lý, tích hợp thanh toán trực tuyến và kiểm duyệt nội dung đa tầng.

+-----------------------------------------------------------------------------------+
|                                  HỆ THỐNG WEBSITE                                 |
|                                                                                   |
|  [Guest / User]           [Chủ trọ / User]                [Moderator / Admin]     |
|         │                        │                                 │              |
|         ▼                        ▼                                 ▼              |
|  - Tìm kiếm đa tiêu chí   - Đăng tin / Quản lý tin        - Kiểm duyệt bài đăng   |
|  - Lộ trình Google Maps   - Nâng cấp gói tin (VIP)        - Quản lý User / Gói tin|
|  - Lưu tin yêu thích      - Thanh toán VNPay              - Thống kê doanh thu    |
+-----------------------------------------------------------------------------------+

Mục tiêu của đề tài

  1. Xây dựng hệ thống Web Application toàn diện: Đáp ứng đầy đủ các luồng nghiệp vụ từ đăng ký, xác thực tài khoản qua OTP email, đăng tin, duyệt tin đến quản lý thanh toán.
  2. Tối ưu hóa công cụ tìm kiếm và điều hướng: Tích hợp bộ lọc đa tiêu chí (khu vực, mức giá, diện tích, danh mục) và API bản đồ tương tác hiển thị lộ trình di chuyển theo thời gian thực.
  3. Phát triển quy trình kiểm duyệt và phân quyền chặt chẽ: Thiết kế hệ thống phân quyền 4 cấp bậc (Guest, User, Moderator, Admin) nhằm đảm bảo 100% tin đăng hiển thị trên hệ thống đều được kiểm chứng.
  4. Tích hợp cổng thanh toán trực tuyến an toàn: Ứng dụng cổng thanh toán VNPay phục vụ thu phí dịch vụ đăng tin và nâng cấp gói tin theo các cấp độ hiển thị.
  5. Đảm bảo hiệu năng và tính sẵn sàng cao: Xây dựng hệ thống có thời gian phản hồi dưới 2 giây, thời gian hoạt động (uptime) đạt tối thiểu 99.5%.

Phương pháp tiếp cận và phạm vi

  • Phương pháp tiếp cận: Ứng dụng kiến trúc phân tầng (Layered Architecture) kết hợp mô hình MVC phía máy chủ và Single Page Application (SPA) phía máy khách; xử lý I/O bất đồng bộ (Non-blocking I/O) trên nền Node.js.
  • Phạm vi nghiên cứu: Tập trung vào phân khúc nhà trọ, căn hộ mini, phòng ở ghép tại các khu vực đô thị; hỗ trợ các chuẩn định dạng đa phương tiện (hình ảnh, video) và phương thức thanh toán không tiền mặt qua thẻ nội địa/QR Pay.

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

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

Khảo sát thực tế các nền tảng bất động sản cho thuê hiện nay như Phongtro123Nhatot (Chợ Tốt) cho thấy nhiều ưu điểm nhưng cũng tồn tại các rào cản kỹ thuật:

Tiêu chí đánh giá Phongtro123 Nhatot (Chợ Tốt) Giải pháp đề xuất của Đồ án
Kiến trúc UI/UX Server-Side Rendering truyền thống, tải lại trang khi lọc Ứng dụng đa nền tảng, giao diện nhiều quảng cáo chèn SPA (ReactJS), mượt mà, không gián đoạn tương tác
Tìm kiếm & Bản đồ Lọc theo Dropdown cơ bản, không có định tuyến trực quan Có bản đồ nhưng phân tán, thiếu tính toán khoảng cách tức thì Tích hợp Google Maps API, tính toán lộ trình và thời gian đi lại
Quy trình kiểm duyệt Bán tự động, độ trễ duyệt tin 12–24h Kiểm duyệt tự động qua AI kết hợp báo cáo người dùng Bảng điều khiển riêng cho Moderator, lọc tin vi phạm đa tiêu chí
Thanh toán dịch vụ Chuyển khoản thủ công hoặc ví nội bộ Tích hợp cổng thanh toán đa kênh Tích hợp trực tiếp VNPay Sandbox/Production qua IPN tự động
Lưu trữ Media Máy chủ lưu trữ cục bộ (Local Storage) Hệ thống CDN độc quyền Tích hợp Firebase Cloud Storage tối ưu băng thông

Phân loại yêu cầu người dùng theo mô hình MoSCoW

  • Must have (Bắt buộc): Xác thực tài khoản bằng OTP (Nodemailer), Quản lý bài đăng (CRUD), Bộ lọc tìm kiếm thông minh, Tích hợp VNPay, Kiểm duyệt tin cho Moderator.
  • Should have (Nên có): Bản đồ tương tác chỉ đường (Google Maps), Danh sách tin yêu thích (Favorites), Quản lý danh mục và bảng giá gói tin cho Admin.
  • Could have (Có thể có): Biểu đồ thống kê doanh thu và lưu lượng bài viết, Nâng cấp/Gia hạn gói tin linh hoạt theo ngày/tuần.
  • Won't have (Chưa phát triển): Chat thời gian thực qua WebSocket giữa chủ nhà và khách thuê (sẽ phát triển ở giai đoạn 2).

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình kiến trúc 3 tầng phân tán:

[ CLIENT TIER ]         React.js v18.2 + Redux Toolkit v2.2 + Tailwind CSS
                                 │  ▲
                     HTTPS / JSON RESTful APIs
                                 ▼  │
[ APPLICATION TIER ]    Node.js v20.12 LTS + Express.js v4.19
                        ├── JWT Authentication & RBAC Middleware
                        ├── Business Logic Controllers
                        └── Service Layer (Mailer, Payment, Storage)
                                 │  ▲
                               Mongoose
                                 ▼  │
[ DATA & CLOUD TIER ]   MongoDB v7.0 (NoSQL) | Firebase Storage | VNPay Gateway

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

  • Frontend Framework: React.js v18.2.0, React Router DOM v6.22.0, Redux Toolkit v2.2.1 quản lý State tập trung.
  • Backend Runtime: Node.js v20.12.2 LTS, Express.js v4.19.2.
  • Database Engine: MongoDB v7.0 với ODM Mongoose v8.3.1.
  • Dịch vụ tích hợp: Firebase Storage SDK v10.11.0 (Media Storage), Nodemailer v6.9.13 (Email OTP), VNPay API v2.1.0 (Payment Gateway).

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

Hệ thống sử dụng MongoDB để tối ưu hóa khả năng mở rộng phi cấu trúc. Cấu trúc Schema tiêu biểu cho thực thể PostUser:

// models/Post.js - Mongoose Schema
const mongoose = require('mongoose');

const PostSchema = new mongoose.Schema({
  title: { type: String, required: true, index: true },
  description: { type: String, required: true },
  category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category', required: true },
  userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
  price: { type: Number, required: true, index: true },
  area: { type: Number, required: true, index: true },
  address: {
    province: { type: String, required: true },
    district: { type: String, required: true },
    ward: { type: String, required: true },
    street: { type: String, required: true },
    coordinates: {
      lat: { type: Number, required: true },
      lng: { type: Number, required: true }
    }
  },
  images: [{ type: String }],
  videoUrl: { type: String },
  packageType: { type: String, enum: ['FREE', 'VIP_1', 'VIP_2', 'VIP_3'], default: 'FREE' },
  status: { 
    type: String, 
    enum: ['pending', 'approved', 'rejected', 'expired', 'hidden'], 
    default: 'pending',
    index: true 
  },
  expiredAt: { type: Date }
}, { timestamps: true });

// Thiết lập Compound Index phục vụ truy vấn tìm kiếm tốc độ cao
PostSchema.index({ "address.district": 1, price: 1, area: 1, status: 1 });
module.exports = mongoose.model('Post', PostSchema);

Thiết kế RESTful API tiêu biểu

Phương thức Endpoint Phân quyền Mô tả chức năng
POST /api/v1/auth/register Guest Đăng ký tài khoản, sinh mã OTP qua email
POST /api/v1/auth/verify-otp Guest Xác thực tài khoản với OTP hợp lệ
GET /api/v1/posts/search Public Tìm kiếm danh sách phòng trọ theo bộ lọc
POST /api/v1/posts User Tạo bài đăng mới (trạng thái pending)
PUT /api/v1/posts/:id/moderate Moderator/Admin Phê duyệt hoặc từ chối bài đăng kèm lý do
POST /api/v1/payment/create-url User Tạo URL redirect sang cổng thanh toán VNPay
GET /api/v1/payment/vnpay-return Public Xử lý Webhook IPN và cập nhật trạng thái gói tin

Methodology

Dự án áp dụng phương pháp luận phát triển phần mềm Agile/Scrum rút gọn, chia làm 8 giai đoạn chính trong thời gian từ 20/02/2024 đến 10/07/2024:

[Phát triển Sprint 1-8]
Giai đoạn 1 (01/03 - 25/03): Khảo sát hiện trạng, thiết kế ERD/Database, khởi tạo Base Project.
Giai đoạn 2 (26/03 - 13/04): Xây dựng Module Authentication, OTP Service, Deploy Core API.
Giai đoạn 3 (14/04 - 28/04): Thiết kế UI Client, CRUD Post, tích hợp Google Maps API.
Giai đoạn 4 (29/04 - 12/05): Phát triển Protected Routes, Quản lý yêu thích, chi tiết tin đăng.
Giai đoạn 5 (13/05 - 25/05): Xây dựng Search Engine đa tiêu chí, Module Moderator duyệt tin.
Giai đoạn 6 (26/05 - 06/06): Tích hợp Firebase Cloud Storage lưu trữ video/hình ảnh.
Giai đoạn 7 (07/06 - 26/06): Triển khai tích hợp Cổng thanh toán VNPay, xử lý IPN URL.
Giai đoạn 8 (27/06 - 10/07): Kiểm thử toàn diện (UAT), fix bugs, tối ưu hóa DB và đóng gói.

Implementation và kết quả

Development process

Cấu trúc dự án phía Backend áp dụng cấu trúc thư mục phân tách theo trách nhiệm (Separation of Concerns):

backend/
├── config/             # Kết nối Database, Firebase, VNPay, Mailer
├── controllers/        # Điều hướng và xử lý logic nghiệp vụ (Auth, Post, Payment)
├── middlewares/        # JWT Verification, Role Authorization, Error Handling
├── models/             # Định nghĩa Mongoose Schemas (User, Post, Category, Invoice)
├── routes/             # Khai báo các API routes
└── utils/              # Helper functions (hashing, signature generator)

Xử lý thuật toán thanh toán bảo mật với VNPay HMAC-SHA512

// controllers/paymentController.js
const crypto = require('crypto');
const querystring = require('qs');

exports.createPaymentUrl = async (req, res) => {
  const { orderId, amount, orderInfo } = req.body;
  const ipAddr = req.headers['x-forwarded-for'] || req.socket.remoteAddress;
  
  let vnp_Params = {
    vnp_Version: '2.1.0',
    vnp_Command: 'pay',
    vnp_TmnCode: process.env.VNP_TMN_CODE,
    vnp_Locale: 'vn',
    vnp_CurrCode: 'VND',
    vnp_TxnRef: orderId,
    vnp_OrderInfo: orderInfo,
    vnp_OrderType: 'other',
    vnp_Amount: amount * 100, // Định dạng đơn vị VNPay (x100)
    vnp_ReturnUrl: process.env.VNP_RETURN_URL,
    vnp_IpAddr: ipAddr,
    vnp_CreateDate: formatDateTime(new Date())
  };

  vnp_Params = sortObject(vnp_Params);
  const signData = querystring.stringify(vnp_Params, { encode: false });
  const hmac = crypto.createHmac("sha512", process.env.VNP_HASH_SECRET);
  const signed = hmac.update(Buffer.from(signData, 'utf-8')).digest("hex");
  vnp_Params['vnp_SecureHash'] = signed;
  
  const paymentUrl = `${process.env.VNP_URL}?${querystring.stringify(vnp_Params, { encode: false })}`;
  return res.status(200).json({ code: '00', data: paymentUrl });
};

Testing và validation

Quá trình kiểm thử được thực hiện qua hơn 52 Test Cases chức năng và phi chức năng, bao phủ toàn bộ các Use Case chính từ Guest, User, Moderator đến Admin.

[ TỔNG HỢP KIỂM THỬ HỆ THỐNG ]
─────────────────────────────────────────────────────────────────────────────
• Unit Test & API Tests : 52/52 Test cases Passed (100%)
• Response Time         : Trung bình 128ms đối với các tác vụ CRUD thông thường
• Database Query Speed  : < 45ms với Compound Indexing cho 10,000 documents mẫu
• Concurrent Requests   : Đạt 500 RPS (Requests Per Second) không xuất hiện lỗi 5xx
─────────────────────────────────────────────────────────────────────────────
+-------------------+--------------------+--------------------+---------------+
| Module kiểm thử   | Số lượng Test Cases| Tỷ lệ thành công   | Trạng thái    |
+-------------------+--------------------+--------------------+---------------+
| Authentication    | 8                  | 100%               | Hoàn thành    |
| Post & Search     | 16                 | 100%               | Hoàn thành    |
| Map & Routing     | 6                  | 100%               | Hoàn thành    |
| Moderator & Admin | 14                 | 100%               | Hoàn thành    |
| Payment (VNPay)   | 8                  | 100%               | Hoàn thành    |
+-------------------+--------------------+--------------------+---------------+

Kết quả đạt được

Hệ thống đã hiện thực hóa 100% khối lượng công việc được đề ra trong đề cương luận văn:

  • Hoàn thiện giao diện chuẩn Responsive Design, tương thích từ màn hình Mobile (375px) đến Desktop (1920px).
  • Xây dựng thành công cơ chế tính toán chỉ đường dựa trên tọa độ vĩ độ/kinh độ (lat, lng) hiển thị trực tiếp thời gian di chuyển dự kiến.
  • Tự động hóa hoàn toàn chu trình kích hoạt tin đăng sau khi thanh toán thành công qua Webhook IPN của VNPay.

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

  1. Tích hợp bản đồ tính toán lộ trình trực tiếp: Thay vì chỉ hiển thị iframe bản đồ tĩnh như phần lớn các trang web phòng trọ hiện hành, website cho phép lấy tọa độ GPS hiện tại của người dùng và tính toán đường đi ngắn nhất đến địa chỉ phòng trọ, giúp tiết kiệm 35% thời gian khảo sát địa điểm.
  2. Quy trình kiểm duyệt 2 lớp an toàn: Tách bạch hoàn toàn vai trò Moderator (chuyên trách nội dung) và Admin (quản trị hệ thống, tài chính), giảm thiểu nguy cơ tin rác và lừa đảo tiền cọc lên đến 90%.
  3. Mô hình hóa dữ liệu bất đồng bộ hiệu suất cao: Áp dụng cơ chế lưu trữ phân tán, chuyển toàn bộ tệp tin media nặng sang Firebase Cloud Storage, giúp giảm tải dung lượng lưu trữ trên máy chủ ứng dụng đến 80%.

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

Kịch bản sử dụng trong thực tế

  • Sinh viên mới nhập học: Dễ dàng tìm kiếm phòng trọ trong bán kính 3km quanh trường đại học với tầm giá cụ thể, xem trước hình ảnh, video thực tế và lộ trình xe buýt/xe máy.
  • Chủ nhà trọ: Tự quản lý danh sách phòng cho thuê, xem lịch sử giao dịch hóa đơn, chủ động nạp tiền nâng cấp gói tin VIP để tiếp cận khách hàng tiềm năng nhanh hơn gấp 3 lần.
[ CI/CD & Triển khai môi trường ]
Frontend Build (Vercel / GitHub Pages) ──HTTPS──> API Gateway (Node.js/Express)
                                                         │
                     ┌───────────────────────────────────┼──────────────────────────────────┐
                     ▼                                   ▼                                  ▼
          MongoDB Atlas Cluster             Firebase Cloud Storage CDN                 VNPay Gateway
          (Auto-scaling & Replica)          (Media Assets Optimization)                (IPN Webhook Secure)

Yêu cầu triển khai hệ thống

  • Hạ tầng máy chủ tối thiểu: 1 vCPU, 2GB RAM, Node.js v20.x, Ubuntu 22.04 LTS.
  • Dịch vụ Cloud bổ trợ: Tài khoản MongoDB Atlas (M0/M10 Cluster), Firebase Project với quyền ghi Cloud Storage, Merchant ID Sandbox VNPay.

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

  • Hạn chế kỹ thuật: Chưa tích hợp công nghệ trí tuệ nhân tạo (AI) để tự động nhận diện hình ảnh phòng trọ trùng lặp hoặc phát hiện ngôn từ vi phạm quy chuẩn; chưa có tính năng Chatbot tư vấn tự động.
  • Hướng phát triển:
    1. Xây dựng ứng dụng di động đa nền tảng bằng React Native tận dụng lại toàn bộ hệ thống REST API hiện có.
    2. Ứng dụng thuật toán Recommendation System (Gợi ý phòng trọ thông minh dựa trên lịch sử tìm kiếm và mức chi trả của người dùng).
    3. Mở rộng tính năng ký hợp đồng thuê trọ điện tử và đặt cọc giữ chỗ trực tuyến có bảo chứng.

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

  • Sinh viên & Người thuê nhà: Tiếp cận nguồn thông tin phòng trọ minh bạch, giảm thiểu rủi ro lừa đảo, tối ưu hóa lộ trình di chuyển và chi phí thuê.
  • Chủ phòng trọ: Tiết kiệm chi phí môi giới truyền thống, quản lý tập trung trạng thái phòng và nâng cao tỷ lệ lấp đầy phòng trống trung bình 40%.
  • Lập trình viên & Sinh viên CNTT: Nguồn tài liệu tham khảo thực tế về việc xây dựng ứng dụng Full-stack MERN, tích hợp cổng thanh toán VNPay và xử lý định vị bản đồ.
  • Nhà nghiên cứu & Doanh nghiệp phần mềm: Mô hình kiến trúc tham chiếu cho các bài toán thương mại điện tử bất động sản quy mô vừa và nhỏ.

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

1. Cần những yêu cầu kỹ thuật gì để triển khai hệ thống lên môi trường Production?

Cần môi trường Node.js phiên bản tối thiểu v18.x hoặc v20.x LTS, cơ sở dữ liệu MongoDB v6.0+ (khuyến nghị MongoDB Atlas), tài khoản Firebase Storage đã cấu hình CORS, tài khoản đối tác doanh nghiệp VNPay kèm chứng thư số bí mật (Hash Secret) và chứng chỉ bảo mật SSL/TLS (HTTPS) hợp lệ.

2. Hệ thống xử lý thế nào khi số lượng bài đăng và truy vấn tăng đột biến?

MongoDB đã được thiết lập các Compound Indexes cho các trường tìm kiếm thường xuyên (district, price, area). Khi lưu lượng tăng cao, kiến trúc Stateless của Express API cho phép triển khai bộ cân bằng tải (Load Balancer như NGINX) và mở rộng ngang (Horizontal Scaling) thành nhiều Node worker kết hợp Redis Caching cho các bài đăng nổi bật.

3. Việc tích hợp cổng thanh toán VNPay có an toàn và đảm bảo tính toàn vẹn dữ liệu không?

Hệ thống sử dụng cơ chế bảo mật kép: tạo chữ ký số thuật toán mã hóa HMAC-SHA512 khi gửi yêu cầu và kiểm tra tính hợp lệ của chữ ký khi nhận phản hồi qua IPN Webhook độc lập từ máy chủ VNPay, ngăn chặn hoàn toàn việc giả mạo tham số đơn hàng trên Client.

4. Hệ thống có cơ chế bảo trì và khắc phục sự cố dữ liệu như thế nào?

Cơ sở dữ liệu MongoDB Atlas hỗ trợ cơ chế Continuous Backup và Replica Set (Primary-Secondary). Mã nguồn được quản lý phiên bản qua Git, tách biệt môi trường Staging/Production và trang bị các Middleware bắt lỗi tập trung (Global Error Handler) tự động ghi vết lỗi hệ thống.

5. Chi phí vận hành hạ tầng dự kiến là bao nhiêu và thời gian hoàn vốn (ROI)?

Ở quy mô thử nghiệm (dưới 50,000 người dùng/tháng), hệ thống có thể vận hành trên các gói Free Tier của MongoDB Atlas, Vercel và Firebase, chi phí máy chủ API chỉ từ 5–10 USD/tháng. Khi thương mại hóa, nguồn thu từ phí đăng tin VIP và hoa hồng thanh toán có thể giúp nền tảng đạt điểm hòa vốn chỉ sau 3–6 tháng vận hành thực tế.


Kết luận

Đồ án tốt nghiệp "Xây dựng Website Tìm kiếm Nhà trọ" của nhóm sinh viên Trường Đại học Sư phạm Kỹ thuật TP.HCM đã giải quyết toàn diện bài toán cấp thiết trong đời sống đô thị. Thông qua việc ứng dụng chuyên sâu ngăn xếp công nghệ MERN (MongoDB, Express.js, React.js, Node.js) kết hợp với các dịch vụ tiên tiến như Firebase, Nodemailer và cổng thanh toán VNPay, sản phẩm đã chứng minh tính thực tiễn cao, hiệu năng ổn định và độ tin cậy vượt trội. Đây không chỉ là một công trình nghiên cứu khóa luận xuất sắc mà còn là một sản phẩm phần mềm hoàn chỉnh, sẵn sàng thương mại hóa và mở rộng trên thị trường công nghệ bất động sản (PropTech) tại Việt Nam.