Một ứng dụng e-commerce đơn giản về nước hoa với giao diện hiện đại (Tailwind) và backend MongoDB/Express. Phù hợp để học và trình diễn dự án cá nhân.
- (Sắp có) – có thể deploy lên Vercel/Netlify (frontend) và Render/Railway (backend).
- Danh sách và chi tiết sản phẩm, responsive UI.
- Tìm kiếm (search) theo tên/mô tả sản phẩm.
- Giỏ hàng, đặt hàng COD (lưu đơn hàng vào DB).
- Đăng ký / Đăng nhập với JWT (access token) – thay thế cơ chế localStorage demo cũ.
- Admin: thêm/sửa/xóa sản phẩm (bảo vệ bằng role + JWT), quản lý đơn hàng & cập nhật trạng thái.
- Frontend: React, React Router, Tailwind CSS.
- Backend: Node.js, Express.
- Database: MongoDB, Mongoose.
- Node.js >= 16
- MongoDB (Local hoặc Atlas)
- Cài dependencies
npm install
- Cấu hình DB
- Mặc định URI:
mongodb://localhost:27017/perfume - Có thể chỉnh trong
src/db.jsđể trỏ tới MongoDB Atlas.
- Khởi chạy MongoDB
- Đảm bảo mongod đang chạy (Compass kết nối OK).
- Import dữ liệu mẫu (tùy chọn)
node src/importProducts.js
- Chạy backend
node src/server.js
- Chạy frontend
npm start
Ghi chú:
package.jsonđã cấu hình proxy tới backend tạihttp://localhost:5000để gọi/api/*từ frontend trong dev.
Hệ thống đã chuyển sang JWT.
Flow cơ bản:
- Đăng ký:
POST /api/auth/registerbody{ username, password }. - Đăng nhập:
POST /api/auth/logintrả về{ token, user: { username, role } }. - Lưu
tokenở frontend (hiện bản demo dùng localStorage:auth_token). - Gọi API admin/protected thêm header:
Authorization: Bearer <token>
Các route bảo vệ (yêu cầu admin + JWT):
POST /api/productsPUT /api/products/:idDELETE /api/products/:idGET /api/ordersPUT /api/orders/:id
Ví dụ fetch cập nhật sản phẩm:
fetch('/api/products/123', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + localStorage.getItem('auth_token')
},
body: JSON.stringify({ name: 'New', price: 100 })
})
Tài khoản mẫu (nếu đã seed / tạo sẵn):
- Admin: tự tạo bằng cách đăng ký rồi sửa role trong DB (
userscollection) thànhadmin.
Lưu ý bảo mật (kế hoạch nâng cấp):
- Access token hiện exp ngắn (ví dụ 15m) – chưa có refresh token.
- Có thể chuyển từ localStorage sang httpOnly cookie để tránh XSS.
- Bổ sung rate limiting & password reset sau.
src/server.js: REST API (products, orders)src/db.js: Kết nối MongoDBsrc/models/: Schema (Product, Order)src/importProducts.js: Seed dữ liệu sản phẩm mẫusrc/components/: UI React (Home, Products, About, Contact, Cart, Admin, …)src/index.css: Tailwind + helper classes (btn-primary, glass, …)
Nếu gặp lỗi push non-fast-forward:
git fetch origin
git rebase origin/main
# Nếu conflict: sửa file rồi
git add <file>
git rebase --continue
git push origin main
- Tác giả: Ltuan126
- Email: (bổ sung nếu cần)
Chi tiết lộ trình phát triển nâng cao (kiến trúc, JWT, pagination, stock, testing, deploy) xem tại: docs/ROADMAP.md
Ghi chú: Đã nâng cấp lên JWT. Tham khảo chi tiết roadmap để xem các bước bảo mật tiếp theo (refresh token, CSRF, rate limiting...).
Quy tắc tích điểm (1 điểm mỗi 10.000₫ sau giảm) và ưu đãi combo mini (3 chai mini -10%) xem chi tiết tại: docs/LOYALTY.md