Skip to content

Structure du projet

Organisation des sources du frontend (Vite + Vue 3 <script setup lang="ts">).

Arborescence

src/
  api/                  # couche HTTP (voir architecture/api.md)
    generated/          # client fetch + SDK + types générés depuis api.json —
                        # versionnés, régénérés via `npm run api:generate`
    client.ts           # config du client fetch généré + jeton
    auth.ts             # login / logout / utilisateur courant, erreurs (ApiError)
    device-name.ts      # nom d'appareil lisible et unique par session
  components/
    ui/                 # primitives shadcn-vue (ajoutées via la CLI)
    auth/               # composants liés à l'authentification
      LoginForm.vue     # formulaire de connexion
      RoleSwitcher.vue  # sélecteur de casquette (réutilisable)
    superadmin/         # tableau de bord super-admin (barre latérale, cockpit…)
    region/             # tableau de bord région (barre latérale, vue d'ensemble…)
    reseller/           # tableau de bord revendeur (barre latérale, vue d'ensemble…)
    LocaleSwitcher.vue  # sélecteur de langue (FR / DE / EN)
  composables/          # logique réactive réutilisable
    useDashboardSection.ts    # lie la section active du portail à l'URL (:section)
    useOrganizationAccess.ts  # sonde d'accès : détecte une organisation suspendue
    usePasswordComplexityRules.ts  # règles de complexité de mot de passe (Regle)
  views/                # écrans routés (équivalent du dossier pages/ de la référence)
    Login.vue           # écran de connexion
    Dashboard.vue       # /dashboard : rend le portail de la casquette active
    SuperadminDashboard.vue  # portail super-admin (rendu par Dashboard.vue)
    TravellerDashboard.vue   # portail voyageur (rendu par Dashboard.vue)
    RegionDashboard.vue      # portail région (rendu par Dashboard.vue)
    ResellerDashboard.vue    # portail revendeur (rendu par Dashboard.vue)
    PortalUnavailable.vue    # repli (casquettes sans portail dédié)
    OrganizationSuspended.vue # organisation suspendue (remplace le portail d'org)
  stores/               # état applicatif Pinia (voir architecture/etat.md)
    auth.ts             # session (utilisateur + jeton + casquette active)
    hats.ts             # casquettes (rôles) dérivées de l'utilisateur
  router/               # routeur + gardes (voir architecture/routage.md)
    index.ts            # routes, historique web, garde globale
    guards.ts           # logique pure des gardes (auth + resolveHomeRoute)
  i18n/                 # internationalisation (vue-i18n)
    index.ts            # config, détection et persistance de la langue
    locales/            # catalogues fr.ts (référence), de.ts, en.ts
  lib/
    utils.ts            # helper cn()
    regle.ts            # useRegle configuré (validation Regle + messages vue-i18n)
  test/
    setup.ts            # polyfills jsdom (localStorage, matchMedia) pour Vitest
  main.ts               # point d'entrée : monte App.vue avec Pinia, le routeur et i18n
  App.vue               # coquille : ne rend que <RouterView/>

À la racine du dépôt : api.json (contrat OpenAPI 3.1 récupéré du backend, versionné) et openapi-ts.config.ts (config de génération de src/api/generated/) — voir Couche API.

Conventions de dossiers

L'organisation reflète celle du dépôt de référence .lovable-ref/ (voir le skill inspiration-to-vue) : un dossier components/<feature>/ par domaine fonctionnel, les écrans routés dans views/. Les primitives shadcn-vue vivent dans components/ui/ et sont ajoutées via la CLI, jamais écrites à la main.

Routeur

src/router/ utilise createWebHistory : les URL reflètent la navigation (/login, /, /dashboard) et les liens profonds fonctionnent. Tous les portails partagent l'URL /dashboard ; c'est Dashboard.vue qui rend la vue de la casquette active. Les gardes d'authentification et la redirection d'accueil sont décrites dans Routage & gardes.

Contributors

No contributors

Changelog

No recent changes