From 6e0089368ea0c6c12024cd8138c2ff1730182042 Mon Sep 17 00:00:00 2001 From: HenzoFalconi Date: Mon, 10 Feb 2025 13:24:04 -0300 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20prepara=C3=A7=C3=A3o=20do=20projeto?= =?UTF-8?q?=20para=20backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 4 ++++ .gitignore | 3 ++- data/database.sql | 9 +++++++++ model/database.py | 0 model/tarefa.py | 0 requirements.txt | 10 ++++++++++ 6 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 .env.example create mode 100644 data/database.sql create mode 100644 model/database.py create mode 100644 model/tarefa.py diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ccbd38a --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +DB_HOST = '' +DB_USER = '' +DB_PSWD = '' +DB_NAME = '' \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0e5ac79..318bb28 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .venv -__pycache__ \ No newline at end of file +__pycache__ +.env \ No newline at end of file diff --git a/data/database.sql b/data/database.sql new file mode 100644 index 0000000..aef3b5b --- /dev/null +++ b/data/database.sql @@ -0,0 +1,9 @@ +create database if not exists `agenda`; + +use `agenda`; + +create table if not exists `tarefa`( + `id` int not null `auto_increment` primary key, + `titulo` varchar(60) not null, + `data_conclusao` datetime null +); diff --git a/model/database.py b/model/database.py new file mode 100644 index 0000000..e69de29 diff --git a/model/tarefa.py b/model/tarefa.py new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt index e69de29..74bb65b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,10 @@ +blinker==1.9.0 +click==8.1.8 +colorama==0.4.6 +Flask==3.1.0 +itsdangerous==2.2.0 +Jinja2==3.1.5 +MarkupSafe==3.0.2 +mysql-connector-python==9.2.0 +python-dotenv==1.0.1 +Werkzeug==3.1.3 From 83629398e6057cc68fa94b9bf68507605972ee01 Mon Sep 17 00:00:00 2001 From: HenzoFalconi Date: Mon, 10 Feb 2025 16:25:45 -0300 Subject: [PATCH 2/9] commit --- model/database.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/model/database.py b/model/database.py index e69de29..4cea7bd 100644 --- a/model/database.py +++ b/model/database.py @@ -0,0 +1,23 @@ +import mysql.connector # Impotando a biblioteca do conector do MySQL +from mysql.connector import Error # Importando a classe Error para tratar as mensagens de erro do código +from dotenv import load_dotenv # Importando a função load_dotenv +from os import getenv # Importando a função getenv + +class Database: + def __init__(self): + load_dotenv() + self.host = getenv('DB_HOST') + self.username = getenv('DB_USER') + self.password = getenv('DB_PSWD') + self.database = getenv('DB_NAME') + self.connection = None # Inicialização da conexão + self.cursor = None # Inicialização do cursor + + def conectar(self): + """Estabelece uma conexão com o banco de dados.""" + try: + self.connection = mysql.connector.connect( + host = self.host, + database = self.database, + + ) \ No newline at end of file From a0c20c6ef04d9f351827078f484043f683e50f3a Mon Sep 17 00:00:00 2001 From: HenzoFalconi Date: Tue, 11 Feb 2025 10:43:47 -0300 Subject: [PATCH 3/9] update --- model/database.py | 58 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/model/database.py b/model/database.py index 4cea7bd..294c10b 100644 --- a/model/database.py +++ b/model/database.py @@ -1,4 +1,5 @@ -import mysql.connector # Impotando a biblioteca do conector do MySQL + +import mysql.connector as mc # Impotando a biblioteca do conector do MySQL from mysql.connector import Error # Importando a classe Error para tratar as mensagens de erro do código from dotenv import load_dotenv # Importando a função load_dotenv from os import getenv # Importando a função getenv @@ -16,8 +17,57 @@ def __init__(self): def conectar(self): """Estabelece uma conexão com o banco de dados.""" try: - self.connection = mysql.connector.connect( + self.connection = mc.connect( host = self.host, database = self.database, - - ) \ No newline at end of file + user = self.username, + password = self.password + ) + if self.connection.is_connected(): + self.cursor = self.connection.cursor(dictionary=True) + print('Conexão ao banco de dados realizada com sucesso!') + except Error as e: + print(f'Erro de conexão: {e}') + self.connection = None + self.cursor = None + + def desconectar(self): + """Encerra a conexão com o vanco de dados e o cursor, se existirem.""" + if self.cursor: + self.cursor.close() + if self.connection: + self.connection.close() + print('Conexão com o banco de dados encerrada com sucesso!') + + def executar(self,sql,params=None): + """Executa uma instrução no banco de dados.""" + if self.connection is None and self.cursor is None: + print('Conexão ao banco de dados não estabelecida!') + return None + + try: + self.cursor.execute(sql,params) # Execução da instrução SQL + self.connection.commit() # Confirmação da transação + return self.cursor + except Error as e: + print(f'Erro de execução: {e}') + return None + + def consultar(self,sql,params=None): + """Executa uma instrução no banco de dados.""" + if self.connection is None and self.cursor is None: + print('Conexão ao banco de dados não estabelecida!') + return None + + try: + self.cursor.execute(sql,params) # Execução da instrução SQL + #self.connection.commit() # Confirmação da transação + return self.cursor.fetchall() + except Error as e: + print(f'Erro de execução: {e}') + return None + +db = Database() +db.conectar() +print(db.consultar('SELECT * FROM tarefa')) +db.desconectar() \ No newline at end of file From f594432719e34ac79b4f71aaff7068116501cecc Mon Sep 17 00:00:00 2001 From: HenzoFalconi Date: Tue, 11 Feb 2025 14:40:19 -0300 Subject: [PATCH 4/9] update --- model/database.py | 2 +- model/tarefa.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/model/database.py b/model/database.py index 294c10b..5686121 100644 --- a/model/database.py +++ b/model/database.py @@ -1,4 +1,3 @@ - import mysql.connector as mc # Impotando a biblioteca do conector do MySQL from mysql.connector import Error # Importando a classe Error para tratar as mensagens de erro do código from dotenv import load_dotenv # Importando a função load_dotenv @@ -69,5 +68,6 @@ def consultar(self,sql,params=None): db = Database() db.conectar() +db.executar('INSERT INTO tarefa (titulo) VALUES ("Teste de Tarefa")') print(db.consultar('SELECT * FROM tarefa')) db.desconectar() \ No newline at end of file diff --git a/model/tarefa.py b/model/tarefa.py index e69de29..69f149c 100644 --- a/model/tarefa.py +++ b/model/tarefa.py @@ -0,0 +1,29 @@ +from model.database import Database + +class tarefa: + def __init__(self, id, titulo, data_conclusão): + self.id = id + self.titulo = titulo + self.data_conclusão = data_conclusão + pass + + def salvarTarefa(self): + """Salva uma nova tarefa no banco de dados.""" + db = Database() + db.conectar() + + sql = 'INSERT INTO tarefa (titulo, data_conclusão) VALUES (%s, %s)' + params = (self.titulo, self.data_conclusão) + db.executar(sql, params) + db.desconectar() + ] + def listarTarefas(self): + """Retorna uma lista de tarefas cadastradas.""" + db = Database() + db.conectar() + + sql = 'SELECT id, titulo, data_conclusão FROM tarefa' + tarefas = db.consultar(sql) + db.desconectar() + + return tarefas \ No newline at end of file From 7a1d4143d7b9164dc028a52f2c817002e0eca998 Mon Sep 17 00:00:00 2001 From: HenzoFalconi Date: Tue, 11 Feb 2025 16:27:11 -0300 Subject: [PATCH 5/9] update --- model/database.py | 4 ++-- model/tarefa.py | 20 ++++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/model/database.py b/model/database.py index 5686121..6c3d0ca 100644 --- a/model/database.py +++ b/model/database.py @@ -68,6 +68,6 @@ def consultar(self,sql,params=None): db = Database() db.conectar() -db.executar('INSERT INTO tarefa (titulo) VALUES ("Teste de Tarefa")') -print(db.consultar('SELECT * FROM tarefa')) +#db.executar('INSERT INTO tarefa (titulo) VALUES ("Teste de Tarefa")') +#print(db.consultar('SELECT * FROM tarefa')) db.desconectar() \ No newline at end of file diff --git a/model/tarefa.py b/model/tarefa.py index 69f149c..a5bf50a 100644 --- a/model/tarefa.py +++ b/model/tarefa.py @@ -1,6 +1,6 @@ -from model.database import Database +from database import Database -class tarefa: +class Tarefa: def __init__(self, id, titulo, data_conclusão): self.id = id self.titulo = titulo @@ -16,7 +16,7 @@ def salvarTarefa(self): params = (self.titulo, self.data_conclusão) db.executar(sql, params) db.desconectar() - ] + def listarTarefas(self): """Retorna uma lista de tarefas cadastradas.""" db = Database() @@ -25,5 +25,17 @@ def listarTarefas(self): sql = 'SELECT id, titulo, data_conclusão FROM tarefa' tarefas = db.consultar(sql) db.desconectar() + return tarefas if tarefas else [] + + def apagarTarefa(self): + """Apaga todas as tarefas cadastrada no banco de dados.""" + db = Database() + db.conectar() + + sql = 'DELETE FROM tarefa WHERE id = %s' + params = (self.id,) # Precisa passar como tupla? + db.executar(sql, params) + db.desconectar() - return tarefas \ No newline at end of file +tarefa = Tarefa(4, 'Teste de Tarefa', None) +tarefa.apagarTarefa() \ No newline at end of file From 4a99d43febd5b133b45748fd41efe4407457ce1d Mon Sep 17 00:00:00 2001 From: HenzoFalconi Date: Mon, 31 Mar 2025 14:38:04 -0300 Subject: [PATCH 6/9] cmt que apaga e cria --- app.py | 24 ++++++-- data/{database.sql => agenda.sql} | 2 + model/tarefa.py | 29 +++++----- templates/agenda.html | 91 ------------------------------- templates/base.html | 15 +++++ templates/index.html | 17 ++++++ 6 files changed, 67 insertions(+), 111 deletions(-) rename data/{database.sql => agenda.sql} (86%) delete mode 100644 templates/agenda.html create mode 100644 templates/base.html create mode 100644 templates/index.html diff --git a/app.py b/app.py index 5d06d49..3aa4fc6 100644 --- a/app.py +++ b/app.py @@ -1,7 +1,23 @@ -from flask import Flask, render_template +from flask import Flask, redirect, render_template, request, url_for +from model.tarefa import Tarefa app = Flask(__name__) -@app.route("/") -def home(): - return render_template("agenda.html", title='Adicionar Tarefa') \ No newline at end of file +@app.route('/', methods=['GET', 'POST']) +def index(): + if request.method == 'POST': + titulo = request.form['titulo'] + data_conclusao = request.form['data_conclusao'] + tarefa = Tarefa(titulo=titulo, data_conclusao=data_conclusao) + tarefa.salvarTarefa() + return redirect(url_for('index')) + + tarefas = Tarefa.listarTarefas() + return render_template("index.html", tarefas=tarefas, title='Minhas Tarefas') + +@app.route('/delete/') +def delete(idtarefa): + tarefa = Tarefa(id=idtarefa) # Passando o parâmetro correto 'id' para o construtor + tarefa.apagarTarefa() # Chama o método para apagar a tarefa + return redirect(url_for('index')) + diff --git a/data/database.sql b/data/agenda.sql similarity index 86% rename from data/database.sql rename to data/agenda.sql index aef3b5b..92e7bf8 100644 --- a/data/database.sql +++ b/data/agenda.sql @@ -2,6 +2,8 @@ create database if not exists `agenda`; use `agenda`; +drop table if exists `tarefa`; + create table if not exists `tarefa`( `id` int not null `auto_increment` primary key, `titulo` varchar(60) not null, diff --git a/model/tarefa.py b/model/tarefa.py index a5bf50a..9717b85 100644 --- a/model/tarefa.py +++ b/model/tarefa.py @@ -1,41 +1,38 @@ -from database import Database +from model.database import Database class Tarefa: - def __init__(self, id, titulo, data_conclusão): + def __init__(self, id=None, titulo=None, data_conclusao=None): self.id = id self.titulo = titulo - self.data_conclusão = data_conclusão - pass + self.data_conclusao = data_conclusao def salvarTarefa(self): """Salva uma nova tarefa no banco de dados.""" db = Database() db.conectar() - sql = 'INSERT INTO tarefa (titulo, data_conclusão) VALUES (%s, %s)' - params = (self.titulo, self.data_conclusão) + sql = 'INSERT INTO tarefa (titulo, data_conclusao) VALUES (%s, %s)' + params = (self.titulo, self.data_conclusao) db.executar(sql, params) db.desconectar() - - def listarTarefas(self): + + @staticmethod + def listarTarefas(): """Retorna uma lista de tarefas cadastradas.""" db = Database() db.conectar() - sql = 'SELECT id, titulo, data_conclusão FROM tarefa' + sql = 'SELECT id, titulo, data_conclusao FROM tarefa' tarefas = db.consultar(sql) db.desconectar() return tarefas if tarefas else [] - + def apagarTarefa(self): - """Apaga todas as tarefas cadastrada no banco de dados.""" + """Apaga uma tarefa cadastrada no banco de dados.""" db = Database() db.conectar() sql = 'DELETE FROM tarefa WHERE id = %s' - params = (self.id,) # Precisa passar como tupla? + params = (self.id,) # Corrigir como tupla db.executar(sql, params) - db.desconectar() - -tarefa = Tarefa(4, 'Teste de Tarefa', None) -tarefa.apagarTarefa() \ No newline at end of file + db.desconectar() \ No newline at end of file diff --git a/templates/agenda.html b/templates/agenda.html deleted file mode 100644 index 36807a2..0000000 --- a/templates/agenda.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - {{ title }} - - - - -

Lista de Tarefas

-
- - - -
-

-
- - - - - \ No newline at end of file diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..756948e --- /dev/null +++ b/templates/base.html @@ -0,0 +1,15 @@ + + + + + + {{ title }} + + + + +

Agenda de Tarefas

+ {% block content %} + {% endblock %} + + \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..b61ae93 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} + +{% block content %} +
+ + + +
+
    + {% for tarefa in tarefas %} +
  • + {{ tarefa.titulo }} - {{ tarefa.data_conclusao }} + Apagar +
  • + {% endfor %} +
+{% endblock %} From c9ee01b3dfd31c5b6bafeb71b1661dd566b1bd14 Mon Sep 17 00:00:00 2001 From: HenzoFalconi Date: Tue, 1 Apr 2025 09:25:39 -0300 Subject: [PATCH 7/9] cmt editar --- app.py | 19 +++++++++++++++++-- model/tarefa.py | 24 ++++++++++++++++++------ templates/editar.html | 15 +++++++++++++++ templates/index.html | 1 + 4 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 templates/editar.html diff --git a/app.py b/app.py index 3aa4fc6..9171919 100644 --- a/app.py +++ b/app.py @@ -17,7 +17,22 @@ def index(): @app.route('/delete/') def delete(idtarefa): - tarefa = Tarefa(id=idtarefa) # Passando o parâmetro correto 'id' para o construtor - tarefa.apagarTarefa() # Chama o método para apagar a tarefa + tarefa = Tarefa(id=idtarefa) + tarefa.apagarTarefa() return redirect(url_for('index')) +@app.route('/editar/', methods=['GET', 'POST']) +def editar(idtarefa): + tarefa = Tarefa(id=idtarefa) + + if request.method == 'POST': + novo_titulo = request.form['titulo'] + nova_data_conclusao = request.form['data_conclusao'] + tarefa.editarTarefa(novo_titulo, nova_data_conclusao) + return redirect(url_for('index')) + + # Exibe os dados da tarefa no formulário + return render_template("editar.html", tarefa=tarefa) + +if __name__ == "__main__": + app.run(debug=True) diff --git a/model/tarefa.py b/model/tarefa.py index 9717b85..6b70c60 100644 --- a/model/tarefa.py +++ b/model/tarefa.py @@ -10,7 +10,6 @@ def salvarTarefa(self): """Salva uma nova tarefa no banco de dados.""" db = Database() db.conectar() - sql = 'INSERT INTO tarefa (titulo, data_conclusao) VALUES (%s, %s)' params = (self.titulo, self.data_conclusao) db.executar(sql, params) @@ -21,18 +20,31 @@ def listarTarefas(): """Retorna uma lista de tarefas cadastradas.""" db = Database() db.conectar() - sql = 'SELECT id, titulo, data_conclusao FROM tarefa' tarefas = db.consultar(sql) db.desconectar() return tarefas if tarefas else [] + + def editarTarefa(self, novo_titulo=None, nova_data_conclusao=None): + """Edita os dados da tarefa no banco de dados.""" + db = Database() + db.conectar() + + # Atualiza os campos somente se novos valores forem fornecidos + if novo_titulo: + sql = 'UPDATE tarefa SET titulo = %s WHERE id = %s' + db.executar(sql, (novo_titulo, self.id)) + + if nova_data_conclusao: + sql = 'UPDATE tarefa SET data_conclusao = %s WHERE id = %s' + db.executar(sql, (nova_data_conclusao, self.id)) + + db.desconectar() def apagarTarefa(self): """Apaga uma tarefa cadastrada no banco de dados.""" db = Database() db.conectar() - sql = 'DELETE FROM tarefa WHERE id = %s' - params = (self.id,) # Corrigir como tupla - db.executar(sql, params) - db.desconectar() \ No newline at end of file + db.executar(sql, (self.id,)) + db.desconectar() diff --git a/templates/editar.html b/templates/editar.html new file mode 100644 index 0000000..b2116f7 --- /dev/null +++ b/templates/editar.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block content %} +

Editar Tarefa

+
+ + + + + + + +
+ Voltar +{% endblock %} diff --git a/templates/index.html b/templates/index.html index b61ae93..0ce6b5a 100644 --- a/templates/index.html +++ b/templates/index.html @@ -11,6 +11,7 @@
  • {{ tarefa.titulo }} - {{ tarefa.data_conclusao }} Apagar + Editar
  • {% endfor %} From f900a33d3545e725d16d3dd6452ba076cfd3203a Mon Sep 17 00:00:00 2001 From: HenzoFalconi Date: Tue, 1 Apr 2025 10:15:01 -0300 Subject: [PATCH 8/9] cmt estilo --- app.py | 1 - model/tarefa.py | 3 +-- static/jinx.css | 12 ++++++++---- templates/editar.html | 1 + templates/index.html | 1 + 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app.py b/app.py index 9171919..2ba0860 100644 --- a/app.py +++ b/app.py @@ -31,7 +31,6 @@ def editar(idtarefa): tarefa.editarTarefa(novo_titulo, nova_data_conclusao) return redirect(url_for('index')) - # Exibe os dados da tarefa no formulário return render_template("editar.html", tarefa=tarefa) if __name__ == "__main__": diff --git a/model/tarefa.py b/model/tarefa.py index 6b70c60..8e60f10 100644 --- a/model/tarefa.py +++ b/model/tarefa.py @@ -29,8 +29,7 @@ def editarTarefa(self, novo_titulo=None, nova_data_conclusao=None): """Edita os dados da tarefa no banco de dados.""" db = Database() db.conectar() - - # Atualiza os campos somente se novos valores forem fornecidos + if novo_titulo: sql = 'UPDATE tarefa SET titulo = %s WHERE id = %s' db.executar(sql, (novo_titulo, self.id)) diff --git a/static/jinx.css b/static/jinx.css index 9b79496..0301354 100644 --- a/static/jinx.css +++ b/static/jinx.css @@ -1,10 +1,13 @@ - body { - background-color: #0d0d0d; + background-color: #0d0d0d; color: #f5f5f5; - font-family: 'Comic Sans MS', 'Arial', sans-serif; + font-family: 'Comic Sans MS', 'Arial', sans-serif; margin: 0; padding: 0; + display: flex; + align-items: center; + height: 100vh; + flex-direction: column; } h1#lt { @@ -61,6 +64,7 @@ button#botao:hover { max-width: 600px; background-color: #1a1a1a; padding: 20px; + justify-content: center; border-radius: 12px; box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.5); border: 2px solid #ff007f; @@ -68,7 +72,7 @@ button#botao:hover { #lista-de-tarefas div { display: flex; - justify-content: space-between; + justify-content:center; align-items: center; background-color: #0d0d0d; padding: 10px; diff --git a/templates/editar.html b/templates/editar.html index b2116f7..00f92a5 100644 --- a/templates/editar.html +++ b/templates/editar.html @@ -2,6 +2,7 @@ {% block content %}

    Editar Tarefa

    +
    diff --git a/templates/index.html b/templates/index.html index 0ce6b5a..ee27f98 100644 --- a/templates/index.html +++ b/templates/index.html @@ -4,6 +4,7 @@ +
      From cdffe47365ea5125896a6dfc418cdbf135370168 Mon Sep 17 00:00:00 2001 From: HenzoFalconi Date: Tue, 1 Apr 2025 10:44:50 -0300 Subject: [PATCH 9/9] cmt detalhes --- model/database.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/model/database.py b/model/database.py index 6c3d0ca..4cc679c 100644 --- a/model/database.py +++ b/model/database.py @@ -1,7 +1,7 @@ -import mysql.connector as mc # Impotando a biblioteca do conector do MySQL -from mysql.connector import Error # Importando a classe Error para tratar as mensagens de erro do código -from dotenv import load_dotenv # Importando a função load_dotenv -from os import getenv # Importando a função getenv +import mysql.connector as mc +from mysql.connector import Error +from dotenv import load_dotenv +from os import getenv class Database: def __init__(self): @@ -10,8 +10,8 @@ def __init__(self): self.username = getenv('DB_USER') self.password = getenv('DB_PSWD') self.database = getenv('DB_NAME') - self.connection = None # Inicialização da conexão - self.cursor = None # Inicialização do cursor + self.connection = None + self.cursor = None def conectar(self): """Estabelece uma conexão com o banco de dados.""" @@ -45,8 +45,8 @@ def executar(self,sql,params=None): return None try: - self.cursor.execute(sql,params) # Execução da instrução SQL - self.connection.commit() # Confirmação da transação + self.cursor.execute(sql,params) + self.connection.commit() return self.cursor except Error as e: print(f'Erro de execução: {e}') @@ -59,8 +59,7 @@ def consultar(self,sql,params=None): return None try: - self.cursor.execute(sql,params) # Execução da instrução SQL - #self.connection.commit() # Confirmação da transação + self.cursor.execute(sql,params) return self.cursor.fetchall() except Error as e: print(f'Erro de execução: {e}') @@ -68,6 +67,4 @@ def consultar(self,sql,params=None): db = Database() db.conectar() -#db.executar('INSERT INTO tarefa (titulo) VALUES ("Teste de Tarefa")') -#print(db.consultar('SELECT * FROM tarefa')) db.desconectar() \ No newline at end of file