Trang này chưa được dịch sang ngôn ngữ của bạn: đang hiển thị bằng tiếng Pháp.
Architecture
Node 22, Express, EJS et SQLite. 78 modules dans src/,
89 vues. Pas de couche d'abstraction sur la base, pas de framework front,
pas d'étape de construction.
Pile technique#
| Couche | Choix | Pourquoi |
|---|---|---|
| Exécution | Node 22 | Le test runner, fetch et les fonctions de chiffrement sont dans la bibliothèque standard |
| Serveur | Express 4 | Assez petit pour être compris entièrement |
| Vues | EJS, rendu côté serveur | Pas de construction, pas d'hydratation, pas de fenêtre entre le HTML et le JavaScript |
| Base | better-sqlite3 | Synchrone, requêtes paramétrées, un fichier ; aucun serveur à administrer |
| Front | JavaScript nu, sans dépendance | La CSP interdit tout script en ligne ; un framework n'apporterait rien à des pages rendues côté serveur |
Organisation du code#
Un fichier par domaine métier, exportant des fonctions pures autant que possible. Les routes appellent ces fonctions et rendent une vue ; elles ne portent pas de logique métier.
src/
app.js assemblage de l'application Express
server.js démarrage et balayage périodique
db.js schéma, migrations, contraintes
install.js état d'installation, secret de session
security.js CSRF (dont multipart), débit, verrouillage, nonce CSP
session-store.js magasin de sessions SQLite, révocation
audit.js journal d'audit : écriture, filtres, export, purge
i18n.js langue, traduction, statuts, sens d'écriture
locales/ 16 dictionnaires
hr.js demandes, soldes, fiches de paie
cse.js mandats, élections, scrutin anonyme
finance.js tiers, contrats, factures, budgets, notes de frais
currency.js devises et taux figés
billing.js abonnements et facturation récurrente
vat.js déclarations de TVA
governance.js réunions, décisions, actions, risques
surveys.js sondages anonymes, baromètre
planning.js créneaux, roulements, astreintes
quality.js non-conformités, actions, audits
frontdesk.js visiteurs et courrier
signing.js parapheur : empreinte, sceau, circuit
workflows.js demandes internes et circuits d'approbation
intake.js pièces reçues, arbitrage règles / modèle
invoice-scan.js lecture d'une facture
ai.js analyse assistée optionnelle
mailbox.js relève IMAP
backup.js sauvegarde, intégrité, restauration
offsite/ externalisation FTP et Google Drive
export.js export intégral
api-tokens.js jetons d'API
webhooks.js webhooks signés, file d'attente, réessais
…
views/
partials/ en-tête, barres latérales, icônes, thème, langues
*.ejs une vue par écran
public/ feuille de style, thème, chronomètre, agenda, jauges
tests/ suite d'intégration (node --test)
doc/ ce site, indépendant du logiciel
Choix de conception#
Le schéma porte les règles#
Les statuts sont contraints par des CHECK, les liens par des clés étrangères
avec la bonne action en cascade, l'unicité par des index. Une règle inscrite au schéma tient
même si un code futur l'oublie — c'est ce qui empêche, par exemple, de facturer deux fois la
même échéance d'abonnement quand deux balayages se croisent.
Le refus explicite plutôt que la valeur par défaut#
Une devise sans taux connu n'est pas proposée ; un import fautif n'est pas écrit ; une
écriture déséquilibrée est rejetée en disant de combien. Les fonctions renvoient
{ ok: false, reason } plutôt que de deviner.
Aucun style ni gestionnaire d'événement en ligne#
La CSP interdit style="…" et onclick="…". Les valeurs dynamiques
passent par des attributs data-* lus par un script à nonce. C'est contraignant à
écrire, mais cela ferme la classe entière des injections de script.
Les fichiers vivent hors du dépôt#
CV, coffre-fort, parapheur, pièces reçues et sauvegardes sont écrits en 0600
dans des dossiers séparés, jamais servis en statique. Seules les photos de profil le sont.
Dépendances#
La règle est de n'ajouter une dépendance que lorsque la réécrire serait déraisonnable ou risqué. Le format tar, le TOTP, le lecteur CSV, le client FTP et le jeton JWT sont écrits ici ; le protocole IMAP et le décodage MIME ne le sont pas.
| Dépendance | Rôle |
|---|---|
| express | Serveur HTTP et routage |
| better-sqlite3 | Base de données |
| ejs | Gabarits de vues |
| helmet | En-têtes de sécurité et CSP |
| bcrypt | Hachage des mots de passe |
| multer | Réception des envois multipart, en mémoire |
| imapflow | Protocole IMAP |
| mailparser | Décodage MIME |
| @anthropic-ai/sdk | Analyse assistée, chargé seulement si activée |
Ce site#
Le dossier doc/ contient cette documentation. Il est indépendant du
logiciel : aucun fichier n'est partagé, rien n'est servi par le CMS, et le site se
dépose tel quel sur un hébergement statique.
node doc/build.js # écrit doc/site/, le dossier à héberger
Le script n'a aucune dépendance. Il lit src/locales/ et tests/ pour
en extraire le lexique et les décomptes affichés dans ces pages :
la documentation ne peut donc pas afficher un chiffre que le dépôt contredit.
Tài liệu Toutadmin — dựng ngày 2026-09-13. Trang độc lập, tách rời phần mềm.