├── 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 |
18 |
26 |
34 |
42 |
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 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
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 += '';
18 | data.forEach(function(pedidos) {
19 | html += '- ID do Pedido: ' + pedidos.id_pedido + '
';
20 | html += '- ID do Cliente: ' + pedidos.id_cliente + '
';
21 | html += '- Quantidade: ' + pedidos.quantidade + '
';
22 | html += '- Data: ' + pedidos.data_pedido + '
';
23 | html += '- Valor Total: ' + pedidos.valor_total + '
';
24 | html += '- Sabor: ' + pedidos.sabor_pizza + '
';
25 | html += '- Status: ' + pedidos.status + '
';
26 | html += '
';
27 | });
28 | 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 += '';
54 | data.forEach(function(clientes) {
55 | html += '- ID do Cliente: ' + clientes.id_cliente + '
';
56 | html += '- Nome: ' + clientes.nome + '
';
57 | html += '- CPF: ' + clientes.cpf + '
';
58 | html += '- Email: ' + clientes.email + '
';
59 | html += '
';
60 | });
61 | 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 += '';
87 | data.forEach(function(funcionarios) {
88 | html += '- ID do Funcionario: ' + funcionarios.id_funcionario + '
';
89 | html += '- Nome: ' + funcionarios.nome + '
';
90 | html += '- Cargo: ' + funcionarios.cargo + '
';
91 | html += '- Salário: ' + funcionarios.salario + '
';
92 | html += '
';
93 | });
94 | 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 += '';
120 | data.forEach(function(areas) {
121 | html += '- ID da área: ' + areas.id_area + '
';
122 | html += '- Nome: ' + areas.area_funcionario + '
';
123 | html += '
';
124 | });
125 | 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 += '';
151 | data.forEach(function(fornecedores) {
152 | html += '- ID da área: ' + fornecedores.id_fornecedor + '
';
153 | html += '- Nome: ' + fornecedores.nome + '
';
154 | html += '
';
155 | });
156 | 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 | }
--------------------------------------------------------------------------------