Sistema de Gestão de Notas Universitárias com Spring Boot e Vue.js

Este projeto implementa um sistema completo para gerenciamento de notas acadêmicas, desenvolvido com tecnologias modernas da stack Java e JavaScript. A arquitetura separa claramente o backend (API RESTful) do frontend (interface do usuário), proporcionando manutenibilidade e escalabilidade.

Visão Geral Funcional

O sistema atende três perfis de usuários com permissões diferenciadas:

  • Estudantes: Consultam suas próprias notas e histórico acadêmico.
  • Professores: Realizam o lançamento, alteração e justificativa de notas para as disciplinas lecionadas.
  • Administradores: Gerenciam todos os dados do sistema, incluindo cadastros de usuários, disciplinas e turmas. Possuem acesso a relatórios estatísticos e ferramentas de exportação de dados (PDF, Excel).

Stack Tecnológica

Backend (API)

O core da aplicação é construído com Spring Boot, que fornece uma configuração simplificada e servidor de aplicação embutido. A camada de persistência utiliza MyBatis-Plus como ORM, reduzindo a necessidade de código boilerplate para operações CRUD e facilitando a integração com o banco de dados relacional MySQL. A segurança e autenticação são gerenciadas via tokens (JWT).

Frontend (Interface)

A interface web é uma aplicação de página única (SPA) desenvolvida com Vue.js 2. O gerenciamento de estado é feito com Vuex e o roteamento com Vue Router. Componentes reutilizáveis e a reatividade do framework proporcionam uma experiência de usuário fluida.

Testes e Validação

A abordagem de testes focou em testes caixa-preta para validar os requisitos funcionais a partir da perspectiva do usuário. Foram elaborados casos de teste para os módulos críticos.

Cenário: Autenticação de Usuário

Dado de Entrada Resultado Esperado
Credenciais válidas (usuário e senha) Login bem-sucedido, redirecionamento para o painel principal
Senha incorreta Mensagem de erro: "Credenciais inválidas"
Campo de usuário em branco Mensagem de validação: "O campo usuário é obrigatório"
Perfil de estudante tentando acessar painel de professor Acesso negado ou redirecionamento para área correta

Cenário: Gestão de Notas (Professor)

Ação Comportamento Esperado
Registrar nota para um aluno em uma disciplina Nota salva com sucesso, listagem atualizada imediatamente
Tentar registrar uma nota fora da escala (ex: > 10) Validação impedindo o salvamento
Editar uma nota já registrada Alteração aplicada, histórico de modificações atualizado

Exemplo de Código (Backend - Autenticação)

Abaixo, um trecho simplificado do controlador de login e do serviço de geração de tokens no backend Spring Boot.

// Controlador de Autenticação
@RestController
@RequestMapping("/api/auth")
public class AuthController {

    @Autowired
    private AuthService authService;

    @PostMapping("/signin")
    public ResponseEntity<?> autenticarUsuario(@RequestBody LoginRequest loginRequest) {
        String jwtToken = authService.autenticarECriarToken(
            loginRequest.getUsername(), 
            loginRequest.getPassword()
        );
        return ResponseEntity.ok(new JwtResponse(jwtToken));
    }
}
// Serviço de Autenticação
@Service
public class AuthService {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private JwtTokenProvider tokenProvider;

    public String autenticarECriarToken(String username, String password) {
        User usuario = userRepository.findByUsername(username)
            .orElseThrow(() -> new UsernameNotFoundException("Usuário não encontrado: " + username));

        if (!passwordEncoder.matches(password, usuario.getPassword())) {
            throw new BadCredentialsException("Senha inválida");
        }

        return tokenProvider.gerarToken(usuario.getId(), usuario.getUsername(), usuario.getRole());
    }
}

Modelagem de Dados (Exemplo)

A tabela de sessões de usuário (tokens) é esencial para o controle de autenticação via JWT.

CREATE TABLE `user_sessions` (
  `session_id` BIGINT AUTO_INCREMENT PRIMARY KEY,
  `user_id` BIGINT NOT NULL,
  `token_hash` VARCHAR(255) NOT NULL,
  `issued_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `expires_at` TIMESTAMP NOT NULL,
  FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
) ENGINE=InnoDB;

Tags: Spring Boot Vue.js MyBatis-Plus MySQL jwt

Publicado em 6-25 23:52