- O que é?
- O "Fala, CEUB!" é uma plataforma de feedback teorica desenvolvida para a comunidade acadêmica do CEUB. O objetivo é criar um canal de comunicação centralizado e seguro onde os alunos podem expressar suas opiniões sobre diversos aspectos da instituição.
- O Problema que Resolve:
- Centraliza feedbacks que estariam espalhados em redes sociais ou grupos, permitindo que tanto os alunos quanto a administração tenham uma visão clara dos pontos fortes e das áreas que necessitam de melhoria.
- Público-Alvo:
- Alunos do CEUB (usuários principais) e administração da faculdade (que pode visualizar os feedbacks e agir sobre eles).
- Autenticação de Usuários:
- Criação de conta e login (restrito a e-mails
@sempreceubpara garantir que apenas alunos participem). - Sistema de sessão simples usando
localStorage.
- Criação de conta e login (restrito a e-mails
- Sistema de Feedback (Três Tipos):
- Avaliar: Permite que os alunos deem uma nota (de 1 a 5 estrelas) e um comentário sobre locais, serviços ou equipamentos.
- Reclamar: Permite o envio de reclamações formais, que podem ser anônimas.
- Sugerir: Permite o envio de sugestões de melhoria.
- Visualização de Feedbacks:
- Páginas para listar sugestões, reclamações recentes (pendentes) e reclamações resolvidas.
- Ranking:
- Página de "Melhores Avaliados" com um pódio para o Top 3 e uma tabela de classificação baseada na nota média das avaliações.
- Frontend: HTML5, CSS3, JavaScript (Vanilla JS)
- Backend: Node.js com o framework Express.js
- Banco de Dados: Supabase (que utiliza PostgreSQL)
- Pré-requisitos:
- Node.js (versão 18 ou superior)
- npm (geralmente instalado com o Node.js)
- Uma conta no Supabase com um projeto criado.
- Passos para Instalação:
- Clone o repositório:
git clone <URL_DO_SEU_REPOSITORIO> - Navegue até a pasta do projeto:
cd fala-ceub - Instale as dependências do backend:
npm install - Crie um arquivo
.envna raiz do projeto e adicione suas chaves do Supabase:SUPABASE_URL=URL_DO_SEU_PROJETO_SUPABASE SUPABASE_KEY=SUA_CHAVE_ANON_SUPABASE - Execute os scripts SQL (que criamos para as tabelas e funções) no SQL Editor do seu projeto Supabase para configurar o banco de dados.
- Inicie o servidor backend:
node server.js(ou o nome do seu arquivo principal). - Abra os arquivos HTML (
index.html, etc.) em um servidor local (como a extensão "Live Server" do VS Code).
- Clone o repositório:
/
├── css/
│ ├── avalie.css
│ ├── criarconta.css
│ ├── login.css
│ └── ... (outros arquivos CSS)
├── js/
│ ├── avalie.js
│ ├── melhores-avaliados.js
│ └── ... (outros arquivos JS)
├── pages/
│ ├── avalie.html
│ ├── melhores-avaliados.html
│ └── ... (outros arquivos HTML)
├── assets/
│ └── icons/
│ └── ... (ícones SVG)
├── index.html
├── server.js (ou seu arquivo principal do backend)
├── package.json
└── README.md (este arquivo de documentação)
Esta seção cobre o cadastro, login e verificação de usuários.
- Descrição: Cadastra um novo usuário no sistema.
- Corpo da Requisição (JSON):
{ "nome": "Nome do Aluno", "email": "aluno@sempreceub.br", "senha": "senhaSegura123" } - Campos Obrigatórios:
nome,email,senha. - Resposta de Sucesso (201 Created):
{ "mensagem": "Usuário cadastrado com sucesso!", "usuario": { "id": 1, "nome": "Nome do Aluno", "email": "aluno@sempreceub.br", "datacriacao": "2025-06-22T14:30:00.000Z" } } - Respostas de Erro:
- 400 Bad Request: Se faltar algum campo ou se o e-mail já estiver cadastrado.
{ "erro": "Este email já está cadastrado" } - 500 Internal Server Error: Se ocorrer um erro no banco de dados.
- 400 Bad Request: Se faltar algum campo ou se o e-mail já estiver cadastrado.
- Descrição: Autentica um usuário existente e retorna seus dados.
- Corpo da Requisição (JSON):
{ "email": "aluno@sempreceub.br", "senha": "senhaSegura123" } - Campos Obrigatórios:
email,senha. - Resposta de Sucesso (200 OK):
{ "mensagem": "Login realizado com sucesso", "usuario": { "id": 1, "nome": "Nome do Aluno", "email": "aluno@sempreceub.br", "datacriacao": "2025-06-22T14:30:00.000Z" } } - Respostas de Erro:
- 400 Bad Request: Se as credenciais (email/senha) estiverem incorretas.
{ "erro": "Email ou senha inválidos" } - 500 Internal Server Error: Se ocorrer um erro no servidor.
- 400 Bad Request: Se as credenciais (email/senha) estiverem incorretas.
- Descrição: Verifica se um e-mail já existe no banco de dados. Útil para validação em tempo real no formulário de cadastro.
- Corpo da Requisição (JSON):
{ "email": "aluno@sempreceub.br" } - Resposta de Sucesso (200 OK):
{ "emailExiste": true } // ou { "emailExiste": false }
Rotas para criar os diferentes tipos de feedback.
- Descrição: Cria uma nova sugestão.
- Corpo da Requisição (JSON):
{ "usuarioId": 1, "localId": 5, // Opcional "texto": "Minha sugestão de melhoria...", "anonimo": false // Opcional } - Resposta de Sucesso (201 Created): Retorna o objeto da sugestão criada.
- Descrição: Cria uma nova reclamação (com status padrão 'Pendente').
- Corpo da Requisição (JSON):
{ "usuarioId": 1, "localId": 2, // Opcional "texto": "Minha reclamação sobre o item...", "anonimo": true // Opcional } - Resposta de Sucesso (201 Created): Retorna o objeto da reclamação criada.
- Descrição: Cria uma nova avaliação com nota.
- Corpo da Requisição (JSON):
{ "usuarioId": 1, "localId": 8, // Opcional "texto": "Gostei muito, mas poderia melhorar.", "anonimo": false, // Opcional "nota": 4.5 // Opcional } - Resposta de Sucesso (201 Created): Retorna o objeto da avaliação criada.
Rotas para listar os feedbacks enviados.
- Descrição: Lista todas as sugestões, ordenadas da mais recente para a mais antiga.
- Resposta de Sucesso (200 OK): Retorna um array de objetos de sugestão.
[ { "id": 1, "texto": "...", "anonimo": false, "usuarioNome": "Nome do Aluno", "criadoEm": "..." }, { "id": 2, "texto": "...", "anonimo": true, "usuarioNome": null, "criadoEm": "..." } ]
- Descrição: Lista todas as reclamações com
status = 'Pendente'. - Resposta de Sucesso (200 OK): Retorna um array de objetos de reclamação.
- Descrição: Lista todas as reclamações com
status = 'Resolvido'. - Resposta de Sucesso (200 OK): Retorna um array de objetos de reclamação.
Rotas para popular seletores e a página de ranking.
- Descrição: Retorna a lista de locais ordenados pela maior nota média. Utiliza a função
get_melhores_avaliadosdo banco de dados. - Resposta de Sucesso (200 OK):
[ { "local_id": 10, "local_nome": "biblioteca_central", "nota_media": 4.9, "total_avaliacoes": 150 }, { ...outros locais... } ]
- Descrição: Retorna a lista de todas as categorias disponíveis.
- Resposta de Sucesso (200 OK): Retorna um array de objetos de categoria.
- Descrição: Retorna a lista de todos os locais disponíveis com o nome da sua categoria.
- Resposta de Sucesso (200 OK): Retorna um array de objetos de local.
- Descrição: Retorna a lista de locais que pertencem a uma categoria específica.
- Parâmetro de Rota:
categoriaId(O ID da categoria). - Resposta de Sucesso (200 OK): Retorna um array de objetos de local.
O banco de dados do projeto é estruturado em torno de algumas tabelas principais que se relacionam para armazenar usuários, itens avaliáveis e os feedbacks.
Armazena as informações de cada usuário cadastrado na plataforma.
| Coluna | Tipo | Descrição |
|---|---|---|
id |
serial |
Chave Primária. Identificador único para cada usuário. |
nome |
text |
Nome completo do usuário. |
email |
text |
E-mail do usuário. Único. |
senha |
text |
Senha do usuário, armazenada com hash e salt. |
tipo |
varchar(20) |
Define o perfil do usuário (ex: 'Estudante', 'Professor', 'Moderador'). |
datacadastro |
timestamp |
Data e hora do cadastro. Padrão: now(). |
ra |
text |
Registro Acadêmico do aluno. Único. |
Funciona como uma tabela de lookup para agrupar diferentes tipos de locais.
| Coluna | Tipo | Descrição |
|---|---|---|
id |
serial |
Chave Primária. |
nome |
text |
Nome da categoria (ex: 'sala_de_aula', 'equipamentos'). Único. |
Armazena cada item específico que pode ser alvo de um feedback.
| Coluna | Tipo | Descrição |
|---|---|---|
id |
serial |
Chave Primária. |
nome |
text |
Nome do local (ex: 'sala_101', 'biblioteca_central'). Único. |
categoriaid |
integer |
Chave Estrangeira que referencia categoria(id). |
Armazena serviços específicos que podem ser avaliados e que não se encaixam necessariamente em um local.
| Coluna | Tipo | Descrição |
|---|---|---|
id |
bigint |
Chave Primária. |
nome |
text |
Nome do serviço (ex: 'suporte_de_ti_helpdesk'). |
É a tabela central do sistema, armazenando todas as avaliações, reclamações e sugestões.
| Coluna | Tipo | Descrição |
|---|---|---|
id |
serial |
Chave Primária. |
usuarioid |
integer |
Chave Estrangeira que referencia usuario(id). |
localid |
integer |
Chave Estrangeira que referencia local(id). (Opcional) |
servicosid |
bigint |
Chave Estrangeira que referencia servicos(id). (Opcional) |
tipo |
enum |
Tipo de feedback ('Avaliação', 'Reclamação', 'Sugestão'). |
texto |
text |
O conteúdo do comentário do usuário. |
nota |
float |
A nota de 1 a 5, usada apenas para tipo = 'Avaliação'. |
status |
enum |
O estado de um feedback ('Pendente', 'Resolvido'). Padrão: 'Pendente'. |
anonimo |
boolean |
Se true, o nome do autor não deve ser exibido. Padrão: false. |
datacriacao |
timestamp |
Data e hora de envio do feedback. Padrão: now(). |
Armazena a resposta ou a solução dada a um feedback, geralmente a uma reclamação.
| Coluna | Tipo | Descrição |
|---|---|---|
id |
serial |
Chave Primária. |
feedbackid |
integer |
Chave Estrangeira que referencia feedback(id). |
tecnicoid |
integer |
Chave Estrangeira que referencia usuario(id) (o moderador que resolveu). |
descricao |
text |
Descrição da solução aplicada. |
dataresolucao |
timestamp |
Data e hora da resolução. Padrão: now(). |
status |
enum |
Status da moderação (ex: 'Aprovado', 'Rejeitado'). |