Giới thiệu dự án

Chăm sóc sức khỏe thai kỳ là một trong những giai đoạn quan trọng nhất đối với phụ nữ, đòi hỏi sự theo dõi liên tục về cả chỉ số sinh trắc học lẫn tâm lý. Theo báo cáo từ Tổ chức Y tế Thế giới (WHO) năm 2023, hơn 65% phụ nữ mang thai lần đầu gặp trở ngại tâm lý và lúng túng khi quản lý hồ sơ khám thai định kỳ, đồng thời dễ tiếp cận các luồng kiến thức thiếu kiểm chứng trên không gian mạng.

Vấn đề cốt lõi (Problem Statement) nằm ở sự phân mảnh thông tin: các ứng dụng hiện hành thường tách biệt giữa công cụ theo dõi y tế, tài liệu dinh dưỡng và nền tảng tương tác cộng đồng, gây khó khăn cho sản phụ trong việc quản lý dữ liệu thai kỳ tập trung. Đề tài khóa luận tốt nghiệp kỹ sư Công nghệ Thông tin tại Trường Đại học Sư phạm Kỹ thuật TP.HCM (HCMUTE), do sinh viên Phan Phạm Nghĩa và Mai Bảo Long thực hiện dưới sự hướng dẫn của ThS. Nguyễn Thủy An, đã giải quyết bài toán này thông qua việc xây dựng hệ sinh thái ứng dụng di động "Chăm sóc sức khỏe bà bầu".

Mục tiêu cụ thể của dự án:

  1. Xây dựng ứng dụng Android Native hiệu năng cao sử dụng ngôn ngữ Kotlin, cung cấp giao diện trực quan và tối ưu trải nghiệm người dùng (UX/UI).
  2. Thiết kế hệ thống Backend RESTful API vững chắc với Java Spring Boot, tích hợp cơ chế xác thực phân quyền chuẩn OAuth2/JWT và cơ sở dữ liệu MongoDB Atlas.
  3. Tích hợp trợ lý ảo AI (OpenAI ChatGPT-3.5) để tư vấn y tế sơ bộ theo thời gian thực và tự động giải đáp thắc mắc 24/7.
  4. Phát triển phân hệ phân tích chỉ số sổ khám thai (Maternal & Fetal Biometrics Analyzer), số hóa dữ liệu siêu âm, cân nặng và huyết áp.
  5. Triển khai mạng xã hội thu nhỏ và tính năng nhắn tin tức thời hỗ trợ kết nối, chia sẻ kinh nghiệm giữa các mẹ bầu qua giao thức Socket.IO và Firebase.

Phạm vi đề tài tập trung vào nền tảng Android (SDK 26 đến 34), phục vụ sản phụ trong chu kỳ 40 tuần thai kỳ và 3 tháng đầu sau sinh.


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ị trường cho thấy các giải pháp hiện hành trên Google Play Store tồn tại nhiều khoảng trống về tính năng và trải nghiệm bản địa hóa:

Tiêu chí BabyCenter Flo Tracker Ứng dụng đề tài (Maternity Care)
Công nghệ nền tảng Hybrid (React Native) Native iOS/Android Native Kotlin + Spring Boot
Phân tích sổ khám thai Thủ công, không cảnh báo Giới hạn theo dõi chu kỳ Tự động vẽ biểu đồ & cảnh báo chỉ số
Tích hợp Trợ lý ảo AI Không hỗ trợ (Chatbot FAQ tĩnh) Chatbot Rule-based OpenAI GPT-3.5 Turbo tương tác ngữ cảnh
Tương tác Realtime Diễn đàn tĩnh (Webview) Nhóm kín có trả phí Mạng xã hội + Story 24h + Chat Realtime
Chi phí sử dụng Miễn phí (Quảng cáo nhiều) Subscription ($39.99/năm) Hoàn toàn miễn phí, không quảng cáo rác

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

  • Must have: Xác thực người dùng (JWT/Spring Security), Theo dõi phát triển tuần thai, Quản lý & vẽ biểu đồ sổ khám thai, Chatbot AI GPT-3.5, Nhật ký thai kỳ (CRUD).
  • Should have: Mạng xã hội nội bộ (Post, Reaction, Comment), Đăng tải Story 24h tự hủy, Nhắn tin thời gian thực qua WebSocket/Socket.IO.
  • Could have: Tích hợp đồng bộ dữ liệu đám mây MongoDB Atlas đa vùng, Gửi thông báo đẩy qua Firebase Cloud Messaging (FCM).
  • Won't have: Đặt lịch khám trực tiếp với bệnh viện liên kết (định hướng phiên bản 2.0).

Thiết kế hệ thống

Hệ thống được thiết kế theo kiến trúc Microservices-ready Client-Server, phân tách rõ ràng giữa Mobile Client và Backend API Gateway:

+--------------------------------------------------------------------+
|                         Android Client (Kotlin)                    |
|           [MVVM Architecture | Retrofit2 | Coroutines | OkHttp]    |
+---------------------------------+----------------------------------+
                                  | HTTPS / WSS
+---------------------------------v----------------------------------+
|                    Spring Boot API Gateway & Services              |
|  +----------------------+ +-------------------+ +---------------+  |
|  | Spring Security (JWT)| | Socket.IO Server  | | OpenAI Client |  |
|  +----------------------+ +-------------------+ +---------------+  |
|  +----------------------+ +-------------------+ +---------------+  |
|  | Pregnancy Service    | | Social Service    | | Media Service |  |
|  +----------------------+ +-------------------+ +---------------+  |
+---------------------------------+----------------------------------+
                                  |
            +---------------------+---------------------+
            |                                           |
+-----------v------------+                 +------------v------------+
| MongoDB Atlas Database |                 | Firebase / Cloudinary   |
| (Collections: Users,   |                 | (Realtime Messaging &   |
|  HealthRecords, Posts) |                 |  Media File Storage)    |
+------------------------+                 +-------------------------+

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

  • Client: Android SDK 34, Kotlin v1.9.22, Jetpack ViewBinding, Android Coroutines v1.7.3, Retrofit v2.9.0, MPAndroidChart v3.1.0 (vẽ biểu đồ sức khỏe).
  • Backend: Java 17 LTS, Spring Boot v3.2.3, Spring Security v6.2.2, Spring Data MongoDB, JJWT v0.11.5, Socket.IO Client/Engine.
  • Database & Cloud: MongoDB Atlas v6.0 (Replica Set), Heroku Cloud PaaS, Cloudinary CDN (quản lý hình ảnh đa phương tiện).

Thiết kế Database Schema (MongoDB Document Collections):

// Collection: HealthRecords
{
  "_id": {"$oid": "664f1a2e8c1a2b001f3e9a11"},
  "userId": "664f19bc8c1a2b001f3e9a05",
  "weekNumber": 24,
  "maternalWeight": 58.5,
  "bloodPressureSystolic": 115,
  "bloodPressureDiastolic": 75,
  "fetalHeartRate": 142,
  "fundalHeight": 22.0,
  "ultrasoundNotes": "Chỉ số hình thái học bình thường, thai nhi phát triển tốt",
  "examinationDate": {"$date": "2024-05-15T08:30:00.000Z"},
  "createdAt": {"$date": "2024-05-15T09:00:00.000Z"}
}
// Collection: SocialPosts
{
  "_id": {"$oid": "664f201e8c1a2b001f3e9b42"},
  "authorId": "664f19bc8c1a2b001f3e9a05",
  "content": "Tuần thứ 24 bé bắt đầu máy nhiều hơn rồi các mẹ ơi!",
  "mediaUrls": ["https://res.cloudinary.com/maternity/image/upload/v1/baby_24w.jpg"],
  "likes": ["664f19bc8c1a2b001f3e9a06", "664f19bc8c1a2b001f3e9a07"],
  "commentsCount": 12,
  "createdAt": {"$date": "2024-05-16T02:15:00.000Z"}
}

Đặc tả API Endpoints chính:

  • POST /api/v1/auth/login: Xác thực tài khoản, trả về JWT Access Token (hạn 24h).
  • GET /api/v1/pregnancy/tracking/{currentWeek}: Truy xuất dữ liệu phát triển thai nhi, gợi ý dinh dưỡng tương ứng tuần thai.
  • POST /api/v1/health-records: Lưu dữ liệu khám thai, tự động tính toán sai lệch so với chỉ số tiêu chuẩn.
  • POST /api/v1/ai/chat: Gửi prompt kèm ngữ cảnh tuần thai tới ChatGPT-3.5 API, phản hồi streaming format.

Methodology

Quy trình phát triển áp dụng mô hình Agile/Scrum kết hợp hệ thống tự động hóa CI/CD trong 15 tuần:

  • Tuần 1 - Tuần 2: Phân tích yêu cầu, khảo sát người dùng thực tế, thiết lập tài liệu SRS và cấu trúc kiến trúc tổng thể.
  • Tuần 3 - Tuần 4: Thiết kế Database Schema trên MongoDB Compass, dựng Wireframe & UI/UX Design trên Figma.
  • Tuần 5 - Tuần 10: Phát triển API Backend (Spring Boot), lập trình module Client (Kotlin), kết nối OpenAI API.
  • Tuần 11 - Tuần 13: Tích hợp Socket.IO Realtime, triển khai Cloud Hosting Heroku, viết kịch bản Unit Test/Integration Test.
  • Tuần 14 - Tuần 15: Kiểm thử chấp nhận người dùng (UAT), tối ưu hóa hiệu năng APK, đóng gói và nghiệm thu đồ án.

Implementation và kết quả

Development process

Quá trình xây dựng ứng dụng tuân thủ các chuẩn lập trình sạch (Clean Code), áp dụng Repository Pattern và Dependency Injection (Spring IoC trên Server và Hilt/Koin trên Android).

1. Xử lý logic thuật ngữ phân tích chỉ số y tế thai kỳ (Kotlin):

data class HealthStatus(val status: String, val warningLevel: Int, val advice: String)

class PregnancyMetricAnalyzer {
    fun evaluateMaternalMetrics(week: Int, weightGain: Double, systolicBp: Int): HealthStatus {
        // Chuẩn cân nặng tăng trung bình: 0.4kg/tuần trong tam cá nguyệt 2 & 3
        val expectedMinGain = if (week > 12) (week - 12) * 0.35 else 1.0
        val expectedMaxGain = if (week > 12) (week - 12) * 0.55 else 2.5
        
        return when {
            systolicBp >= 140 -> HealthStatus("Huyết áp cao - Cảnh báo tiền sản giật", 3, "Cần gặp bác sĩ chuyên khoa ngay lập tức")
            weightGain < expectedMinGain -> HealthStatus("Tăng cân chậm", 1, "Bổ sung thêm đạm, vi chất và vitamin tổng hợp")
            weightGain > expectedMaxGain -> HealthStatus("Tăng cân quá nhanh", 2, "Kiểm tra nguy cơ đái tháo đường thai kỳ")
            else -> HealthStatus("Chỉ số bình thường", 0, "Tiếp tục duy trì chế độ sinh hoạt hiện tại")
        }
    }
}

2. Bộ lọc xác thực bảo mật JWT Filter (Java Spring Boot):

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
    @Autowired
    private JwtTokenProvider tokenProvider;
    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        try {
            String jwt = getJwtFromRequest(request);
            if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) {
                String userId = tokenProvider.getUserIdFromJWT(jwt);
                UserDetails userDetails = customUserDetailsService.loadUserById(userId);
                UsernamePasswordAuthenticationToken authentication = 
                    new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        } catch (Exception ex) {
            logger.error("Không thể thiết lập xác thực người dùng trong security context", ex);
        }
        filterChain.doFilter(request, response);
    }
}

Testing và validation

Hệ thống trải qua 3 vòng kiểm thử nghiêm ngặt:

  1. Unit Testing & Integration Testing: Sử dụng JUnit 5, Mockito trên Backend và MockK trên Android Client, đạt độ bao phủ code (Code Coverage) 84.6%.
  2. Stress Testing (Postman + JMeter): Đo lường khả năng chịu tải của Backend Spring Boot khi triển khai trên dyno Heroku:
    • Throughput: 450 requests/second với độ trễ phản hồi trung bình (Average Latency) 118ms.
    • Tỷ lệ lỗi (Error Rate): 0.02% trong điều kiện 500 kết nối đồng thời (Concurrent Connections).
  3. User Acceptance Testing (UAT): Thử nghiệm thực tế với 25 phụ nữ mang thai trong độ tuổi 22 - 35 tại TP.HCM trong 10 ngày. Kết quả thu được:
    • 96% người dùng đánh giá giao diện thân thiện, dễ theo dõi tiến trình thai.
    • Thời gian khởi động ứng dụng trung bình (Cold Start): 1.24 giây.

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

  1. Ứng dụng Trí tuệ nhân tạo (AI Integration): Khác với các ứng dụng thông thường sử dụng hệ thống câu hỏi soạn sẵn (Hard-coded FAQ), đồ án tích hợp mô hình ngôn ngữ lớn (OpenAI GPT-3.5 API) với kỹ thuật Prompt Chaining gắn kèm dữ liệu tuần thai thực tế của người dùng, đưa ra lời khuyên cá nhân hóa chính xác và an toàn.
  2. Cơ chế số hóa sổ khám thai thông minh: Chuyển đổi dữ liệu thăm khám lâm sàng phân tán thành biểu đồ tăng trưởng trực quan (Interactive Growth Charts), giúp bà bầu phát hiện sớm dấu hiệu bất thường về cân nặng và huyết áp.
  3. Mạng xã hội Realtime chuyên biệt: Xây dựng không gian giao lưu thu nhỏ với tính năng Story 24h tự hủy bằng cấu trúc TTL Index trong MongoDB, tối ưu hóa dung lượng lưu trữ đám mây và nâng cao tương tác cộng đồng.

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

Hướng dẫn triển khai (Deployment Guide)

Bước 1: Thiết lập môi trường Backend

  • Yêu cầu: JDK 17, Maven 3.8+, MongoDB Atlas Cluster URI.
  • Cấu hình file application.yml:
    spring:
      data:
        mongodb:
          uri: mongodb+srv://<username>:<password>@cluster0.maternity.mongodb.net/maternity_db
    app:
      jwtSecret: 9a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7
      jwtExpirationInMs: 86400000
      openai:
        apiKey: sk-proj-xxxxxxxxxxxxxxxxxxxxxxxx
    
  • Build và chạy Server:
    mvn clean package -DskipTests
    java -jar target/maternity-care-backend-0.0.1-SNAPSHOT.jar
    

Bước 2: Thiết lập Client Android

  • Mở source code trên Android Studio Hedgehog (2023.1.1+).
  • Cập nhật BASE_URL trong file RetrofitClient.kt trỏ về domain Server API.
  • Thực hiện Build APK: Build > Build Bundle(s) / APK(s) > Build APK(s).

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

  • Hạn chế: Khả năng phân tích hình ảnh phiếu siêu âm tự động bằng OCR/Computer Vision chưa được tích hợp do giới hạn thời gian 15 tuần; ứng dụng hiện tại phụ thuộc vào kết nối Internet liên tục để đồng bộ hóa dữ liệu.
  • Hướng phát triển:
    1. Tích hợp mô hình OCR (Optical Character Recognition) nhận diện tự động chỉ số phiếu siêu âm từ ảnh chụp camera.
    2. Bổ sung tính năng hoạt động Offline-first với cơ sở dữ liệu cục bộ Room Database trên Android.
    3. Mở rộng tính năng theo dõi sức khỏe trẻ sơ sinh (Baby Care Tracker) trong 12 tháng đầu đời.

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

  • Sinh viên & Kỹ sư phần mềm: Nguồn tài liệu tham khảo thực tế về việc kết hợp Android Kotlin, Spring Boot và MongoDB theo kiến trúc Clean Architecture.
  • Cộng đồng mẹ bầu & Gia đình: Công cụ số hóa theo dõi thai kỳ khoa học, hoàn toàn miễn phí, hỗ trợ giảm bớt áp lực tâm lý trong suốt 40 tuần thai.
  • Các phòng khám & Cơ sở y tế: Cung cấp góc nhìn về giải pháp chuyển đổi số trong quản lý hồ sơ khám thai cá nhân ngoại trú.

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

  1. Ứng dụng có yêu cầu phần cứng thiết bị di động cấu hình cao không?
    Ứng dụng hoạt động mượt mà trên tất cả các dòng máy Android chạy hệ điều hành từ Android 8.0 (API level 26) trở lên, dung lượng RAM tối thiểu chỉ từ 2GB.

  2. Dữ liệu sức khỏe của người dùng có được bảo mật không?
    Toàn bộ thông tin cá nhân và chỉ số khám bệnh được mã hóa đầu cuối bằng chuẩn AES-256 trên MongoDB Atlas và xác thực qua token chuẩn JWT, ngăn chặn hoàn toàn nguy cơ rò rỉ dữ liệu.

  3. Lời khuyên từ Trợ lý AI có thay thế được bác sĩ không?
    Không. Trợ lý AI ChatGPT trong ứng dụng được thiết lập với vai trò tư vấn thông tin và giải đáp thắc mắc cơ bản. Các trường hợp có chỉ số bất thường đều được hệ thống cảnh báo rõ ràng yêu cầu đến bệnh viện chuyên khoa.

  4. Hệ thống xử lý thế nào khi có hàng nghìn người dùng cùng truy cập?
    Backend Spring Boot được thiết kế phi trạng thái (Stateless), dễ dàng mở rộng chiều ngang (Horizontal Scaling) trên các cụm Container Docker kết hợp cơ chế Connection Pooling của MongoDB.

  5. Chi phí vận hành hệ sinh thái này là bao nhiêu?
    Với kiến trúc tối ưu tài nguyên, chi phí vận hành ở quy mô 5.000 người dùng hoạt động hàng tháng (MAU) ước tính dưới $35/tháng (gồm MongoDB Atlas Shared Cluster, Cloudinary Free Tier và OpenAI API).


Kết luận

Đề tài "Xây dựng ứng dụng di động Chăm sóc sức khỏe bà bầu" của nhóm sinh viên Phan Phạm Nghĩa và Mai Bảo Long đã hoàn thành xuất sắc các mục tiêu đề ra cả về mặt học thuật lẫn ứng dụng thực tiễn. Bằng việc kết hợp hài hòa giữa Android Kotlin hiện đại, kiến trúc Backend Java Spring Boot mạnh mẽ và Trí tuệ nhân tạo, sản phẩm mang lại giải pháp công nghệ toàn diện, đóng góp thiết thực vào việc nâng cao chất lượng chăm sóc sức khỏe sinh sản cho cộng đồng.