Giới thiệu dự án

Nhu cầu trao đổi, mua bán lại các vật phẩm học tập và sinh hoạt đã qua sử dụng (như giáo trình, máy tính bỏ túi, linh kiện điện tử thí nghiệm, thiết bị gia dụng) trong cộng đồng sinh viên các trường đại học tại Việt Nam là rất lớn. Tại Trường Đại học Bách Khoa – ĐHQG TP.HCM (HCMUT), các kênh mạng xã hội như hội nhóm Facebook thường xuyên tiếp nhận hàng trăm tin đăng mỗi ngày. Tuy nhiên, phương thức này bộc lộ nhiều điểm nghẽn nghiêm trọng:

  • Hiện tượng trôi bài (Post Drowning): Thuật toán hiển thị của mạng xã hội khiến các bài đăng nhanh chóng bị đẩy lùi, làm tăng thời gian tìm kiếm của người mua lên 60–70%.
  • Thiếu cơ chế xác thực uy tín: Môi trường trao đổi mở không có hệ thống đánh giá (rating/feedback) chuẩn mực, dẫn đến rủi ro lừa đảo hoặc sản phẩm thực tế sai lệch so với mô tả.
  • Giới hạn kiểm duyệt từ nền tảng thứ ba: Chính sách giới hạn số lượng bài đăng (ví dụ: giới hạn 20 bài/ngày trên một số nhóm Facebook) dẫn đến việc bài đăng hợp lệ bị hệ thống tự động khóa hoặc gắn nhãn spam.

Trước bối cảnh đó, dự án BKPass được nghiên cứu và phát triển bởi nhóm sinh viên Khoa Khoa học & Kỹ thuật Máy tính (Trường Đại học Bách Khoa – ĐHQG TP.HCM), dưới sự hướng dẫn của ThS. Mai Đức Trung. Hệ thống đóng vai trò là một nền tảng thương mại điện tử C2C (Consumer-to-Consumer) nội bộ, chuyên biệt hóa cho việc kết nối và tối ưu hóa vòng đời trao đổi vật phẩm trong môi trường đại học.

flowchart LR
    A["Sinh viên Bách Khoa (HCMUT)"] --> B["Giao diện Web BKPass (ReactJS SPA)"]
    B --> C["RESTful API Gateway (NodeJS/ExpressJS)"]
    C --> D[("Cơ sở dữ liệu MongoDB")]
    C --> E["Hệ thống Docker Container"]

Mục tiêu dự án

  1. Xây dựng nền tảng trao đổi C2C chuyên biệt: Phát triển cổng thông tin mua bán tập trung, cho phép sinh viên đăng bán, tìm kiếm, đánh dấu và quản lý đơn hàng.
  2. Minh bạch hóa uy tín người bán: Thiết lập module đánh giá chất lượng (1–5 sao kèm nhận xét định tính) gắn liền với hồ sơ người dùng.
  3. Tối ưu hóa hiệu năng và khả năng truy xuất: Đảm bảo thời gian phản hồi giao dịch dưới 1.500 ms và khả năng phục vụ tải lên đến 1.000 giao dịch/giờ.
  4. Tiêu chuẩn hóa quy trình triển khai: Đóng gói toàn bộ hệ thống bằng Docker container nhằm đồng nhất môi trường phát triển và môi trường vận hành thực tế.

Phạm vi và Giới hạn

  • Phạm vi: Người dùng là sinh viên và cán bộ trực thuộc khối Đại học Quốc gia TP.HCM có nhu cầu trao đổi vật phẩm trực tiếp.
  • Giới hạn kỹ thuật: Hệ thống phiên bản đầu tập trung vào luồng tương tác C2C trực tiếp (trao đổi trực tiếp, thỏa thuận nhận hàng tại cơ sở 1 hoặc cơ sở 2), chưa tích hợp cổng thanh toán trực tuyến (Escrow Payment Gateway) bên thứ ba.

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 trao đổi vật phẩm hiện hành giúp làm rõ vị thế công nghệ của BKPass:

Tiêu chí Nhóm mạng xã hội (Facebook Group) Sàn TMĐT tổng hợp (Chợ Tốt, Shopee) Nền tảng BKPass (Đề xuất)
Đối tượng mục tiêu Phân tán, khó kiểm soát định danh Đại chúng toàn quốc Sinh viên Bách Khoa / ĐHQG TP.HCM
Cơ chế tìm kiếm Kém (chỉ tìm text sơ sài, dễ trôi bài) Tốt (lọc theo danh mục, vị trí địa lý) Tối ưu chuyên sâu theo Tên và Tag môn học
Độ tin cậy người bán Không có hệ thống chấm điểm tích hợp Đánh giá chung, tỷ lệ giả mạo cao Đánh giá định danh nội bộ, chấm điểm sao
Chi phí vận hành Miễn phí nhưng giới hạn thuật toán Thu phí người bán / phí dịch vụ Tối ưu chi phí hạ tầng qua Container Docker
Tính riêng tư dữ liệu Phụ thuộc chính sách bên thứ ba Dữ liệu chia sẻ cho mục đích thương mại Kiểm soát hoàn toàn trong hệ thống máy chủ

Dựa trên yêu cầu từ người dùng, các tính năng được phân loại theo mô hình MoSCoW:

  • Must have: Đăng ký/Đăng nhập xác thực, Đăng tải/Sửa/Xóa sản phẩm, Tìm kiếm theo Tag/Tên, Chấm điểm và Bình luận người bán, Lịch sử mua/bán.
  • Should have: Bộ lọc người bán, Đánh dấu sản phẩm quan tâm (Tracking/Wishlist), Phân trang danh mục 10 items/trang.
  • Could have: Đề xuất sản phẩm liên quan theo danh mục.
  • Won't have (giai đoạn này): Cổng thanh toán trực tuyến tự động, Chat thời gian thực qua WebSocket.

Thiết kế hệ thống

Hệ thống BKPass áp dụng mô hình kiến trúc MVC (Model-View-Controller) kết hợp giải pháp Client-Side Rendering (CSR):

  • Client Tier (View): Xây dựng dưới dạng Single Page Application (SPA) sử dụng ReactJS và TailwindCSS. Trình duyệt tải gói bundle ban đầu và render động toàn bộ giao diện dựa trên dữ liệu JSON trả về từ máy chủ.
  • Server Tier (Controller): Sử dụng NodeJS kết hợp ExpressJS framework để hiện thực hóa các dịch vụ RESTful API. Controller chịu trách nhiệm xử lý logic nghiệp vụ, điều hướng luồng dữ liệu và kiểm soát bảo mật.
  • Data Tier (Model): Sử dụng MongoDB – hệ quản trị cơ sở dữ liệu phi quan hệ (NoSQL Document Store), lưu trữ dữ liệu dưới định dạng JSON/BSON linh hoạt, tối ưu hóa tốc độ đọc/ghi cho dữ liệu phi cấu trúc.
classDiagram
    class User {
        +String userId
        +String fullName
        +String email
        +String phone
        +String studentId
        +String passwordHash
        +String avatar
        +register()
        +login()
        +viewProfile()
    }

    class Item {
        +String itemId
        +String title
        +String description
        +Double price
        +String category
        +List~String~ tags
        +String status
        +String sellerId
        +List~String~ images
        +createItem()
        +updateItem()
        +deleteItem()
        +toggleStatus()
    }

    class Review {
        +String reviewId
        +String reviewerId
        +String sellerId
        +Integer stars
        +String comment
        +DateTime createdAt
        +addReview()
        +deleteReview()
    }

    class TrackingOrder {
        +String trackingId
        +String userId
        +String itemId
        +DateTime markedDate
        +addBookmark()
        +removeBookmark()
    }

    User "1" -- "0..*" Item : posts
    User "1" -- "0..*" Review : creates
    User "1" -- "0..*" Review : receives
    User "1" -- "0..*" TrackingOrder : bookmarks
    Item "1" -- "0..*" TrackingOrder : tracked_in

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

Phương thức Endpoint Chức năng Phân quyền
POST /api/v1/auth/register Đăng ký tài khoản người dùng Public
POST /api/v1/auth/login Xác thực đăng nhập và cấp phiên làm việc Public
GET /api/v1/items?search=&tag=&page=1 Lấy danh sách sản phẩm phân trang (10/trang) Public
POST /api/v1/items Đăng bán sản phẩm mới kèm hình ảnh User đã đăng nhập
PUT /api/v1/items/:id Cập nhật thông tin/trạng thái sản phẩm Chủ sở hữu
DELETE /api/v1/items/:id Gỡ bỏ bài đăng sản phẩm Chủ sở hữu
POST /api/v1/users/:id/reviews Gửi đánh giá và chấm điểm sao cho người bán User đã đăng nhập
GET /api/v1/orders/history?type=sell Truy xuất lịch sử danh sách đơn bán/mua User đã đăng nhập

Methodology

Dự án áp dụng mô hình Agile/Scrum điều chỉnh với quy trình chia thành các giai đoạn rõ ràng:

  1. Phân tích yêu cầu & Thiết kế UI/UX (Tuần 1–2): Xây dựng Use-case Scenario, Wireframes, Screen Flow và Mockup trên Figma.
  2. Xây dựng Data Layer & Core Backend (Tuần 3–4): Thiết kế Schemas trên MongoDB, cấu trúc API Controllers và Middleware.
  3. Phát triển Frontend & Tích hợp (Tuần 5–6): Hiện thực hóa UI Components với ReactJS/TailwindCSS, kết nối REST APIs.
  4. Containerization & Deployment (Tuần 7–8): Đóng gói Docker, kiểm thử tích hợp (Integration Test) và cấu hình Web Hosting.

Implementation và kết quả

Development process

Cấu trúc mã nguồn của BKPass được tổ chức theo chuẩn module hóa, phân tách rạch ròi giữa các lớp nghiệp vụ. Hệ thống áp dụng mã hóa mật khẩu thông qua giải thuật hàm băm SHA-256 kèm cơ chế giới hạn tần suất truy cập nhằm ngăn chặn tấn công Brute-force (khóa tạm thời 5 phút nếu nhập sai mật khẩu 5 lần trong vòng 30 giây).

1. Hiện thực logic Controller quản lý sản phẩm (itemController.js)

const Item = require('../models/Item');

// Tìm kiếm sản phẩm theo Tên hoặc Tag kết hợp phân trang
exports.getItems = async (req, res) => {
    try {
        const { keyword, tag, page = 1, limit = 10 } = req.query;
        let query = { status: "ACTIVE" };

        if (keyword) {
            query.title = { $regex: keyword, $options: "i" };
        }
        if (tag) {
            query.tags = { $in: [new RegExp(tag, "i")] };
        }

        const skip = (page - 1) * limit;
        const totalItems = await Item.countDocuments(query);
        const items = await Item.find(query)
                                .sort({ createdAt: -1 })
                                .skip(skip)
                                .limit(parseInt(limit));

        return res.status(200).json({
            success: true,
            total: totalItems,
            currentPage: parseInt(page),
            totalPages: Math.ceil(totalItems / limit),
            data: items
        });
    } catch (error) {
        return res.status(500).json({ success: false, message: error.message });
    }
};

2. Xử lý bảo mật xác thực (authMiddleware.js)

const crypto = require('crypto');

// Hàm băm bảo mật SHA-256 kết hợp Salt cho thông tin mật khẩu
function hashPassword(password, salt) {
    return crypto.createHmac('sha256', salt).update(password).digest('hex');
}

// Logic kiểm soát rate limiting khi đăng nhập thất bại
const loginAttemptsCache = new Map();

function checkLoginBruteForce(clientIp) {
    const record = loginAttemptsCache.get(clientIp);
    if (!record) return { allowed: true };

    const now = Date.now();
    if (record.attempts >= 5 && (now - record.lastAttempt) < 30000) {
        if ((now - record.lockedAt) < 300000) { // 5 phút khóa
            return { allowed: false, remainingTime: Math.ceil((300000 - (now - record.lockedAt)) / 1000) };
        }
    }
    return { allowed: true };
}

3. Cấu hình Containerization (docker-compose.yml)

version: '3.8'

services:
  bkpass-db:
    image: mongo:5.0
    container_name: bkpass_mongodb
    restart: always
    environment:
      MONGO_INITDB_DATABASE: bkpass_db
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db

  bkpass-backend:
    build: ./backend
    container_name: bkpass_api
    restart: always
    environment:
      PORT: 5000
      MONGODB_URI: mongodb://bkpass-db:27017/bkpass_db
    ports:
      - "5000:5000"
    depends_on:
      - bkpass-db

  bkpass-frontend:
    build: ./frontend
    container_name: bkpass_client
    restart: always
    ports:
      - "80:80"
    depends_on:
      - bkpass-backend

volumes:
  mongo_data:

Testing và validation

Hệ thống đã trải qua các bài kiểm thử hiệu năng và tính năng nghiêm ngặt:

  • Kiểm thử phi chức năng (Non-functional Validation):
    • Hiệu năng phản hồi (Latency): Thời gian chuyển trang giữa các React Routers đạt từ 1–2 giây. Hơn 85% giao dịch hoàn tất dưới ngưỡng 1.500 ms (đáp ứng mục tiêu chuẩn > 80%).
    • Khả năng chịu tải (Throughput): Thử nghiệm tải giả lập 1.000 giao dịch/giờ ghi nhận tỷ lệ thành công 94,8%, vượt mục tiêu cam kết 90%.
    • Độ tương thích (Usability & Responsiveness): Giao diện đáp ứng mượt mà từ màn hình thiết bị di động (375px) đến màn hình máy tính 4K, hỗ trợ tốt trên các trình duyệt từ Chrome 43+ trở lên.
[Throughput Test] 1,000 requests/hour -> Success Rate: 94.8% (Target: >90%)
[Latency Benchmark] 85.6% transactions <= 1,420 ms (Target: <= 1,500 ms)
[Navigation Speed] Router transitions: 1.1s - 1.6s (Target: <= 2.0s)

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

Dự án đã hoàn thành 100% các mục tiêu chức năng đặt ra trong đề cương:

  1. Module Xác thực & Quản lý người dùng: Đăng ký, đăng nhập an toàn, tra cứu hồ sơ người bán công khai.
  2. Module Thao tác sản phẩm: Đăng tin đầy đủ (ảnh, danh mục, tình trạng hàng cũ/mới, giá VND, địa chỉ nhận), xem trước (Demo modal), cập nhật trạng thái (Đang bán / Đã bán), xóa tin đăng.
  3. Module Tìm kiếm & Lọc: Truy xuất tức thời theo từ khóa tên hoặc bộ thẻ (tags) với hệ thống phân trang 10 sản phẩm/lần nạp.
  4. Module Đánh giá & Phản hồi: Cho phép người mua chấm điểm 1–5 sao và viết bình luận chi tiết về người bán.
  5. Module Lịch sử giao dịch: Theo dõi các sản phẩm đã đánh dấu (Tracking Wishlist), lịch sử đơn hàng đã bán và đơn hàng đã mua.

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

  1. Chuẩn hóa quy trình trao đổi đồ cũ nội bộ: Thay thế các bài viết rời rạc trên mạng xã hội bằng một nền tảng chuyên dụng có cơ sở dữ liệu có cấu trúc, giúp phân loại vật phẩm theo đúng nhu cầu học tập đặc thù (giáo trình theo mã môn học, dụng cụ thực hành thí nghiệm).
  2. Giải quyết triệt để bài toán trôi tin: Cung cấp cơ chế tìm kiếm đa kênh (Full-text search & Tag-based indexing) kết hợp phân trang linh hoạt, giảm thiểu thời gian tìm sản phẩm xuống dưới 30 giây cho một lượt thao tác.
  3. Thiết lập chuẩn mực uy tín sinh viên: Thay vì tin tưởng mù quáng vào các tài khoản ẩn danh trên mạng xã hội, hệ thống định danh gắn liền đánh giá minh bạch giúp loại bỏ rủi ro gian lận, nâng cao tính trung thực trong cộng đồng.

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

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

  • Kịch bản 1 (Tân sinh viên tìm mua giáo trình): Sinh viên năm nhất tìm kiếm tài liệu môn học "Giải tích 1". Hệ thống lọc ra 5 sinh viên khóa trên đang rao bán trong phạm vi khuôn viên cơ sở Dĩ An hoặc cơ sở Lý Thường Kiệt, kèm điểm đánh giá 4.8/5 sao từ các người mua trước.
  • Kịch bản 2 (Sinh viên chuẩn bị tốt nghiệp thanh lý đồ dùng): Sinh viên đăng tải danh mục gồm máy tính kỹ thuật, bảng vẽ mạch điện tử và tủ lạnh mini. Thông qua bảng điều khiển "Mặt hàng của tôi", người bán có thể theo dõi số lượng người đã đánh dấu (tracking) và nhanh chóng chuyển trạng thái "Đã bán" chỉ với một cú nhấp chuột.

Hướng dẫn triển khai hệ thống (Deployment Guide)

Hệ thống có thể được thiết lập nhanh chóng thông qua Docker Engine trên môi trường máy chủ Linux (Ubuntu Server 20.04/22.04 LTS):

# 1. Clone mã nguồn từ GitHub Repository
git clone https://github.com/hcmut-cse/bkpass-project.git
cd bkpass-project

# 2. Cấu hình các biến môi trường
cp .env.example .env

# 3. Khởi chạy toàn bộ hệ thống bằng Docker Compose
docker-compose up -d --build

# 4. Kiểm tra trạng thái vận hành của các containers
docker-compose ps

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

Hạn chế kỹ thuật

  • Phương thức thanh toán: Giao dịch hiện tại phụ thuộc vào việc gặp mặt trực tiếp và thanh toán tiền mặt/chuyển khoản ngoài hệ thống.
  • Tích hợp xác thực trường học: Tài khoản đăng ký thủ công, chưa kết nối trực tiếp với hệ thống SSO (Single Sign-On / Central Authentication Service) của Trường Đại học Bách Khoa (HCMUT MyBK).

Hướng phát triển trong tương lai

  • Tích hợp SSO CAS Bách Khoa: Đồng bộ tài khoản sinh viên qua email trường @hcmut.edu.vn để tự động xác minh tư cách sinh viên đang theo học.
  • Tích hợp Real-time Chat: Xây dựng module trò chuyện trực tiếp giữa người mua và người bán sử dụng Socket.io và WebRTC.
  • Tích hợp Ví điện tử / Cổng thanh toán tạm giữ (Escrow): Liên kết ví MoMo/VNPAY giữ tiền thanh toán tạm thời cho đến khi người mua xác nhận đã nhận đúng sản phẩm.

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

  • Sinh viên HCMUT & ĐHQG-HCM: Tiếp cận kho giáo trình, trang thiết bị học tập với chi phí tiết kiệm 40–70% so với mua mới; an tâm về độ tin cậy của giao dịch.
  • Lập trình viên & Sinh viên ngành CNTT: Tài liệu tham khảo hoàn chỉnh về cách hiện thực hóa kiến trúc MVC, Client-Side Rendering với ReactJS, xây dựng REST API bằng ExpressJS, thiết kế NoSQL với MongoDB và đóng gói Docker.
  • Nhà trường & Cộng đồng: Thúc đẩy văn hóa tái sử dụng đồ dùng, giảm thiểu rác thải sinh hoạt, xây dựng môi trường học đường số hóa văn minh và tương trợ lẫn nhau.

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

1. Yêu cầu phần cứng và phần mềm tối thiểu để triển khai BKPass là gì?

Máy chủ cần cài đặt Linux (Ubuntu/Debian), tối thiểu 2 vCPU, 2 GB RAM, 20 GB ổ cứng SSD, có cài sẵn Docker Engine (v20.10+) và Docker Compose (v2.0+). Phía người dùng chỉ cần trình duyệt web hiện đại (Chrome, Edge, Firefox, Safari) trên điện thoại hoặc máy tính.

2. Hệ thống xử lý thế nào khi lượng truy cập tăng đột biến vào đầu học kỳ?

Nhờ kiến trúc module hóa đóng gói trong Docker container, quản trị viên có thể dễ dàng scale-out (mở rộng theo chiều ngang) bằng cách nhân bản container backend kết hợp cân bằng tải Nginx (Reverse Proxy Load Balancer) để phân phối tải đều cho MongoDB Replica Sets.

3. Tại sao hệ thống chọn MongoDB thay vì cơ sở dữ liệu quan hệ (RDBMS như MySQL/PostgreSQL)?

Dữ liệu sản phẩm trao đổi đồ cũ có tính biến động cao về thuộc tính (hình ảnh, danh sách tags môn học, các mô tả chi tiết linh hoạt). MongoDB cho phép lưu trữ dưới dạng JSON document trực quan, giúp tăng tốc độ truy vấn find/insert và đơn giản hóa việc ánh xạ dữ liệu trực tiếp lên React Frontend mà không cần xử lý các phép JOIN phức tạp.

4. Hệ thống đảm bảo an toàn thông tin mật khẩu của người dùng như thế nào?

Mật khẩu người dùng không bao giờ được lưu dưới dạng văn bản thuần (plain text). Hệ thống sử dụng giải thuật băm một chiều SHA-256 kết hợp mã Salt bảo mật. Đồng thời, cơ chế rate-limiting sẽ khóa tài khoản trong 5 phút nếu phát hiện hành vi cố ý dò mật khẩu quá 5 lần trong 30 giây.

5. Dự án có thể mở rộng cho các trường đại học khác trong khu vực không?

Hoàn toàn khả thi. Do mã nguồn được thiết kế theo kiến trúc phi tập trung, chỉ cần cấu hình lại danh mục mã khoa, viện và phân vùng địa lý theo từng khuôn viên đại học là có thể triển khai phiên bản đa trường (Multi-tenant) một cách nhanh chóng.


Kết luận

Đồ án tổng hợp "Thiết kế ứng dụng trao đổi vật phẩm – BKPass" của nhóm sinh viên Khoa Khoa học & Kỹ thuật Máy tính (Trường Đại học Bách Khoa – ĐHQG TP.HCM) đã giải quyết trọn vẹn bài toán nhức nhối trong việc trao đổi, mua bán đồ dùng học tập của sinh viên. Bằng việc ứng dụng mô hình kiến trúc MVC Client-Side Rendering, kết hợp các công nghệ hiện đại (ReactJS, TailwindCSS, NodeJS, ExpressJS, MongoDB) và chuẩn hóa triển khai với Docker, dự án không chỉ đạt chuẩn cao về mặt kỹ thuật phần mềm mà còn mang lại giá trị thực tiễn to lớn cho cộng đồng sinh viên. Đây là nền tảng vững chắc để tiếp tục phát triển thành hệ sinh thái dịch vụ tiện ích số toàn diện trong các khu đô thị đại học.