project-57ad200a

bySebastien Drure

Construit moi une application "France Activités Enfants" : VPS + Node.js + PostgreSQL/PostGIS + PWA (Vue.js/Leaflet) + modèle collaboratif + emails + géocodage local. 📌 Spécifications Techniques Finales Objectif : Cartographier les activités extra-scolaires en France avec : Carte interactive (Leaflet + OpenStreetMap). Filtres (type, âge, rayon autour d’un code postal/géolocalisation). Modèle collaboratif : Ajout par les utilisateurs + validation manuelle. Signalements : Possibilité de signaler une activité obsolète. Partage par lien pour chaque activité. Emails : Notifications aux admins pour les ajouts/signalements. Géocodage local : Table codes_postaux pour éviter les APIs externes. 🏗️ Architecture Composant Technologie Rôle Frontend Vue.js 3 + Vite + Pinia PWA avec carte Leaflet, filtres, formulaires. Backend Node.js + Express API REST pour gérer les activités, utilisateurs, signalements. Base de données PostgreSQL + PostGIS Stockage des activités, codes postaux, utilisateurs, signalements. Carte Leaflet + OpenStreetMap Affichage interactif avec marqueurs personnalisés. Emails Nodemailer + Mailgun Notifications aux admins (ajouts/signalements). Hébergement Ton VPS Backend (Node.js) + Frontend (fichiers statiques) + Base de données. Reverse Proxy Nginx Routing des requêtes API (/api) et frontend. HTTPS Certbot (Let’s Encrypt) Sécurisation du site. 🗃️ Base de Données (PostgreSQL + PostGIS) Tables Principales 1. codes_postaux (Géocodage local) Champ Type Description code_postal VARCHAR(10) Clé primaire (ex: "75001"). ville VARCHAR(100) Nom de la ville. latitude FLOAT Coordonnée GPS. longitude FLOAT Coordonnée GPS. geom GEOMETRY Point géospatial (PostGIS). 2. types_activites (Catégories) Champ Type Description id SERIAL Clé primaire. nom VARCHAR(50) Nom du type (ex: "Sport"). icone VARCHAR(50) Nom du fichier SVG (ex: "sport.svg"). 3. utilisateurs (Comptes utilisateurs) Champ Type Description id SERIAL Clé primaire. email VARCHAR(255) Email unique. mot_de_passe VARCHAR(255) Mot de passe haché (bcrypt). role VARCHAR(20) utilisateur ou admin. date_inscription TIMESTAMP Date de création. 4. activites (Activités extra-scolaires) Champ Type Description id SERIAL Clé primaire. nom VARCHAR(100) Nom de l’activité. description TEXT Description détaillée. id_type INTEGER Clé étrangère → types_activites.id. age_min INTEGER Âge minimum. age_max INTEGER Âge maximum. adresse VARCHAR(255) Adresse postale. code_postal VARCHAR(10) Clé étrangère → codes_postaux.code_postal. ville VARCHAR(100) Ville. latitude FLOAT Coordonnée GPS. longitude FLOAT Coordonnée GPS. horaires VARCHAR(255) Horaires d’ouverture. telephone VARCHAR(20) Numéro de téléphone. email VARCHAR(255) Email de contact. site_web VARCHAR(255) URL du site web. validee BOOLEAN TRUE si validée par un admin. id_utilisateur INTEGER Clé étrangère → utilisateurs.id. date_ajout TIMESTAMP Date de création. geom GEOMETRY Point géospatial (PostGIS). 5. signalements (Signalements d’activités obsolètes) Champ Type Description id SERIAL Clé primaire. id_activite INTEGER Clé étrangère → activites.id. id_utilisateur INTEGER Clé étrangère → utilisateurs.id. raison VARCHAR(100) Raison du signalement. message TEXT Message de l’utilisateur. statut VARCHAR(20) en_attente ou resolu. date_signalement TIMESTAMP Date du signalement. Index et Extensions sql Copier -- Activer PostGIS CREATE EXTENSION postgis; -- Index géospatiaux pour les requêtes de proximité CREATE INDEX idx_activites_geom ON activites USING GIST(geom); CREATE INDEX idx_codes_postaux_geom ON codes_postaux USING GIST(geom); -- Mettre à jour les colonnes geom UPDATE codes_postaux SET geom = ST_SetSRID(ST_MakePoint(longitude, latitude), 4326); UPDATE activites SET geom = ST_SetSRID(ST_MakePoint(longitude, latitude), 4326); 🔌 Backend (Node.js + Express) Fonctionnalités Endpoint Méthode Description Authentification /api/activites GET Liste toutes les activités validées. Non /api/activites/proches GET Liste les activités dans un rayon autour d’un point (lat/long). Non /api/activites POST Ajouter une activité (en attente de validation). Oui (utilisateur) /api/activites/:id/valider PATCH Valider une activité (admin seulement). Oui (admin) /api/activites/:id DELETE Supprimer une activité (admin seulement). Oui (admin) /api/signalements POST Signaler une activité. Oui (utilisateur) /api/signalements/en-attente GET Liste les signalements en attente (admin seulement). Oui (admin) /api/signalements/:id/resoudre PATCH Marquer un signalement comme résolu (admin seulement). Oui (admin) /api/utilisateurs/login POST Connexion (retourne un token JWT). Non /api/utilisateurs POST Inscription (créer un compte utilisateur). Non /api/codes-postaux/:code GET Récupérer les coordonnées GPS d’un code postal. Non Exemple de Requêtes SQL Utilisées 1. Récupérer les activités dans un rayon de X km sql Copier SELECT a.*, t.nom as type_nom, t.icone as type_icone FROM activites a JOIN types_activites t ON a.id_type = t.id WHERE ST_DWithin( a.geom, ST_SetSRID(ST_MakePoint(:longitude, :latitude), 4326), :rayon * 1000 -- Convertir km en mètres ) AND a.validee = TRUE; 2. Récupérer les coordonnées d’un code postal sql Copier SELECT latitude, longitude, ville FROM codes_postaux WHERE code_postal = :code_postal; 🖥️ Frontend (PWA avec Vue.js + Leaflet) Pages/Composants Composant Description Home.vue Page principale : carte + barre de filtres + fiche détaillée des activités. Map.vue Carte Leaflet avec marqueurs (icônes personnalisées). FilterBar.vue Filtres : type, âge, rayon, code postal. ActivityCard.vue Fiche détaillée d’une activité (affichée dans une modale). AddActivityForm.vue Formulaire pour ajouter une activité (utilisateurs connectés). AdminDashboard.vue Tableau de bord admin : validation des activités + gestion des signalements. LoginForm.vue Formulaire de connexion/inscription. Fonctionnalités Clés Carte interactive : Centrage par géolocalisation ou code postal. Marqueurs avec icônes personnalisées (ex: ⚽ pour le sport). Cliquer sur un marqueur → affiche la fiche détaillée. Filtres : Type d’activité (liste déroulante). Âge (plages : 0-3 ans, 3-6 ans, etc.). Rayon (curseur de 0 à 50 km). Code postal (recherche + centrage automatique). Partage : Bouton "Partager" → copie le lien de l’activité (ex: ton-domaine.fr/activite/123). Ajout d’activité : Formulaire avec géocodage automatique (via code postal). Validation manuelle par un admin. Signalement : Bouton "Signaler un problème" → formulaire avec raison + message. 📂 Structure des Fichiers Backend (/backend) text Copier backend/ ├── config/ │ ├── db.js # Configuration PostgreSQL │ └── email.js # Configuration Nodemailer ├── controllers/ │ ├── activites.js │ ├── utilisateurs.js │ └── signalements.js ├── models/ │ ├── Activite.js │ ├── Utilisateur.js │ └── Signalement.js ├── routes/ │ ├── activites.js │ ├── utilisateurs.js │ └── signalements.js ├── middlewares/ │ └── auth.js # Middleware JWT ├── .env # Variables d'environnement ├── app.js # Configuration Express └── server.js # Lancement du serveur Frontend (/frontend) text Copier frontend/ ├── public/ │ └── index.html ├── src/ │ ├── assets/ │ │ └── icons/ # Icônes SVG (sport.svg, music.svg, etc.) │ ├── components/ │ │ ├── Map.vue │ │ ├── FilterBar.vue │ │ ├── ActivityCard.vue │ │ ├── AddActivityForm.vue │ │ └── AdminDashboard.vue │ ├── stores/ │ │ └── activites.js # Gestion des données (Pinia) │ ├── views/ │ │ ├── Home.vue │ │ └── Admin.vue │ ├── App.vue │ └── main.js ├── package.json └── vite.config.js

HomeLoginSignup
Home

Comments (0)

No comments yet. Be the first!

Architecture

No Services Diagrams Yet

Architecture diagrams will be automatically generated when the Project Manager creates tasks for your project.

Home design preview
Login: Sign In
Admin: View Dashboard
Admin: Validate Activity
Admin: Delete Activity
Admin: View Reports
Admin: Resolve Report
Admin: View Notifications
Home: View Map
Home: View Activity Details
Home design preview
Login: Sign In
Admin: View Dashboard
Admin: Validate Activity
Admin: Delete Activity
Admin: View Reports
Admin: Resolve Report
Admin: View Notifications
Home: View Map
Home: View Activity Details