Mini application Java console de gestion de stock.
Ce projet permet de pratiquer Java orienté objet sans framework, avec une architecture simple inspirée des applications backend classiques : modèles, repositories, services, interface console, exceptions personnalisées, sauvegarde CSV et tests unitaires JUnit.
L'objectif est de comprendre les bases Java avant de passer à Spring Boot.
L'application permet de :
- se connecter avec un email et un mot de passe ;
- gérer deux rôles :
ADMINetUSER; - afficher la liste des produits ;
- afficher le détail d'un produit ;
- ajouter un produit en tant qu'administrateur ;
- modifier un produit en tant qu'administrateur ;
- supprimer un produit en tant qu'administrateur ;
- afficher les utilisateurs en tant qu'administrateur ;
- créer un utilisateur en tant qu'administrateur ;
- sauvegarder les données dans des fichiers CSV ;
- lancer des tests unitaires avec JUnit.
Au premier lancement, l'application crée automatiquement deux utilisateurs.
Email : admin@test.com
Mot de passe : admin123Email : user@test.com
Mot de passe : user123Un utilisateur simple peut :
1. Voir tous les produits
2. Voir le détail d'un produit
3. Se déconnecter
4. Quitter l'applicationUn administrateur peut :
1. Voir tous les produits
2. Voir le détail d'un produit
3. Ajouter un produit
4. Modifier un produit
5. Supprimer un produit
6. Voir les utilisateurs
7. Créer un utilisateur
8. Se déconnecter
9. Quitter l'applicationAu premier lancement, l'application crée automatiquement quelques produits :
1 - Clavier - 49.99€ - stock : 10
2 - Souris - 19.99€ - stock : 25
3 - Écran - 149.99€ - stock : 5StockManagerConsole/
├── pom.xml
├── README.md
├── data/
│ ├── products.csv
│ └── users.csv
├── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── stockmanager/
│ │ ├── Main.java
│ │ ├── exception/
│ │ │ ├── DuplicateEmailException.java
│ │ │ ├── NotFoundException.java
│ │ │ ├── UnauthorizedException.java
│ │ │ └── ValidationException.java
│ │ ├── model/
│ │ │ ├── Product.java
│ │ │ ├── Role.java
│ │ │ └── User.java
│ │ ├── repository/
│ │ │ ├── ProductRepository.java
│ │ │ └── UserRepository.java
│ │ ├── service/
│ │ │ ├── AuthService.java
│ │ │ ├── ProductService.java
│ │ │ └── UserService.java
│ │ └── ui/
│ │ ├── ConsoleMenu.java
│ │ └── InputReader.java
│ └── test/
│ └── java/
│ └── com/
│ └── stockmanager/
│ └── service/
│ ├── AuthServiceTest.java
│ ├── ProductServiceTest.java
│ └── UserServiceTest.javaLe projet est découpé en plusieurs couches.
Contient les objets métier :
Product
User
RoleExemple :
Productreprésente un produit avec un id, un nom, un prix et une quantité en stock.Userreprésente un utilisateur avec un id, un email, un mot de passe et un rôle.Roleest une enum avec les valeursADMINetUSER.
Contient les classes responsables du stockage des données.
ProductRepository
UserRepositoryLes repositories utilisent une liste en mémoire (ArrayList) et sauvegardent les données dans des fichiers CSV.
Contient la logique métier.
AuthService
ProductService
UserServiceExemples de règles métier :
- seul un admin peut créer un produit ;
- seul un admin peut modifier un produit ;
- seul un admin peut supprimer un produit ;
- seul un admin peut créer un utilisateur ;
- un produit doit avoir un nom non vide ;
- un produit doit avoir un prix supérieur à 0 ;
- un stock ne peut pas être négatif ;
- un email utilisateur doit être unique.
Contient l'interface console.
ConsoleMenu
InputReaderConsoleMenu affiche les menus et appelle les services.
InputReader lit les entrées utilisateur et évite que l'application plante si l'utilisateur tape une mauvaise valeur, par exemple une lettre au lieu d'un nombre.
Contient les exceptions personnalisées.
ValidationException
UnauthorizedException
NotFoundException
DuplicateEmailExceptionElles permettent d'obtenir des erreurs plus explicites que de simples null ou false.
Exemples :
Produit introuvable.
Action réservée aux administrateurs.
Le prix doit être supérieur à 0.
Cet email est déjà utilisé.Les données sont sauvegardées dans le dossier :
data/Fichiers utilisés :
data/products.csv
data/users.csvExemple de fichier products.csv :
1;Clavier;49.99;10
2;Souris;19.99;25
3;Écran;149.99;5Exemple de fichier users.csv :
1;admin@test.com;admin123;ADMIN
2;user@test.com;user123;USERSi les fichiers n'existent pas, ils sont créés automatiquement au lancement.
Attention : les mots de passe sont stockés en clair volontairement pour garder le projet simple. Dans une vraie application, ils devraient être hashés.
Le projet utilise :
Java 17
Maven
JUnit 5Vérifier Java :
java -versionVérifier Maven :
mvn -versionCloner le projet ou télécharger le dossier, puis ouvrir un terminal à la racine du projet :
cd StockManagerConsoleLa racine du projet doit contenir le fichier :
pom.xmlmvn clean compileSi tout est correct, Maven doit afficher :
BUILD SUCCESSDepuis la racine du projet :
mvn exec:javaL'application démarre dans le terminal :
=== Stock Manager Console ===
=== Connexion ===
Email :
Mot de passe :Entrer :
Email : admin@test.com
Mot de passe : admin123Menu attendu :
=== Menu ADMIN ===
1. Voir tous les produits
2. Voir le détail d'un produit
3. Ajouter un produit
4. Modifier un produit
5. Supprimer un produit
6. Voir les utilisateurs
7. Créer un utilisateur
8. Se déconnecter
9. Quitter l'applicationChoisir :
1Résultat attendu :
=== Liste des produits ===
1 - Clavier - 49.99€ - stock : 10
2 - Souris - 19.99€ - stock : 25
3 - Écran - 149.99€ - stock : 5Choisir :
2Puis entrer un id, par exemple :
ID du produit : 1Résultat attendu :
ID : 1
Nom : Clavier
Prix : 49.99€
Stock : 10
Disponible : OuiChoisir :
3Puis entrer par exemple :
Nom : Casque
Prix : 79,99
Quantité en stock : 5Le programme accepte les prix avec une virgule ou un point :
79,99
79.99Résultat attendu :
Produit créé : 4 - Casque - 79.99€ - stock : 5Choisir :
4Puis entrer l'id du produit à modifier :
ID du produit à modifier : 4Entrer les nouvelles valeurs :
Nouveau nom : Casque Bluetooth
Nouveau prix : 89,99
Nouvelle quantité en stock : 8Résultat attendu :
Produit modifié.Choisir :
5Puis entrer l'id du produit à supprimer :
ID du produit à supprimer : 4L'application demande une confirmation :
Confirmer la suppression ? oui/non :Entrer :
ouiRésultat attendu :
Produit supprimé.Choisir :
6Résultat attendu :
=== Liste des utilisateurs ===
1 - admin@test.com - ADMIN
2 - user@test.com - USERChoisir :
7Entrer par exemple :
Email : test@test.com
Mot de passe : test123
Rôle :
1. ADMIN
2. USER
Choix : 2Résultat attendu :
Utilisateur créé : 3 - test@test.com - USERChoisir :
8Résultat attendu :
Déconnexion réussie.L'application revient ensuite à l'écran de connexion.
Entrer :
Email : test@test.com
Mot de passe : test123Menu attendu :
=== Menu USER ===
1. Voir tous les produits
2. Voir le détail d'un produit
3. Se déconnecter
4. Quitter l'applicationL'utilisateur simple ne peut pas créer, modifier ou supprimer de produits.
Dans le menu, choisir le détail d'un produit et entrer :
ID du produit : 999Résultat attendu :
Erreur : Produit introuvable.Essayer de créer un produit avec :
Prix : 0Résultat attendu :
Erreur : Le prix doit être supérieur à 0.Essayer de créer un produit avec :
Quantité en stock : -1Résultat attendu :
Erreur : Le stock ne peut pas être négatif.Essayer de créer un utilisateur avec :
Email : user@test.comRésultat attendu :
Erreur : Cet email est déjà utilisé.Après avoir ajouté un produit ou un utilisateur, quitter l'application puis relancer :
mvn exec:javaLes données doivent toujours être présentes.
Il est aussi possible d'ouvrir les fichiers :
data/products.csv
data/users.csvpour vérifier que les données ont été enregistrées.
Depuis la racine du projet :
mvn testRésultat attendu :
BUILD SUCCESSLes tests couvrent notamment :
AuthService
- connexion réussie
- connexion échouée avec mauvais mot de passe
- connexion échouée avec email inconnu
- déconnexion
ProductService
- liste des produits par défaut
- détail produit
- produit introuvable
- création produit par admin
- refus de création produit par user
- validation du nom produit
- validation du prix
- validation du stock
- modification produit
- suppression produit
UserService
- liste utilisateurs par admin
- refus liste utilisateurs par user
- création utilisateur par admin
- refus création utilisateur par user
- email unique
- email non vide
- mot de passe non vide
- rôle obligatoireLes tests utilisent @TempDir, donc ils créent leurs propres fichiers CSV temporaires et ne modifient pas les fichiers du dossier data/.
Compiler :
mvn clean compileLancer l'application :
mvn exec:javaLancer les tests :
mvn testNettoyer le projet :
mvn cleanCompiler puis lancer :
mvn clean compile exec:javaCe projet permet de pratiquer :
classes
objets
constructeurs
encapsulation
getters
enums
ArrayList
repositories
services
exceptions personnalisées
lecture console
CRUD
authentification simple
rôles ADMIN / USER
sauvegarde CSV
tests unitaires JUnit
MavenPour quelqu'un qui vient de Symfony :
Java model ≈ Entity Symfony
Java repository ≈ Repository Symfony
Java service ≈ Service Symfony
ConsoleMenu ≈ Controller console
Maven ≈ Composer
JUnit ≈ PHPUnit
JPA/Hibernate ≈ Doctrine ORM
Spring Boot ≈ Symfony côté JavaExemples :
userRepository.findByEmail(email)
≈
$userRepository->findOneBy(['email' => $email])ProductService
≈
un service Symfony contenant la logique métierValidationException
≈
une exception métier ou une erreur de validation contrôléeLe projet reste volontairement simple :
pas de base de données
pas de hash de mot de passe
pas d'interface web
pas d'API REST
pas de Spring Boot
pas de vraie session sécurisée
pas de validation email avancée
pas de gestion fine des permissionsLes mots de passe sont stockés en clair dans le CSV uniquement pour simplifier l'apprentissage.
Évolutions possibles en Java pur :
1. Refactorer les repositories avec une classe abstraite CsvRepository<T>
2. Ajouter des interfaces Repository
3. Ajouter un hash de mot de passe simple
4. Ajouter plus de tests
5. Améliorer la validation des emailsÉvolution principale recommandée :
Refaire le même projet en Spring Boot + ThymeleafPuis ensuite :
Spring Boot REST API + ReactL'intérêt est de comparer ce qui a été fait manuellement ici avec ce que Spring Boot automatise.