Bối cảnh và vấn đề nghiên cứu

Tài liệu "SPRING_STORE Software Design Specification" là đồ án kỹ thuật thuộc ngành Kỹ thuật phần mềm (Công nghệ thông tin), được thực hiện bởi nhóm tác giả Trần Trọng Nguyễn (mã số sinh viên CE170134), Hồng Bảo Bảo (mã số sinh viên CE170912), và Đoàn Quốc Kiệt (mã số sinh viên CE171400) dưới sự hướng dẫn của Mentor Quách Luyl Đa, hoàn thành tại Cần Thơ vào tháng 01 năm 2022.

Bối cảnh thực tiễn của đề tài xuất phát từ yêu cầu xây dựng một hệ sinh thái ứng dụng web thương mại điện tử hoàn chỉnh mang tên SPRING_STORE. Hệ thống hướng tới việc cung cấp nền tảng số hỗ trợ bán hàng, quản lý đơn hàng, kho vận, tài khoản người dùng và tương tác đánh giá sản phẩm. Để đảm bảo quá trình hiện thực hóa phần mềm diễn ra chính xác, văn bản này đóng vai trò là bản đặc tả thiết kế kỹ thuật (Software Design Specification - SDS), ghi nhận cấu trúc kiến trúc, mô hình dữ liệu và đặc tả chi tiết các lớp xử lý.

Mục tiêu và nhiệm vụ nghiên cứu được phân rã theo các nội dung kỹ thuật cụ thể:

  1. Thiết kế và phân vùng cấu trúc các gói mã nguồn (Code Packages) theo mô hình kiến trúc phân tầng.
  2. Xây dựng lược đồ cơ sở dữ liệu quan hệ (Database Tables) gồm 12 bảng thực thể, xác định tường minh các khóa chính (Primary Keys) và khóa ngoại (Foreign Keys).
  3. Đặc tả chi tiết các lớp (Class Specifications), bao gồm các lớp điều hướng (Controllers), lớp giao tiếp dữ liệu (DAOs), các thực thể mô hình (Models) và kết nối hệ thống (DBContext).
  4. Thiết lập quy chuẩn phương thức xử lý (Methods), xác định rõ ràng dữ liệu đầu vào (Input), dữ liệu trả về (Output), thuật toán xử lý và câu lệnh truy vấn cơ sở dữ liệu (Database Queries) tương ứng cho từng chức năng.

Đối tượng và phạm vi nghiên cứu:

  • Đối tượng nghiên cứu: Quy trình thiết kế kiến trúc và đặc tả chi tiết hệ thống phần mềm web bán hàng SPRING_STORE.
  • Phạm vi không gian: Nghiên cứu kỹ thuật phần mềm thực hiện tại Cần Thơ, triển khai trên môi trường máy chủ web hỗ trợ nền tảng Java EE / Servlet.
  • Phạm vi người dùng: Phân quyền cho ba nhóm người dùng độc lập gồm Khách hàng (User), Nhân viên (Staff), và Quản trị viên (Admin).
  • Phạm vi nghiệp vụ: Bao quát chu trình mua sắm từ đăng nhập, duyệt sản phẩm theo danh mục, tìm kiếm, quản lý giỏ hàng, đặt hàng, quản lý kích thước sản phẩm, bình luận, đến các tác vụ quản trị gồm nhập kho hàng, thống kê doanh thu và quản lý nhân sự.
  • Phạm vi thời gian: Dữ liệu thiết kế hoàn thiện và ghi nhận tại mốc thời gian tháng 01/2022.

Cơ sở lý thuyết và công nghệ áp dụng

Hệ thống SPRING_STORE được thiết kế dựa trên mô hình kiến trúc phần mềm phân tầng kết hợp kiến trúc MVC (Model - View - Controller) và mẫu thiết kế DAO (Data Access Object) nhằm tách biệt giữa giao diện hiển thị, logic điều hướng và tầng xử lý dữ liệu.

Các công nghệ, thư viện và nền tảng lập trình được xác định trong văn bản gồm:

  • Java Servlet Framework: Đóng vai trò hạt nhân điều khiển (Controller), sử dụng lớp HttpServlet kế thừa từ GenericServlet và hiện thực giao diện Serializable. Nền tảng này cung cấp các phương thức giao thức HTTP tiêu chuẩn như doGet(), doPost(), doHead(), và doTrace().
  • Giao diện người dùng (View): Mã nguồn giao diện bao gồm các trang JSP (JavaServer Pages), kết hợp mã tạo kiểu CSS, thư viện giao diện Bootstrap, thư viện jQuery, kịch bản JavaScript, phông chữ (font), biểu tượng (icon) và hình ảnh (images).
  • Tầng truy cập dữ liệu (DAO): Mô hình DAO chịu trách nhiệm tương tác trực tiếp với cơ sở dữ liệu quan hệ để xử lý dữ liệu, nạp dữ liệu vào đối tượng Model và phản hồi cho Controller.
  • Tiện ích hỗ trợ (Helper): Lớp hỗ trợ trong gói tiện ích xử lý các giao thức gửi thư điện tử (email) và phát sinh mật khẩu ngẫu nhiên (random new password).
  • Tầng kết nối cơ sở dữ liệu (DBContext): Khởi tạo đối tượng kết nối Conn thông qua phương thức getConnection() với 6 tham số cấu hình: dbPrefix, dbPort, dbName, instance, user, và password.

Cấu trúc phân rã các gói mã nguồn (Code Packages) của hệ thống được tổng hợp trong bảng sau:

Số thứ tự Tên gói (Package) Mô tả trách nhiệm kỹ thuật
01 View Chứa toàn bộ mã nguồn giao diện (front-end) bao gồm trang JSP, CSS, JavaScript, hình ảnh, biểu tượng, phông chữ, thư viện Bootstrap và jQuery.
02 Models Chứa các lớp thực thể (entities) đại diện cho dữ liệu như Product, Cart, Order, User, Staff... phục vụ truy cập và trao đổi dữ liệu giữa các lớp DAO và Controller.
03 DAOs Bao gồm các lớp ProductDAO, CartDAO, OrderDAO, UserDAO... thực hiện các hàm nghiệp vụ tương tác trực tiếp với cơ sở dữ liệu để Controller nạp dữ liệu cho người dùng.
04 Controller Chứa các Servlet có trách nhiệm tiếp nhận, xử lý và điều phối luồng dữ liệu thu thập từ người dùng trên giao diện web (View) tới DAO và Model, sau đó chuyển giao tới trang JSP.
05 DBContext Gói chuyên trách thiết lập và quản lý các kết nối tới cơ sở dữ liệu.
06 Ultis Chứa lớp Helper cung cấp các hàm chức năng gửi email, tạo mật khẩu ngẫu nhiên và tương tác với người dùng qua email.

Thiết kế và triển khai

Hệ thống cơ sở dữ liệu của SPRING_STORE được thiết kế theo mô hình quan hệ chuẩn hóa với 12 bảng thực thể. Cấu trúc chi tiết các bảng, khóa chính và khóa ngoại được tác giả đặc tả như sau:

STT Tên bảng (Table) Mô tả chức năng lưu trữ Khóa chính (Primary Key) Khóa ngoại (Foreign Key)
01 Admin Lưu trữ thông tin tài khoản quản trị viên trong hệ thống. adminID Không có (None)
02 User Lưu trữ thông tin người dùng / khách hàng đã đăng ký. userID Không có (None)
03 Staff Lưu trữ thông tin nhân viên vận hành. staffID Không có (None)
04 Product Lưu trữ thông tin danh mục sản phẩm hiện có trong hệ thống. productID Không có (None)
05 Comment Lưu trữ các bình luận, phản hồi của người dùng về sản phẩm. commentID productID (tham chiếu Product), userID (tham chiếu User)
06 Cart Lưu trữ thông tin giỏ hàng của từng người dùng. cartID userID (tham chiếu User), productID (tham chiếu Product)
07 Order Lưu trữ thông tin các đơn đặt hàng của người dùng. orderID userID (tham chiếu User)
08 OrderDetail Lưu trữ thông tin chi tiết các sản phẩm trong từng đơn hàng. orderID, productID orderID, productID
09 Size Lưu trữ thông tin kích thước (size) cho từng sản phẩm. productSize, productID productID
10 Import Lưu trữ thông tin các đợt nhập hàng hóa. importID staffID
11 ImportDetail Lưu trữ thông tin chi tiết các sản phẩm trong mỗi đợt nhập. importID, productID importID, productID
12 Payment Lưu trữ thông tin thanh toán cho các đơn hàng. paymentID orderID

Về mặt luồng điều khiển, hệ thống triển khai theo mô hình phản hồi - yêu cầu (Request-Response) của kiến trúc web. Khi người dùng thao tác trên giao diện JSP, yêu cầu được gửi tới các Servlet trong gói Controller. Servlet phân tích tham số HTTP, gọi các phương thức tương ứng tại gói DAOs. Lớp DAO kết nối cơ sở dữ liệu qua DBContext, thực thi các truy vấn SQL chuẩn bị sẵn (Prepared Queries), chuyển đổi tập kết quả thành các đối tượng thực thể thuộc gói Models, sau đó trả về Controller để lưu vào phiên làm việc (Session) hoặc chuyển tiếp (Forward) kết quả sang trang JSP đích.

Nội dung chính theo từng chương

Văn bản tài liệu phân rã chi tiết thiết kế kỹ thuật cho từng mô-đun chức năng cụ thể:

I. Login for user (Xác thực người dùng)

Mô-đun này thiết kế quy trình xác thực quyền truy cập dành cho đối tượng khách hàng:

  • Lớp LoginController: Hiện thực phương thức doPost(). Sau khi người dùng nhấn nút đăng nhập và gửi thông tin, hàm tiếp nhận yêu cầu, kiểm tra vai trò người dùng có phải là "user" hay không. Nếu đúng, hàm gọi tiếp phương thức login() trong lớp UserDAO.
  • Lớp UserDAO: Cung cấp phương thức login() nhận ba tham số đầu vào gồm email (kiểu String), password (kiểu String) và chuỗi truy vấn query (kiểu String). Hàm kết nối CSDL qua DBContext, kiểm tra tài khoản và trả về đối tượng acc (kiểu Account) hoặc giá trị null. Phương thức getUser() có nhiệm vụ lưu trữ thông tin phiên làm việc (session) sau khi đăng nhập thành công.
  • Lớp thực thể User: Khởi tạo đối tượng User thông qua constructor bằng cách truyền tuần tự các đối số nạp từ bảng kết quả.
  • Lớp DBContext: Thực thi hàm getConnection() để khởi tạo kết nối Conn.
  • Truy vấn cơ sở dữ liệu: Select * from [User] where userEmail = ? and userPassword=?.

2. Login for staff (Xác thực nhân viên)

Mô-đun này đặc tả cơ chế xác thực riêng biệt dành cho nhân viên vận hành:

  • Lớp LoginController: Phương thức doPost() kiểm tra vai trò "staff", sau đó kích hoạt phương thức login() trong lớp StaffDAO.
  • Lớp StaffDAO: Thực thi hàm login() với các tham số đầu vào email, password, query tương tự như của người dùng để trả về đối tượng tài khoản hoặc null. Hàm getStaff() thực hiện lưu thông tin phiên làm việc của nhân viên.
  • Lớp thực thể Staff: Constructor Staff() tiếp nhận các tham số từ tập kết quả để khởi tạo đối tượng nhân viên.
  • Truy vấn cơ sở dữ liệu: Select * from [Staff] where staffEmail = ? and staffPassword=?.

3. Add Product By Staff (Thêm sản phẩm mới bởi nhân viên)

Mô-đun cho phép nhân viên tạo mới sản phẩm trên hệ thống:

  • Lớp Product Controller: Phương thức doPost() lấy các tham số từ biểu mẫu nhập liệu thêm sản phẩm, sau đó chuyển giao vào phương thức addProduct() của lớp ProductDAO.
  • Lớp Product DAO: Hiện thực hàm addProduct(in product:Product):void. Tham số đầu vào gồm: name (String), Price (String), description (String), Quantity (String), img (String), category (String). Dữ liệu đầu ra trả về giá trị kiểu true/false.
  • Tài liệu ghi nhận nền tảng kỹ thuật sử dụng lớp HTTPServlet kế thừa GenericServlet và triển khai Serializable.

4. Update Product By Staff (Cập nhật thông tin sản phẩm bởi nhân viên)

Mô-đun phục vụ việc chỉnh sửa dữ liệu hàng hóa:

  • Lớp Product Controller: Cung cấp phương thức doGet() để gọi getProductByID() từ ProductDAO và hiển thị thông tin lên giao diện web. Phương thức doPost() thu thập các tham số chỉnh sửa từ biểu mẫu và truyền vào updateProduct().
  • Lớp Product DAO: Phương thức getProductByID() nhận định danh sản phẩm kiểu số nguyên (productId: int). Phương thức updateProduct() tiếp nhận danh sách tham số: productId (int), productName (String), productPrice (double), productQuantity (int), productImg (String), productCategory (String), productDis (String).
  • Lớp thực thể Product: Constructor Product() thiết lập giá trị cho các thuộc tính sau khi dữ liệu đã được kiểm tra định dạng.
  • Truy vấn cơ sở dữ liệu được ghi nhận trong văn bản: SELECT P.productQuantity FROM [Product] P LEFT JOIN [Size] S OSN P..

5. Add An Order (Tạo đơn đặt hàng)

Mô-đun xử lý giao dịch đặt hàng của khách hàng:

  • Lớp AddAnOrderController: Phương thức doPost() kích hoạt hàm addNewOrder() trong lớp orderDAO và cập nhật dữ liệu phản hồi lên web.
  • Lớp orderDAO: Chứa ba phương thức chính gồm: addNewOrder() (thực hiện thêm đơn hàng vào CSDL), getUser(email) (kết nối qua DBContext, kiểm tra email đã tồn tại hay chưa, nếu có sẽ chuyển hướng về giao diện đăng ký kèm thông báo), và addNew(user) (tạo mới tài khoản người dùng vào hệ thống).
  • Lớp thực thể Order: Khởi tạo đối tượng đơn hàng với các tham số đầu vào gồm orderId (int), userID (int), PurchaseDate (String), productName (String), và totalPrice (float).
  • Truy vấn cơ sở dữ liệu: INSERT INTO ORDER VALUES (UserID,TotalPrice,purchaseDate);.

6. List Product category by Users (Liệt kê sản phẩm theo danh mục cho người dùng)

Mô-đun hỗ trợ người dùng phân loại và xem sản phẩm theo nhóm:

  • Lớp Produc Controller: Phương thức doGet() tiếp nhận tham số từ giao diện và gọi hàm getproduct() trong ProductDAO.
  • Lớp Product DAO: Phương thức Getproduct() nhận các tham số đầu vào name (String), Price (String), description (String), Quantity (String), img (String), category (String); kết quả trả về kiểu boolean (true/false).
  • Truy vấn cơ sở dữ liệu: select * from [Product] p where p.productName like ? and [productCategory] like ?.

7. Search Product (Tìm kiếm sản phẩm)

Mô-đun thực hiện tra cứu thông tin sản phẩm:

  • Lớp Produc Controller: Phương thức doGet() nhận chuỗi tìm kiếm txtSearch do người dùng nhập từ trang JSP, gọi hàm xử lý trong ProductDAO và trả về danh sách sản phẩm khớp từ khóa hoặc thông báo không tìm thấy.
  • Lớp Product DAO: Phương thức searchProduct(in keyword:String): List Product thực hiện tìm kiếm dựa trên từ khóa hoặc mã sản phẩm, trả về các thuộc tính như tên, giá, mô tả, hình ảnh.
  • Truy vấn cơ sở dữ liệu ghi nhận trong văn bản: select * from Product where userId like '%?%'.

8. Delete list product in cart (Xóa sản phẩm trong giỏ hàng)

Mô-đun quản lý thao tác loại bỏ sản phẩm khỏi giỏ hàng:

  • Lớp DeleteListProductInCartController: Chứa phương thức +DelateProductFormCart() thực hiện xóa sản phẩm dựa trên mã định danh sản phẩm.
  • Lớp Dbconnection: Khởi tạo kết nối thông qua phương thức getconnection().

Các chức năng khác trong cấu trúc mục lục

Ngoài các phần được đặc tả chi tiết lớp, tài liệu liệt kê hệ thống các chức năng hoàn chỉnh trong mục lục (Table of Contents), bao gồm: Đăng ký tài khoản (Register for user), xem và cập nhật thông tin cá nhân (View user profile, Update user profile), đổi mật khẩu (Change user password), quản lý nhân viên cho quản trị viên (List staff management, Add new staff, Update information staff, Delete staff for admin), xem danh sách người dùng (View list user), hiển thị chi tiết sản phẩm (Show Detail Product), xóa sản phẩm bởi nhân viên (Delete product by staff), quản lý bình luận (List comment in product detail, Add comment in product detail), xem lịch sử đơn hàng (Show list order history), nạp và thêm sản phẩm vào giỏ hàng (Load list product in cart, Add product into cart from product details), và quản lý doanh thu theo tháng (Monthly Revenue Manager).

Kết quả và đóng góp

Về mặt kết quả kỹ thuật, văn bản cung cấp một bộ hồ sơ thiết kế hoàn chỉnh cho hệ thống SPRING_STORE với các số liệu và cấu trúc cụ thể:

  • Xác lập 6 gói mã nguồn phân lớp rõ ràng (View, Models, DAOs, Controller, DBContext, Ultis).
  • Định nghĩa chuẩn hóa 12 bảng cơ sở dữ liệu quan hệ với đầy đủ cấu trúc khóa chính, khóa ngoại, đáp ứng các chu trình nghiệp vụ phức tạp.
  • Đặc tả chi tiết các phương thức xử lý cho 8 mô-đun chức năng lõi, làm rõ kiểu dữ liệu của các tham số đầu vào, giá trị trả về và các truy vấn SQL tương ứng.

Về mặt đóng góp so với các thiết kế thông thường, tài liệu đã:

  • Phân lập rõ ràng giữa hai luồng xác thực User và Staff ở cả ba tầng Controller, DAO và Database, giúp nâng cao tính an toàn và minh bạch trong phân quyền.
  • Tích hợp cấu trúc quản lý kích thước sản phẩm (Size) độc lập liên kết với mã sản phẩm, cho phép mở rộng các mặt hàng thời trang hoặc hàng hóa có nhiều quy cách.
  • Thiết kế riêng phân hệ quản lý kho nhập hàng (Import và ImportDetail) tách biệt với hệ thống bán hàng (Order và OrderDetail), tạo tiền đề kiểm soát chuỗi cung ứng khép kín.

Hạn chế và hướng nghiên cứu tiếp

Dựa trên nội dung trực tiếp của văn bản, một số hạn chế kỹ thuật được ghi nhận:

  • Tồn tại sai lệch cú pháp và logic trong một số câu lệnh truy vấn SQL: Điển hình là câu truy vấn tìm kiếm sản phẩm lại lọc theo trường người dùng (select * from Product where userId like '%?%'); câu lệnh cập nhật sản phẩm bị lỗi cú pháp chưa hoàn chỉnh (LEFT JOIN [Size] S OSN P.); câu lệnh thêm đơn hàng viết hoa tên bảng trùng từ khóa hệ thống (INSERT INTO ORDER VALUES...).
  • Tính nhất quán trong quy chuẩn đặt tên chưa triệt để: Xuất hiện lỗi chính tả trong tên phương thức (DelateProductFormCart thay vì DeleteProductFromCart), tên lớp điều khiển viết thiếu ký tự (Produc Controller), và sự xuất hiện song song chưa đồng nhất giữa hai lớp kết nối DBContext và Dbconnection.
  • Vi phạm nguyên tắc đơn nhiệm (Single Responsibility Principle) trong thiết kế lớp: Lớp orderDAO kiêm nhiệm cả logic kiểm tra sự tồn tại của email tài khoản (getUser) và tạo mới tài khoản người dùng (addNew), vốn là chức năng thuộc trách nhiệm của UserDAO.

Hướng mở rộng tiếp theo từ phạm vi nghiên cứu:

  • Chuẩn hóa toàn bộ các câu truy vấn cơ sở dữ liệu và khắc phục các sai lệch logic truy vấn.
  • Hiện thực hóa mã nguồn chi tiết và kiểm thử thực tế cho các mô-đun mới chỉ dừng lại ở danh mục mục lục (như mô-đun quản lý doanh thu tháng Monthly Revenue Manager, quản lý bình luận Comment, và quy trình nhập kho Import).

Giá trị tham khảo

Tài liệu là nguồn tham khảo trực tiếp cho:

  • Sinh viên chuyên ngành Kỹ thuật phần mềm, Công nghệ thông tin hoặc Hệ thống thông tin đang thực hiện đồ án tốt nghiệp, bài tập lớn về phát triển ứng dụng web trên nền tảng Java EE (Java Servlet/JSP).
  • Những người nghiên cứu cần cấu trúc mẫu về một tài liệu Đặc tả thiết kế phần mềm (Software Design Specification) theo quy chuẩn phân tầng MVC và DAO.

Nội dung đáng giá nhất để tham khảo bao gồm lược đồ cơ sở dữ liệu quan hệ 12 bảng được thiết kế liên kết chặt chẽ cho mô hình bán lẻ trực tuyến, cùng phương pháp phân rã cấu trúc tham số (Input, Output, Process) của các lớp DAO và Servlet.

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

1. Cơ sở dữ liệu của SPRING_STORE gồm những bảng nào để phục vụ việc quản lý hàng hóa và kho vận?

Hệ thống sử dụng các bảng gồm Product (lưu thông tin chung về sản phẩm), Size (lưu kích thước sản phẩm theo productID), Import (lưu thông tin các đợt nhập hàng gắn với staffID), và ImportDetail (lưu chi tiết các sản phẩm trong đợt nhập với khóa chính kết hợp importID và productID).

2. Gói mã nguồn Ultis trong hệ thống đảm nhận chức năng gì?

Gói Ultis chứa lớp Helper với các phương thức thực hiện gửi thư điện tử, tạo mật khẩu ngẫu nhiên (random new password) và xử lý các tương tác với người dùng qua hệ thống email.

3. Quy trình xác thực của User và Staff được phân biệt như thế nào tại tầng DAO?

Mặc dù đều đi qua phương thức doPost() của LoginController, nhưng hệ thống kiểm tra vai trò để phân nhánh: nếu vai trò là "user", hàm sẽ gọi UserDAO.login() và truy vấn trên bảng [User]; nếu vai trò là "staff", hàm sẽ gọi StaffDAO.login() và truy vấn trên bảng [Staff].

4. Phương thức addProduct() trong lớp Product DAO nhận các tham số đầu vào nào?

Phương thức này nhận một đối tượng product:Product với 6 tham số gồm: name (String), Price (String), description (String), Quantity (String), img (String), và category (String), trả về kết quả kiểu boolean (true/false).

5. Lớp kết nối cơ sở dữ liệu DBContext yêu cầu những tham số cấu hình nào để tạo kết nối?

Phương thức getConnection() trong DBContext nhận 6 tham số truyền vào bao gồm dbPrefix, dbPort, dbName, instance, user, và password để khởi tạo đối tượng kết nối Conn.

Kết luận

Tài liệu "SPRING_STORE Software Design Specification" của nhóm sinh viên Trần Trọng Nguyễn, Hồng Bảo Bảo và Đoàn Quốc Kiệt đã thiết lập khung thiết kế kỹ thuật tương đối hoàn chỉnh cho một ứng dụng web thương mại điện tử nền tảng Java Servlet/JSP. Văn bản phân định rõ ràng 6 gói mã nguồn, 12 bảng cơ sở dữ liệu quan hệ và các phương thức xử lý dữ liệu trọng yếu. Mặc dù vẫn còn một số điểm hạn chế về tính chuẩn hóa cú pháp truy vấn và phân chia trách nhiệm lớp, tài liệu vẫn phản ánh đầy đủ cấu trúc thiết kế chi tiết cần có của một đồ án kỹ thuật phần mềm.