Une application web de géolocalisation et de jeu
Projet réalisé dans le cadre du cours ArchiOWeb et DévMobil - HEIG-VD
GuessThePlace est une application de jeu géolocalisé interactive où les utilisateurs publient des photos géolocalisées et tentent de deviner leur emplacement exact pour gagner des points.
Le système de score se base sur la précision de la localisation devinée, créant ainsi une expérience compétitive et ludique. Le backend repose sur une API REST sécurisée respectant les bonnes pratiques d'architecture et de qualité de code.
- Mathilde Ançay
- Estelle Bolay
- Maximilien Maret
- Victor Wojciechowski
- Inscription et authentification sécurisée (JWT)
- Système de rôles (utilisateur / administrateur)
- Gestion de profil
- Création et gestion d'équipes
- Attribution des joueurs aux équipes
- Publication de photos géolocalisées
- Validation des publications par un administrateur
- Upload d'images avec stockage local
- Devinettes avec calcul de score basé sur la précision géographique
- Calcul de distance avec la bibliothèque GeoLib
-
Classement global des joueurs
-
Système de points basé sur la précision
-
Agrégations de scores
-
Note : Les droits administrateurs existent, mais ne sont pour le moment implémentés que du côté backend (middleware, routes spécialisées, propriété is_admin du model User)
- Langage : Node.js (ES Modules)
- Framework : Express 5.1
- Base de données : MongoDB avec Mongoose 8.19
- Authentification : JWT (JSON Web Tokens)
- Hashing : bcrypt
- Géolocalisation : GeoLib
- Upload : Multer
- Tests : Jest + Supertest
- Documentation : OpenAPI/Swagger UI
- Framework : Vue.js 3.5
- Routing : Vue Router 4.6
- State Management : Vuex 4.0
- Styling : Tailwind CSS 4.1
- Cartographie : Leaflet 1.9 + D3.js 7.8
- Build : Vite 7.1
- Icons : Lucide Vue
- Environnement : dotenv
- Développement Local : MongoDB via Docker Compose ou Mongo Atlas avec une variable d'environnement MONGO_URI pointant vers une collection test.
GuessThePlace/
├── backend/ # API REST Node.js/Express
│ ├── src/
│ │ ├── bin/ # Point d'entrée (start.js)
│ │ ├── controllers/ # Logique métier
│ │ ├── models/ # Modèles Mongoose
│ │ ├── routes/ # Routes API v1
│ │ ├── middlewares/ # Auth & Admin
│ │ ├── data/ # Données GeoJSON
│ │ └── spec/ # Tests Jest
│ ├── openapi.yml # Documentation API
│ ├── compose.yaml # Docker Compose
│ └── package.json
│
└── frontend/ # Application Vue.js
├── src/
│ ├── App.vue # Composant racine
│ ├── main.js # Point d'entrée
│ ├── components/ # Composants Vue réutilisables
│ ├── composables/ # Logique réutilisable
│ │ ├── api/ # Appels API
│ │ ├── useAuth.js # Gestion authentification
│ │ └── useLogout.js # Gestion déconnexion
│ ├── views/ # Pages/vues de l'application
│ ├── router/ # Configuration Vue Router
│ ├── store/ # State management (Vuex)
│ └── css/ # Styles globaux
├── public/ # Assets statiques
├── index.html # Template HTML
├── vite.config.js # Configuration Vite
└── package.json
- Node.js 20.19+ ou 22.12+
- MongoDB (via Docker ou installation locale)
- npm ou yarn
git clone https://github.com/ProjArtBAMAgency/GuessThePlace.git
cd GuessThePlaceDémarrer MongoDB avec Docker Compose :
cd backend
docker compose up -dMongoDB sera accessible sur localhost:27017 avec :
- Username:
root - Password:
example
cd backend
npm installCréer un fichier .env à la racine du dossier backend :
MONGO_URI=mongodb://root:example@localhost:27017/guesstheplace?authSource=admin
JWT_SECRET=your-secret-key-here
PORT=3000Démarrer le serveur :
npm start
# ou en mode développement
npm run devL'API sera disponible sur http://localhost:3000
cd frontend
npm installDémarrer le serveur de développement :
npm run devL'application sera disponible sur http://localhost:5173
Frontend :
cd frontend
npm run buildLes fichiers compilés seront dans frontend/dist/ et automatiquement servis par le backend Express.
https://www.guesstheplace.ch/api-docs/
Une fois le backend démarré : http://localhost:3000/api-docs
POST /api/v1/register- InscriptionPOST /api/v1/login- Connexion
GET /api/v1/users- Liste des utilisateursGET /api/v1/users/:id- Détails d'un utilisateurPATCH /api/v1/users/:id- Mise à jourDELETE /api/v1/users/:id- Suppression
GET /api/v1/teams- Liste des équipesPOST /api/v1/teams- Créer une équipeGET /api/v1/teams/:id- DétailsPATCH /api/v1/teams/:id- Mise à jourDELETE /api/v1/teams/:id- Suppression
GET /api/v1/posts- Liste des publications (avec pagination)POST /api/v1/posts- Créer une publication (avec image)GET /api/v1/posts/:id- DétailsPATCH /api/v1/posts/:id- Valider/modifierDELETE /api/v1/posts/:id- Suppression
GET /api/v1/guesses- Liste des devinettesPOST /api/v1/guesses- Soumettre une devinetteGET /api/v1/guesses/:id- Détails
GET /api/v1/zones- Liste des zones géographiquesGET /api/v1/zones/:id- Détails d'une zone
Toutes les routes protégées nécessitent un token JWT dans un cookie nommé token :
Cookie: token=<votre-token-jwt>
- Users : Utilisateurs avec authentification
- Teams : Équipes de joueurs
- Posts : Publications avec photos et géolocalisation
- Guesses : Tentatives de localisation
- Zones : Zones géographiques (données GeoJSON Suisse)
Voir le prototype interactif Figma
Lancer les tests backend :
cd backend
npm run testLes tests couvrent :
- Authentication (signup, login)
- Users CRUD
- Teams CRUD
- Posts avec upload d'images
- Guesses et calcul de scores
- Les routes /profile et /user-scores
- Zones géographiques
- Hashing des mots de passe avec bcrypt
- Authentification JWT
- Protection des routes avec middleware d'authentification
- Contrôle d'accès basé sur les rôles
- Validation des données entrantes
- Protection contre les injections NoSQL (Mongoose)
Le score est calculé en fonction de la distance entre la localisation devinée et la localisation réelle :
- Distance croissante : Points décroissants
- Algorithme basé sur GeoLib pour les calculs géographiques
L'API supporte la pagination pour optimiser les performancea. Pour voir lesquelles routes la supporte, consulter la documentation.
- Upload via Multer
- Stockage local dans
backend/images/ - Formats supportés : JPG, PNG, GIF
- Taille maximum : configurable
L'application est accessible en ligne sur : www.guesstheplace.ch
# Database
MONGODB_URI=mongodb://user:password@host:port/database
# JWT
JWT_SECRET=your-secret-key
# Server
PORT=3000
NODE_ENV=productioncd frontend
npm run buildLes fichiers statiques dans dist/ sont automatiquement servis par Express.
Ce projet est développé dans le cadre académique du cours ArchiOWeb et DévMobil à la HEIG-VD.
Projet GuessThePlace - @ProjArtBAMAgency
Lien du projet : https://github.com/ProjArtBAMAgency/GuessThePlace
Fait avec ❤️ à la HEIG-VD