Compare commits

..

11 Commits

Author SHA1 Message Date
Joao 50647dd094 Página HTML 2026-06-01 20:56:57 -03:00
Joao aee4a1b7fb Adição de commit SQL 2026-05-22 22:04:15 -03:00
Joao 1c91c1a0db Evolução da apirest 2026-05-22 22:00:16 -03:00
1724026 247b2f4576 Conexão com banco 2026-05-15 22:12:23 -03:00
1724026 641747634a Início do desenvolvimento da APIRest 2026-05-15 20:33:17 -03:00
1724026 a33ad6b6c9 Atualizar 2026-05-08 21:38:09 -03:00
1724026 63b89b59ae Chat finalizado 2026-05-08 21:20:40 -03:00
1724026 bf56431785 thread e chat com sockets 2026-04-17 21:47:22 -03:00
1724026 142c0b60df Ajustes no servidor TCP 2026-04-10 21:46:12 -03:00
1724026 c304b9903c Primeira aula de sockets 2026-04-10 21:08:10 -03:00
1724026 36070e012d Adição do arquivo gitignore 2026-03-27 21:32:02 -03:00
18 changed files with 363 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
modulo_os/__pycache__/
+7
View File
@@ -0,0 +1,7 @@
PORT=5000
DB_HOST=
DB_USER=
DB_PASSWORD=
DB_NAME=
DB_PORT=
+2
View File
@@ -0,0 +1,2 @@
.venv/
.env
Binary file not shown.
+79
View File
@@ -0,0 +1,79 @@
from flask import Flask, jsonify, request
from flask_cors import CORS
import os
from dotenv import load_dotenv
from db import get_connection
#Carrega arquivo de variáveis de ambiente (.env)
load_dotenv()
#Carrega variável de ambiente PORT. Essa variável contém a porta TCP utilizada na APIREST
PORT = os.getenv("PORT")
#Cria objeto Flask. Esse objeto é necessário para utilização do FLASK
#(módulo python para criação de APIs REST).
app = Flask(__name__)
#Aplica cors no objeto Flask
CORS(app)
#Criar rota de saúde da aplicação
@app.route("/health")
def health():
return jsonify({"message" : "API Flask version 1.0!!!"})
#=============================================================
@app.route("/produtos",methods=["GET"])
def listar_produtos():
conexao = get_connection()
cursor = conexao.cursor(dictionary=True)
cursor.execute("select * from produto")
produtos = cursor.fetchall()
cursor.close()
conexao.close()
return jsonify(produtos)
#=============================================================
@app.route("/produtos/<int:id>", methods=["GET"])
def listar_produto_id(id):
conexao = get_connection()
cursor = conexao.cursor(dictionary=True)
cursor.execute("Select * from produto where id = %s", (id,))
produto = cursor.fetchone()
cursor.close()
conexao.close()
if produto is None:
return jsonify({"erro" : "Produto não encontrado"}), 404
return jsonify(produto)
#=============================================================
@app.route("/produtos",methods=["POST"])
def criar_produto():
dados = request.get_json()
nome = dados.get("nome")
preco = dados.get("preco")
estoque = dados.get("estoque")
if nome is None or preco is None or estoque is None:
return jsonify({"erro" : "Produto inválido"}), 400
conexao = get_connection()
cursor = conexao.cursor()
sql = "insert into produto (nome, preco, estoque) values (%s, %s, %s)"
cursor.execute(sql,(nome, preco, estoque))
conexao.commit()
novo_id = cursor.lastrowid
cursor.close()
conexao.close()
return jsonify({"id" : novo_id, "nome": nome, "preco" : preco, "estoque" : estoque}), 201
#Inicializa o servidor da APIRest
if __name__ == "__main__":
app.run(port=PORT, debug=True)
+17
View File
@@ -0,0 +1,17 @@
import os
import mysql.connector
from dotenv import load_dotenv
load_dotenv()
def get_connection():
return mysql.connector.connect(
host=os.getenv("DB_HOST"),
user=os.getenv("DB_USER"),
password=os.getenv("DB_PASSWORD"),
database=os.getenv("DB_NAME"),
port=os.getenv("DB_PORT")
)
+30
View File
@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<title>Produtos</title>
</head>
<body>
<h1>Lista de produtos</h1>
<main>
<table>
<thead>
<tr>
<th>Nome</th>
<th>Preço</th>
<th>Estoque</th>
</tr>
</thead>
<tbody id="conteudo_tabela">
</tbody>
</table>
</main>
<script src="script.js"></script>
</body>
</html>
+20
View File
@@ -0,0 +1,20 @@
async function carregarProdutos(){
const resposta = await fetch("http://localhost:5000/produtos");
if (!resposta.ok){
throw new Error("Não foi possível carregar a lista")
}
const produtos = await resposta.json();
let tbody = document.querySelector("tbody");
produtos.forEach(produto => {
let linha = document.createElement("tr");
linha.innerHTML = ` <td>${produto.nome}</td>
<td>${produto.preco}</td>
<td>${produto.estoque}</td>
`
tbody.appendChild(linha);
});
}
window.addEventListener("load", () => {
carregarProdutos();
})
+24
View File
@@ -0,0 +1,24 @@
/*
Seletor {
propriedade1 : valor;
propriedade2 : valor;
...
propriedadeN : valor;
}
*/
/* CSS de RESET */
* {
margin : 0;
padding: 0;
}
h1 {
width : 300px;
background-color: brown;
padding: 20px;
border: 10px solid black;
text-align: center;
margin: 0 auto;
}
+11
View File
@@ -0,0 +1,11 @@
blinker==1.9.0
click==8.3.3
colorama==0.4.6
Flask==3.1.3
flask-cors==6.0.2
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==3.0.3
mysql-connector-python==9.7.0
python-dotenv==1.2.2
Werkzeug==3.1.8
+16
View File
@@ -0,0 +1,16 @@
#Criar tabela produto
create table produto (
id int auto_increment primary key,
nome varchar(100) not null,
preco decimal(10,2) not null,
estoque int not null
);
#Carga incial do banco
insert into produto (nome,preco,estoque)
values ('Bola',12.50,10);
insert into produto (nome,preco,estoque)
values ('PS5',3950.50,5);
#Exemplo de consulta
#select * from produto;
+14
View File
@@ -0,0 +1,14 @@
aluno = {
"nome" : "João",
"matricula" : "10011454",
"ira" : 8.5,
"idade" : 35,
"ativo" : True,
"dicionario" : { "teste" : "A" },
"notas" : []
}
print(aluno["nome"])
print(aluno.get("nome"))
print(aluno.get("dicionario").get("teste"))
print(aluno.keys())
+44
View File
@@ -0,0 +1,44 @@
import tkinter as tk
from tkinter import scrolledtext
import socket
import threading
def ouvir_servidor(socket_servidor):
while True:
mensagem = socket_servidor.recv(80000)
area_mensagens.config(state="normal")
area_mensagens.insert(tk.END, mensagem.decode() + "\n")
area_mensagens.config(state="disabled")
socket_servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_servidor.connect(("10.209.1.45",5000))
thread = threading.Thread(target=ouvir_servidor, args=[socket_servidor,])
thread.start()
janela = tk.Tk()
janela.title("Chat do IFRN")
rotulo_mensagem = tk.Label(janela, text="Digite sua mensagem")
rotulo_mensagem.pack()
entrada_mensagem = tk.Entry(janela, width=80)
entrada_mensagem.pack()
def clicar():
mensagem = entrada_mensagem.get()
print(mensagem)
socket_servidor.send(mensagem.encode())
entrada_mensagem.delete(0, tk.END)
area_mensagens.config(state="normal")
area_mensagens.insert(tk.END, mensagem + "\n")
area_mensagens.config(state="disabled")
botao = tk.Button(janela, text="Enviar", command=clicar)
botao.pack()
area_mensagens = scrolledtext.ScrolledText(janela)
area_mensagens.pack()
area_mensagens.config(state="disabled")
janela.mainloop()
+15
View File
@@ -0,0 +1,15 @@
# Modelo de importação diferente. Não precisará mais
# usar a palavra socket (módulo) antes dos recursos
from socket import *
# Criar objeto socket
cliente = socket(AF_INET, SOCK_STREAM)
# Abrir conexão
cliente.connect(("127.0.0.1",3000))
# Enviar mensagem
cliente.send("Olá, servidor!".encode())
mensagem = cliente.recv(1024)
print(f"Mensagem recebida {mensagem.decode()}")
+32
View File
@@ -0,0 +1,32 @@
import socket
import threading
import time
servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
servidor.bind(("0.0.0.0",5000))
servidor.listen()
print("Servidor inicializado!!!")
clientes = []
def ouvir_cliente(cliente):
funcionar = True
while True:
try:
if funcionar:
mensagem = cliente.recv(80000)
for socket_cliente in clientes:
if socket_cliente != cliente:
socket_cliente.send(mensagem)
else:
time.sleep(5)
except Exception as e:
print(f"Ocorreu um erro inesperado: {e}")
funcionar = False
while True:
cliente, endereco_cliente = servidor.accept()
print("Cliente conectado:", endereco_cliente)
clientes.append(cliente)
thread = threading.Thread(target=ouvir_cliente, args=[cliente,])
thread.start()
+28
View File
@@ -0,0 +1,28 @@
# Biblioteca padrão para utilização de sockets
import socket
# Criar um objeto socket com AF_INET (IPV4) e SOCK_STREAM (TCP)
servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Estabelecer vínculo com um endereço e uma porta
servidor.bind(("0.0.0.0",3000))
print("Servidor inicializado...")
# Começa a ouvir tentativas de conexão
servidor.listen()
while True:
# Aceitar conexão, recebendo o objeto socket da conexão e
# o endereço de quem se conectou
conexao, endereco = servidor.accept()
print(f"Endereco do cliente: {endereco}")
# Recebendo mensagem do cliente. Tenho que converter
# bytes para string (decode)
mensagem = conexao.recv(1024).decode()
print(f"Mensagem recebida: {mensagem}")
# Enviar mensagem. Precisa ser em bytes (decode)
conexao.send("OK! Sou o servidor".encode())
+3
View File
@@ -0,0 +1,3 @@
numero = int(input("Digite um número: "))
for i in range(11):
print(f"{numero}x{i}={numero*i}")
+20
View File
@@ -0,0 +1,20 @@
import threading
import time
# Função que será executada pela thread
def executar(nome_thread, n_iteracoes):
for i in range(n_iteracoes):
print(f"Nome da thread: {nome_thread}")
time.sleep(2) # Parar por 2s
t1 = threading.Thread(target=executar,args=["Thread1",15,])
t2 = threading.Thread(target=executar,args=["Thread2",10,])
t1.start()
t2.start()
t1.join()
t2.join()
print("Final da thread principal")