Customer Engagement Platform for Email, Push Notifications, & SMS
The world's leader for mobile push notifications, web push, SMS, email and in-app messaging. Trusted by 2 million+ businesses to send 12 billion+ messages per…
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
"우리동네 맛평가단" - 중소 식품 사업자와 소비자를 잇는 솔직한 맛 평가 & 홍보 플랫폼 ✨ 지금 바로 방문하기 🔗 Demo 바로가기 밥터뷰는 동네 식당 사장님과 손님을 "체험단"으로 연결하는 모바일 웹 서비스입니다. 사장님은 신메뉴나 주력 메뉴를 체험단에게 제공하고, 손님(맛평가단)은 저렴하거나 무료로 음식을 경험한 뒤 장점 / 단점 / 개선점으로 구분된 솔직한 리뷰를 남깁니다. 사장님은 이렇게 모인 리뷰를 대시보드에서 분석해 메뉴 개선과 홍보에 활용하고, 손님은 리뷰를 쓸 때마다 포인트를 적립해 등급을 올리고 상점에서 사용합니다. 배달앱의 단순 별점 대신 구조화된 정성 피드백을 주고받는 것이 밥터뷰의 핵심입니다. • 대형 브랜드가 마케팅을 독점해, 동네 식당·중소 식품 사업자는 인지도를 쌓기 어렵고 광고비 부담이 큽니다. • 기존 별점 리뷰는 신뢰도가 낮고, "무엇을 어떻게 고쳐야 하는지"에 대한 구체적 피드백을 얻기 어렵습니다. 밥터뷰는 무신사·화해류의 체험단 모델을 동네 식품에 적용해, 사장님에게는 실질적인 개선 인사이트를, 손님에게는 새로운 맛집을 저렴하게 경험할 기회를 제공합니다.檢視完整 README ↗
"우리동네 맛평가단" - 중소 식품 사업자와 소비자를 잇는 솔직한 맛 평가 & 홍보 플랫폼
밥터뷰는 동네 식당 사장님과 손님을 "체험단"으로 연결하는 모바일 웹 서비스입니다.
사장님은 신메뉴나 주력 메뉴를 체험단에게 제공하고, 손님(맛평가단)은 저렴하거나 무료로 음식을 경험한 뒤 장점 / 단점 / 개선점으로 구분된 솔직한 리뷰를 남깁니다. 사장님은 이렇게 모인 리뷰를 대시보드에서 분석해 메뉴 개선과 홍보에 활용하고, 손님은 리뷰를 쓸 때마다 포인트를 적립해 등급을 올리고 상점에서 사용합니다.
배달앱의 단순 별점 대신 구조화된 정성 피드백을 주고받는 것이 밥터뷰의 핵심입니다.
밥터뷰는 무신사·화해류의 체험단 모델을 동네 식품에 적용해, 사장님에게는 실질적인 개선 인사이트를, 손님에게는 새로운 맛집을 저렴하게 경험할 기회를 제공합니다.
밥터뷰는 사장님(B2B)과 맛평가단(B2C) 두 종류의 사용자를 하나의 앱에서 지원합니다.
utils/locationUtils.ts)utils/reviewAnalytics.ts)data/levelSystem.ts, stores/pointStore.ts)public/sw.js)utils/validation.ts)도메인별로 분리된 Zustand 스토어로 전역 상태를 관리합니다.
| 스토어 | 역할 |
|---|---|
authStore | 로그인 사용자 정보 / 토큰 |
productStore | 체험단(상품) 목록, 찜, 선택 상품 |
applicationStore | 체험단 신청 내역 |
reviewStore | 작성된 리뷰, 공개/비공개 |
notificationStore | 알림 |
pointStore | 포인트 적립·사용, 레벨 |
각 스토어는 브라우저 localStorage와 연동되어, 새로고침하거나 로그아웃 후 다시 로그인해도 체험단·신청·리뷰·포인트 데이터가 유지됩니다. 인증과 서버 API는 Supabase(Auth, Edge Functions)를 사용합니다.
| 구분 | 사용 기술 |
|---|---|
| Core | React 18, TypeScript, Vite |
| Routing | React Router (react-router-dom v6) |
| State | Zustand (도메인별 스토어) |
| Styling | Tailwind CSS, Radix UI, motion |
| Form & Validation | React Hook Form, Zod |
| Charts | Recharts |
| Backend | Supabase (Auth, Edge Functions) |
| PWA | Web App Manifest + Service Worker |
| Test | Vitest, Testing Library |
| Deploy | Vercel |
git clone https://github.com/Duckcchun/Local-Food-Review-App.git
cd Local-Food-Review-App
npm install
프로젝트 루트에 .env.local 파일을 생성하고 아래 값을 채웁니다. (참고: 저장소에는 예시용 .env.example이 포함되어 있습니다.)
VITE_SUPABASE_PROJECT_ID=your-project-id
VITE_SUPABASE_ANON_KEY=your-anon-public-key
npm run dev
브라우저에서 http://localhost:3000 접속
npm run build
npm run preview
npm run test # 단위 테스트 (Vitest, 1회 실행)
npm run test:watch # 감시 모드
npm run test:coverage # 커버리지 리포트
현재 리뷰 분석, 폼 검증, 이미지 업로드 검증, 레벨/포인트 로직에 대한 단위 테스트가 포함되어 있습니다.
/
├─ public/ # favicon, service worker(sw.js) 등 정적 에셋
├─ src/
│ ├─ components/ # 화면 및 재사용 UI 컴포넌트
│ │ ├─ common/ # EmptyState, LiveRegion, SkipLink 등 공용/접근성 컴포넌트
│ │ ├─ ui/ # Radix 기반 UI 프리미티브 (button, dialog, tabs 등)
│ │ └─ *.tsx # HomePage, BusinessDashboard, ReviewWritePage 등 화면 컴포넌트
│ ├─ pages/ # 라우트 진입점 (*Route.tsx) — URL과 화면 컴포넌트 연결
│ ├─ layouts/ # MainLayout 등 공통 레이아웃
│ ├─ stores/ # Zustand 스토어 (auth, product, application, review, notification, point)
│ ├─ hooks/ # 커스텀 훅 (useLocalStorage, useDarkMode, usePWA, useFocusTrap 등)
│ ├─ data/ # categories, levelSystem, pointShop, mockData 등 정적/시드 데이터
│ ├─ supabase/ # Supabase Edge Functions (functions/server)
│ ├─ utils/ # locationUtils, reviewAnalytics, validation, imageUpload, statsUtils 등
│ │ └─ supabase/ # Supabase 클라이언트 정보(info)
│ ├─ types/ # 전역 TypeScript 타입 정의 (index.ts, types.ts)
│ ├─ figma/ # 디자인 연동 자산 (ImageWithFallback)
│ ├─ styles/ # 전역 스타일 (globals.css)
│ ├─ test/ # 테스트 셋업 (Vitest)
│ ├─ routes.tsx # 라우트 정의
│ ├─ App.tsx # 메인 애플리케이션
│ └─ main.tsx # 애플리케이션 진입점
├─ .env.example # 환경 변수 예시 (Supabase 키 등)
├─ manifest.webmanifest # PWA 매니페스트
├─ package.json
├─ postcss.config.js
└─ vite.config.ts # Vite 설정