← Retour à l'architecture

📘 Documentation — CV Luvumbu

Documentation unique : utilisation pas à pas, installation / exploitation technique et journal des modifications.

PHP / MySQL (PDO)Sans framework Éditeur WYSIWYGAPI RESTVersion juin 2026
📄 CV source de référence (PDF « Tableautier / DC2Scale »)
PARTIE 1 — Guide utilisateur
PARTIE 2 — Installation & technique
PARTIE 3 — Journal des modifications
PARTIE 1 — Guide utilisateur

1. 🧭 Présentation

CV Luvumbu est une application web (PHP / MySQL) pour créer, mettre en forme, partager et suivre des CV.

2. 🔑 Connexion

Le point d'entrée index.php redirige automatiquement :

ÉtatRedirection
Pas installée→ assistant d'installation install.php
Non connecté→ connexion login.php
Connecté→ tableau de bord dashboard.php

Trois façons de se connecter

Si la vérification habituelle échoue, l'application ouvre une vraie connexion MySQL avec vos identifiants : si MySQL accepte, vous êtes connecté et le compte est resynchronisé automatiquement.

3. 📊 Tableau de bord

Page d'accueil une fois connecté (dashboard.php). Elle sert au suivi des candidatures (§9) et affiche des statistiques : total, en attente, réponses positives/négatives, relances programmées et relances à faire (date atteinte ou dépassée).

4. 🗂️ Mes CV

mes_cv.php liste vos CV actifs. Pour chacun : ✏️ Éditer, 👁️ Aperçu, 🔗 Partager, 🗑️ Supprimer (corbeille).

En haut : ➕ Nouveau CV, 🗑️ Corbeille, et une aide contextuelle (pastilles + un Mode aide qui affiche toutes les explications).

5. 🎨 Éditeur de CV (WYSIWYG)

L'éditeur cv_builder.php s'appuie sur le moteur assets/js/cv-builder.js. L'aperçu à droite est exactement le rendu final.

RéglageDescription
Modèledc2scale (Tableautier), moderne… change toute la mise en page.
CouleursPrincipale + secondaire, palettes prêtes, overrides avancés.
📷 Photo de profilImport, taille, forme (cercle, arrondi, carré, portrait, hexagone), position.
🖼️ Image libreBloc image posé sur la page (distinct de la photo), déplaçable / redimensionnable.
Titre / posteMétier affiché sous le nom (headline).
CoordonnéesLieu, téléphone, e-mail, permis… + pour ajouter, pour retirer.
Profil / résuméTexte de présentation.
SectionsExpérience, Formation, Compétences, Logiciels, Habilitations, Langues, Loisirs — réordonnables par glisser-déposer.
📐 Une seule pageCompresse automatiquement la mise en page pour tenir sur une A4.
Disposition libreCanvas : déplacer ✥, redimensionner ↔ ↕ ⤡, supprimer ✕.

💾 Enregistrer envoie le profil JSON au serveur. 🎓 Tutoriel lance une visite guidée pas à pas.

6. 🖨️ Aperçu, impression et PDF

cv_view.php?id=… affiche le CV au format A4, identique à l'éditeur. Bouton 🖨 Imprimer / Enregistrer en PDF → choisir « Enregistrer au format PDF » comme imprimante.

Activez « Tout tenir sur une seule page » avant d'imprimer pour garantir une seule feuille.

7. 🔗 Partage public + QR code

Depuis Mes CV → 🔗 Partager, l'application crée un jeton (share_token) et fournit :

La page publique est en noindex (non référencée). Le jeton aléatoire de 32 caractères rend un lien non communiqué introuvable.

8. 🗑️ Corbeille

Supprimer un CV le place en corbeille (suppression douce, colonne deleted_at). Depuis la corbeille : ♻️ Restaurer ou ❌ Supprimer définitivement.

9. 💼 Suivi des candidatures

ChampDescription
EntrepriseNom de l'employeur.
Date d'envoiQuand le CV a été envoyé.
CV envoyéCV associé (facultatif).
StatutEn attente / Réponse positive / Réponse négative.
RelanceActive/désactive + date ; passe en « à faire » à l'échéance.
Infos suppl.+ Ajouter une information : champs libres (libellé + valeur), stockés en JSON.

10. ⚙️ Paramètres

1. Connexion avec Google
   ├─ Statut (Activée / Désactivée)
   ├─ Comptes Google autorisés  → liste + Ajouter / Retirer
   └─ Configuration avancée (ID client / secret)   (replié)
2. Mon compte administrateur
   ├─ Adresse e-mail
   └─ Changer le mot de passe
3. Clés API

11. 🟦 Connexion avec Google

Fonctionne « clés en main ». Sécurité par liste blanche :

  1. Paramètres → Connexion avec Google → Comptes Google autorisés.
  2. Ajouter votre adresse Gmail.
  3. Se déconnecter, puis tester « Se connecter avec Google ».
Clic « Se connecter avec Google » → choix du compte
   ├─ adresse autorisée → connecté
   └─ adresse absente   → refusé

12. 🔁 Mot de passe oublié

  1. Lien « Mot de passe oublié ? » sur la connexion.
  2. Saisir l'identifiant ou l'e-mail.
  3. Réception d'un lien valable 1 h, à usage unique.
  4. Ouvrir reset_password.php?token=… et choisir un nouveau mot de passe.
Pré-requis : un e-mail enregistré dans Paramètres → Mon compte. Secours : se connecter avec les identifiants de la base.

13. 🔌 Clés API (côté utilisateur)

Paramètres → Clés API : nom + permissions. La clé cvk_… n'est affichée qu'une fois (seul son SHA-256 est stocké). Révocation immédiate possible.

Permissions

cv:read, cv:write, cv:delete, profile:read, profile:write.

curl -H "X-API-Key: cvk_xxxx" https://luvumbu.com/cv_luvumbu/api/cv.php

14. 🩺 Matrice de santé

Sur architecture.php, bouton « Matrice de santé — Afficher ». Une fois ouverte, elle se rafraîchit toutes les 4 s et indique, par pastille 🟢/🟡/🔴 : configuration, base, tables (présence + lignes), modules et API. « Masquer » arrête le polling ; il se met aussi en pause si l'onglet est caché.

PARTIE 2 — Installation & technique

A. 🏗️ Architecture technique

Application PHP procédurale, sans framework :

Principe central : login du site = identifiant + mot de passe de la base de données. Pas de compte séparé à créer.

B. 📋 Pré-requis

ÉlémentRecommandation
PHP8.0+ (str_contains, random_bytes, password_hash).
Extensionspdo_mysql, openssl, mbstring, json.
BaseMySQL 5.7+ / MariaDB 10.3+ (utf8mb4).
ServeurApache / Nginx ; en local : XAMPP.
E-mailmail() opérationnel (mot de passe oublié).
HTTPSRecommandé (requis pour Google).

C. 📁 Arborescence

cv_luvumbu/
├── index.php / install.php / login.php / logout.php
├── forgot_password.php / reset_password.php
├── google_login.php / google_callback.php
├── dashboard.php / mes_cv.php / cv_builder.php
├── cv_view.php / cv_public.php / parametres.php / architecture.php
├── config/config.php          ⚙️ généré — NE PAS versionner
├── includes/  (db, guard, auth, account, password_reset,
│               google_auth, settings, cv, applications, api_keys)
├── api/       (cv.php, cv_profile.php, health.php)
├── assets/    (css, js/cv-builder.js, img)
└── cv_doc/    (index.html  ← cette documentation unique,
                CV-...DC2Scale.pdf  ← CV source,
                _archive/  ← anciens guides conservés pour référence)

D. 💻 Installation locale (XAMPP)

  1. Démarrer Apache + MySQL dans XAMPP.
  2. Placer le projet dans htdocs/luvumbu/cv_luvumbu.
  3. Ouvrir http://localhost/luvumbu/cv_luvumbu/.
  4. Assistant : Hôte 127.0.0.1, Base cv_luvumbu, Utilisateur root, Mot de passe vide.
  5. Installer et continuer → se connecter avec root + mot de passe vide.

E. 🌐 Installation en production (Hostinger)

  1. Créer la base MySQL dans hPanel ; noter nom, utilisateur, mot de passe de la base (≠ mot de passe hPanel).
  2. Uploader les fichiers (sans config/config.php ; dossier config/ inscriptible).
  3. Ouvrir l'URL → assistant → hôte (souvent localhost), base, utilisateur, mot de passe.
  4. Installer et continuer, puis se connecter.
Sur hébergement mutualisé, l'utilisateur n'a pas toujours CREATE DATABASE : la base doit donc déjà exister dans hPanel ; l'assistant l'utilise telle quelle.

F. 🛠️ L'assistant d'installation (install.php)

  1. Connexion MySQL (essaie l'hôte saisi puis localhost127.0.0.1).
  2. Création de la base si le droit existe, sinon utilisation de l'existante.
  3. Table users : nettoyage des tables résiduelles si incompatible (évite errno 150), puis création propre.
  4. Table api_keys.
  5. Compte admin : username = utilisateur BDD, mot de passe = mot de passe BDD (ON DUPLICATE KEY UPDATE).
  6. Écriture de config/config.php si tout a réussi.
Base OK + déjà installée → redirige vers l'app (sauf ?reconfigure=1). Base KO → ré-affiche l'assistant sans détruire la config existante. Le mot de passe est « trimé » (espaces retirés).

G. ⚙️ Fichier de configuration

<?php
return array (
  'host'   => '127.0.0.1',
  'port'   => 3306,
  'dbname' => 'cv_luvumbu',
  'user'   => 'root',
  'pass'   => '',
);
Contient le mot de passe BDD en clair → jamais versionné ni public (déjà dans .gitignore). Reconfigurer : install.php?reconfigure=1.

H. 🗄️ Base de données

Toutes les tables : InnoDB, utf8mb4_unicode_ci.

Table users

id, username (unique), email (unique, migration), password_hash, must_change_password (migration), created_at.

Table cvs

id, user_id (FK→users, cascade), full_name, title, email, phone, summary, skills, experience, education, profile_json (profil riche, migration), deleted_at (corbeille, migration), share_token (partage, migration), created_at, updated_at.

Table applications

id, user_id (FK, cascade), cv_id (FK→cvs, set null), company, sent_at, status, followup, followup_date (migration), notes, extra_json (migration), created_at, updated_at.

Table api_keys

id, user_id (FK, cascade), label, scopes (migration), key_prefix, key_hash (SHA-256, unique), created_at, last_used_at, revoked_at.

Tables password_resets & settings

Créées automatiquement : jetons de réinitialisation (usage unique, 1 h) ; réglages clé/valeur (config Google, liste blanche).

I. 🔄 Migrations automatiques

Aucune migration manuelle. Les fonctions ensure_* créent les tables manquantes et ajoutent les colonnes au fil des versions. On déploie par simple upload des fichiers, sans toucher à phpMyAdmin.

Colonnes ajoutées : users.email, users.must_change_password, cvs.profile_json, cvs.deleted_at, cvs.share_token, applications.followup_date, applications.extra_json, api_keys.scopes.

J. 🔌 API REST (api/cv.php)

Auth par en-tête X-API-Key (ou Authorization: Bearer). JSON entrant/sortant.

MéthodePermissionDescription
GET /api/cv.phpcv:readListe les CV.
GET ?id=Ncv:readDétail texte.
GET ?id=N&profile=1cv:readCV + profil riche.
GET ?whoami=1user_id + scopes.
POST /api/cv.phpcv:writeCrée un CV.
PUT /api/cv.phpcv:writeMet à jour ; {"share":true}share_url.
DELETE ?id=N[&force=1]cv:write / cv:deleteCorbeille ou suppression définitive.

Codes : 200/201 OK · 401 clé KO · 403 permission · 404 introuvable · 405 méthode · 422 champ manquant · 500 serveur.

# Créer un CV
curl -X POST -H "X-API-Key: cvk_xxxx" -H "Content-Type: application/json" \
  -d '{"full_name":"Jean Dupont","title":"Électricien"}' \
  https://luvumbu.com/cv_luvumbu/api/cv.php

# Activer le partage et récupérer l'URL publique
curl -X PUT -H "X-API-Key: cvk_xxxx" -H "Content-Type: application/json" \
  -d '{"id":12,"share":true}' https://luvumbu.com/cv_luvumbu/api/cv.php
Autres endpoints : api/cv_profile.php (éditeur, auth session + CSRF) et api/health.php (santé JSON, utilisateurs connectés uniquement → 401 sinon).

K. 🔒 Sécurité

L. 💾 Sauvegarde & restauration

Sauvegarder la base + config/config.php.

# Sauvegarde
mysqldump -u UTILISATEUR -p NOM_BASE > sauvegarde.sql
# Restauration
mysql -u UTILISATEUR -p NOM_BASE < sauvegarde.sql

Déploiement d'une mise à jour : sauvegarder → uploader les fichiers (sans écraser config.php) → recharger une page (migrations auto) → vérifier via la matrice de santé.

M. 🚑 Dépannage

SymptômeSolution
1045 Access denied (install)Mot de passe de la base (pas hPanel) ; ressaisir sans espace.
1049 Unknown databaseCréer la base dans hPanel ; vérifier le nom exact.
2002 / refusedEssayer localhost127.0.0.1.
Config non écriteRendre config/ inscriptible.
Connexion site impossibleSe connecter avec identifiant + mot de passe BDD (resync auto).
E-mail reset non reçuEnregistrer un e-mail (Paramètres) ; vérifier spams / SMTP.
Google refuséAjouter l'adresse à la liste blanche ; vérifier origines/URI console Google.
Reconfigurer sans réinstaller : install.php?reconfigure=1 (la config existante n'est pas détruite).
PARTIE 3 — Journal des modifications

🗒️ Historique des fonctionnalités

Récapitulatif des évolutions du système, avec les fichiers concernés.

1. Connexion par les identifiants de la base — « solution ultime »

Toujours pouvoir se connecter en admin avec l'identifiant + mot de passe de la base, même si le mot de passe applicatif est désynchronisé. Si la vérification normale échoue, une vraie connexion MySQL est tentée ; si elle réussit, le compte est resynchronisé automatiquement.
Fichiers : includes/account.php (db_login_fallback), login.php.

2. Mot de passe oublié (par e-mail)

forgot_password.php envoie un lien valable 1 h, à usage unique (message toujours générique) ; reset_password.php?token=… valide le lien. Pré-requis : e-mail renseigné dans Paramètres → Mon compte.
Fichiers : includes/password_reset.php, forgot_password.php, reset_password.php, table password_resets (auto).

3. Connexion avec un e-mail

La page de connexion accepte l'identifiant OU l'e-mail + mot de passe. Ce même e-mail sert au mot de passe oublié et à Google.
Fichiers : includes/account.php (update_account_email, find_user_by_login), parametres.php.

4-5. Connexion Google + gestion de la liste blanche

Bouton « Se connecter avec Google » « clés en main » (ID client + secret intégrés). Sécurité par liste blanche gérée dans Paramètres → Comptes Google autorisés (ajout/retrait, insensible à la casse, refus des doublons/adresses invalides, effet immédiat).
Console Google : origines https://luvumbu.com, http://localhost ; URI de redirection …/google_callback.php (prod + local).
Fichiers : includes/google_auth.php, includes/settings.php, google_login.php, google_callback.php, login.php, parametres.php, table settings (auto).

6-8. Éditeur WYSIWYG, page unique garantie & modèle « Tableautier (DC2Scale) »

Fichiers : assets/js/cv-builder.js, cv_builder.php, api/cv_profile.php, includes/cv.php, cv_view.php, mes_cv.php.

9. Matrice de santé en temps réel

Sur architecture.php, à la demande : bouton « 🩺 Afficher », rafraîchi toutes les 4 s via api/health.php, suspendu quand l'onglet est caché, bloc réservé (pas de saut de mise en page). api/health.php réservé aux utilisateurs connectés (401 sinon).
Fichiers : api/health.php (nouveau), architecture.php.

10. Élément « image » séparé de la photo de profil

Nouveau bouton « 🖼️ Ajouter une image » : bloc image libre sur le canvas (déplaçable ✥, redimensionnable ↔ ↕ ⤡, supprimable ✕), distinct de la photo de profil. Stocké dans profile.canvasBlocks (type:'image', src dataURL).
Fichiers : cv_builder.php, assets/js/cv-builder.js.

Mise en service rapide (serveur)

  1. Se connecter : …/login.php (identifiant + mot de passe de la base).
  2. Aller dans …/parametres.php.
  3. Connexion avec Google → Ajouter son adresse Gmail.
  4. Se déconnecter, puis tester « Se connecter avec Google ».
Ne jamais uploader config/config.php (généré par le serveur) ni publier includes/google_auth.php (secret Google). Les tables password_resets / settings et la colonne cvs.profile_json se créent automatiquement au premier usage.
↑ Haut