Ecommerce Template
Next.js·React 등으로 만든 최신 전자상거래 템플릿
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기https://nhadatradar.com/
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Sàn bất động sản bán & cho thuê chạy thật — tự động cào tin đa nguồn mỗi ngày, dùng AI Gemini chuẩn hoá & chấm điểm, hiển thị theo tin + bản đồ. Kết hợp mô hình aggregator (gom tin từ nhiều nguồn) với marketplace (người bán tự đăng tin, quản lý lead, nhắn tin). 🌐 Web live: https://nhadatradar.com 📊 ~450 tin thật từ 5 nguồn (Chợ Tốt · Batdongsan · Mogi · nhadat · Facebook) · 30 dự án thật · crawl tự động 2 lần/ngày qua GitHub Actions.README 전문 보기 ↗
Sàn bất động sản bán & cho thuê chạy thật — tự động cào tin đa nguồn mỗi ngày, dùng AI Gemini chuẩn hoá & chấm điểm, hiển thị theo tin + bản đồ. Kết hợp mô hình aggregator (gom tin từ nhiều nguồn) với marketplace (người bán tự đăng tin, quản lý lead, nhắn tin).
🌐 Web live: https://nhadatradar.com 📊 ~450 tin thật từ 5 nguồn (Chợ Tốt · Batdongsan · Mogi · nhadat · Facebook) · 30 dự án thật · crawl tự động 2 lần/ngày qua GitHub Actions.
/search) — lọc tỉnh/quận/phường, giá, diện tích, phòng ngủ, sắp xếp, bật/tắt bản đồ kết quả; hỗ trợ semantic search bằng pgvector khi lọc từ khoá thường không đủ./dinh-gia) — ước lượng giá từ dữ liệu tin đang có./thong-ke) — bản đồ giá + xếp hạng giá theo quận + biểu đồ xu hướng./thue-hay-mua) — so sánh yield thuê/mua theo quận./tinh-lai-vay) — trả góp annuity + biểu đồ dư nợ./tin-nhan)./account) — hiển thị trên trang danh bạ môi giới /agents./ban để kéo người đăng tin./api/zalo)./admin) quản trị nội dung; chống spam bằng Cloudflare Turnstile./nha-dat-ban, /nha-dat-cho-thue).| Lớp | Công nghệ |
|---|---|
| Frontend / Backend | Next.js 15 (App Router, TypeScript, Server Actions) + Tailwind CSS |
| Database + Auth | Supabase — Postgres + PostGIS (toạ độ) + pgvector (semantic search) + RLS + Storage |
| Đăng nhập | Email/password + Google OAuth (@supabase/ssr, session refresh qua middleware) |
| Bản đồ | Leaflet + OpenStreetMap (miễn phí; tự chuyển Mapbox nếu có token) |
| AI | Google Gemini (gemini-flash-lite-latest) — chuẩn hoá tin, chatbot, định giá, embedding |
| Crawler | Node.js (fetch/parse HTML) + Playwright cho nguồn chặn bot |
| Deploy | Vercel (web) + GitHub Actions (cron crawl 2 lần/ngày) |
| Khác | Resend (email alert), Zalo OA API, Cloudflare Turnstile, Microsoft Clarity |
src/
middleware.ts # Refresh session Supabase mỗi request
app/
page.tsx # Trang chủ
search/ # Tìm kiếm + lọc + bản đồ kết quả
listings/[id]/ # Chi tiết tin
projects/[id]/ # Chi tiết dự án
thong-ke/ dinh-gia/ thue-hay-mua/ tinh-lai-vay/ # Công cụ & thống kê
auth/ account/ dashboard/ tin-nhan/ admin/ # Auth, hồ sơ, đăng tin, chat, quản trị
api/chat/ # Chatbot AI
api/valuation/ # API định giá
api/zalo/webhook/ # Bot Zalo OA
components/ # ListingCard, ListingMap, PriceMap, ChatWidget, Gallery, ...
lib/ # supabase clients, gemini, geo, format, types, ...
crawler/
chotot.mjs mogi.mjs batdongsan.mjs facebook.mjs # Crawler từng nguồn
merge.mjs geocode-all.mjs quality-gate.mjs embed.mjs
daily.mjs # Orchestrator: crawl → merge → geocode → seed Supabase
alerts.mjs # Email báo tin mới khớp tìm kiếm đã lưu
supabase/
schema.sql # Bảng + RLS + trigger
migrations/ # Vá bảo mật + pgvector (BẮT BUỘC chạy sau schema)
seed.mjs # Nạp tin mẫu (service_role)
.github/workflows/daily-crawl.yml # Cron crawl 09:00 & 15:00 giờ VN
Chợ Tốt (API) ─┐
Mogi (HTML) ─┤
Batdongsan ─┼─► chuẩn hoá ─► AI Gemini (lọc rác, trích field, cò/cá nhân, cảnh báo giá)
nhadat (HTTP) ─┤
Facebook (PW) ─┘
└─► merge (dedupe) ─► geocode bù toạ độ ─► seed Supabase
│
Next.js trên Vercel đọc trực tiếp ◄┘
Seed chỉ xoá–chèn tin source = 'crawl'; tin người dùng tự đăng (agent, zalo_oa) luôn được giữ nguyên.
1. Tạo project Supabase → lấy Project URL, anon key, service_role key (Project Settings → API).
2. Chạy SQL — Supabase SQL Editor: chạy supabase/schema.sql, sau đó toàn bộ file trong supabase/migrations/ theo thứ tự (migration 001 vá bảo mật, bắt buộc).
3. Cấu hình env
cp .env.local.example .env.local
# Điền: NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY,
# SUPABASE_SERVICE_ROLE_KEY, GEMINI_API_KEY, NEXT_PUBLIC_SITE_URL
4. Cài & nạp dữ liệu mẫu
npm install
node --env-file=.env.local supabase/seed.mjs # nạp tin mẫu
# hoặc cào dữ liệu mới toàn bộ nguồn:
node --env-file=.env.local crawler/daily.mjs
5. Chạy
npm run dev # http://localhost:3000
GitHub Actions (daily-crawl.yml) chạy 09:00 & 15:00 giờ VN, hoặc bấm Run workflow chạy tay.
Secrets cần thiết (GitHub → Settings → Secrets → Actions): NEXT_PUBLIC_SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, GEMINI_API_KEY (thêm GEMINI_API_KEY2..5 từ các Google account khác nhau để tăng quota). Riêng Facebook phải cào ở máy nhà (crawl-local.bat) vì IP GitHub Actions bị FB chặn.
PROJECT.md — tài liệu handoff chi tiết: trạng thái, secrets, gotcha, kế hoạch.crawler/CHAY-TREN-MAY.md, crawler/CHAY-24-7.md — hướng dẫn cào ở máy cá nhân.crawler/ZALO-BOT.md — thiết lập bot Zalo OA.SUPABASE_SERVICE_ROLE_KEY chỉ dùng ở server/CI — không bao giờ đưa lên client hay commit.crawler/fb-cookies.json là credential sống, đã gitignore — không commit; dùng account Facebook phụ.supabase/migrations/001_security_fixes.sql để vá lỗ hổng tự phong admin.