po / index.html
pintogames's picture
tenho uma ideia para um site que organiza o fluxo de saída de alunos. A ideia é que, quando um aluno quiser sair mais cedo, ele possa fazer uma solicitação através do site. A liberação da saída deve ser aprovada por um responsável, e o sistema oferecerá três opções de responsáveis (ex: pai/mãe, responsável legal, e coordenação escolar). A escola já utiliza uma nuvem para armazenar os dados dos alunos, então gostaria de integrar o site com essa base de dados para automatizar o processo - Initial Deployment
41fb46a verified
Raw
History Blame Contribute Delete
31.7 kB
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Liberação de Alunos - Sistema Escolar</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
.gradient-bg {
background: linear-gradient(135deg, #3b82f6 0%, #6366f1 100%);
}
.pulse-animation {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.notification-badge {
position: absolute;
top: -5px;
right: -5px;
width: 20px;
height: 20px;
background-color: #ef4444;
color: white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
}
.sidebar-item:hover {
background-color: rgba(255, 255, 255, 0.1);
border-left: 4px solid white;
}
.sidebar-item.active {
background-color: rgba(255, 255, 255, 0.2);
border-left: 4px solid white;
}
.request-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
}
.request-card {
transition: all 0.3s ease;
}
</style>
</head>
<body class="bg-gray-100 font-sans">
<div class="flex h-screen overflow-hidden">
<!-- Sidebar -->
<div class="hidden md:flex md:flex-shrink-0">
<div class="flex flex-col w-64 gradient-bg text-white">
<div class="flex items-center justify-center h-16 px-4">
<div class="flex items-center">
<i class="fas fa-school text-2xl mr-2"></i>
<span class="text-xl font-semibold">Sistema Escolar</span>
</div>
</div>
<div class="flex flex-col flex-grow px-4 py-4 overflow-y-auto">
<div class="space-y-1">
<div class="sidebar-item active flex items-center px-2 py-3 rounded-lg cursor-pointer">
<i class="fas fa-home mr-3"></i>
<span>Painel</span>
</div>
<div class="sidebar-item flex items-center px-2 py-3 rounded-lg cursor-pointer">
<i class="fas fa-user-graduate mr-3"></i>
<span>Alunos</span>
</div>
<div class="sidebar-item flex items-center px-2 py-3 rounded-lg cursor-pointer">
<i class="fas fa-calendar-alt mr-3"></i>
<span>Agenda</span>
</div>
<div class="sidebar-item flex items-center px-2 py-3 rounded-lg cursor-pointer relative">
<i class="fas fa-envelope mr-3"></i>
<span>Solicitações</span>
<div class="notification-badge">3</div>
</div>
<div class="sidebar-item flex items-center px-2 py-3 rounded-lg cursor-pointer">
<i class="fas fa-cog mr-3"></i>
<span>Configurações</span>
</div>
</div>
</div>
<div class="px-4 py-4 border-t border-blue-400">
<div class="flex items-center">
<img class="h-10 w-10 rounded-full" src="https://randomuser.me/api/portraits/women/44.jpg" alt="User profile">
<div class="ml-3">
<p class="text-sm font-medium">Maria Silva</p>
<p class="text-xs text-blue-200">Coordenadora</p>
</div>
</div>
</div>
</div>
</div>
<!-- Main content -->
<div class="flex flex-col flex-1 overflow-hidden">
<!-- Top navigation -->
<div class="flex items-center justify-between h-16 bg-white border-b border-gray-200 px-4">
<div class="flex items-center">
<button class="md:hidden text-gray-500 focus:outline-none">
<i class="fas fa-bars"></i>
</button>
<h1 class="ml-4 text-lg font-semibold text-gray-800">Liberação de Alunos</h1>
</div>
<div class="flex items-center space-x-4">
<button class="text-gray-500 focus:outline-none relative">
<i class="fas fa-bell"></i>
<div class="notification-badge">2</div>
</button>
<button class="text-gray-500 focus:outline-none">
<i class="fas fa-question-circle"></i>
</button>
</div>
</div>
<!-- Content -->
<div class="flex-1 overflow-y-auto p-4 md:p-6">
<div class="max-w-7xl mx-auto">
<!-- Header -->
<div class="flex flex-col md:flex-row md:items-center md:justify-between mb-6">
<div>
<h2 class="text-2xl font-bold text-gray-800">Solicitações de Saída</h2>
<p class="text-gray-600">Gerencie as solicitações de saída antecipada dos alunos</p>
</div>
<button id="newRequestBtn" class="mt-4 md:mt-0 bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg flex items-center pulse-animation">
<i class="fas fa-plus mr-2"></i> Nova Solicitação
</button>
</div>
<!-- Stats -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
<div class="bg-white rounded-lg shadow p-4">
<div class="flex items-center">
<div class="p-3 rounded-full bg-blue-100 text-blue-600 mr-4">
<i class="fas fa-clock"></i>
</div>
<div>
<p class="text-sm text-gray-500">Pendentes</p>
<p class="text-xl font-semibold">5</p>
</div>
</div>
</div>
<div class="bg-white rounded-lg shadow p-4">
<div class="flex items-center">
<div class="p-3 rounded-full bg-green-100 text-green-600 mr-4">
<i class="fas fa-check"></i>
</div>
<div>
<p class="text-sm text-gray-500">Aprovadas</p>
<p class="text-xl font-semibold">12</p>
</div>
</div>
</div>
<div class="bg-white rounded-lg shadow p-4">
<div class="flex items-center">
<div class="p-3 rounded-full bg-red-100 text-red-600 mr-4">
<i class="fas fa-times"></i>
</div>
<div>
<p class="text-sm text-gray-500">Recusadas</p>
<p class="text-xl font-semibold">3</p>
</div>
</div>
</div>
</div>
<!-- Requests -->
<div class="bg-white rounded-lg shadow overflow-hidden mb-6">
<div class="px-4 py-3 border-b border-gray-200 flex justify-between items-center">
<h3 class="font-semibold text-gray-800">Últimas Solicitações</h3>
<div class="relative">
<select class="block appearance-none bg-gray-100 border border-gray-200 text-gray-700 py-1 px-3 pr-8 rounded leading-tight focus:outline-none focus:bg-white focus:border-gray-500 text-sm">
<option>Filtrar por status</option>
<option>Todas</option>
<option>Pendentes</option>
<option>Aprovadas</option>
<option>Recusadas</option>
</select>
<div class="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700">
<i class="fas fa-chevron-down text-xs"></i>
</div>
</div>
</div>
<div class="divide-y divide-gray-200">
<!-- Request Item -->
<div class="request-card p-4 hover:bg-gray-50 cursor-pointer">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="mr-4">
<div class="h-10 w-10 rounded-full bg-blue-100 flex items-center justify-center text-blue-600">
<i class="fas fa-user-graduate"></i>
</div>
</div>
<div>
<p class="font-medium">João Pedro Silva</p>
<p class="text-sm text-gray-500">8º Ano - Turma A</p>
</div>
</div>
<div class="text-right">
<p class="text-sm font-medium text-yellow-600">Pendente</p>
<p class="text-xs text-gray-500">Hoje, 10:30</p>
</div>
</div>
<div class="mt-3 ml-14">
<p class="text-sm text-gray-700"><span class="font-medium">Motivo:</span> Consulta médica</p>
<p class="text-sm text-gray-700"><span class="font-medium">Responsável:</span> Mãe</p>
<div class="flex space-x-2 mt-2">
<button class="text-xs bg-green-100 text-green-700 px-2 py-1 rounded hover:bg-green-200">
<i class="fas fa-check mr-1"></i> Aprovar
</button>
<button class="text-xs bg-red-100 text-red-700 px-2 py-1 rounded hover:bg-red-200">
<i class="fas fa-times mr-1"></i> Recusar
</button>
<button class="text-xs bg-blue-100 text-blue-700 px-2 py-1 rounded hover:bg-blue-200">
<i class="fas fa-eye mr-1"></i> Detalhes
</button>
</div>
</div>
</div>
<!-- Request Item -->
<div class="request-card p-4 hover:bg-gray-50 cursor-pointer">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="mr-4">
<div class="h-10 w-10 rounded-full bg-blue-100 flex items-center justify-center text-blue-600">
<i class="fas fa-user-graduate"></i>
</div>
</div>
<div>
<p class="font-medium">Ana Carolina Oliveira</p>
<p class="text-sm text-gray-500">9º Ano - Turma B</p>
</div>
</div>
<div class="text-right">
<p class="text-sm font-medium text-green-600">Aprovada</p>
<p class="text-xs text-gray-500">Ontem, 14:15</p>
</div>
</div>
<div class="mt-3 ml-14">
<p class="text-sm text-gray-700"><span class="font-medium">Motivo:</span> Compromisso familiar</p>
<p class="text-sm text-gray-700"><span class="font-medium">Responsável:</span> Pai</p>
<div class="flex space-x-2 mt-2">
<button class="text-xs bg-blue-100 text-blue-700 px-2 py-1 rounded hover:bg-blue-200">
<i class="fas fa-eye mr-1"></i> Detalhes
</button>
</div>
</div>
</div>
<!-- Request Item -->
<div class="request-card p-4 hover:bg-gray-50 cursor-pointer">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="mr-4">
<div class="h-10 w-10 rounded-full bg-blue-100 flex items-center justify-center text-blue-600">
<i class="fas fa-user-graduate"></i>
</div>
</div>
<div>
<p class="font-medium">Lucas Mendes</p>
<p class="text-sm text-gray-500">7º Ano - Turma C</p>
</div>
</div>
<div class="text-right">
<p class="text-sm font-medium text-red-600">Recusada</p>
<p class="text-xs text-gray-500">Ontem, 09:45</p>
</div>
</div>
<div class="mt-3 ml-14">
<p class="text-sm text-gray-700"><span class="font-medium">Motivo:</span> Atividade extracurricular</p>
<p class="text-sm text-gray-700"><span class="font-medium">Responsável:</span> Coordenação</p>
<p class="text-sm text-red-500"><span class="font-medium">Justificativa:</span> Atividade não autorizada</p>
<div class="flex space-x-2 mt-2">
<button class="text-xs bg-blue-100 text-blue-700 px-2 py-1 rounded hover:bg-blue-200">
<i class="fas fa-eye mr-1"></i> Detalhes
</button>
</div>
</div>
</div>
</div>
<div class="px-4 py-3 bg-gray-50 text-center">
<button class="text-blue-600 hover:text-blue-800 text-sm font-medium">
Carregar mais solicitações <i class="fas fa-chevron-down ml-1"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- New Request Modal -->
<div id="newRequestModal" class="fixed inset-0 z-50 hidden overflow-y-auto">
<div class="flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
<div class="absolute inset-0 bg-gray-500 opacity-75"></div>
</div>
<span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
<div class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full">
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div class="sm:flex sm:items-start">
<div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
<i class="fas fa-sign-out-alt text-blue-600"></i>
</div>
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
<h3 class="text-lg leading-6 font-medium text-gray-900">Nova Solicitação de Saída</h3>
<div class="mt-2">
<form id="requestForm">
<div class="mb-4">
<label for="student" class="block text-sm font-medium text-gray-700">Aluno</label>
<select id="student" class="mt-1 block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm rounded-md border">
<option>Selecione um aluno</option>
<option>João Pedro Silva - 8º Ano A</option>
<option>Ana Carolina Oliveira - 9º Ano B</option>
<option>Lucas Mendes - 7º Ano C</option>
<option>Maria Fernanda Costa - 6º Ano A</option>
</select>
</div>
<div class="mb-4">
<label for="date" class="block text-sm font-medium text-gray-700">Data e Hora</label>
<div class="mt-1 flex rounded-md shadow-sm">
<input type="date" id="date" class="flex-1 min-w-0 block w-full px-3 py-2 rounded-none rounded-l-md border-gray-300 focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm border">
<input type="time" id="time" class="flex-1 min-w-0 block w-full px-3 py-2 rounded-none rounded-r-md border-gray-300 focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm border">
</div>
</div>
<div class="mb-4">
<label for="reason" class="block text-sm font-medium text-gray-700">Motivo</label>
<textarea id="reason" rows="3" class="mt-1 block w-full border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm p-2" placeholder="Descreva o motivo da saída antecipada"></textarea>
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700">Responsável pela liberação</label>
<div class="mt-2 space-y-2">
<div class="flex items-center">
<input id="mother" name="responsible" type="radio" class="focus:ring-blue-500 h-4 w-4 text-blue-600 border-gray-300">
<label for="mother" class="ml-3 block text-sm font-medium text-gray-700">Mãe</label>
</div>
<div class="flex items-center">
<input id="father" name="responsible" type="radio" class="focus:ring-blue-500 h-4 w-4 text-blue-600 border-gray-300">
<label for="father" class="ml-3 block text-sm font-medium text-gray-700">Pai</label>
</div>
<div class="flex items-center">
<input id="legal" name="responsible" type="radio" class="focus:ring-blue-500 h-4 w-4 text-blue-600 border-gray-300">
<label for="legal" class="ml-3 block text-sm font-medium text-gray-700">Responsável Legal</label>
</div>
<div class="flex items-center">
<input id="coordination" name="responsible" type="radio" class="focus:ring-blue-500 h-4 w-4 text-blue-600 border-gray-300">
<label for="coordination" class="ml-3 block text-sm font-medium text-gray-700">Coordenação Escolar</label>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
<button type="button" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
Enviar Solicitação
</button>
<button id="cancelRequestBtn" type="button" class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
Cancelar
</button>
</div>
</div>
</div>
</div>
<!-- Request Details Modal -->
<div id="detailsModal" class="fixed inset-0 z-50 hidden overflow-y-auto">
<div class="flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
<div class="absolute inset-0 bg-gray-500 opacity-75"></div>
</div>
<span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
<div class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full">
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div class="sm:flex sm:items-start">
<div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
<i class="fas fa-info-circle text-blue-600"></i>
</div>
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
<h3 class="text-lg leading-6 font-medium text-gray-900">Detalhes da Solicitação</h3>
<div class="mt-2">
<div class="space-y-4">
<div>
<p class="text-sm font-medium text-gray-500">Aluno</p>
<p class="mt-1 text-sm text-gray-900">João Pedro Silva - 8º Ano A</p>
</div>
<div>
<p class="text-sm font-medium text-gray-500">Data e Hora</p>
<p class="mt-1 text-sm text-gray-900">15/06/2023 às 10:30</p>
</div>
<div>
<p class="text-sm font-medium text-gray-500">Motivo</p>
<p class="mt-1 text-sm text-gray-900">Consulta médica com pediatra no Hospital Municipal</p>
</div>
<div>
<p class="text-sm font-medium text-gray-500">Responsável</p>
<p class="mt-1 text-sm text-gray-900">Mãe - Sra. Ana Silva</p>
</div>
<div>
<p class="text-sm font-medium text-gray-500">Status</p>
<p class="mt-1 text-sm font-medium text-yellow-600">Pendente de aprovação</p>
</div>
<div class="border-t border-gray-200 pt-4">
<p class="text-sm font-medium text-gray-500">Ações</p>
<div class="mt-2 flex space-x-2">
<button class="inline-flex items-center px-3 py-1 border border-transparent text-sm leading-4 font-medium rounded-md shadow-sm text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500">
<i class="fas fa-check mr-1"></i> Aprovar
</button>
<button class="inline-flex items-center px-3 py-1 border border-transparent text-sm leading-4 font-medium rounded-md shadow-sm text-white bg-red-600 hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500">
<i class="fas fa-times mr-1"></i> Recusar
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
<button id="closeDetailsBtn" type="button" class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
Fechar
</button>
</div>
</div>
</div>
</div>
<script>
// Modal handling
const newRequestBtn = document.getElementById('newRequestBtn');
const newRequestModal = document.getElementById('newRequestModal');
const cancelRequestBtn = document.getElementById('cancelRequestBtn');
const detailsModal = document.getElementById('detailsModal');
const closeDetailsBtn = document.getElementById('closeDetailsBtn');
// Show new request modal
newRequestBtn.addEventListener('click', () => {
newRequestModal.classList.remove('hidden');
});
// Hide new request modal
cancelRequestBtn.addEventListener('click', () => {
newRequestModal.classList.add('hidden');
});
// Show details modal (for demo purposes, would be dynamic in real app)
document.querySelectorAll('.request-card').forEach(card => {
card.addEventListener('click', () => {
detailsModal.classList.remove('hidden');
});
});
// Hide details modal
closeDetailsBtn.addEventListener('click', () => {
detailsModal.classList.add('hidden');
});
// Close modals when clicking outside
window.addEventListener('click', (event) => {
if (event.target === newRequestModal) {
newRequestModal.classList.add('hidden');
}
if (event.target === detailsModal) {
detailsModal.classList.add('hidden');
}
});
// Simulate loading students from cloud (integration point)
// In a real implementation, this would be an API call to the school's cloud system
function loadStudentsFromCloud() {
console.log('Carregando dados dos alunos da nuvem escolar...');
// Aqui você faria a integração com a API da nuvem da escola
// Exemplo:
// fetch('https://api.escola.com/alunos')
// .then(response => response.json())
// .then(data => populateStudentDropdown(data))
// .catch(error => console.error('Erro ao carregar alunos:', error));
}
// Initialize
document.addEventListener('DOMContentLoaded', () => {
loadStudentsFromCloud();
});
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=pintogames/po" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>