├── README.md ├── pagina_logada.php ├── images └── logo.webp ├── js ├── script.js └── buscar.js ├── css ├── pesquisa.css └── style.css ├── conectaBD.php ├── processa_login.php ├── processa_usuario.php ├── buscar_cliente.php ├── buscar_areas.php ├── buscar_funcionario.php ├── buscar_pizza.php ├── buscar_fornecedores.php ├── buscar.html ├── sql ├── atividade_avaliativa1.pgsql └── postgres.sql └── index.php /README.md: -------------------------------------------------------------------------------- 1 | projeto finalizado 🤙 2 | -------------------------------------------------------------------------------- /pagina_logada.php: -------------------------------------------------------------------------------- 1 |

Logado com sucesso

-------------------------------------------------------------------------------- /images/logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/epicestudar/Pizzaria/HEAD/images/logo.webp -------------------------------------------------------------------------------- /js/script.js: -------------------------------------------------------------------------------- 1 | const container = document.getElementById('container'); 2 | const registerBtn = document.getElementById('register'); 3 | const loginBtn = document.getElementById('login'); 4 | 5 | registerBtn.addEventListener('click', () => { 6 | container.classList.add("active"); 7 | }); 8 | 9 | loginBtn.addEventListener('click', () => { 10 | container.classList.remove("active"); 11 | }); -------------------------------------------------------------------------------- /css/pesquisa.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | flex-direction: column; 4 | align-items: center; 5 | justify-content: center; 6 | margin: 100px; 7 | } 8 | 9 | .search-form { 10 | display: flex; 11 | margin-bottom: 20px; 12 | } 13 | 14 | .search-form input[type="text"] { 15 | padding: 10px; 16 | font-size: 16px; 17 | border: 1px solid #ccc; 18 | border-radius: 5px; 19 | } 20 | 21 | .search-form button { 22 | padding: 10px 20px; 23 | font-size: 16px; 24 | background-color: #007bff; 25 | color: #fff; 26 | border: none; 27 | border-radius: 5px; 28 | cursor: pointer; 29 | margin-left: 10px; 30 | } 31 | 32 | .result { 33 | text-align: center; 34 | padding: 20px; 35 | border: 1px solid #ccc; 36 | border-radius: 5px; 37 | } -------------------------------------------------------------------------------- /conectaBD.php: -------------------------------------------------------------------------------- 1 | PDO::ERRMODE_EXCEPTION] 21 | ); 22 | echo "Conectado no banco de dados!!!"; 23 | 24 | $sql1 = "CREATE TABLE IF NOT EXISTS clientes (ID_CLIENTE serial PRIMARY KEY, 25 | NOME varchar(255), 26 | CPF varchar(255), 27 | EMAIL varchar(255), 28 | SENHA varchar(255))"; 29 | $stmt1 = $pdo->prepare($sql1); 30 | $stmt1->execute(); 31 | 32 | 33 | 34 | } catch (PDOException $e) { 35 | echo "Falha ao conectar ao banco de dados."; 36 | die($e->getMessage()); 37 | } -------------------------------------------------------------------------------- /processa_login.php: -------------------------------------------------------------------------------- 1 | prepare($sql); 11 | $stmt->bindValue(':email', $_POST['email']); 12 | $stmt->bindValue(':senha', md5($_POST['senha'])); // Note que você está usando md5 para criptografar a senha, o que não é o mais seguro atualmente 13 | $stmt->execute(); 14 | $user = $stmt->fetch(PDO::FETCH_ASSOC); 15 | 16 | if ($user) { 17 | // Usuário autenticado com sucesso 18 | $_SESSION['user_id'] = $user['ID_CLIENTE']; // Armazena o ID do usuário na sessão 19 | header("Location: pagina_logada.php"); // Redireciona para a página logada 20 | exit(); 21 | } else { 22 | // Credenciais inválidas 23 | header("Location: index.php?msgErro=Credenciais inválidas"); 24 | exit(); 25 | } 26 | } catch (PDOException $e) { 27 | header("Location: index.php?msgErro=Erro de acesso ao banco de dados"); 28 | exit(); 29 | } 30 | } else { 31 | header("Location: index.php?msgErro=Preencha todos os campos"); 32 | exit(); 33 | } 34 | -------------------------------------------------------------------------------- /processa_usuario.php: -------------------------------------------------------------------------------- 1 | prepare($sql); 19 | // Definir/organizar os dados p/ SQL 20 | $dados = array( 21 | ':nome' => $_POST['nome'], 22 | ':cpf' => $_POST['cpf'], 23 | ':email' => $_POST['email'], 24 | ':senha' => md5($_POST['senha']) //md5 é um padrão de criptografia 25 | ); 26 | // Tentar Executar a SQL (INSERT) 27 | // Realizar a inserção das informações no BD (com o PHP) 28 | if ($stmt->execute($dados)) { 29 | header("Location: index.php?msgSucesso=Cadastro realizado com sucesso!"); 30 | } 31 | } catch (PDOException $e) { 32 | //die($e->getMessage()); 33 | header("Location: index.php?msgErro=Falha ao cadastrar..."); 34 | } 35 | } else { 36 | header("Location: index.php?msgErro=Erro de acesso."); 37 | } 38 | die(); 39 | // Redirecionar para a página inicial (login) c/ mensagem erro/sucesso 40 | -------------------------------------------------------------------------------- /buscar_cliente.php: -------------------------------------------------------------------------------- 1 | setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 9 | 10 | // Prepara a consulta SQL com um marcador de posição para o sabor da pizza 11 | $stmt = $conn->prepare('SELECT * FROM clientes WHERE nome = :nome'); 12 | 13 | // Executa a consulta com o pizza da pizza fornecido 14 | $stmt->execute(['nome' => $_GET["nome"]]); 15 | 16 | // Obtém todas as linhas do resultado como um array associativo 17 | $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 18 | 19 | // Verifica se a consulta retornou resultados 20 | if ($rows) { 21 | // Retorna os dados dos pedidos como JSON 22 | echo json_encode($rows); 23 | } else { 24 | // Se nenhum pedido foi encontrado com o sabor da pizza especificado, retorna uma mensagem de erro 25 | echo json_encode(["error" => "Nenhum pedido encontrado com o nome do cliente especificado"]); 26 | } 27 | } else { 28 | // Se o método de requisição não for GET ou se o parâmetro "sabor" não foi enviado, retorna uma mensagem de erro 29 | echo json_encode(["error" => "Requisição inválida"]); 30 | } 31 | ?> -------------------------------------------------------------------------------- /buscar_areas.php: -------------------------------------------------------------------------------- 1 | setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 9 | 10 | // Prepara a consulta SQL com um marcador de posição para o sabor da pizza 11 | $stmt = $conn->prepare('SELECT * FROM areas WHERE id_area = :id_area'); 12 | 13 | // Executa a consulta com o pizza da pizza fornecido 14 | $stmt->execute(['id_area' => $_GET["id_area"]]); 15 | 16 | // Obtém todas as linhas do resultado como um array associativo 17 | $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 18 | 19 | // Verifica se a consulta retornou resultados 20 | if ($rows) { 21 | // Retorna os dados dos pedidos como JSON 22 | echo json_encode($rows); 23 | } else { 24 | // Se nenhum pedido foi encontrado com o sabor da pizza especificado, retorna uma mensagem de erro 25 | echo json_encode(["error" => "Nenhum pedido encontrado com o id da area especificado"]); 26 | } 27 | } else { 28 | // Se o método de requisição não for GET ou se o parâmetro "sabor" não foi enviado, retorna uma mensagem de erro 29 | echo json_encode(["error" => "Requisição inválida"]); 30 | } 31 | ?> -------------------------------------------------------------------------------- /buscar_funcionario.php: -------------------------------------------------------------------------------- 1 | setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 9 | 10 | // Prepara a consulta SQL com um marcador de posição para o sabor da pizza 11 | $stmt = $conn->prepare('SELECT * FROM funcionarios WHERE nome = :nome'); 12 | 13 | // Executa a consulta com o pizza da pizza fornecido 14 | $stmt->execute(['nome' => $_GET["nome"]]); 15 | 16 | // Obtém todas as linhas do resultado como um array associativo 17 | $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 18 | 19 | // Verifica se a consulta retornou resultados 20 | if ($rows) { 21 | // Retorna os dados dos pedidos como JSON 22 | echo json_encode($rows); 23 | } else { 24 | // Se nenhum pedido foi encontrado com o sabor da pizza especificado, retorna uma mensagem de erro 25 | echo json_encode(["error" => "Nenhum pedido encontrado com o nome do cliente especificado"]); 26 | } 27 | } else { 28 | // Se o método de requisição não for GET ou se o parâmetro "sabor" não foi enviado, retorna uma mensagem de erro 29 | echo json_encode(["error" => "Requisição inválida"]); 30 | } 31 | ?> -------------------------------------------------------------------------------- /buscar_pizza.php: -------------------------------------------------------------------------------- 1 | setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 9 | 10 | // Prepara a consulta SQL com um marcador de posição para o sabor da pizza 11 | $stmt = $conn->prepare('SELECT * FROM pedidos WHERE sabor_pizza = :sabor_pizza'); 12 | 13 | // Executa a consulta com o pizza da pizza fornecido 14 | $stmt->execute(['sabor_pizza' => $_GET["sabor_pizza"]]); 15 | 16 | // Obtém todas as linhas do resultado como um array associativo 17 | $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 18 | 19 | // Verifica se a consulta retornou resultados 20 | if ($rows) { 21 | // Retorna os dados dos pedidos como JSON 22 | echo json_encode($rows); 23 | } else { 24 | // Se nenhum pedido foi encontrado com o sabor da pizza especificado, retorna uma mensagem de erro 25 | echo json_encode(["error" => "Nenhum pedido encontrado com o sabor da pizza especificado"]); 26 | } 27 | } else { 28 | // Se o método de requisição não for GET ou se o parâmetro "sabor" não foi enviado, retorna uma mensagem de erro 29 | echo json_encode(["error" => "Requisição inválida"]); 30 | } 31 | ?> -------------------------------------------------------------------------------- /buscar_fornecedores.php: -------------------------------------------------------------------------------- 1 | setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 9 | 10 | // Prepara a consulta SQL com um marcador de posição para o sabor da pizza 11 | $stmt = $conn->prepare('SELECT * FROM fornecedores WHERE id_fornecedor = :id_fornecedor'); 12 | 13 | // Executa a consulta com o pizza da pizza fornecido 14 | $stmt->execute(['id_fornecedor' => $_GET["id_fornecedor"]]); 15 | 16 | // Obtém todas as linhas do resultado como um array associativo 17 | $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 18 | 19 | // Verifica se a consulta retornou resultados 20 | if ($rows) { 21 | // Retorna os dados dos pedidos como JSON 22 | echo json_encode($rows); 23 | } else { 24 | // Se nenhum pedido foi encontrado com o sabor da pizza especificado, retorna uma mensagem de erro 25 | echo json_encode(["error" => "Nenhum pedido encontrado com o nome do cliente especificado"]); 26 | } 27 | } else { 28 | // Se o método de requisição não for GET ou se o parâmetro "sabor" não foi enviado, retorna uma mensagem de erro 29 | echo json_encode(["error" => "Requisição inválida"]); 30 | } 31 | ?> -------------------------------------------------------------------------------- /buscar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Consulta de Pedidos 7 | 8 | 9 | 10 |
11 |
12 | 13 | 14 |
15 | 16 |
17 |
18 |
19 |
20 | 21 | 22 |
23 | 24 |
25 |
26 |
27 |
28 | 29 | 30 |
31 | 32 |
33 |
34 |
35 |
36 | 37 | 38 |
39 | 40 |
41 |
42 |
43 |
44 | 45 | 46 |
47 | 48 |
49 |
50 | 51 | 52 | -------------------------------------------------------------------------------- /sql/atividade_avaliativa1.pgsql: -------------------------------------------------------------------------------- 1 | select * from clientes; 2 | select * from pedidos; 3 | select * from funcionarios; 4 | select * from areas; 5 | 6 | INSERT INTO clientes (id_cliente, nome, cpf, email, senha) 7 | VALUES 8 | (5, 'Maria Silva', '123.456.789-10', 'maria@example.com', 'senha123'), 9 | (6, 'João Oliveira', '987.654.321-00', 'joao@example.com', 'senha456'), 10 | (7, 'Ana Souza', '111.222.333-44', 'ana@example.com', 'senha789'), 11 | (8, 'Carlos Santos', '555.666.777-88', 'carlos@example.com', 'senhaABC'), 12 | (9, 'Amanda Pereira', '999.888.777-66', 'amanda@example.com', 'senhaXYZ'); 13 | 14 | INSERT INTO pedidos (id_pedido, id_cliente, quantidade, data_pedido, valor_total, sabor_pizza) 15 | VALUES 16 | (7, 7, 2, '2024-04-16', 45.50, 'Calabresa'), 17 | (8, 8, 1, '2024-04-15', 20.00, 'Margherita'), 18 | (9, 9, 3, '2024-04-14', 60.00, 'Quatro Queijos'); 19 | 20 | DELETE FROM pedidos; 21 | 22 | INSERT INTO pedidos (id_pedido, id_cliente, quantidade, data_pedido, valor_total, sabor_pizza, status, id_funcionario) 23 | VALUES 24 | (1, 1, 2, '2024-04-16', 45.50, 'Calabresa', 'pendente', 1), 25 | (2, 2, 1, '2024-04-15', 20.00, 'Margherita', 'pendente', 2), 26 | (3, 3, 3, '2024-04-14', 60.00, 'Quatro Queijos', 'pendente', 3), 27 | (4, 4, 1, '2024-04-13', 25.00, 'Pepperoni', 'pendente', 4), 28 | (5, 5, 2, '2024-04-12', 40.00, 'Frango com Catupiry', 'pendente', 5), 29 | (6, 6, 3, '2024-04-11', 55.00, 'Calabresa', 'pendente', 1), 30 | (7, 7, 1, '2024-04-10', 20.00, 'Margherita', 'pendente', 2), 31 | (8, 8, 2, '2024-04-09', 35.00, 'Portuguesa', 'pendente', 3), 32 | (9, 9, 3, '2024-04-08', 50.00, 'Quatro Queijos', 'pendente', 4), 33 | (10, 10, 1, '2024-04-07', 25.00, 'Pepperoni', 'pendente', 5); 34 | 35 | 36 | DELETE FROM pedidos 37 | WHERE id_pedido IN (SELECT id_pedido FROM pedidos ORDER BY id_pedido DESC LIMIT 5); 38 | 39 | INSERT INTO funcionarios (id_funcionario, nome, cargo, salario, idade, area_id) VALUES 40 | (1, 'Maria Silva', 'Gerente de Vendas', 5000.00, 35, 1), 41 | (2, 'João Oliveira', 'Analista de Marketing', 4000.00, 28, 2), 42 | (3, 'Ana Souza', 'Desenvolvedor de Software', 6000.00, 32, 3), 43 | (4, 'Carlos Santos', 'Analista Financeiro', 4500.00, 40, 4), 44 | (5, 'Amanda Pereira', 'Assistente Administrativo', 3000.00, 25, 5); 45 | 46 | INSERT INTO areas (area_funcionario) VALUES 47 | ('Vendas'), 48 | ('Marketing'), 49 | ('Desenvolvimento'), 50 | ('Financeiro'), 51 | ('Administrativo'); 52 | 53 | 54 | delete from pedidos; 55 | 56 | INSERT INTO pedidos (id_pedido, id_cliente, quantidade, data_pedido, valor_total, sabor_pizza, status, id_funcionario, ingrediente) 57 | VALUES 58 | (1, 1, 2, '2024-04-16', 45.50, 'Calabresa', 'pendente', 1, 'Molho de tomate, calabresa, cebola, queijo'), 59 | (2, 2, 1, '2024-04-15', 20.00, 'Margherita', 'pendente', 2, 'Molho de tomate, muçarela, tomate, manjericão'), 60 | (3, 3, 3, '2024-04-14', 60.00, 'Quatro Queijos', 'pendente', 3, 'Molho de tomate, muçarela, provolone, parmesão, gorgonzola'), 61 | (4, 4, 1, '2024-04-13', 25.00, 'Pepperoni', 'pendente', 4, 'Molho de tomate, pepperoni, muçarela'), 62 | (5, 5, 2, '2024-04-12', 40.00, 'Frango com Catupiry', 'pendente', 5, 'Molho de tomate, frango desfiado, catupiry'), 63 | (6, 1, 3, '2024-04-11', 55.00, 'Calabresa', 'pendente', 1, 'Molho de tomate, calabresa, cebola, queijo'), 64 | (7, 2, 1, '2024-04-10', 20.00, 'Margherita', 'pendente', 2, 'Molho de tomate, muçarela, tomate, manjericão'), 65 | (8, 3, 2, '2024-04-09', 35.00, 'Portuguesa', 'pendente', 3, 'Molho de tomate, presunto, muçarela, ovos, cebola, ervilha, azeitona, tomate'), 66 | (9, 4, 3, '2024-04-08', 50.00, 'Quatro Queijos', 'pendente', 4, 'Molho de tomate, muçarela, provolone, parmesão, gorgonzola'), 67 | (10, 5, 1, '2024-04-07', 25.00, 'Pepperoni', 'pendente', 5, 'Molho de tomate, pepperoni, muçarela'); 68 | 69 | 70 | -- primeira lista 71 | -- exercício 1 72 | select pedidos.sabor_pizza, clientes.nome, pedidos.valor_total, pedidos.data_pedido, clientes.cpf 73 | from clientes inner join pedidos on clientes.id_cliente = pedidos.id_pedido; 74 | 75 | 76 | -- exercicio 2 77 | select clientes.nome, pedidos.id_cliente, pedidos.sabor_pizza, pedidos.quantidade, pedidos.valor_total 78 | from clientes inner join pedidos on clientes.id_cliente = pedidos.id_pedido; 79 | 80 | -- exercicio 3 81 | select funcionarios.nome, funcionarios.cargo, funcionarios.salario, areas.area_funcionario 82 | from funcionarios inner join areas on id_funcionario = id_area; 83 | 84 | -- exercicio 4 85 | select funcionarios.nome, pedidos.status, pedidos.sabor_pizza 86 | from pedidos inner join funcionarios on pedidos.id_pedido = funcionarios.id_funcionario; 87 | 88 | -- exercicio 5 89 | select clientes.nome, pedidos.sabor_pizza 90 | from clientes inner join pedidos on clientes.id_cliente = pedidos.id_pedido; 91 | 92 | -- exercicio 6 93 | select pedidos.sabor_pizza, pedidos.ingrediente 94 | from pedidos inner join clientes on clientes.id_cliente = pedidos.id_pedido; 95 | 96 | -- exercicio 7 97 | select pedidos.id_pedido, pedidos.entrega 98 | from pedidos inner join clientes on clientes.id_cliente = pedidos.id_pedido; 99 | 100 | -- exercicio 8 101 | select funcionarios.nome, funcionarios.supervisores 102 | from funcionarios inner join pedidos on funcionarios.id_funcionario = pedidos.id_pedido; 103 | 104 | -- exercicio 9 105 | select pedidos.sabor_pizza, pedidos.tamanho 106 | from pedidos inner join clientes on pedidos.id_pedido = clientes.id_cliente; 107 | 108 | -- exercicio 10 109 | select pedidos.sabor_pizza, pedidos.promocao 110 | from pedidos inner join clientes on pedidos.id_pedido = clientes.id_cliente; 111 | 112 | -- segunda lista 113 | -- exercicio 1 114 | SELECT * from clientes; 115 | 116 | -- exercicio 2 117 | select data_pedido from pedidos 118 | where data_pedido >= '2001-08-08'; 119 | 120 | -- exercicio 3 121 | select sabor_pizza from pedidos 122 | where pedidos.sabor_pizza = 'Calabresa'; 123 | 124 | -- exercicio 4 125 | SELECT id_cliente, SUM(valor_total) AS total_gasto 126 | FROM pedidos 127 | WHERE id_cliente = '1' 128 | GROUP BY id_cliente; 129 | 130 | -- exercicio 5 131 | SELECT sabor_pizza, COUNT(*) AS total_pedidos 132 | FROM pedidos 133 | GROUP BY sabor_pizza 134 | ORDER BY total_pedidos DESC; 135 | 136 | -- exercicio 6 137 | SELECT COUNT(*) AS pizzas_disponiveis 138 | FROM pedidos 139 | WHERE entrega = 'disponivel'; 140 | 141 | -- exercicio 7 142 | select * from funcionarios; 143 | 144 | -- exercicio 8 145 | SELECT hora_abertura, hora_fechamento 146 | FROM horarios_funcionamento; 147 | 148 | -- exercicio 9 149 | SELECT status 150 | FROM pedidos 151 | WHERE status = 'pendente'; 152 | 153 | -- exercicio 10 154 | SELECT AVG(EXTRACT(EPOCH FROM (NOW() - data_pedido))) / 60 AS tempo_medio_espera_minutos 155 | FROM pedidos 156 | WHERE status = 'pendente'; 157 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Document 10 | 11 | 12 | 13 |
14 | 23 |
24 | 25 |
26 |
27 | 28 | 31 | 32 | 33 | 36 | 37 |
38 | 55 | 71 |
72 |
73 |
74 |

Bem-vindo(a) de volta!

75 |

Entre com suas informações de usuário para usar todas as ferramentas do nosso site

76 | 77 |
78 |
79 |

Olá, amigo(a)!

80 |

Registre-se em nosso site para ficar por dentro das novidades da nossa pizzaria

81 | 82 |
83 |
84 |
85 |
86 | 87 | 88 | 89 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /js/buscar.js: -------------------------------------------------------------------------------- 1 | document.getElementById('searchFormPizza').addEventListener('submit', function(event) { 2 | event.preventDefault(); 3 | 4 | var saborPizza = document.getElementById('pizza').value; 5 | 6 | // Aqui você fará uma solicitação AJAX para o backend para buscar os dados do pedido 7 | // e exibir os resultados na página 8 | // Exemplo: 9 | fetch('buscar_pizza.php?sabor_pizza=' + encodeURIComponent(saborPizza)) 10 | .then(response => response.json()) 11 | .then(data => { 12 | if (data.error) { 13 | document.getElementById('resultPizza').innerHTML = data.error; 14 | } else { 15 | // Construa a lista de pedidos 16 | var html = '

Pedidos

'; 17 | html += ''; 29 | document.getElementById('resultPizza').innerHTML = html; 30 | } 31 | }) 32 | .catch(error => { 33 | console.error('Erro ao buscar dados do pedido:', error); 34 | }); 35 | }); 36 | 37 | document.getElementById('searchFormCliente').addEventListener('submit', function(event) { 38 | event.preventDefault(); 39 | 40 | var nomeCliente = document.getElementById('cliente').value; 41 | 42 | // Aqui você fará uma solicitação AJAX para o backend para buscar os dados do pedido 43 | // e exibir os resultados na página 44 | // Exemplo: 45 | fetch('buscar_cliente.php?nome=' + encodeURIComponent(nomeCliente)) 46 | .then(response => response.json()) 47 | .then(data => { 48 | if (data.error) { 49 | document.getElementById('resultCliente').innerHTML = data.error; 50 | } else { 51 | // Construa a lista de pedidos 52 | var html = '

Clientes

'; 53 | html += ''; 62 | document.getElementById('resultCliente').innerHTML = html; 63 | } 64 | }) 65 | .catch(error => { 66 | console.error('Erro ao buscar dados do pedido:', error); 67 | }); 68 | }); 69 | 70 | document.getElementById('searchFormFuncionario').addEventListener('submit', function(event) { 71 | event.preventDefault(); 72 | 73 | var nomeFuncionario = document.getElementById('funcionario').value; 74 | 75 | // Aqui você fará uma solicitação AJAX para o backend para buscar os dados do pedido 76 | // e exibir os resultados na página 77 | // Exemplo: 78 | fetch('buscar_funcionario.php?nome=' + encodeURIComponent(nomeFuncionario)) 79 | .then(response => response.json()) 80 | .then(data => { 81 | if (data.error) { 82 | document.getElementById('resultFuncionario').innerHTML = data.error; 83 | } else { 84 | // Construa a lista de pedidos 85 | var html = '

Funcionarios

'; 86 | html += ''; 95 | document.getElementById('resultFuncionario').innerHTML = html; 96 | } 97 | }) 98 | .catch(error => { 99 | console.error('Erro ao buscar dados do pedido:', error); 100 | }); 101 | }); 102 | 103 | document.getElementById('searchFormArea').addEventListener('submit', function(event) { 104 | event.preventDefault(); 105 | 106 | var idArea = document.getElementById('area').value; 107 | 108 | // Aqui você fará uma solicitação AJAX para o backend para buscar os dados do pedido 109 | // e exibir os resultados na página 110 | // Exemplo: 111 | fetch('buscar_areas.php?id_area=' + encodeURIComponent(idArea)) 112 | .then(response => response.json()) 113 | .then(data => { 114 | if (data.error) { 115 | document.getElementById('resultArea').innerHTML = data.error; 116 | } else { 117 | // Construa a lista de pedidos 118 | var html = '

Areas

'; 119 | html += ''; 126 | document.getElementById('resultArea').innerHTML = html; 127 | } 128 | }) 129 | .catch(error => { 130 | console.error('Erro ao buscar dados do pedido:', error); 131 | }); 132 | }); 133 | 134 | document.getElementById('searchFormFornecedor').addEventListener('submit', function(event) { 135 | event.preventDefault(); 136 | 137 | var idFornecedor = document.getElementById('fornecedor').value; 138 | 139 | // Aqui você fará uma solicitação AJAX para o backend para buscar os dados do pedido 140 | // e exibir os resultados na página 141 | // Exemplo: 142 | fetch('buscar_fornecedores.php?id_fornecedor=' + encodeURIComponent(idFornecedor)) 143 | .then(response => response.json()) 144 | .then(data => { 145 | if (data.error) { 146 | document.getElementById('resultFornecedor').innerHTML = data.error; 147 | } else { 148 | // Construa a lista de pedidos 149 | var html = '

Fornecedores

'; 150 | html += ''; 157 | document.getElementById('resultFornecedor').innerHTML = html; 158 | } 159 | }) 160 | .catch(error => { 161 | console.error('Erro ao buscar dados do pedido:', error); 162 | }); 163 | }); -------------------------------------------------------------------------------- /sql/postgres.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE funcionarios ( 2 | id_funcionario INT PRIMARY KEY, 3 | nome VARCHAR(100), 4 | cargo VARCHAR(100), 5 | salario DECIMAL(10, 2), 6 | idade INT 7 | ); 8 | 9 | CREATE TABLE areas ( 10 | id_area SERIAL PRIMARY KEY, 11 | area_funcionario VARCHAR(100) 12 | ); 13 | 14 | ALTER TABLE funcionarios 15 | ADD COLUMN area_id INT, 16 | ADD CONSTRAINT fk_area_id FOREIGN KEY (area_id) REFERENCES areas(id_area); 17 | 18 | ALTER TABLE pedidos 19 | ADD COLUMN status VARCHAR(20) DEFAULT 'pendente'; 20 | 21 | ALTER TABLE pedidos 22 | ADD COLUMN id_funcionario INT, 23 | ADD CONSTRAINT fk_id_funcionario FOREIGN KEY (id_funcionario) REFERENCES funcionarios(id_funcionario); 24 | 25 | 26 | drop table pizzas_cardapio; 27 | 28 | ALTER TABLE pedidos 29 | ADD COLUMN ingrediente VARCHAR(100); 30 | 31 | ALTER TABLE pedidos 32 | ADD COLUMN entrega VARCHAR(20) DEFAULT 'disponivel'; 33 | 34 | ALTER TABLE funcionarios 35 | ADD COLUMN supervisores VARCHAR(100) DEFAULT 'Chefe do Departamento'; 36 | 37 | ALTER TABLE pedidos 38 | ADD COLUMN tamanho VARCHAR(20) DEFAULT 'Grande'; 39 | 40 | ALTER TABLE pedidos 41 | ADD COLUMN promocao VARCHAR(20) DEFAULT 'Sim'; 42 | 43 | CREATE TABLE horarios_funcionamento ( 44 | hora_abertura TIME DEFAULT '07:30', 45 | hora_fechamento TIME DEFAULT '22:00' 46 | ); 47 | 48 | select * from clientes; 49 | select * from pedidos; 50 | select * from funcionarios; 51 | select * from areas; 52 | 53 | INSERT INTO clientes (id_cliente, nome, cpf, email, senha) 54 | VALUES 55 | (5, 'Maria Silva', '123.456.789-10', 'maria@example.com', 'senha123'), 56 | (6, 'João Oliveira', '987.654.321-00', 'joao@example.com', 'senha456'), 57 | (7, 'Ana Souza', '111.222.333-44', 'ana@example.com', 'senha789'), 58 | (8, 'Carlos Santos', '555.666.777-88', 'carlos@example.com', 'senhaABC'), 59 | (9, 'Amanda Pereira', '999.888.777-66', 'amanda@example.com', 'senhaXYZ'); 60 | 61 | INSERT INTO pedidos (id_pedido, id_cliente, quantidade, data_pedido, valor_total, sabor_pizza) 62 | VALUES 63 | (7, 7, 2, '2024-04-16', 45.50, 'Calabresa'), 64 | (8, 8, 1, '2024-04-15', 20.00, 'Margherita'), 65 | (9, 9, 3, '2024-04-14', 60.00, 'Quatro Queijos'); 66 | 67 | DELETE FROM pedidos; 68 | 69 | INSERT INTO pedidos (id_pedido, id_cliente, quantidade, data_pedido, valor_total, sabor_pizza, status, id_funcionario) 70 | VALUES 71 | (1, 1, 2, '2024-04-16', 45.50, 'Calabresa', 'pendente', 1), 72 | (2, 2, 1, '2024-04-15', 20.00, 'Margherita', 'pendente', 2), 73 | (3, 3, 3, '2024-04-14', 60.00, 'Quatro Queijos', 'pendente', 3), 74 | (4, 4, 1, '2024-04-13', 25.00, 'Pepperoni', 'pendente', 4), 75 | (5, 5, 2, '2024-04-12', 40.00, 'Frango com Catupiry', 'pendente', 5), 76 | (6, 6, 3, '2024-04-11', 55.00, 'Calabresa', 'pendente', 1), 77 | (7, 7, 1, '2024-04-10', 20.00, 'Margherita', 'pendente', 2), 78 | (8, 8, 2, '2024-04-09', 35.00, 'Portuguesa', 'pendente', 3), 79 | (9, 9, 3, '2024-04-08', 50.00, 'Quatro Queijos', 'pendente', 4), 80 | (10, 10, 1, '2024-04-07', 25.00, 'Pepperoni', 'pendente', 5); 81 | 82 | 83 | DELETE FROM pedidos 84 | WHERE id_pedido IN (SELECT id_pedido FROM pedidos ORDER BY id_pedido DESC LIMIT 5); 85 | 86 | INSERT INTO funcionarios (id_funcionario, nome, cargo, salario, idade, area_id) VALUES 87 | (1, 'Maria Silva', 'Gerente de Vendas', 5000.00, 35, 1), 88 | (2, 'João Oliveira', 'Analista de Marketing', 4000.00, 28, 2), 89 | (3, 'Ana Souza', 'Desenvolvedor de Software', 6000.00, 32, 3), 90 | (4, 'Carlos Santos', 'Analista Financeiro', 4500.00, 40, 4), 91 | (5, 'Amanda Pereira', 'Assistente Administrativo', 3000.00, 25, 5); 92 | 93 | INSERT INTO areas (area_funcionario) VALUES 94 | ('Vendas'), 95 | ('Marketing'), 96 | ('Desenvolvimento'), 97 | ('Financeiro'), 98 | ('Administrativo'); 99 | 100 | 101 | delete from pedidos; 102 | 103 | INSERT INTO pedidos (id_pedido, id_cliente, quantidade, data_pedido, valor_total, sabor_pizza, status, id_funcionario, ingrediente) 104 | VALUES 105 | (1, 1, 2, '2024-04-16', 45.50, 'Calabresa', 'pendente', 1, 'Molho de tomate, calabresa, cebola, queijo'), 106 | (2, 2, 1, '2024-04-15', 20.00, 'Margherita', 'pendente', 2, 'Molho de tomate, muçarela, tomate, manjericão'), 107 | (3, 3, 3, '2024-04-14', 60.00, 'Quatro Queijos', 'pendente', 3, 'Molho de tomate, muçarela, provolone, parmesão, gorgonzola'), 108 | (4, 4, 1, '2024-04-13', 25.00, 'Pepperoni', 'pendente', 4, 'Molho de tomate, pepperoni, muçarela'), 109 | (5, 5, 2, '2024-04-12', 40.00, 'Frango com Catupiry', 'pendente', 5, 'Molho de tomate, frango desfiado, catupiry'), 110 | (6, 1, 3, '2024-04-11', 55.00, 'Calabresa', 'pendente', 1, 'Molho de tomate, calabresa, cebola, queijo'), 111 | (7, 2, 1, '2024-04-10', 20.00, 'Margherita', 'pendente', 2, 'Molho de tomate, muçarela, tomate, manjericão'), 112 | (8, 3, 2, '2024-04-09', 35.00, 'Portuguesa', 'pendente', 3, 'Molho de tomate, presunto, muçarela, ovos, cebola, ervilha, azeitona, tomate'), 113 | (9, 4, 3, '2024-04-08', 50.00, 'Quatro Queijos', 'pendente', 4, 'Molho de tomate, muçarela, provolone, parmesão, gorgonzola'), 114 | (10, 5, 1, '2024-04-07', 25.00, 'Pepperoni', 'pendente', 5, 'Molho de tomate, pepperoni, muçarela'); 115 | 116 | 117 | -- primeira lista 118 | -- exercício 1 119 | select pedidos.sabor_pizza, clientes.nome, pedidos.valor_total, pedidos.data_pedido, clientes.cpf 120 | from clientes inner join pedidos on clientes.id_cliente = pedidos.id_pedido; 121 | 122 | 123 | -- exercicio 2 124 | select clientes.nome, pedidos.id_cliente, pedidos.sabor_pizza, pedidos.quantidade, pedidos.valor_total 125 | from clientes inner join pedidos on clientes.id_cliente = pedidos.id_pedido; 126 | 127 | -- exercicio 3 128 | select funcionarios.nome, funcionarios.cargo, funcionarios.salario, areas.area_funcionario 129 | from funcionarios inner join areas on id_funcionario = id_area; 130 | 131 | -- exercicio 4 132 | select funcionarios.nome, pedidos.status, pedidos.sabor_pizza 133 | from pedidos inner join funcionarios on pedidos.id_pedido = funcionarios.id_funcionario; 134 | 135 | -- exercicio 5 136 | select clientes.nome, pedidos.sabor_pizza 137 | from clientes inner join pedidos on clientes.id_cliente = pedidos.id_pedido; 138 | 139 | -- exercicio 6 140 | select pedidos.sabor_pizza, pedidos.ingrediente 141 | from pedidos inner join clientes on clientes.id_cliente = pedidos.id_pedido; 142 | 143 | -- exercicio 7 144 | select pedidos.id_pedido, pedidos.entrega 145 | from pedidos inner join clientes on clientes.id_cliente = pedidos.id_pedido; 146 | 147 | -- exercicio 8 148 | select funcionarios.nome, funcionarios.supervisores 149 | from funcionarios inner join pedidos on funcionarios.id_funcionario = pedidos.id_pedido; 150 | 151 | -- exercicio 9 152 | select pedidos.sabor_pizza, pedidos.tamanho 153 | from pedidos inner join clientes on pedidos.id_pedido = clientes.id_cliente; 154 | 155 | -- exercicio 10 156 | select pedidos.sabor_pizza, pedidos.promocao 157 | from pedidos inner join clientes on pedidos.id_pedido = clientes.id_cliente; 158 | 159 | -- segunda lista 160 | -- exercicio 1 161 | SELECT * from clientes; 162 | 163 | -- exercicio 2 164 | select data_pedido from pedidos 165 | where data_pedido >= '2001-08-08'; 166 | 167 | -- exercicio 3 168 | select sabor_pizza from pedidos 169 | where pedidos.sabor_pizza = 'Calabresa'; 170 | 171 | -- exercicio 4 172 | SELECT id_cliente, SUM(valor_total) AS total_gasto 173 | FROM pedidos 174 | WHERE id_cliente = '1' 175 | GROUP BY id_cliente; 176 | 177 | -- exercicio 5 178 | SELECT sabor_pizza, COUNT(*) AS total_pedidos 179 | FROM pedidos 180 | GROUP BY sabor_pizza 181 | ORDER BY total_pedidos DESC; 182 | 183 | -- exercicio 6 184 | SELECT COUNT(*) AS pizzas_disponiveis 185 | FROM pedidos 186 | WHERE entrega = 'disponivel'; 187 | 188 | -- exercicio 7 189 | select * from funcionarios; 190 | 191 | -- exercicio 8 192 | SELECT hora_abertura, hora_fechamento 193 | FROM horarios_funcionamento; 194 | 195 | -- exercicio 9 196 | SELECT status 197 | FROM pedidos 198 | WHERE status = 'pendente'; 199 | 200 | -- exercicio 10 201 | SELECT AVG(EXTRACT(EPOCH FROM (NOW() - data_pedido))) / 60 AS tempo_medio_espera_minutos 202 | FROM pedidos 203 | WHERE status = 'pendente'; 204 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap'); 2 | @import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600&family=Poppins:ital,wght@1,600&display=swap'); 3 | 4 | * { 5 | margin: 0; 6 | padding: 0; 7 | box-sizing: border-box; 8 | font-family: 'Montserrat', sans-serif; 9 | } 10 | 11 | body{ 12 | background-color: #c9d6ff; 13 | background: linear-gradient(to right, #e2e2e2, #c9d6ff); 14 | display: flex; 15 | align-items: center; 16 | justify-content: center; 17 | flex-direction: column; 18 | min-height: 110vh; 19 | } 20 | 21 | header{ 22 | font-family: 'Poppins', sans-serif; 23 | font-weight: 500; 24 | font-size: 20px; 25 | border-radius: 20px; 26 | width: 100%; 27 | height: 120px; 28 | background-color: #171717; 29 | display: flex; 30 | justify-content: center; 31 | align-items: center; 32 | color: white; 33 | } 34 | header img{ 35 | width: 150px; 36 | } 37 | nav{ 38 | display: flex; 39 | justify-content: center; 40 | align-items: center; 41 | } 42 | .logo{ 43 | display: flex; 44 | margin: auto; 45 | } 46 | .paginas { 47 | display: flex; 48 | /* justify-content: center; 49 | align-items: center; */ 50 | } 51 | .paginas li{ 52 | margin: 35px; 53 | padding: 10px; 54 | list-style: none; 55 | } 56 | .paginas li a{ 57 | text-decoration: none; 58 | color: white; 59 | } 60 | .container{ 61 | margin-top: 15%; 62 | background: #fff; 63 | border-radius: 30px; 64 | box-shadow: 0 5px 15px rgba(0, 0, 0, 0.35); 65 | position: relative; 66 | overflow: hidden; 67 | width: 768px; 68 | max-width: 100%; 69 | min-height: 480px; 70 | } 71 | 72 | .container p{ 73 | font-size: 14px; 74 | line-height: 20px; 75 | letter-spacing: 0.3px; 76 | margin: 20px 0; 77 | } 78 | 79 | .container span{ 80 | font-size: 12px; 81 | } 82 | 83 | .container a{ 84 | color: #333; 85 | font-size: 13px; 86 | text-decoration: none; 87 | margin: 15px 0 10px; 88 | } 89 | 90 | .container button{ 91 | background-color: #d4983e; 92 | color: #fff; 93 | font-size: 12px; 94 | padding: 10px 45px; 95 | border: 1px solid transparent; 96 | border-radius: 8px; 97 | font-weight: 600; 98 | letter-spacing: 0.5px; 99 | text-transform: uppercase; 100 | margin-top: 10px; 101 | cursor: pointer; 102 | } 103 | .form-container button{ 104 | cursor: pointer; 105 | } 106 | 107 | .container button.hidden{ 108 | background-color: transparent; 109 | border-color: #fff; 110 | } 111 | 112 | .container form{ 113 | background-color: #fff; 114 | display: flex; 115 | align-items: center; 116 | justify-content: center; 117 | flex-direction: column; 118 | padding: 0 40px; 119 | height: 100%; 120 | } 121 | .container input{ 122 | background-color: #eee; 123 | border: none; 124 | margin: 8px 0; 125 | padding: 10px 15px; 126 | font-size: 13px; 127 | border-radius: 8px; 128 | width: 100%; 129 | outline: none; 130 | } 131 | 132 | .form-container{ 133 | position: absolute; 134 | top: 0; 135 | height: 100%; 136 | transform: all 0.6s ease-in-out; 137 | } 138 | .sign-in{ 139 | left: 0; 140 | width: 50%; 141 | z-index: 2; 142 | } 143 | .container.active .sign-in{ 144 | transform: translateX(100%); 145 | } 146 | 147 | .sign-up{ 148 | left: 0; 149 | width: 50%; 150 | opacity: 0; 151 | z-index: 1; 152 | } 153 | 154 | .container.active .sign-up{ 155 | transform: translateX(100%); 156 | opacity: 1; 157 | z-index: 5; 158 | animation: move 0.6s; 159 | } 160 | 161 | @keyframes move{ 162 | 0%, 49.99%{ 163 | opacity: 0; 164 | z-index: 1; 165 | } 166 | 50%, 100%{ 167 | opacity: 1; 168 | z-index: 5; 169 | } 170 | } 171 | 172 | .social-icons{ 173 | margin: 20px 0; 174 | } 175 | .social-icons a{ 176 | border: 1px solid #ccc; 177 | border-radius: 20%; 178 | display: inline-flex; 179 | justify-content: center; 180 | align-items: center; 181 | margin: 0 3px; 182 | width: 40px; 183 | height: 40px; 184 | } 185 | .toggle-container{ 186 | position: absolute; 187 | top: 0; 188 | left: 50%; 189 | width: 50%; 190 | height: 100%; 191 | overflow: hidden; 192 | transition: all 0.6s ease-in-out; 193 | border-radius: 150px 0 0 100px; 194 | z-index: 1000; 195 | } 196 | .container.active .toggle-container{ 197 | transform: translateX(-100%); 198 | border-radius: 0 150px 100px 0; 199 | } 200 | 201 | .toggle{ 202 | background-color: #512da8; 203 | height: 100%; 204 | background: linear-gradient(to right, #ddd451, #a53e25); 205 | color: #fff; 206 | position: relative; 207 | left: -100%; 208 | height: 100%; 209 | width: 200%; 210 | transform: translateX(0); 211 | transition: all 0.6s ease-in-out; 212 | } 213 | .container.active .toggle { 214 | transform: translateX(50%); 215 | } 216 | .toggle-panel{ 217 | position: absolute; 218 | width: 50%; 219 | height: 100%; 220 | display: flex; 221 | align-items: center; 222 | justify-content: center; 223 | flex-direction: column; 224 | padding: 0 30px; 225 | text-align: center; 226 | top: 0; 227 | transform: translateX(0); 228 | transition: all 0.6s ease-in-out; 229 | } 230 | .toggle-left{ 231 | transform: translateX(-200%); 232 | } 233 | 234 | .container.active .toggle-left{ 235 | transform: translateX(0); 236 | } 237 | 238 | .toggle-right{ 239 | right: 0; 240 | transform: translateX(0); 241 | } 242 | 243 | .container.active .toggle-right{ 244 | transform: translateX(200%); 245 | } 246 | 247 | footer{ 248 | font-family: 'Inter', sans-serif; 249 | width: 100%; 250 | letter-spacing: 1px; 251 | color: #f5f5f5; 252 | margin-top: 15%; 253 | } 254 | 255 | #footer_content{ 256 | background-color: #171717; 257 | display: grid; 258 | grid-template-columns: repeat(4, 1fr); 259 | padding: 3rem 3.5rem; 260 | } 261 | 262 | #footer_contacts h2{ 263 | margin-bottom: 0.75rem; 264 | } 265 | 266 | #footer_social_media{ 267 | display: flex; 268 | gap: 2rem; 269 | margin-top: 1.5rem; 270 | } 271 | 272 | #footer_social_media .footer-link{ 273 | display: flex; 274 | align-items: center; 275 | justify-content: center; 276 | height: 2.5rem; 277 | width: 2.5rem; 278 | color: #f5f5f5; 279 | border-radius: 50%; 280 | transition: all 0.4s; 281 | } 282 | 283 | #instagram{ 284 | background: linear-gradient(#7f37c9, #ff2992, #ff9807); 285 | } 286 | 287 | #facebook{ 288 | background-color: #4267b3; 289 | } 290 | 291 | #twitter{ 292 | background-color: #3E8AFF; 293 | } 294 | 295 | .footer-link{ 296 | text-decoration: none; 297 | } 298 | 299 | #footer_social_media .footer-link:hover{ 300 | opacity: 0.8; 301 | text-decoration: none; 302 | } 303 | #footer_social_media .footer-link i{ 304 | font-size: 1.2rem; 305 | } 306 | .footer-list{ 307 | display: flex; 308 | flex-direction: column; 309 | gap: 0.75rem; 310 | list-style: none; 311 | } 312 | .footer-list .footer-link{ 313 | color: #a8a29e; 314 | transition: all 0.4s; 315 | } 316 | .footer-list .footer-link:hover{ 317 | color: #f7a945; 318 | text-decoration: none; 319 | } 320 | #footer_subscribe{ 321 | display: flex; 322 | flex-direction: column; 323 | gap: 1.5rem; 324 | } 325 | #footer_subscribe p{ 326 | color: #a8a29e; 327 | } 328 | 329 | #input_group{ 330 | display: flex; 331 | align-items: center; 332 | background-color: 4px; 333 | border-radius: 4px; 334 | } 335 | #input_group input{ 336 | padding: 0.75rem; 337 | width: 100%; 338 | } 339 | #input_group button{ 340 | background-color: #e6862d; 341 | border: none; 342 | color: #f5f5f5; 343 | padding: 0px 1.25rem; 344 | font-size: 1.125rem; 345 | height: 100%; 346 | border-radius: 0px 4px 4px 0px; 347 | cursor: pointer; 348 | transition: all 0.4s; 349 | } 350 | 351 | #input_group:hover{ 352 | opacity: 0.8s; 353 | text-decoration: none; 354 | } 355 | 356 | #footer_copyright{ 357 | display: flex; 358 | justify-content: center; 359 | background-color: #0e0c0c; 360 | font-size: 0.9rem; 361 | padding: 1.5rem; 362 | font-weight: 100; 363 | } 364 | @media screen and (max-width: 768px) { 365 | #footer_content{ 366 | grid-template-columns: repeat(2, 1fr); 367 | gap: 2rem; 368 | } 369 | } 370 | 371 | @media screen and (max-width: 426px) { 372 | #footer_content{ 373 | grid-template-columns: repeat(1, 1fr); 374 | padding: 3rem 2rem; 375 | } 376 | } --------------------------------------------------------------------------------