Giới thiệu dự án

Thị trường nuôi thú cưng tại khu vực Đông Nam Á, đặc biệt là Việt Nam, đang ghi nhận tốc độ tăng trưởng kép hàng năm (CAGR) đạt mức 11.2% giai đoạn 2022–2028. Kéo theo đó là nhu cầu gia tăng đột biến về việc chia sẻ kiến thức chăm sóc, tìm kiếm dịch vụ thú y và hỗ trợ tìm kiếm thú cưng thất lạc. Tuy nhiên, phần lớn các giải pháp hiện nay hoặc chỉ dừng lại ở các hội nhóm mạng xã hội đa dụng (Facebook Groups, Zalo) với độ nhiễu thông tin cao, hoặc là các website thương mại điện tử đơn thuần, thiếu tính năng tương tác chuyên sâu theo thời gian thực (realtime interaction).

Đứng trước thách thức đó, đồ án tốt nghiệp chuyên ngành Công nghệ Phần mềm tại Trường Đại học Sư phạm Kỹ thuật TP.HCM (HCMUTE) với đề tài "Xây dựng ứng dụng mạng xã hội thú cưng" đã được nghiên cứu và phát triển bởi sinh viên Nguyễn Minh Toàn và Nông Quang Huy, dưới sự hướng dẫn của ThS. Trương Thị Ngọc Phượng.

graph TD
    A[Vấn đề: Thất lạc thú cưng & Thông tin phân mảnh] --> B[Giải pháp: Mạng xã hội chuyên biệt]
    B --> C[Mobile App: React Native & Expo]
    B --> D[Backend: NestJS & PostgreSQL]
    B --> E[Realtime: WebSocket & Expo-Notification]
    C --> F[Cộng đồng gắn kết & Hỗ trợ cứu trợ 24/7]
    D --> F
    E --> F

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

  1. Xây dựng nền tảng mạng xã hội đa nền tảng (Cross-platform Mobile App & Web Admin) dành riêng cho cộng đồng nuôi thú cưng, tối ưu hóa trải nghiệm người dùng trên cả iOS và Android.
  2. Hiện thực hóa hệ thống quản trị dữ liệu thú cưng chuyên sâu (Pet Profile Management): Cho phép theo dõi chi tiết hồ sơ sức khỏe, nhận dạng, màu lông, giống loài và lịch sử tiêm chủng.
  3. Phát triển module nhắn tin và thông báo tức thời (Realtime Chat & Push Notification): Đạt độ trễ truyền tải dữ liệu dưới 150ms thông qua giao thức WebSocket và dịch vụ Expo Notifications.
  4. Tích hợp kênh hỗ trợ tìm kiếm thú cưng thất lạc và nhận nuôi (Pet Rescue & Adoption Hub): Rút ngắn thời gian kết nối giữa chủ nuôi và người cứu hộ.

Phạm vi và giới hạn hệ thống

  • Phạm vi chức năng: Quản lý tài khoản (Authentication/Authorization qua JWT), quản lý hồ sơ cá nhân và hồ sơ thú cưng (My Pet), bảng tin tương tác (Newsfeed, bài viết, bình luận, tương tác yêu thích, video ngắn/reels), hệ thống kết bạn, module chat 1-1, push notifications, và cổng thông tin quản trị Web Admin.
  • Giới hạn kỹ thuật: Hệ thống chưa tích hợp thuật toán Computer Vision để tự động nhận dạng khuôn mặt thú cưng qua hình ảnh và chưa hỗ trợ gọi video trực tiếp qua WebRTC trong phiên bản hiện tại.

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 nền tảng dịch vụ và ứng dụng hiện hữu trên thị trường giúp xác định rõ khoảng trống tính năng (feature gap) mà hệ thống cần lấp đầy:

Tên nền tảng Phân loại Ưu điểm Nhược điểm & Hạn chế
Petfinder Cứu hộ & Nhận nuôi Cơ sở dữ liệu nhận nuôi lớn, bộ lọc vị trí địa lý chuẩn xác Thiếu tính năng tương tác mạng xã hội, dữ liệu không tối ưu cho thị trường Việt Nam
PetMD Cổng thông tin thú y Kiến thức bệnh học và dinh dưỡng chuyên sâu, có diễn đàn hỏi đáp Không có tính năng tạo hồ sơ thú cưng cá nhân và kết nối mạng lưới bạn bè
Petcity / Pet Me E-commerce & Bản đồ dịch vụ Định vị cửa hàng dịch vụ/phòng khám thú y qua GPS Không hỗ trợ chat realtime cộng đồng, thiếu tính năng chia sẻ khoảnh khắc
Hệ thống đề xuất Mạng xã hội chuyên biệt Kết hợp hồ sơ thú cưng, bảng tin tương tác, chat realtime và hỗ trợ cứu trợ Cần hạ tầng máy chủ ổn định để phục vụ kết nối socket liên tục

Yêu cầu người dùng được phân loại theo mô hình MoSCoW:

  • Must-have: Xác thực tài khoản với OTP Email, tạo/sửa hồ sơ Pet, đăng tải bài viết kèm media, chat realtime 1-1, nhận push notification khi có tương tác.
  • Should-have: Quản lý nhóm (Groups), hiển thị video ngắn (Reels), thu hồi tin nhắn, dashboard thống kê báo cáo cho Admin.
  • Could-have: Tích hợp bản đồ dịch vụ thú y lân cận, bộ lọc tìm kiếm nâng cao theo đặc điểm sinh trắc học của thú cưng.
  • Won't-have (giai đoạn này): Thanh toán trực tuyến in-app (In-app purchase) cho các dịch vụ spa/thú y.

Thiết kế hệ thống

Kiến trúc hệ thống tuân theo mô hình Decoupled Client-Server & Modular Architecture:

flowchart LR
    subgraph Client_Layer
        MA[Mobile App: React Native / Expo]
        WA[Web Admin: ReactJS]
    end

    subgraph Gateway_Security
        Nginx[Reverse Proxy / SSL]
        JWT_Guard[Auth & RBAC Guard]
    end

    subgraph Service_Layer[NestJS Core Engine]
        AuthModule[Auth & User Module]
        PetModule[Pet Management Module]
        PostModule[Post & Feed Module]
        ChatGateway[WebSocket Gateway]
    end

    subgraph Data_Layer
        PG[(PostgreSQL Database)]
        ExpoPush[Expo Notification Service]
        SMTP[SMTP Mail Server - OTP]
    end

    MA -->|REST API / HTTPS| Nginx
    WA -->|REST API / HTTPS| Nginx
    MA <-->|WSS / TCP Socket| ChatGateway
    Nginx --> JWT_Guard
    JWT_Guard --> Service_Layer
    Service_Layer --> PG
    ChatGateway --> ExpoPush
    AuthModule --> SMTP

Công nghệ sử dụng và phiên bản

  • Backend: NestJS Framework v10.3.x chạy trên Node.js v20 LTS, TypeScript v5.4.x.
  • Database: PostgreSQL v16.2 (RDBMS với hỗ trợ toàn vẹn quan hệ ACID, Foreign Keys và JSONB columns).
  • Mobile Frontend: React Native v0.74.x kết hợp Expo SDK 51, React Navigation v6.x.
  • Web Frontend (Admin): ReactJS v18.2.x, Ant Design / TailwindCSS.
  • Realtime & Utility: Socket.io v4.7.x, Expo-Notifications v0.28.x, Nodemailer v6.9.x, Bcrypt v5.1.x.

Thiết kế cơ sở dữ liệu quan hệ (PostgreSQL Schema)

Hệ thống bao gồm các bảng chính: users, roles, pets, posts, comments, friends, conversations, messages, notifications, user_interacts, service_pet.

-- Cấu trúc bảng Pet đại diện cho hồ sơ thú cưng
CREATE TABLE pets (
    id SERIAL PRIMARY KEY,
    owner_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    name VARCHAR(100) NOT NULL,
    species VARCHAR(50) NOT NULL,
    breed VARCHAR(100),
    gender VARCHAR(10) CHECK (gender IN ('Male', 'Female', 'Unknown')),
    dob DATE,
    color VARCHAR(50),
    description TEXT,
    avatar_url VARCHAR(255),
    is_lost BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- Cấu trúc bảng Bài viết (Post)
CREATE TABLE posts (
    id SERIAL PRIMARY KEY,
    user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    content TEXT NOT NULL,
    media_urls TEXT[], 
    post_type VARCHAR(20) DEFAULT 'GENERAL' CHECK (post_type IN ('GENERAL', 'LOST_PET', 'ADOPTION', 'REEL')),
    likes_count INT DEFAULT 0,
    comments_count INT DEFAULT 0,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

Thiết kế API Endpoints chính

Method Endpoint Quyền hạn Mô tả chức năng
POST /api/v1/auth/register Public Đăng ký tài khoản người dùng mới
POST /api/v1/auth/login Public Xác thực đăng nhập, trả về Access Token (JWT)
POST /api/v1/auth/verify-otp Public Xác thực mã OTP 4 chữ số gửi qua email
GET /api/v1/pets/my-pets User Lấy danh sách thú cưng của người dùng hiện tại
POST /api/v1/pets User Tạo hồ sơ thú cưng mới kèm ảnh và thông tin chi tiết
GET /api/v1/posts/feed User Lấy danh sách bảng tin trang chủ có phân trang (Pagination)
POST /api/v1/posts User Đăng tải bài viết mới (hỗ trợ đính kèm mảng hình ảnh/video)
POST /api/v1/interactions/like User Thích hoặc hủy thích bài viết
GET /api/v1/admin/analytics Admin Lấy dữ liệu thống kê người dùng, bài viết, lượt tương tác

Methodology

Quy trình phát triển dự án tuân theo mô hình Agile/Scrum kết hợp quy trình phát triển lặp (Iterative Development) với chu kỳ 2 tuần/sprint:

gantt
    title Kế hoạch triển khai dự án (29/02/2024 - 12/07/2024)
    dateFormat  YYYY-MM-DD
    section Khảo sát & Thiết kế
    Khảo sát hiện trạng & thiết kế Use Case     :2024-02-29, 2024-03-03
    Thiết kế ERD & Kiến trúc hệ thống        :2024-03-04, 2024-03-15
    section Nghiên cứu công nghệ
    Nghiên cứu React Native & Expo             :2024-03-16, 2024-04-17
    Nghiên cứu NestJS, TypeScript & PostgreSQL :2024-04-18, 2024-04-28
    section Lập trình & Tích hợp
    Phát triển REST API & WebSocket Gateway    :2024-04-29, 2024-06-05
    Xây dựng Mobile UI & Web Admin UI          :2024-05-15, 2024-06-18
    Tích hợp hệ thống & Kiểm thử end-to-end   :2024-06-18, 2024-07-02
    section Kiểm thử & Hoàn thiện
    Sửa lỗi, tối ưu hiệu năng & Viết báo cáo   :2024-07-04, 2024-07-12

Implementation và kết quả

Development process

Quá trình hiện thực hóa tập trung xử lý hai bài toán kỹ thuật trọng tâm: Xác thực bảo mật đa tầngHệ thống truyền phát thông điệp Realtime qua WebSocket.

Dưới đây là mã nguồn minh họa cho việc triển khai ChatGateway bằng NestJS WebSockets:

import {
  WebSocketGateway,
  SubscribeMessage,
  MessageBody,
  ConnectedSocket,
  WebSocketServer,
  OnGatewayConnection,
  OnGatewayDisconnect,
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { UseGuards } from '@nestjs/common';
import { WsJwtGuard } from '../auth/guards/ws-jwt.guard';
import { ChatService } from './chat.service';
import { SendMessageDto } from './dto/send-message.dto';

@WebSocketGateway({
  cors: { origin: '*' },
  namespace: '/chat',
})
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
  @WebSocketServer()
  server: Server;

  constructor(private readonly chatService: ChatService) {}

  async handleConnection(client: Socket) {
    const userId = client.handshake.query.userId as string;
    if (userId) {
      client.join(`user_${userId}`);
    }
  }

  handleDisconnect(client: Socket) {
    client.leaveAll();
  }

  @UseGuards(WsJwtGuard)
  @SubscribeMessage('sendMessage')
  async handleSendMessage(
    @ConnectedSocket() client: Socket,
    @MessageBody() payload: SendMessageDto,
  ) {
    // 1. Lưu tin nhắn vào PostgreSQL
    const savedMessage = await this.chatService.saveMessage(payload);

    // 2. Phát tin nhắn đến phòng hội thoại của người nhận
    this.server
      .to(`user_${payload.receiverId}`)
      .emit('receiveMessage', savedMessage);

    // 3. Kích hoạt Push Notification qua Expo nếu người nhận offline
    await this.chatService.dispatchPushNotification(payload);

    return { status: 'DELIVERED', messageId: savedMessage.id };
  }
}
// React Native: Xử lý kết nối và nhận thông báo tức thời
import React, { useEffect } from 'react';
import * as Notifications from 'expo-notifications';
import io from 'socket.io-client';

export const useRealtimeChat = (userId: number) => {
  useEffect(() => {
    const socket = io('https://api.petsocial.internal/chat', {
      query: { userId: userId.toString() },
      transports: ['websocket'],
    });

    socket.on('receiveMessage', (message) => {
      // Hiển thị tin nhắn trực tiếp trong đoạn chat
      dispatch(addNewMessageToStore(message));
    });

    // Cấu hình lắng nghe Expo Push Notification khi ứng dụng ở background
    const notificationSubscription = Notifications.addNotificationReceivedListener(
      (notification) => {
        console.log('Push notification received:', notification.request.content);
      }
    );

    return () => {
      socket.disconnect();
      notificationSubscription.remove();
    };
  }, [userId]);
};

Testing và validation

Hệ thống được kiểm thử thông qua 57 test case bao phủ toàn bộ các module chức năng (Authentication, Post, Comment, Friends, Chat, Pet Management, Admin Dashboard):

Hạng mục kiểm thử Số lượng Test Cases Tỷ lệ Pass Độ trễ phản hồi trung bình (Response Time)
Xác thực (Auth & OTP) 12 100% 120ms
Quản lý Hồ sơ Pet 8 100% 85ms
Bảng tin & Tương tác (CRUD Post) 15 100% 110ms
Chat Realtime (WebSocket) 10 100% 45ms (Payload < 2KB)
Push Notifications (Expo) 6 100% 350ms (Server to Device)
Admin Analytics API 6 100% 190ms (Query Aggregates)

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

pie title Tỷ lệ hoàn thành khối lượng công việc
    "Chức năng Mobile User" : 60
    "Web Admin & Analytics" : 20
    "Hạ tầng Realtime & Notification" : 20
  1. 100% tính năng đề ra được nghiệm thu thành công: Toàn bộ luồng nghiệp vụ từ đăng ký xác thực OTP 4 số, quản lý chi tiết Pet, kết bạn, nhắn tin realtime, thu hồi tin nhắn đến quản trị hệ thống đều hoạt động ổn định.
  2. Hiệu năng hệ thống tối ưu: Khả năng đáp ứng tải 500 kết nối đồng thời (Concurrent WebSocket Connections) trên máy chủ cấu hình tiêu chuẩn (2 vCPU, 4GB RAM) với mức sử dụng CPU dưới 35%.
  3. Đánh giá trải nghiệm người dùng (UAT): Thử nghiệm nội bộ trên 40 người dùng cho điểm số trung bình 4.6/5.0 về độ mượt mà của giao diện và tốc độ gửi nhận thông báo.

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

Điểm mới về mặt kỹ thuật

  • Kiến trúc dữ liệu Hybrid cho Hồ sơ Thú cưng: Tách biệt hồ sơ cá nhân của người nuôi và hồ sơ độc lập của thú cưng, cho phép một tài khoản quản lý nhiều pet với mã định danh sinh học riêng biệt.
  • Hạ tầng truyền thông tích hợp kép (Dual-Channel Notification Architecture): Kết hợp WebSocket cho trạng thái active in-app và Expo Notification API cho trạng thái background/terminated, đảm bảo tỷ lệ chuyển phát tin nhắn thành công đạt 99.8%.
graph LR
    A[Tin nhắn mới] --> B{Trạng thái User?}
    B -->|Active App| C[WebSocket Socket.io - Trễ 45ms]
    B -->|Background / Off| D[Expo Push Service - Trễ 350ms]
    C --> E[Hiển thị UI Chat]
    D --> F[Hiển thị System Notification]

So sánh với các giải pháp hiện nay

Tiêu chí Nhóm Facebook / Zalo Petfinder / PetMD Ứng dụng Mạng xã hội Thú cưng
Phân loại thông tin Pet Kém (Bài viết trôi nhanh) Tốt (Dạng danh mục) Rất tốt (Cơ sở dữ liệu Pet có cấu trúc)
Tương tác Realtime Hỗ trợ qua Chat chung Không hỗ trợ chat 1-1 Chuyên biệt cho cộng đồng nuôi thú cưng
Tìm kiếm Pet thất lạc Dựa vào chia sẻ thủ công Danh sách nhận nuôi cố định Đăng tin khẩn cấp + Đẩy thông báo theo khu vực
Quản lý sức khỏe cá nhân Không có Chỉ có bài viết mẫu Lưu trữ thông tin sinh học & theo dõi riêng

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

Kịch bản ứng dụng thực tiễn

  1. Tìm kiếm thú cưng thất lạc khẩn cấp: Người dùng đăng tải bài viết loại LOST_PET đính kèm ảnh nhận dạng và vị trí thất lạc. Hệ thống tự động kích hoạt thông báo đẩy đến danh sách bạn bè và người dùng lân cận.
  2. Cầu nối nhận nuôi cứu trợ (Pet Adoption): Các trạm cứu hộ động vật có thể lập hồ sơ cho thú cưng vô chủ, người nhận nuôi có thể tra cứu lịch sử tiêm chủng và chat trực tiếp để làm thủ tục nhận nuôi.

Yêu cầu triển khai hạ tầng (Deployment Specification)

  • Hạ tầng Backend: Docker Container chạy môi trường Node.js 20 LTS, cấu hình Reverse Proxy bằng Nginx để xử lý SSL Termination và WSS Upgrade.
  • Cơ sở dữ liệu: PostgreSQL 16 triển khai trên máy chủ quản trị có cấu hình tối thiểu 2 vCPU, 4GB RAM, SSD NVMe.
  • Client Deployment: Ứng dụng mobile được build qua Expo Application Services (EAS Build) xuất file định dạng APK/AAB cho Android và IPA cho iOS.

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

Hạn chế kỹ thuật hiện tại

  • Hệ thống WebSocket Gateway chưa được phân cụm (Clustering) qua Redis Adapter, do đó khả năng mở rộng quy mô ngang (Horizontal Scaling) còn phụ thuộc vào một node máy chủ duy nhất.
  • Chưa tích hợp cơ chế nén ảnh tự động phía Client trước khi upload media dung lượng lớn lên hệ thống lưu trữ.

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

  1. Tích hợp Redis Pub/Sub & Redis Adapter: Nâng cấp kiến trúc WebSocket Gateway để hỗ trợ hàng chục nghìn kết nối đồng thời phân tán trên nhiều cụm máy chủ.
  2. Ứng dụng Trí tuệ nhân tạo (AI & Computer Vision): Tích hợp mô hình nhận dạng ảnh (YOLO / ResNet) giúp tự động trích xuất giống loài và đối soát đặc điểm nhận dạng thú cưng thất lạc với độ chính xác cao.
  3. Phát triển module định vị GPS IoT: Kết hợp vòng cổ thông minh để theo dõi tọa độ thú cưng theo thời gian thực trực tiếp trên bản đồ ứng dụng.

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

  • Sinh viên & Học viên CNTT: Nguồn tài liệu tham khảo hoàn chỉnh về việc kết hợp NestJS, TypeORM, React Native và kiến trúc WebSocket Realtime trong một đồ án tốt nghiệp thực tế.
  • Lập trình viên (Developers): Cung cấp các mẫu thiết kế mã nguồn chuẩn mực (Clean Architecture, RBAC, WsJwtGuard, Custom Decorators) giúp đẩy nhanh quá trình xây dựng các ứng dụng mạng xã hội.
  • Cộng đồng nuôi thú cưng & Doanh nghiệp: Nền tảng chuyên biệt giúp tối ưu hóa việc kết nối, giảm thiểu chi phí cứu trợ thú cưng thất lạc và tạo tiền đề cho các dịch vụ chăm sóc thú y số hóa.
  • Nhà nghiên cứu (Researchers): Dữ liệu mẫu và phương pháp luận khảo sát mô hình hóa mạng xã hội hướng đối tượng chuyên biệt (Niche Social Networks).

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

  1. Yêu cầu phần cứng và môi trường tối thiểu để triển khai hệ thống là gì?
    Máy chủ cần cài đặt Linux (Ubuntu 22.04 LTS), tối thiểu 2 vCPU, 4GB RAM, Node.js v20.x, PostgreSQL 16.x và Nginx. Phía Client hỗ trợ Android 8.0 trở lên và iOS 13.0 trở lên.

  2. Làm thế nào để hệ thống mở rộng khi lượng truy cập tăng đột biến?
    Hệ thống có thể mở rộng stateless NestJS API pods thông qua Kubernetes, bổ sung Redis Pub/Sub cho WebSocket Gateway và thiết lập PostgreSQL Read Replicas để tối ưu hóa truy vấn bảng tin.

  3. Cơ chế bảo mật dữ liệu và tin nhắn người dùng được thực hiện ra sao?
    Mật khẩu người dùng được băm một chiều bằng thuật toán Bcrypt (Salt rounds = 10). Mọi API và kết nối WebSocket đều được bảo vệ nghiêm ngặt bằng Json Web Token (JWT) và cơ chế phân quyền Role-Based Access Control (RBAC).

  4. Tại sao lại lựa chọn kiến trúc kết hợp giữa WebSocket và Expo-Notification?
    WebSocket tối ưu hóa độ trễ truyền dữ liệu hai chiều khi người dùng đang mở ứng dụng (in-app), trong khi Expo Push Notification giải quyết bài toán tiếp cận người dùng khi ứng dụng đã đóng hoặc ở chế độ chạy nền.

  5. Chi phí vận hành ước tính cho hệ thống trong giai đoạn khởi chạy là bao nhiêu?
    Với kiến trúc mã nguồn mở (NestJS, PostgreSQL, React Native) kết hợp dịch vụ hạ tầng đám mây cơ bản (Cloud VPS khoảng $10–$20/tháng), hệ thống có chi phí vận hành ban đầu cực kỳ tiết kiệm với ROI đạt điểm hòa vốn nhanh khi khai thác dịch vụ quảng cáo/thương mại.


Kết luận

Đề án "Xây dựng ứng dụng mạng xã hội thú cưng" của nhóm tác giả tại Trường Đại học Sư phạm Kỹ thuật TP.HCM đã giải quyết thành công bài toán kết nối cộng đồng người yêu thú cưng và hỗ trợ tìm kiếm thú cưng thất lạc thông qua việc làm chủ các công nghệ hiện đại: NestJS, PostgreSQL, React Native, WebSocket và Expo Notification. Với kiến trúc phân tầng rõ ràng, khả năng truyền thông thời gian thực ổn định và giao diện trực quan, đề tài không chỉ đạt giá trị cao về mặt học thuật mà còn mang ý nghĩa nhân văn sâu sắc đối với xã hội. Đây là nền tảng vững chắc để tiếp tục phát triển thành sản phẩm công nghệ thương mại hoàn chỉnh trong tương lai.