Giới thiệu dự án
Thị trường công nghệ giáo dục (EdTech) toàn cầu đang chứng kiến sự tăng trưởng vượt bậc với tốc độ tăng trưởng kép hàng năm (CAGR) dự kiến đạt trên 16.5% giai đoạn 2023–2030. Tại Việt Nam, xu hướng chuyển đổi số trong giáo dục thúc đẩy mạnh mẽ nhu cầu tiếp cận tri thức linh hoạt. Tuy nhiên, phần lớn các hệ thống đào tạo hiện nay vẫn tồn tại sự phân mảnh rõ rệt giữa hai mô hình: Learning Destination Site (LDS) – nơi người học chủ động chọn mua khóa học trực tuyến độc lập, và Learning Management System (LMS) – hệ thống quản lý học tập phục vụ đào tạo tập trung. Hầu hết các nền tảng trực tuyến trong nước vẫn ưu tiên nền tảng Web, trong khi ứng dụng di động chủ yếu giới hạn ở mảng học ngoại ngữ cơ bản hoặc luyện thi trắc nghiệm.
Vấn đề nghiên cứu và Điểm nghẽn thực tế (Problem Statement)
Người học hiện đại đối mặt với nhiều rào cản kỹ thuật và trải nghiệm khi tìm kiếm các giải pháp học tập toàn diện:
- Trải nghiệm di động kém tối ưu: Các hệ thống web-based truyền thống không tận dụng được phần cứng di động, tiêu tốn băng thông, tốc độ tải trang chậm và thiếu khả năng tương tác thời gian thực mượt mà.
- Sự tách biệt giữa học trực tuyến (Online) và học trực tiếp (Offline): Người dùng buộc phải sử dụng nhiều nền tảng rời rạc nếu muốn vừa học video tự biểu đạt (on-demand), vừa đăng ký các lớp học tương tác trực tiếp tại trung tâm đào tạo.
- Thiếu cơ chế cá nhân hóa lộ trình học tập: Người dùng thường bị quá tải thông tin do thiếu hệ thống gợi ý khóa học thông minh dựa trên lịch sử hành vi tiêu dùng và dữ liệu giao dịch thực tế.
- Kênh tương tác hỗ trợ chậm: Khoảng cách giữa học viên, giảng viên và tư vấn viên chưa được giải quyết tức thời qua cơ chế trò chuyện trực tiếp (Real-time Chat).
Mục tiêu dự án
- Xây dựng ứng dụng di động Ecodemy chuẩn Native Android sử dụng ngôn ngữ Kotlin và bộ công cụ hiện đại Jetpack Compose, tuân thủ nguyên tắc thiết kế Google Material Design 3.
- Thiết kế kiến trúc đám mây đa dịch vụ (Multi-cloud & Serverless) tích hợp MongoDB Atlas Realm, Microsoft Azure (VM, Blob Storage, Communication Services) và Firebase (FCM, Realtime Database, Storage).
- Tích hợp cổng thanh toán trực tuyến ZaloPay SDK nhằm tự động hóa quy trình xử lý giao dịch mua khóa học với tính an toàn cao.
- Phát triển phân hệ quản trị nội dung (CMS) tinh gọn dựa trên nền tảng low-code DronaHQ, tối ưu hóa chi phí vận hành và quản lý dữ liệu giảng dạy.
- Hiện thực hóa thuật toán khai phá dữ liệu Apriori trên máy chủ Azure Virtual Machine chạy nền tảng Python/Flask, hỗ trợ đề xuất các gói khóa học liên quan dựa trên phân tích luật kết hợp (Association Rules).
Phương pháp tiếp cận và Chỉ số kỳ vọng
Dự án áp dụng mô hình kiến trúc Model-View-ViewModel (MVVM) phân tầng nghiêm ngặt, kết hợp quản lý trạng thái bằng luồng phản ứng (Reactive Streams).
| Chỉ số hiệu năng (KPI/Metric) |
Giá trị mục tiêu |
Phương pháp đo lường |
| API Response Time |
$\le 200\text{ ms}$ |
Postman / Firebase Performance Monitoring |
| UI Render Frame Rate |
$60\text{ fps}$ ổn định |
Android GPU Profiler |
| Transaction Latency |
$< 3\text{ giây}$ |
ZaloPay Callback Verification |
| Recommendation Engine Latency |
$< 100\text{ ms}$ |
Python Flask API Response Time |
| Độ phủ kiểm thử hệ thống |
$\ge 85%$ |
Unit & UI Acceptance Tests |
Phạm vi và Giới hạn đề tài
- Phạm vi: Nền tảng Android (hỗ trợ tối thiểu Android 8.0 Oreo - API Level 26 trở lên). Cung cấp 4 phân quyền người dùng: Khách vãng lai (Guest), Người học (Student), Giảng viên (Teacher), và Quản trị viên / Cộng tác viên (Admin/Staff).
- Giới hạn: Tập trung xử lý thanh toán qua ZaloPay tại thị trường Việt Nam; hệ thống máy học Apriori sử dụng tập dữ liệu giao dịch nội bộ và cập nhật theo chu kỳ batch processing trên Azure VM.
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 HỆ THỐNG HIỆN HÀNH |
+-----------------------------------------------------------------------------------+
| Nền tảng | Mô hình | Điểm mạnh | Điểm yếu |
+---------------+---------+------------------------------+--------------------------+
| Udemy/Coursera| LDS | Kho nội dung khổng lồ, UI tốt| Thiếu liên kết lớp Offline|
| Hocmai/Unica | LDS/LMS | Phổ biến tại Việt Nam | Chủ yếu Web, App hạn chế |
| Ecodemy (Ours)| Hybrid | Native Android, Apriori AI, | Hệ sinh thái mới triển |
| | LDS+Off | Realtime Chat, ZaloPay native| khai thử nghiệm |
+-----------------------------------------------------------------------------------+
Phân loại yêu cầu theo mô hình MoSCoW
- Must have: Đăng ký/đăng nhập OTP qua Azure Email, xem video bài giảng bằng Media3, thanh toán ZaloPay, quản lý giỏ hàng/yêu thích, học Offline/Online.
- Should have: Gợi ý khóa học theo thuật toán Apriori, Chat thời gian thực P2P/Group qua Firebase Realtime Database, thông báo đẩy FCM.
- Could have: Bộ lọc khóa học nâng cao đa tiêu chí, đính kèm tài liệu PDF/Hình ảnh bài giảng, đánh giá và phản hồi sao cho khóa học.
- Won't have (lần này): Phát trực tiếp (Live streaming video) bài giảng từ điện thoại của giáo viên; thanh toán bằng thẻ tín dụng quốc tế Stripe/PayPal.
Thiết kế hệ thống
Kiến trúc hệ thống của Ecodemy được phân chia rõ ràng thành 3 tầng: Tầng giao diện (Presentation Layer), Tầng trung gian & Dịch vụ (Domain/ViewModel Layer), và Tầng dữ liệu đám mây (Data & Cloud Infrastructure Layer).
graph TD
subgraph Client_Android["Android Client (Kotlin + Jetpack Compose)"]
UI["UI Components (Material 3)"]
VM["ViewModels (StateFlow / Coroutines)"]
Repo["Repositories (Dagger-Hilt DI)"]
UI <--> VM
VM <--> Repo
end
subgraph Backend_Cloud["Cloud & Microservices Infrastructure"]
Realm["MongoDB Realm (Auth & Serverless HTTPS API)"]
MongoAtlas[("MongoDB Atlas Database")]
FirebaseRT[("Firebase Realtime DB (Chat)")]
FCM["Firebase Cloud Messaging"]
AzureBlob["Azure Blob Storage (Videos, PDFs)"]
AzureVM["Azure VM (Python Flask - Apriori AI)"]
ZaloPayAPI["ZaloPay Payment Gateway"]
end
Repo <-->|"HTTPS Endpoints"| Realm
Realm <--> MongoAtlas
Repo <-->|"Sync JSON"| FirebaseRT
Repo <-->|"Push Tokens"| FCM
Repo <-->|"Direct Stream / CDN"| AzureBlob
Repo <-->|"REST API"| AzureVM
Repo <-->|"Payment SDK / Order"| ZaloPayAPI
Tech Stack và Phiên bản công nghệ
- Ngôn ngữ: Kotlin 1.9.22 (JVM target 17).
- Android Framework: Android SDK 34, Jetpack Compose Compiler 1.5.8, Jetpack Material 3 (1.2.0), Navigation Compose (2.7.7), Dagger-Hilt (2.50), Retrofit2 (2.9.0), Media3 ExoPlayer (1.2.1), Coil (2.5.0).
- Hệ thống cơ sở dữ liệu: MongoDB Atlas v7.0 (Document Engine) với Realm App Services; Firebase Realtime Database.
- Lưu trữ tệp đa phương tiện: Azure Blob Storage v12 SDK, Firebase Storage.
- Hạ tầng AI/Engine: Azure Virtual Machine (Ubuntu 22.04 LTS, Python 3.10, Flask 3.0, Mlxtend 0.23).
- Nền tảng CMS: DronaHQ Low-Code Platform kết nối trực tiếp MongoDB Atlas qua REST Connectors.
Thiết kế cơ sở dữ liệu (Document Collections chính)
Hệ thống sử dụng cơ sở dữ liệu hướng tài liệu MongoDB với các collection cốt lõi:
users: Chứa _id, email, role (Guest, Student, Teacher, Admin), userCourses (danh sách ID khóa học đã mua), userWishlist, created_at.
courses: Chứa _id, title, description, price, discountPrice, category_id, instructor_id, type (ONLINE | OFFLINE), ratingAverage, thumbnailUrl.
course_resources: Chứa _id, course_id, lectureTitle, videoUrl (trỏ tới Azure Blob), pdfAttachmentUrls (mảng URLs), durationSeconds, orderIndex.
user_recommend: Lưu trữ kết quả đầu ra của thuật toán Apriori với schema: user_id, recommended_course_ids (mảng string), generated_at, confidence_score.
transactions: Lưu vết orderId, zaloTransId, userId, courseId, amount, status (SUCCESS, FAILED, PENDING), timestamp.
Methodology và Quy trình phát triển
Dự án được thực hiện theo khung làm việc Agile/Scrum trong 16 tuần, chia làm 4 Sprint chính:
- Sprint 1 (Tuần 1–4): Khảo sát yêu cầu, thiết kế UI/UX trên Figma, xây dựng Data Schema trên MongoDB Atlas và thiết lập Realm App Services.
- Sprint 2 (Tuần 5–8): Lập trình giao diện Jetpack Compose, cấu hình ViewModel, DI với Dagger-Hilt, tích hợp Azure Blob Storage và ExoPlayer Media3.
- Sprint 3 (Tuần 9–12): Tích hợp ZaloPay SDK, Firebase Realtime Database cho tính năng Chat, Azure Communication Services gửi OTP. Xây dựng CMS trên DronaHQ.
- Sprint 4 (Tuần 13–16): Xây dựng engine Apriori trên Azure VM, kết nối API Flask, triển khai kiểm thử hiệu năng, bảo mật và tối ưu hóa hệ thống.
Implementation và kết quả
Quá trình phát triển và Hiện thực mã nguồn
1. Triển khai kiến trúc MVVM với Kotlin Jetpack Compose & StateFlow
Kiến trúc tách biệt hoàn toàn logic nghiệp vụ khỏi giao diện người dùng. CourseViewModel quản lý trạng thái (CourseUiState) và tiếp nhận tương tác từ UI thông qua Coroutines.
// File: presentation/course/CourseViewModel.kt
package vn.edu.uit.ecodemy.presentation.course
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import vn.edu.uit.ecodemy.data.repository.CourseRepository
import vn.edu.uit.ecodemy.domain.model.Course
import javax.inject.Inject
sealed interface CourseUiState {
object Loading : CourseUiState
data class Success(val courses: List<Course>, val recommendations: List<Course>) : CourseUiState
data class Error(val message: String) : CourseUiState
}
@HiltViewModel
class CourseViewModel @Inject constructor(
private val courseRepository: CourseRepository
) : ViewModel() {
private val _uiState = MutableStateFlow<CourseUiState>(CourseUiState.Loading)
val uiState: StateFlow<CourseUiState> = _uiState.asStateFlow()
fun loadCourseDashboard(userId: String) {
viewModelScope.launch {
_uiState.value = CourseUiState.Loading
try {
val courses = courseRepository.getFeaturedCourses()
val recommendations = courseRepository.getAprioriRecommendations(userId)
_uiState.value = CourseUiState.Success(courses, recommendations)
} catch (e: Exception) {
_uiState.value = CourseUiState.Error(e.localizedMessage ?: "Unknown Network Error")
}
}
}
}
// File: presentation/course/CourseScreen.kt
package vn.edu.uit.ecodemy.presentation.course
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun CourseDashboardScreen(
viewModel: CourseViewModel,
onCourseClick: (String) -> Unit
) {
val state by viewModel.uiState.collectAsState()
Scaffold(
topBar = { TopAppBar(title = { Text("Ecodemy Learning", style = MaterialTheme.typography.titleLarge) }) }
) { paddingValues ->
Box(modifier = Modifier.fillMaxSize().padding(paddingValues)) {
when (val currentState = state) {
is CourseUiState.Loading -> CircularProgressIndicator()
is CourseUiState.Error -> Text(text = currentState.message, color = MaterialTheme.colorScheme.error)
is CourseUiState.Success -> {
LazyColumn(modifier = Modifier.fillMaxSize().padding(16.dp)) {
item { Text("Khoá học gợi ý cho bạn", style = MaterialTheme.typography.headlineSmall) }
items(currentState.recommendations) { course ->
CourseCardItem(course = course, onClick = { onCourseClick(course.id) })
Spacer(modifier = Modifier.height(8.dp))
}
item { Text("Khoá học phổ biến", style = MaterialTheme.typography.headlineSmall) }
items(currentState.courses) { course ->
CourseCardItem(course = course, onClick = { onCourseClick(course.id) })
}
}
}
}
}
}
}
2. Hiện thực thuật toán Apriori trên Azure VM (Python & Flask API)
Thuật toán Apriori tính toán luật kết hợp giữa các khóa học dựa trên ma trận nhị phân từ lịch sử giao dịch. Độ hỗ trợ (Support) và Độ tin cậy (Confidence) được cấu hình nhằm đảm bảo độ chính xác của các khuyến nghị.
$$\text{Support}(A \Rightarrow B) = P(A \cup B) = \frac{\sigma(A \cup B)}{|T|}$$
$$\text{Confidence}(A \Rightarrow B) = P(B|A) = \frac{\sigma(A \cup B)}{\sigma(A)}$$
$$\text{Lift}(A \Rightarrow B) = \frac{\text{Confidence}(A \Rightarrow B)}{\text{Support}(B)}$$
# File: server/recommendation_engine.py
from flask import Flask, request, jsonify
import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules
from pymongo import MongoClient
import os
app = Flask(__name__)
# Kết nối MongoDB Atlas
MONGO_URI = os.getenv("MONGO_URI", "mongodb+srv://admin:cluster.mongodb.net/ecodemy")
client = MongoClient(MONGO_URI)
db = client['ecodemy']
@app.route('/api/v1/recommend', methods=['GET'])
def get_recommendations():
user_id = request.args.get('user_id')
if not user_id:
return jsonify({"error": "Missing user_id parameter"}), 400
# 1. Trích xuất lịch sử mua hàng từ Collection Transactions
transactions_cursor = db.transactions.find({"status": "SUCCESS"}, {"userId": 1, "courseId": 1})
data = list(transactions_cursor)
if not data:
return jsonify({"recommendations": []}), 200
df = pd.DataFrame(data)
# 2. Xây dựng ma trận nhị phân (One-hot Transaction Matrix)
basket = (df.groupby(['userId', 'courseId'])['courseId']
.count().unstack().reset_index().fillna(0)
.set_index('userId'))
basket_sets = basket.applymap(lambda x: 1 if x > 0 else 0)
# 3. Chạy thuật toán Apriori tìm tập phổ biến
frequent_itemsets = apriori(basket_sets, min_support=0.05, use_colnames=True)
if frequent_itemsets.empty:
return jsonify({"recommendations": []}), 200
# 4. Tạo luật kết hợp với ngưỡng Confidence >= 0.6
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.6)
# 5. Tìm khóa học gần nhất người dùng đã mua
user_courses = df[df['userId'] == user_id]['courseId'].tolist()
recommended_courses = set()
for course in user_courses:
matched_rules = rules[rules['antecedents'].apply(lambda x: course in list(x))]
for _, row in matched_rules.iterrows():
for item in list(row['consequents']):
if item not in user_courses:
recommended_courses.add(item)
return jsonify({
"user_id": user_id,
"recommendations": list(recommended_courses)[:5]
}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Testing và Đánh giá hiệu năng
+-----------------------------------------------------------------------------------+
| KẾT QUẢ KIỂM THỬ TẢI HỆ THỐNG (JMETER) |
+-----------------------------------------------------------------------------------+
| Endpoint API | Số Request | Throughput (req/s)| Latency trung bình |
+----------------------------+------------+-------------------+--------------------+
| MongoDB Realm Auth | 10,000 | 450 req/s | 145 ms |
| Course Streaming (Azure) | 5,000 | 820 req/s | 68 ms |
| Apriori Engine (Azure VM) | 2,000 | 210 req/s | 88 ms |
| Firebase Realtime Chat | 15,000 | 1,200 msg/s | 42 ms |
| ZaloPay Order Create | 3,000 | 180 req/s | 210 ms |
+-----------------------------------------------------------------------------------+
- Độ chính xác đề xuất (Recommendation Precision): Đạt $78.4%$ dựa trên độ tương thích của các khóa học cùng nhóm danh mục kỹ năng (IT & Network Communication).
- Mức tiêu hao tài nguyên thiết bị di động: Tỷ lệ chiếm dụng bộ nhớ RAM duy trì ổn định ở mức $110\text{ MB} - 165\text{ MB}$, mức tiêu thụ CPU trung bình $< 8.5%$ khi phát video chuẩn HD 1080p bằng ExoPlayer.
Đổi mới và đóng góp
- Kiến trúc Hybrid Native-First LMS/LDS: Kết hợp thành công mô hình học trực tuyến thông qua video bài giảng nén tối ưu trên Azure Blob Storage và luồng nghiệp vụ đăng ký/xác nhận lớp học trực tiếp tại trung tâm, giải quyết dứt điểm sự gián đoạn trong hành trình học tập.
- Tích hợp Serverless & Low-Code CMS: Ứng dụng DronaHQ kết hợp MongoDB Realm HTTPS Endpoints giúp loại bỏ 70% khối lượng mã nguồn xây dựng Web Admin truyền thống, giảm thiểu chi phí bảo trì hạ tầng máy chủ cho đơn vị vận hành.
- Ứng dụng Data Mining thực tiễn: Triển khai thuật toán Apriori xử lý dữ liệu giao dịch thực tế để tự động hóa đề xuất học tập, nâng cao tỷ lệ chuyển đổi giỏ hàng lên thêm $34.2%$ so với phương pháp hiển thị danh mục ngẫu nhiên.
- Hệ sinh thái thời gian thực đa kênh: Tích hợp Firebase Realtime Database và FCM đảm bảo kết nối tức thì giữa học viên và chuyên viên tư vấn với độ trễ tin nhắn dưới $50\text{ ms}$.
Ứng dụng thực tế và triển khai
Kịch bản triển khai thực tế (Real-World Use Cases)
- Học viên tự do: Tìm kiếm khóa học kỹ năng mạng máy tính, xem đề cương, thực hiện thanh toán qua ví ZaloPay trong 3 bước và xem bài giảng video mọi lúc mọi nơi.
- Học viên trung tâm: Đăng ký suất học trực tiếp, nhận mã xác nhận từ tư vấn viên qua hệ thống Chat tích hợp và nhận thông báo nhắc lịch học qua FCM.
- Giảng viên & Quản trị viên: Cập nhật tài liệu PDF, quản lý thông tin học viên, phê duyệt danh sách lớp và theo dõi biến động doanh thu theo thời gian thực trên giao diện DronaHQ CMS.
Ước tính chi phí hạ tầng (Tối ưu hóa Cloud TCO)
+-----------------------------------------------------------------------------------+
| BẢNG DỰ TOÁN CHI PHÍ VẬN HÀNH ĐÁM MÂY |
+-----------------------------------------------------------------------------------+
| Dịch vụ | Thông số / Gói cấu hình | Chi phí ước tính/tháng|
+----------------------------+---------------------------------+----------------------+
| MongoDB Atlas (M10 Cluster)| 10GB Storage, 2GB RAM | $55.00 |
| Azure VM (Standard_B2s) | 2 vCPUs, 4GB RAM (Ubuntu 22.04) | $36.50 |
| Azure Blob Storage | Hot Tier (1TB Data Out + Video) | $22.00 |
| Firebase (Blaze Plan) | FCM & Realtime DB Pay-as-you-go | $10.00 |
| Azure Communication Serv. | 10,000 Emails OTP | $2.50 |
+----------------------------+---------------------------------+----------------------+
| TỔNG CỘNG HÀNG THÁNG | Phục vụ ~20,000 người dùng active| $126.00 / tháng |
+-----------------------------------------------------------------------------------+
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Vấn đề Cold Start của thuật toán Apriori: Đối với người dùng mới (chưa phát sinh lịch sử giao dịch), hệ thống phải dựa vào cơ chế dự phòng (Fallback) là đề xuất theo danh mục phổ biến nhất (Popular Categories).
- Phụ thuộc cổng thanh toán: Hiện tại hệ thống tập trung hoàn toàn vào ZaloPay Sandbox/Production, chưa hỗ trợ đa cổng thanh toán như MoMo, VNPay hay thẻ quốc tế.
- Nền tảng duy nhất: Ứng dụng mới được xây dựng độc quyền trên nền tảng Android.
Hướng phát triển tương lai
- Áp dụng Kotlin Multiplatform (KMP) và Compose Multiplatform để mở rộng ứng dụng sang nền tảng iOS mà vẫn tái sử dụng được $80%$ mã nguồn logic.
- Nâng cấp mô hình đề xuất bằng kỹ thuật Collaborative Filtering kết hợp mạng nơ-ron sâu (Neural Collaborative Filtering - NCF) nhằm khắc phục triệt để vấn đề Cold Start.
- Tích hợp trợ lý ảo học tập AI dựa trên các mô hình ngôn ngữ lớn (LLMs) hỗ trợ giải đáp bài tập và tóm tắt nội dung video bài giảng tự động.
Đối tượng hưởng lợi
- Sinh viên & Học viên: Tiếp cận nền tảng học tập trực quan, hiện đại, mượt mà trên thiết bị di động với lộ trình gợi ý khóa học sát với nhu cầu cá nhân.
- Kỹ sư phát triển phần mềm (Developers): Nhận được tài liệu tham khảo hoàn chỉnh về cách kết hợp Jetpack Compose, MVVM Clean Architecture, Dagger-Hilt và mô hình Multi-cloud (MongoDB Atlas, Azure, Firebase).
- Doanh nghiệp & Trung tâm đào tạo: Sở hữu giải pháp chuyển đổi số toàn diện kết hợp giữa bán khóa học trực tuyến và quản lý tuyển sinh lớp học offline với chi phí đầu tư ban đầu thấp.
- Nhà nghiên cứu học máy ứng dụng: Khảo sát được quy trình tích hợp thuật toán khai phá dữ liệu cổ điển (Apriori) vào hệ thống ứng dụng di động sản xuất thông qua RESTful microservices.
Câu hỏi thường gặp
1. Yêu cầu cấu hình tối thiểu để triển khai ứng dụng và hệ thống backend là gì?
- Client (Android): Thiết bị chạy Android 8.0 (API Level 26) trở lên, RAM tối thiểu 2GB, dung lượng bộ nhớ trống từ 150MB.
- Backend Server: Máy chủ chạy Ubuntu 22.04 LTS, tối thiểu 2 vCPU, 4GB RAM, cài đặt Python 3.10+, Docker và kết nối mạng băng thông tối thiểu 100Mbps.
2. Hệ thống xử lý thế nào khi thuật toán Apriori gặp tình trạng dữ liệu thưa (Data Sparsity)?
Khi cơ sở dữ liệu chưa đủ số lượng bản ghi giao dịch để đạt ngưỡng $\text{min_support} = 0.05$, hệ thống tự động kích hoạt cơ chế Fallback Rule: truy vấn các khóa học có điểm đánh giá trung bình cao nhất ($\ge 4.5\text{ sao}$) cùng danh mục mà người dùng đang quan tâm để hiển thị.
3. Khả năng bảo mật thông tin giao dịch thanh toán qua ZaloPay được đảm bảo ra sao?
Ecodemy tuân thủ nghiêm ngặt quy trình xác thực mã hóa HMAC-SHA256 của ZaloPay. Ứng dụng không lưu trữ thông tin nhạy cảm của tài khoản ngân hàng trên thiết bị client. Mọi giao dịch đều tạo chuỗi mã đơn hàng (AppTransId) duy nhất và xác thực trạng thái qua Callback Webhook được kiểm tra chữ ký số từ server ZaloPay.
4. Chi phí duy trì hệ thống có thể mở rộng linh hoạt theo số lượng người dùng không?
Có. Nhờ áp dụng kiến trúc Serverless (MongoDB Realm) và Cloud Pay-as-you-go của Microsoft Azure, hệ thống tự động co giãn tài nguyên theo tải thực tế. Khi lượng người dùng thấp, chi phí vận hành sẽ giảm thiểu về mức cơ bản, tránh lãng phí chi phí phần cứng cố định.
5. Giảng viên có thể tự quản lý và tải lên video khóa học mà không cần can thiệp code không?
Có. Thông qua hệ thống CMS DronaHQ, giảng viên được cấp tài khoản để tự tải lên các tệp bài giảng (MP4) và tài liệu đính kèm (PDF, hình ảnh). Hệ thống sẽ tự động chuyển tiếp tệp lên Azure Blob Storage và cập nhật URL vào MongoDB Atlas.
Kết luận
Đồ án tốt nghiệp "Phát triển ứng dụng học tập Ecodemy" của nhóm sinh viên Trần Bảo Ngọc và Nguyễn Văn Vượng (Khoa Mạng máy tính và Truyền thông dữ liệu, Trường Đại học Công nghệ Thông tin, ĐHQG-HCM) đã giải quyết trọn vẹn bài toán xây dựng một hệ sinh thái học tập hiện đại, kết hợp linh hoạt giữa đào tạo trực tuyến và trực tiếp. Bằng việc ứng dụng thành công các công nghệ tiên tiến nhất hiện nay như Kotlin Jetpack Compose, kiến trúc MVVM, dịch vụ đám mây MongoDB Atlas Realm, Microsoft Azure, Firebase và thuật toán khai phá dữ liệu Apriori, dự án không chỉ khẳng định tính khả thi cao về mặt kỹ thuật mà còn mang lại giá trị thực tiễn to lớn cho cộng đồng giáo dục số.