6.4 KiB
6.4 KiB
Review System
Chức năng 1: HomePage – Trang chủ hiển thị phòng nổi bật
Mục tiêu
Tạo giao diện trang chủ giới thiệu phòng nổi bật, banner và điều hướng đến danh sách phòng.
Nhiệm vụ chi tiết
- Route: /
- Banner:
GET /api/banners?position=home- Nếu không có banner → hiển thị ảnh mặc định.
- Có thể dùng Carousel hoặc ảnh tĩnh.
- Phòng nổi bật:
GET /api/rooms?featured=true- Hiển thị 4–6 phòng bằng component RoomCard.
- Nút “Xem tất cả phòng” → điều hướng /rooms.
- Loading skeleton trong khi chờ dữ liệu.
Kết quả mong đợi
- Trang chủ hiển thị banner và danh sách phòng nổi bật rõ ràng.
- Khi không có banner → ảnh fallback được hiển thị.
- Phòng nổi bật load từ API, giới hạn 4–6 phòng.
- UX mượt, có skeleton khi load.
- Nút “Xem tất cả phòng” điều hướng chính xác đến /rooms.
Chức năng 2: RoomListPage – Danh sách & Bộ lọc phòng
Mục tiêu
Hiển thị danh sách phòng, cho phép người dùng lọc theo loại, giá, số người và phân trang.
Nhiệm vụ chi tiết
- Route: /rooms
- Bộ lọc (component RoomFilter):
- Trường lọc: loại phòng, giá min–max, số người.
- Khi submit → gọi API:
GET /api/rooms?type=&minPrice=&maxPrice=&capacity=&page= - Lưu bộ lọc vào URL query.
- Nút “Reset” để xóa toàn bộ bộ lọc.
- Phân trang (Pagination component).
- Hiển thị danh sách bằng RoomCard.
Kết quả mong đợi
- Danh sách phòng hiển thị chính xác theo filter.
- Bộ lọc hoạt động mượt, có thể reset dễ dàng.
- Phân trang hiển thị chính xác số trang.
- Filter được lưu trong URL (giúp reload không mất).
- Giao diện responsive, dễ đọc, không bị vỡ.
Chức năng 3: RoomDetailPage – Chi tiết phòng & Đánh giá
Mục tiêu
Tạo trang chi tiết phòng đầy đủ thông tin, hình ảnh, tiện ích và khu vực đánh giá.
Nhiệm vụ chi tiết
- Route: /rooms/:id
- Phần nội dung:
-Thông tin phòng (ảnh, mô tả, giá, tiện ích)
- RoomGallery: Carousel ảnh
- RoomAmenities: danh sách tiện ích
- Nút “Đặt ngay” → điều hướng /booking/:roomId
- Review Section:
- Lấy danh sách review đã duyệt:
GET /api/rooms/:id/reviews - Nếu người dùng đã từng đặt phòng:
POST /api/reviews
- Lấy danh sách review đã duyệt:
- Component RatingStars + ReviewForm.
- Nếu chưa đăng nhập → hiển thị “Vui lòng đăng nhập để đánh giá”.
- Tính trung bình điểm review.
- Loading skeleton khi chờ review.
Kết quả mong đợi
- Hiển thị đầy đủ ảnh, mô tả, tiện ích phòng.
- Carousel hoạt động mượt mà.
- Review hiển thị đúng, có trung bình số sao.
- Người đã đặt có thể viết review (sau duyệt).
- Nút “Đặt ngay” điều hướng chính xác đến form booking.
- Skeleton hiển thị khi chờ dữ liệu.
Chức năng 4: SearchRoom – Tìm phòng trống
Mục tiêu
Cho phép người dùng tìm phòng trống theo ngày và loại phòng.
Nhiệm vụ chi tiết
- Form tìm kiếm (ở HomePage hoặc RoomListPage):
- Input: ngày đến (from), ngày đi (to), loại phòng.
- API:
GET /api/rooms/available?from=&to=&type= - Validate:
- from < to
- from không nhỏ hơn hôm nay.
- Kết quả:
- Hiển thị danh sách bằng RoomCard.
- Nếu không có kết quả → “Không tìm thấy phòng phù hợp”.
- Dùng react-datepicker hoặc react-day-picker.
- Loading spinner khi đang tìm.
Kết quả mong đợi
- Form tìm phòng hoạt động, validate chính xác.
- Khi bấm tìm → hiển thị danh sách phòng trống.
- Nếu không có kết quả → thông báo thân thiện.
- Loading hiển thị rõ trong lúc chờ.
- Tìm theo ngày & loại phòng chính xác từ backend.
Chức năng 5: Wishlist – Danh sách yêu thích
Mục tiêu
Cho phép người dùng thêm, bỏ hoặc xem danh sách phòng yêu thích.
Nhiệm vụ chi tiết
- API:
POST /api/favorites/:roomId # Thêm DELETE /api/favorites/:roomId # Xóa GET /api/favorites # Lấy danh sách yêu thích - UI:
- FavoriteButton (icon ❤️):
- Nếu yêu thích → tô đỏ
- Nếu chưa → viền xám
- Tooltip: “Thêm vào yêu thích” / “Bỏ yêu thích”
- FavoriteButton (icon ❤️):
- Nếu chưa đăng nhập:
- Lưu tạm trong localStorage (guestFavorites)
- Khi đăng nhập → đồng bộ với server.
- Toast thông báo khi thêm/bỏ yêu thích.
Kết quả mong đợi
- Nút ❤️ hoạt động đúng trạng thái (đỏ / xám).
- Người chưa đăng nhập vẫn có thể lưu tạm yêu thích.
- Khi đăng nhập → danh sách đồng bộ với backend.
- Toast hiển thị “Đã thêm vào yêu thích” / “Đã bỏ yêu thích”.
- API hoạt động đúng, không lỗi 401 khi đăng nhập hợp lệ.
Chức năng 6: Tối ưu UI/UX & Performance
Mục tiêu
Cải thiện trải nghiệm người dùng, tối ưu tốc độ tải và khả năng hiển thị responsive.
Nhiệm vụ chi tiết
- Loading skeleton khi fetch phòng hoặc review.
- Debounce khi nhập giá để tránh gọi API liên tục.
- Infinite scroll (tùy chọn) thay cho pagination.
- Responsive layout:
- Desktop: 3–4 cột
- Tablet: 2 cột
- Mobile: 1 cột
- Empty states:
- Không có phòng → hiển thị ảnh minh họa + dòng “Không tìm thấy phòng phù hợp”.
- Không có review → “Hãy là người đầu tiên đánh giá!”.
- Toast thông báo khi thêm yêu thích, gửi review, lỗi mạng.
Kết quả mong đợi
- Trang hoạt động mượt, có skeleton khi chờ dữ liệu.
- Tốc độ phản hồi nhanh (debounce hoạt động).
- Responsive trên mọi kích thước màn hình.
- Các empty state hiển thị thân thiện.
- Toast thông báo rõ ràng, UX thân thiện.