Dans le cadre de mon BTS SIO option SLAM, j’ai réalisé seul un projet nommé StockSeeker, une application web de gestion de stock.
Ce projet s’inscrit dans un contexte fictif mais réaliste : celui d'une entreprise ayant besoin d’un outil moderne, rapide et réactif pour gérer efficacement ses produits et entrepôts.
L'objectif principal était de concevoir un site en Single Page Application (SPA), avec une interface fluide, intuitive et rapide d’utilisation, tout en respectant les contraintes technologiques du BTS.
Dès le départ, mon cahier des charges était clair :
Pour cela, j’ai fait le choix d’une architecture REST, qui permet de séparer clairement le front-end du back-end tout en assurant une communication efficace entre les deux.
Le back-end serait développé en Django, couplé avec Django REST Framework, une solution puissante et flexible pour exposer des API RESTful. Django offre de nombreux avantages :
Enfin, pour la base de données, mon choix s’est porté sur PostgreSQL, une solution open source, fiable et performante, très adaptée aux traitements de données complexes.
Ce projet a été réalisé avec un budget nul, en respectant l’environnement technologique imposé par le BTS SIO :
Je me suis appuyé sur des outils comme :
L’ensemble du projet devait rester simple à installer, rapide à utiliser, et suffisamment ergonomique pour être utilisable même par des personnes non techniques.
Pour la partie back-end, j’ai choisi Django avec son extension Django REST Framework (DRF) afin de créer une API RESTful structurée, sécurisée et évolutive. Django offre une grande rapidité de mise en œuvre grâce à ses modèles et sa gestion de l’authentification intégrée.
Je commence par organiser mes routes.
J’utilise le routeur de Django REST Framework qui me permet de déclarer automatiquement toutes les routes CRUD (Create, Read, Update, Delete) pour mes vues.
J’ajoute également une route spécifique pour l’obtention et la mise à jour des tokens JWT, indispensable pour l’authentification sécurisée des utilisateurs.
J’utilise le modèle User natif de Django pour gérer les comptes, puis je crée deux modèles principaux :
Voici le schéma UML de mon application, représentant les relations entre les différents modèles.
Chaque produit est rattaché à un utilisateur via une clé étrangère, et peut être stocké dans plusieurs entrepôts grâce à une relation many-to-many.
Cela permet :
J’utilise des vues basées sur ViewSets pour centraliser les opérations CRUD.
À chaque appel, je vérifie si l’utilisateur est authentifié via son token JWT grâce à la permission IsAuthenticated.
J’utilise :
Pour destroy, il suffit de supprimer l’objet, mais pour create et update, je passe par les serializers pour effectuer des validations métier précises.
Un serializer sert à valider et transformer les données entre Python et JSON.
Dans mon ProductSerializer :
En cas de problème, je renvoie une ValidationError explicite en JSON.
Lors de la création (create) et de la mise à jour (update) d’un produit ou entrepôt, j’utilise un bloc @transaction.atomic. Cela garantit que toutes les modifications sont :
Django est en autocommit par défaut. Ici, j’ai eu besoin de transactions explicites car je dois gérer la quantité actuelle et la capacité restante dans plusieurs entrepôts :
Par exemple, si je mets à jour une quantité à 1000 alors qu’elle était à 100, je ne veux pas l’additionner, mais bien la remplacer.
À chaque appel API, je vérifie si un produit est en stock bas (inférieur au seuil défini).
Si c’est le cas, l’attribut low_stock devient True, ce qui est ensuite transmis au front pour afficher une alerte visuelle.
Je répète une logique similaire pour les entrepôts : validation, transaction, mise à jour.
J’intègre plusieurs mesures de sécurité dans mon settings.py :
Pour créer une application réactive et moderne, j’ai utilisé Vue.js, un framework JavaScript progressif.
Il est idéal pour :
C’est un excellent compromis entre productivité et performance, parfait pour une SPA.
Voici les outils que j’ai utilisés pour renforcer Vue :
J’ai créé un composable useAuth() qui :
Je centralise tous les appels API dans api.js :
Export de fonctions (login, createUser, getProducts, etc.) pour simplifier leur utilisation dans les composants Vue.
Ce projet m’a permis de :
J’ai particulièrement appris à faire le lien entre interface utilisateur, logique métier, et cohérence base de données, tout en sécurisant l’authentification avec JWT et en optimisant la fluidité des échanges front/back.
Site web : stock.orabis.fr
Compte invité + mot de passe : invite1
Github Backend : github.com/Orabis/E6-BStockSeeker
Github Front : github.com/Orabis/E6-FStockSeeker
Page d'enregistrements des entrepots
Page d'accueil du site une fois connecté
Page d'enregistrements des produits
Routes de mes apis avec swagger
Fonctionnement d'un REST API
Fonctionnement de l'asynchrone en JS