Système de gestion de boutique de jeux vidéo basé sur Java Web

Présentation du projet

Ce projet est une application web complète pour la gestion d'une boutique de jeux vidéo. L'architecture est divisée en une partie front-end pour les clients et un tableau de bord d'administration. Deux profils d'utilisateurs sont gérés : un administrateur avec un accès complet à la gestion des produits, des commandes et des clients, et un utilisateur standard pouvant parcourir le catalogue, gérer son panier et passer des commandes.

Environnement technique

  • Langage et framework serveur : Java avec des Servlets et JSP.
  • Base de données : MySQL 5.7 ou supérieur.
  • Serveur d'application : Apache Tomcat 8 ou supérieur.
  • Bibliothèques front-end : Bootstrap pour la mise en page réactive, jQuery et JavaScript natif pour l'interactivité.
  • Environnement de développement : IDE comme IntelliJ IDEA, Eclipse ou MyEclipse. Un JDK 8 ou plus est requis.

Fonctionnalités principales

Côté Administration : Authentification sécurisée, tableau de bord avec des listes paginées pour gérer les utilisateurs, les jeux (CRUD), les catégories et le suivi des commandes avec filtrage par statut.

Côté Client : Parcours du catalogue par catégorie, moteur de recherche, système de panier d'achat, processus de commande et historique des commandes personnel.

Mise en route

Pour déployer l'application :

  1. Créez une base de données dans MySQL et importez le schéma fourni.
  2. Importez le projet dans votre IDE. Configurez le fichier de source de données (DBUtil.java) avec vos paramètres de connexion MySQL.
  3. Déployez l'archive WAR sur votre serveur Tomcat. L'URL d'accès est généralemant http://localhost:8080/chemin_appli.

Identifiants de test :

  • Client : user / 123456
  • Administrateur : admin / admin

Extraits de code illustratifs

Voici des exemples refactorisés montrant l'implémentation de certaines fonctionnalités.

Gestion de l'inscription utilisateur

@WebServlet(name = "AccountRegistration", urlPatterns = "/signup")
public class AccountRegistrationServlet extends HttpServlet {
    private AccountManager accountMgr = new AccountManager();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User newUser = new User();
        try {
            BeanUtils.populate(newUser, req.getParameterMap());
        } catch (Exception e) {
            throw new ServletException("Erreur de mapping des paramètres", e);
        }

        if (accountMgr.createAccount(newUser)) {
            req.setAttribute("notification", "Inscription réussie. Veuillez vous connecter.");
            req.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(req, resp);
        } else {
            req.setAttribute("error", "Ce nom d'utilisateur ou email existe déjà.");
            req.getRequestDispatcher("/WEB-INF/views/register.jsp").forward(req, resp);
        }
    }
}

Liste paginée des clients pour l'administrateur

@WebServlet("/admin/customers")
public class AdminCustomerListServlet extends HttpServlet {
    private AccountManager accountMgr = new AccountManager();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int requestedPage = parsePageNumber(req.getParameter("p"));
        PaginatedResult<User> userPage = accountMgr.fetchUsers(requestedPage);

        handlePageBoundary(userPage, requestedPage);

        req.setAttribute("paginationData", userPage);
        req.getRequestDispatcher("/WEB-INF/admin/customer_list.jsp").forward(req, resp);
    }

    private int parsePageNumber(String param) {
        try {
            return Math.max(1, Integer.parseInt(param));
        } catch (NumberFormatException | NullPointerException e) {
            return 1;
        }
    }

    private void handlePageBoundary(PaginatedResult<?> page, int current) {
        if (page.totalPages == 0) {
            page.totalPages = 1;
        } else if (current > page.totalPages) {
            page.currentPage = page.totalPages; // Corrige la page demandée
        }
    }
}

Ajout d'un produit avec gestion d'image

@WebServlet("/admin/product/save")
public class AdminProductSaveServlet extends HttpServlet {
    private ProductService productSvc = new ProductService();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        DiskFileItemFactory diskFactory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(diskFactory);

        try {
            List<FileItem> formItems = fileUpload.parseRequest(req);
            Product product = buildProductFromForm(formItems);
            processProductImages(formItems, product);
            productSvc.addProduct(product);
            resp.sendRedirect(req.getContextPath() + "/admin/products");
        } catch (Exception e) {
            throw new ServletException("Échec de la sauvegarde du produit", e);
        }
    }

    private Product buildProductFromForm(List<FileItem> items) throws UnsupportedEncodingException {
        Product product = new Product();
        for (FileItem item : items) {
            if (item.isFormField()) {
                populateField(product, item.getFieldName(), item.getString("UTF-8"));
            }
        }
        return product;
    }

    private void processProductImages(List<FileItem> items, Product product) throws Exception {
        // Logique simplifiée pour traiter les fichiers uploadés et les associer au produit
        // ...
    }
}

Écouteur d'application pour précharger les catégories

@WebListener
public class CatalogueLoader implements ServletContextListener {
    private CategoryService categoryService = new CategoryService();

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        List<Category> allCategories = categoryService.getAllCategories();
        sce.getServletContext().setAttribute("globalCategories", allCategories);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // Ressources à libérer si nécessaire
    }
}

Étiquettes: Java Servlet JSP MySQL Bootstrap

Publié le 25 juin à 23h35