Sistema de Gestão de Emprego para Graduados usando Spring Boot e Vue

Introdução do Projeto

Este sistema é uma aplicação web desenvolvida para gerenciar informações de emprego de graduados universitários. Arquitetado com uma abordagem de separação entre front-end e back-end, o projeto oferece uma estrutura modular e bem documentada, facilitando a compreensão e manutenção. Ele inclui funcionalidades abrangentes para diferentes perfis de usuários, atendendo às necessidades típicas de um sistema de gestão de emprego acadêmico.

O sistema divide-se em quatro papéis principais:

  • Estudante: Pode acessar palestras da sua faculdade, navegar por oportunidades de emprego, enviar currículos, registrar informações de emprego, pós-graduação, concursos públicos ou empreendedorismo, visualizar anúncios e atualizar seus dados pessoais.
  • Orientador: Tem permissão para visualizar estatísticas, gerenciar informações de estudantes e palestras da sua faculdade, supervisionar dados de emprego, pós-graduação, concursos e empreendedorismos, além de acessar anúncios e modificar seu perfil.
  • Administrador: Pode administrar todos os aspectos do sistema, incluindo usuários (estudantes, orientadores, administradores e empresas), organizações acadêmicas, palestras, oportunidades de emprego e registros de diferentes caminhos de carreira.
  • Usuário Empresarial: Pode publicar vagas de emprego, revisar currículos recebidos, gerenciar aplicações e atualizar informações da empresa.

Tecnologias Utilizadas

O desenvolvimento baseia-se nas seguintes tecnologias:

  • Back-end: Spring Boot com MySQL para banco de dados, MyBatis para mapeamento objeto-relacional e Redis para caching de sessões.
  • Front-end: Vue.js 3.0 com Element UI Plus para componentes de interface e Vite como ferramenta de build.

Ambiente de desenvolvimento recomendado inclui IntelliJ IDEA, JDK 1.8, Maven, Node.js e Visual Studio Code, com banco de dados MySQL 5.7 e Redis 5.0.5.

Exemplos de Código

Submissão de Currículo por Estudante


/**
 * Processa o envio de um currículo por um estudante.
 * @param applicationDTO Dados da aplicação do currículo.
 * @return Resposta indicando sucesso ou falha.
 */
@Override
public ResponseDTO<boolean> submitApplication(ApplicationDTO applicationDTO) {
    // Validação de campos obrigatórios
    if (StringUtils.isEmpty(applicationDTO.getStudentId())) {
        return ResponseDTO.errorByMsg(ErrorMessage.INVALID_DATA);
    }
    if (StringUtils.isEmpty(applicationDTO.getCompanyId())) {
        return ResponseDTO.errorByMsg(ErrorMessage.INVALID_DATA);
    }
    
    // Conversão e registro da aplicação
    Application application = ConversionUtil.convert(applicationDTO, Application.class);
    application.setApplicationId(IdGenerator.generateShortId());
    application.setTimestamp(new Date());
    application.setStatus(ApplicationStatus.PENDING);
    
    // Inserção no banco de dados
    if (applicationRepository.save(application) == null) {
        return ResponseDTO.errorByMsg(ErrorMessage.SAVE_FAILED);
    }
    return ResponseDTO.successWithMessage(true, "Aplicação enviada com sucesso!");
}
</boolean>

Consulta de Dados de Emprego com Paginação


/**
 * Recupera uma lista paginada de registros de emprego com filtros opcionais.
 * @param pageRequest Objeto de solicitação com parâmetros de paginação e filtros.
 * @return Uma página de dados de emprego formatados.
 */
@Override
public ResponseDTO<pagedto>> fetchEmploymentRecords(PageDTO<employmentrecorddto> pageRequest) {
    // Configuração padrão de paginação se não especificado
    int currentPage = pageRequest.getPageNumber() != null ? pageRequest.getPageNumber() : 1;
    int pageSize = pageRequest.getPageSize() != null ? pageRequest.getPageSize() : 10;
    
    // Construção de critérios de consulta baseados nos filtros
    EmploymentRecordExample example = new EmploymentRecordExample();
    EmploymentRecordExample.Criteria criteria = example.createCriteria();
    
    if (pageRequest.getFilter() != null) {
        EmploymentRecordDTO filter = pageRequest.getFilter();
        if (!StringUtils.isEmpty(filter.getStudentId())) {
            criteria.andStudentIdEqualTo(filter.getStudentId());
        }
        if (!StringUtils.isEmpty(filter.getCityName())) {
            criteria.andCityLike("%" + filter.getCityName() + "%");
        }
        // Adicionar lógica similar para outros campos de filtro, como jobTitle e companyName.
    }
    
    // Executar consulta com paginação
    PageHelper.startPage(currentPage, pageSize);
    List<employmentrecord> records = employmentRecordMapper.selectByExample(example);
    PageInfo<employmentrecord> pageInfo = new PageInfo<>(records);
    
    // Converter para DTOs e enriquecer com dados do estudante
    List<employmentrecorddto> dtoRecords = ConversionUtil.convertList(records, EmploymentRecordDTO.class);
    for (EmploymentRecordDTO dto : dtoRecords) {
        Student student = studentRepository.findById(dto.getStudentId());
        dto.setStudentInfo(ConversionUtil.convert(
                student != null ? student : new Student(), StudentInfoDTO.class));
    }
    
    // Montar resposta com metadados de paginação
    pageRequest.setTotalElements(pageInfo.getTotal());
    pageRequest.setContent(dtoRecords);
    return ResponseDTO.success(pageRequest);
}
</employmentrecorddto></employmentrecord></employmentrecord></employmentrecorddto></pagedto>

Autenticação de Usuário


/**
 * Realiza a autenticação do usuário e gera um token de sessão.
 * @param loginRequest Dados de login incluindo identificador e senha.
 * @return Dados do usuário autenticado com token.
 */
@Override
public ResponseDTO<userinfodto> authenticateUser(LoginRequestDTO loginRequest) {
    // Verificação de campos obrigatórios
    if (StringUtils.isEmpty(loginRequest.getUserIdentifier())) {
        return ResponseDTO.errorByMsg(ErrorMessage.IDENTIFIER_REQUIRED);
    }
    if (StringUtils.isEmpty(loginRequest.getPassword())) {
        return ResponseDTO.errorByMsg(ErrorMessage.PASSWORD_REQUIRED);
    }
    
    // Consulta ao banco de dados para validação
    UserExample userExample = new UserExample();
    userExample.createCriteria()
            .andIdentifierEqualTo(loginRequest.getUserIdentifier())
            .andPasswordEqualTo(loginRequest.getPassword())
            .andUserRoleEqualTo(loginRequest.getUserRole());
    
    List<user> users = userMapper.selectByExample(userExample);
    if (users == null || users.size() != 1) {
        return ResponseDTO.errorByMsg(ErrorMessage.INVALID_CREDENTIALS);
    }
    
    // Geração de token e armazenamento em cache
    UserInfoDTO userInfo = ConversionUtil.convert(users.get(0), UserInfoDTO.class);
    String sessionToken = IdGenerator.generateShortId();
    userInfo.setSessionToken(sessionToken);
    
    // Armazenar token no Redis com tempo de expiração
    stringRedisTemplate.opsForValue().set(
            "SESSION_" + sessionToken,
            JsonUtil.toJson(userInfo),
            2, TimeUnit.HOURS
    );
    
    return ResponseDTO.successWithMessage(userInfo, "Autenticação bem-sucedida!");
}
</user></userinfodto>

Tags: Spring Boot Vue.js MySQL MyBatis Redis

Publicado em 7-20 21:12