Hệ thống quản lý phòng trọ hiện đại và toàn diện được xây dựng với Next.js 15, TypeScript và MongoDB.
- Thống kê tổng quan về phòng, doanh thu, hóa đơn
- Biểu đồ doanh thu theo tháng
- Danh sách hóa đơn sắp đến hạn
- Danh sách sự cố cần xử lý
- Hợp đồng sắp hết hạn
- CRUD thông tin tòa nhà
- Upload ảnh tòa nhà
- Quản lý tiện ích chung
- Xem danh sách phòng theo tòa nhà
- CRUD thông tin phòng
- Upload ảnh phòng
- Lọc phòng theo trạng thái
- Xem lịch sử thuê phòng
- Quản lý tiện nghi phòng
- CRUD thông tin khách thuê
- Upload ảnh CCCD
- Lịch sử thuê phòng
- Lịch sử thanh toán
- Tạo hợp đồng mới
- Upload file hợp đồng PDF
- Gia hạn hợp đồng
- Chấm dứt hợp đồng
- In hợp đồng
- Ghi chỉ số hàng tháng
- Upload ảnh chỉ số
- Tự động tính tiêu thụ
- Lịch sử chỉ số
- Tạo hóa đơn tự động theo chu kỳ
- Tính toán tự động: tiền điện, nước, dịch vụ
- Gửi thông báo hóa đơn
- In hóa đơn
- Xuất báo cáo Excel
- Ghi nhận thanh toán
- Upload biên lai
- Lịch sử thanh toán
- Xuất phiếu thu
- Khách thuê báo cáo sự cố
- Phân loại và ưu tiên sự cố
- Theo dõi tiến độ xử lý
- Upload ảnh sự cố
- Gửi thông báo đến khách thuê
- Thông báo theo phòng/tòa nhà
- Lịch sử thông báo
- Quản lý người dùng
- Cấu hình hệ thống
- Sao lưu và khôi phục dữ liệu
- Cài đặt thông báo
- Framework: Next.js 15 (App Router)
- Language: TypeScript
- UI Components: shadcn/ui
- Styling: Tailwind CSS v4.1
- State Management: React Hooks, Context API
- Form Handling: React Hook Form + Zod validation
- Icons: lucide-react
- API: Next.js API Routes (App Router)
- Authentication: NextAuth.js (JWT + Session)
- Database: MongoDB với Mongoose ODM
- Date handling: date-fns
- Charts: recharts
- Toast notifications: sonner
- File upload: uploadthing hoặc cloudinary
- Node.js: Phiên bản 18 trở lên (Khuyến nghị: Node.js 20+)
- npm: Đi kèm với Node.js
- MongoDB Atlas: URI connection string (hoặc MongoDB local)
- Git: Để clone repository
- Code Editor: VS Code (khuyến nghị) hoặc bất kỳ editor nào
- Tải và cài đặt Node.js từ: https://nodejs.org/
- Kiểm tra cài đặt thành công:
node --version # Nên >= v18.0.0
npm --version # Nên >= 9.0.0- Windows: https://git-scm.com/download/win
- Mac: https://git-scm.com/download/mac
- Linux:
sudo apt-get install git
# Clone repository (thay <repository-url> bằng link git của bạn)
git clone <repository-url>
# Di chuyển vào thư mục dự án
cd demo-phong-tro# Cài đặt tất cả package cần thiết (có thể mất 2-5 phút)
npm install
# Hoặc nếu gặp lỗi, thử:
npm install --legacy-peer-deps# Windows (PowerShell)
Copy-Item env.example .env.local
# Mac/Linux
cp env.example .env.localMở file .env.local bằng editor và cập nhật các thông tin sau:
# Database - QUAN TRỌNG: Thêm tên database vào URI
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/TENDATABASE?retryWrites=true&w=majority&appName=AppName
# NextAuth - Tạo secret key ngẫu nhiên
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=your-random-secret-key-here-make-it-long-and-complex
# Cloudinary (upload ảnh) - QUAN TRỌNG
NEXT_PUBLIC_CLOUD_NAME=your-cloudinary-name
NEXT_PUBLIC_UPLOAD_PRESET=your-upload-preset
# Email (tùy chọn - để gửi thông báo)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-passwordChạy lệnh sau để tạo secret key ngẫu nhiên:
# Windows PowerShell
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
# Mac/Linux/Git Bash
openssl rand -base64 32Copy kết quả vào NEXTAUTH_SECRET trong file .env.local
- Đăng ký tài khoản miễn phí tại: https://cloudinary.com/
- Vào Dashboard, lấy:
- Cloud Name: Điền vào
NEXT_PUBLIC_CLOUD_NAME - Upload Preset:
- Vào Settings → Upload
- Tạo Upload Preset mới (unsigned)
- Copy tên preset vào
NEXT_PUBLIC_UPLOAD_PRESET
- Cloud Name: Điền vào
npm run devĐợi vài giây cho đến khi thấy thông báo:
✓ Ready in 3.2s
○ Local: http://localhost:3000
Mở trình duyệt và truy cập: http://localhost:3000
Nếu muốn test với dữ liệu mẫu:
# Windows PowerShell
Invoke-WebRequest -Uri http://localhost:3000/api/seed -Method POST
# Mac/Linux/Git Bash
curl -X POST http://localhost:3000/api/seed
# Hoặc dùng browser: Truy cập http://localhost:3000/api/seed trong trình duyệt- Email:
admin@example.com - Password:
admin123
Nguyên nhân: MongoDB URI không đúng hoặc IP chưa được whitelist
Giải pháp:
- Kiểm tra MongoDB URI trong file
.env.local - Vào MongoDB Atlas → Network Access → Add IP Address
- Chọn "Allow access from anywhere" (0.0.0.0/0) để test
Nguyên nhân: Dependencies chưa được cài đặt đầy đủ
Giải pháp:
# Xóa node_modules và cài lại
rm -rf node_modules package-lock.json
npm installNguyên nhân: Port 3000 đang được sử dụng
Giải pháp:
# Chạy trên port khác
npm run dev -- -p 3001Nguyên nhân: Chưa cấu hình Cloudinary
Giải pháp: Xem lại Bước 4.4
- ✅ Đã cài đặt Node.js 18+
- ✅ Đã clone repository
- ✅ Đã chạy
npm installthành công - ✅ Đã tạo file
.env.local - ✅ Đã cấu hình MONGODB_URI với TÊN DATABASE
- ✅ Đã tạo NEXTAUTH_SECRET
- ✅ Đã cấu hình Cloudinary
- ✅ Đã chạy
npm run devthành công - ✅ Truy cập http://localhost:3000 được
- ✅ (Optional) Đã seed data và đăng nhập được
- Push code lên GitHub
git add .
git commit -m "Initial commit"
git push origin main-
Deploy với Vercel
- Truy cập: https://vercel.com/
- Đăng nhập bằng GitHub
- Click "New Project"
- Import repository
demo-phong-tro - Cấu hình Environment Variables (copy từ
.env.local) - Click "Deploy"
-
Cập nhật NEXTAUTH_URL
- Sau khi deploy xong, copy URL Vercel (vd:
https://demo-phong-tro.vercel.app) - Vào Settings → Environment Variables
- Sửa
NEXTAUTH_URLthành URL mới - Redeploy
- Sau khi deploy xong, copy URL Vercel (vd:
- Backup MongoDB URI: Lưu lại MongoDB URI ở nơi an toàn
- Đổi mật khẩu admin: Đăng nhập và đổi password ngay
- Tạo tài khoản riêng: Không dùng chung tài khoản admin
- Backup database: Thường xuyên export data từ MongoDB Atlas
- Check logs: Nếu có lỗi, xem logs trong terminal
- Update thường xuyên: Chạy
npm updateđể update dependencies
Nếu gặp vấn đề trong quá trình setup:
- Kiểm tra lại từng bước trong hướng dẫn
- Xem phần "Xử lý lỗi thường gặp"
- Liên hệ người phát triển
Hệ thống sử dụng MongoDB với các collection chính:
- NguoiDung: Quản lý người dùng (admin, chủ nhà, nhân viên)
- ToaNha: Thông tin tòa nhà
- Phong: Thông tin phòng trọ
- KhachThue: Thông tin khách thuê
- HopDong: Hợp đồng thuê phòng
- ChiSoDienNuoc: Chỉ số điện nước hàng tháng
- HoaDon: Hóa đơn thanh toán
- ThanhToan: Giao dịch thanh toán
- SuCo: Báo cáo sự cố
- ThongBao: Thông báo hệ thống
Hệ thống sử dụng NextAuth.js với:
- JWT tokens
- Session management
- Role-based access control (admin, chủ nhà, nhân viên)
- Protected routes
- Mobile-first approach
- Sidebar collapse trên mobile
- Bảng responsive với horizontal scroll
- Form stack trên mobile
- Push code lên GitHub
- Connect với Vercel
- Cấu hình environment variables
- Deploy
docker build -t motel-management .
docker run -p 3000:3000 motel-managementPOST /api/auth/register- Đăng ký tài khoảnPOST /api/auth/[...nextauth]- Đăng nhập
GET /api/toa-nha- Lấy danh sách tòa nhàPOST /api/toa-nha- Tạo tòa nhà mớiGET /api/toa-nha/[id]- Lấy thông tin tòa nhàPUT /api/toa-nha/[id]- Cập nhật tòa nhàDELETE /api/toa-nha/[id]- Xóa tòa nhà
GET /api/phong- Lấy danh sách phòngPOST /api/phong- Tạo phòng mớiGET /api/phong/[id]- Lấy thông tin phòngPUT /api/phong/[id]- Cập nhật phòngDELETE /api/phong/[id]- Xóa phòng
GET /api/khach-thue- Lấy danh sách khách thuêPOST /api/khach-thue- Tạo khách thuê mớiGET /api/khach-thue/[id]- Lấy thông tin khách thuêPUT /api/khach-thue/[id]- Cập nhật khách thuêDELETE /api/khach-thue/[id]- Xóa khách thuê
GET /api/hop-dong- Lấy danh sách hợp đồngPOST /api/hop-dong- Tạo hợp đồng mớiGET /api/hop-dong/[id]- Lấy thông tin hợp đồngPUT /api/hop-dong/[id]- Cập nhật hợp đồngDELETE /api/hop-dong/[id]- Xóa hợp đồng
GET /api/chi-so-dien-nuoc- Lấy danh sách chỉ sốPOST /api/chi-so-dien-nuoc- Ghi chỉ số mới
GET /api/hoa-don- Lấy danh sách hóa đơnPOST /api/hoa-don- Tạo hóa đơn mới
GET /api/thanh-toan- Lấy danh sách thanh toánPOST /api/thanh-toan- Ghi nhận thanh toán
GET /api/su-co- Lấy danh sách sự cốPOST /api/su-co- Báo cáo sự cốGET /api/su-co/[id]- Lấy thông tin sự cốPUT /api/su-co/[id]- Cập nhật sự cốDELETE /api/su-co/[id]- Xóa sự cố
GET /api/thong-bao- Lấy danh sách thông báoPOST /api/thong-bao- Gửi thông báo
GET /api/dashboard/stats- Lấy thống kê dashboard
- Fork repository
- Tạo feature branch (
git checkout -b feature/AmazingFeature) - Commit changes (
git commit -m 'Add some AmazingFeature') - Push to branch (
git push origin feature/AmazingFeature) - Tạo Pull Request
Distributed under the MIT License. See LICENSE for more information.
Project Link: https://github.com/yourusername/demo-phong-tro