15 KiB
Trang Chi Tiết Bất Động Sản - Mục Lục Tài Liệu
Ngày tạo: 2026-04-11
Dự án: GoodGo Platform (Bất Động Sản Việt Nam)
📚 Các Tệp Tài Liệu
1. PROPERTY_DETAIL_PAGE_ANALYSIS.md (17KB, 553 dòng)
Phân Tích Toàn Diện - Bắt đầu từ đây để hiểu đầy đủ
Nội dung:
- ✅ Tổng quan dự án (Next.js 15, Tailwind, Zustand)
- ✅ Cấu trúc trang đầy đủ và kiến trúc
- ✅ Triển khai ảnh bất động sản
- ✅ Các thành phần liên quan đến ảnh (thư viện ảnh, tải lên)
- ✅ Cấu trúc và mẫu thành phần dự án
- ✅ Mẫu sử dụng Next.js Image
- ✅ Mẫu quản lý trạng thái (Zustand)
- ✅ Các thư viện bên thứ ba hiện có
- ✅ Tailwind và các token thiết kế
- ✅ API và kiểu dữ liệu (PropertyMedia, ListingDetail)
- ✅ Cấu trúc tệp đầy đủ
- ✅ Những điểm quan trọng và thực hành tốt nhất
- ✅ Các phụ thuộc chưa có
Dùng khi: Bạn cần hiểu sâu về kiến trúc
2. PROPERTY_DETAIL_QUICK_REFERENCE.md (13KB, 583 dòng)
Đoạn Mã & Mẫu - Hướng dẫn tra cứu nhanh
Nội dung:
- 🎯 Điều hướng nhanh (đường dẫn tệp, các route)
- 🖼️ Làm việc với ảnh (thư viện ảnh, tải lên, cấu trúc dữ liệu)
- 🎨 Mẫu tạo kiểu (tỉ lệ khung hình, các lớp Tailwind)
- 🔄 Mẫu quản lý trạng thái (Zustand, trạng thái cục bộ)
- 🧩 Mẫu thành phần UI (Button, Badge, Card, Dialog)
- 📱 Mẫu thiết kế đáp ứng (điểm dừng, lưới)
- 🔗 Các import thông dụng (import sẵn sàng để sao chép)
- 📊 Ví dụ lấy dữ liệu
- 🌐 Quốc tế hóa
- 🔐 Tính năng bảo mật
- 🧪 Các cân nhắc kiểm thử
- 🚀 Mẹo tối ưu hóa hiệu suất
- 📋 Các tác vụ thông dụng (thêm phần tử UI, chỉnh sửa thư viện ảnh)
- 🐛 Các vấn đề phổ biến & giải pháp
Dùng khi: Bạn cần đoạn mã, mẫu, hoặc câu trả lời nhanh
3. PROPERTY_DETAIL_COMPONENTS_MAP.md (14KB, 601 dòng)
Phân Cấp Thành Phần & Kiến Trúc - Tài liệu tham khảo trực quan
Nội dung:
- 🎯 Phân cấp thành phần trang (cây trực quan)
- 🖼️ Chi tiết thành phần Thư Viện Ảnh
- 📱 Chi tiết thành phần Tải Lên Ảnh
- 🧩 Các thành phần liên quan (kết quả tìm kiếm, thẻ bất động sản)
- 🌐 Luồng dữ liệu & ánh xạ API
- 🎨 Kiến trúc tạo kiểu
- 📊 Mẫu quản lý trạng thái
- 🔗 Bản đồ import & tham chiếu tệp
- 📈 Mức độ phức tạp của thành phần
- 🚀 Các cân nhắc về hiệu suất
- 🔄 Luồng điều hướng
- 📋 Danh sách kiểm tra thành phần
- 🛠️ Hướng dẫn bảo trì
Dùng khi: Bạn cần hiểu mối quan hệ giữa các thành phần
🎯 Hướng Dẫn Bắt Đầu Nhanh
Để Hiểu Triển Khai Hiện Tại:
- Bắt đầu với PROPERTY_DETAIL_PAGE_ANALYSIS.md phần:
- Phần 1: Cấu Trúc Trang Chi Tiết Bất Động Sản
- Phần 2: Ảnh Bất Động Sản - Triển Khai Hiện Tại
- Phần 3: Các Thành Phần Liên Quan Đến Ảnh
Để Thực Hiện Thay Đổi:
-
Kiểm tra PROPERTY_DETAIL_QUICK_REFERENCE.md:
- Tìm mẫu hoặc thành phần liên quan
- Sao chép đoạn mã
- Điều chỉnh cho phù hợp nhu cầu của bạn
-
Tham chiếu PROPERTY_DETAIL_COMPONENTS_MAP.md:
- Hiểu vị trí của thành phần
- Kiểm tra luồng dữ liệu
- Xác minh quản lý trạng thái
Để Xây Dựng Tính Năng Ảnh Mới:
- PROPERTY_DETAIL_PAGE_ANALYSIS.md - Phần 5 (Cách Sử Dụng Next.js Image)
- PROPERTY_DETAIL_QUICK_REFERENCE.md - Phần "Working with Images"
- PROPERTY_DETAIL_COMPONENTS_MAP.md - "Image Gallery Component Details"
📍 Vị Trí Các Tệp Quan Trọng
Tệp Chính
- Trang:
apps/web/app/[locale]/(public)/listings/[id]/page.tsx - Client Chi Tiết:
apps/web/components/listings/listing-detail-client.tsx - Thư Viện Ảnh:
apps/web/components/listings/image-gallery.tsx - Tải Lên Ảnh:
apps/web/components/listings/image-upload.tsx - Thẻ Bất Động Sản:
apps/web/components/search/property-card.tsx
Cấu Hình
- Cấu Hình Tailwind:
apps/web/tailwind.config.ts - Cấu Hình Next.js:
apps/web/next.config.js - Kiểu Dáng Toàn Cục:
apps/web/app/globals.css
API & Trạng Thái
- API Listings:
apps/web/lib/listings-api.ts - Store Xác Thực:
apps/web/lib/auth-store.ts - Store So Sánh:
apps/web/lib/comparison-store.ts
Thành Phần UI
- Button:
apps/web/components/ui/button.tsx - Badge:
apps/web/components/ui/badge.tsx - Card:
apps/web/components/ui/card.tsx - Dialog:
apps/web/components/ui/dialog.tsx
🔑 Các Công Nghệ Chính
| Công Nghệ | Phiên Bản | Mục Đích |
|---|---|---|
| Next.js | 15.5.14 | Framework full-stack (App Router) |
| React | 18.3.0 | Thư viện UI |
| Tailwind CSS | 3.4.0 | Tạo kiểu với biến CSS |
| Zustand | 5.0.12 | Quản lý trạng thái |
| next-intl | 4.9.0 | i18n (Tiếng Việt/Tiếng Anh) |
| React Query | 5.96.2 | Quản lý trạng thái máy chủ |
| Lucide React | 1.7.0 | Biểu tượng |
| Mapbox GL | 3.21.0 | Bản đồ |
| CVA | 0.7.1 | Biến thể thành phần |
✨ Tính Năng Hiện Tại
Hiển Thị Ảnh
- ✅ Ảnh chính đáp ứng (tỉ lệ khung hình 16:9)
- ✅ Nút điều hướng Trước/Tiếp theo
- ✅ Huy hiệu đếm ảnh ("X / Tổng số")
- ✅ Hình thu nhỏ cuộn ngang (64x64px)
- ✅ Tô sáng hình thu nhỏ được chọn
- ✅ Dự phòng trạng thái trống
- ✅ Tối ưu hóa Next.js Image (kích thước đáp ứng)
- ✅ Tải chậm cho hình thu nhỏ
- ✅ Tải ưu tiên cho ảnh đầu tiên
Tải Lên Ảnh
- ✅ Hỗ trợ kéo & thả
- ✅ Nhấp để duyệt
- ✅ Xác thực loại tệp (JPEG, PNG, WebP)
- ✅ Xác thực kích thước tệp (tối đa 10MB)
- ✅ Giới hạn tối đa 20 tệp
- ✅ Lưới xem trước
- ✅ Nút xóa khi di chuột qua
- ✅ Chỉ báo ảnh bìa
- ✅ Dọn dẹp URL khi unmount
Tính Năng Trang
- ✅ Siêu dữ liệu SEO (Open Graph, Twitter Cards)
- ✅ Dữ liệu có cấu trúc JSON-LD
- ✅ Điều hướng breadcrumb
- ✅ Thẻ chi tiết bất động sản
- ✅ Danh sách tiện ích
- ✅ Tích hợp bản đồ
- ✅ Thanh bên liên hệ (cố định)
- ✅ Thống kê (lượt xem, lưu, hỏi thăm)
- ✅ Tích hợp tính năng so sánh
🚀 CHƯA Được Triển Khai
- ❌ Lightbox ảnh / zoom modal
- ❌ Điều hướng bàn phím (← →)
- ❌ Cử chỉ chạm / hỗ trợ vuốt
- ❌ Hiệu ứng chuyển tiếp carousel ảnh
- ❌ Thanh tiến trình tải lên
- ❌ Tiến trình tải lên nhiều tệp
- ❌ Cắt / chỉnh sửa ảnh
- ❌ Phát lại video
- ❌ Trình xem toàn cảnh 360°
- ❌ Phân tích ảnh bằng AI
📋 Tài Liệu Tham Khảo Nhanh Cấu Trúc Dữ Liệu
PropertyMedia
{
id: string;
url: string; // HTTPS URL to image
type: 'image' | 'video'; // Type filter
order: number; // Sort order (0, 1, 2...)
caption: string | null; // Optional caption
}
ListingDetail (một phần)
{
id: string;
property: {
media: PropertyMedia[]; // Array of images/videos
// ... other property fields
};
// ... other listing fields
}
🎓 Lộ Trình Học Tập
Tôi muốn hiểu cách ảnh hoạt động:
- Đọc: PROPERTY_DETAIL_PAGE_ANALYSIS.md - Phần 2
- Xem lại: PROPERTY_DETAIL_QUICK_REFERENCE.md - Phần "Working with Images"
- Kiểm tra: mã nguồn
image-gallery.tsx - Kiểm tra: cấu hình ảnh
next.config.js
Tôi muốn chỉnh sửa thư viện ảnh:
- Kiểm tra: PROPERTY_DETAIL_QUICK_REFERENCE.md - "Modify Image Gallery"
- Chỉnh sửa:
apps/web/components/listings/image-gallery.tsx - Kiểm thử: Hành vi đáp ứng và thay đổi trạng thái
- Tham chiếu: PROPERTY_DETAIL_COMPONENTS_MAP.md - "Image Gallery Component Details"
Tôi muốn thêm tính năng mới (như lightbox):
- Chọn thư viện: PROPERTY_DETAIL_PAGE_ANALYSIS.md - Phần 7
- Cài đặt: Dùng
pnpm add package-name -F @goodgo/web - Tạo: Thành phần wrapper mới
- Tích hợp: Với ImageGallery hiện có
- Kiểm thử: Nhiều ảnh, đáp ứng, các trường hợp ngoại lệ
Tôi muốn hiểu quản lý trạng thái:
- Đọc: PROPERTY_DETAIL_PAGE_ANALYSIS.md - Phần 6
- Xem lại: PROPERTY_DETAIL_QUICK_REFERENCE.md - Phần "State Management"
- Kiểm tra:
auth-store.tsvàcomparison-store.ts
Tôi muốn hiểu mẫu thành phần:
- Đọc: PROPERTY_DETAIL_PAGE_ANALYSIS.md - Phần 4
- Kiểm tra: PROPERTY_DETAIL_COMPONENTS_MAP.md - "Component Complexity Levels"
- Xem lại: PROPERTY_DETAIL_QUICK_REFERENCE.md - Phần "UI Component Patterns"
🔗 Điều Hướng Giữa Các Tài Liệu
PROPERTY_DETAIL_PAGE_ANALYSIS.md
├─ "Section 1" → Component structure → See PROPERTY_DETAIL_COMPONENTS_MAP.md
├─ "Section 2" → Image implementation → See PROPERTY_DETAIL_QUICK_REFERENCE.md "Working with Images"
├─ "Section 4" → Component patterns → See PROPERTY_DETAIL_QUICK_REFERENCE.md "UI Component Patterns"
├─ "Section 5" → Next.js patterns → See PROPERTY_DETAIL_QUICK_REFERENCE.md "Using Images in Components"
└─ "Section 6" → State management → See PROPERTY_DETAIL_QUICK_REFERENCE.md "State Management"
PROPERTY_DETAIL_QUICK_REFERENCE.md
├─ Quick navigation → See PROPERTY_DETAIL_COMPONENTS_MAP.md for full tree
├─ Working with images → See PROPERTY_DETAIL_PAGE_ANALYSIS.md Section 2
└─ Common tasks → See PROPERTY_DETAIL_COMPONENTS_MAP.md "Maintenance Guide"
PROPERTY_DETAIL_COMPONENTS_MAP.md
├─ Page hierarchy → Overview → See PROPERTY_DETAIL_PAGE_ANALYSIS.md Section 1
├─ Gallery details → Implementation → See PROPERTY_DETAIL_PAGE_ANALYSIS.md Section 2
└─ Import map → File paths → See PROPERTY_DETAIL_PAGE_ANALYSIS.md Section 10
💡 Mẹo & Thực Hành Tốt Nhất
Tối Ưu Hóa Ảnh
- Luôn dùng thuộc tính
sizesvới Next.js Image - Chỉ đặt
priority={true}cho ảnh hiển thị trên màn hình đầu tiên - Dùng container tỉ lệ khung hình để tránh dịch chuyển bố cục
- Để Next.js tự chọn định dạng (WebP, AVIF)
Thiết Kế Thành Phần
- Giữ các thành phần tập trung (trách nhiệm đơn lẻ)
- Dùng CVA để quản lý biến thể
- Ưu tiên kết hợp hơn kế thừa
- Giữ trạng thái cục bộ cho UI, trạng thái toàn cục cho ứng dụng
Quản Lý Trạng Thái
- Dùng Zustand cho trạng thái toàn cục (xác thực, so sánh)
- Dùng trạng thái React cục bộ cho UI thành phần (chỉ số thư viện ảnh)
- Dùng React Query cho trạng thái máy chủ
- Chỉ lưu dữ liệu thiết yếu vào localStorage
Kiểm Thử
- Mock thành phần Next.js Image
- Kiểm thử hành vi đáp ứng
- Kiểm thử các trường hợp ngoại lệ (trạng thái trống, nhiều ảnh)
- Mock các store Zustand
🤝 Đóng Góp Thay Đổi
Để chỉnh sửa thư viện ảnh:
- Tạo nhánh mới
- Chỉnh sửa
apps/web/components/listings/image-gallery.tsx - Kiểm thử hành vi đáp ứng
- Cập nhật định nghĩa kiểu nếu cần
- Gửi PR kèm mô tả
Để thêm tính năng ảnh mới:
- Kiểm tra PROPERTY_DETAIL_PAGE_ANALYSIS.md Phần 12 (phần chưa có)
- Đánh giá các lựa chọn thư viện
- Tạo thành phần wrapper
- Tích hợp mà không phá vỡ các tính năng hiện có
- Ghi lại các thay đổi
Để cập nhật tài liệu:
- Chỉnh sửa tệp
.mdtương ứng - Giữ các phần có tổ chức
- Bao gồm ví dụ mã
- Tham chiếu chéo các tài liệu khác
- Duy trì định dạng nhất quán
📞 Câu Trả Lời Nhanh
H: Làm thế nào để hiển thị ảnh?
Đ: Dùng next/image với bố cục fill và container tỉ lệ khung hình. Xem PROPERTY_DETAIL_QUICK_REFERENCE.md "Using Images in Components"
H: Làm thế nào để thêm quản lý trạng thái?
Đ: Dùng Zustand cho toàn cục, React.useState cho cục bộ. Xem PROPERTY_DETAIL_PAGE_ANALYSIS.md Phần 6
H: Làm thế nào để thêm lightbox?
Đ: Cài đặt thư viện, tạo wrapper, tích hợp với thư viện ảnh. Xem PROPERTY_DETAIL_QUICK_REFERENCE.md "Add Image Lightbox"
H: Các thành phần UI ở đâu?
Đ: apps/web/components/ui/. Xem PROPERTY_DETAIL_PAGE_ANALYSIS.md Phần 10
H: Những định dạng ảnh nào được cho phép?
Đ: JPEG, PNG, WebP. Xem PROPERTY_DETAIL_QUICK_REFERENCE.md "File Upload Component"
H: Có điều hướng bàn phím không?
Đ: Hiện chưa có. Xem PROPERTY_DETAIL_COMPONENTS_MAP.md "Component Checklist"
📊 Thống Kê Tài Liệu
| Chỉ Số | Giá Trị |
|---|---|
| Tổng Số Dòng | 1.737 |
| Tài Liệu Phân Tích | 553 dòng |
| Tài Liệu Tham Khảo Nhanh | 583 dòng |
| Bản Đồ Thành Phần | 601 dòng |
| Ví Dụ Mã | 50+ đoạn |
| Tệp Quan Trọng Được Ghi Lại | 20+ |
| Công Nghệ Được Đề Cập | 10+ |
✅ Danh Sách Kiểm Tra Cho Nhà Phát Triển Mới
- Đọc PROPERTY_DETAIL_PAGE_ANALYSIS.md (Phần 1-3)
- Xem lại PROPERTY_DETAIL_COMPONENTS_MAP.md (Phân cấp trang)
- Kiểm tra vị trí tệp quan trọng (liệt kê ở trên)
- Hiểu cấu trúc dữ liệu (PropertyMedia, ListingDetail)
- Xem lại mã nguồn thư viện ảnh
- Hiểu mẫu Zustand store
- Xem lại mẫu thành phần UI
- Làm quen với các lớp Tailwind
- Kiểm thử với môi trường phát triển cục bộ
- Đánh dấu trang mục lục này để tham chiếu nhanh
🎓 Các Bước Tiếp Theo
-
Hiểu Trạng Thái Hiện Tại
- Đọc phân tích toàn diện
- Xem lại phân cấp thành phần
- Kiểm tra các thành phần hiện có
-
Lên Kế Hoạch Thay Đổi
- Tham chiếu hướng dẫn nhanh
- Kiểm tra mẫu mã
- Xác minh cấu trúc dữ liệu
-
Triển Khai & Kiểm Thử
- Dùng các đoạn mã được cung cấp
- Tuân theo các mẫu
- Kiểm thử đáp ứng
-
Cập Nhật Tài Liệu
- Cập nhật mục lục này nếu cần
- Thêm vào các phần liên quan
- Duy trì tính nhất quán
Cập Nhật Lần Cuối: 2026-04-11
Phiên Bản Tài Liệu: 1.0
Trạng Thái: Hoàn Chỉnh & Toàn Diện