个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Application de prise de rendez-vous pour salon de coiffure — Next.js, Flutter, Supabase;
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Gestionnaire de rendez-vous pour un salon de coiffure.
Un seul salon en v1 ; la base est prête pour plusieurs salons.
| Quoi | Adresse |
|---|---|
| Site client (production) | https://salon-rdv-one.vercel.app |
| App pro (Android, APK) | https://github.com/MSKETUDIANT/salon-rdv/releases/tag/app-pro-v0.2.0 |
| Dépôt | https://github.com/MSKETUDIANT/salon-rdv |
Les données en ligne sont des données de démonstration (deux coiffeurs
fictifs, quatre prestations) : docs/donnees-demo.md.
Clients (navigateur) Équipe (Android, navigateur)
│ │
▼ ▼
Site Next.js (web/) App Flutter (pro/)
hébergé sur Vercel APK ou build web
│ │
└──────────────┬─────────────────────┘
▼
Supabase : PostgreSQL, Auth, RLS (supabase/)
creneaux_disponibles,
reserver, planning, historique…), et zéro double réservation
garanti par une contrainte d'exclusion. Les apps ne font qu'afficher.web/) : Next.js, TypeScript, Tailwind. Connexion par code
à 6 chiffres reçu par e-mail, au moment de réserver.pro/) : Flutter. Connexion par e-mail et mot de passe ;
espace coiffeur (planning, clôture des rendez-vous) et espace gérant
(configuration du salon, planning de l'équipe, encaissements, historique).| Dossier | Contenu |
|---|---|
supabase/migrations/ | schéma, RLS et fonctions, une migration par fonctionnalité |
supabase/tests/ | tests SQL (pgTAP) |
supabase/seed.sql | données de développement local |
supabase/demo/ | données de démonstration pour la base distante |
web/ | site client (Next.js) |
pro/ | app pro (Flutter), détails dans pro/README.md |
docs/ | cahier des charges, charte graphique, procédures, résultats |
| Outil | Version utilisée | Pour |
|---|---|---|
| Git | — | cloner le dépôt |
| Docker Desktop | 29 | base locale |
| Supabase CLI | 2.105 | base locale, migrations, déploiement de la base |
| Node.js et npm | 24 et 11 | site client |
| Flutter | 3.41 (Dart 3.11) | app pro |
| Google Chrome | récent | tests de bout en bout, app pro dans le navigateur |
| Android SDK (facultatif) | 36 | app pro sur Android (émulateur ou téléphone) |
Toutes les commandes partent de la racine du dépôt, sauf mention contraire.
git clone https://github.com/MSKETUDIANT/salon-rdv.git
cd salon-rdv
supabase start # Docker Desktop doit tourner
supabase db reset # applique les migrations et les données de supabase/seed.sql
supabase status -o env
Garder la sortie de supabase status -o env : API_URL et ANON_KEY
servent aux deux apps. Studio (interface de la base) :
http://127.0.0.1:54323 ; e-mails envoyés en local (codes de connexion) :
Mailpit, http://127.0.0.1:54324.
cd web
cp .env.example .env.local
Dans web/.env.local :
NEXT_PUBLIC_SUPABASE_URL=<API_URL>
NEXT_PUBLIC_SUPABASE_ANON_KEY=<ANON_KEY>
NEXT_PUBLIC_SALON_ID=11111111-1111-1111-1111-111111111111
npm ci
npm run dev # http://localhost:3000
Pour réserver, saisir n'importe quelle adresse : le code arrive dans Mailpit.
cd pro
cp config/exemple.json config/local.json # puis y mettre API_URL et ANON_KEY
flutter pub get
flutter run -d chrome --dart-define-from-file=config/local.json
Pour l'émulateur Android, une copie config/android-local.json avec
"SUPABASE_URL": "http://10.0.2.2:54321", puis
flutter run -d emulator-5554 --dart-define-from-file=config/android-local.json
(détails : pro/README.md).
Mot de passe : motdepasse.
| Compte | Rôle | Où |
|---|---|---|
[email protected] | gérant | app pro, espace gérant |
[email protected], [email protected] | coiffeurs | app pro, espace coiffeur |
[email protected] | gérant et coiffeur | app pro, choix de l'espace |
[email protected] | client | site (connexion par code, dans Mailpit) |
Le seed local contient des rendez-vous d'hier (à clôturer, à encaisser), de mardi prochain et du mercredi suivant, une absence et un rendez-vous annulé.
Toute modification du schéma passe par une migration de la CLI, jamais par du SQL appliqué à la main.
supabase migration new <nom> # crée supabase/migrations/<horodatage>_<nom>.sql
supabase db reset # rejoue toutes les migrations et le seed en local
supabase test db # tests SQL
supabase gen types typescript --local > web/lib/database.types.ts # après chaque migration
supabase migration list # migrations en local et en distant
supabase db push # envoie les migrations à la base distante
supabase db push et migration list en distant demandent un projet lié
(supabase link --project-ref <ref>, une fois). Ordre de mise en ligne :
merge de la PR sur main, puis db push depuis main, puis
supabase migration list (mêmes versions dans les colonnes Local et Remote).
| Commande | Dossier | Contenu |
|---|---|---|
supabase test db | racine | tests SQL : règles métier, RLS, fonctions |
npm test | web/ | tests unitaires (Vitest) |
npm run test:e2e | web/ | bout en bout (Playwright, Chrome) sur la base locale |
npm run lint et npm run build | web/ | lint, charte graphique, build |
flutter analyze et flutter test | pro/ | analyse et tests de l'app pro |
npm run verifier:bnf | web/ | tout ce qui précède, avec couverture, en une commande |
Résultats des besoins non fonctionnels : docs/resultats-bnf.md.
supabase link --project-ref <ref>.supabase db push, puis supabase migration list.docs/premier-gerant.md.docs/donnees-demo.md.docs/connexion-code-email.md (serveur
d'envoi SMTP et modèles d'e-mail).web comme dossier racine
(Root Directory) ; Next.js est détecté.NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY (clé anon du
projet distant, jamais la clé service) et NEXT_PUBLIC_SALON_ID.main déploie la production ; chaque PR a sa preview.
Le build lit la base distante : une PR dont le site dépend d'une migration
pas encore poussée a une preview en échec jusqu'au db push.Configuration de production : copier pro/config/exemple.json en
pro/config/production.json (ignoré par Git) avec l'URL et la clé anon du
projet distant et l'id du salon. Puis, dans pro/ :
flutter build web --release --dart-define-from-file=config/production.json # build/web : site statique
flutter build apk --release --dart-define-from-file=config/production.json # build/app/outputs/flutter-apk/app-release.apk
build/web, à publier sur n'importe quel
hébergement de fichiers statiques.Publication retenue : l'APK, joint à une release GitHub (projet de
formation, pas de build web en ligne). Pour une nouvelle version : augmenter
version dans pro/pubspec.yaml, construire l'APK depuis main, puis
gh release create app-pro-v<version> <apk> --target <commit> avec
l'empreinte SHA-256 de l'APK dans les notes.
| Document | Contenu |
|---|---|
docs/cahier-des-charges.md | besoins fonctionnels (BF) et non fonctionnels (BNF) |
docs/demonstration-bf.md | les 15 besoins fonctionnels, démontrés un par un |
docs/resultats-bnf.md | mesures et résultats des besoins non fonctionnels |
docs/charte-graphique.md | couleurs, typographie, composants |
docs/premier-gerant.md | créer le salon et le premier gérant en distant |
docs/donnees-demo.md | données de démonstration en distant |
docs/connexion-code-email.md | connexion des clients par code e-mail |
docs/dette-technique.md | points connus laissés pour plus tard |
pro/README.md | app pro : configuration, commandes, structure |