Plataforma de apoio e desenvolvimento acadêmico para o curso de Bacharelado em Ciência da Computação.
O HubBCC é uma aplicação web que reúne, em um único ambiente, oportunidades acadêmicas, apoio entre alunos por meio de monitorias e tutorias e o acompanhamento de atividades e horas complementares.
- O problema e a proposta
- Tecnologias
- Requisitos da disciplina
- Como executar
- Contas de teste
- Arquitetura
- Estrutura de pastas
- Telas e rotas
- Casos de uso e funcionalidades
- Modelo de dados
- Backend mockado com JSON Server
- TanStack Query
- Formulários e validação
- Design e responsividade
- Controle de acesso
- Convenções de código
- Situação atual do projeto
- Documentação
- Equipe
Durante a graduação, os alunos têm acesso a diferentes oportunidades acadêmicas, como iniciação científica, projetos de extensão, monitorias, eventos e grupos de pesquisa.
Entretanto, essas informações costumam estar distribuídas entre diversos canais, como e-mails, grupos de mensagens, redes sociais e páginas de departamentos.
Além disso:
- nem todas as disciplinas possuem monitoria oficial;
- alunos podem precisar de apoio em horários diferentes dos oferecidos pela instituição;
- estudantes que já cursaram determinadas disciplinas podem oferecer auxílio a outros alunos;
- certificados e horas complementares normalmente precisam ser controlados separadamente.
O HubBCC busca centralizar esses recursos.
| Necessidade | Solução no HubBCC |
|---|---|
| Encontrar oportunidades acadêmicas | catálogo centralizado com filtros e candidaturas |
| Acompanhar candidaturas | consulta da situação e possibilidade de cancelamento |
| Encontrar ajuda em disciplinas | ofertas de monitoria e tutoria |
| Oferecer apoio acadêmico | criação e gerenciamento de ofertas |
| Reservar atendimento | agendamento de horários disponíveis |
| Acompanhar horas complementares | registro de atividades e cálculo de progresso |
| Gerenciar disciplinas | CRUD administrativo de disciplinas |
Cadastro
↓
Login
↓
Explorar oportunidades
↓
Realizar candidatura
↓
Acompanhar situação
Aluno busca apoio
↓
Consulta monitorias/tutorias
↓
Realiza agendamento
↓
Atendimento
↓
Registro e avaliação
Aluno participa de atividades
↓
Registra atividade complementar
↓
Acompanha total de horas
| Camada | Tecnologia | Uso |
|---|---|---|
| Interface | React 19 | componentes funcionais e hooks |
| Linguagem | JavaScript ES6+ | módulos, async/await, destructuring e demais recursos modernos |
| Build | Vite 8 | ambiente de desenvolvimento e build |
| Estilo | Tailwind CSS v4 | layout, componentes e responsividade |
| Roteamento | React Router DOM v7 | navegação e rotas protegidas |
| Requisições HTTP | Axios | comunicação com a API |
| Cache e estado remoto | TanStack Query v5 | consultas, mutations e invalidação de cache |
| Formulários | React Hook Form | gerenciamento dos principais formulários |
| Validação | Zod + @hookform/resolvers | validação de dados dos formulários |
| Backend mockado | JSON Server | API REST e persistência local |
| Ícones | Lucide React / Phosphor Icons | elementos visuais |
| Qualidade | ESLint | análise estática do código |
| Execução paralela | concurrently | inicialização conjunta da API e do frontend |
O projeto utiliza as tecnologias solicitadas para a implementação do frontend e integração com backend mockado.
| Requisito | Implementação |
|---|---|
| React | componentes funcionais e hooks em src/ |
| ES6+ | utilizado em toda a aplicação |
| Framework de estilização | Tailwind CSS v4 |
| Responsividade | breakpoints responsivos do Tailwind |
| React Hook Form | formulários estruturados da aplicação |
| Zod | schemas em src/schemas/ |
| TanStack Query | hooks em src/queries/ |
| JSON Server | server/server.js + db.json |
| Dados iniciais | server/db.seed.json |
| API HTTP | Axios centralizado em src/api/axios.js |
- Node.js 20.19 ou superior
- npm
Para verificar as versões:
node --version
npm --versionNa raiz do repositório:
cd frontend
npm installnpm run dev:allServiços utilizados:
| Serviço | Endereço |
|---|---|
| Frontend | http://localhost:5173 |
| API | http://localhost:3001 |
Terminal 1:
npm run serverTerminal 2:
npm run dev| Comando | Função |
|---|---|
npm run dev |
inicia somente o Vite |
npm run server |
inicia somente o JSON Server |
npm run dev:all |
inicia frontend e backend juntos |
npm run db:reset |
restaura os dados iniciais |
npm run build |
gera a build de produção |
npm run preview |
executa localmente a build |
npm run lint |
executa o ESLint |
npm run db:resetO comando copia novamente os dados de:
frontend/server/db.seed.json
para:
frontend/db.json
O banco inicial possui usuários para os três perfis do sistema.
| Perfil | Senha | |
|---|---|---|
| Aluno | aluno@hubbcc.br |
123456 |
| Monitor | monitor@hubbcc.br |
123456 |
| Administrador | admin@hubbcc.br |
123456 |
Os dados utilizados durante a execução são persistidos em:
frontend/db.json
Portanto, cadastros, alterações e exclusões permanecem salvos enquanto o banco não for restaurado.
O frontend está organizado em camadas.
PAGES
↓
QUERIES
↓
SERVICES
↓
AXIOS
↓
JSON SERVER
↓
db.json
As páginas representam as telas da aplicação.
src/pages/
Elas utilizam componentes, hooks e queries para montar a interface.
A camada:
src/queries/
centraliza os hooks do TanStack Query.
Ela é responsável por:
- buscar dados;
- executar mutations;
- controlar loading e erro;
- manter cache;
- invalidar consultas após alterações.
A camada:
src/service/
contém as funções responsáveis pelas requisições HTTP.
Exemplos:
authService.js
oportunidadeService.js
apoioService.js
agendamentoService.js
atividadeService.js
A configuração da comunicação HTTP fica centralizada em:
src/api/axios.js
As páginas não precisam criar novas instâncias do Axios.
O backend acadêmico é executado por:
frontend/server/server.js
e utiliza:
frontend/db.json
como banco persistente.
frontend/
│
├── server/
│ ├── server.js
│ └── db.seed.json
│
├── db.json
│
├── public/
│
├── src/
│ ├── api/
│ │ └── axios.js
│ │
│ ├── assets/
│ │
│ ├── components/
│ │ ├── layout/
│ │ ├── rotas/
│ │ └── ui/
│ │
│ ├── contexts/
│ │
│ ├── hooks/
│ │ └── usePermissao.js
│ │
│ ├── lib/
│ │ └── queryClient.js
│ │
│ ├── pages/
│ │ ├── agendamentos/
│ │ ├── apoio/
│ │ ├── atividades/
│ │ ├── cadastro/
│ │ ├── disciplinas/
│ │ ├── home/
│ │ ├── landing/
│ │ ├── login/
│ │ ├── oportunidades/
│ │ ├── perfil/
│ │ └── recuperarSenha/
│ │
│ ├── queries/
│ │
│ ├── schemas/
│ │
│ ├── service/
│ │
│ ├── utils/
│ │
│ ├── App.jsx
│ ├── index.css
│ └── main.jsx
│
├── .env.example
├── eslint.config.js
├── index.html
├── package.json
└── vite.config.js
Os mocks antigos em src/mocks foram removidos após a migração definitiva para JSON Server.
Arquivos vazios ou não utilizados também foram removidos durante a limpeza final do projeto.
| Tela | Rota |
|---|---|
| Landing page | / |
| Login | /login |
| Cadastro | /cadastro |
| Recuperar senha | /recuperar-senha |
| Nova senha | /nova-senha |
| Tela | Rota |
|---|---|
| Home | /app |
| Lista de oportunidades | /app/oportunidades |
| Detalhe da oportunidade | /app/oportunidades/:id |
| Realizar candidatura | /app/oportunidades/:id/candidatura |
| Minhas candidaturas | /app/candidaturas |
| Cadastrar oportunidade | /app/oportunidades/nova |
| Editar oportunidade | /app/oportunidades/:id/editar |
| Avaliar candidaturas | /app/oportunidades/:id/candidaturas |
| Lista de apoio acadêmico | /app/apoio |
| Criar oferta | /app/apoio/nova |
| Detalhe da oferta | /app/apoio/:id |
| Agendar atendimento | /app/apoio/:id/agendar |
| Editar oferta | /app/apoio/:id/editar |
| Meus agendamentos | /app/agendamentos |
| Registrar atendimento | /app/agendamentos/:id/registrar |
| Atividades complementares | /app/atividades |
| Registrar atividade | /app/atividades/nova |
| Editar atividade | /app/atividades/:id/editar |
| Gerenciar disciplinas | /app/disciplinas |
| Perfil | /app/perfil |
| Tela | Rota |
|---|---|
| Acesso não autorizado | /sem-acesso |
| Página não encontrada | demais rotas inválidas |
A prototipagem inicial definiu 20 casos de uso.
Durante o refinamento da prototipagem e a construção da Matriz CRUD, foram identificadas 9 funcionalidades adicionais, totalizando 29 operações previstas no escopo refinado.
| Funcionalidade | Situação |
|---|---|
| Cadastrar oportunidade acadêmica | Implementado |
| Consultar oportunidades acadêmicas | Implementado |
| Filtrar oportunidades | Implementado |
| Alterar oportunidade acadêmica | Implementado |
| Encerrar oportunidade acadêmica | Implementado |
| Excluir oportunidade acadêmica | Implementado |
A exclusão definitiva remove também as candidaturas vinculadas à oportunidade.
| Funcionalidade | Situação |
|---|---|
| Realizar candidatura | Implementado |
| Consultar candidaturas | Implementado |
| Avaliar candidatura | Implementado |
| Cancelar candidatura | Implementado |
A avaliação permite aprovar ou reprovar candidaturas associadas a uma oportunidade.
| Funcionalidade | Situação |
|---|---|
| Criar oferta de apoio acadêmico | Implementado |
| Consultar ofertas de apoio | Implementado |
| Filtrar ofertas | Implementado |
| Alterar oferta | Implementado |
| Cancelar oferta | Implementado |
| Funcionalidade | Situação |
|---|---|
| Realizar agendamento | Implementado |
| Consultar agendamentos | Implementado |
| Reagendar atendimento | Implementado |
| Registrar realização do atendimento | Implementado |
| Avaliar atendimento | Implementado |
| Cancelar agendamento | Implementado |
Ao cancelar um agendamento confirmado, a vaga correspondente volta a ficar disponível.
| Funcionalidade | Situação |
|---|---|
| Registrar atividade complementar | Implementado |
| Consultar atividades e horas | Implementado |
| Alterar atividade complementar | Implementado |
| Excluir atividade complementar | Implementado |
| Funcionalidade | Situação |
|---|---|
| Cadastrar disciplina | Implementado |
| Consultar disciplinas | Implementado |
| Alterar disciplina | Implementado |
| Excluir disciplina | Implementado |
O gerenciamento de disciplinas é disponibilizado ao perfil de administrador.
As coleções principais utilizadas no db.json são:
usuarios
disciplinas
oportunidades
candidaturas
ofertas
agendamentos
atividades
config
{
id,
nome,
email,
senha,
perfil,
matricula,
curso,
periodo,
telefone,
iniciais
}Perfis disponíveis:
aluno
monitor
admin
{
id,
codigo,
nome,
periodo
}{
id,
titulo,
tipo,
area,
departamento,
responsavel,
descricao,
requisitos,
atividades,
bolsa,
cargaHoraria,
modalidade,
local,
vagas,
prazoInscricao,
situacao
}{
id,
usuarioId,
oportunidadeId,
oportunidadeTitulo,
tipo,
dataEnvio,
carta,
situacao
}{
id,
disciplinaId,
disciplina,
titulo,
assunto,
monitorId,
monitor,
tipo,
modalidade,
local,
gratuita,
valor,
vagas,
vagasOcupadas,
descricao,
horarios
}{
id,
usuarioId,
ofertaId,
titulo,
disciplina,
monitor,
data,
hora,
modalidade,
local,
situacao,
avaliacao,
registro
}{
id,
usuarioId,
titulo,
categoria,
data,
horas,
descricao,
situacao,
comprovante,
comprovanteArquivo
}{
metaHorasComplementares: 200
}O projeto utiliza JSON Server 0.17.4 como backend acadêmico.
O servidor é iniciado por:
frontend/server/server.js
O banco utilizado durante a execução é:
frontend/db.json
Os dados iniciais ficam em:
frontend/server/db.seed.json
O JSON Server fornece operações REST para as principais coleções.
Exemplos:
GET /oportunidades
GET /oportunidades/:id
POST /oportunidades
PUT /oportunidades/:id
DELETE /oportunidades/:id
O mesmo modelo é utilizado para disciplinas, candidaturas, ofertas, agendamentos e atividades.
O servidor também implementa operações específicas necessárias para o projeto, incluindo autenticação, recuperação de senha, resumo de atividades e restauração dos dados.
Entre as regras tratadas pela aplicação e pelo servidor estão:
- impedir candidatura duplicada;
- impedir candidatura em oportunidade encerrada;
- controlar vagas de ofertas;
- impedir conflitos de agendamento;
- devolver vaga ao cancelar agendamento;
- calcular horas complementares;
- impedir e-mails duplicados;
- restaurar dados de teste;
- remover candidaturas vinculadas ao excluir definitivamente uma oportunidade.
O projeto utiliza TanStack Query para trabalhar com dados remotos.
A configuração principal fica em:
src/lib/queryClient.js
e o provider é carregado em:
src/main.jsx
Os hooks ficam em:
src/queries/
Exemplos:
useOportunidades.js
useApoio.js
useAgendamentos.js
useAtividades.js
useAcesso.js
Exemplo:
const {
data = [],
isLoading,
isError,
error,
refetch,
} = useOportunidades();Exemplo:
const excluir = useExcluirOportunidade();
excluir.mutate(id);Depois de cadastros, alterações e exclusões, as consultas relacionadas são invalidadas.
Exemplo:
qc.invalidateQueries({
queryKey: chaves.oportunidades.todas,
});Isso permite atualizar a interface sem recarregar manualmente a página.
Os principais formulários da aplicação utilizam:
- React Hook Form;
- Zod;
zodResolver.
Os schemas ficam em:
src/schemas/
Exemplo:
const schema = z.object({
titulo: z
.string()
.min(5, "Informe um titulo valido."),
});Integração com o formulário:
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
resolver: zodResolver(schema),
});Entre os fluxos que utilizam essa estrutura estão:
- login;
- cadastro;
- recuperação de senha;
- oportunidades;
- candidaturas;
- ofertas de apoio;
- agendamentos;
- avaliações;
- atividades complementares;
- dados de perfil.
O gerenciamento de disciplinas utiliza um formulário administrativo simples com validação local dos campos.
O projeto utiliza Tailwind CSS v4.
Os tokens globais e estilos reutilizáveis ficam em:
src/index.css
A aplicação possui componentes compartilhados em:
src/components/ui/
Exemplos:
Botao;Campo;Alerta;Selo;Modal;Estado;Skeleton;Progresso;Estrelas;GradeHorarios;VisualizadorArquivo;Avatar;Cabecalho.
A responsividade utiliza os breakpoints do Tailwind.
Exemplo:
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">A navegação lateral também possui comportamento adaptado para dispositivos móveis.
Em telas menores:
- o menu fica recolhido;
- um botão na barra superior abre a navegação;
- há uma camada de fundo para fechamento;
- o menu pode ser fechado ao selecionar uma opção.
O sistema possui autenticação e rotas privadas.
O componente utilizado é:
src/components/rotas/RotaPrivada.jsx
Todas as rotas em:
/app
exigem autenticação.
Algumas áreas também possuem restrição específica de perfil.
As rotas de:
- cadastrar oportunidade;
- editar oportunidade;
- avaliar candidaturas;
são protegidas para:
monitor
admin
A rota:
/app/disciplinas
é restrita ao perfil:
admin
O item correspondente no menu também é exibido apenas para administradores.
Utilizar PascalCase:
DetalheOportunidade.jsx
RealizarAgendamento.jsx
Disciplinas.jsx
Utilizar camelCase:
buscarOportunidade
aoSalvar
usuarioLogadoHooks React devem começar com use:
useOportunidades
useDisciplinas
usePermissaoO fluxo preferencial é:
Página
↓
Query
↓
Service
↓
Axios
As páginas devem evitar realizar requisições diretamente com Axios.
Utilizar TanStack Query para:
- consultas;
- mutations;
- carregamento;
- tratamento de erro;
- cache;
- invalidação.
Utilizar Tailwind CSS e os componentes reutilizáveis existentes.
Os commits devem possuir mensagens claras.
Exemplos:
feat: add discipline management page
feat: add opportunity deletion action
docs: update installation and user manual
chore: remove obsolete mocks
A versão atual possui:
- frontend em React;
- layout com Tailwind CSS;
- navegação responsiva;
- autenticação;
- rotas privadas;
- perfis de aluno, monitor e administrador;
- backend mockado com JSON Server;
- persistência em
db.json; - dados iniciais para demonstração;
- TanStack Query para dados remotos;
- React Hook Form e Zod nos principais formulários;
- oportunidades acadêmicas;
- candidaturas;
- avaliação de candidaturas;
- apoio acadêmico;
- agendamentos;
- registro e avaliação de atendimentos;
- atividades complementares;
- acompanhamento de horas;
- CRUD de disciplinas;
- exclusão de oportunidades com remoção de candidaturas vinculadas;
- componentes reutilizáveis;
- navegação adaptada para dispositivos móveis;
- manual de instalação e utilização atualizado;
- documento de arquitetura e boas práticas atualizado.
O escopo funcional registrado na Matriz CRUD refinada está representado na aplicação.
Antes de uma entrega ou demonstração, recomenda-se executar o sistema com os dados iniciais e percorrer os principais fluxos para validação final.
A documentação principal está em:
documents/
documents/doc/initial-prototyping/01-prototipagem.md
Contém:
- propósito do sistema;
- business case;
- processo de negócio;
- casos de uso iniciais;
- entidades de domínio.
documents/doc/diagrams-and-matrices/02-refinamento-prototipagem.md
Contém:
- Matriz CRUD;
- Matriz Perfil x Funcionalidade;
- funcionalidades adicionadas durante o refinamento;
- priorização;
- divisão de responsabilidades entre os integrantes.
documents/doc/manual.md
Contém:
- pré-requisitos;
- instalação;
- execução;
- contas de teste;
- perfis;
- instruções de utilização;
- problemas comuns.
documents/doc/boasPraticas.md
Contém:
- arquitetura;
- organização de pastas;
- padrão das queries e services;
- formulários;
- responsividade;
- nomenclatura;
- padrões de desenvolvimento.
| Integrante |
|---|
| Geovanne Gomes de Souza |
| Marina Motta Sampaio |
| Mina Iura Mathias Monteiro |
| Samuel Trindade Sabino da Silva |
Centralizando oportunidades, apoio acadêmico e desenvolvimento dos alunos de Ciência da Computação em um único ambiente.