Backend da plataforma PlusEduc, um sistema de gestão educacional inclusiva com foco em acompanhamento pedagógico, desempenho escolar e geração de atividades adaptadas com IA.
A aplicação foi construída com Spring Boot 3.4.1, Java 21, MongoDB, JWT Authentication, Swagger/OpenAPI e exportação de atividades em PDF.
Repositório de demonstração / portfólio. Credenciais e deploy real ficam fora do Git (
.env, painel do provedor). Vejadocs/desenvolvimento.mdpara rodar localmente.
O PlusEduc API oferece recursos para:
- autenticação de usuários com JWT
- cadastro e gestão de alunos
- gestão de professores
- gestão de turmas
- lançamento e consulta de notas
- cálculo de desempenho e frequência
- geração de atividades com IA
- exportação de atividades em PDF
- documentação interativa via Swagger
O projeto foi pensado para uso acadêmico e demonstração de um fluxo completo de backend para uma plataforma educacional.
- Java 21
- Spring Boot 3.4.1
- Spring Web
- Spring Security
- Spring Data MongoDB
- Spring Validation
- Spring Actuator
- JWT (jjwt)
- Springdoc OpenAPI / Swagger UI
- OpenPDF
- Lombok
- Maven
A estrutura principal do projeto segue o padrão:
src/main/java/PE/PlusEduc/
├── config/ # Segurança, Swagger, Mongo, CORS
├── controller/ # Endpoints REST
├── dto/ # Requests e Responses
├── exception/ # Exceções customizadas
├── handler/ # Tratamento global de erros
├── mapper/ # Conversão Entity ↔ DTO
├── model/ # Documentos MongoDB
├── repository/ # Repositórios Mongo
├── security/ # JWT e autenticação
├── service/ # Regras de negócio
│ └── ai/ # Geração de atividades com IA/mock
└── Application.java
Fluxo principal:
Controller -> Service -> Repository -> MongoDB
Responsável por login e cadastro de professores.
- login com email e senha
- geração de access token e refresh token
- proteção de endpoints com JWT
Gerencia alunos, lacunas de aprendizagem e vínculo com turma.
- CRUD de alunos
- consulta por turma
- consulta por learning gap
- média do aluno
- frequência do aluno
Gerencia professores e especialidades.
- CRUD de professores
- busca por email
- filtro por disciplina
Gerencia turmas e matrícula de alunos.
- CRUD de turmas
- associação com professor
- matrícula e remoção de aluno
- média da turma
- frequência média da turma
Registra e consulta notas.
- CRUD de notas
- média por aluno
- média por disciplina
- taxa de presença
- faltas
- consultas por período
Gerencia atividades pedagógicas.
- CRUD de atividades
- atividades por turma
- atividades por aluno
- filtros por matéria e dificuldade
- contagem por turma/criador
Gera atividades adaptadas com base em matéria, tópico, dificuldade e lacunas do aluno.
Observação:
- quando a API do Gemini não está disponível, o backend entra em modo demo e gera questões mockadas automaticamente
Permite exportar atividades em PDF com layout educacional.
- cabeçalho do PlusEduc
- contexto pedagógico do aluno
- questões formatadas
- gabarito opcional
- suporte a exportação com ou sem respostas
A aplicação usa JWT Bearer Token.
POST /api/auth/loginPOST /api/auth/register/teacher- rotas do Swagger/OpenAPI
Todos os demais endpoints exigem:
Authorization: Bearer <token>A API possui documentação interativa com Springdoc.
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/api-docs
No Swagger:
- faça login pelo endpoint
/api/auth/login - copie o
accessToken - clique em Authorize
- informe o token no formato Bearer
Exemplo:
Bearer seu_token_aqui
Copie .env.example para .env e preencha com valores do seu ambiente local. O .env não é versionado.
cp .env.example .envUse placeholders no exemplo; gere um JWT_SECRET forte antes de qualquer deploy. GEMINI_API_KEY é opcional — sem ela, a API usa o modo demo de geração de questões.
A aplicação utiliza src/main/resources/application.properties (somente placeholders e variáveis de ambiente). Referência resumida: application-example.properties.
- Java 21
- Maven 3.9+
- MongoDB rodando localmente
git clone https://github.com/PedroBeltraoDev/PlusEduc-BE.git
cd PlusEduc-BECrie o .env ou configure as variáveis de ambiente necessárias.
./mvnw spring-boot:runmvnw.cmd spring-boot:runA aplicação subirá em:
http://localhost:8080
./mvnw testmvnw.cmd test./mvnw clean packagemvnw.cmd clean packageO projeto possui um docker-compose.yml básico para subir a API empacotada como imagem.
version: '3.8'
services:
pluseduc-api:
image: pluseduc-api:latest
ports:
- "8080:8080"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40sObservação:
- esse compose pressupõe que a imagem
pluseduc-api:latestjá exista
Representa o aluno.
Campos principais:
idnameemailbirthDateclassIdlearningGapsactivecreatedAtupdatedAt
Representa o professor.
Campos principais:
idnameemailsubjectsclassroomIdsactive
Representa a turma.
Campos principais:
idnameyeargradeLevelteacherIdstudentIdssubjectsactive
Representa nota/presença.
Campos principais:
idstudentIdclassroomIdsubjectgradeValueattendancedateactivityTypeobservations
Representa atividade pedagógica.
Campos principais:
idtitlesubjecttopicdifficultyLevelquestionsCountformatclassroomIdstudentIdcontentgeneratedByAiaiProvidercreatedBycreatedAt
Representa usuário autenticável.
Campos principais:
idemailpasswordroleactivecreatedAt
Um dos diferenciais do projeto é o uso de lacunas de aprendizagem (learningGaps).
Cada aluno pode ter dificuldades registradas por:
- matéria
- tópico
- nível de severidade
- descrição
- data de identificação
- status de melhoria Esses dados podem ser usados para:
- análise pedagógica
- filtros de alunos
- personalização de atividades
- reforço adaptado com IA
O módulo de IA gera questões a partir de:
- matéria
- tópico
- dificuldade
- formato
- instruções adicionais
- dificuldades do aluno
- se a API do Gemini estiver configurada, a geração usa o provedor
- se não estiver configurada, ou se houver falha, o sistema usa questões mockadas
- isso permite demonstrações sem custo de API
A exportação em PDF está disponível no módulo de atividades.
GET /api/activities/{id}/export-pdf?includeAnswers=false- retorna
application/pdf - força download com
Content-Disposition - pode incluir ou ocultar gabarito
- usa layout formatado para apresentação ao professor
A API possui tratamento global de exceções com respostas padronizadas.
{
"timestamp": "2026-03-31T12:06:53.5898956",
"status": 400,
"error": "Bad Request",
"message": "Professor autenticado não encontrado"
}404 Not Found409 Conflict400 Bad Request500 Internal Server Error
O projeto usa Spring Boot Actuator.
/actuator/health/actuator/info/actuator/metrics/actuator/prometheus
healtheinfopodem ser públicos- demais endpoints podem exigir perfil/permissão de administrador
POST /api/auth/loginPOST /api/auth/register/teacher
POST /api/studentsGET /api/studentsGET /api/students/paginatedGET /api/students/{id}GET /api/students/class/{classId}GET /api/students/learning-gap/{subject}PUT /api/students/{id}DELETE /api/students/{id}GET /api/students/{id}/performanceGET /api/students/{id}/attendance
POST /api/teachersGET /api/teachersGET /api/teachers/{id}GET /api/teachers/email/{email}PUT /api/teachers/{id}DELETE /api/teachers/{id}GET /api/teachers/subject/{subject}GET /api/teachers/count
POST /api/classroomsGET /api/classroomsGET /api/classrooms/paginatedGET /api/classrooms/{id}GET /api/classrooms/teacher/{teacherId}GET /api/classrooms/year/{year}PUT /api/classrooms/{id}DELETE /api/classrooms/{id}POST /api/classrooms/{id}/enroll/{studentId}DELETE /api/classrooms/{id}/unenroll/{studentId}GET /api/classrooms/{id}/performanceGET /api/classrooms/{id}/attendance
POST /api/gradesGET /api/gradesGET /api/grades/paginatedGET /api/grades/{id}GET /api/grades/student/{studentId}GET /api/grades/classroom/{classroomId}GET /api/grades/student/{studentId}/subject/{subject}GET /api/grades/student/{studentId}/date-rangePUT /api/grades/{id}DELETE /api/grades/{id}
POST /api/activitiesGET /api/activitiesGET /api/activities/paginatedGET /api/activities/{id}GET /api/activities/{id}/export-pdfGET /api/activities/classroom/{classroomId}GET /api/activities/student/{studentId}GET /api/activities/filterPOST /api/activities/generatePUT /api/activities/{id}DELETE /api/activities/{id}
POST /api/auth/loginAuthorization: Bearer <token>POST /api/activities/generateGET /api/activities/{id}/export-pdfO projeto já possui:
- autenticação JWT
- documentação Swagger
- CRUDs principais
- integração com MongoDB
- geração de atividades com fallback demo
- exportação em PDF
- tratamento global de erros
- testes básicos de inicialização e PDF
Pontos que ainda podem evoluir:
- testes mais completos de controller/service
- melhor separação entre
UsereTeacher - auditoria de criação por usuário autenticado
- integração com frontend
- deploy em ambiente cloud
Pedro Beltrão
Para integração com frontend, recomenda-se usar o Swagger como contrato principal da API:
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/api-docs
Isso facilita geração de cliente HTTP, testes e alinhamento entre backend e frontend.