Nome da Aplicação: Ruralinfo
Integrantes: Daniel Moreira, Kaue Freitas
Professor: Cleyton Vanut
Disciplina: Projeto Interdisciplinar para Sistemas de Informação I
Curso: Bacharelado em Sistemas de Informação
Unidade de Ensino: Universidade Federal Rural de Pernambuco (UFRPE)
O Ruralinfo é uma aplicação web desenvolvida para centralizar o fluxo de informações no Campus Dois Irmãos da UFRPE. O sistema funciona como um mural digital onde a administração pode gerenciar comunicados e avisos institucionais, garantindo que o corpo discente tenha acesso rápido e seguro às informações da universidade. O projeto também oferece um espaço para que a comunidade conheça os espaços do campus, consulte horários do Circular Rural e contribua com sugestões de pauta para a administração.
| Biblioteca | Descrição |
|---|---|
| Pillow | Processamento de imagens para ImageField nos models de avisos e locais |
| django-widget-tweaks | Aplicação de classes CSS nos campos de formulário nos templates |
| python-dotenv | Leitura de variáveis de ambiente do arquivo .env |
| pytz | Manipulação de fusos horários mundiais, garantindo a precisão do horário local (America/Recife) |
A primeira versão do Ruralinfo foi desenvolvida como uma aplicação desktop utilizando CustomTkinter
e banco de dados SQLite gerenciado manualmente com sqlite3 e contextlib.
O foco foi estabelecer a base do sistema com autenticação e o mural informativo.
- 1 — Sistema de Autenticação Dual: Tela unificada para Login e Cadastro com alternância dinâmica de modo.
- 2 — Validação Institucional: Filtro obrigatório para e-mails do domínio
@ufrpe.br. - 3 — Segurança de Credenciais: Validação de senhas com mínimo 10 caracteres, letra maiúscula, número e caractere especial.
- 4 — Mural Informativo: Interface para visualização de avisos e comunicados acadêmicos.
- 5 — Acesso por Visitante: Possibilidade de acessar o mural sem autenticação.
- 6 — Persistência em SQLite: Gestão de dados de usuários e avisos com tratamento de transações e Context Managers.
pip install customtkinter
python src/main.py
A segunda versão marca a migração completa da aplicação desktop para uma plataforma web moderna utilizando o framework Django. A interface CustomTkinter foi substituída por templates HTML com CSS nativo e identidade visual própria da UFRPE. O banco de dados manual foi substituído pelo ORM do Django, e o sistema de autenticação foi completamente reconstruído com segurança real.
- 1 — Dualidade de Contas: Um mesmo e-mail
@ufrpe.brpode ter uma conta COMUM e uma ADMIN independentes. - 2 — Username Composto: Login construído internamente como
email_TIPOpara suporte à dualidade. - 3 — Hashing de Senha: Senhas armazenadas com PBKDF2-SHA256 via
set_password()do Django. - 4 — Sistema de Convites UUID: Cadastro de ADMIN exige código gerado por administrador existente.
- 5 — Verificação de E-mail: Envio de código de confirmação por e-mail ao realizar cadastro.
- 6 — Proteção CSRF: Todos os formulários POST protegidos com token CSRF.
- 7 — Transação Atômica: Convite só é consumido se o usuário for criado com sucesso no banco.
- 8 — CRUD Completo: Administradores criam, editam, ocultam e deletam qualquer aviso.
- 9 — Categorias: Avisos organizados por Aviso Geral, Evento, Acadêmico, Oportunidade, Extensão, Pesquisa, Manutenção e Urgente.
- 10 — Ocultar sem Deletar: Aviso pode ser retirado do ar sem ser removido do banco.
- 11 — Rastreabilidade: Cada aviso registra o autor via chave estrangeira para auditoria.
- 12 — Imagem com Acessibilidade: Avisos suportam imagem com campo
alt_textoobrigatório. - 13 — Acesso por Visitante: Mural público acessível sem login para avisos urgentes.
- 14 — Visualização de Perfil: Tela com dados cadastrais do usuário logado.
- 15 — Alteração de Username: Usuário pode personalizar seu identificador.
- 16 — Exclusão de Conta: Remoção permanente com confirmação por senha via modal.
- 17 — Identidade Visual UFRPE: Paleta de cores
#112b38/#f4c430aplicada em toda a interface. - 18 — Indicador de Força de Senha: Feedback visual em tempo real no cadastro.
- 19 — Toggle de Senha: Botão para mostrar/ocultar campos de senha.
- 20 — Sidebar de Navegação: Menu lateral com overlay acessível por botão hambúrguer.
- 21 — Flash Messages: Notificações com auto-fechamento em 5 segundos.
A terceira versão expande o Ruralinfo de um simples mural de avisos para uma plataforma informativa completa do campus. O foco é engajar a comunidade com conteúdo interativo — avaliações, comentários, galeria de fotos dos espaços do campus —, criar um canal direto entre alunos e administração por meio do sistema de sugestões de pauta, e introduzir um mecanismo inteligente de rastreamento assíncrono para o transporte interno da UFRPE.
- 22 — Listagem de Locais: Grid de cards com imagem, descrição e média de avaliações de cada espaço do campus.
- 23 — Página de Detalhe: Tela completa do local com galeria, avaliação e comentários.
- 24 — Galeria de Fotos: Exibe linha de 5 thumbnails; se houver mais, a última mostra blur com contador
+N. - 25 — Lightbox: Visualização ampliada das fotos com navegação por setas e teclado.
- 26 — Avaliação por Estrelas: Notas de 0.5 a 5.0 com meias estrelas interativas, validação matemática rigorosa no backend.
- 27 — Reavaliação: Usuário pode atualizar sua nota a qualquer momento.
- 28 — Comentários e Respostas: Sistema com um nível de profundidade — comentário e resposta.
- 29 — Moderação: Admin pode deletar qualquer comentário; autor pode deletar o próprio.
- 30 — CRUD de Locais pela Interface: Admins do sistema criam, editam e removem locais sem precisar do painel superuser.
- 31 — Galeria Dinâmica: Formulário permite adicionar fotos ilimitadas com botão "+ Adicionar foto".
- 32 — Envio de Sugestão: Usuários logados sugerem pautas com texto e categoria.
- 33 — Painel de Pendentes: Admin visualiza sugestões aguardando análise.
- 34 — Aceitar com Pré-preenchimento: Ao aceitar, admin é redirecionado para criar aviso com texto e categoria já preenchidos.
- 35 — Negar e Arquivar: Sugestão negada é arquivada com data para futura limpeza automática.
- 36 — Aba de Arquivadas: Admin acessa histórico de sugestões negadas separadamente.
- 37 — Tabela de Horários: Consulta dos horários do Circular Rural com dois sentidos — Zootecnia (Início) e Zootecnia (Fim).
- 38 — Scroll Horizontal: Tabela navegável com coluna de ponto fixada para facilitar a leitura em dispositivos móveis.
- 39 — API de Monitoramento: Criação de um endpoint que calcula dinamicamente o próximo horário de saída com base no fuso horário local (America/Recife).
- 40 — Componentização do Banner: Isolamento do painel dinâmico em um template parcial reaproveitável, integrado simultaneamente na tela de horários e no feed do Mural de Avisos.
- 41 — Atualização Assíncrona (Polling): Script em JavaScript que atualiza os dados do banner em segundo plano a cada 30 segundos e destaca automaticamente o horário ativo diretamente na tabela.
- 42 — Refinamento de Interface (UI): Novo indicador visual animado para o status "Ao Vivo" e estilização de alto contraste para facilitar a leitura rápida dos próximos ônibus.
git clone [https://github.com/DanielMoreiraFr/Ruralinfo.git](https://github.com/DanielMoreiraFr/Ruralinfo.git)
cd Ruralinfo
python -m venv venv
# Windows
venv\Scripts\activate
# Linux / macOS
source venv/bin/activate
pip install -r requirements.txt
Crie um arquivo .env na raiz do projeto:
SECRET_KEY=sua-chave-secreta-gerada-aqui
DEBUG=True
ALLOWED_HOSTS=
# --- CONFIGURAÇÃO DE E-MAIL ---
# Para desenvolvimento local (evita erros de autenticação SMTP/Brevo com IP dinâmico):
EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
# Para ambiente de homologação/produção (usando Brevo):
# EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
# EMAIL_HOST=smtp-relay.brevo.com
# EMAIL_PORT=587
# EMAIL_HOST_USER=seu-usuario-brevo
# EMAIL_HOST_PASSWORD=sua-senha-api-brevo
# DEFAULT_FROM_EMAIL=seu-email-remetente
Para gerar a SECRET_KEY:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
⚠️ Sempre gere a migration doaccountsantes das demais.
python manage.py makemigrations accounts
python manage.py makemigrations mural
python manage.py makemigrations locais
python manage.py migrate
Como o cadastro de novos administradores exige um código de convite baseado em UUID válido, use o shell do Django para criar o primeiro administrador do sistema e, opcionalmente, gerar convites iniciais:
python manage.py shell
from accounts.models import Usuario, CodigoConvite
# 1. Criação do Administrador Raiz
admin = Usuario(
nome_completo='Admin UFRPE',
email='admin@ufrpe.br',
tipo_conta='ADMIN',
is_superuser=True,
)
admin.set_password('SuaSenhaForte@2025!')
admin.save()
# 2. (Opcional) Criar um token de convite para cadastrar outros administradores via interface
convite = CodigoConvite.objects.create(criado_por=admin)
print(f"Código de Convite gerado: {convite.codigo}")
exit()python manage.py runserver
Acesse em: http://127.0.0.1:8000/
ruralinfo/
├── manage.py
├── requirements.txt
├── .env # variáveis sensíveis (não commitado)
├── .env.example # modelo público do .env
├── db.sqlite3 # gerado após migrate
├── media/ # uploads de imagens
│
├── ruralinfo/ # pacote de configuração
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
│
├── accounts/ # autenticação e usuários
│ ├── models.py # Usuario · CodigoConvite
│ ├── forms.py # LoginForm · CadastroComumForm · CadastroAdminForm
│ ├── views.py # login · cadastro · logout · perfil
│ ├── urls.py
│ └── admin.py
│
├── mural/ # avisos e sugestões
│ ├── models.py # Aviso · Sugestao
│ ├── forms.py # AvisoForm · SugestaoForm
│ ├── views.py # mural · CRUD avisos · sugestões
│ ├── urls.py
│ └── admin.py
│
├── locais/ # áreas do campus
│ ├── models.py # LocalRural · ImagemLocal · Avaliacao · Comentario
│ ├── forms.py # LocalRuralForm · AvaliacaoForm · ComentarioForm
│ ├── views.py # lista · detalhe · CRUD · avaliação · comentários
│ ├── urls.py
│ └── admin.py
│
├── circular/ # horários do circular
│ ├── models.py
│ ├── views.py # Posicionamento do Circular · API
│ ├── urls.py
│ └── admin.py
├── static/
│ ├── css/
│ │ ├── base.css # navbar · sidebar · botões · alertas
│ │ ├── accounts.css # login e cadastro
│ │ ├── mural.css # cards e grid do mural
│ │ ├── perfil.css # perfil e modal de exclusão
│ │ ├── locais_lista.css # grid de locais
│ │ ├── locais_detalhe.css # galeria · lightbox · avaliação · comentários
│ │ ├── locais_form.css # formulário de local
│ │ ├── horarios.css # tabela estrutural estilo excel do circular
│ │ └── horarios_live.css # estilos do banner, badge dinâmico e animações ao vivo
│ └── js/
│ ├── alerta.js # auto-fechamento de mensagens
│ ├── navbar.js # dropdown e menu mobile
│ ├── sidebar.js # sidebar lateral
│ ├── olho_login.js # toggle senha no login
│ ├── olho_cadastro.js # toggle senha + força no cadastro
│ ├── perfil.js # modal de exclusão de conta
│ ├── galeria.js # thumbnails + lightbox
│ ├── galeria_form.js # slots dinâmicos de foto
│ ├── estrelas.js # avaliação interativa
│ ├── comentarios.js # toggle de resposta inline
│ └── horarios_live.js # motor assíncrono de busca e polling do circular ao vivo
│
└── templates/
├── base.html
├── accounts/
│ ├── login.html
│ ├── cadastro.html
│ └── perfil.html
├── mural/
│ ├── index.html
│ ├── aviso_form.html
│ ├── confirmar_delete.html
│ ├── sugestao_form.html
│ ├── sugestoes_pendentes.html
│ └── sugestoes_arquivadas.html
├── locais/
│ ├── lista.html
│ ├── detalhe.html
│ ├── form_local.html
│ └── confirmar_delete_local.html
└── circular/
├── horarios.html
└── _banner_ao_vivo.html







