Ecommerce Template
Next.js·React 등으로 만든 최신 전자상거래 템플릿
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
ระบบสั่งอาหาร ส่งของ และเรียกรถ ภายในตำบลเดียวกัน โดยคนในตำบล ค่าส่งถูกกว่า ถึงเร็วกว่า และเงินหมุนอยู่ในชุมชน ออกแบบให้รองรับได้ถึงระดับ ~7,000 ตำบลทั่วประเทศ โดยแยกข้อมูลแต่ละตำบลที่ชั้นฐานข้อมูล (tambon_id) ไม่ใช่ที่ URL — เว็บเดียวจึงเสิร์ฟได้ทุกตำบล ⚠️ ตัวแปรที่ขึ้นต้น NEXT_PUBLIC_ ต้องตั้ง Type เป็น Config ใน Vercel ถ้าตั้งเป็น Secret จะไREADME 전문 보기 ↗
ระบบสั่งอาหาร ส่งของ และเรียกรถ ภายในตำบลเดียวกัน โดยคนในตำบล ค่าส่งถูกกว่า ถึงเร็วกว่า และเงินหมุนอยู่ในชุมชน
ออกแบบให้รองรับได้ถึงระดับ ~7,000 ตำบลทั่วประเทศ โดยแยกข้อมูลแต่ละตำบลที่ชั้นฐานข้อมูล
(tambon_id) ไม่ใช่ที่ URL — เว็บเดียวจึงเสิร์ฟได้ทุกตำบล
| ส่วน | ใช้ |
|---|---|
| Frontend + API | Next.js 16 (App Router) · React 19 · TypeScript |
| Styling | Tailwind CSS v4 |
| ฐานข้อมูล + Auth | Supabase (PostgreSQL + Row Level Security) |
| Hosting | Vercel |
| ช่องทางผู้ใช้ | PWA + LINE OA / LIFF |
src/
├── app/
│ ├── customer/ ลูกค้า — สั่งอาหาร ส่งของ เรียกรถ ติดตามออร์เดอร์
│ ├── driver/ ไรเดอร์ — รับงาน ดูรายได้
│ ├── merchant/ ร้านค้า — คิวออร์เดอร์ เมนู
│ ├── admin/ ตัวแทนตำบล — อนุมัติสมาชิก ตั้งค่า
│ ├── t/[slug]/ หน้าสาธารณะของตำบล (ไม่ต้องล็อกอิน แชร์ลิงก์ได้)
│ └── api/line/ LINE Messaging API webhook
├── components/ UI ที่ใช้ร่วมกัน + LiffProvider
├── lib/
│ ├── supabase/ client (เบราว์เซอร์) · server (session) · admin (service role)
│ ├── auth-guard.ts ตรวจบทบาทก่อนเข้าหน้า
│ └── line.ts ตรวจลายเซ็น webhook · ส่งข้อความ · สร้างลิงก์ LIFF
├── proxy.ts middleware — รีเฟรช session cookie
└── services/ เรียก API ฝั่ง client
supabase/migrations/ migration ของฐานข้อมูล
wip/ โค้ดที่พักไว้ ยังไม่พร้อมใช้ (ดู wip/api-shops/README.md)
| ตัวแปร | จำเป็น | หมายเหตุ |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | ✅ | Supabase → Settings → API |
NEXT_PUBLIC_SUPABASE_ANON_KEY | ✅ | ใส่ publishable key (sb_publishable_…) — เปิดเผยได้ ความปลอดภัยอยู่ที่ RLS |
LINE_CHANNEL_SECRET | เฉพาะ LINE OA | ใช้ตรวจว่า request มาจาก LINE จริง |
LINE_CHANNEL_ACCESS_TOKEN | เฉพาะ LINE OA | ใช้ส่งข้อความกลับ |
NEXT_PUBLIC_LIFF_ID | เฉพาะ LINE OA | รหัส LIFF app |
SUPABASE_SERVICE_ROLE_KEY | ❌ | ไม่มีโค้ดส่วนไหนใช้แล้ว — ทุกหน้าใช้สิทธิ์ผู้ใช้/สาธารณะผ่าน RLS |
⚠️ ตัวแปรที่ขึ้นต้น
NEXT_PUBLIC_ต้องตั้ง Type เป็น Config ใน Vercel ถ้าตั้งเป็น Secret จะไม่ถูกส่งให้ build ค่าจึงไม่ถูกฝังลงโค้ด แล้วแอปจะต่อฐานข้อมูลไม่ได้
🔑 legacy key ถูกปิดถาวรแล้ว (4 ก.ย. 2569) — anon/service_role แบบ JWT ใช้ไม่ได้อีก โปรเจกต์นี้ใช้ระบบ key แบบใหม่เท่านั้น (
sb_publishable_…/sb_secret_…) ซึ่งหมุนแยกกันได้ ต่างจาก legacy ที่หมุนทีเดียวโดนทั้งคู่และทำให้เว็บล่ม
Authentication → Sign In / Providers → User Signups → Confirm email ต้อง "ปิด"
ผู้ใช้ที่สมัครด้วยเบอร์โทรจะได้อีเมลแฝงที่ส่งจริงไม่ได้ (ดู src/lib/identifier.ts)
ถ้าเปิด Confirm email ระบบจะพยายามส่งเมลยืนยันไปยังอีเมลแฝงนั้น แล้ว
การสมัครด้วยเบอร์โทรจะพังทั้งระบบ — พังแบบเงียบ ๆ ไม่มี error ให้เห็นบนหน้าเว็บ
ผู้ใช้แค่สมัครไม่ผ่านเฉย ๆ และจะโดน rate limit ของผู้ให้บริการเมลตามมา
การยืนยันตัวตนจริงของระบบนี้คือ ตัวแทนตำบลกดอนุมัติ (profiles.approved)
ไม่ใช่การยืนยันอีเมล จึงไม่ได้สูญเสียอะไรจากการปิดสวิตช์นี้
npm install
cp .env.example .env.local # แล้วเติมค่า Supabase
npm run dev
ก่อน deploy ควรทดสอบแบบไม่มี env vars ด้วย เพื่อจำลองสภาพ deploy ครั้งแรก:
mv .env.local .env.local.bak && npm run build && mv .env.local.bak .env.local
build ต้องผ่าน — โค้ดถูกออกแบบให้สร้าง Supabase client ตอนเรียกใช้จริง ไม่ใช่ตอน import
เพราะ next build จะ evaluate ทุก route module
next buildผ่านไม่ได้แปลว่าเว็บใช้ได้ — บั๊กบางแบบ (เช่นชื่อ dynamic segment ชนกัน) โผล่ตอนรันเซิร์ฟเวอร์เท่านั้น ควรnpm startแล้วลองเปิดสักหน้าก่อนเสมอ
migration อยู่ใน supabase/migrations/ เรียงตามวันที่
RLS เปิดครบทุกตาราง การเข้าถึงคุมที่ policy ไม่ใช่ที่โค้ด:
order_events เขียนได้เฉพาะ trigger ของระบบ ผู้ใช้อ่านได้เท่าที่เห็นออร์เดอร์แม่/t/<slug> อ่านด้วยสิทธิ์ anon และจำกัดคอลัมน์ด้วย GRANTเอกสารสถาปัตยกรรม แผนพัฒนา และคู่มือตัวแทนตำบล อยู่ใน Claude Project "โครงการ Delivery" ไม่ได้อยู่ใน repo นี้