尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Site vitrine de DishRank. Version web de l'app mobile avec SSR, i18n et SEO. • Next.js 16 (App Router, SSR) • TypeScript • Tailwind CSS v4 • next-intl (i18n : FR, EN, ES, DE, IT) • Supabase (donnees en temps reel) Les donnees Supabase (plats, categories, avis) sont fetchees server-side. Le HTML envoye a Google contient deja l檢視完整 README ↗
Site vitrine de DishRank. Version web de l'app mobile avec SSR, i18n et SEO.
npm install
cp .env.example .env.local
# Remplir avec les vraies valeurs Supabase
npm run dev
| Variable | Description |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | URL du projet Supabase |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Cle anon (publique, protegee par RLS) |
src/
├── app/
│ ├── [locale]/
│ │ ├── layout.tsx # Layout i18n, fonts, dark mode
│ │ └── page.tsx # Page principale SSR
│ ├── dish/
│ │ └── page.tsx # Deep link partage de plats
│ ├── globals.css # Tailwind + CSS vars themes
│ ├── sitemap.ts # Sitemap auto (categories x villes)
│ └── robots.ts
├── components/
│ ├── Nav.tsx # Navbar sticky avec blur
│ ├── Hero.tsx # Hero traduit
│ ├── SearchSection.tsx # Recherche + ville + chips categories
│ ├── DishGrid.tsx # Grille de plats (donnees SSR)
│ ├── WhySection.tsx # 6 arguments cles
│ ├── ExploreCategories.tsx # Emojis parallax au scroll
│ ├── Showcase.tsx # Slideshow 8 ecrans avec autoplay
│ ├── CtaBanner.tsx # CTA telechargement
│ ├── Footer.tsx # Footer + liens legaux
│ ├── LegalSheet.tsx # Bottom sheet RGPD (privacy, CGU, suppression)
│ └── DishModal.tsx # Modal detail plat (placeholder)
├── i18n/
│ ├── config.ts # Locales supportees
│ ├── request.ts # Chargement des messages
│ └── routing.ts # Routing i18n (prefix as-needed)
├── lib/
│ └── supabase.ts # Client Supabase + cache serveur + types
├── messages/
│ ├── fr.json # Francais (defaut)
│ ├── en.json # Anglais
│ ├── es.json # Espagnol
│ ├── de.json # Allemand
│ └── it.json # Italien
└── proxy.ts # Rate limiting + anti-scraping + i18n (Next 16 proxy)
Les donnees Supabase (plats, categories, avis) sont fetchees server-side. Le HTML envoye a Google contient deja les vrais plats avec notes, prix, restaurants.
Le titre et la description changent selon les query params :
| URL | Titre |
|---|---|
/?categorie=burger&ville=Lyon | Meilleur burger de Lyon — DishRank |
/?categorie=sushi | Meilleur sushi — DishRank |
/?ville=Paris | Meilleurs plats de Paris — DishRank |
/en/?categorie=pizza&ville=Lyon | Best pizza in Lyon — DishRank |
Chaque page genere automatiquement les balises hreflang pour les 5 langues + x-default. Google sait que la meme page existe en FR, EN, ES, DE, IT.
Genere automatiquement dans /sitemap.xml :
Detection automatique de la langue du navigateur via le header Accept-Language.
| Langue | URL | Comportement |
|---|---|---|
| Francais (defaut) | dishrank.fr/ | Pas de prefix |
| Anglais | dishrank.fr/en/ | Prefix /en |
| Espagnol | dishrank.fr/es/ | Prefix /es |
| Allemand | dishrank.fr/de/ | Prefix /de |
| Italien | dishrank.fr/it/ | Prefix /it |
Config : localePrefix: 'as-needed' — le prefix n'apparait que pour les langues non-default.
Configures dans next.config.ts :
Content-Security-Policy (bloque XSS, injection)X-Frame-Options: DENY (anti-clickjacking)X-Content-Type-Options: nosniffStrict-Transport-Security (force HTTPS, 2 ans)Referrer-Policy: strict-origin-when-cross-originPermissions-Policy (desactive camera/micro)Dans proxy.ts : 60 requetes/minute par IP. Au-dela, reponse 429.
Blocage des user-agents connus (Scrapy, python-requests, wget, curl, HTTrack...).
Les appels Supabase sont caches en memoire :
Evite de marteler la DB et protege contre les attaques par repetition.
/dish)L'app mobile partage des plats via dishrank.fr/dish?r=RESTAURANT_ID&d=DISH_NAME.
La page tente d'ouvrir l'app native (dishrank://dish?...), sinon propose le Play Store.
.well-known/.well-known/assetlinks.json — Android App Links/.well-known/apple-app-site-association — iOS Universal LinksLes URLs utilisees dans le Play Store redirigent vers la page principale avec le bottom sheet :
| URL Play Store | Redirection |
|---|---|
/privacy | /?page=privacy |
/terms | /?page=terms |
/delete-account | /?page=delete |
/legal | /?page=privacy |
Detection automatique du theme systeme via prefers-color-scheme. Le favicon s'adapte aussi (logo sombre en light, logo clair en dark).
Variables CSS dans globals.css : :root (light) et .dark (dark).
npm i -g vercel
vercel login
vercel
Ajouter les env vars dans le dashboard Vercel :
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYPointer le domaine dishrank.fr vers Vercel (CNAME).
Vercel supporte Next.js SSR nativement. Meme process, ajouter les env vars dans le dashboard.
| Commande | Description |
|---|---|
npm run dev | Serveur de dev (localhost:3000) |
npm run build | Build production |
npm run start | Serveur production |
npm run lint | Lint ESLint |