Visão Geral
SGBD: MySQL 8.0
Database: lab_hardware
Engine: InnoDB
Charset: utf8mb4
Schema: docker/mysql/init.sql
Tabelas
| Tabela | Descrição | Módulo | Status |
|---|---|---|---|
usuarios | Usuários do sistema (alunos, professores, administradores) | Autenticação | Ativa |
tipos_itens | Catálogo de tipos de equipamentos (Arduino, multímetro, etc.) | Itens | Ativa |
itens | Itens físicos com código de patrimônio, status e localização | Itens | Ativa |
equipamentos | Equipamentos simples (nome, descrição, quantidade, disponibilidade) | Empréstimos | Ativa |
emprestimos | Registro de empréstimos e devoluções (vinculado a equipamentos) | Empréstimos | Ativa |
login_attempts | Log de tentativas de login para rate limiting | Segurança | Ativa |
laboratorios | Laboratórios disponíveis para agendamento | Agendamentos | Schema pronto |
agendamentos | Agendamento de uso do laboratório por período | Agendamentos | Schema pronto |
forum | Fórum de discussão do projeto (Módulo 5 — externo) | Fórum | Planejada |
Dicionário de Dados — usuarios
Fonte: docker/mysql/init.sql
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
id | INT AUTO_INCREMENT | NOT NULL | Chave primária |
username | VARCHAR(50) | NOT NULL | Nome de usuário (UNIQUE) |
senha | VARCHAR(255) | NOT NULL | Hash bcrypt da senha |
tipo | ENUM('administrador','padrao') | NOT NULL | Perfil de acesso |
criado_em | TIMESTAMP | NOT NULL | Data de criação |
atualizado_em | TIMESTAMP | NOT NULL | Última atualização (ON UPDATE) |
Dicionário de Dados — tipos_itens
Fonte: docker/mysql/init.sql
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
id | INT AUTO_INCREMENT | NOT NULL | Chave primária |
nome | VARCHAR(100) | NOT NULL | Nome do tipo (UNIQUE) |
descricao | TEXT | NULL | Descrição do tipo |
criado_em | TIMESTAMP | NOT NULL | Data de criação |
atualizado_em | TIMESTAMP | NOT NULL | Última atualização |
Dicionário de Dados — itens
Fonte: docker/mysql/init.sql
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
id | INT AUTO_INCREMENT | NOT NULL | Chave primária |
codigo_patrimonio | VARCHAR(50) | NOT NULL | Código de patrimônio único (UNIQUE) |
nome | VARCHAR(100) | NOT NULL | Nome do item |
tipo_id | INT | NULL | FK → tipos_itens.id (ON DELETE SET NULL) |
status | ENUM('disponivel','emprestado','manutencao') | NOT NULL | Status atual do item |
descricao | TEXT | NULL | Descrição detalhada |
localizacao | VARCHAR(100) | NULL | Localização física no laboratório |
criado_em | TIMESTAMP | NOT NULL | Data de cadastro |
atualizado_em | TIMESTAMP | NOT NULL | Última atualização |
Dicionário de Dados — equipamentos
Fonte: docker/mysql/init.sql. Tabela simplificada usada pelo módulo de empréstimos.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
id | INT AUTO_INCREMENT | NOT NULL | Chave primária |
nome | VARCHAR(100) | NOT NULL | Nome do equipamento |
descricao | TEXT | NULL | Descrição detalhada |
quantidade | INT | NOT NULL | Quantidade total em estoque |
disponivel | INT | NOT NULL | Quantidade disponível para empréstimo |
criado_em | TIMESTAMP | NOT NULL | Data de criação |
atualizado_em | TIMESTAMP | NOT NULL | Última atualização |
Dicionário de Dados — emprestimos
Fonte: docker/mysql/init.sql. Vinculado à tabela equipamentos (simplificada).
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
id | INT AUTO_INCREMENT | NOT NULL | Chave primária |
usuario_id | INT | NOT NULL | FK → usuarios.id (ON DELETE CASCADE) |
equipamento_id | INT | NOT NULL | FK → equipamentos.id (ON DELETE CASCADE) |
data_emprestimo | TIMESTAMP | NOT NULL | Data/hora do empréstimo |
data_devolucao | TIMESTAMP | NULL | Data/hora da devolução (NULL = pendente) |
status | ENUM('pendente','devolvido','atrasado') | NOT NULL | Status do empréstimo |
observacao | TEXT | NULL | Observações sobre o empréstimo |
criado_em | TIMESTAMP | NOT NULL | Data de criação do registro |
atualizado_em | TIMESTAMP | NOT NULL | Última atualização |
Dicionário de Dados — login_attempts
Fonte: docker/mysql/migrations/01_add_login_attempts.sql. Criada automaticamente pelo rate limiter.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
id | INT AUTO_INCREMENT | NOT NULL | Chave primária |
ip_address | VARCHAR(45) | NOT NULL | Endereço IP da tentativa |
username | VARCHAR(50) | NOT NULL | Nome de usuário tentado |
attempted_at | TIMESTAMP | NOT NULL | Data/hora da tentativa (DEFAULT CURRENT) |
success | TINYINT(1) | NOT NULL | 1 = sucesso, 0 = falha |
Índices: idx_ip_time (ip_address, attempted_at), idx_username, idx_success
Dicionário de Dados — laboratorios
Fonte: docker/mysql/init.sql. Schema pronto, aguardando módulo de agendamentos.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
id | INT AUTO_INCREMENT | NOT NULL | Chave primária |
codigo | VARCHAR(20) | NOT NULL | Código do laboratório (UNIQUE) |
lugar | VARCHAR(100) | NOT NULL | Localização do laboratório |
nome | VARCHAR(100) | NOT NULL | Nome do laboratório |
tipo | ENUM('redes','hardware','robotica','informatica_normal') | NOT NULL | Tipo/Temática do laboratório |
tecnico_responsavel | VARCHAR(100) | NULL | Nome do técnico responsável |
informacao_adicional | TEXT | NULL | Informações complementares |
criado_em | TIMESTAMP | NOT NULL | Data de criação |
atualizado_em | TIMESTAMP | NOT NULL | Última atualização |
Dicionário de Dados — agendamentos
Fonte: docker/mysql/init.sql. Schema pronto, aguardando implementação do módulo.
| Coluna | Tipo | Nullable | Descrição |
|---|---|---|---|
id | INT AUTO_INCREMENT | NOT NULL | Chave primária |
usuario_id | INT | NOT NULL | FK → usuarios.id (ON DELETE CASCADE) |
laboratorio_id | INT | NOT NULL | FK → laboratorios.id (ON DELETE CASCADE) |
data_inicio | DATETIME | NOT NULL | Data/hora de início do agendamento |
data_fim | DATETIME | NOT NULL | Data/hora de fim do agendamento |
finalidade | VARCHAR(255) | NULL | Finalidade do uso do laboratório |
status | ENUM('pendente','aprovado','cancelado','concluido') | NOT NULL | Status da solicitação |
criado_em | TIMESTAMP | NOT NULL | Data de criação |
atualizado_em | TIMESTAMP | NOT NULL | Última atualização |
Relacionamentos (DER)
Módulo Itens
tipos_itens1 → Nitens
Módulo Empréstimos
usuarios1 → Nemprestimosequipamentos1 → Nemprestimos
Módulo Agendamentos (schema)
usuarios1 → Nagendamentoslaboratorios1 → Nagendamentos
Notas
itens (com código de patrimônio, usado pelo módulo Itens) e equipamentos (simplificada, usada pelo módulo Empréstimos). São estruturas paralelas que podem ser unificadas em versão futura.
role na tabela usuarios foi renomeada para tipo via migration migrations/2024-05-21-rename_role_to_tipo.sql. O código PHP correspondente foi atualizado (verificarPermissao(['administrador'])). Este é o formato canônico do sistema.
src/config/rate_limit.php e auditável via src/admin/login_log.php.