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;