Este sistema foi desenvolvido para gerenciar o controle acadêmico da Universidade Master Educacional, permitindo o cadastro e gerenciamento de cursos, disciplinas, professores, alunos, turmas, matrículas e avaliações.
O projeto está dividido em duas partes principais:
- Back-end: Desenvolvido com Java Spring Boot
- Front-end: Desenvolvido com React, TypeScript e Tailwind CSS
- Java 17
- Spring Boot 3.x
- Spring Data JPA
- H2 Database (banco de dados em memória)
- Maven
- React 18
- TypeScript
- Vite
- Tailwind CSS
- React Router
- com.university.academic: Pacote raiz da aplicação
- .config: Configurações da aplicação (CORS, carregamento de dados)
- .controller: Controladores REST para as APIs
- .dto: Objetos de transferência de dados
- .enums: Enumerações utilizadas no sistema
- .exception: Tratamento de exceções
- .model: Entidades JPA
- .repository: Interfaces de repositório para acesso aos dados
- .service: Serviços de negócio
- id: Identificador único
- code: Código do curso
- name: Nome do curso
- coordinator: Professor coordenador do curso
- disciplines: Lista de disciplinas do curso
- id: Identificador único
- code: Código da disciplina
- name: Nome da disciplina
- credits: Carga horária
- description: Ementa
- bibliography: Bibliografia
- course: Curso ao qual a disciplina pertence
- prerequisites: Lista de disciplinas pré-requisitos
- id: Identificador único
- name: Nome do professor
- email: Email do professor
- phone: Telefone do professor
- address: Endereço do professor
- qualification: Titulação (graduação, especialização, mestrado, doutorado)
- courses: Cursos aos quais o professor está vinculado
- id: Identificador único
- registrationNumber: Número de matrícula
- name: Nome do aluno
- email: Email do aluno
- phone: Telefone do aluno
- address: Endereço do aluno
- course: Curso ao qual o aluno está vinculado
- status: Status do aluno (matriculado, trancado, formado, evadido)
- id: Identificador único
- discipline: Disciplina da turma
- professor: Professor responsável
- year: Ano
- semester: Semestre
- schedule: Horários de realização
- enrollments: Lista de matrículas
- id: Identificador único
- student: Aluno
- classOffering: Turma
- firstPartialGrade: Nota da primeira avaliação parcial
- secondPartialGrade: Nota da segunda avaliação parcial
- finalExamGrade: Nota da prova final
- attendancePercentage: Percentual de frequência
- approved: Status de aprovação
GET /api/courses: Lista todos os cursosGET /api/courses/{id}: Obtém um curso pelo IDGET /api/courses/code/{code}: Obtém um curso pelo códigoPOST /api/courses: Cria um novo cursoPUT /api/courses/{id}: Atualiza um curso existenteDELETE /api/courses/{id}: Remove um cursoPUT /api/courses/{courseId}/coordinator/{professorId}: Atribui um coordenador ao curso
GET /api/disciplines: Lista todas as disciplinasGET /api/disciplines/{id}: Obtém uma disciplina pelo IDGET /api/disciplines/code/{code}: Obtém uma disciplina pelo códigoGET /api/disciplines/course/{courseId}: Lista disciplinas de um cursoPOST /api/disciplines/course/{courseId}: Cria uma nova disciplina em um cursoPUT /api/disciplines/{id}: Atualiza uma disciplina existenteDELETE /api/disciplines/{id}: Remove uma disciplinaPUT /api/disciplines/{disciplineId}/prerequisites/{prerequisiteId}: Adiciona um pré-requisitoDELETE /api/disciplines/{disciplineId}/prerequisites/{prerequisiteId}: Remove um pré-requisito
GET /api/professors: Lista todos os professoresGET /api/professors/{id}: Obtém um professor pelo IDGET /api/professors/course/{courseId}: Lista professores de um cursoPOST /api/professors: Cria um novo professorPUT /api/professors/{id}: Atualiza um professor existenteDELETE /api/professors/{id}: Remove um professorPUT /api/professors/{professorId}/courses/{courseId}: Atribui um professor a um cursoDELETE /api/professors/{professorId}/courses/{courseId}: Remove um professor de um curso
GET /api/students: Lista todos os alunosGET /api/students/{id}: Obtém um aluno pelo IDGET /api/students/registration/{registrationNumber}: Obtém um aluno pelo número de matrículaGET /api/students/course/{courseId}: Lista alunos de um cursoGET /api/students/status/{status}: Lista alunos por statusPOST /api/students/course/{courseId}: Cria um novo aluno em um cursoPUT /api/students/{id}: Atualiza um aluno existenteDELETE /api/students/{id}: Remove um alunoPUT /api/students/{id}/status/{status}: Atualiza o status de um alunoPUT /api/students/{studentId}/course/{courseId}: Transfere um aluno para outro curso
GET /api/class-offerings: Lista todas as turmasGET /api/class-offerings/{id}: Obtém uma turma pelo IDGET /api/class-offerings/discipline/{disciplineId}: Lista turmas de uma disciplinaGET /api/class-offerings/professor/{professorId}: Lista turmas de um professorGET /api/class-offerings/semester: Lista turmas por ano e semestrePOST /api/class-offerings/discipline/{disciplineId}: Cria uma nova turma para uma disciplinaPUT /api/class-offerings/{id}: Atualiza uma turma existenteDELETE /api/class-offerings/{id}: Remove uma turmaPUT /api/class-offerings/{classOfferingId}/professor/{professorId}: Atribui um professor a uma turmaDELETE /api/class-offerings/{classOfferingId}/professor: Remove um professor de uma turma
GET /api/enrollments: Lista todas as matrículasGET /api/enrollments/{id}: Obtém uma matrícula pelo IDGET /api/enrollments/student/{studentId}: Lista matrículas de um alunoGET /api/enrollments/class/{classOfferingId}: Lista matrículas de uma turmaPOST /api/enrollments/student/{studentId}/class/{classOfferingId}: Matricula um aluno em uma turmaDELETE /api/enrollments/{id}: Cancela a matrícula de um alunoPUT /api/enrollments/{id}/grades: Atualiza as notas de uma matrículaGET /api/enrollments/class/{classOfferingId}/diary: Obtém o diário de classe de uma turmaGET /api/enrollments/student/{studentId}/academic-record: Obtém o histórico acadêmico de um aluno
GET /api/evaluations: Lista todas as avaliaçõesGET /api/evaluations/student/{studentId}: Lista avaliações de um alunoPOST /api/evaluations: Cria uma nova avaliaçãoPUT /api/evaluations/{id}: Atualiza uma avaliação existente
GET /api/reports/attendance/{classOfferingId}: Relatório de frequência de uma turmaGET /api/reports/transcript/{studentId}: Histórico escolar de um aluno
O sistema utiliza o banco de dados H2 em memória para desenvolvimento e testes. A configuração está no arquivo application.properties:
# Configuração do Banco de Dados H2
spring.datasource.url=jdbc:h2:mem:academicdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# Habilitar Console H2
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
# Configuração JPA/Hibernate
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# Configuração do Servidor
server.port=8080
# Perfil Ativo
spring.profiles.active=dev- src: Código-fonte da aplicação
- components: Componentes React
- Common: Componentes comuns (Modal, Table, etc.)
- Courses: Componentes relacionados a cursos
- Dashboard: Componentes do painel principal
- Layout: Componentes de layout (Header, Sidebar)
- Students: Componentes relacionados a alunos
- services: Serviços para comunicação com a API
- types: Definições de tipos TypeScript
- App.tsx: Componente principal da aplicação
- main.tsx: Ponto de entrada da aplicação
- components: Componentes React
O serviço de API (api.ts) é responsável por fazer a comunicação com o back-end. Ele define métodos para cada operação disponível na API REST:
const API_BASE_URL = 'http://localhost:8080/api';
class ApiService {
private async request<T>(endpoint: string, options?: RequestInit): Promise<T> {
const response = await fetch(`${API_BASE_URL}${endpoint}`, {
headers: {
'Content-Type': 'application/json',
...options?.headers,
},
...options,
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
}
// Métodos para cursos
async getCourses() { ... }
async createCourse(course: any) { ... }
async updateCourse(id: number, course: any) { ... }
async deleteCourse(id: number) { ... }
// Métodos para disciplinas
async getDisciplines() { ... }
async createDiscipline(discipline: any) { ... }
async updateDiscipline(id: number, discipline: any) { ... }
async deleteDiscipline(id: number) { ... }
// Métodos para alunos
async getStudents() { ... }
async createStudent(student: any) { ... }
async updateStudent(id: number, student: any) { ... }
async deleteStudent(id: number) { ... }
// Métodos para professores
async getProfessors() { ... }
async createProfessor(professor: any) { ... }
async updateProfessor(id: number, professor: any) { ... }
async deleteProfessor(id: number) { ... }
// Métodos para turmas
async getClassOfferings() { ... }
async createClassOffering(classOffering: any) { ... }
async updateClassOffering(id: number, classOffering: any) { ... }
async deleteClassOffering(id: number) { ... }
// Métodos para matrículas
async getEnrollments() { ... }
async createEnrollment(enrollment: any) { ... }
async deleteEnrollment(id: number) { ... }
// Métodos para avaliações
async getEvaluations() { ... }
async createEvaluation(evaluation: any) { ... }
async updateEvaluation(id: number, evaluation: any) { ... }
async getStudentEvaluations(studentId: number) { ... }
// Métodos para relatórios
async getClassAttendanceReport(classId: number) { ... }
async getStudentTranscript(studentId: number) { ... }
}
export const apiService = new ApiService();Lista todos os cursos cadastrados, permitindo adicionar, editar e excluir cursos.
Formulário para adicionar ou editar um curso.
Lista todos os alunos cadastrados, permitindo adicionar, editar e excluir alunos.
Formulário para adicionar ou editar um aluno.
Painel principal que exibe informações resumidas sobre cursos, disciplinas, professores e alunos.
Cabeçalho da aplicação com o título e opções de navegação.
Barra lateral com links para as diferentes seções da aplicação.
- Java 17 ou superior
- Node.js 16 ou superior
- npm ou yarn
-
Clone o repositório:
git clone <url-do-repositorio> cd a3_modelagem -
Execute o back-end:
./mvnw spring-boot:runO servidor será iniciado na porta 8080.
-
Execute o front-end:
cd front-end npm install npm run devA aplicação será iniciada na porta 5173.
-
Acesse a aplicação: Abra o navegador e acesse
http://localhost:5173
- Para ser aprovado, o aluno deve ter frequência mínima de 75%.
- Além disso, para aprovação sem prova final, a média das notas parciais deve ser maior ou igual a 70.
- Para reprovação direta, esta média deve ser menor que 30.
- Médias entre 30 (inclusive) e 70 (exclusive) colocam o aluno em prova final.
- Se a média da prova final com a média anterior for menor que 50, o aluno está reprovado, caso contrário, aprovado.
- Um aluno só pode ser matriculado em uma disciplina se tiver sido aprovado em todos os pré-requisitos.
- Um aluno não pode ser matriculado em turmas com horários conflitantes.
- Um professor só pode ser alocado a turmas de disciplinas de cursos aos quais ele está vinculado.
- Um professor não pode ser alocado a turmas com horários conflitantes.
O diagrama de classes do sistema está disponível no arquivo class-diagram.puml na raiz do projeto. Ele representa a estrutura das entidades e seus relacionamentos conforme o estudo de caso.