- Groupe D112
- g62727 Jashan Singh
- g62227 Oussama L'garah
Lexandria est une application Java permettant aux utilisateurs de gérer leur bibliothèque personnelle de manière intuitive et efficace. Grâce à un système de scan, ils peuvent ajouter rapidement des livres à leur collection ou les enregistrer manuellement. Chaque ouvrage peut être classé selon son statut de lecture, qu'il soit en cours, terminé, abandonné ou à lire plus tard, offrant ainsi un suivi précis de la progression de lecture. L’application permet également aux utilisateurs de laisser des commentaires et d’attribuer des notes aux livres selon plusieurs critères, tels que l'originalité ou des aspects spécifiques au genre : romance, fantasy,fun, originalité, pédagogie,...
Pour enrichir l’expérience, Lexandria propose un système de recommandation. Un outil de filtrage avancé permet également d’explorer sa bibliothèque selon divers critères, comme l’auteur, le statut ou encore si le livre a été ajouté aux favoris.
De plus, l’application offre un accès à des statistiques de lecture détaillées, permettant aux lecteurs de suivre leur évolution, notamment le nombre de livres en cours, terminés,abandonnés,...
Enfin, Lexandria intègre une fonctionnalité permettant de vérifier la disponibilité d’un livre dans des enseignes majeures comme Fnac, Amazon et Club, facilitant ainsi l’achat ou l’emprunt de nouveaux ouvrages.
Le diagramme de classe ci-dessous illustre la structure du modèle de l'application.
L'architecture retenue pour ce projet est model-view-presenter.
A. MVC
-
Le Controller est fortement dépendant de la View et du Model et est responsable de leur liaison via addObserver.
-
La View dépend faiblement du Model grâce au pattern Observer.
B. MVP
-
La View ne dépend pas du Model.
-
Le Presenter dépend de la View et du Model.
-
Suppression de la liaison directe entre le Model et la View, car le Presenter gère leurs interactions.
-
La View est passive : elle ne donne plus aucun ordre et ne contient plus de logique. Elle ne nécessite donc plus de tests unitaires (le Model reste à tester comme en MVC, et le Presenter se teste comme le Controller via Mockito p.e).
C. MVVM
- MVVM a été délaissé, car il est bien plus adapté aux applications mobiles.
Les tests fonctionnels élémentaires pour le projet sont les suivants :
-
T1
- Scénario : importation d'une photo.
- Étape(s)
- Cliquer sur le bouton "Scanner un livre".
- Sélectionner le fichier image.
- Données d'entrée :
- Une photo (png,jpeg,jpg)
- Résultat attendu :
- ISBN correctement extraits
- Confirmation de l'importation du livre
- Affichage du livre dans la bibliothèque personnelle.
- Les données correspondant au livre scanner sont ajoutées à la base de données.
-
T2
- Scénario : Scanner un isbn valide
- Étape(s) :
- Importation de l'image
- Lancer le scanning avec tesseract
- Données d'entrée :
- une photo (png,jpg,jpeg)
- Résultat attendu : - L'ISBN est correctement détecté - Affichage du livre dans la bibliothèque personnelle. - Les données correspondant au livre scanner sont ajoutées à la base de données.
-
T3
-
Scénario : importation d'une photo illisible.
-
Étape(s) :
- Cliquer sur le bouton "Scanner un livre".
- Sélectionner le fichier image.
-
Données d'entrée : - Une image (png,jpeg,jpg)
-
Résultat attendu :
- Message d'erreur et prompt invitant l'utilisateur à réessayer
-
-
T4
- Scénario : Rechercher un livre par titre
- Étape(s) :
- Entrer le titre du/des livre(s) recherchés.
- Valider celui-ci en cliquant sur le bouton "Go".
- Données d'entrée :
- Harry Potter
- Résultat attendu :
- Le(s) livre(s) correspondant(s) au filtre sont/est affiché(s).
-
T5
- Scénario : Rechercher un livre par auteur
- Étape(s) :
- Entrer l'auteur du/des livre(s) recherché(s).
- Valider celui-ci en cliquant sur le bouton "Rechercher".
- Données d'entrée :
- row (pour J.K. Rowling)
- Résultat attendu :
- Le(s) livre(s) correspondant(s) au filtre sont/est affiché(s).
-
T6
- Scénario : Demarrage initial de l'application
- Étape(s) :
- Lancer l'application
- Données d'entrée :
- Aucune
- Résultat attendu :
- L’interface s’affiche correctement, se connecter/s'inscire puis aucun livre n'est affiché, tout est vierge et aucune erreur ne se produit.
-
T7
- Scénario : Démarrage de l'application après des ajouts de commentaires ou livres
- Étape(s) :
- Lancer l'application
- Données d'entrée :
- Aucune
- Résultats attendu :
- Les livres en base de données sont affichés au démarrage.
-
T8
- Scénario : Supprimer un livre personnel
- Étape(s):
- Cliquer sur le bouton delete du livre à supprimer dans sa page de détails
- Confirmer la suppression
- Données d'entrée :
- Aucun
- Résultat attendu :
- Livre disparu de la liste des livres personnels
- suppression du livre de la base de données de l'utilisateur
-
T9
- Scénario : Changer l'état d'un livre
- Étape(s): 1. Passer un livre d'un état à un autre par exemple (toRead à finsihed) en selectionnant le bon paramètre.
- Données d'entrée :
- Aucun
- Résultat attendu :
- Livre n'apparait plus dans la liste des livres toRead (à lire)
- Livre apparait dans la liste des livres finished.
-
T10
- Scénario : Ajouter un commentaire pour un livre
- Étape(s) :
- Sélectionner un livre.
- Saisir le commentaire
- Valider
- Données d'entrée :
- "Bonne surprise je recommande".
- Résultat attendu :
- Le commentaire est ajouté à l’espace dédié du livre.
-
T11
-
Scénario : Ajouter un livre manuellement car le message du scan informe qu'aucun livre n’a été trouvée car aucune correspondance avec le livre scanné/importé/la complétion auto n'a été trouvé (l'isbn a bien été extrait, mais aucun livre correspondant n'a été trouvé)
-
Étape(s) :
- Cliquer sur le bouton "ajouter manuellement"
- Saisir le livre manuellement
- Titre du livre
- Nom de l'auteur
- ISBN
- Valider en cliquant sur le bouton "Ajouter livre"
-
Données d'entrée :
- Auteur
- Titre
- ISBN
-
Résultat attendu :
- Le livre est ajouté à la bibliothèque personnelle de l'utilisateur
- Le livre est ajouté à la base de données
-
-
T12
- Scénario : Afficher les détails d'un livre
- Étape(s) :
- Cliquer sur le livre souhaité dans la bibliothèque
- Données d'entrée :
- Aucune
- Résultat attendu :
- Les informations détaillées du livre s’affichent correctement.
-
T13
- Scénario : Marquer un livre comme "Lecture en cours"
- Étape(s) :
- Cliquer sur lecture en cours pour le livre souhaité
- Valider le choix en cliquant sur le bouton "Confirmer"
- Données d'entrée :
- Aucune
- Résultat attendu :
- Le livre apparaît dans la bonne section
-
T14
- Scénario : Marquer un livre comme "Lecture terminée"
- Étape(s) :
- Cliquer sur "lecture terminée" pour le livre souhaité
- Valider le choix en cliquant sur le bouton "Confirmer"
- Données d'entrée :
- Aucune
- Résultat attendu :
- Le livre apparait dans la bonne section/historique avec la date de début et de fin
-
T15
-
Scénario : Ajouter un livre aux favoris
-
Étape(s) :
- Cliquer sur "favori" sur le livre souhaité
-
Données d'entrée :
- Aucune
-
Résultat attendu :
- Le livre apparait dans la bonne section
-
-
T16
- Scénario : Noter un livre
- Étape(s) :
- Sélectionner un livre dans la bibliothèque
- Cliquer sur "Noter ce livre".
- Attribuer une note pour différents critères, tels que :
- Romance
- Thriller
- Fun
- Pédagogie
- Fantasy
- Originaltié
- Valider son choix en cliquant sur le bouton "Valider"
- Données d'entrée :
- Notes pour les différents critères
- Résultat attendu :
- Message De confirmation
-
T17
- Scénario : Vérifier la disponibilité du livre en magasin (livre disponible)
- Étape(s) :
- cliquez sur le livre
- Cliquer sur le logo du magasin où le livre est disponible
- Données d'entrée :
- Aucune
- Résultat attendu :
- Redirection vers la page internet du livre en question
| Qui | Description |
|---|---|
| Tous | Analyse du projet. |
| Oussama | Initialisation de Git |
| Jashan | Installation et configuration de l'environnement de développement (JDK, IDE, dépendances). |
| Qui | Description |
|---|---|
| Tous | Reflexion sur la partie base de données du projet et Classes java |
| Oussama | Création du diagramme UML |
| Jashan | Création des premiers croquis FXML de l’interface utilisateur. |
| Qui | Description |
|---|---|
| Tous | Démarrage du projet Java : codage du squelette de l'application (model). |
| Oussama | Mise en place de la connexion à la base de données. |
| Jashan | Création des scripts SQL pour la structure de la base de données (tables, relations, contraintes). |
| Oussama | Implémentation connexion API et des classes webSearcher |
| Jashan | Implémentation de la classe scanner |
| Qui | Description |
|---|---|
| Tous | implémentation des différentes view en FXML et presenter |
| Oussama | Amélioration du style de l'interface graphique |
| Jashan | Gestion de la génération des fichiers csv sur les statistiques utilisateurs |
| Qui | Description |
|---|---|
| Tous | Tests, débogage et finalisation de l'application |
| Oussama | finalisation et amélioration de la fluidité de l'interface utilisateur |
| Jashan | Optimisation du code |
Voici les deux interfaces principales de notre application :
Voici un aperçu de l'UI finale :
Remarque : Les données des livres sont affichées dynamiquement via du code java et sont donc absentes du fichier "book.fxml"
Pour utiliser l'application, suivez les étape suivantes :
-
Clonez ce repository :
git clone https://git.esi-bru.be/62227/4-prj-1-d-d-112-62727-62227.git
-
Exécutez le projet via la classe Main
La réalisation du projet Lexandria étant maintenant achevée, nous pouvons porter un regard critique sur les différences entre notre vision initiale et l'implémentation finale. Ce projet nous a permis d'en apprendre plus quant à divers aspects de la gestion d'un projet en groupe et le développement d'une application complète de A à Z, de l'analyse au code à la rétrospective.
Nous avons constaté les différences suivantes entre le diagramme de classes imaginé au départ et l'implémentation réalisée :
- Complexité du scanner OCR : L'extraction d'informations à partir des couvertures de livres s'est avérée plus complexe que prévu. Initialement, nous pensions pouvoir extraire le titre et l'auteur directement depuis l'image de couverture, mais nous avons dû nous concentrer principalement sur l'extraction de l'ISBN, qui s'est révélée bien plus fiable contrairement à la paire titre/auteur qui présentait des patternes très variables (police, disposition, style, ...). Les classes ISBNExtractor ainsi que OCRScanner ont nécessité de nombreuses recherches, optimisations et méthodes pour gérer les erreurs d'OCR courantes.
- Système de recommandation simplifié : Une de nos idées consistait à créer un algorithme de recommandation de livres, à l'origine censé être pertinent et relativement complexe, basé sur les notes des utilisateurs. Cette fonctionnalité n'a pas pu être pleinement réalisée. La version actuelle propose des recommandations basées sur une sélection aléatoire de livres que l'utilisateur ne possède pas encore, plutôt que sur une analyse de ses préférences et selon des statistiques des notes qu'il aurait attribué aux autres ouvrages de sa bibliothèque. Des méthodes telles que ratingRecommandations() avaient été préparées dans l'architecture initiale mais n'ont finalement pas été implémentées.
- Ajout de fonctionnalités non prévues : Nous avons ajouté une fonctionnalité d'importation de fichiers CSV qui n'était pas explicitement mentionnée dans nos plans initiaux, mais qui s'est révélée être une bonne idée pour les utilisateurs ayant de grandes collections et voulant rapidement remplir leur bibliothèque virtuelle. Elle ajoute une touche personnalisée imprévue mais utile à la base de données.
- Sécurité renforcée : Nous avons implémenté un système de gestion des mots de passe avec hachage et sel, un aspect qui n'était pas détaillé dans notre conception initiale mais qui s'est progressivement imposé comme un concept que nous voulions intégrer.
En conclusion, malgré la simplification ou le report de certaines fonctionnalités initialement envisagées, le projet final offre une base solide répondant aux exigences et besoins du projet. De plus, les défis techniques rencontrés nous ont permis d'acquérir une bonne expérience en matière de développement en équipe via la gestion des versions et des branches de Git. Nous avons également pu obtenir plus d'expérience dans des concepts clés étudiés au cours tels que l'architecture (MVC/MVP), les bonnes pratiques (Loi de Demeter, SOLID), le FXML, les tests unitaires via jUnit et Mockito, la persistence de données et le multithreading.



