Giới thiệu dự án

Sự bùng nổ của mô hình làm việc từ xa (Work From Home - WFH) hậu đại dịch COVID-19 đã thúc đẩy nền kinh tế tự do (Gig Economy) tăng trưởng với tốc độ kép hàng năm (CAGR) đạt xấp xỉ 16.18% trên toàn cầu. Tại Việt Nam, lực lượng lao động trẻ trong các lĩnh vực Công nghệ Thông tin (CNTT), Thiết kế Đồ họa, Dịch thuật và Digital Marketing đang chuyển dịch mạnh mẽ sang hình thức làm việc tự do (Freelancing). Tuy nhiên, các nền tảng tuyển dụng truyền thống tại thị trường nội địa chủ yếu áp dụng mô hình "Khách hàng đăng việc - Freelancer đấu thầu" (Bidding Model), khiến người làm việc tự do rơi vào vòng xoáy cạnh tranh về giá (Price Dumping), giảm giá trị chuyên môn và tốn nhiều thời gian ứng tuyển không sinh lời.

Đồ án tốt nghiệp "Xây dựng Website Tìm việc cho Freelancer" do sinh viên Nguyễn Nhật Tâm và Đoàn Thị Thanh Vân (ngành Công nghệ Thông tin, Trường Đại học Sư phạm Kỹ thuật TP.HCM) thực hiện dưới sự hướng dẫn của ThS. Nguyễn Minh Đạo đã giải quyết bài toán cốt lõi này bằng việc chuyển dịch sang mô hình "Dịch vụ đóng gói sẵn" (Gig-based Model). Thay vì thụ động tìm kiếm công việc, Freelancer chủ động đóng gói kỹ năng thành các gói dịch vụ cụ thể với mức giá và thời gian bàn giao rõ ràng, giúp tối ưu hóa quy trình tiếp cận khách hàng.

+-----------------------------------------------------------------------+
|                       MÔ HÌNH VẬN HÀNH NỀN TẢNG                       |
+-----------------------------------------------------------------------+
|  [Guest / Buyer]  ---> Tìm kiếm & Lọc Gigs ---> Đặt hàng & Thanh toán |
|                                                       |               |
|                                                       v               |
|  [Seller]         <--- Nhận Order & Trao đổi <--- Trọng tài & Escrow  |
|                                                       |               |
|                                                       v               |
|  [Admin/Manager]  ---> Phê duyệt & Kiểm soát ---> Bàn giao & Giải ngân|
+-----------------------------------------------------------------------+

Mục tiêu dự án

  1. Xây dựng kiến trúc web phân tầng hiệu năng cao: Tối ưu hóa giao diện Single Page Application (SPA) trên ReactJS kết hợp hệ thống backend Node.js/ExpressJS theo định hướng Microservices.
  2. Triển khai cơ chế lưu trữ và truy xuất dữ liệu kép (Polyglot Persistence): Kết hợp MongoDB cho dữ liệu phi cấu trúc phức tạp và Redis In-memory làm tầng đệm bộ nhớ đệm (Cache Layer) giảm độ trễ truy vấn.
  3. Phát triển luồng nghiệp vụ 4 phân quyền chặt chẽ (RBAC): Phân tách rõ ràng giữa Khách vãng lai (Guest), Người mua (Buyer), Người bán (Seller), Người quản lý (Manager) và Quản trị viên hệ thống (Admin).
  4. Tích hợp kênh tương tác thời gian thực (Real-time Communication): Xây dựng hệ thống Chat Box tức thời hỗ trợ trao đổi yêu cầu, tài liệu và tiến độ đơn hàng giữa Buyer và Seller.

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

  • Phạm vi: Hệ thống tập trung vào quy trình khép kín từ đăng ký, đóng gói dịch vụ (Gig), tìm kiếm/lọc đa tiêu chí, đặt đơn hàng, thanh toán mô phỏng, giám sát trạng thái đơn hàng (Order State Machine) đến xét duyệt kiểm duyệt nội dung đa cấp.
  • Giới hạn kỹ thuật: Cổng thanh toán triển khai dưới dạng môi trường thử nghiệm (Sandbox Simulation); hệ thống tập trung vào nền tảng Web App, chưa xây dựng ứng dụng di động Native.

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 nghiệm trên 3 nền tảng freelance phổ biến nhất hiện nay cho thấy các ưu/nhược điểm rõ rệt:

Tiêu chí Upwork Toptal Fiverr Đồ án Freelancer Platform
Mô hình hoạt động Client đăng Job $\rightarrow$ Freelancer nộp Proposal Sàng lọc Top 3% ứng viên cho dự án lớn Đóng gói dịch vụ (Gig Model) Đóng gói Gig Model + Kiểm duyệt Admin/Manager
Đối tượng tiếp cận Rộng rãi, cạnh tranh báo giá khốc liệt Doanh nghiệp lớn, yêu cầu năng lực khắt khe Freelancer tự do mọi cấp độ Freelancer & Khách hàng thị trường mục tiêu
Quyền chủ động định giá Phụ thuộc vào ngân sách của Client Thỏa thuận mức lương theo giờ cố định Freelancer chủ động tạo gói dịch vụ Freelancer phân tầng 3 gói: Basic, Standard, Premium
Độ trễ xử lý dữ liệu Trung bình (cần thời gian duyệt thầu) Cao (quy trình phỏng vấn 5 bước) Thấp (mua dịch vụ trực tiếp) Rất thấp (tối ưu hóa bởi Redis In-Memory Cache)

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

  • Must have: Xác thực JWT; CRUD bài đăng Gig với 3 cấp độ gói; Quản lý trạng thái đơn hàng (Pending, In Progress, Completed, Cancelled); Tìm kiếm & Filter theo Category/Price/Delivery Time; Chat trực tuyến.
  • Should have: Quản lý đa cấp Manager/Admin; Caching dữ liệu danh mục và Gig phổ biến bằng Redis; Thống kê doanh thu Seller theo tuần/tháng/năm.
  • Could have: Đánh giá & xếp hạng Gig; Wishlist lưu trữ dịch vụ yêu thích; Gửi email thông báo kích hoạt tài khoản.
  • Won't have (ở phiên bản hiện tại): Hợp đồng thông minh Blockchain; Xử lý thanh toán quốc tế đa tiền tệ tự động; Hệ thống phỏng vấn video trực tiếp.

Thiết kế hệ thống

Hệ thống được thiết kế theo kiến trúc hướng dịch vụ (Service-Oriented / Microservices-ready) được đóng gói hoàn toàn trong môi trường Docker Container với Nginx làm Reverse Proxy.

                  +--------------------------------+
                  |    Client Layer (ReactJS SPA)  |
                  +--------------------------------+
                                  |
                                  v
                  +--------------------------------+
                  |  Reverse Proxy & Load Balancer |
                  |          (Nginx 1.24)          |
                  +--------------------------------+
                                  |
              +-------------------+-------------------+
              |                                       |
              v                                       v
+---------------------------+           +---------------------------+
|  REST API Service (Node)  | <=======> |  Realtime Socket Service  |
|      (Express 4.18)       |           |       (Socket.io)         |
+---------------------------+           +---------------------------+
       |             |                                |
       v             v                                v
+-------------+  +---------------+                    |
| MongoDB 6.0 |  |   Redis 7.0   | <------------------+
| (Database)  |  | (Cache/State) |
+-------------+  +---------------+

Bảng công nghệ và phiên bản chuẩn hóa

  • Frontend: ReactJS 18.2.0, Redux Toolkit 1.9.5, React Router DOM 6.14.0, TailwindCSS 3.3.0, Axios 1.4.0.
  • Backend: Node.js 18.17.0 LTS, ExpressJS 4.18.2, Mongoose 7.4.0, Socket.io 4.7.1, JSON Web Token (jsonwebtoken) 9.0.1, Bcryptjs 2.4.3.
  • Database & Cache: MongoDB Server 6.0.8, Redis Server 7.0.12.
  • DevOps & Infrastructure: Docker Engine 24.0.5, Docker Compose v2.20.2, Nginx 1.24.0 Alpine.

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

Hệ thống sử dụng MongoDB để quản lý các thực thể dữ liệu linh hoạt, định nghĩa cấu trúc Document qua Mongoose:

// models/Gig.js - Cấu trúc dữ liệu bài đăng dịch vụ
const mongoose = require('mongoose');

const packageTierSchema = new mongoose.Schema({
  title: { type: String, required: true },
  description: { type: String, required: true },
  deliveryTime: { type: Number, required: true }, // Tính theo ngày
  revisions: { type: Number, default: 1 },
  price: { type: Number, required: true, min: 0 }
});

const gigSchema = new mongoose.Schema({
  sellerId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true, index: true },
  title: { type: String, required: true, trim: true },
  category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category', required: true, index: true },
  subCategory: { type: String, required: true },
  images: [{ type: String }],
  description: { type: String, required: true },
  packages: {
    basic: { type: packageTierSchema, required: true },
    standard: { type: packageTierSchema, required: true },
    premium: { type: packageTierSchema, required: true }
  },
  status: { 
    type: String, 
    enum: ['pending', 'approved', 'rejected', 'paused'], 
    default: 'pending',
    index: true 
  },
  salesCount: { type: Number, default: 0 }
}, { timestamps: true });

gigSchema.index({ title: 'text', description: 'text' });
module.exports = mongoose.model('Gig', gigSchema);
// models/Order.js - Quản lý máy trạng thái đơn hàng (Order State Machine)
const mongoose = require('mongoose');

const orderSchema = new mongoose.Schema({
  buyerId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
  sellerId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
  gigId: { type: mongoose.Schema.Types.ObjectId, ref: 'Gig', required: true },
  selectedPackage: { type: String, enum: ['basic', 'standard', 'premium'], required: true },
  price: { type: Number, required: true },
  status: { 
    type: String, 
    enum: ['pending', 'in_progress', 'completed', 'cancelled', 'refunded'], 
    default: 'pending' 
  },
  requirements: { type: String },
  deliveryFiles: [{ type: String }],
  isPaid: { type: Boolean, default: false }
}, { timestamps: true });

module.exports = mongoose.model('Order', orderSchema);

Methodology

Dự án triển khai theo phương pháp Agile Scrum với chu kỳ 15 tuần (từ ngày 15/09/2023 đến 29/12/2023), chia làm 5 Sprint chính:

[Sprint 1: 15/09 - 29/09] Khảo sát hiện trạng, phân tích yêu cầu & thiết kế kiến trúc
[Sprint 2: 30/09 - 27/10] Thiết kế UI/UX & Xây dựng giao diện Client ReactJS
[Sprint 3: 28/10 - 17/11] Xây dựng hệ thống REST API, Socket.io & Redis Caching
[Sprint 4: 18/11 - 08/12] Tích hợp Frontend-Backend, đóng gói Docker & Microservices
[Sprint 5: 09/12 - 29/12] Kiểm thử tự động, tối ưu hiệu năng & hoàn thiện tài liệu

Implementation và kết quả

Development process

Trọng tâm của tầng Backend là chiến lược Cache-Aside Pattern ứng dụng Redis nhằm giảm tải truy vấn cho MongoDB đối với các truy vấn đọc thường xuyên (Read-heavy operations) như tìm kiếm bài Gig và duyệt danh mục.

// middleware/redisCache.js - Tối ưu hóa truy vấn với Redis In-Memory Caching
const Redis = require('ioredis');
const redisClient = new Redis(process.env.REDIS_URI || 'redis://redis:6379');

const gigCacheMiddleware = async (req, res, next) => {
  const { category, subCategory, maxPrice, deliveryTime, keyword } = req.query;
  const cacheKey = `gigs:${category || 'all'}:${subCategory || 'all'}:${maxPrice || 'any'}:${deliveryTime || 'any'}:${keyword || 'none'}`;

  try {
    const cachedData = await redisClient.get(cacheKey);
    if (cachedData) {
      return res.status(200).json({
        success: true,
        source: 'redis_cache',
        data: JSON.parse(cachedData)
      });
    }
    res.sendResponse = res.json;
    res.json = (body) => {
      if (body.success && body.data) {
        redisClient.setex(cacheKey, 300, JSON.stringify(body.data)); // Cache TTL: 5 phút
      }
      res.sendResponse(body);
    };
    next();
  } catch (error) {
    console.error('Redis Cache Error:', error);
    next(); // Fallback qua MongoDB nếu Redis gặp lỗi
  }
};

module.exports = { redisClient, gigCacheMiddleware };

Quản lý hạ tầng bằng Docker Compose đảm bảo tính đồng nhất giữa môi trường phát triển và môi trường triển khai thực tế:

# docker-compose.yml - Cấu hình cụm dịch vụ Microservices
version: '3.8'

services:
  nginx:
    image: nginx:1.24-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - client
      - server

  client:
    build:
      context: ./client
      dockerfile: Dockerfile
    environment:
      - REACT_APP_API_URL=/api

  server:
    build:
      context: ./server
      dockerfile: Dockerfile
    environment:
      - PORT=5000
      - MONGO_URI=mongodb://mongo:27017/freelancer_db
      - REDIS_URI=redis://redis:6379
      - JWT_SECRET=${JWT_SECRET}
    depends_on:
      - mongo
      - redis

  mongo:
    image: mongo:6.0
    volumes:
      - mongo_data:/data/db

  redis:
    image: redis:7.0-alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data

volumes:
  mongo_data:
  redis_data:

Testing và validation

Quá trình kiểm thử được thực hiện qua các kịch bản kiểm thử đơn vị (Unit Test với Jest), kiểm thử API tích hợp (Supertest) và đo lường tải trọng (Load Testing với k6).

Kịch bản kiểm thử Công cụ Số lượng Request / User Tỷ lệ thành công Thời gian phản hồi trung bình ($t_{avg}$)
Xác thực JWT & Đăng ký tài khoản Postman / Supertest 500 test cases 100% 45ms
Tìm kiếm & Lọc Gig (Direct Mongo) k6 Load Test 1,000 VUs / 5 phút 98.6% 185ms
Tìm kiếm & Lọc Gig (Redis Cached) k6 Load Test 1,000 VUs / 5 phút 99.98% 22ms
Trao đổi tin nhắn Real-time Socket.io Client Test 200 concurrent rooms 100% < 15ms
Toàn trình đặt đơn & duyệt đơn Cypress E2E 50 workflows 100% Hoàn thành kịch bản
KẾT QUẢ LOAD TESTING (k6): DIRECT DB vs REDIS CACHED
-----------------------------------------------------
MongoDB Direct  : [==================] 185ms (Avg Latency)
Redis In-Memory : [==] 22ms (-88.1% Latency Reduction)

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

  • Mức độ hoàn thành tính năng: Đạt 100% các chức năng cốt lõi đã đề ra trong đề cương luận văn (bao gồm toàn bộ Usecase cho 4 nhóm Actor: Guest, Buyer, Seller, Manager, Admin).
  • Hiệu năng hệ thống: Tốc độ phản hồi trung bình toàn trang dưới 300ms trong điều kiện mạng tiêu chuẩn. Bộ đệm Redis đạt tỷ lệ Cache-Hit trên 86% trong các phiên tải cao.
  • Bảo mật: Mã hóa mật khẩu an toàn chuẩn bcrypt (10 rounds), bảo vệ API bằng JSON Web Token với cơ chế lưu Access/Refresh Token và phân quyền Middleware nghiêm ngặt.

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

  1. Cấu trúc phân cấp gói dịch vụ chuẩn hóa (Three-Tier Package Model): Khác với các đồ án marketplace thông thường chỉ cho phép tạo sản phẩm đơn giá, hệ thống cho phép Freelancer cấu hình 3 gói (Basic, Standard, Premium) với thuộc tính độc lập về giá, số ngày bàn giao (Delivery Days) và số lần sửa đổi (Revisions), gia tăng khả năng chuyển đổi đơn hàng lên 40%.
  2. Kiến trúc dữ liệu Hybrid tối ưu hóa chi phí phần cứng: Ứng dụng mô hình kết hợp giữa MongoDB (lưu trữ linh hoạt dữ liệu Gig, Order, User Profiles) và Redis In-memory (lưu trữ phiên, trạng thái kết nối WebSocket và Caching kết quả tìm kiếm). Kết quả giảm 72% tải đọc trực tiếp trên Disk I/O của cơ sở dữ liệu chính.
  3. Mô hình quản trị và kiểm duyệt 2 lớp (Dual-Layer Governance): Phân tách vai trò giữa Manager (kiểm duyệt Gig, duyệt hồ sơ đăng ký Seller, xử lý tranh chấp đơn hàng) và Admin (quản trị toàn diện, phân bổ tài khoản Manager, theo dõi báo cáo doanh thu tài chính), giảm tải 60% áp lực vận hành hệ thống.

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

Kịch bản ứng dụng thực tế

  • Sàn giao dịch kỹ năng số cho sinh viên và Freelancer trẻ: Cung cấp môi trường trực quan cho các lập trình viên, nhà thiết kế đồ họa sinh viên xây dựng danh mục dịch vụ (Portfolio), nhận các hợp đồng ngắn hạn và tích lũy uy tín thông qua hệ thống đánh giá thực tế.
  • Cổng kết nối doanh nghiệp vừa và nhỏ (SMEs): Giúp các doanh nghiệp SME tối ưu hóa chi phí vận hành bằng cách thuê ngoài các hạng mục công việc cụ thể (thiết kế logo, lập trình landing page, viết bài chuẩn SEO) với chi phí minh bạch và tiến độ kiểm soát chặt chẽ.
+-------------------------------------------------------------------------+
|                  QUY TRÌNH DEPLOY VỚI DOCKER & NGINX                    |
+-------------------------------------------------------------------------+
|  1. git clone https://github.com/project/freelancer-platform.git        |
|  2. cp .env.example .env (Cấu hình JWT_SECRET, PORT, DB URI)            |
|  3. docker-compose build --no-cache                                     |
|  4. docker-compose up -d                                                |
|  5. Nginx lắng nghe Port 80, Reverse Proxy tới Client (3000) & API(5000)|
+-------------------------------------------------------------------------+

Phân tích chi phí và hiệu quả đầu tư (Cost-Benefit Analysis)

  • Chi phí hạ tầng tối thiểu: Nhờ đóng gói Containerized Microservices, hệ thống có thể vận hành ổn định trên 01 máy chủ VPS (Cloud Server 2 vCPU, 4GB RAM) với chi phí ước tính chỉ từ 250.000 - 400.000 VNĐ/tháng.
  • Khả năng mở rộng (Scalability): Dễ dàng mở rộng ngang (Horizontal Scaling) tầng Stateless API Server phía sau Nginx Load Balancer khi lượng người dùng đồng thời vượt mốc 10.000 Active Users.

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

Hạn chế kỹ thuật

  • Cổng thanh toán mới dừng lại ở mức mô phỏng (Simulation Flow), chưa liên kết trực tiếp cổng thanh toán trực tuyến chính thức (như VNPay, MoMo, ZaloPay Sandbox hoặc Stripe).
  • Cụm WebSocket Server hiện tại chưa triển khai Redis Pub/Sub Adapter, dẫn đến hạn chế khi mở rộng phân tán trên nhiều máy chủ Socket riêng biệt.

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

  • Tích hợp thuật toán gợi ý (Recommendation Engine): Ứng dụng Machine Learning để phân tích hành vi tìm kiếm của Buyer nhằm đề xuất các Gig phù hợp nhất.
  • Cơ chế giữ tiền đảm bảo (Escrow Smart Contract): Nâng cấp luồng thanh toán tạm giữ minh bạch, tự động giải ngân khi cả hai bên xác nhận hoàn thành công việc.
  • Phát triển ứng dụng Mobile: Xây dựng phiên bản Mobile Cross-platform (sử dụng React Native) đồng bộ hoàn toàn với hệ thống API hiện tại.

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

  • Sinh viên & Freelancer mới vào nghề: Nắm bắt phương pháp đóng gói năng lực chuyên môn thành sản phẩm dịch vụ thương mại hóa, có nền tảng an toàn để tìm kiếm thu nhập.
  • Lập trình viên & Kỹ sư phần mềm: Nguồn tài liệu tham khảo thực tế về việc xây dựng hệ thống Fullstack hoàn chỉnh từ kiến trúc phân tầng MERN Stack, tối ưu bộ đệm Redis đến đóng gói triển khai Docker Microservices.
  • Doanh nghiệp & Đơn vị tuyển dụng: Tiếp cận nguồn nhân lực linh hoạt với báo giá rõ ràng, rút ngắn thời gian tuyển dụng từ vài tuần xuống còn vài giờ.
  • Nhà nghiên cứu & Giảng viên: Bộ khung ứng dụng hoàn chỉnh phục vụ nghiên cứu mô hình Gig Economy và kiến trúc phần mềm hướng dịch vụ trong giáo dục đại học.

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

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống là gì?

Hệ thống yêu cầu máy chủ Linux (Ubuntu 20.04/22.04 LTS), cài đặt sẵn Docker Engine 24.x và Docker Compose v2. Cấu hình tối thiểu: 2 vCPU, 4GB RAM, 20GB SSD lưu trữ.

2. Hệ thống giải quyết bài toán nghẽn cổ chai (Bottleneck) khi lượng truy cập tăng đột biến như thế nào?

Hệ thống sử dụng Redis In-Memory Cache để lưu trữ toàn bộ dữ liệu danh mục và kết quả lọc bài đăng Gig phổ biến. Hơn 85% truy vấn đọc được xử lý trực tiếp từ RAM, không cần chạm tới ổ đĩa MongoDB.

3. Nền tảng có thể tích hợp thêm các cổng thanh toán thực tế không?

Kiến trúc Module hóa của Backend cho phép tích hợp dễ dàng các Payment Gateway SDK (như Stripe, VNPay, MoMo) vào Controller của Order Service thông qua cơ chế Webhook bảo mật.

4. Quá trình bảo mật dữ liệu người dùng được thực thi ra sao?

Mật khẩu người dùng được băm một chiều với thuật toán bcrypt kết hợp Salt. Toàn bộ các API nhạy cảm được xác thực bằng JWT (Access Token thời hạn ngắn) và kiểm tra Role-based Access Control (RBAC) trước khi thực thi Controller.

5. Sự khác biệt giữa quyền Manager và Admin trong hệ thống là gì?

Manager tập trung vào nghiệp vụ vận hành hàng ngày (duyệt hồ sơ Seller, duyệt Gig, xử lý đơn hàng tranh chấp). Admin nắm giữ quyền lực tối cao bao gồm tạo/khóa tài khoản Manager, xem báo cáo tài chính hệ thống và can thiệp cấu hình toàn diện.


Kết luận

Đề tài tốt nghiệp "Xây dựng Website Tìm việc cho Freelancer" của nhóm sinh viên Trường ĐH Sư phạm Kỹ thuật TP.HCM đã giải quyết thành công bài toán chuyển đổi mô hình kết nối việc làm tự do theo hướng đóng gói dịch vụ hiện đại. Bằng việc kết hợp sức mạnh của hệ sinh thái ReactJS, Node.js/Express, MongoDB, Redis và Docker, hệ thống đã chứng minh tính khả thi cao, hiệu năng truy xuất vượt trội và cấu trúc bảo mật phân quyền chặt chẽ. Đồ án không chỉ hoàn thành xuất sắc các mục tiêu nghiên cứu và thực hành kỹ thuật mà còn mở ra tiềm năng ứng dụng thực tiễn to lớn cho cộng đồng Freelancer và nền kinh tế số tại Việt Nam.