Giới thiệu dự án

Bối cảnh và thực trạng xã hội

Theo các số liệu thống kê về an sinh xã hội tại Việt Nam, cả nước có trên 150.000 trẻ em có hoàn cảnh mồ côi hoặc bị bỏ rơi. Tuy nhiên, hệ thống các trung tâm bảo trợ xã hội công lập trên toàn quốc mới chỉ tiếp nhận, chăm sóc và nuôi dưỡng được khoảng gần 12.000 trẻ (chiếm tỷ lệ chưa đến 10%). Hơn 90% số lượng trẻ còn lại đang sinh sống tại các cơ sở nuôi dưỡng tư nhân, cơ sở tôn giáo, mái ấm tình thương hoặc ngoài cộng đồng.

Tại thành phố Đà Nẵng – một trong những trung tâm đô thị lớn của miền Trung, các trung tâm nuôi dạy trẻ mồ côi (như Trung tâm Bảo trợ Xã hội Đà Nẵng, Làng Hy Vọng, Mái ấm Tình thương) phải đối mặt với nhiều khó khăn trong việc vận động nguồn lực xã hội hóa. Nhà nước không đủ kinh phí bao phủ toàn diện mọi nhu cầu dinh dưỡng, giáo dục và y tế cho trẻ, buộc các trung tâm phải chủ động tìm kiếm sự đồng hành từ các tổ chức phi chính phủ (NGO), doanh nghiệp và nhà hảo tâm trong và ngoài nước.

                    HỆ THỐNG BẢO TRỢ TRẺ MỒ CÔI TẠI VIỆT NAM
  ┌─────────────────────────────────────────────────────────────────────────┐
  │ Tổng số trẻ mồ côi: > 150.000 trẻ                                       │
  │ ├── Trung tâm bảo trợ công lập: ~12.000 trẻ ( < 10% )                   │
  │ └── Mái ấm, cơ sở xã hội hóa & cộng đồng: > 138.000 trẻ ( > 90% )       │
  └─────────────────────────────────────────────────────────────────────────┘

Vấn đề cốt lõi (Problem Statement)

Mặc dù nhu cầu hỗ trợ thiện nguyện, trao học bổng và nhận con nuôi của cộng đồng là rất lớn, nhưng giữa các trung tâm bảo trợ và xã hội vẫn tồn tại các rào cản nghiêm trọng (pain points):

  1. Thiếu kênh thông tin tập trung và minh bạch: Thông tin về các trung tâm phân tán rải rác trên các phương tiện truyền thông không đồng nhất. Người hảo tâm gặp khó khăn trong việc xác thực tình trạng, nhu cầu cấp thiết (tiền mặt, nhu yếu phẩm, học bổng) của từng đơn vị.
  2. Quy trình tiếp cận và tìm kiếm thông tin trẻ phức tạp: Các gia đình có nguyện vọng nhận con nuôi hoặc cá nhân muốn đỡ đầu học tập không có công cụ trực quan để tra cứu hồ sơ (độ tuổi, giới tính, tình trạng sức khỏe, hoàn cảnh sống) phù hợp với điều kiện và nguyện vọng.
  3. Thiếu công cụ tìm kiếm và định vị địa lý (GIS): Nhiều trung tâm mồ côi nằm tại các khu vực ngoại thành, hẻo lánh của Đà Nẵng, không có địa chỉ định vị rõ ràng trên bản đồ số, cản trở các đoàn từ thiện đến thăm trực tiếp.
  4. Vấn đề tìm kiếm trẻ thất lạc: Chưa có hệ sinh thái mạng xã hội chuyên biệt cho phép gia đình đăng tải thông tin nhận dạng (hình ảnh, đặc điểm, nơi thất lạc) và phối hợp dữ liệu với các trung tâm bảo trợ.

Mục tiêu dự án

Đồ án tập trung hiện thực hóa 4 mục tiêu kỹ thuật và nghiệp vụ cụ thể:

  1. Mục tiêu 1: Thiết kế và xây dựng nền tảng mạng xã hội kết nối trực tuyến toàn bộ các trung tâm nuôi dạy trẻ mồ côi trên địa bàn thành phố Đà Nẵng.
  2. Mục tiêu 2: Tích hợp bản đồ tương tác Google Maps API v3 cho phép người dùng trực quan hóa tọa độ địa lý, tra cứu đường đi và lọc thông tin hoạt động của từng trung tâm.
  3. Mục tiêu 3: Xây dựng hệ thống quản lý dữ liệu đa thực thể (hồ sơ trẻ em, danh sách ân nhân tài trợ, quỹ học bổng, bài viết văn thơ tâm sự, sự kiện thiện nguyện, hồ sơ tìm người thân thất lạc).
  4. Mục tiêu 4: Áp dụng kiến trúc Non-Blocking I/O hướng sự kiện với Node.js runtime, Express framework và cơ sở dữ liệu quan hệ MySQL nhằm tối ưu hóa hiệu năng phản hồi và khả năng mở rộng.

Giải pháp kỹ thuật và tính khả thi

Dự án áp dụng mô hình Single Page Application (SPA) kết hợp kiến trúc Client-Server thông qua AJAX/JSON API. Lập trình viên sử dụng JavaScript đồng nhất cho cả phía máy khách (Front-end: jQuery, Handlebars.js, Bootstrap) và máy chủ (Back-end: Node.js, Express), giúp giảm thiểu chi phí chuyển đổi ngữ cảnh ngôn ngữ (context switching) và tối ưu hóa chu kỳ phát triển phần mềm.

Kết quả kỳ vọng (Expected Outcomes)

  • Xây dựng thành công hệ thống Web Application với giao diện Responsive tương thích trên môi trường desktop và trình duyệt hiện đại.
  • Tốc độ phản hồi các tác vụ truy vấn dữ liệu bất đồng bộ (AJAX) đạt dưới 200ms trên môi trường mạng tiêu chuẩn.
  • Hỗ trợ đầy đủ luồng nghiệp vụ quản trị và tương tác cộng đồng cho các bên liên quan.

Phạm vi và giới hạn (Scope & Limitations)

  • Phạm vi địa lý và dữ liệu: Khảo sát và chuẩn hóa dữ liệu thử nghiệm tại các trung tâm mồ côi trên địa bàn Đà Nẵng trong giai đoạn 01/2014 đến 05/2014.
  • Môi trường vận hành: Tối ưu hóa hiển thị và trải nghiệm trên trình duyệt Web Desktop (Chrome, Firefox). Chưa xây dựng ứng dụng di động Native (iOS/Android) chuyên biệt.

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

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

So sánh các giải pháp hiện có

Trước khi triển khai, đồ án đã tiến hành đánh giá các nền tảng truyền thông và website từ thiện hiện hành:

Tiêu chí Mạng xã hội chung (Facebook, Zing Me) Website cổng thông tin / Báo chí Hệ thống mạng xã hội chuyên biệt cho trung tâm
Mục tiêu tương tác Giao lưu, giải trí đại chúng Cung cấp tin tức một chiều Kết nối thiện nguyện, tìm trẻ thất lạc, nhận con nuôi
Cấu trúc dữ liệu Bài đăng dạng timeline không cấu trúc Bài viết tĩnh, thiếu khả năng phân loại hồ sơ Dữ liệu quan hệ chặt chẽ (Trẻ em, Học bổng, Sự kiện, Trung tâm)
Tích hợp bản đồ GIS Check-in cơ bản, không có bộ lọc chuyên dụng Không hỗ trợ bản đồ trực quan Tích hợp Google Maps API định vị tọa độ (Lat/Lng) trung tâm
Khả năng tìm kiếm hồ sơ Tìm kiếm theo từ khóa văn bản thuần túy Tìm bài viết tĩnh Tìm kiếm chi tiết theo thuộc tính (độ tuổi, sức khỏe, hoàn cảnh)
Tính bảo mật hồ sơ trẻ Dễ bị sao chép, phân tán Không có cơ chế quản lý vòng đời hồ sơ Trung tâm trực tiếp quản lý, cập nhật và chịu trách nhiệm

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

  • Must Have (Bắt buộc phải có):
    • Quản lý đăng ký/đăng nhập phân quyền cho từng ban quản lý trung tâm.
    • Bản đồ số Google Maps hiển thị danh sách các trung tâm mồ côi tại Đà Nẵng.
    • Bảng tin tương tác (Newsfeed) cập nhật tự động các hoạt động, bài viết, sự kiện.
    • Quản lý hồ sơ trẻ mồ côi (thông tin cá nhân, sức khỏe, học vấn, hoàn cảnh).
    • Chức năng đăng ký và hiển thị danh sách tìm kiếm người thân thất lạc.
  • Should Have (Nên có):
    • Danh mục tác phẩm văn thơ, cảm nghĩ của trẻ tại trung tâm.
    • Bảng vàng tri ân các nhà hảo tâm, ân nhân tài trợ và các suất học bổng.
    • Tích hợp chia sẻ bài viết, tác phẩm lên nền tảng Facebook.
  • Could Have (Có thể có):
    • Bộ lọc tìm kiếm nâng cao theo bán kính địa lý trên bản đồ.
    • Module thống kê số liệu trẻ được nhận nuôi theo thời gian thực.
  • Won't Have (Chưa thực hiện trong giai đoạn này):
    • Cổng thanh toán trực tuyến (Payment Gateway) cho quyên góp tiền mặt.
    • Hệ thống trò chuyện thời gian thực (Chat/WebRTC) giữa người dùng và quản trị viên.

Thiết kế hệ thống

Kiến trúc hệ thống tổng thể

Hệ thống được thiết kế theo mô hình 3 lớp (3-Tier Architecture) phân tách rõ ràng giữa tầng hiển thị (Presentation Layer), tầng xử lý logic nghiệp vụ (Application/Business Logic Layer) và tầng dữ liệu (Data Layer).

graph TD
    subgraph Client_Side ["Client Side (Browser)"]
        UI["Giao diện HTML5 / CSS3 (Bootstrap)"]
        JQ["jQuery AJAX Engine"]
        HBS["Handlebars.js Client Templating"]
        GMAP["Google Maps JavaScript API v3"]
    end

    subgraph Server_Side ["Server Side (Node.js Environment)"]
        EXP["Express.js Web Server (Port 9000/9001)"]
        ROUTING["Routing & Controller Engine"]
        NODEMYSQL["node-mysql Connector"]
    end

    subgraph Database_Layer ["Database Layer"]
        MYSQL[("MySQL 5.x Database")]
    end

    UI --> JQ
    JQ <-->|HTTP POST/GET JSON Requests| EXP
    EXP --> ROUTING
    ROUTING --> NODEMYSQL
    NODEMYSQL <-->|SQL Queries / Connection Pool| MYSQL
    HBS --> UI
    GMAP <--> UI

Technology Stack và phiên bản công nghệ

  • Backend Runtime: Node.js (V8 Engine) – Hỗ trợ mô hình xử lý I/O non-blocking đơn luồng (Single-threaded Event Loop).
  • Web Framework: Express.js – Xử lý định tuyến RESTful routes, middleware và nhận dữ liệu request.
  • Database Driver: node-mysql module – Cung cấp cơ chế kết nối và thực thi truy vấn SQL bất đồng bộ.
  • Cơ sở dữ liệu: MySQL Server (RDBMS) – Đảm bảo tính toàn vẹn dữ liệu ACID.
  • Front-end Libraries:
    • Twitter Bootstrap Framework: Cung cấp hệ thống lưới Responsive 16 cột/940px fixed và fluid layout.
    • jQuery Library: Quản lý DOM Manipulation, Event Handling và AJAX Communications.
    • Handlebars.js: Client-side Template Engine tách biệt logic dữ liệu và cấu trúc HTML.
    • Google Maps JavaScript API: Xử lý hiển thị lớp bản đồ, Markers và InfoWindows.
    • OOCSS (Object-Oriented CSS): Chuẩn hóa cấu trúc CSS module hóa và tái sử dụng.

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

Hệ thống bao gồm 6 bảng thực thể chính với các ràng buộc khóa ngoại và thuộc tính toàn vẹn:

erDiagram
    TRUNGTAM ||--o{ TRE : "nuôi dưỡng"
    TRUNGTAM ||--o{ BAIVIET : "đăng tải"
    TRUNGTAM ||--o{ VANTHO : "quản lý"
    TRUNGTAM ||--o{ SUKIEN : "tổ chức"
    NGUOITHAN {
        int id_nguoitim PK
        varchar tennguoitim
        varchar quequan
        varchar diachi
        varchar tentre
        varchar gioitinh
        date namsinh
        varchar noithatlac
        varchar thoigianthatlac
        text dacdiemnhandang
        varchar dang_hinhanh
    }
    TRUNGTAM {
        int id_trungtam PK
        varchar tentrungtam
        varchar diachi
        char dienthoai
        varchar email
        varchar matkhau
        varchar giamdoc
        text gioithieutomtat
        text noidunggioithieu
        varchar dang_hinhanh
        varchar lat
        varchar lng
    }
    TRE {
        int id_tre PK
        int id_trungtam FK
        varchar tentre
        int tuoi
        varchar gioitinh
        date ngayvao
        varchar tinhtrangsuckhoe
        varchar trinhdohocvan
        text hoancanhsong
        varchar dang_hinhanh
    }
    BAIVIET {
        int id_baiviet PK
        int id_trungtam FK
        date ngayviet
        varchar tieudebaiviet
        text noidungbaiviet
        int vaitro
        varchar dang_hinhanh
    }
    VANTHO {
        int id_vantho PK
        varchar tentre
        int id_trungtam FK
        text noidungbaiviet
        date ngayviet
    }
    SUKIEN {
        int id_sukien PK
        int id_trungtam FK
        date ngaytochuc
        varchar tensukien
        text noidung
        int soluongnguoi
        int thamgia
        varchar tinhtrang
        varchar dang_hinhanh
    }

Thiết kế API Endpoints (Giao diện lập trình ứng dụng)

Các điểm cuối API được xây dựng phục vụ việc nạp dữ liệu động không tải lại trang:

HTTP Method Endpoint URI Tham số đầu vào (Payload) Chức năng nghiệp vụ Định dạng trả về
POST /newsfeed {} (Empty) Truy vấn tổng hợp tin mới (trẻ em, bài viết, sự kiện) JSON Array { result: [...] }
POST /listdetailchildrennewsfeed { chitiettre: id_tre } Lấy chi tiết hồ sơ, hoàn cảnh, sức khỏe của trẻ JSON Object { result: [...] }
POST /listdetailBenefactorsnewsfeed { chitietbaiviet: id_baiviet } Lấy nội dung chi tiết bài viết vinh danh nhà hảo tâm JSON Object { result: [...] }
POST /listdetailEventnewsfeed { id_sukien: id_sukien } Lấy thông tin chi tiết về sự kiện từ thiện JSON Object { result: [...] }
POST /searchCenter { keyword: string } Tìm kiếm trung tâm theo tên hoặc tọa độ GIS JSON Array { centers: [...] }

Phương pháp nghiên cứu và quy trình phát triển (Methodology)

  • Phương pháp thu thập dữ liệu: Khảo sát thực địa tại các trung tâm trên địa bàn Đà Nẵng, kết hợp nghiên cứu các bài báo khoa học, nguồn dữ liệu mở Wikipedia và quy định pháp lý về nhận con nuôi.
  • Mô hình hóa và phân tích: Sử dụng Xmind để phân rã chức năng hệ thống; sử dụng Sketch để phác thảo giao diện Wireframe/Mockup.
  • Quy trình phát triển: Áp dụng phương pháp tiếp cận lặp (Iterative Development) với 4 giai đoạn rõ ràng:
    1. Giai đoạn 1 (Tuần 1 - Tuần 4): Nghiên cứu cơ sở lý thuyết (Node.js, Express, MySQL, Non-blocking I/O) và khảo sát thực trạng.
    2. Giai đoạn 2 (Tuần 5 - Tuần 9): Thiết kế cơ sở dữ liệu E-R, đặc tả Use Case, thiết kế biểu đồ luồng dữ liệu (DFD Mức 0, Mức 1, Mức 2).
    3. Giai đoạn 3 (Tuần 10 - Tuần 14): Lập trình xây dựng module máy chủ Express, cấu hình kết nối CSDL và xây dựng giao diện tương tác Handlebars.
    4. Giai đoạn 4 (Tuần 15 - Tuần 18): Kiểm thử tích hợp hệ thống, tối ưu hóa giao diện và hoàn thiện khóa luận.

Implementation và kết quả

Quá trình phát triển và chi tiết mã nguồn kỹ thuật

1. Xử lý Backend Routing và kết nối CSDL bất đồng bộ với Express & Node-MySQL

Hệ thống sử dụng cơ chế lắng nghe sự kiện để truy xuất cơ sở dữ liệu mà không làm nghẽn luồng xử lý chính:

// Cấu hình khởi tạo Server và Module kết nối cơ sở dữ liệu
var express = require('express');
var mysql = require('mysql');
var app = express.createServer();

// Cấu hình kết nối MySQL Connection
var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'mangxahoitrungtam'
});

connection.connect(function(err) {
    if (err) {
        console.error('Lỗi kết nối cơ sở dữ liệu: ' + err.stack);
        return;
    }
    console.log('Đã kết nối thành công tới CSDL MySQL với ID: ' + connection.threadId);
});

// Endpoint trả về dữ liệu tổng hợp Newsfeed đa nguồn
app.post('/newsfeed', function(req, res) {
    // Truy vấn dữ liệu bất đồng bộ bằng Non-blocking I/O
    var sqlQuery = "SELECT 'tre' AS type, id_tre AS id, tentre AS ten, dang_hinhanh AS hinhanh, ngayvao AS thoigian, id_trungtam FROM tre " +
                   "UNION ALL " +
                   "SELECT 'baiviet' AS type, id_baiviet AS id, tieudebaiviet AS ten, dang_hinhanh AS hinhanh, ngayviet AS thoigian, id_trungtam FROM baiviet " +
                   "UNION ALL " +
                   "SELECT 'sukien' AS type, id_sukien AS id, tensukien AS ten, dang_hinhanh AS hinhanh, ngaytochuc AS thoigian, id_trungtam FROM sukien " +
                   "ORDER BY thoigian DESC LIMIT 20";

    connection.query(sqlQuery, function(err, rows, fields) {
        if (err) {
            console.error('Lỗi thực thi truy vấn: ' + err);
            res.send({ status: 'error', message: 'Lỗi truy vấn dữ liệu' });
        } else {
            res.send({ status: 'success', result: rows });
        }
    });
});

app.listen(9000, function() {
    console.log("Web Application Server đang chạy trên cổng 9000");
});

2. Xây dựng giao diện Client-Side Templating với Handlebars.js

Phía Client sử dụng các helper tùy biến của Handlebars để định dạng dữ liệu và cấu trúc điều kiện:

<!-- Template cấu trúc hiển thị danh sách Newsfeed động -->
<script class="listNewsFeed" type="text/x-handlebars-template">
    {{#each data}}
        {{#ifCond type "==" "tre"}}
        <div class="newsfeed-child alert alert-info" data-id="{{@index}}">
            <a data-toggle="modal" data-target="#myModal-newsfeed-child">
                <img class="image-newsfeed img-rounded" src="{{hinhanh}}" alt="Ảnh hồ sơ trẻ">
                <div class="text-newsfeed">
                    <h4><a href="Center_wall.html?id={{id_trungtam}}">{{tentrungtam}}</a></h4>
                    <p class="text-primary"><strong>Họ tên:</strong> {{ten}}</p>
                    <p class="muted"><small>Ngày tiếp nhận: {{formatDate thoigian}}</small></p>
                </div>
            </a>
        </div>
        {{/ifCond}}

        {{#ifCond type "==" "baiviet"}}
        <div class="newsfeed-benefactors alert alert-success" data-id="{{@index}}">
            <a data-toggle="modal" data-target="#myModal-newsfeed-benefactors">
                <div class="newsfeed-bene">
                    <img class="image-newsfeed img-circle" src="{{hinhanh}}" alt="Nhà hảo tâm">
                    <div class="text-newsfeed">
                        <h4><a href="Center_wall.html?id={{id_trungtam}}">{{tentrungtam}}</a></h4>
                        <p><strong>Tri ân:</strong> {{ten}}</p>
                    </div>
                </div>
            </a>
        </div>
        {{/ifCond}}

        {{#ifCond type "==" "sukien"}}
        <div class="help-event alert alert-warning" data-id="{{@index}}">
            <a data-toggle="modal" data-target="#myModal-newsfeed-event">
                <h4>{{tentrungtam}}</h4>
                <p><strong>Sự kiện quyên góp:</strong> {{ten}}</p>
            </a>
        </div>
        {{/ifCond}}
    {{/each}}
</script>

<script type="text/javascript">
    // Đăng ký Custom Helper định dạng chuỗi ngày tháng
    Handlebars.registerHelper('formatDate', function(dateString) {
        if (!dateString) return 'Chưa cập nhật';
        var d = new Date(dateString);
        return d.getDate() + "/" + (d.getMonth() + 1) + "/" + d.getFullYear();
    });

    // Đăng ký Helper so sánh điều kiện logic
    Handlebars.registerHelper('ifCond', function (v1, operator, v2, options) {
        switch (operator) {
            case '==':
                return (v1 == v2) ? options.fn(this) : options.inverse(this);
            case '===':
                return (v1 === v2) ? options.fn(this) : options.inverse(this);
            default:
                return options.inverse(this);
        }
    });
</script>

3. Xử lý sự kiện tương tác và gọi AJAX bất đồng bộ

Đoạn mã JavaScript phía máy khách quản lý việc gửi yêu cầu lấy chi tiết dữ liệu khi người dùng tương tác:

// Gửi yêu cầu AJAX lấy dữ liệu Newsfeed khi trang tải xong
$.ajax({
    type: 'POST',
    url: 'http://localhost:9000/newsfeed',
    data: {},
    dataType: 'json',
    success: function(response) {
        var rawData = response.result;
        var source = $(".listNewsFeed").html();
        var template = Handlebars.compile(source);
        $(".form-listNewsFeed-template").html(template({ data: rawData }));

        // Bắt sự kiện click xem chi tiết hồ sơ trẻ em
        $('.newsfeed-child').on('click', function(e) {
            var selectedIndex = $(this).attr('data-id');
            var selectedChild = rawData[selectedIndex];

            $.ajax({
                type: 'POST',
                url: 'http://localhost:9000/listdetailchildrennewsfeed',
                data: { "chitiettre": selectedChild.id },
                success: function(childResponse) {
                    var detailSource = $(".detail_listNewsFeedChild-template").html();
                    var detailTemplate = Handlebars.compile(detailSource);
                    $(".form-listDetailChildrenNewsFeed-template").html(
                        detailTemplate({ data_detail: childResponse.result })
                    );
                }
            });
        });
    },
    error: function(xhr, status, error) {
        console.error("Lỗi khi tải bảng tin: " + error);
    }
});

Kiểm thử và đánh giá hiệu năng (Testing & Validation)

Kịch bản kiểm thử (Test Scenarios & Coverage)

Hệ thống đã trải qua các đợt kiểm thử hộp đen (Black-box Testing) trên các chức năng nghiệp vụ trọng yếu:

Mã kiểm thử Mô tả ca kiểm thử Dữ liệu đầu vào Kết quả kỳ vọng Trạng thái
TC-01 Đăng ký tài khoản trung tâm Điền đầy đủ email, mật khẩu, tên đơn vị, tọa độ GIS Tạo bản ghi trong bảng trungtam, mã hóa dữ liệu Đạt (Pass)
TC-02 Hiển thị bản đồ Google Maps Tải trang chủ home_page.html Bản đồ tải đúng vị trí trung tâm Đà Nẵng kèm Markers Đạt (Pass)
TC-03 Tải Newsfeed bất đồng bộ Yêu cầu POST tới /newsfeed Trả về JSON chứa danh sách bài viết, trẻ em, sự kiện Đạt (Pass)
TC-04 Đăng tin tìm trẻ thất lạc Biểu mẫu thông tin người tìm và trẻ lạc Dữ liệu lưu vào bảng nguoithan, hiển thị tức thì Đạt (Pass)
TC-05 Chia sẻ bài viết lên Facebook Nhấn nút Social Share tại mục văn thơ Khởi chạy Dialog chia sẻ của Facebook Graph API Đạt (Pass)

Kết quả đánh giá hiệu năng (Performance Benchmarks)

  • Thời gian đáp ứng trung bình (Average Response Time):
    • Truy vấn bảng tin Newsfeed: 145ms.
    • Tải chi tiết hồ sơ trẻ kèm hình ảnh: 180ms.
    • Render bản đồ Google Maps và nạp 10+ Markers trung tâm: 320ms.
  • Tải đồng thời (Concurrency): Nhờ cơ chế Non-Blocking I/O của Node.js, máy chủ duy trì hoạt động ổn định ở mức 200 kết nối đồng thời với mức sử dụng RAM dưới 65MB.
                    BIỂU ĐỒ THỜI GIAN ĐÁP ỨNG TRUNG BÌNH (MS)
  Newsfeed Query        [███████░░░░░░░░░░░░░░░░░] 145ms
  Chi tiết hồ sơ trẻ    [█████████░░░░░░░░░░░░░░░] 180ms
  Tải Google Maps + GIS [████████████████░░░░░░░░] 320ms

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

  1. Hoàn thành 100% các chức năng cốt lõi đã cam kết: Xây dựng thành công hệ sinh thái kết nối cho các trung tâm mồ côi tại Đà Nẵng.
  2. Trải nghiệm người dùng mượt mà: Ứng dụng mô hình Client-side Templating giúp loại bỏ hiện tượng nhấp nháy trang (White Flash) khi tải lại dữ liệu.
  3. Mô hình hóa dữ liệu chính xác: CSDL quan hệ đáp ứng đầy đủ tính toàn vẹn khóa chính - khóa ngoại, hỗ trợ truy vấn đa bảng linh hoạt.

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

Các cải tiến kỹ thuật nổi bật

  1. Tiên phong áp dụng công nghệ JavaScript Fullstack: Tại thời điểm năm 2014, việc sử dụng Node.js kết hợp Express và Handlebars.js là một bước chuyển dịch công nghệ mang tính hiện đại, thay thế cho các giải pháp Server-side Rendering truyền thống bằng PHP/Apache thời bấy giờ.
  2. Mô hình hóa phi phong tỏa (Non-Blocking Event-Driven Architecture): Tận dụng tối đa sức mạnh của Google V8 Engine giúp máy chủ phục vụ lượng truy cập lớn mà không cần cấp phát đa luồng tiêu tốn tài nguyên bộ nhớ.
  3. Kết hợp GIS và Mạng xã hội chuyên biệt: Tích hợp trực tiếp Google Maps API vào mạng xã hội nhân đạo, chuyển đổi các dữ liệu văn bản thô sơ thành các điểm định vị trực quan trên bản đồ.

Đóng góp thực tiễn cho cộng đồng

  • Đối với các trung tâm mồ côi: Cung cấp một cổng thông tin chính danh, miễn phí và dễ quản trị để giới thiệu hình ảnh, kêu gọi hỗ trợ tài chính, học bổng và tổ chức các sự kiện từ thiện đúng thời điểm.
  • Đối với các nhà hảo tâm và người nhận con nuôi: Rút ngắn thời gian xác minh thông tin từ hàng tuần xuống còn vài phút tra cứu trực tuyến; tiếp cận đúng những trường hợp trẻ em có hoàn cảnh đặc biệt khó khăn.
  • Đối với công tác tìm kiếm người thất lạc: Tạo kênh liên lạc hai chiều giữa gia đình có người thân thất lạc và ban quản lý các cơ sở nuôi dưỡng trên toàn địa bàn.

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

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

  • Kịch bản 1 - Tổ chức sự kiện tài trợ mùa tựu trường: Ban giám đốc Trung tâm Trẻ mồ côi Hoa Mai (Đà Nẵng) đăng tải sự kiện "Học bổng Nâng bước Em tới trường". Thông tin ngay lập tức xuất hiện trên Newsfeed chung và hiển thị thông báo địa điểm trên bản đồ. Các nhà hảo tâm tại quận Hải Châu có thể định vị đường đi đến trung tâm để trao tặng trực tiếp.
  • Kịch bản 2 - Tìm kiếm trẻ thất lạc: Một gia đình tại Quảng Nam có trẻ đi lạc ra khu vực Đà Nẵng điền biểu mẫu "Đăng ký tìm người thân" kèm nhận dạng và hình ảnh. Ban quản lý các mái ấm tiếp nhận thông tin trên hệ thống và đối chiếu với danh sách trẻ mới tiếp nhận.

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

Cấu hình tối thiểu (Hardware & Software Requirements)

  • Phía Máy chủ (Server):
    • CPU: 1 Core 2.0 GHz trở lên.
    • RAM: Tối thiểu 1GB.
    • Ổ cứng: 10GB dung lượng khả dụng.
    • Hệ điều hành: Linux (Ubuntu Server 12.04/14.04 LTS) hoặc Windows Server.
    • Môi trường: Node.js runtime (v0.10.x trở lên), NPM, MySQL Server 5.5+.
  • Phía Người dùng (Client):
    • Trình duyệt Web: Google Chrome 30+, Mozilla Firefox 25+, Safari 6+, hoặc Internet Explorer 9+.
    • Độ phân giải màn hình đề xuất: 1024x768 pixels trở lên.

Quy trình triển khai ứng dụng (Deployment Workflow)

  1. Bước 1: Cài đặt môi trường runtime trên Server:
    sudo apt-get update
    sudo apt-get install -y nodejs npm mysql-server
    
  2. Bước 2: Nhập cấu trúc cơ sở dữ liệu:
    mysql -u root -p mangxahoitrungtam < database_schema.sql
    
  3. Bước 3: Cài đặt các gói phụ thuộc qua NPM:
    npm install express@3.x mysql
    
  4. Bước 4: Khởi chạy tiến trình máy chủ với công cụ quản lý tiến trình nền (Forever / PM2):
    npm start
    

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

Hạn chế kỹ thuật

  • Bảo mật cơ sở dữ liệu: Mật khẩu tài khoản trong bảng trungtam đang lưu trữ dạng chuỗi văn bản (plain text), chưa áp dụng các thuật toán băm (hashing) bảo mật cao như bcrypt hay PBKDF2.
  • Cơ chế xác thực (Authentication): Chưa tích hợp xác thực dạng Token không trạng thái (JSON Web Tokens - JWT) hoặc OAuth 2.0.
  • Kiến trúc dữ liệu: Xử lý kết nối MySQL qua phương thức đơn lẻ, chưa thiết lập Connection Pool để tối ưu hóa việc tái sử dụng kết nối khi lượng truy cập tăng vọt.

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

  1. Phát triển ứng dụng di động (Mobile App): Xây dựng ứng dụng Hybrid hoặc Native trên nền tảng Android và iOS nhằm gửi thông báo đẩy (Push Notifications) khi có trường hợp trẻ cần cứu trợ khẩn cấp.
  2. Tích hợp cổng quyên góp trực tuyến: Kết nối API các cổng thanh toán điện tử (VNPay, MoMo, PayPal) phục vụ việc nhận tài trợ học bổng minh bạch theo thời gian thực.
  3. Mở rộng phạm vi địa lý: Nhân rộng mô hình dữ liệu cho toàn bộ các tỉnh thành khu vực miền Trung và trên quy mô toàn quốc.
  4. Tối ưu hóa bảo mật và phân quyền: Nâng cấp hệ thống phân quyền nhiều cấp (Super Admin, Ban giám đốc Trung tâm, Nhà hảo tâm, Người tìm kiếm) và mã hóa toàn bộ dữ liệu nhạy cảm.

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

                              CÁC NHÓM ĐỐI TƯỢNG HƯỞNG LỢI
  ┌───────────────────────┬───────────────────────┬───────────────────────┐
  │      SINH VIÊN &      │      CÁC TRUNG TÂM    │      NHÀ HẢO TÂM      │
  │     LẬP TRÌNH VIÊN    │        BẢO TRỢ        │      & CỘNG ĐỒNG      │
  │ • Học hỏi kiến trúc   │ • Có kênh truyền thông│ • Tìm kiếm thông tin  │
  │   Node.js Fullstack   │   chính thức, kết nối │   minh bạch, trao     │
  │ • Nắm vững xử lý AJAX │   nguồn tài trợ       │   học bổng đúng đối   │
  │   & Single Page Web   │ • Quản lý hồ sơ trẻ   │   tượng, tìm trẻ lạc  │
  └───────────────────────┴───────────────────────┴───────────────────────┘
  • Sinh viên & Lập trình viên:
    • Tiếp cận tài liệu tham khảo thực tế về việc áp dụng kiến trúc Non-Blocking I/O của Node.js vào các bài toán xã hội.
    • Nắm vững kỹ thuật kết hợp Client-Side Templating (Handlebars.js) với RESTful API phía máy chủ Express.
  • Các trung tâm nuôi dạy trẻ mồ côi:
    • Giảm thiểu 60% chi phí và nhân lực dành cho công tác truyền thông, quản lý hồ sơ và tìm kiếm nguồn tài trợ.
    • Tăng mức độ nhận diện của trung tâm đối với các tổ chức thiện nguyện trong và ngoài nước.
  • Cộng đồng và các nhà hảo tâm:
    • Tiết kiệm 80% thời gian xác minh và tìm kiếm địa chỉ trung tâm thông qua bản đồ số Google Maps.
    • Đảm bảo các khoản hỗ trợ, học bổng đến đúng tay những đối tượng trẻ có hoàn cảnh khó khăn nhất.

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

1. Yêu cầu kỹ thuật tối thiểu để triển khai ứng dụng trên máy chủ là gì?

Hệ thống yêu cầu máy chủ cài đặt Node.js runtime (phiên bản từ v0.10 trở lên), trình quản lý gói NPM, máy chủ cơ sở dữ liệu MySQL 5.5+ và mở các cổng mạng tương ứng (mặc định Port 9000/9001). Cấu hình phần cứng tối thiểu chỉ cần 1 Core CPU và 1GB RAM.

2. Khả năng mở rộng (Scalability) của hệ thống khi có hàng nghìn lượt truy cập đồng thời ra sao?

Nhờ mô hình xử lý Non-Blocking I/O đơn luồng hướng sự kiện của Node.js, hệ thống có thể xử lý hàng nghìn kết nối đồng thời với mức chiếm dụng bộ nhớ thấp. Khi cần mở rộng quy mô lớn hơn, lập trình viên có thể áp dụng mô hình Cluster Mode trong Node.js để tận dụng toàn bộ số nhân CPU hoặc đặt hệ thống phía sau một Reverse Proxy (như Nginx).

3. Làm thế nào để tích hợp thêm các trung tâm mồ côi ở các tỉnh thành khác ngoài Đà Nẵng?

Cấu trúc cơ sở dữ liệu đã được thiết kế mở. Quản trị viên chỉ cần thêm bản ghi mới vào bảng trungtam với các thuộc tính địa chỉ cụ thể và cập nhật cặp tọa độ địa lý tương ứng (lat, lng). Bản đồ Google Maps trên giao diện sẽ tự động cập nhật và phân bổ Marker mới mà không cần can thiệp vào mã nguồn logic.

4. Chi phí vận hành và bảo trì hệ thống hàng tháng ước tính bao nhiêu?

Toàn bộ ngăn xếp công nghệ (Node.js, Express, MySQL, jQuery, Bootstrap, Handlebars) đều là các giải pháp mã nguồn mở hoàn toàn miễn phí. Chi phí duy nhất là tiền thuê máy chủ ảo (VPS) cơ bản, ước tính khoảng 100.000 – 200.000 VNĐ/tháng.

5. Dữ liệu hình ảnh và hồ sơ của trẻ được lưu trữ và bảo vệ như thế nào?

Hình ảnh được lưu trữ trong thư mục tài nguyên tĩnh trên máy chủ (images/upload/), đường dẫn file được lưu trong CSDL. Quyền chỉnh sửa hồ sơ trẻ em được phân lập nghiêm ngặt: chỉ tài khoản đã đăng nhập của chính trung tâm quản lý trẻ đó mới có quyền thực thi thao tác cập nhật hoặc xóa thông tin.


Kết luận

Đồ án tốt nghiệp "Xây dựng ứng dụng mạng xã hội cho các trung tâm nuôi dạy trẻ mồ côi tại Đà Nẵng" do sinh viên Nguyễn Thị Thúy Phượng thực hiện dưới sự hướng dẫn của Th.S Ngô Đình Thưở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ỉ giải quyết một bài toán xã hội mang đậm tính nhân văn sâu sắc – thu hẹp khoảng cách giữa những mảnh đời bất hạnh và cộng đồng thiện nguyện – mà còn khẳng định tính khả thi của việc ứng dụng các công nghệ Web hiện đại (Node.js, Express, MySQL, Google Maps API, Handlebars.js). Với kiến trúc hệ thống module hóa, khả năng mở rộng cao và giao diện thân thiện, đề tài tạo tiền đề vững chắc cho việc phát triển một hệ sinh thái an sinh xã hội toàn diện trên quy mô quốc gia trong tương lai.