Plateforme de Gestion des Ressources Pédagogiques Numériques pour les Écoles Primaires et Secondaires avec Spring Boot

Cette application vise à établir une plateforme centralisée pour la gestion des ressources pédagogiques numériques. Elle est conçue pour offrir un accès simplifié aux matériels d'apprentissage, faciliter la communication et suivre les progrès des élèves, tout en optimisant la gestion des ressources éducatives pour les établissements scolaires.

Contexte et Objectifs

Dans le paysage éducatif actuel, la digitalisation des resssources pédagogiques est devenue primordiale. Ce projet propose une solution complète pour la gestion de ces ressources, incluant des modules pour le suivi des apprenants, le partage de supports par les enseignants, la gestion des classes et un répertoire de ressources variées (vidéos, documents, exercices) organisé par discipline et niveau. La plateforme intègre également des versions électroniques de manuels et un forum de discussion pour encourager l'interaction entre enseignants, élèves et parents.

L'objectif est de simplifier la gestion des ressources éducatives, d'améliorer les processus d'enseignement et d'élever la qualité de l'éduaction. L'analyse portera sur les besoins spécifiques des écoles primaires et secondaires, en détaillant les fonctionnalités à implémenter. Le développement s'appuiera sur Java, le framework Spring Boot et une base de données MySQL, en considérant les rôles d'administrateur, d'enseignant et d'élève. Des tests système seront effectués pour valider et optimiser les fonctionnalités.

Technologies Utilisées

  • Langage de programmation : Java
  • Framework : Spring Boot
  • Version JDK : 1.8
  • Serveur d'application : Tomcat 7
  • Base de données : MySQL
  • Outil de gestion de base de données : Navicat 11
  • IDE : Eclipse / MyEclipse / IntelliJ IDEA
  • Gestion des dépendances : Maven

Architecture et Fonctionnalités

Le système est structuré autour de trois rôles principaux : administrateur, enseignant et élève. Les fonctionnalités globales sont représentées dans le schéma suivant :

Extrait de Code Source (Contrôleur d'Exemple)


package com.example.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.example.common.Result;
import com.example.common.ResultCode;
import com.example.entity.EducResource;
import com.example.exception.CustomException;
import com.example.service.EducResourceService;
import com.example.utils.MapWrapperUtils;
import com.example.utils.jwt.JwtUtil;
import com.example.vo.EducResourceVo;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping(value = "/resource")
public class EducResourceController {

   @Resource
   private EducResourceService educResourceService;

   @PostMapping
   public Result<educresource> create(@RequestBody EducResourceVo resourceVo) {
       educResourceService.addResource(resourceVo);
       return Result.success(resourceVo);
   }

   @PostMapping("/deleteBatch")
   public Result<educresource> deleteBatch(@RequestBody EducResourceVo resourceVo) {
       educResourceService.deleteMultiple(resourceVo.getResourceList());
       return Result.success();
   }

   @DeleteMapping("/{id}")
   public Result remove(@PathVariable Long id) {
       educResourceService.removeById(id);
       return Result.success();
   }

   @PutMapping
   public Result modify(@RequestBody EducResourceVo resourceVo) {
       educResourceService.updateResource(resourceVo);
       return Result.success();
   }

   @GetMapping("/{id}")
   public Result<educresource> findDetails(@PathVariable Integer id) {
       EducResource resource = educResourceService.getById(id);
       return Result.success(resource);
   }

   @GetMapping
   public Result<list>> fetchAll() {
       return Result.success(educResourceService.list());
   }

   @PostMapping("/paginated")
   public Result<educresourcevo> paginate(@RequestBody EducResourceVo resourceVo) {
       return Result.success(educResourceService.findPage(resourceVo));
   }

   @PostMapping("/authenticate")
   public Result authenticate(@RequestBody EducResource resource, HttpServletRequest request) {
       if (StrUtil.isBlank(resource.getUsername()) || StrUtil.isBlank(resource.getPassword())) {
           throw new CustomException(ResultCode.PARAM_MISSING_ERROR);
       }
       EducResource authenticatedUser = educResourceService.authenticate(resource);
       if(authenticatedUser != null) {
           HashMap<string object=""> userData = new HashMap<>();
           userData.put("user", authenticatedUser);
           // Assuming MapWrapperUtils and JwtUtil are correctly implemented
           Map<string object=""> tokenClaims = MapWrapperUtils.builder(MapWrapperUtils.KEY_USER_ID, resource.getId());
           String token = JwtUtil.createToken(tokenClaims);
           userData.put("token", token);
           return Result.success(userData);
       } else {
           return Result.error(); // Consider returning a specific error message
       }
   }

   @PutMapping("/updatePassword")
   public Result updatePassword(@RequestBody EducResource info, HttpServletRequest request) {
       EducResource currentUser = educResourceService.getById(info.getId());
       String currentPasswordEncrypted = SecureUtil.md5(info.getPassword());
       if (!currentPasswordEncrypted.equals(currentUser.getPassword())) {
           return Result.error(ResultCode.PASSWORD_INCORRECT.code, ResultCode.PASSWORD_INCORRECT.message);
       }
       info.setPassword(SecureUtil.md5(info.getNewPassword()));
       EducResource updatedUser = new EducResource();
       BeanUtils.copyProperties(info, updatedUser);
       educResourceService.updateResource(updatedUser);
       return Result.success();
   }
}
   </string></string></educresourcevo></list></educresource></educresource></educresource>

Structure de la Base de Données (Extrait)

Le schéma de base de données inclut des tables pour la configuration, les forums de discussion, les classifications de manuels, les informations sur les manuels, etc. Voici un extrait typique :


-- MySQL dump 10.13  Distrib 5.7.31, for Linux (x86_64)
--
-- Host: localhost    Database: school_edu_db
-- ------------------------------------------------------
-- Server version	5.7.31

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `school_edu_db`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `school_edu_db` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;

USE `school_edu_db`;

--
-- Table structure for table `app_configuration`
--

DROP TABLE IF EXISTS `app_configuration`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `app_configuration` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
 `setting_name` varchar(100) NOT NULL COMMENT 'Configuration Name',
 `setting_value` varchar(100) DEFAULT NULL COMMENT 'Configuration Value',
 `resource_url` varchar(500) DEFAULT NULL COMMENT 'URL',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='Application Settings';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `app_configuration`
--

LOCK TABLES `app_configuration` WRITE;
/*!40000 ALTER TABLE `app_configuration` DISABLE KEYS */;
INSERT INTO `app_configuration` VALUES (1,'banner_image_1','upload/banner_image_1.jpg',NULL),(2,'banner_image_2','upload/banner_image_2.jpg',NULL),(3,'banner_image_3','upload/banner_image_3.jpg',NULL);
/*!40000 ALTER TABLE `app_configuration` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `discussion_forum`
--

DROP TABLE IF EXISTS `discussion_forum`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `discussion_forum` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
 `creation_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Timestamp',
 `post_title` varchar(200) DEFAULT NULL COMMENT 'Post Title',
 `post_content` longtext NOT NULL COMMENT 'Post Content',
 `parent_id` bigint(20) DEFAULT NULL COMMENT 'Parent ID',
 `user_id` bigint(20) NOT NULL COMMENT 'User ID',
 `user_name` varchar(200) DEFAULT NULL COMMENT 'Username',
 `avatar_url` longtext COMMENT 'Avatar URL',
 `status` varchar(200) DEFAULT NULL COMMENT 'Status',
 `is_pinned` int(11) DEFAULT '0' COMMENT 'Is Pinned',
 `pin_timestamp` datetime DEFAULT NULL COMMENT 'Pin Timestamp',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=129 DEFAULT CHARSET=utf8 COMMENT='Discussion Forum';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `discussion_forum`
--

LOCK TABLES `discussion_forum` WRITE;
/*!40000 ALTER TABLE `discussion_forum` DISABLE KEYS */;
INSERT INTO `discussion_forum` VALUES (121,'2024-05-31 06:13:34','Sample Post Title 1','Sample Post Content 1',0,1,'User1','upload/forum_avatar1.jpg,upload/forum_avatar2.jpg,upload/forum_avatar3.jpg','Open',0,'2024-05-31 14:13:34'),(122,'2024-05-31 06:13:34','Sample Post Title 2','Sample Post Content 2',0,2,'User2','upload/forum_avatar2.jpg,upload/forum_avatar3.jpg,upload/forum_avatar4.jpg','Open',0,'2024-05-31 14:13:34'),(123,'2024-05-31 06:13:34','Sample Post Title 3','Sample Post Content 3',0,3,'User3','upload/forum_avatar3.jpg,upload/forum_avatar4.jpg,upload/forum_avatar5.jpg','Open',0,'2024-05-31 14:13:34'),(124,'2024-05-31 06:13:34','Sample Post Title 4','Sample Post Content 4',0,4,'User4','upload/forum_avatar4.jpg,upload/forum_avatar5.jpg,upload/forum_avatar6.jpg','Open',0,'2024-05-31 14:13:34'),(125,'2024-05-31 06:13:34','Sample Post Title 5','Sample Post Content 5',0,5,'User5','upload/forum_avatar5.jpg,upload/forum_avatar6.jpg,upload/forum_avatar7.jpg','Open',0,'2024-05-31 14:13:34'),(126,'2024-05-31 06:13:34','Sample Post Title 6','Sample Post Content 6',0,6,'User6','upload/forum_avatar6.jpg,upload/forum_avatar7.jpg,upload/forum_avatar8.jpg','Open',0,'2024-05-31 14:13:34'),(127,'2024-05-31 06:13:34','Sample Post Title 7','Sample Post Content 7',0,7,'User7','upload/forum_avatar7.jpg,upload/forum_avatar8.jpg,upload/forum_avatar9.jpg','Open',0,'2024-05-31 14:13:34'),(128,'2024-05-31 06:13:34','Sample Post Title 8','Sample Post Content 8',0,8,'User8','upload/forum_avatar8.jpg,upload/forum_avatar9.jpg,upload/forum_avatar10.jpg','Open',0,'2024-05-31 14:13:34');
/*!40000 ALTER TABLE `discussion_forum` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `textbook_category`
--

DROP TABLE IF EXISTS `textbook_category`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `textbook_category` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
 `creation_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Timestamp',
 `category_name` varchar(200) DEFAULT NULL COMMENT 'Category Name',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=79 DEFAULT CHARSET=utf8 COMMENT='Textbook Category';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `textbook_category`
--

LOCK TABLES `textbook_category` WRITE;
/*!40000 ALTER TABLE `textbook_category` DISABLE KEYS */;
INSERT INTO `textbook_category` VALUES (71,'2024-05-31 06:13:34','Category 1'),(72,'2024-05-31 06:13:34','Category 2'),(73,'2024-05-31 06:13:34','Category 3'),(74,'2024-05-31 06:13:34','Category 4'),(75,'2024-05-31 06:13:34','Category 5'),(76,'2024-05-31 06:13:34','Category 6'),(77,'2024-05-31 06:13:34','Category 7'),(78,'2024-05-31 06:13:34','Category 8');
/*!40000 ALTER TABLE `textbook_category` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `textbook_info`
--

DROP TABLE IF EXISTS `textbook_info`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `textbook_info` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
 `creation_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Timestamp',
 `textbook_title` varchar(200) DEFAULT NULL COMMENT 'Textbook Title',
 `textbook_category_name` varchar(200) DEFAULT NULL COMMENT 'Textbook Category',
 `textbook_image_url` longtext COMMENT 'Textbook Image',
 `publication_date` date DEFAULT NULL COMMENT 'Publication Date',
 `textbook_file_path` longtext COMMENT 'Textbook File',
 `textbook_details` longtext COMMENT 'Textbook Details',
 `teacher_employee_id` varchar(200) DEFAULT NULL COMMENT 'Teacher Employee ID',
 `teacher_name` varchar(200) DEFAULT NULL COMMENT 'Teacher Name',
 `last_access_ts` datetime DEFAULT NULL COMMENT 'Last Access Timestamp',
 `access_count` int(11) DEFAULT '0' COMMENT 'Access Count',
 `bookmark_count` int(11) DEFAULT '0' COMMENT 'Bookmark Count',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8 COMMENT='Textbook Information';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `textbook_info`
--

LOCK TABLES `textbook_info` WRITE;
/*!40000 ALTER TABLE `textbook_info` DISABLE KEYS */;
INSERT INTO `textbook_info` VALUES (81,'2024-05-31 06:13:34','Textbook Title 1','Category 1','upload/textbook_image1.jpg,upload/textbook_image2.jpg,upload/textbook_image3.jpg','2024-05-31','','Details for Textbook 1','TEACHER001','Teacher A','2024-05-31 14:13:34',1,1),(82,'2024-05-31 06:13:34','Textbook Title 2','Category 2','upload/textbook_image2.jpg,upload/textbook_image3.jpg,upload/textbook_image4.jpg','2024-05-31','','Details for Textbook 2','TEACHER002','Teacher B','2024-05-31 14:13:34',2,2),(83,'2024-05-31 06:13:34','Textbook Title 3','Category 3','upload/textbook_image3.jpg,upload/textbook_image4.jpg,upload/textbook_image5.jpg','2024-05-31','','Details for Textbook 3','TEACHER003','Teacher C','2024-05-31 14:13:34',3,3),(84,'2024-05-31 06:13:34','Textbook Title 4','Category 4','upload/textbook_image4.jpg,upload/textbook_image5.jpg,upload/textbook_image6.jpg','2024-05-31','','Details for Textbook 4','TEACHER004','Teacher D','2024-05-31 14:13:34',4,4),(85,'2024-05-31 06:13:34','Textbook Title 5','Category 5','upload/textbook_image5.jpg,upload/textbook_image6.jpg,upload/textbook_image7.jpg','2024-05-31','','Details for Textbook 5','TEACHER005','Teacher E','2024-05-31 14:13:34',5,5),(86,'2024-05-31 06:13:34','Textbook Title 6','Category 6','upload/textbook_image6.jpg,upload/textbook_image7.jpg,upload/textbook_image8.jpg','2024-05-31','','Details for Textbook 6','TEACHER006','Teacher F','2024-05-31 14:13:34',6,6),(87,'2024-05-31 06:13:34','Textbook Title 7','Category 7','upload/textbook_image7.jpg,upload/textbook_image8.jpg,upload/textbook_image9.jpg','2024-05-31','','Details for Textbook 7','TEACHER007','Teacher G','2024-05-31 14:13:34',7,7),(88,'2024-05-31 06:13:34','Textbook Title 8','Category 8','upload/textbook_image8.jpg,upload/textbook_image9.jpg,upload/textbook_image10.jpg','2024-05-31','','Details for Textbook 8','TEACHER008','Teacher H','2024-05-31 14:46:50',9,8);
/*!40000 ALTER TABLE `textbook_info` ENABLE KEYS */;
UNLOCK TABLES;

   
   
   <h2>Plan de l'Article</h2>
   <ul>
       <li>Chapitre 1 : Introduction (Contexte, Importance, État de l'art, Structure de l'article)</li>
       <li>Chapitre 2 : Technologies et Environnement Système (Java, MyEclipse, MySQL, Spring Boot, Vue.js, Architecture B/S)</li>
       <li>Chapitre 3 : Analyse des Besoins Système (Analyse globale, Fonctionnelle, Faisabilité technique/économique/opérationnelle, Analyse des flux)</li>
       <li>Chapitre 4 : Conception Système (Conception des modules fonctionnels, Conception de la base de données : ER, Logique)</li>
       <li>Chapitre 5 : Implémentation des Fonctionnalités (Partie frontale : Page d'accueil, Centre personnel ; Partie back-end : Administrateur, Enseignant)</li>
       <li>Chapitre 6 : Tests Système (Signification des tests, Méthodes de test)</li>
       <li>Conclusion</li>
       <li>Références</li>
       <li>Remerciements</li>
   </ul>

Étiquettes: Spring Boot Java MySQL Gestion de ressources éducatives Système de gestion d'apprentissage

Publié le 8 juin à 09h24