Stack technique
Le système repose sur une architecture B/S développée avec Spring Boot comme framwork principal. Les technologies complémentaires incluent Java, jQuery, Ajax pour les interactions frontales, et MySQL comme base de données relationnelle. Cette combinaison permet une conception modulaire à faible couplage.
Fonctionnalités du système
Interface administrateur
L'administrateur authentifié accède aux modules :
- Gestion du personnel : CRUD des employés (ID, nom, poste, contact)
- Suivi des présences : Enregistrement des pointages avec horodatage
- Dossier animal : Fiche complète (espèce, vaccination, statut sanitaire)
- Archivage : Stockage des bilans de santé et observations cliniques
Interface employé
Les utilisateurs enregistrés peuvent :
- Saisir leurs pointages quotidiens
- Consulter les dossiers animaux
- Renseigner les observations médicales
- Accéder aux archives sanitaires
Implémentation technique
Module d'authentification
@RestController
@RequestMapping("/utilisateurs")
public class AuthController {
@PostMapping("/connexion")
public Reponse login(@RequestParam String identifiant,
@RequestParam String motdepasse) {
Utilisateur utilisateur = userService.rechercherParIdentifiant(identifiant);
if (utilisateur == null || !utilisateur.getMotDePasse().equals(motdepasse)) {
return Reponse.erreur("Identifiants invalides");
}
String jeton = tokenService.genererJeton(utilisateur.getId(), "veterinaire");
return Reponse.succes().ajouter("jeton", jeton);
}
@PostMapping("/inscription")
public Reponse inscription(@RequestBody Utilisateur nouvelUtilisateur) {
if (userService.existe(nouvelUtilisateur.getIdentifiant())) {
return Reponse.erreur("Utilisateur déjà enregistré");
}
userService.enregistrer(nouvelUtilisateur);
return Reponse.succes();
}
}
Gestion des fichiers
@RestController
@RequestMapping("/fichiers")
public class FichierController {
@PostMapping("/transfert")
public Reponse uploadFichier(@RequestParam MultipartFile fichier) {
String extension = FilenameUtils.getExtension(fichier.getOriginalFilename());
String nomUnique = System.currentTimeMillis() + "." + extension;
Path destination = Paths.get("static/upload/", nomUnique);
Files.copy(fichier.getInputStream(), destination, StandardCopyOption.REPLACE_EXISTING);
return Reponse.succes().ajouter("fichier", nomUnique);
}
@GetMapping("/telechargement")
public ResponseEntity<byte[]> download(@RequestParam String nomFichier) {
byte[] donnees = Files.readAllBytes(Paths.get("static/upload/" + nomFichier));
HttpHeaders entetes = new HttpHeaders();
entetes.setContentDispositionFormData("attachment", nomFichier);
return new ResponseEntity<>(donnees, entetes, HttpStatus.OK);
}
}
Utilitaire de réponse
public class Reponse extends HashMap<String, Object> {
public Reponse() {
ajouter("statut", 200);
}
public static Reponse succes() {
return new Reponse();
}
public static Reponse erreur(String message) {
Reponse res = new Reponse();
res.ajouter("statut", 500);
res.ajouter("erreur", message);
return res;
}
public Reponse ajouter(String cle, Object valeur) {
super.put(cle, valeur);
return this;
}
}