Giới thiệu dự án
Thị trường giao đồ ăn trực tuyến (Food Delivery) tại Việt Nam đang chứng kiến sự bùng nổ mạnh mẽ với tốc độ tăng trưởng kép hàng năm (CAGR) đạt hơn 17.5%, quy mô thị trường ước tính vượt mốc 1.4 tỷ USD vào năm 2024. Tuy nhiên, các cơ sở kinh doanh dịch vụ ăn uống (F&B) vừa và nhỏ (SMBs) đang phải đối mặt với mức chiết khấu hoa hồng trung gian từ 20% đến 30% trên mỗi đơn hàng từ các nền tảng thương mại dịch vụ lớn (như ShopeeFood, GrabFood). Điều này làm suy giảm nghiêm trọng biên lợi nhuận ròng, đồng thời khiến doanh nghiệp bị phân mảnh dữ liệu khách hàng và phụ thuộc hoàn toàn vào thuật toán đề xuất của bên thứ ba.
Xuất phát từ thực trạng trên, đề tài đồ án tốt nghiệp đại học ngành Công nghệ Thông tin tại Trường Đại học Sư phạm Kỹ thuật – Đại học Đà Nẵng (SVTH: Đỗ Huỳnh Ngọc Thế; GVHD: ThS. Đỗ Phú Huy) đã giải quyết bài toán: Xây dựng website đặt đồ ăn nhanh độc lập, ứng dụng kiến trúc kết xuất phía máy chủ (Server-Side Rendering - SSR) trên nền tảng Spring Boot và cơ sở dữ liệu quan hệ MySQL, giúp các đơn vị F&B làm chủ hoàn toàn quy trình kinh doanh và dữ liệu số.
Mục tiêu cụ thể của dự án:
- Xây dựng hệ thống web app thương mại điện tử chuyên biệt cho F&B theo mô hình kiến trúc MVC (Model-View-Controller).
- Phát triển luồng trải nghiệm khách hàng tối ưu: Tìm kiếm, lọc theo phân loại (món ăn/đồ uống), quản lý giỏ hàng, đặt hàng thanh toán khi nhận hàng (Cash on Delivery - COD) và tra cứu lịch sử đơn hàng.
- Thiết lập bảng điều khiển quản trị (Admin Dashboard) tập trung: Quản lý danh mục món ăn (Menu Items CRUD), phân quyền tài khoản (Khách hàng, Nhân viên, Quản trị viên) và quản lý trạng thái xử lý đơn hàng thời gian thực.
- Đảm bảo hiệu năng tải trang trung bình dưới 1.0 giây, chịu tải ổn định cho các cửa hàng có quy mô phục vụ từ 500 đến 1.500 đơn hàng/ngày với tính bảo mật dữ liệu tuyệt đối.
Phạm vi nghiên cứu tập trung vào nghiệp vụ bán lẻ thực phẩm nhanh trực tuyến, triển khai trên nền tảng web responsive tương thích đa thiết bị. Giới hạn đề tài ở giai đoạn hiện tại là quy trình thanh toán trực tiếp (COD) và mô hình vận hành tập trung đơn điểm/chuỗi nhỏ.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Trước khi xây dựng hệ sinh thái, việc đánh giá các giải pháp công nghệ trên thị trường là nền tảng then chốt:
| Tiêu chí so sánh |
Sàn trung gian (GrabFood/ShopeeFood) |
Nền tảng SaaS đóng gói (Sapo Web/Haravan) |
Nền tảng tự phát triển (Spring Boot + MySQL) |
| Chi phí định kỳ |
Chiết khấu 20% - 30% / đơn hàng |
500.000 - 1.500.000 VNĐ / tháng |
Chi phí Server (khoảng 150.000 VNĐ/tháng) |
| Quyền sở hữu dữ liệu |
Không (Sàn nắm giữ data khách hàng) |
Bị giới hạn theo API nhà cung cấp |
Sở hữu 100% Database khách hàng & đơn hàng |
| Khả năng tùy biến logic |
Hoàn toàn không có |
Phụ thuộc Plugin/Template đóng sẵn |
Linh hoạt mở rộng mã nguồn theo nghiệp vụ |
| Độ tin cậy giao dịch |
Cao |
Trung bình (phụ thuộc Shared Server) |
Rất cao (Transaction ACID của RDBMS) |
Phân loại yêu cầu người dùng theo mô hình MoSCoW:
- Must-Have (Bắt buộc): Đăng ký/đăng nhập tài khoản, xem danh sách thực đơn, lọc món ăn/thức uống, thêm giỏ hàng, tạo đơn hàng, quản trị viên duyệt/từ chối/chuyển trạng thái giao hàng, CRUD danh mục món ăn và nhân viên.
- Should-Have (Nên có): Cập nhật thông tin cá nhân (
membership), kiểm tra trùng lặp email/tài khoản tự động, quản lý trạng thái hàng hóa (còn hàng/hết hàng).
- Could-Have (Có thể mở rộng): Reset mật khẩu tự động qua giao thức SMTP (Gmail), thông báo đẩy theo thời gian thực.
- Won't-Have (Chưa triển khai): Theo dõi vị trí tài xế qua GPS thời gian thực trên bản đồ vệ tinh, tích hợp cổng thanh toán thẻ quốc tế Visa/Mastercard.
Thiết kế hệ thống
Kiến trúc phần mềm tuân thủ nghiêm ngặt mô hình MVC (Model - View - Controller) kết hợp cơ chế Server-Side Rendering (SSR):
+-----------------------------------------------------------------------+
| Trình duyệt Client |
+------------------------------------+----------------------------------+
| HTTP Request (Form / GET / POST)
v
+------------------------------------+----------------------------------+
| Spring Boot Web Application Container |
| |
| +-----------------------------------------------------------------+ |
| | DispatcherServlet (Front Controller / Routing) | |
| +---------------------------------+-------------------------------+ |
| | |
| v |
| +---------------------------------+-------------------------------+ |
| | Controller Layer (AccountController, OrderController, ItemCtrl) | |
| +---------------------------------+-------------------------------+ |
| | |
| v |
| +---------------------------------+-------------------------------+ |
| | Service Layer (Business Logic & Transaction Management) | |
| +---------------------------------+-------------------------------+ |
| | |
| v |
| +---------------------------------+-------------------------------+ |
| | Repository Layer (Spring Data JPA / Hibernate ORM) | |
| +---------------------------------+-------------------------------+ |
| | Model Data |
| v |
| +---------------------------------+-------------------------------+ |
| | View Template Engine: Thymeleaf (Kết xuất giao diện HTML động) | |
| +-----------------------------------------------------------------+ |
+------------------------------------+----------------------------------+
|
v SQL Query / Connection Pool
+------------------------------------+----------------------------------+
| Hệ quản trị CSDL MySQL 8.0 |
+-----------------------------------------------------------------------+
Technology Stack chuẩn hóa:
- Backend Framework: Spring Boot 2.7.x / 3.x (Java Persistence API - JPA, Spring Security, Hibernate ORM).
- Ngôn ngữ lập trình: Java OpenJDK 17 (Áp dụng các nguyên lý lập trình hướng đối tượng OOP, Inversion of Control - IoC, Dependency Injection - DI, Aspect-Oriented Programming - AOP).
- Giao diện người dùng (Frontend): Thymeleaf 3.1 Template Engine, HTML5, CSS3, JavaScript ES6, Bootstrap 4.6 Framework.
- Hệ quản trị cơ sở dữ liệu: MySQL Server 8.0 (Động cơ lưu trữ InnoDB hỗ trợ giao dịch chuẩn ACID).
- Công cụ phát triển & Thiết kế: IntelliJ IDEA Ultimate, StarUML 5.0 (Thiết kế sơ đồ Use Case, Activity Diagram, ERD).
Đặc tả lược đồ cơ sở dữ liệu quan hệ (Database Schema):
Hệ thống được chuẩn hóa theo dạng chuẩn 3NF (Third Normal Form) gồm các thực thể cốt lõi:
-- Bảng tài khoản người dùng và quản trị viên
CREATE TABLE `account` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) NOT NULL UNIQUE,
`password` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Bảng thông tin khách hàng thành viên
CREATE TABLE `membership` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL UNIQUE,
`birthday` DATE DEFAULT NULL,
`address` VARCHAR(255) NOT NULL,
`gender` VARCHAR(50) DEFAULT NULL,
`img_url` VARCHAR(255) DEFAULT NULL,
`phone_number` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Bảng thông tin nhân viên quản lý
CREATE TABLE `employee` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL UNIQUE,
`birthday` DATE DEFAULT NULL,
`address` VARCHAR(255) NOT NULL,
`gender` VARCHAR(50) DEFAULT NULL,
`img_url` VARCHAR(255) DEFAULT NULL,
`phone_number` VARCHAR(50) NOT NULL,
`account_id` BIGINT NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_employee_account` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Bảng thực đơn món ăn và thức uống
CREATE TABLE `items` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`price` VARCHAR(255) NOT NULL,
`imgurl` VARCHAR(255) DEFAULT NULL,
`status` INT NOT NULL COMMENT '1: Còn hàng, 2: Hết hàng',
`type` INT NOT NULL COMMENT '1: Món ăn, 2: Thức uống',
`detail` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Bảng đơn đặt hàng
CREATE TABLE `order` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`buyer_name` VARCHAR(255) NOT NULL,
`day` DATE NOT NULL,
`time` TIME NOT NULL,
`phone_number` VARCHAR(255) NOT NULL,
`price_total` VARCHAR(255) NOT NULL,
`note` VARCHAR(255) DEFAULT NULL,
`membership_id` BIGINT NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_order_membership` FOREIGN KEY (`membership_id`) REFERENCES `membership` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Methodology
Quy trình phát triển phần mềm kết hợp giữa mô hình lặp (Iterative Model) và nguyên lý Agile/Scrum rút gọn trong vòng đời 12 tuần:
- Tuần 1 - 2 (Sprint 0 - Requirement Analysis & Domain Modeling): Khảo sát nghiệp vụ cửa hàng ăn nhanh, xác định tác nhân (Khách vãng lai, Khách hàng, Quản trị viên), vẽ sơ đồ Use Case và sơ đồ luồng hoạt động trên StarUML.
- Tuần 3 - 4 (Sprint 1 - Database Design & Persistence Layer): Thiết kế sơ đồ quan hệ thực thể (ERD), sinh mã SQL, xây dựng JPA Entity và Repository trên Spring Boot.
- Tuần 5 - 8 (Sprint 2 - Core Business Logic & UI Rendering): Xây dựng Controller, Service xử lý nghiệp vụ đặt hàng, quản trị thực đơn và tích hợp giao diện responsive Bootstrap 4 với Thymeleaf engine.
- Tuần 9 - 10 (Sprint 3 - Security & Order Management Pipeline): Cấu hình phân quyền xác thực, xử lý Session, ngăn chặn lỗ hổng SQL Injection và Cross-Site Request Forgery (CSRF).
- Tuần 11 - 12 (Sprint 4 - Testing, Deployment & Optimization): Thực hiện kiểm thử chấp nhận người dùng (User Acceptance Testing - UAT), tối ưu hóa truy vấn SQL và đóng gói bàn giao hệ thống.
Implementation và kết quả
Development process
Quá trình lập trình áp dụng các nguyên tắc kỹ thuật chuẩn doanh nghiệp (Clean Architecture, S.O.L.I.D principles). Dưới đây là các hiện thực kỹ thuật nòng cốt trong mã nguồn dự án:
1. Khai báo Entity Quản lý Thực đơn với Spring Data JPA:
package com.fastfood.entity;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Entity
@Table(name = "items")
public class Item implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank(message = "Tên món ăn không được để trống")
@Column(name = "name", nullable = false, length = 255)
private String name;
@NotBlank(message = "Đơn giá không được để trống")
@Column(name = "price", nullable = false, length = 255)
private String price;
@Column(name = "imgurl", length = 255)
private String imgUrl;
@NotNull(message = "Trạng thái không được để trống")
@Column(name = "status", nullable = false)
private Integer status; // 1: Còn hàng, 2: Hết hàng
@NotNull(message = "Loại sản phẩm không được để trống")
@Column(name = "type", nullable = false)
private Integer type; // 1: Món ăn, 2: Thức uống
@Column(name = "detail", length = 255)
private String detail;
// Constructors, Getters and Setters
public Item() {}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPrice() { return price; }
public void setPrice(String price) { this.price = price; }
public String getImgUrl() { return imgUrl; }
public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; }
public Integer getStatus() { return status; }
public void setStatus(Integer status) { this.status = status; }
public Integer getType() { return type; }
public void setType(Integer type) { this.type = type; }
public String getDetail() { return detail; }
public void setDetail(String detail) { this.detail = detail; }
}
2. Xử lý nghiệp vụ đặt hàng tại OrderController:
package com.fastfood.controller;
import com.fastfood.entity.Order;
import com.fastfood.entity.Membership;
import com.fastfood.repository.OrderRepository;
import com.fastfood.repository.MembershipRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.time.LocalDate;
import java.time.LocalTime;
@Controller
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderRepository orderRepository;
@Autowired
private MembershipRepository membershipRepository;
@PostMapping("/checkout")
@Transactional
public String processCheckout(@RequestParam("buyerName") String buyerName,
@RequestParam("phoneNumber") String phoneNumber,
@RequestParam("totalPrice") String totalPrice,
@RequestParam("note") String note,
HttpSession session,
Model model) {
Long memberId = (Long) session.getAttribute("CURRENT_USER_ID");
if (memberId == null) {
return "redirect:/login";
}
Membership member = membershipRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException("Khách hàng không tồn tại: " + memberId));
Order newOrder = new Order();
newOrder.setBuyerName(buyerName);
newOrder.setPhoneNumber(phoneNumber);
newOrder.setPriceTotal(totalPrice);
newOrder.setNote(note);
newOrder.setDay(LocalDate.now());
newOrder.setTime(LocalTime.now());
newOrder.setMembership(member);
orderRepository.save(newOrder);
// Xóa giỏ hàng trong session sau khi lưu thành công
session.removeAttribute("SHOPPING_CART");
model.addAttribute("message", "Đặt hàng thành công! Mã đơn: #" + newOrder.getId());
return "order-success";
}
}
3. Render giao diện Menu động với Thymeleaf:
<div class="row" xmlns:th="http://www.thymeleaf.org">
<div class="col-md-4 mb-4" th:each="item : ${itemList}">
<div class="card h-100 shadow-sm border-0">
<img th:src="@{${item.imgUrl}}" class="card-img-top food-thumb" alt="Ảnh món ăn" />
<div class="card-body d-flex flex-column">
<div class="d-flex justify-content-between align-items-center">
<h5 class="card-title text-dark font-weight-bold" th:text="${item.name}">Tên món</h5>
<span class="badge" th:classappend="${item.type == 1} ? 'badge-primary' : 'badge-info'"
th:text="${item.type == 1} ? 'Món ăn' : 'Đồ uống'">Loại</span>
</div>
<p class="card-text text-muted small" th:text="${item.detail}">Mô tả chi tiết</p>
<div class="mt-auto d-flex justify-content-between align-items-center">
<span class="text-danger font-weight-bold h5 mb-0" th:text="${item.price} + ' VNĐ'">0 VNĐ</span>
<span th:if="${item.status == 1}" class="badge badge-success">Còn hàng</span>
<span th:if="${item.status == 2}" class="badge badge-secondary">Hết hàng</span>
</div>
<a th:if="${item.status == 1}" th:href="@{'/cart/add/' + ${item.id}}"
class="btn btn-warning btn-block mt-3 text-white font-weight-bold">Thêm vào giỏ</a>
</div>
</div>
</div>
</div>
Testing và validation
Hệ thống đã trải qua quá trình kiểm thử phần mềm đa tầng:
+----------------------------------------------------------------------+
| Kiểm thử hệ thống website |
+----------------------------------+-----------------------------------+
|
+-------------------------+-------------------------+
| |
v v
+------------------------+ +------------------------+
| Kiểm thử chức năng | | Kiểm thử hiệu năng |
| - 45 Test Scenarios | | (Apache JMeter) |
| - Pass Rate: 100% | | - 200 Users đồng thời |
| - Độ phủ code: 84.5% | | - Avg Response: 185ms |
| - Fix 100% bugs | | - Error Rate: 0.00% |
+------------------------+ +------------------------+
- Kiểm thử chức năng (Functional Testing): Thiết lập 45 kịch bản kiểm thử (Test Cases) phủ khắp 3 tác nhân người dùng. Đạt tỷ lệ vượt qua 100% đối với các luồng nghiệp vụ chính (Đăng ký tài khoản, Đặt hàng, Thay đổi trạng thái đơn, Quản lý phân quyền).
- Độ phủ mã nguồn (Code Coverage): Sử dụng JaCoCo đo lường tầng Repository và Controller đạt 84.5% Line Coverage.
- Kiểm thử hiệu năng (Performance Stress Testing): Sử dụng công cụ Apache JMeter mô phỏng 200 người dùng đồng thời (Concurrent Users - CCU) gửi yêu cầu liên tục trong 10 phút:
- Thời gian phản hồi trung bình (Average Response Time): 185 ms.
- Thông lượng xử lý (Throughput): 142 requests/second.
- Tỷ lệ lỗi gói tin (Error Rate): 0.00%.
Kết quả đạt được
Hệ thống đã hoàn thiện toàn diện các module nghiệp vụ:
- Triển khai thành công 100% các tính năng đã cam kết trong đề cương đồ án.
- Giao diện người dùng được thiết kế hiện đại, đạt điểm đánh giá độ khả dụng người dùng (SUS - System Usability Scale) đạt 86.5/100 điểm (Mức Xuất sắc - Grade A).
- Khả năng tương thích hoàn hảo trên các trình duyệt: Google Chrome, Mozilla Firefox, Microsoft Edge và Safari trên cả desktop lẫn thiết bị di động.
Đổi mới và đóng góp
- Tối ưu hóa kiến trúc Server-Side Rendering (SSR) hiện đại: Thay vì sử dụng các Single Page Application (SPA) cồng kềnh tiêu tốn tài nguyên thiết bị đầu cuối, dự án kết hợp sức mạnh xử lý đa luồng của Spring Boot với Thymeleaf Layout Dialect. Giải pháp này giúp giảm 38% thời gian tải trang ban đầu (First Contentful Paint - FCP) và tối ưu hóa 100% khả năng lập chỉ mục tìm kiếm (SEO-friendly).
- Mô hình quản lý trạng thái đơn hàng hữu hạn (Finite State Machine): Chuẩn hóa quy trình vận hành đơn hàng 4 bước khép kín (
Tiếp nhận -> Chấp nhận/Từ chối -> Đang giao -> Hoàn tất), loại bỏ hoàn toàn tình trạng sai lệch trạng thái đơn hàng khi nhiều nhân viên cùng truy cập bảng quản trị.
- So sánh với các kiến trúc công nghệ truyền thống:
| Khía cạnh kỹ thuật |
Website PHP thuần / MySQL cũ |
NodeJS Express + MongoDB |
Đồ án: Spring Boot + Thymeleaf + MySQL |
| Tính toàn vẹn dữ liệu |
Kém (dễ lỏng lẻo khóa ngoại) |
Phụ thuộc tầng App (NoSQL) |
Cực cao (RDBMS ACID, JPA Foreign Keys) |
| Bảo mật mặc định |
Dễ dính SQLi/XSS nếu code ẩu |
Cần cấu hình nhiều Middleware |
Tích hợp sẵn Spring Security & CSRF Token |
| Bảo trì & Mở rộng |
Khó khăn khi quy mô lớn |
Trung bình |
Rất dễ dàng nhờ kiến trúc DI/IoC chuẩn mực |
- Đóng góp học thuật: Cung cấp bộ khung mã nguồn mẫu (Reference Architecture) chuẩn mực về việc áp dụng Spring Framework trong giải quyết bài toán chuyển đổi số F&B, phục vụ làm tài liệu tham khảo cho sinh viên chuyên ngành Công nghệ thông tin.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
Website được đóng gói hoàn chỉnh để có thể triển khai ngay cho:
- Các quán thức ăn nhanh, tiệm bánh ngọt, trà sữa đơn lẻ có nhu cầu bán hàng trực tuyến độc lập.
- Hệ thống căng-tin trường học, khu công nghiệp phục vụ đặt trước suất ăn để giảm thiểu thời gian xếp hàng giờ cao điểm.
Chiến lược và yêu cầu hạ tầng triển khai
+------------------------------------------------------------------------+
| Môi trường Client |
+-----------------------------------+------------------------------------+
| HTTPS (Cổng 443)
v
+-----------------------------------+------------------------------------+
| Reverse Proxy & Web Server: Nginx 1.24 |
| - Quản lý SSL/TLS (Let's Encrypt CA) |
| - Cân bằng tải & Nén Gzip tài nguyên tĩnh |
+-----------------------------------+------------------------------------+
| HTTP Proxy (Cổng 8080)
v
+-----------------------------------+------------------------------------+
| Ứng dụng Backend: Spring Boot Standalone JAR |
| - Java OpenJDK 17 Runtime Environment |
| - Nhúng sẵn Apache Tomcat Server 9.x |
+-----------------------------------+------------------------------------+
| JDBC Connection Pool (HikariCP)
v
+-----------------------------------+------------------------------------+
| Cơ sở dữ liệu: MySQL Server 8.0 |
| - InnoDB Storage Engine |
| - Sao lưu dữ liệu tự động định kỳ (Cronjob) |
+------------------------------------------------------------------------+
- Yêu cầu máy chủ (Server Hardware Specification):
- Hệ điều hành: Ubuntu Server 22.04 LTS (x86_64).
- CPU: 2 vCPU Core.
- RAM: 2GB (Khuyến nghị 4GB để JVM hoạt động tối ưu).
- Ổ cứng: 25GB SSD NVMe.
Phân tích hiệu quả kinh tế (Cost-Benefit Analysis & ROI)
- Chi phí đầu tư ban đầu: 0 VNĐ tiền bản quyền phần mềm (Hoàn toàn sử dụng nền tảng nguồn mở).
- Chi phí vận hành: Khoảng 120.000 - 180.000 VNĐ/tháng cho Cloud VPS cấu hình cơ bản.
- Hiệu quả kinh tế: Đối với một quán ăn có doanh thu online 50 triệu VNĐ/tháng, việc chuyển đổi từ sàn (chiết khấu 25% = 12.5 triệu VNĐ) sang website độc lập giúp tiết kiệm hơn 12 triệu VNĐ/tháng. Thời gian hoàn vốn đầu tư kỹ thuật thực tế đạt dưới 1 tháng.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Cơ chế thông báo đơn hàng mới tới quản trị viên vẫn dựa trên phương thức làm mới dữ liệu/polling, chưa tích hợp giao thức hai chiều thời gian thực (Full-duplex WebSocket).
- Hệ thống thanh toán mới dừng lại ở mức ghi nhận hình thức COD, chưa kết nối trực tiếp cổng thanh toán trực tuyến qua Webhook (VNPAY, ZaloPay, MoMo).
- Chưa có cơ chế lưu trữ phân tán (Distributed Caching) cho danh mục món ăn thường xuyên truy cập.
Hướng phát triển trong tương lai
- Tích hợp Spring WebSocket & STOMP Protocol: Đẩy thông báo tức thì (Real-time Push Notification) cho Admin Dashboard ngay khi có khách hàng tạo đơn mới mà không cần F5 trình duyệt.
- Mở rộng RESTful API & Mobile App: Chuyển đổi một phần Controller sang REST Controller chuẩn OpenAPI 3.0 để phát triển ứng dụng di động cho Shipper và Khách hàng bằng Flutter.
- Tích hợp cổng thanh toán trực tuyến: Cài đặt SDK thanh toán tự động qua VNPAY / MoMo với chữ ký số bảo mật HMAC-SHA512.
- Triển khai Redis Cache: Lưu trữ bộ nhớ đệm cho danh sách thực đơn, giảm tải 70% truy vấn đọc đến MySQL Database.
Đối tượng hưởng lợi
- Sinh viên & Học viên: Nắm vững phương pháp luận xây dựng một ứng dụng Java web thương mại điện tử hoàn chỉnh từ phân tích Use Case, thiết kế ERD đến lập trình triển khai Spring Boot.
- Lập trình viên (Developers): Kế thừa cấu trúc mã nguồn sạch (Clean Code), áp dụng đúng các Annotation chuẩn của Spring Framework (
@Transactional, @Controller, @Entity, @Valid).
- Chủ doanh nghiệp F&B: Sở hữu giải pháp chuyển đổi số bán hàng độc lập, cắt giảm chi phí trung gian và chủ động kiểm soát tập khách hàng trung thành.
- Nhà nghiên cứu & Giảng viên: Sử dụng đề tài như một case-study thực tế minh họa trực quan cho học phần Phân tích thiết kế hệ thống thông tin và Lập trình ứng dụng Java nâng cao.
Câu hỏi thường gặp
1. Yêu cầu phần cứng và phần mềm tối thiểu để triển khai website là gì?
Hệ thống yêu cầu máy chủ cài đặt Java Runtime Environment (JRE) phiên bản 17 trở lên và MySQL Server 8.0. Cấu hình phần cứng tối thiểu là 1 vCPU, 2GB RAM và 10GB dung lượng lưu trữ trống.
2. Hệ thống có khả năng chịu tải tối đa bao nhiêu người dùng đồng thời và giải pháp mở rộng là gì?
Trên môi trường đơn máy chủ tiêu chuẩn (2 vCPU, 4GB RAM), hệ thống đáp ứng ổn định 200 - 300 người dùng đồng thời (CCU). Khi lưu lượng tăng cao, hệ thống có thể mở rộng theo chiều ngang (Horizontal Scaling) bằng cách tách riêng máy chủ Database và chạy ứng dụng Spring Boot dưới dạng Stateless Cluster phía sau Nginx Load Balancer.
3. Làm thế nào để tích hợp thêm cổng thanh toán trực tuyến (VNPAY/MoMo) vào mã nguồn?
Lập trình viên chỉ cần tạo thêm PaymentController tiếp nhận yêu cầu thanh toán, khởi tạo chuỗi tham số theo chuẩn API của cổng thanh toán, ký mã băm bảo mật checksum và chuyển hướng (redirect) người dùng sang cổng thanh toán. Sau khi giao dịch hoàn tất, triển khai endpoint tiếp nhận dữ liệu gọi lại (IPN/Webhook) để cập nhật trạng thái đơn hàng trong bảng order.
4. Hệ thống đảm bảo an toàn thông tin và chống tấn công web như thế nào?
Dự án sử dụng Spring Security để xác thực và phân quyền truy cập, kích hoạt cơ chế sinh mã kiểm tra ngẫu nhiên chống tấn công CSRF trên mọi biểu mẫu gửi đi, đồng thời tận dụng Prepared Statements thông qua Hibernate ORM để loại bỏ 100% nguy cơ tấn công SQL Injection.
5. Chi phí vận hành máy chủ hàng tháng và thời gian thu hồi vốn (ROI) dự kiến ra sao?
Chi phí thuê hạ tầng máy chủ ảo (VPS) chỉ từ 150.000 VNĐ/tháng. Nhờ loại bỏ mức chiết khấu 20-30% của các sàn giao dịch đồ ăn, một cửa hàng có từ 20-30 đơn hàng/ngày sẽ thu hồi toàn bộ chi phí triển khai và sinh lời ngay trong tháng vận hành đầu tiên.
Kết luận
Đồ án tốt nghiệp đại học "Xây dựng website đặt đồ ăn nhanh" do sinh viên Đỗ Huỳnh Ngọc Thế thực hiện dưới sự hướng dẫn của ThS. Đỗ Phú Huy đã hoàn thành xuất sắc các mục tiêu nghiên cứu và thực nghiệm đề ra. Hệ thống không chỉ cung cấp một nền tảng kỹ thuật vững chắc với công nghệ hiện đại Spring Boot, Thymeleaf và MySQL mà còn mang lại giá trị kinh tế - xã hội to lớn, hỗ trợ các doanh nghiệp ẩm thực Việt Nam chuyển đổi số bền vững và hiệu quả.