Conception d'un système de gestion hôtelière avec Spring Boot

Un système de gestion hôtelière moderne repose sur une architecture en couches qui sépare clairement la logique métier, l'accès aux données et la présentation. L'objectif est d'automatiser les processus courents d'un établissement : réservation des chambres, gestion des clients, facturation, suivi des disponibilités et recommandations personnalisées.

Contexte technique

Le développement s'appuie sur l'écosystème Spring Boot pour le backend et Vue.js pour le frontend. Cette stack permet de délivrer une application monopage réactive et un serveur robuste exposant des API REST. La persistance est assurée par MySQL, avec MyBatis-Plus comme couche d'accès aux données pour simplifier les requêtes complexes et la pagination.

Exemple de code : classement intelligent

La méthode suivante expose un endpoint de tri automatique des produits ou services hôteliers selon leur popularité, mesurée par le nombre de clics.

@IgnoreAuth
@GetMapping("/classementIntelligent")
public R classementIntelligent(@RequestParam Map<String, Object> parametres,
                               ProduitHotelierEntity produit,
                               HttpServletRequest requete) {
    EntityWrapper<ProduitHotelierEntity> wrapper = new EntityWrapper<>();
    parametres.put("sort", "clicknum");
    parametres.put("order", "desc");
    PageUtils page = produitService.queryPage(
            parametres,
            MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(wrapper, produit), parametres), parametres));
    return R.ok().put("data", page);
}

Exemple de code : recommandation par profil client

Cette seconde méthode propose des recommandations basées sur l'historique d'achat de l'utilisateur connecté. Elle agrège d'abord les catégories déjà consommées, puis complète avec les articles les plus récents jusqu'à atteindre la limite demandée.

@GetMapping("/recommandationUtilisateur")
public R recommandationUtilisateur(@RequestParam Map<String, Object> parametres,
                                   ProduitHotelierEntity produit,
                                   HttpServletRequest requete) {
    String identifiant = requete.getSession().getAttribute("userId").toString();
    String colonneCategorie = "categorie";

    List<CommandeEntity> commandes = commandeService.selectList(
            new EntityWrapper<CommandeEntity>()
                    .eq("userid", identifiant)
                    .eq("tablename", "produit_hotelier")
                    .orderBy("addtime", false));

    Integer limite = parametres.get("limit") == null
            ? 10
            : Integer.parseInt(parametres.get("limit").toString());

    Set<String> categories = new LinkedHashSet<>();
    for (CommandeEntity cmd : commandes) {
        categories.add(cmd.getGoodtype());
    }

    List<ProduitHotelierEntity> recommandations = new ArrayList<>();
    for (String categorie : categories) {
        recommandations.addAll(
                produitService.selectList(
                        new EntityWrapper<ProduitHotelierEntity>().eq(colonneCategorie, categorie)));
    }

    parametres.put("sort", "id");
    parametres.put("order", "desc");
    EntityWrapper<ProduitHotelierEntity> wrapper = new EntityWrapper<>();
    PageUtils page = produitService.queryPage(
            parametres,
            MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(wrapper, produit), parametres), parametres));

    List<ProduitHotelierEntity> populaires = (List<ProduitHotelierEntity>) page.getList();
    for (ProduitHotelierEntity item : populaires) {
        boolean dejaPresent = recommandations.stream()
                .anyMatch(r -> r.getId().intValue() == item.getId().intValue());
        if (!dejaPresent) {
            recommandations.add(item);
            if (recommandations.size() >= limite) {
                break;
            }
        }
    }

    int fin = Math.min(limite, recommandations.size());
    page.setList(recommandations.subList(0, fin));
    return R.ok().put("data", page);
}

Configuraton de la base de données

La connexion MySQL est déclarée dans un fichier de propriétés. La requête de validation permet de vérifier que le pool de connexions fonctionne correctement.

validationQuery=SELECT 1

jdbc_url=jdbc:mysql://127.0.0.1:3306/hotel_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&tinyInt1isBit=false
jdbc_username=hotel_admin
jdbc_password=hotel_pwd

Modèle de données

Le schéma relationnel couvre les entités essentielles d'un établissement hôtelier : chambres, clients, réservations, commandes, catégories de services et utilisateurs. Chaque table est documentée par des commentaires afin de faciliter la maintenance et la génération du dictionnaire de données.

Stack technique

Backend

  • Spring Boot : framework principal pour l'orchestration des composants et la configuration automatique.
  • Spring Security : gestion de l'authentification et de l'autorisation des utilisateurs.
  • Spring Data JPA : abstraction pour les opérations de persistance standard.
  • MyBatis-Plus : requêtes conditionnelles, pagination et génération de code.
  • MySQL : base de données relationnelle pour le stockage durable des informations.

Frontend

  • Vue.js : framework pour la construction de l'interface utilisateur réactive.
  • Vue Router : navigation dans l'application monopage.
  • Vuex : gestion centralisée de l'état applicatif.
  • Element UI : bibliothèque de composants graphiques.
  • Axios : client HTTP pour communiquer avec les API REST.

Outils de développement

  • IntelliJ IDEA : environnement de développement Java avec support Maven et bases de données.
  • Visual Studio Code : éditeur pour le développement frontend et Node.js.
  • Mavan : gestion des dépendances et build du projet.
  • JDK 1.8 : kit de développement Java.
  • Tomcat 7.0 : serveur d'application pour le déploiement.
  • Navicat : administration et modélisation de la base de données.

Intérêt du système

L'automatisation des réservations et de la gestion des chambres réduit les erreurs manuelles et améliore le temps de réponse. L'analyse des données de réservation aide à ajuster les tarifs et à optimiser l'occupation. Les recommandations personnalisées enrichissent l'expérience client et favorisent la fidélisation.

Étiquettes: Spring Boot Spring Security Vue.js MySQL MyBatis-Plus

Publié le 24 juillet à 01h55