Gốm Sứ Xanh là hệ thống thương mại điện tử chuyên sản phẩm gốm sứ thủ công và các buổi workshop trải nghiệm làm gốm. Backend là 8 microservice Spring Boot, frontend là HTML/CSS/JavaScript thuần.
- Giá hai mức: giá niêm yết và giá bán, tự tính phần trăm giảm; flash sale đè lên giá bán.
- Thanh toán: COD, VNPAY (sandbox) và Ví GSX.
- Voucher: phạm vi công khai / chỉ định riêng khách / theo hạng thành viên, tự động áp mã lợi nhất.
- Giỏ hàng, yêu thích, tìm sản phẩm bằng ảnh (so khớp dHash).
- Vòng đời đơn kiểu Shopee: dòng thời gian đầy đủ, lịch sử cập nhật trạng thái, huỷ đơn kèm lý do.
- Trả hàng và khiếu nại: gộp chung một luồng, có hoàn tiền về ví hoặc tài khoản ngân hàng.
- Nạp tiền qua VNPAY, rút tiền có admin duyệt, thanh toán đơn bằng số dư, số dư cập nhật tức thời qua WebSocket.
- Điểm thưởng theo từng lô có hạn dùng, tác vụ nền tự trừ điểm hết hạn và báo trước.
- Hạng thành viên tự nâng/hạ theo chu kỳ, mỗi hạng có hệ số điểm, hạn trả hàng và ngưỡng miễn phí vận chuyển riêng.
- Nhiều ca học cho mỗi workshop, số chỗ còn lại tính từ các ca và cập nhật realtime.
- Kiểm tra hạn đăng ký phải trước ngày diễn ra.
- Blog có lưu nháp, yêu thích bài viết, đếm lượt xem realtime.
- Thông báo realtime hai chiều qua WebSocket cho cả khách và admin, trạng thái đã đọc lưu riêng từng tài khoản.
- Quản lý sản phẩm, đơn hàng, workshop, bài viết, voucher, tài khoản người dùng.
- Duyệt yêu cầu rút tiền, điều chỉnh điểm thưởng và số dư ví của khách (bắt buộc nhập lý do).
- Biểu đồ doanh thu Chart.js theo tuần và theo tháng.
HTML5, CSS3, JavaScript thuần (không framework), Chart.js, SockJS + STOMP cho realtime.
Java 17, Spring Boot, Spring Cloud Gateway, Eureka, Spring Security + JWT, Spring Data JPA, RabbitMQ, WebSocket (STOMP), Cloudinary.
| Service | Cổng | Cơ sở dữ liệu |
|---|---|---|
discovery-service (Eureka) |
8761 | — |
api-gateway |
8080 | — |
identity-service |
8081 | identity_service |
product-service |
8082 | product_service |
order-service |
8083 | order_service |
workshop-service |
8084 | workshop_service |
content-service |
8085 | content_service |
notification-service |
8086 | notification_service |
| Frontend tĩnh | 3000 | — |
gom_su_xanh/
├── be/ # 8 microservice Spring Boot
├── fe-admin/ # Giao diện quản trị
├── fe-user/ # Giao diện khách hàng
├── FIX-PLAN.md # Kế hoạch sửa lỗi và bổ sung nghiệp vụ
├── run-all.ps1 # Script khởi động toàn hệ thống
└── README.md
- JDK 17 trở lên và Maven
- MySQL 8 trở lên (mặc định
localhost:3306) - RabbitMQ đang chạy ở
localhost:5672 - Node.js (chỉ để phục vụ thư mục frontend tĩnh trên cổng 3000)
Các database được tạo tự động nhờ ddl-auto: update, nhưng schema rỗng phải tồn tại trước:
CREATE DATABASE identity_service;
CREATE DATABASE product_service;
CREATE DATABASE order_service;
CREATE DATABASE workshop_service;
CREATE DATABASE content_service;
CREATE DATABASE notification_service;Các service đọc cấu hình từ biến môi trường. Phải đặt trước khi chạy, nếu không service sẽ không khởi động được.
| Biến | Ý nghĩa |
|---|---|
DB_URL |
Chuỗi kết nối MySQL, mặc định trỏ localhost:3306 |
DB_USERNAME |
Tài khoản MySQL |
DB_PASSWORD |
Mật khẩu MySQL |
JWT_SIGNER_KEY |
Khoá ký JWT, tối thiểu 32 ký tự, phải giống nhau ở mọi service |
| Biến | Dùng cho | Ghi chú |
|---|---|---|
CLOUDINARY_NAME, CLOUDINARY_API_KEY, CLOUDINARY_API_SECRET |
Tải ảnh sản phẩm, workshop, bài viết | Đặt CLOUDINARY_API_KEY=dummy để tắt Cloudinary và lưu ảnh vào thư mục uploads/ cục bộ |
VNPAY_TMN_CODE, VNPAY_HASH_SECRET |
Thanh toán và nạp ví qua VNPAY | Dùng sandbox sandbox.vnpayment.vn |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET |
Đăng nhập bằng Google | |
MAIL_USERNAME, MAIL_PASSWORD |
Gửi email OTP | SMTP cổng 587 |
| Biến | Mặc định | Tác vụ |
|---|---|---|
LOYALTY_POINT_EXPIRY_CRON |
0 0 1 * * * |
Trừ điểm của các lô đã hết hạn, báo trước lô sắp hết hạn |
LOYALTY_TIER_CYCLE_CRON |
0 30 1 * * * |
Reset chu kỳ hạng thành viên, báo trước khách sắp bị hạ hạng |
LOYALTY_POINT_RECONCILE_CRON |
0 45 1 * * * |
Đối soát users.points với tổng point_lots.points_remaining, ghi log khi lệch |
Biểu thức cron của Spring có 6 trường và chứa dấu cách, nên phải truyền qua biến môi trường chứ không truyền qua
-Dtrên dòng lệnh.
.\run-all.ps1Thứ tự bắt buộc: discovery-service phải lên trước, api-gateway sau cùng trong nhóm hạ tầng; các service nghiệp vụ chạy thứ tự nào cũng được.
$env:DB_PASSWORD = "<mat-khau-mysql>"
$env:JWT_SIGNER_KEY = "<khoa-toi-thieu-32-ky-tu>"
$env:CLOUDINARY_API_KEY = "dummy"
cd be\discovery-service ; mvn spring-boot:run
cd be\identity-service ; mvn spring-boot:run
cd be\product-service ; mvn spring-boot:run
cd be\order-service ; mvn spring-boot:run
cd be\workshop-service ; mvn spring-boot:run
cd be\content-service ; mvn spring-boot:run
cd be\notification-service ; mvn spring-boot:run
cd be\api-gateway ; mvn spring-boot:runLần chạy đầu tiên, khi các bảng còn rỗng, mỗi service sẽ tự nạp dữ liệu mẫu (danh mục, sản phẩm, workshop, hạng thành viên).
| Trang | Địa chỉ |
|---|---|
| Khách hàng | http://localhost:3000 |
| Quản trị | http://localhost:3000/fe-admin/index.html |
| Eureka | http://localhost:8761 |
Mọi lời gọi API từ frontend đều đi qua gateway http://localhost:8080.
© 2026 Gốm Sứ Xanh. Phát triển bởi Nguyễn Thu Nguyệt và Nguyễn Văn Hiệu.