Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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 |