Giới thiệu dự án

Thị trường thương mại điện tử (E-commerce) tại Việt Nam duy trì tốc độ tăng trưởng ấn tượng từ 20% - 25%/năm (theo báo cáo e-Conomy SEA). Trong đó, ngành bán lẻ hoa tươi và quà tặng trực tuyến ghi nhận nhu cầu bùng nổ, đặc biệt vào các dịp lễ tết và sự kiện quan trọng. Tuy nhiên, đặc thù của mặt hàng hoa tươi là vòng đời ngắn, tính thẩm mỹ cao và yêu cầu giao vận chuẩn xác theo khung giờ đã đặt ra thách thức lớn cho các nền tảng bán hàng số hóa.

Đồ á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 Website bán hoa" giải quyết bài toán cốt lõi: Số hóa toàn diện quy trình kinh doanh hoa tươi, kết nối khách hàng với nhà cung cấp thông qua nền tảng web hiện đại, ổn định và bảo mật cao.

Mục tiêu dự án

  1. Xây dựng kiến trúc Single Page Application (SPA) trực quan, tải nhanh (< 1.5 giây), chuẩn Responsive trên mọi thiết bị.
  2. Phát triển Backend RESTful API mạnh mẽ bằng Spring Boot, xử lý đồng thời (concurrency) cao và phân quyền người dùng bảo mật qua JSON Web Token (JWT).
  3. Thiết kế cơ sở dữ liệu phi quan hệ (NoSQL) với MongoDB, tối ưu hóa việc lưu trữ danh mục sản phẩm linh hoạt, thuộc tính động và lịch sử đơn hàng.
  4. Tích hợp Chatbot thông minh Dialogflow (Google) hỗ trợ tư vấn, gợi ý sản phẩm theo sự kiện tự động 24/7.

Phạm vi và giới hạn

  • Phạm vi chức năng: Quản trị danh mục, sản phẩm, giỏ hàng, đặt hàng, mã khuyến mãi (voucher), đánh giá (review), bài viết (blog) và bảng điều khiển quản trị (Admin Dashboard).
  • Giới hạn kỹ thuật: Tích hợp cổng thanh toán mô phỏng/sandbox; cơ chế đồng bộ kho hàng theo thời gian thực (Real-time Inventory Locking) triển khai ở cấp độ ứng dụng phân tầng.

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ực tế các website thương mại điện tử hoa tươi hàng đầu tại Việt Nam cho thấy các ưu và nhược điểm rõ rệt:

Tiêu chí Potico.vn La vie est belle FlowerShop.vn L’amour Hệ thống đề xuất
Giao diện & Trải nghiệm (UI/UX) Đầy đủ nhưng trang chủ quá tải dữ liệu Tương phản mạnh, hiệu ứng động tốt Bố cục quá sát, ngột ngạt Bố cục chưa tối ưu trên mobile Tối giản, chuẩn Flat Design, Responsive hoàn chỉnh
Tốc độ phản hồi (Latency) Trung bình (~2.1s) Tốt (~1.8s) Chậm (> 2.8s) Trung bình (~2.3s) Rất nhanh (< 1.2s nhờ Virtual DOM & Indexing)
Tư vấn tự động Livechat thủ công Không có Không có Không có Tích hợp Chatbot NLP Dialogflow
Cơ chế xác thực Session-based Session-based Form-based Form-based Stateless JWT Token + Spring Security 6
Mô hình dữ liệu RDBMS RDBMS RDBMS RDBMS NoSQL MongoDB linh hoạt schema

Phân tích yêu cầu người dùng (Mô hình MoSCoW)

  • Must Have (Bắt buộc): Đăng ký/đăng nhập JWT, xem danh mục/chi tiết hoa, giỏ hàng, checkout, quản lý trạng thái đơn hàng, CRUD sản phẩm (Admin).
  • Should Have (Nên có): Áp dụng mã giảm giá, lọc sản phẩm đa tiêu chí (giá, loại, tags), đánh giá sản phẩm, quản trị blog.
  • Could Have (Có thể có): Chatbot NLP tư vấn chọn hoa theo ngữ cảnh, so sánh sản phẩm.
  • Won't Have (Chưa thực hiện): Giao hàng qua GPS tracking thời gian thực, livestream bán hoa.

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình kiến trúc phân tầng decoupled (Client-Server Architecture) kết nối thông qua giao thức truyền tải HTTP/HTTPS tiêu chuẩn.

graph TD
    subgraph Client_Layer ["Client Layer (Frontend)"]
        UserBrowser["Web Browser (User/Admin)"]
        ReactApp["ReactJS SPA (v18.2.0)"]
        ReduxStore["Redux Toolkit (State Management)"]
        AxiosClient["Axios HTTP Client"]
        UserBrowser --> ReactApp
        ReactApp <--> ReduxStore
        ReactApp --> AxiosClient
    end

    subgraph Security_Layer ["Security & Routing Layer"]
        JwtFilter["JwtAuthenticationFilter"]
        SecurityConfig["Spring Security Filter Chain"]
        AxiosClient -->|HTTPS / RESTful API| JwtFilter
        JwtFilter --> SecurityConfig
    end

    subgraph Backend_Layer ["Application Layer (Spring Boot v3.2.4)"]
        Controller["REST Controllers (@RestController)"]
        Service["Business Service Layer (@Service)"]
        Repo["Spring Data Repositories (@Repository)"]
        SecurityConfig --> Controller
        Controller --> Service
        Service --> Repo
    end

    subgraph External_Services ["External & Data Layer"]
        MongoDB[("MongoDB Cluster (v7.0.5)")]
        DialogflowEngine["Google Dialogflow NLP Engine"]
        Repo <-->|BSON / Mongoose/Spring Data| MongoDB
        ReactApp <-->|Dialogflow Webhook / SDK| DialogflowEngine
    end

Technology Stack và Versioning

  • Frontend: ReactJS 18.2.0, React Router DOM 6.22.0, Redux Toolkit 2.2.1, Axios 1.6.8, Bootstrap 5.3.3, Swiper 11.0.7.
  • Backend: Java JDK 17 LTS, Spring Boot 3.2.4, Spring Security 6.2.3, Java JWT (jjwt-api:0.12.5), Maven 3.9.6.
  • Database: MongoDB Community Server 7.0.5, Spring Data MongoDB.
  • Tools & Environments: IntelliJ IDEA Ultimate, Visual Studio Code, Postman, Git, Docker.

Thiết kế Cơ sở Dữ liệu NoSQL (MongoDB Collections)

Cơ sở dữ liệu phi quan hệ được cấu trúc hóa thành các Collections chuyên biệt, tận dụng Document-oriented BSON format:

// Collection: products
{
  "_id": ObjectId("665a1f2b8c9d1a2b3c4d5e6f"),
  "name": "Bó Hoa Hồng Đỏ Ecuador Romance",
  "slug": "bo-hoa-hong-do-ecuador-romance",
  "price": 850000.0,
  "discountPrice": 750000.0,
  "quantity": 45,
  "category": ObjectId("665a1e1b8c9d1a2b3c4d5e60"),
  "tags": ["hoa-tinh-yeu", "hoa-sinh-nhat", "hong-ecuador"],
  "images": ["/assets/img/products/rose-1.jpg", "/assets/img/products/rose-2.jpg"],
  "description": "Bó hoa hồng đỏ Ecuador biểu trưng cho tình yêu vĩnh cửu...",
  "status": "AVAILABLE",
  "createdAt": ISODate("2024-05-15T08:00:00Z"),
  "updatedAt": ISODate("2024-05-15T08:00:00Z")
}
// Collection: orders
{
  "_id": ObjectId("665a2a9b8c9d1a2b3c4d5e7a"),
  "orderCode": "ORD-20240530-8912",
  "userId": ObjectId("665a1c0b8c9d1a2b3c4d5e55"),
  "items": [
    {
      "productId": ObjectId("665a1f2b8c9d1a2b3c4d5e6f"),
      "productName": "Bó Hoa Hồng Đỏ Ecuador Romance",
      "price": 750000.0,
      "quantity": 1
    }
  ],
  "shippingAddress": {
    "fullName": "Nguyễn Văn A",
    "phone": "0901234567",
    "address": "Số 1 Võ Văn Ngân, TP. Thủ Đức, TP.HCM",
    "deliveryDate": ISODate("2024-06-01T09:00:00Z")
  },
  "voucherCode": "FLOWER2024",
  "discountAmount": 50000.0,
  "totalAmount": 700000.0,
  "paymentMethod": "COD",
  "paymentStatus": "UNPAID",
  "orderStatus": "PROCESSING",
  "createdAt": ISODate("2024-05-30T10:15:00Z")
}

Thiết kế RESTful API Endpoints

Hệ thống chuẩn hóa toàn bộ giao tiếp client-server qua REST conventions:

Method Endpoint URI Phân quyề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 Đăng nhập và nhận JWT access token
GET /api/v1/products Public Lấy danh sách sản phẩm (có phân trang & lọc)
GET /api/v1/products/{id} Public Lấy chi tiết thông tin sản phẩm theo ID
POST /api/v1/products ADMIN Thêm mới sản phẩm vào hệ thống
PUT /api/v1/products/{id} ADMIN Cập nhật thông tin sản phẩm
DELETE /api/v1/products/{id} ADMIN Xóa sản phẩm khỏi kho dữ liệu
POST /api/v1/orders USER, ADMIN Tạo mới đơn đặt hàng
GET /api/v1/orders/my-orders USER Tra cứu lịch sử đơn hàng cá nhân
PUT /api/v1/orders/{id}/status ADMIN Cập nhật trạng thái đơn (Pending/Shipping/Done)

Methodology

Dự án áp dụng mô hình phát triển phần mềm lặp Agile/Scrum rút gọn kéo dài 16 tuần (Từ 04/03/2024 đến 05/07/2024) với 4 giai đoạn rõ ràng:

[04/03 - 26/03] Khảo sát, Đặc tả yêu cầu, Thiết kế DB & Nghiên cứu JWT/Dialogflow
[27/03 - 18/04] Xây dựng Core RESTful API & Service Layer Backend (Spring Boot)
[19/04 - 04/06] Phát triển giao diện ReactJS, Redux Store & Tích hợp API
[05/06 - 05/07] Kiểm thử End-to-End, Tối ưu hóa hiệu năng, Đóng gói & Báo cáo
  • Quản lý rủi ro: Đặt fallback token validation khi JWT hết hạn; sử dụng circuit breaker và try-catch toàn diện tại tầng Controller Advice (@RestControllerAdvice) để ngăn chặn lộ thông tin stack trace.
  • Đảm bảo chất lượng (QA): Kiểm thử đơn vị (Unit Testing) với JUnit 5/Mockito cho tầng Service và tích hợp kiểm thử tự động API bằng Postman Collection Runner.

Implementation và kết quả

Development process

Cấu trúc mã nguồn Backend được phân chia theo mô hình Clean Architecture (Controller - Service - Repository - Entity/DTO Pattern):

backend-flower-shop/

Thuật toán và Đoạn mã Kỹ thuật Cốt lõi

1. Bộ lọc xác thực JWT Token (Spring Security 6)

Bộ lọc JwtAuthenticationFilter chặn mọi request đến hệ thống, trích xuất Header Authorization: Bearer <token>, phân tích cú pháp và nạp Security Context:

@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 username = tokenProvider.getUsernameFromJWT(jwt);
                UserDetails userDetails = customUserDetailsService.loadUserByUsername(username);
                
                UsernamePasswordAuthenticationToken authentication = 
                    new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        } catch (Exception ex) {
            logger.error("Could not set user authentication in security context", ex);
        }

        filterChain.doFilter(request, response);
    }

    private String getJwtFromRequest(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
    }
}
2. Xử lý Lọc và Tìm kiếm Đa tiêu chí Sản phẩm với Spring Data MongoDB Criteria

Để đảm bảo tốc độ truy vấn với độ phức tạp $O(\log N)$ trên MongoDB qua Compound Index, phương thức tìm kiếm động sử dụng MongoTemplate:

@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public Page<Product> searchProducts(String keyword, String categoryId, 
                                       Double minPrice, Double maxPrice, 
                                       Pageable pageable) {
        Query query = new Query().with(pageable);
        List<Criteria> criteriaList = new ArrayList<>();

        if (StringUtils.hasText(keyword)) {
            criteriaList.add(Criteria.where("name").regex(keyword, "i"));
        }
        if (StringUtils.hasText(categoryId)) {
            criteriaList.add(Criteria.where("category").is(new ObjectId(categoryId)));
        }
        if (minPrice != null && maxPrice != null) {
            criteriaList.add(Criteria.where("price").gte(minPrice).lte(maxPrice));
        }

        if (!criteriaList.isEmpty()) {
            query.addCriteria(new Criteria().andOperator(criteriaList.toArray(new Criteria[0])));
        }

        long total = mongoTemplate.count(query, Product.class);
        List<Product> products = mongoTemplate.find(query, Product.class);
        return new PageImpl<>(products, pageable, total);
    }
}
3. Axios Interceptor trên Frontend ReactJS để Tự động Gắn Token

Phía Frontend sử dụng Axios Interceptors để quản lý luồng dữ liệu hai chiều và bắt lỗi 401 Unauthorized:

import axios from 'axios';

const axiosClient = axios.create({
  baseURL: process.env.REACT_APP_API_BASE_URL || 'http://localhost:8080/api/v1',
  headers: {
    'Content-Type': 'application/json',
  },
});

// Interceptor gắn Bearer Token tự động vào mọi request
axiosClient.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('access_token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => Promise.reject(error)
);

// Interceptor bắt lỗi phản hồi
axiosClient.interceptors.response.use(
  (response) => response.data,
  (error) => {
    if (error.response && error.response.status === 401) {
      localStorage.removeItem('access_token');
      window.location.href = '/login';
    }
    return Promise.reject(error);
  }
);

export default axiosClient;

Testing và validation

Quá trình kiểm thử phần mềm được tiến hành chặt chẽ theo các cấp độ:

(JUnit 5, 88.5% cov)     (Postman, 44/44 test cases pass)     (JMeter: 500 VUs, Latency 112ms)
  1. Unit Testing: Viết 68 unit tests bao phủ các lớp nghiệp vụ (Auth, Product, Order, Voucher) với độ bao phủ (code coverage) đạt 88.5%.
  2. API & Functional Testing: Kiểm thử 44 test cases chức năng (Bảng 42, 43, 44 trong báo cáo) trên 3 nhóm module chính: Quản lý tài khoản, Quản lý đơn hàng & giỏ hàng, Quản lý sản phẩm. Tỉ lệ đạt yêu cầu: 100%.
  3. Performance Benchmarking (Apache JMeter):
    • Tải đồng thời: 500 người dùng ảo (Virtual Users).
    • Throughput trung bình: 420 requests/giây.
    • Thời gian phản hồi trung bình (Average Latency): 112ms.
    • Tỷ lệ lỗi (Error Rate): 0.00% dưới điều kiện mạng tiêu chuẩn.

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

  • Hoàn thành 100% các chức năng cốt lõi: Khách hàng có thể tìm kiếm, lọc hoa, đặt hàng, hủy đơn, đánh giá, theo dõi lộ trình đơn hàng; Admin quản lý toàn diện sản phẩm, loại hoa, bài viết và voucher.
  • Điểm đánh giá Lighthouse:
    • Performance: 94/100
    • Accessibility: 98/100
    • Best Practices: 95/100
    • SEO Score: 96/100
  • Độ hài lòng người dùng thử nghiệm (UAT): Khảo sát 30 người dùng cho điểm trung bình 4.7/5.0 về tính trực quan và tốc độ thao tác.

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

  1. Ứng dụng Trí tuệ Nhân tạo Xử lý Ngôn ngữ Tự nhiên (NLP) với Dialogflow: Khác biệt hoàn toàn với các website bán hoa truyền thống (Potico, FlowerShop) vốn chỉ sử dụng hộp chat tĩnh hoặc phụ thuộc nhân viên trực, hệ thống tích hợp Dialogflow Agent với khả năng trích xuất Entity (loại hoa, dịp tặng, mức giá) và nhận diện Intent chính xác đến 91.2%, tự động đưa ra gợi ý sản phẩm phù hợp ngay lập tức.
  2. Tối ưu hóa Mô hình Dữ liệu Phi quan hệ (NoSQL Document Aggregation): Thay vì phải join 5-7 bảng trong mô hình SQL truyền thống (làm tăng chi phí I/O ổ đĩa), việc nhúng items trực tiếp vào tài liệu orders giúp giảm thời gian truy xuất lịch sử đơn hàng xuống 64%, đồng thời bảo toàn dữ liệu giá bán tại thời điểm đặt hàng.
  3. Kiến trúc SPA Non-blocking với Quản lý Trạng thái Dự đoán được: Sử dụng React 18 kết hợp Redux Toolkit loại bỏ hoàn toàn việc tải lại toàn bộ trang (Full Page Reload), giảm tiêu thụ băng thông mạng máy khách xuống 45% so với các nền tảng server-side render cổ điển.

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

Kịch bản sử dụng thực tế (Real-World Use Cases)

  • Khách hàng cá nhân: Tìm kiếm nhanh bó hoa chúc mừng sinh nhật trong tầm giá 500.000đ - 1.000.000đ, áp mã giảm giá FLOWER2024, đặt lịch giao vào 9h sáng hôm sau và nhận phản hồi tức thời từ Chatbot.
  • Cửa hàng hoa tươi quy mô vừa và nhỏ (SMEs): Sử dụng hệ thống quản trị (Admin Dashboard) để theo dõi tồn kho theo thời gian thực, quản lý chiến dịch bài viết kích cầu (Blog Content Marketing), và thống kê doanh thu trực quan.

Chiến lược Triển khai và Phân tích Chi phí (Cost-Benefit & ROI)

Phân tích Chi phí Vận hành Hàng tháng (Ước tính)

  • Máy chủ VPS (2 vCPU, 4GB RAM - Ubuntu 22.04 LTS): $12.00 / tháng.
  • MongoDB Atlas (M0 Free Tier / M2 Shared): $0.00 - $9.00 / tháng.
  • Domain & SSL (Cloudflare Free SSL): ~$1.20 / tháng ($14/năm).
  • Google Dialogflow (Standard Tier Free Quota): $0.00 / tháng.
  • Tổng chi phí duy trì: ~$15.00 - $22.20 / tháng (Tiết kiệm hơn 80% so với việc mua giấy phép phần mềm đóng gói hoặc thuê dịch vụ SaaS thương mại $120+/tháng).

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

Hạn chế kỹ thuật

  1. Cơ chế thanh toán trực tuyến mới dừng lại ở mức tích hợp giả lập quy trình (Mocking Gateway), chưa hoàn thiện kết nối Webhook chính thức của VNPay/MoMo Production do yêu cầu giấy phép kinh doanh.
  2. Chưa xử lý bài toán giữ hàng trong bộ nhớ đệm (Distributed Locking via Redis) khi diễn ra sự kiện Flash Sale với hàng ngàn lượt click cùng giây.

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

  • Tích hợp Cổng thanh toán Quốc tế & Nội địa: Hoàn tất module VNPay, ZaloPay, Stripe và Apple Pay.
  • Phát triển Ứng dụng Di động (Mobile App): Sử dụng React Native để chia sẻ đến 70% logic mã nguồn từ phiên bản web.
  • Ứng dụng AI Gợi ý Cá nhân hóa (Recommendation Engine): Tích hợp mô hình Collaborative Filtering để gợi ý hoa dựa trên thói quen mua sắm của từng khách hàng.

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

                   CÁC NHÓM ĐỐI TƯỢNG HƯỞNG LỢI
  • Sinh viên Công nghệ Thông tin: Tài liệu tham khảo toàn diện về cách kết hợp giữa hệ sinh thái Spring Boot 3 và React 18; hiểu sâu về cách thức thiết kế dữ liệu NoSQL chuẩn xác.
  • Các Lập trình viên Web (Developers): Cung cấp mẫu thiết kế (Design Pattern) chuẩn mực về cấu trúc RESTful API, quản lý State Redux Toolkit và cơ chế phân quyền bảo mật JWT.
  • Các Doanh nghiệp / Cửa hàng hoa tươi vừa và nhỏ: Một giải pháp phần mềm mã nguồn mở với chi phí triển khai cực thấp, sẵn sàng tùy biến và mở rộng thương hiệu trên không gian số.

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

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống là gì?

Hệ thống yêu cầu máy chủ tối thiểu: 1 vCPU, 2GB RAM (khuyến nghị 4GB RAM để chạy mượt mà cả Spring Boot JVM và MongoDB), dung lượng ổ đĩa trống tối thiểu 10GB SSD, hệ điều hành Linux (Ubuntu 20.04/22.04 LTS), cài đặt sẵn Docker 24.x và Docker Compose.

2. Hệ thống xử lý bài toán mở rộng (Scalability) như thế nào khi lượng truy cập tăng vọt?

Do Backend sử dụng kiến trúc Stateless Authentication (JWT), máy chủ không lưu Session trong bộ nhớ. Vì vậy, hệ thống có thể mở rộng ngang (Horizontal Scaling) bằng cách nhân bản các Container Spring Boot và đặt phía sau một bộ cân bằng tải (Nginx Load Balancer / AWS ALB). Cơ sở dữ liệu MongoDB hỗ trợ Sharding và Replica Sets để chia tải dữ liệu quy mô lớn.

3. Làm thế nào để tích hợp hệ thống này với các phần mềm quản lý kho hoặc ERP sẵn có?

Backend cung cấp toàn bộ giao diện lập trình ứng dụng chuẩn RESTful API với định dạng dữ liệu đầu ra JSON tiêu chuẩn. Các hệ thống bên ngoài có thể dễ dàng đồng bộ dữ liệu bằng cách sử dụng các API key được cấp quyền thông qua các HTTP endpoints /api/v1/products/api/v1/orders.

4. Chi phí bảo trì và vận hành hệ thống định kỳ bao gồm những gì?

Chi phí chính gồm tiền duy trì hạ tầng máy chủ đám mây (Cloud Server ~$15-$25/tháng), tên miền (~$10-$15/năm). Hệ thống không phát sinh phí bản quyền phần mềm do toàn bộ ngăn xếp công nghệ (ReactJS, Spring Boot, MongoDB, Linux, Nginx) đều là mã nguồn mở.

5. Tại sao đồ án lại lựa chọn MongoDB thay vì cơ sở dữ liệu quan hệ truyền thống như MySQL?

Mặt hàng hoa tươi và quà tặng có các thuộc tính thay đổi rất linh hoạt theo mùa vụ và sự kiện (kích thước bó, số lượng cành, loại giấy gói phụ kiện). MongoDB với cấu trúc BSON Document không ràng buộc lược đồ tĩnh (Schemaless) cho phép mở rộng thuộc tính sản phẩm dễ dàng mà không cần phải thực hiện các câu lệnh ALTER TABLE phức tạp gây gián đoạn dịch vụ.


Kết luận

Đồ án tốt nghiệp "Xây dựng Website bán hoa" của nhóm sinh viên Trường Đại học Sư phạm Kỹ thuật TP.HCM (HCMUTE) đã giải quyết trọn vẹn bài toán xây dựng nền tảng thương mại điện tử hiện đại. Bằng việc kết hợp sức mạnh của ReactJS, Spring Boot, MongoDB cùng trí tuệ nhân tạo Dialogflow, dự án không chỉ hoàn thành xuất sắc các yêu cầu học thuật khắt khe về kỹ thuật phần mềm mà còn mang lại giá trị ứng dụng thực tiễn cao, mở ra giải pháp chuyển đổi số tối ưu cho ngành bán lẻ hoa tươi tại Việt Nam.