Conception d'une Plateforme de Recommandation Touristique avec Node.js et Vue.js

Introduction

L'ère numérique a profondément transformé l'indusrtie du voyage. Les approches traditionnelles de service et d'accès à l'information ne suffisent plus à satisfaire les attentes des utilisateurs en matière d'expériences personnalisées et pratiques. Face à l'évolution des technologies web et à la diversité croissante des besoins des consommateurs, les plateformes de voyage modernes s'appuyant sur des piles technologiques avancées sont devenues incontournables.

Ce projet explore la création d'une plateforme de recommandation touristique dynamique, exploitant les capacités de Node.js pour le traitement côté serveur et de Vue.js pour une interface utilisateur interactive. Node.js, avec son modèle d'E/S non bloquant, excelle dans la gestion des requêtes concurrentes à grande échelle, tandis que Vue.js offre un cadre de développement frontal léger et performant pour la construction rapide d'applications réactives. L'intégration de ces deux technologies permet de concevoir une expérience utilisateur enrichie, contribuant ainsi à la modernisation du secteur touristique.

Vue d'ensemble Technique

Le développement de cette application s'appuie sur une combinaison de technologies robustes et éprouvées pour garantir performance et maintenabilité :

  • Langage de Programmation Serveur : JavaScript (via Node.js)
  • Framework Backend : Express.js
  • Base de Données : MySQL (version 5.7 recommandée pour la compatibilité)
  • Outil de Gestion de Base de Données : Navicat ou équivalent
  • Environnement de Développement Intégré (IDE) : Visual Studio Code
  • Navigateur Web : Google Chrome (pour un rendu optimal)

Architecture Fonctionnelle

Le système est structuré en deux composants principaux : une interface utilisateur (frontend) et un panneau d'administration (backend), chacun offrant des fonctionnalités spécifiques.

Interface Utilisateur (Frontend)

Les utilisateurs finaux peuvent interagir avec les sections suivantes :

  • Page d'accueil dynamique présentant les offres du moment.
  • Catalogue des attractions et points d'intérêt populaires.
  • Informations détaillées et réservation d'hôtels.
  • Suggestions d'itinéraires de voyage.
  • Flux d'actualités et articles informatifs sur le tourisme.

Panneau d'Administration (Backend)

Les administrateurs disposent d'un ensemble complet d'outils pour la gestion du contenu et des utilisateurs :

  • Gestion des comptes utilisateurs.
  • Administration des attractions touristiques.
  • Catégorisation des villes et des destinations.
  • Gestion des réservations de billets.
  • Maintenance des informations sur les établissements hôteliers.
  • Suivi et gestion des commandes d'hôtel.
  • Planification et gestion des itinéraires de voyage.
  • Configurations et paramètres généraux du système.

Approche de Test Système

Le processus de test est intégré tout au long du cycle de vie du développement, depuis la validation des exigences initiales jusqu'aux tests d'intégration et de performance finaux. Une attention particulière est portée aux tests fonctionnels, à la performance et à l'ergonomie. Ci-après, un aperçu des cas de test fonctionnels typiques :

Description du Cas de Test Procédure et Données Résultat Attendu Résultat Réel
Connexion réussie d'un utilisateur Saisie d'un identifiant et mot de passe valides, clic sur "Connexion" Redirection vers le tableau de bord utilisateur Succès
Connexion réussie d'un administrateur Saisie des identifiants d'administrateur, clic sur "Connexion" Accès au panneau d'administration Succès
Tentative de connexion avec des identifiants inconnus Saisie d'un identifiant ou mot de passe non enregistré Message d'erreur : "Identifiant ou mot de passe incorrect" Succès
Tentative de connexion avec champ uitlisateur vide Champ "Identifiant" laissé vide Message d'erreur : "Veuillez saisir votre identifiant" Succès

Exemples de Code

Définition d'un Modèle Utilisateur avec Sequelize

Cet exemple illustre la définition d'un modèle Sequelize pour la gestion des profils utilisateurs, incluant leurs attributs et la configuration de la base de données. L'utilisation de Intl.DateTimeFormat montre une alternative pour la gestion du format des dates.

import { Sequelize, DataTypes } from 'sequelize';
import sequelizeInstance from './databaseConfig'; // Assumant un fichier séparé pour l'initialisation de Sequelize

const UserProfile = sequelizeInstance.define('UserProfile', {
  profileId: {
    type: DataTypes.BIGINT,
    primaryKey: true,
    autoIncrement: true,
    allowNull: false,
    comment: 'Identifiant unique du profil'
  },
  loginName: {
    type: DataTypes.STRING(100),
    unique: true,
    allowNull: false,
    comment: 'Nom d\'utilisateur pour la connexion'
  },
  hashedPassword: {
    type: DataTypes.STRING(255),
    allowNull: false,
    comment: 'Mot de passe haché'
  },
  accessRole: {
    type: DataTypes.ENUM('admin', 'user', 'guest'), // Exemple de type ENUM
    defaultValue: 'user',
    allowNull: false,
    comment: 'Rôle de l\'utilisateur'
  },
  profilePictureUrl: {
    type: DataTypes.STRING(255),
    allowNull: true,
    comment: 'URL de l\'image de profil'
  },
  creationTimestamp: {
    type: DataTypes.DATE,
    defaultValue: DataTypes.NOW,
    allowNull: false,
    get() {
      // Getter personnalisé pour formater la date
      const options = { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' };
      return new Intl.DateTimeFormat('fr-FR', options).format(this.getDataValue('creationTimestamp'));
    },
    comment: 'Horodatage de création du profil'
  }
}, {
  timestamps: false,
  freezeTableName: true, // Empêche Sequelize de pluraliser le nom de la table
  tableName: 'user_profiles' // Nom de table explicite
});

export default UserProfile;

Schéma de Base de Données MySQL (Extraits)

Voici des extraits du schéma de base de données, illustrant la structure de quelques tables clés. Ces définitions sont conçues pour supporter les fonctionnalités de la plateforme, telles que l'information du site, la catégorisation des destinations et les avis clients.

-- Schéma de base de données pour la plateforme touristique

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

-- Création de la base de données si elle n'existe pas
CREATE DATABASE IF NOT EXISTS `travel_recommendation_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `travel_recommendation_db`;

-- Table pour les informations générales du site (ex: "À propos de nous")
DROP TABLE IF EXISTS `site_info`;
CREATE TABLE `site_info` (
  `info_id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant unique de l\'information',
  `creation_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création de l\'entrée',
  `page_title` VARCHAR(255) NOT NULL COMMENT 'Titre de la section',
  `sub_heading` VARCHAR(255) DEFAULT NULL COMMENT 'Sous-titre ou slogan',
  `content_body` LONGTEXT NOT NULL COMMENT 'Contenu textuel principal',
  `image_url_1` TEXT COMMENT 'URL de la première image illustrant le contenu',
  `image_url_2` TEXT COMMENT 'URL de la deuxième image',
  `image_url_3` TEXT COMMENT 'URL de la troisième image',
  PRIMARY KEY (`info_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Informations générales du site';

-- Insertion d'exemple de données pour site_info
LOCK TABLES `site_info` WRITE;
/*!40000 ALTER TABLE `site_info` DISABLE KEYS */;
INSERT INTO `site_info` (`info_id`, `page_title`, `sub_heading`, `content_body`, `image_url_1`) VALUES
(1, 'À Propos de Notre Agence', 'Explorer le Monde avec Nous', 'Découvrez des destinations uniques et des expériences inoubliables. Notre mission est de simplifier vos voyages en vous offrant des recommandations personnalisées et un service client exceptionnel. Laissez-nous transformer vos rêves de voyage en réalité, avec des itinéraires conçus sur mesure pour chaque aventurier.', 'https://example.com/images/about_us_hero.jpg');
/*!40000 ALTER TABLE `site_info` ENABLE KEYS */;
UNLOCK TABLES;

-- Table pour la catégorisation des destinations (ex: "Ville", "Région")
DROP TABLE IF EXISTS `destination_categories`;
CREATE TABLE `destination_categories` (
  `category_id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant de catégorie',
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Horodatage de création',
  `category_name` VARCHAR(150) UNIQUE DEFAULT NULL COMMENT 'Nom de la catégorie (ex: Paris, Montagnes, Plages)',
  PRIMARY KEY (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Catégories de destinations';

-- Insertion d'exemple de données pour destination_categories
LOCK TABLES `destination_categories` WRITE;
/*!40000 ALTER TABLE `destination_categories` DISABLE KEYS */;
INSERT INTO `destination_categories` (`category_id`, `category_name`) VALUES
(1, 'Villes Européennes'),
(2, 'Destinations Tropicales'),
(3, 'Randonnées Montagnardes');
/*!40000 ALTER TABLE `destination_categories` ENABLE KEYS */;
UNLOCK TABLES;

-- Table pour les paramètres de configuration de l'application
DROP TABLE IF EXISTS `app_settings`;
CREATE TABLE `app_settings` (
  `setting_id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant du paramètre',
  `setting_key` VARCHAR(100) NOT NULL UNIQUE COMMENT 'Clé du paramètre (ex: logo_url, theme_color)',
  `setting_value` TEXT DEFAULT NULL COMMENT 'Valeur du paramètre',
  PRIMARY KEY (`setting_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Paramètres de l\'application';

-- Insertion d'exemple de données pour app_settings
LOCK TABLES `app_settings` WRITE;
/*!40000 ALTER TABLE `app_settings` DISABLE KEYS */;
INSERT INTO `app_settings` (`setting_id`, `setting_key`, `setting_value`) VALUES
(1, 'home_banner_image', 'https://example.com/banners/main_banner.jpg'),
(2, 'contact_email', 'contact@travelapp.com');
/*!40000 ALTER TABLE `app_settings` ENABLE KEYS */;
UNLOCK TABLES;

-- Table pour les avis et commentaires sur les hôtels
DROP TABLE IF EXISTS `hotel_reviews`;
CREATE TABLE `hotel_reviews` (
  `review_id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant de l\'avis',
  `submitted_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de soumission de l\'avis',
  `hotel_id` BIGINT(20) NOT NULL COMMENT 'ID de l\'hôtel concerné par l\'avis',
  `reviewer_id` BIGINT(20) NOT NULL COMMENT 'ID de l\'utilisateur qui a posté l\'avis',
  `reviewer_avatar_url` TEXT COMMENT 'URL de l\'avatar de l\'utilisateur',
  `reviewer_nickname` VARCHAR(100) DEFAULT NULL COMMENT 'Surnom de l\'utilisateur',
  `comment_text` LONGTEXT NOT NULL COMMENT 'Contenu de l\'avis',
  `admin_response_text` LONGTEXT COMMENT 'Réponse de l\'administrateur à l\'avis',
  PRIMARY KEY (`review_id`),
  KEY `idx_hotel_id` (`hotel_id`),
  KEY `idx_reviewer_id` (`reviewer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Avis des clients sur les hôtels';

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

Étiquettes: Node.js Vue.js Express.js MySQL Sequelize

Publié le 24 juillet à 09h28