Documentation unique : utilisation pas à pas, installation / exploitation technique et journal des modifications.
CV Luvumbu est une application web (PHP / MySQL) pour créer, mettre en forme, partager et suivre des CV.
Le point d'entrée index.php redirige automatiquement :
| État | Redirection |
|---|---|
| Pas installée | → assistant d'installation install.php |
| Non connecté | → connexion login.php |
| Connecté | → tableau de bord dashboard.php |
root),
le mot de passe = celui de la base (pas hPanel).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).
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).
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églage | Description |
|---|---|
| Modèle | dc2scale (Tableautier), moderne… change toute la mise en page. |
| Couleurs | Principale + secondaire, palettes prêtes, overrides avancés. |
| 📷 Photo de profil | Import, taille, forme (cercle, arrondi, carré, portrait, hexagone), position. |
| 🖼️ Image libre | Bloc image posé sur la page (distinct de la photo), déplaçable / redimensionnable. |
| Titre / poste | Métier affiché sous le nom (headline). |
| Coordonnées | Lieu, téléphone, e-mail, permis… + pour ajouter, ✕ pour retirer. |
| Profil / résumé | Texte de présentation. |
| Sections | Expérience, Formation, Compétences, Logiciels, Habilitations, Langues, Loisirs — réordonnables par glisser-déposer. |
| 📐 Une seule page | Compresse automatiquement la mise en page pour tenir sur une A4. |
| Disposition libre | Canvas : déplacer ✥, redimensionner ↔ ↕ ⤡, supprimer ✕. |
💾 Enregistrer envoie le profil JSON au serveur. 🎓 Tutoriel lance une visite guidée pas à pas.
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.
Depuis Mes CV → 🔗 Partager, l'application crée un jeton
(share_token) et fournit :
cv_public.php?token=… (visible sans compte) ;noindex (non référencée). Le jeton
aléatoire de 32 caractères rend un lien non communiqué introuvable.Supprimer un CV le place en corbeille (suppression douce, colonne deleted_at).
Depuis la corbeille : ♻️ Restaurer ou ❌ Supprimer définitivement.
| Champ | Description |
|---|---|
| Entreprise | Nom de l'employeur. |
| Date d'envoi | Quand le CV a été envoyé. |
| CV envoyé | CV associé (facultatif). |
| Statut | En attente / Réponse positive / Réponse négative. |
| Relance | Active/désactive + date ; passe en « à faire » à l'échéance. |
| Infos suppl. | + Ajouter une information : champs libres (libellé + valeur), stockés en JSON. |
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
Fonctionne « clés en main ». Sécurité par liste blanche :
Clic « Se connecter avec Google » → choix du compte
├─ adresse autorisée → connecté
└─ adresse absente → refusé
reset_password.php?token=… et choisir un nouveau mot de passe.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.
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
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é.
Application PHP procédurale, sans framework :
*.php racine) : écrans visibles.includes/) : logique réutilisable.api/) : endpoints JSON.assets/) : CSS, JS (dont cv-builder.js), images.config/config.php) : généré, jamais versionné.| Élément | Recommandation |
|---|---|
| PHP | 8.0+ (str_contains, random_bytes, password_hash). |
| Extensions | pdo_mysql, openssl, mbstring, json. |
| Base | MySQL 5.7+ / MariaDB 10.3+ (utf8mb4). |
| Serveur | Apache / Nginx ; en local : XAMPP. |
mail() opérationnel (mot de passe oublié). | |
| HTTPS | Recommandé (requis pour Google). |
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)
htdocs/luvumbu/cv_luvumbu.http://localhost/luvumbu/cv_luvumbu/.127.0.0.1, Base cv_luvumbu,
Utilisateur root, Mot de passe vide.root + mot de passe vide.config/config.php ; dossier
config/ inscriptible).localhost), base, utilisateur, mot de passe.CREATE DATABASE : la base doit donc déjà exister dans hPanel ;
l'assistant l'utilise telle quelle.install.php)localhost↔127.0.0.1).users : nettoyage des tables résiduelles si incompatible (évite errno 150), puis création propre.api_keys.username = utilisateur BDD, mot de passe = mot de passe BDD (ON DUPLICATE KEY UPDATE).config/config.php si tout a réussi.?reconfigure=1).
Base KO → ré-affiche l'assistant sans détruire la config existante. Le mot de
passe est « trimé » (espaces retirés).<?php
return array (
'host' => '127.0.0.1',
'port' => 3306,
'dbname' => 'cv_luvumbu',
'user' => 'root',
'pass' => '',
);
.gitignore). Reconfigurer : install.php?reconfigure=1.Toutes les tables : InnoDB, utf8mb4_unicode_ci.
usersid, username (unique), email (unique, migration),
password_hash, must_change_password (migration), created_at.
cvsid, 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.
applicationsid, 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.
api_keysid, user_id (FK, cascade), label,
scopes (migration), key_prefix, key_hash (SHA-256, unique),
created_at, last_used_at, revoked_at.
password_resets & settingsCréées automatiquement : jetons de réinitialisation (usage unique, 1 h) ; réglages clé/valeur (config Google, liste blanche).
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.
(api/cv.php)Auth par en-tête X-API-Key (ou Authorization: Bearer). JSON entrant/sortant.
| Méthode | Permission | Description |
|---|---|---|
GET /api/cv.php | cv:read | Liste les CV. |
GET ?id=N | cv:read | Détail texte. |
GET ?id=N&profile=1 | cv:read | CV + profil riche. |
GET ?whoami=1 | — | user_id + scopes. |
POST /api/cv.php | cv:write | Crée un CV. |
PUT /api/cv.php | cv:write | Met à jour ; {"share":true} → share_url. |
DELETE ?id=N[&force=1] | cv:write / cv:delete | Corbeille 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
api/cv_profile.php (éditeur, auth
session + CSRF) et api/health.php (santé JSON, utilisateurs connectés
uniquement → 401 sinon).password_hash / bcrypt).EMULATE_PREPARES=false).noindex.user_id.config/config.php, includes/google_auth.php (secret Google).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é.
| Symptôme | Solution |
|---|---|
| 1045 Access denied (install) | Mot de passe de la base (pas hPanel) ; ressaisir sans espace. |
| 1049 Unknown database | Créer la base dans hPanel ; vérifier le nom exact. |
| 2002 / refused | Essayer localhost ↔ 127.0.0.1. |
| Config non écrite | Rendre config/ inscriptible. |
| Connexion site impossible | Se connecter avec identifiant + mot de passe BDD (resync auto). |
| E-mail reset non reçu | Enregistrer un e-mail (Paramètres) ; vérifier spams / SMTP. |
| Google refusé | Ajouter l'adresse à la liste blanche ; vérifier origines/URI console Google. |
install.php?reconfigure=1
(la config existante n'est pas détruite).Récapitulatif des évolutions du système, avec les fichiers concernés.
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.
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).
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.
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).
cvs.profile_json), aperçu
live strictement identique au rendu. Moteur repris de l'ancien cv_enligne
(désormais supprimé). Enregistrement via api/cv_profile.php (session + CSRF).zoom sans plancher bloquant.headline,
summary, contact, et sections Habilitations, Compétences,
Logiciels.Fichiers : assets/js/cv-builder.js, cv_builder.php,
api/cv_profile.php, includes/cv.php, cv_view.php,
mes_cv.php.
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.
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.
…/login.php (identifiant + mot de passe de la base).…/parametres.php.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.