Dự án gồm 2 repo, file readme viết chung cho cả dự án.
Nhóm tác giả:
- Vũ Anh Tuấn
- Đinh Việt Dũng
- Nguyễn Vĩnh Trung
- Nguyễn Vĩnh Tùng
- Nguyễn Văn Hoàng
FASHCO là website bán quần áo trực tuyến dành cho giới trẻ với kiến trúc tách biệt Frontend và Backend, tập trung vào trải nghiệm mua sắm tiện lợi và quy trình quản lý tối ưu.
Hệ thống cung cấp quy trình khép kín từ tìm kiếm sản phẩm, đặt hàng, thanh toán online đến theo dõi vận đơn và chăm sóc khách hàng.
Các phân hệ chính:
- Client: Giao diện thân thiện, responsive cho khách hàng
- Admin: Dashboard quản lý tập trung toàn bộ hệ thống
- Server & Database: Xử lý nghiệp vụ logic và lưu trữ dữ liệu
- Tài khoản & Bảo mật: Đăng ký/Đăng nhập (OAuth2/Google) và quản lý hồ sơ
- Mua sắm: Tìm kiếm, lọc đa tiêu chí, xem biến thể (màu sắc, kích thước), quản lý giỏ hàng
- Thanh toán: Thanh toán trực tuyến qua VNPay và theo dõi đơn hàng real-time
- Chat: Hệ thống chat real-time với Admin
- Dashboard: Báo cáo doanh thu, đơn hàng và hiệu suất kinh doanh
- Quản lý sản phẩm: Danh mục, sản phẩm và biến thể (SKU, tồn kho)
- Quản lý vận hành: Xử lý đơn hàng, người dùng và các đợt khuyến mãi
Backend:
- Framework: Spring Ecosystem (RESTful API)
- Security: JWT (JSON Web Token)
- Communication: WebSocket (Real-time Chat)
- Integrations: Cloudinary (lưu trữ), VNPay (thanh toán)
Frontend:
- Framework: React (SPA)
- UI/UX: Material UI/Ant Design
- State Management: Quản lý trạng thái và API calls
Database:
- RDBMS: MySQL
- ORM: JPA/Hibernate
- Frontend: Vercel
- Backend & Database: Railway (CI/CD tự động)
Framework & Core:
- Spring Boot (RESTful API)
- Spring Security với JWT (JSON Web Token) cho xác thực và phân quyền
- OAuth2/Google Login cho đăng nhập nhanh
- WebSocket/Socket.IO cho Chat real-time
Tích hợp dịch vụ:
- Cloudinary: Upload và lưu trữ ảnh, trả về URL để lưu trong Database
- VNPay Sandbox: Tích hợp cổng thanh toán trực tuyến (môi trường test)
Database & ORM:
- MySQL với JPA/Hibernate
- CRUD tiêu chuẩn cho tất cả các entity
Authentication & Authorization:
POST /auth/token- Đăng nhập (Admin/User)POST /auth/introspect- Xác thực tokenPOST /auth/refresh- Làm mới tokenPOST /auth/logout- Đăng xuấtGET /users- Lấy danh sách usersPOST /user- Tạo user mớiPUT /users/{id}- Cập nhật userGET /users/myInfor- Lấy thông tin cá nhânPOST /permissions- Tạo permissionGET /permissions- Lấy danh sách permissionsPOST /roles- Tạo roleDELETE /roles/{name}- Xóa role
Category:
GET /category- Lấy danh sách categoryPOST /category- Tạo categoryPUT /category/{id}- Cập nhật categoryDELETE /category/{id}- Xóa category
Product:
GET /products- Lấy danh sách sản phẩmPOST /products- Tạo sản phẩmPUT /products/{id}- Cập nhật sản phẩmGET /products/search- Tìm kiếm sản phẩm (keyword, price range, colors)
Product Variation:
POST /variations- Tạo biến thể sản phẩm (size, color, stock)GET /variations/{id}- Lấy thông tin biến thểPUT /variations/{id}- Cập nhật biến thể
Reviews:
POST /reviews- Tạo đánh giáGET /reviews- Lấy tất cả đánh giáPUT /reviews/{id}- Cập nhật đánh giáDELETE /reviews/{id}- Xóa đánh giáGET /reviews/user/{userId}- Lấy đánh giá theo userGET /reviews/rating/{rating}- Lấy đánh giá theo ratingGET /reviews/rating/min/{minRating}- Lấy đánh giá từ rating tối thiểu
Cart:
POST /cart/add- Thêm sản phẩm vào giỏ hàngGET /cart- Lấy giỏ hàngPUT /cart/update/{id}- Cập nhật số lượngDELETE /cart/remove/{id}- Xóa sản phẩm khỏi giỏ hàng
Order:
POST /orders- Tạo đơn hàngGET /orders- Lấy đơn hàng của userGET /all-orders- Lấy tất cả đơn hàng (Admin)PATCH /orders/{id}/cancel- Hủy đơn hàngPATCH /orders/{id}/status- Cập nhật trạng thái đơn hàngDELETE /orders/{id}- Xóa đơn hàng
Feedback:
GET /feedback/{orderId}- Lấy feedback theo đơn hàngPOST /feedback/{orderId}- Tạo feedbackDELETE /feedback/{orderId}/{feedbackId}- Xóa feedback
Sales:
POST /sales- Tạo đợt khuyến mãiPUT /sales/{id}- Cập nhật khuyến mãiGET /sales- Lấy danh sách khuyến mãiDELETE /sales/{id}- Xóa khuyến mãi
Address:
POST /address- Tạo địa chỉPUT /address/{id}- Cập nhật địa chỉGET /address- Lấy danh sách địa chỉGET /address/default- Lấy địa chỉ mặc định
Chat:
POST /chat/conversations/ensure- Tạo/đảm bảo conversationPOST /chat/messages- Gửi tin nhắnGET /chat/conversations- Lấy danh sách conversationGET /chat/conversations/{id}- Lấy chi tiết conversation
Xem tại Github
- Java: JDK 8 trở lên
- MySQL: MySQL Server 8.0 trở lên
- Node.js: 16.x trở lên (cho Frontend)
- IDE: IntelliJ IDEA / Eclipse / VS Code
- Postman: Để test API (tùy chọn)
git clone https://github.com/hoangnv25/BTL_Java_BE.gitHoặc tải file ZIP từ GitHub và giải nén.
-
Tải và cài đặt MySQL Workbench
- Tải từ MySQL Official Website
-
Tạo kết nối MySQL
- Mở MySQL Workbench
- Tạo một kết nối mặc định với MySQL Server
-
Import Database
- Tìm file
DB_JAVA.sqlở thư mục gốc của dự án - Mở file
DB_JAVA.sqltrên MySQL Workbench - Chạy toàn bộ script SQL
- Click Reload và kiểm tra xem vừa có Schema mới tên là
java_dbvừa được tạo với rất nhiều bảng và dữ liệu trong bảng chưa.
- Tìm file
Mở dự án trong 1 IDE (IntelliJ, Netbeans...)
Lưu ý: File application.properties chứa thông tin cấu hình theo máy (DB username/password) nên không được commit lên GitHub (đã được thêm vào .gitignore). Bạn cần tự tạo file này.
Tạo file cấu hình:
Tạo file tại đường dẫn: BTL/src/main/resources/application.properties
server.port=8080
# MySQL Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/java_db
spring.datasource.username=<db_user>
spring.datasource.password=<db_pass>
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# ===================== JWT =====================
jwt.signerKey=sigerKey_cua_toi
jwt.valid-duration=3600
jwt.refresh-duration=36000
TZ="Asia/Ho_Chi_Minh"
# ===================== outbound (không dùng tới tính năng nhưng phải có để đọc) =====================
outbound.identity.google.client-id="random-oogpvtn4a.apps.googleusercontent.com"
outbound.identity.google.client-secret="randomGOPX-fri3"
outbound.identity.redirect-uri="http://localhost:5173/auth/OAuth"
# ===================== more =====================
spring.sql.init.mode=never
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
Thay thế các giá trị:
java_db: Tên schema đã tạo khi chạy scrip trên workbench hồi nãy, đừng sửa cái này nếu nãy không sửa<db_user>: Username MySQL của bạn<db_pass>: Password MySQL của bạn
- Tìm đến file:
BTL/src/main/java/com/BTL_JAVA/BTL/BtlApplication.java - Chạy file
BtlApplication.java(Run/Debug) - Backend sẽ chạy tại: http://localhost:8080
- Kiểm tra bằng cách truy cập link http://localhost:8080/products, nếu trả về rất nhiều dòng json dữ liệu thì thành công, nếu chưa thì hãy kiểm tra lại.
Bước này để kiểm tra xem hệ thống bao gồm BE và DB đã hoạt động trơn tru chưa, có nhiều cách kiểm tra, dưới đây là dùng Postman. Hướng dẫn dưới dây sẽ import tất cả API mà chúng tôi có lên Postman để kiểm thử.
-
Tải Postman (nếu chưa có)
- Tải từ Postman Official Website
-
Import API Collection
- Tìm file
BTL_JAVA.postman_collection.jsonở thư mục gốc của dự án - Mở Postman, chọn Import
- Import file
BTL_JAVA.postman_collection.json - Bạn sẽ thấy một folder 2 cấp với các API đã được tổ chức
- Tìm file
- Chạy thử API Đăng nhập Admin
- Nếu trả về response thành công như sau:
{
"code": 0,
"result": {
"token": "eyJhbGciOiJIUzUxMiJ9...",
"authenticated": true,
"role": null
}
}→ Hệ thống BE và DB đã chạy thành công! Bạn có thể sử dụng các API khác để truy cập CSDL.
-
Clone dự án Frontend
git clone https://github.com/hoangnv25/BTL_Java_FE.git
Hoặc tải file ZIP từ GitHub.
-
Cài đặt dependencies
cd BTL_Java_FE npm install -
Chạy Frontend
npm run dev
-
Frontend sẽ chạy tại địa chỉ
http://localhost:5173
Sau khi hoàn thành tất cả các bước trên, bạn đã có:
- ✅ Database MySQL đã được import và sẵn sàng
- ✅ Backend API chạy tại
http://localhost:8080 - ✅ Frontend chạy tại
http://localhost:5173và có thể tương tác với Backend qua giao diện người dùng
- Quản trị: Tài khoản:
admin, mật khẩuadmin - Người dùng: Tạo mới hoặc Tài khoản:
hoang, mật khẩuhoang
- Báo cáo dự án: file
Báo cáo BTL Java.pdftrong thư mục chính của dự án phần Backend - Mục đích: Dự án được phát triển phục vụ mục đích học tập, không vì mục đích thương mại
- Tích hợp dịch vụ:
- OAuth2 Google và VNPay yêu cầu cấu hình credentials/API keys riêng. Khi clone dự án về, bạn cần tự cấu hình các thông tin này trong file cấu hình để các tính năng này hoạt động
- Tham khảo tài liệu của Google OAuth2 và VNPay Sandbox để thiết lập
- Hình ảnh: Các hình ảnh sản phẩm trong dự án được tham khảo từ các website thương mại điện tử, chỉ sử dụng cho mục đích học tập và demo
