From d613962a64cfffbbbdc846ca665d4f2dfca7a9fe Mon Sep 17 00:00:00 2001 From: Estevam Souza Date: Wed, 6 Nov 2024 00:00:38 -0300 Subject: [PATCH] =?UTF-8?q?:boom:=20novas=20altera=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 276 ++++++++- client/setup.py | 253 +++++---- client/src/pages/login.py | 349 +++++++++--- client/src/setup.backup.py | 1091 ++++++++++++++++++++++++++++++++++++ requirements.txt | 142 ++++- usuarios.txt | 3 + 6 files changed, 1887 insertions(+), 227 deletions(-) create mode 100644 client/src/setup.backup.py create mode 100644 usuarios.txt diff --git a/app.py b/app.py index 2c03c4b07..494f72543 100644 --- a/app.py +++ b/app.py @@ -1,27 +1,263 @@ +# # from client.src.pages.👻_Login import login_page +# from client.src.pages.login import * +# import streamlit as st +# # import client.setup as setup +# import plotly.express as px + + +# if __name__ == '__main__': +# df = px.data.iris() + +# if "logged_in" not in st.session_state: +# st.session_state.logged_in = False + +# if not st.session_state.logged_in: +# logged_in = login_page() + +# if logged_in: +# st.session_state.logged_in = True +# st.experimental_rerun() +# else: +# st.empty() +# # setup.mainLogin() +# if st.button("Logout"): +# st.session_state.logged_in = False +# st.experimental_rerun() + + + # from client.src.pages.👻_Login import login_page -from client.src.pages.login import * +# from client.src.pages.login import * import streamlit as st import client.setup as setup import plotly.express as px +import streamlit as st +from PIL import Image +from streamlit_extras.let_it_rain import rain + + +logo_img = Image.open('client/src/public/if-logo.png') + +# Caminho para o arquivo .txt com os dados de login +USERS_FILE = 'usuarios.txt' # O arquivo .txt onde os usuários estão armazenados + +# Função para ler os usuários e senhas do arquivo .txt +def read_users_from_file(): + users = {} + try: + with open(USERS_FILE, 'r') as file: + for line in file.readlines(): + line = line.strip() # Remove espaços em branco no início e no final + if line: # Ignora linhas vazias + if ',' in line: # Verifica se a linha contém uma vírgula para dividir + try: + username, password = line.split(',') + users[username] = password + except ValueError: + st.warning(f"Formato inválido na linha: '{line}'. Ignorando...") + else: + st.warning(f"Formato inválido na linha: '{line}'. Esperava-se uma vírgula para separar usuário e senha.") + except FileNotFoundError: + st.error(f"O arquivo {USERS_FILE} não foi encontrado.") + return users + + +# Função de autenticação +def authenticate_user(username, password): + users = read_users_from_file() # Lê os usuários do arquivo + if username in users: + if users[username] == password: + return True + else: + st.error("Senha incorreta.") + return False + else: + st.error("Nome de usuário não encontrado.") + return False + +def login_page(): + rain( + emoji="🎃", + font_size=45, + falling_speed=12, + animation_length="infinite", + ) + opcao = st.radio("Escolha uma opção:", ("Fazer login")) + + if opcao == "Fazer login": + if 'logged_in' not in st.session_state: + st.session_state.logged_in = False + + st.image(logo_img, use_column_width=True) + username = st.text_input("Nome de usuário", key="username_input") + password = st.text_input("Senha", type="password", key="password_input") + + if st.button("Login"): + if authenticate_user(username, password): + st.session_state.logged_in = True + with st.spinner("Carregando..."): + st.success("Login efetuado com sucesso!") + from time import sleep + from stqdm import stqdm + + for _ in stqdm(range(50), desc="configurando o servidor", mininterval=1): + sleep(0.1) + + st.balloons() + + return True + else: + if username == "" and password == "": + st.error("Por favor, insira um nome de usuário e senha.") + st.info("Se você esqueceu sua senha, entre em contato com o administrador.") + st.markdown(""" + + """, unsafe_allow_html=True) + + st.header("Contact") + + contact_form = """ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ """.format("estevamsouzalaureth@gmail.com") # Substitua o endereço de e-mail aqui + + javascript_code = """ + + """ + + st.markdown(contact_form + javascript_code, unsafe_allow_html=True) + + return False + + else: + from .criar_conta import criar_conta + st.image(logo_img, use_column_width=True) + return criar_conta() + + + if __name__ == '__main__': - df = px.data.iris() - - if "logged_in" not in st.session_state: - st.session_state.logged_in = False - - if not st.session_state.logged_in: - logged_in = login_page() - - if logged_in: - st.session_state.logged_in = True - st.experimental_rerun() - else: - st.empty() - setup.mainLogin() - if st.button("Logout"): - st.session_state.logged_in = False - st.experimental_rerun() - - \ No newline at end of file + df = px.data.iris() + + if "logged_in" not in st.session_state: + st.session_state.logged_in = False + + if not st.session_state.logged_in: + logged_in = login_page() + + if logged_in: + st.session_state.logged_in = True + st.rerun() # Substituído experimental_rerun por rerun + else: + st.empty() + setup.mainLogin() + if st.button("Logout"): + st.session_state.logged_in = False + st.rerun() # Substituído experimental_rerun por rerun diff --git a/client/setup.py b/client/setup.py index 293f80f3e..55fb7825a 100644 --- a/client/setup.py +++ b/client/setup.py @@ -6,22 +6,22 @@ # Streamlit app designed for visualizing U.S. real estate data and market trends # ############################################################################################ -import time -import json -import qrcode -import base64 -import smtplib +# import time +# import json +# import qrcode +# import base64 +# import smtplib import logging import pandas as pd -import altair as alt +# import altair as alt import streamlit as st import plotly.express as px from PIL import Image -from deta import Deta -from email.mime.text import MIMEText +# from deta import Deta +# from email.mime.text import MIMEText from streamlit_lottie import st_lottie -from email.mime.multipart import MIMEMultipart +# from email.mime.multipart import MIMEMultipart from streamlit_extras.colored_header import colored_header import client.src.pages.mapa as mapa @@ -69,30 +69,30 @@ MAX_ATTEMPTS = 3 # número máximo de tentativas usernames = [] passwords = [] -DETA_KEY = "e0u31gqkqju_2Ps7fJD5a1kAKF2Rr4Y31ASSdvUUeX8Y" -deta = Deta(DETA_KEY) -db_deta_bebidas = deta.Base("bebidas") -db = deta.Base("data") -db_deta_previsao_demanda = deta.Base("previsao_demanda") -db_deta_funcionarios = deta.Base("funcionario") -db_deta_categoriavendas = deta.Base("categoriavendas") -db_deta_estoque = deta.Base("estoque") -db_deta_pratos = deta.Base("prato") -db_deta_clientes = deta.Base("cliente") -db_deta_reservas = deta.Base("reservasClientes") +# DETA_KEY = "e0u31gqkqju_2Ps7fJD5a1kAKF2Rr4Y31ASSdvUUeX8Y" +# # # deta = Deta(DETA_KEY) +# # db_deta_bebidas = deta.Base("bebidas") +# db = deta.Base("data") +# # db_deta_previsao_demanda = deta.Base("previsao_demanda") +# # db_deta_funcionarios = deta.Base("funcionario") +# # db_deta_categoriavendas = deta.Base("categoriavendas") +# # db_deta_estoque = deta.Base("estoque") +# # db_deta_pratos = deta.Base("prato") +# # db_deta_clientes = deta.Base("cliente") +# # db_deta_reservas = deta.Base("reservasClientes") def to_dataframe(db): items = db.fetch().items return pd.DataFrame(items) -dataDetaBebidas = to_dataframe(db_deta_bebidas) -dataDetaEstoque = to_dataframe(db_deta_estoque) -dataDetaPratos = to_dataframe(db_deta_pratos) -dataDetaClientes = to_dataframe(db_deta_clientes) -dataDetaCategoriaVendas = to_dataframe(db_deta_categoriavendas) -dataDetaReservas = to_dataframe(db_deta_reservas) -dataDetaFuncionarios = to_dataframe(db_deta_funcionarios) +# # dataDetaBebidas = to_dataframe(db_deta_bebidas) +# # dataDetaEstoque = to_dataframe(db_deta_estoque) +# # dataDetaPratos = to_dataframe(db_deta_pratos) +# # dataDetaClientes = to_dataframe(db_deta_clientes) +# # dataDetaCategoriaVendas = to_dataframe(db_deta_categoriavendas) +# # dataDetaReservas = to_dataframe(db_deta_reservas) +# # dataDetaFuncionarios = to_dataframe(db_deta_funcionarios) def authenticate_user(username, password): @@ -101,7 +101,7 @@ def authenticate_user(username, password): def mainLogin(): - logging.info('O cliente escolheu fazer login') + # logging.info('O cliente escolheu fazer login') if 'blocked_time' in st.session_state and st.session_state.blocked_time > time.time(): st.warning(f"Sua conta foi bloqueada por excesso de tentativas. Tente novamente em {st.session_state.blocked_time - int(time.time())} segundos.") else: @@ -117,17 +117,17 @@ def get_img_as_base64(file): data = f.read() return base64.b64encode(data).decode() - logging.info('Iniciando o app') + # logging.info('Iniciando o app') st.sidebar.image(logoImg , width=215) - logging.basicConfig( - filename='client/src/log/app.log', - level=logging.INFO, - format='%(asctime)s %(levelname)s %(name)s %(filename)s:%(lineno)d %(funcName)s() [%(process)d] - %(message)s' - ) + # # logging.basicConfig( + # filename='client/src/log/app.log', + # # level=logging.INFO, + # format='%(asctime)s %(levelname)s %(name)s %(filename)s:%(lineno)d %(funcName)s() [%(process)d] - %(message)s' + # ) - session_start_time = st.session_state.get('session_start_time', time.time()) - elapsed_time = time.time() - session_start_time + # session_start_time = st.session_state.get('session_start_time', time.time()) + # elapsed_time = time.time() - session_start_time selecionar = st.sidebar.selectbox("Selecione a página", [ "🏠 Home", @@ -190,12 +190,12 @@ def get_img_as_base64(file): st.markdown("###### Tudo o que você pode saber aqui sobre ✎Bebidas ✎Mercadorias ✎Preços ✎Pratos da casa ✎Clientes ✎Avaliações ✎Custo ✎Localização ✎E muito mais") st.markdown("Este projeto foi criado para gerenciar um restaurante chamado Pedacinho do Céu. O projeto utiliza Big Data, Power BI, Docker e uma API RESTful para coletar, processar, armazenar e visualizar os dados.") - logging.info('O cliente selecionou a página Pedacinho do Céu') + # logging.info('O cliente selecionou a página Pedacinho do Céu') pic = Image.open('client/src/public/food-camarao.png') st.image(pic, use_column_width=True) - logging.info('O cliente selecionou a página Home') + # logging.info('O cliente selecionou a página Home') col1, col2 = st.columns(2) with col1: @@ -216,7 +216,7 @@ def get_img_as_base64(file): elif arquivo00 == 'Vídeo': st.video("https://www.youtube.com/watch?v=wDJN95Y_yOM") - logging.info('Video de fundo') + # logging.info('Video de fundo') else: @@ -239,7 +239,7 @@ def get_img_as_base64(file): st.write("https://github.com/big-data-estacio/data") if selecionar == "🎃 Sobre": - logging.info('O cliente selecionou a página Sobre') + # logging.info('O cliente selecionou a página Sobre') st.markdown("## Sobre o Restaurante") st.write("O Restaurante Pedacinho do Céu foi fundado em 1995 com o objetivo de proporcionar aos seus clientes uma experiência gastronômica única e inesquecível. Com um cardápio diversificado que inclui pratos da cozinha regional e internacional, o restaurante se destaca pela qualidade dos seus ingredientes e pelo atendimento personalizado.") st.write("Além da excelência na comida, o Pedacinho do Céu também se preocupa com a experiência dos seus clientes. O ambiente é aconchegante e sofisticado, criando uma atmosfera perfeita para reuniões em família, encontros românticos ou jantares de negócios.") @@ -294,7 +294,7 @@ def get_img_as_base64(file): button(username="fake-username", floating=False, width=221) if selecionar == "🖨️ Inserir Dados": - logging.info('O cliente selecionou a opção de inserir dados') + # logging.info('O cliente selecionou a opção de inserir dados') st.title('Inserção de Dados') arquivo00 = st.radio('Escolha o arquivo para inserir os dados', ('Bebidas', 'Estoque', 'Clientes', 'Pratos', 'Categoria de Vendas')) @@ -315,7 +315,7 @@ def get_img_as_base64(file): "integridade dos dados e evita erros e inconsistências nos resultados das análises.") if arquivo00 == 'Bebidas': - logging.info('O cliente selecionou a opção de inserir bebidas') + # logging.info('O cliente selecionou a opção de inserir bebidas') st.subheader('Inserir Bebida') id = st.text_input('id') nome = st.text_input('nome') @@ -330,7 +330,7 @@ def get_img_as_base64(file): st.button('Voltar') elif arquivo00 == 'Estoque': - logging.info('O cliente selecionou a opção de inserir estoque') + # logging.info('O cliente selecionou a opção de inserir estoque') st.subheader('Inserir Estoque') id = st.text_input('ID') nome = st.text_input('NOME') @@ -341,7 +341,7 @@ def get_img_as_base64(file): st.button('Voltar') elif arquivo00 == 'Clientes': - logging.info('O cliente selecionou a opção de inserir clientes') + # logging.info('O cliente selecionou a opção de inserir clientes') st.subheader('Inserir Cliente') id = st.text_input('ID') nome = st.text_input('NOME') @@ -352,7 +352,7 @@ def get_img_as_base64(file): st.button('Voltar') elif arquivo00 == 'Pratos': - logging.info('O cliente selecionou a opção de inserir pratos') + # logging.info('O cliente selecionou a opção de inserir pratos') st.subheader('Inserir Prato') id = st.text_input('ID') nome = st.text_input('NOME') @@ -364,7 +364,7 @@ def get_img_as_base64(file): st.button('Voltar') elif arquivo00 == 'Petiscos': - logging.info('O cliente selecionou a opção de inserir petiscos') + # logging.info('O cliente selecionou a opção de inserir petiscos') st.subheader('Inserir Petisco') id = st.text_input('ID') nome = st.text_input('NOME') @@ -376,7 +376,7 @@ def get_img_as_base64(file): st.button('Voltar') elif arquivo00 == 'Categoria de Vendas': - logging.info('O cliente selecionou a opção de inserir vendas') + # logging.info('O cliente selecionou a opção de inserir vendas') st.subheader('Inserir Venda') id = st.text_input('ID') categoria = st.text_input('Categoria') @@ -406,74 +406,74 @@ def get_img_as_base64(file): "integridade dos dados e evita erros e inconsistências nos resultados das análises.") if arquivo01 == 'Bebidas': - bebidas = bebidas_clientes.Bebidas(db_deta_bebidas) + # bebidas = bebidas_clientes.Bebidas(db_deta_bebidas) bebidas.show_table() id_to_update = st.number_input("Digite o ID do registro que deseja atualizar:", min_value=1, max_value=len(bebidas.data)) update_data = None if st.button("Atualizar"): update_data = bebidas.update_by_id(id_to_update) if update_data and st.button("Confirmar"): - bebidas.db_deta_bebidas.put(update_data) + # bebidas.db_deta_bebidas.put(update_data) st.success("Dados atualizados com sucesso!") bebidas.load_data() elif arquivo01 == 'Estoque': - estoque = estoque_update.Estoque(db_deta_estoque) + # estoque = estoque_update.Estoque(db_deta_estoque) estoque.show_table() id_to_update = st.number_input("Digite o ID do registro que deseja atualizar:", min_value=1, max_value=len(estoque.data)) update_data = None if st.button("Atualizar"): update_data = estoque.update_by_id(id_to_update) if update_data and st.button("Confirmar"): - estoque.db_deta_estoque.put(update_data) + # estoque.db_deta_estoque.put(update_data) st.success("Dados atualizados com sucesso!") estoque.load_data() elif arquivo01 == 'Clientes': - clientes = clientes_update.Clientes(db_deta_clientes) + # clientes = clientes_update.Clientes(db_deta_clientes) clientes.show_table() id_to_update = st.number_input("Digite o ID do registro que deseja atualizar:", min_value=1, max_value=len(clientes.data)) update_data = None if st.button("Atualizar"): update_data = clientes.update_by_id(id_to_update) if update_data and st.button("Confirmar"): - clientes.db_deta_clientes.put(update_data) + # clientes.db_deta_clientes.put(update_data) st.success("Dados atualizados com sucesso!") clientes.load_data() elif arquivo01 == 'Pratos': - pratos = pratos_update.Pratos(db_deta_pratos) + # pratos = pratos_update.Pratos(db_deta_pratos) pratos.show_table() id_to_update = st.number_input("Digite o ID do registro que deseja atualizar:", min_value=1, max_value=len(pratos.data)) update_data = None if st.button("Atualizar"): update_data = pratos.update_by_id(id_to_update) if update_data and st.button("Confirmar"): - pratos.db_deta_pratos.put(update_data) + # pratos.db_deta_pratos.put(update_data) st.success("Dados atualizados com sucesso!") pratos.load_data() elif arquivo01 == '🧑🏻‍🦱 Funcionários': - funcionarios = funcionarios_update.Funcionarios(db_deta_funcionarios) + # funcionarios = funcionarios_update.Funcionarios(db_deta_funcionarios) funcionarios.show_table() id_to_update = st.number_input("Digite o ID do registro que deseja atualizar:", min_value=1, max_value=len(funcionarios.data)) update_data = None if st.button("Atualizar"): update_data = funcionarios.update_by_id(id_to_update) if update_data and st.button("Confirmar"): - funcionarios.db_deta_funcionarios.put(update_data) + # funcionarios.db_deta_funcionarios.put(update_data) st.success("Dados atualizados com sucesso!") funcionarios.load_data() elif arquivo01 == 'Categoria de Vendas': - categoriavendas = categoria_vendas_update.CategoriaVendas(db_deta_categoriavendas) + # categoriavendas = categoria_vendas_update.CategoriaVendas(db_deta_categoriavendas) categoriavendas.show_table() id_to_update = st.number_input("Digite o ID do registro que deseja atualizar:", min_value=1, max_value=len(categoriavendas.data)) update_data = None if st.button("Atualizar"): update_data = categoriavendas.update_by_id(id_to_update) if update_data and st.button("Confirmar"): - categoriavendas.db_deta_categoriavendas.put(update_data) + # categoriavendas.db_deta_categoriavendas.put(update_data) st.success("Dados atualizados com sucesso!") categoriavendas.load_data() @@ -522,12 +522,12 @@ def get_img_as_base64(file): if selecionar == "📉 Previsão de Demanda": # previsaoDemanda.previsao_demanda() # def insert_demand_data(data): - # db_deta_previsao_demanda.put(data) + db_deta_previsao_demanda.put(data) # data = {"Data": "2023-05-12", "Hora": "10:00", "Clientes": 50} # insert_demand_data(data) # st.success("Dados inseridos com sucesso!") - previsaoDemanda.previsao_demanda() + previsaoDemanda.previsao_demanda() if selecionar == "📲 Dados Brutos": @@ -542,19 +542,19 @@ def get_img_as_base64(file): if st.checkbox("Clique aqui para ver os dados de bebidas",False): st.markdown("###### ESTES SÃO OS DADOS BRUTOS PARA TODAS AS COMPARAÇÕES E GRÁFICO") - st.write(dataDetaBebidas) + # st.write(dataDetaBebidas) if st.checkbox("Clique aqui para ver os dados de estoque",False): st.markdown("###### ESTES SÃO OS DADOS BRUTOS PARA TODAS AS COMPARAÇÕES E GRÁFICO") - st.write(dataDetaEstoque) + # st.write(dataDetaEstoque) if st.checkbox("Clique aqui para ver os dados de pratos",False): st.markdown("###### ESTES SÃO OS DADOS BRUTOS PARA TODAS AS COMPARAÇÕES E GRÁFICO") - st.write(dataDetaPratos) + # st.write(dataDetaPratos) if st.checkbox("Clique aqui para ver os dados de clientes",False): st.markdown("###### ESTES SÃO OS DADOS BRUTOS PARA TODAS AS COMPARAÇÕES E GRÁFICO") - st.write(dataDetaClientes) + # st.write(dataDetaClientes) else: @@ -780,61 +780,83 @@ def local_css(file_name): if selecionar == "💾 Consultar Dados": - select=st.selectbox('Selecione as opções para ver detalhes sobre suas bebidas', ['nome' , 'preco', 'quantidade', 'descricao', 'total_vendas', 'quantidade_vendas']) + # select=st.selectbox('Selecione as opções para ver detalhes sobre suas bebidas', ['nome' , 'preco', 'quantidade', 'descricao', 'total_vendas', 'quantidade_vendas']) if select == 'nome': - st.write(dataDetaBebidas.query("nome >= nome")[["key","nome"]]) + # st.write(dataDetaBebidas.query("nome >= nome")[["key","nome"]]) + pass elif select == 'preco': - st.write(dataDetaBebidas.query("preco >= preco")[["key","preco"]]) + # st.write(dataDetaBebidas.query("preco >= preco")[["key","preco"]]) + pass elif select == 'quantidade': - st.write(dataDetaBebidas.query("quantidade >= quantidade")[["key","quantidade"]]) + # st.write(dataDetaBebidas.query("quantidade >= quantidade")[["key","quantidade"]]) + pass elif select == 'descricao': - st.write(dataDetaBebidas.query("descricao >= descricao")[["key","descricao"]]) + # st.write(dataDetaBebidas.query("descricao >= descricao")[["key","descricao"]]) + pass elif select == 'total_vendas': - st.write(dataDetaBebidas.query("total_vendas >= total_vendas")[["key","total_vendas"]]) + # st.write(dataDetaBebidas.query("total_vendas >= total_vendas")[["key","total_vendas"]]) + pass else: - st.write(dataDetaBebidas.query("quantidade_vendas >= quantidade_vendas")[["key","quantidade_vendas"]]) + # st.write(dataDetaBebidas.query("quantidade_vendas >= quantidade_vendas")[["key","quantidade_vendas"]]) + pass - select = st.selectbox('Selecione as opções para ver detalhes sobre seus estoque', ['NOME' , 'QUANTIDADE']) + # select = st.selectbox('Selecione as opções para ver detalhes sobre seus estoque', ['NOME' , 'QUANTIDADE']) if select == 'NOME': - st.write(dataDetaEstoque.query("NOME >= NOME")[["key","NOME"]]) + # st.write(dataDetaEstoque.query("NOME >= NOME")[["key","NOME"]]) + pass else: - st.write(dataDetaEstoque.query("QUANTIDADE >= QUANTIDADE")[["key","QUANTIDADE"]]) + # st.write(dataDetaEstoque.query("QUANTIDADE >= QUANTIDADE")[["key","QUANTIDADE"]]) + pass - select = st.selectbox('Selecione as opções para ver detalhes sobre seus funcionários', ['NOME' , 'Cargo', 'ESPECIALIDADE', 'SALÁRIODIA', 'DIASTRABALHADOS']) + # select = st.selectbox('Selecione as opções para ver detalhes sobre seus funcionários', ['NOME' , 'Cargo', 'ESPECIALIDADE', 'SALÁRIODIA', 'DIASTRABALHADOS']) if select == 'NOME': - st.write(dataDetaFuncionarios.query("NOME >= NOME")[["key","NOME"]]) + # st.write(dataDetaFuncionarios.query("NOME >= NOME")[["key","NOME"]]) + pass elif select == 'Cargo': - st.write(dataDetaFuncionarios.query("Cargo >= Cargo")[["key","Cargo"]]) + # st.write(dataDetaFuncionarios.query("Cargo >= Cargo")[["key","Cargo"]]) + pass elif select == 'ESPECIALIDADE': - st.write(dataDetaFuncionarios.query("ESPECIALIDADE >= ESPECIALIDADE")[["key","ESPECIALIDADE"]]) + # st.write(dataDetaFuncionarios.query("ESPECIALIDADE >= ESPECIALIDADE")[["key","ESPECIALIDADE"]]) + pass elif select == 'DIASTRABALHADOS': - st.write(dataDetaFuncionarios.query("DIASTRABALHADOS >= DIASTRABALHADOS")[["key","DIASTRABALHADOS"]]) + # st.write(dataDetaFuncionarios.query("DIASTRABALHADOS >= DIASTRABALHADOS")[["key","DIASTRABALHADOS"]]) + pass else : - st.write(dataDetaFuncionarios.query("SALÁRIODIA >= SALÁRIODIA")[["key","SALÁRIODIA"]]) + # st.write(dataDetaFuncionarios.query("SALÁRIODIA >= SALÁRIODIA")[["key","SALÁRIODIA"]]) + pass - select = st.selectbox('Selecione as opções para ver detalhes sobre seus pratos', ['NOME' , 'PRECO', 'ACOMPANHAMENTO']) + # select = st.selectbox('Selecione as opções para ver detalhes sobre seus pratos', ['NOME' , 'PRECO', 'ACOMPANHAMENTO']) if select == 'NOME': - st.write(dataDetaPratos.query("NOME >= NOME")[["key","NOME"]]) + # st.write(dataDetaPratos.query("NOME >= NOME")[["key","NOME"]]) + pass elif select == 'PRECO': - st.write(dataDetaPratos.query("PRECO >= PRECO")[["key","PRECO"]]) + # st.write(dataDetaPratos.query("PRECO >= PRECO")[["key","PRECO"]]) + pass else : - st.write(dataDetaPratos.query("ACOMPANHAMENTO >= ACOMPANHAMENTO")[["key","ACOMPANHAMENTO"]]) + # st.write(dataDetaPratos.query("ACOMPANHAMENTO >= ACOMPANHAMENTO")[["key","ACOMPANHAMENTO"]]) + pass - select = st.selectbox('Selecione as opções para ver detalhes sobre suas reservas', ['NOME' , 'DATA', 'QTDRESERVAS']) + # select = st.selectbox('Selecione as opções para ver detalhes sobre suas reservas', ['NOME' , 'DATA', 'QTDRESERVAS']) if select == 'NOME': - st.write(dataDetaReservas.query("NOME >= NOME")[["key","NOME"]]) + # st.write(dataDetaReservas.query("NOME >= NOME")[["key","NOME"]]) + pass elif select == 'DATA': - st.write(dataDetaReservas.query("DATA >= DATA")[["key","DATA"]]) + # st.write(dataDetaReservas.query("DATA >= DATA")[["key","DATA"]]) + pass elif select == 'QTDRESERVAS': - st.write(dataDetaReservas.query("QTDRESERVAS >= QTDRESERVAS")[["key","QTDRESERVAS"]]) + # st.write(dataDetaReservas.query("QTDRESERVAS >= QTDRESERVAS")[["key","QTDRESERVAS"]]) + pass - select = st.selectbox('Selecione as opções para ver detalhes sobre suas vendas por categoria', ['ID', 'Categoria' , 'Vendas', 'PrecoMedio']) + # select = st.selectbox('Selecione as opções para ver detalhes sobre suas vendas por categoria', ['ID', 'Categoria' , 'Vendas', 'PrecoMedio']) if select == 'Categoria': - st.write(dataDetaCategoriaVendas.query("Categoria >= Categoria")[["key","Categoria"]]) + # st.write(dataDetaCategoriaVendas.query("Categoria >= Categoria")[["key","Categoria"]]) + pass elif select == 'Vendas': - st.write(dataDetaCategoriaVendas.query("Vendas >= Vendas")[["key","Vendas"]]) + # st.write(dataDetaCategoriaVendas.query("Vendas >= Vendas")[["key","Vendas"]]) + pass else : - st.write(dataDetaCategoriaVendas.query("PrecoMedio >= PrecoMedio")[["key","PrecoMedio"]]) + # st.write(dataDetaCategoriaVendas.query("PrecoMedio >= PrecoMedio")[["key","PrecoMedio"]]) + pass if selecionar == "🗓️ Cardápio": st.title("Cardápio") @@ -1012,33 +1034,34 @@ def plot_pie_chart(): st.markdown("### CLASSIFICAÇÃO DE BEBIDAS ★★★★★") # Fetch all items from the database - items = fetch_all_items_db(db_deta_bebidas) + # items = fetch_all_items_db(db_deta_bebidas) if items: # Create a DataFrame with the data - dataDetaBebidas = pd.DataFrame(items) - if "nome" in dataDetaBebidas.columns: - st.success("Data found in the 'bebidas' database.") + pass + # dataDetaBebidas = pd.DataFrame(items) + # if "nome" in dataDetaBebidas.columns: + st.success("Data found in the 'bebidas' database.") # Aggregate data by 'nome' column - data_agg = dataDetaBebidas.groupby("nome").agg({"total_vendas":"sum"}).reset_index() + # data_agg = dataDetaBebidas.groupby("nome").agg({"total_vendas":"sum"}).reset_index() # Create the pie chart - chart = alt.Chart(data_agg).mark_arc(innerRadius=50).encode( - theta=alt.Theta('total_vendas:Q', stack=True), - color=alt.Color("nome:N"), - tooltip=["nome:N", "total_vendas:Q"] - ).properties( - width=400, - height=400 - ).project( - type='pie' - ) - st.altair_chart(chart) - else: - st.error("Coluna 'nome' não existe.") - + chart = alt.Chart(data_agg).mark_arc(innerRadius=50).encode( + theta=alt.Theta('total_vendas:Q', stack=True), + color=alt.Color("nome:N"), + tooltip=["nome:N", "total_vendas:Q"] + ).properties( + width=400, + height=400 + ).project( + type='pie' + ) + st.altair_chart(chart) else: - st.warning("No data found in the 'bebidas' database.") + st.error("Coluna 'nome' não existe.") + + # else: + # st.warning("No data found in the 'bebidas' database.") plot_pie_chart() else: pass @@ -1049,6 +1072,6 @@ def plot_pie_chart(): elif authenticate_user == None: st.warning('Please enter your username and password') - session_start_time = st.session_state.get('session_start_time', time.time()) + # session_start_time = st.session_state.get('session_start_time', time.time()) - elapsed_time = time.time() - session_start_time + # elapsed_time = time.time() - session_start_time diff --git a/client/src/pages/login.py b/client/src/pages/login.py index 60a4d5bff..d3cceb623 100644 --- a/client/src/pages/login.py +++ b/client/src/pages/login.py @@ -1,86 +1,295 @@ +# import streamlit as st +# from deta import Deta +# from PIL import Image +# from streamlit_extras.let_it_rain import rain + + +# logo_img = Image.open('client/src/public/if-logo.png') + +# # Load environment variables +# DETA_KEY = "e0u31gqkqju_2Ps7fJD5a1kAKF2Rr4Y31ASSdvUUeX8Y" + +# # Initialize Deta +# deta = Deta(DETA_KEY) + +# db = deta.Base("data") +# db_blocked = deta.Base("userbloqueado") + + +# def authenticate_user(username, password): +# user = db.get(username) + +# if user: +# if user['password'] == password: +# return True +# else: +# # Se a senha estiver incorreta, aumentar o contador de falhas de login +# user['failed_logins'] = user.get('failed_logins', 0) + 1 + +# # Se o usuário falhou na autenticação 3 vezes, bloqueá-lo +# if user['failed_logins'] >= 3: +# db_blocked.put(user) # Adicionando o usuário ao banco de dados de usuários bloqueados +# db.delete(username) # Excluindo o usuário do banco de dados de usuários +# # send_email(user) # Enviar um email para o desenvolvedor +# st.error("Usuário bloqueado após 3 tentativas falhas de login.") +# return False + +# db.put(user) # Atualizando o contador de falhas de login no banco de dados de usuários +# return False +# else: +# return False + + +# def login_page(): +# rain( +# emoji="🎃", +# font_size=45, +# falling_speed=12, +# animation_length="infinite", +# ) +# opcao = st.radio("Escolha uma opção:", ("Fazer login", "Criar nova conta")) + +# if opcao == "Fazer login": +# if 'logged_in' not in st.session_state: +# st.session_state.logged_in = False + +# st.image(logo_img, use_column_width=True) +# username = st.text_input("Nome de usuário", key="username_input") +# password = st.text_input("Senha", type="password", key="password_input") + +# if st.button("Login"): +# if authenticate_user(username, password): +# st.session_state.logged_in = True +# with st.spinner("Carregando..."): +# st.success("Login efetuado com sucesso!") +# from time import sleep +# from stqdm import stqdm + +# for _ in stqdm(range(50), desc="configurando o servidor", mininterval=1): +# sleep(0.1) + +# st.balloons() + +# return True +# else: +# if username == "" and password == "": +# st.error("Por favor, insira um nome de usuário e senha.") + +# blocked_user = db_blocked.get(username) +# if blocked_user: +# st.error("Este usuário está bloqueado. Por favor, entre em contato com o suporte para mais informações.") +# return False +# else: +# st.error("Nome de usuário ou senha incorretos.") +# st.info("Se você esqueceu sua senha, entre em contato com o administrador.") +# st.markdown(""" +# +# """, unsafe_allow_html=True) + +# st.header("Contact") + +# contact_form = """ +#
+#
+#
+# +#
+#
+# +#
+#
+# +#
+#
+# +#
+#
+#
+# """.format("estevamsouzalaureth@gmail.com") # Substitua o endereço de e-mail aqui + +# javascript_code = """ +# +# """ + +# st.markdown(contact_form + javascript_code, unsafe_allow_html=True) + +# return False + +# else: +# from .criar_conta import criar_conta +# st.image(logo_img, use_column_width=True) +# return criar_conta() + + import streamlit as st -from deta import Deta from PIL import Image from streamlit_extras.let_it_rain import rain logo_img = Image.open('client/src/public/if-logo.png') -# Load environment variables -DETA_KEY = "e0u31gqkqju_2Ps7fJD5a1kAKF2Rr4Y31ASSdvUUeX8Y" - -# Initialize Deta -deta = Deta(DETA_KEY) +# Caminho para o arquivo .txt com os dados de login +USERS_FILE = 'usuarios.txt' # O arquivo .txt onde os usuários estão armazenados -db = deta.Base("data") -db_blocked = deta.Base("userbloqueado") +# Função para ler os usuários e senhas do arquivo .txt +def read_users_from_file(): + users = {} + try: + with open(USERS_FILE, 'r') as file: + for line in file.readlines(): + line = line.strip() # Remove espaços em branco no início e no final + if line: # Ignora linhas vazias + if ',' in line: # Verifica se a linha contém uma vírgula para dividir + try: + username, password = line.split(',') + users[username] = password + except ValueError: + st.warning(f"Formato inválido na linha: '{line}'. Ignorando...") + else: + st.warning(f"Formato inválido na linha: '{line}'. Esperava-se uma vírgula para separar usuário e senha.") + except FileNotFoundError: + st.error(f"O arquivo {USERS_FILE} não foi encontrado.") + return users +# Função de autenticação def authenticate_user(username, password): - user = db.get(username) - - if user: - if user['password'] == password: - return True + users = read_users_from_file() # Lê os usuários do arquivo + if username in users: + if users[username] == password: + return True + else: + st.error("Senha incorreta.") + return False else: - # Se a senha estiver incorreta, aumentar o contador de falhas de login - user['failed_logins'] = user.get('failed_logins', 0) + 1 - - # Se o usuário falhou na autenticação 3 vezes, bloqueá-lo - if user['failed_logins'] >= 3: - db_blocked.put(user) # Adicionando o usuário ao banco de dados de usuários bloqueados - db.delete(username) # Excluindo o usuário do banco de dados de usuários - # send_email(user) # Enviar um email para o desenvolvedor - st.error("Usuário bloqueado após 3 tentativas falhas de login.") - return False - - db.put(user) # Atualizando o contador de falhas de login no banco de dados de usuários + st.error("Nome de usuário não encontrado.") return False - else: - return False - def login_page(): - rain( - emoji="🎃", - font_size=45, - falling_speed=12, - animation_length="infinite", - ) - opcao = st.radio("Escolha uma opção:", ("Fazer login", "Criar nova conta")) - - if opcao == "Fazer login": - if 'logged_in' not in st.session_state: - st.session_state.logged_in = False - - st.image(logo_img, use_column_width=True) - username = st.text_input("Nome de usuário", key="username_input") - password = st.text_input("Senha", type="password", key="password_input") - - if st.button("Login"): - if authenticate_user(username, password): - st.session_state.logged_in = True - with st.spinner("Carregando..."): - st.success("Login efetuado com sucesso!") - from time import sleep - from stqdm import stqdm - - for _ in stqdm(range(50), desc="configurando o servidor", mininterval=1): - sleep(0.1) - - st.balloons() + rain( + emoji="🎃", + font_size=45, + falling_speed=12, + animation_length="infinite", + ) + opcao = st.radio("Escolha uma opção:", ("Fazer login")) - return True - else: - if username == "" and password == "": - st.error("Por favor, insira um nome de usuário e senha.") + if opcao == "Fazer login": + if 'logged_in' not in st.session_state: + st.session_state.logged_in = False - blocked_user = db_blocked.get(username) - if blocked_user: - st.error("Este usuário está bloqueado. Por favor, entre em contato com o suporte para mais informações.") - return False + st.image(logo_img, use_column_width=True) + username = st.text_input("Nome de usuário", key="username_input") + password = st.text_input("Senha", type="password", key="password_input") + + if st.button("Login"): + if authenticate_user(username, password): + st.session_state.logged_in = True + with st.spinner("Carregando..."): + st.success("Login efetuado com sucesso!") + from time import sleep + from stqdm import stqdm + + for _ in stqdm(range(50), desc="configurando o servidor", mininterval=1): + sleep(0.1) + + st.balloons() + + return True else: - st.error("Nome de usuário ou senha incorretos.") + if username == "" and password == "": + st.error("Por favor, insira um nome de usuário e senha.") st.info("Se você esqueceu sua senha, entre em contato com o administrador.") st.markdown(""" """, unsafe_allow_html=True) + + st.header("Contact") + + contact_form = """ +
+ + + + + +
+ """.format("estevamsouzalaureth@gmail.com") # Substitua o endereço de e-mail aqui + + st.markdown(contact_form, unsafe_allow_html=True) + import os + def local_css(file_name): + path = os.path.dirname(__file__) + file_name = path+"/"+file_name + with open(file_name) as f: + st.markdown(f"", unsafe_allow_html=True) + + local_css("src/styles/email_style.css") + + if selecionar == "📋 Mapa": + mapa.mapaVisual() + + if selecionar == "💾 Consultar Dados": + + select=st.selectbox('Selecione as opções para ver detalhes sobre suas bebidas', ['nome' , 'preco', 'quantidade', 'descricao', 'total_vendas', 'quantidade_vendas']) + if select == 'nome': + st.write(dataDetaBebidas.query("nome >= nome")[["key","nome"]]) + elif select == 'preco': + st.write(dataDetaBebidas.query("preco >= preco")[["key","preco"]]) + elif select == 'quantidade': + st.write(dataDetaBebidas.query("quantidade >= quantidade")[["key","quantidade"]]) + elif select == 'descricao': + st.write(dataDetaBebidas.query("descricao >= descricao")[["key","descricao"]]) + elif select == 'total_vendas': + st.write(dataDetaBebidas.query("total_vendas >= total_vendas")[["key","total_vendas"]]) + else: + st.write(dataDetaBebidas.query("quantidade_vendas >= quantidade_vendas")[["key","quantidade_vendas"]]) + + select = st.selectbox('Selecione as opções para ver detalhes sobre seus estoque', ['NOME' , 'QUANTIDADE']) + if select == 'NOME': + st.write(dataDetaEstoque.query("NOME >= NOME")[["key","NOME"]]) + else: + st.write(dataDetaEstoque.query("QUANTIDADE >= QUANTIDADE")[["key","QUANTIDADE"]]) + + select = st.selectbox('Selecione as opções para ver detalhes sobre seus funcionários', ['NOME' , 'Cargo', 'ESPECIALIDADE', 'SALÁRIODIA', 'DIASTRABALHADOS']) + if select == 'NOME': + st.write(dataDetaFuncionarios.query("NOME >= NOME")[["key","NOME"]]) + elif select == 'Cargo': + st.write(dataDetaFuncionarios.query("Cargo >= Cargo")[["key","Cargo"]]) + elif select == 'ESPECIALIDADE': + st.write(dataDetaFuncionarios.query("ESPECIALIDADE >= ESPECIALIDADE")[["key","ESPECIALIDADE"]]) + elif select == 'DIASTRABALHADOS': + st.write(dataDetaFuncionarios.query("DIASTRABALHADOS >= DIASTRABALHADOS")[["key","DIASTRABALHADOS"]]) + else : + st.write(dataDetaFuncionarios.query("SALÁRIODIA >= SALÁRIODIA")[["key","SALÁRIODIA"]]) + + select = st.selectbox('Selecione as opções para ver detalhes sobre seus pratos', ['NOME' , 'PRECO', 'ACOMPANHAMENTO']) + if select == 'NOME': + st.write(dataDetaPratos.query("NOME >= NOME")[["key","NOME"]]) + elif select == 'PRECO': + st.write(dataDetaPratos.query("PRECO >= PRECO")[["key","PRECO"]]) + else : + st.write(dataDetaPratos.query("ACOMPANHAMENTO >= ACOMPANHAMENTO")[["key","ACOMPANHAMENTO"]]) + + select = st.selectbox('Selecione as opções para ver detalhes sobre suas reservas', ['NOME' , 'DATA', 'QTDRESERVAS']) + if select == 'NOME': + st.write(dataDetaReservas.query("NOME >= NOME")[["key","NOME"]]) + elif select == 'DATA': + st.write(dataDetaReservas.query("DATA >= DATA")[["key","DATA"]]) + elif select == 'QTDRESERVAS': + st.write(dataDetaReservas.query("QTDRESERVAS >= QTDRESERVAS")[["key","QTDRESERVAS"]]) + + select = st.selectbox('Selecione as opções para ver detalhes sobre suas vendas por categoria', ['ID', 'Categoria' , 'Vendas', 'PrecoMedio']) + if select == 'Categoria': + st.write(dataDetaCategoriaVendas.query("Categoria >= Categoria")[["key","Categoria"]]) + elif select == 'Vendas': + st.write(dataDetaCategoriaVendas.query("Vendas >= Vendas")[["key","Vendas"]]) + else : + st.write(dataDetaCategoriaVendas.query("PrecoMedio >= PrecoMedio")[["key","PrecoMedio"]]) + + if selecionar == "🗓️ Cardápio": + st.title("Cardápio") + + # --- Mobile --- + with st.container(): + st.write("---") + st.header("Escanear QR Code para acessar o Cardápio do Restaurante") + st.caption("Pergunta: O Streamlit tem uma maneira de verificar o tipo de dispositivo como em `shinybrowser` em `R`") + st.write("##") + + col1, col2 = st.columns(2) + with col1: + data = 'https://www.canva.com/design/DAEwG-zH_V8/lOWLoNLC7qNkLbx3xmKxiw/view?utm_content=DAEwG-zH_V8&utm_campaign=designshare&utm_medium=link&utm_source=viewer' + img = qrcode.make(data) + img.save("app_qr.png") + st.image("app_qr.png") + with col2: + st.header("Notas sobre infraestrutura") + st.subheader("Código hospedado no Github e implantado no Heroku Run com Docker 🐋") + st.write("Contribua para o Repo abaixo") + st.write("https://github.com/big-data-estacio/data") + + if selecionar == "📝 Grafico de Vendas por Categoria": + categoria_grafico.vendas_por_categoria() + + if selecionar == "📑 Previsão de Clientes": + def get_img_as_base64(file): + with open(file, "rb") as f: + data = f.read() + return base64.b64encode(data).decode() + + def load_lottiefile(filepath: str): + with open(filepath, "r") as f: + return json.load(f) + + img = get_img_as_base64("client/src/public/tree.png") + snow_animation = load_lottiefile("client/src/public/lottie-snow.json") + + st_lottie(snow_animation, height=600, key="initial") + + if selecionar == "🗂️ Previsão de Vendas": + previsaoVendas.cadastrar_venda() + + if selecionar == "Reservas": + reservas.reservar() + + if selecionar == "🤖 Dúvidas (OpenAI Responde)": + import os + import openai + import re + + GPT_SYSTEM_INSTRUCTIONS = """Write Manim scripts for animations in Python. Generate code, not text. Never explain code. Never add functions. Never add comments. Never infinte loops. Never use other library than Manim/math. Only complete the code block. Use variables with length of maximum 2 characters. At the end use 'self.play'. + + ``` + from manim import * + from math import * + + class GenScene(Scene): + def construct(self): + # Write here + ```""" + + def wrap_prompt(prompt: str) -> str: + """ + Wraps the prompt in the GPT-3.5 instructions + """ + return f"Animation Request: {prompt}" + + def extract_code(text: str) -> str: + """ + Extracts the code from the text generated by GPT-3.5 from the ``` ``` blocks + """ + pattern = re.compile(r"```(.*?)```", re.DOTALL) + match = pattern.search(text) + if match: + return match.group(1).strip() + else: + return text + + def extract_construct_code(code_str: str) -> str: + """ + Extracts the code from the construct method + """ + pattern = r"def construct\(self\):([\s\S]*)" + match = re.search(pattern, code_str) + if match: + return match.group(1) + else: + return "" + + def code_static_corrector(code_response: str) -> str: + """ + Corrects some static errors in the code + GPT only has information until 2021, so it ocasionally generates code + that is not compatible with the latest version of Manim + """ + # Replace ShowCreation with Create + # Solution: https://www.reddit.com/r/manim/comments/qcosuj/nameerror_name_showcreation_is_not_defined/ + code_response = code_response.replace("ShowCreation", "Create") + + return code_response + + def create_file_content(code_response: str) -> str: + """ + Creates the content of the file to be written + """ + return f"""# Manim code generated with OpenAI GPT + # Command to generate animation: manim GenScene.py GenScene --format=mp4 --media_dir . --custom_folders video_dir + + from manim import * + from math import * + + class GenScene(Scene): + def construct(self): + {code_static_corrector(code_response)}""" + + + # icon = Image.open(os.path.dirname(__file__) + '/../icon.png') + + # st.set_page_config(page_icon=icon) + + st.markdown('# 🤖 Prompt Enginner') + + st.write("A engenharia de prompt consiste em fornecer instruções corretas ao GPT-4. Quanto mais precisas as instruções, melhores os resultados. O objetivo é gerar código Manim a partir de uma parte específica do código. Então você pode usar o código para renderizar a animação.") + + prompt = st.text_area("Escreva sua ideia de animação aqui. Use palavras simples.", + "Onde que fica localizado o restaurante pedacinho do céu?") + + openai_api_key = st.text_input( + "Cole o seu [Open API Key](https://platform.openai.com/account/api-keys)", value="", type="password") + + openai_model = st.selectbox( + "Selecione o modelo GPT. Se você não tiver acesso ao GPT-4, selecione GPT-3.5-Turbo", ["GPT-3.5-Turbo", "GPT-4"]) + + generate_prompt = st.button( + ":computer: Gerar prompt :sparkles:", type="primary") + + if generate_prompt: + if not openai_api_key: + st.error("Error: Você precisa fornecer sua própria chave de API aberta para usar esse recurso.") + st.stop() + if not prompt: + st.error("Error: Você precisa fornecer um prompt.") + st.stop() + + response = openai.ChatCompletion.create( + model=openai_model.lower(), + messages=[ + {"role": "system", "content": GPT_SYSTEM_INSTRUCTIONS}, + {"role": "user", "content": wrap_prompt(prompt)} + ] + ) + + code_response = extract_code(response.choices[0].message.content) + + code_response = extract_construct_code(code_response) + + st.text_area(label="Código gerado: ", + value=code_response, + key="code_input") + + + if selecionar == "📊 Gráficos": + getOption = st.selectbox("Selecione o gráfico que deseja visualizar", ["Gráfico de Pizza", "Gráfico de Dispersão"]) + + if getOption == "Gráfico de Pizza": + def fetch_all_items_db(db): + items = [] + for item in db.fetch().items: + items.extend(item) + return items + + def plot_pie_chart(): + st.markdown("### CLASSIFICAÇÃO DE BEBIDAS ★★★★★") + + # Fetch all items from the database + items = fetch_all_items_db(db_deta_bebidas) + + if items: + # Create a DataFrame with the data + dataDetaBebidas = pd.DataFrame(items) + if "nome" in dataDetaBebidas.columns: + st.success("Data found in the 'bebidas' database.") + # Aggregate data by 'nome' column + data_agg = dataDetaBebidas.groupby("nome").agg({"total_vendas":"sum"}).reset_index() + + # Create the pie chart + chart = alt.Chart(data_agg).mark_arc(innerRadius=50).encode( + theta=alt.Theta('total_vendas:Q', stack=True), + color=alt.Color("nome:N"), + tooltip=["nome:N", "total_vendas:Q"] + ).properties( + width=400, + height=400 + ).project( + type='pie' + ) + st.altair_chart(chart) + else: + st.error("Coluna 'nome' não existe.") + + else: + st.warning("No data found in the 'bebidas' database.") + plot_pie_chart() + else: + pass + + elif authenticate_user == False: + # st.error('Username/password is incorrect') + pass + elif authenticate_user == None: + st.warning('Please enter your username and password') + + session_start_time = st.session_state.get('session_start_time', time.time()) + + elapsed_time = time.time() - session_start_time diff --git a/requirements.txt b/requirements.txt index dd6dc6f81..f34f51c19 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,25 +1,123 @@ -pandas==2.0.1 -Markdown==3.4.3 -markdown-it-py==2.2.0 -markdownlit==0.0.7 -matplotlib==3.7.1 -Pillow==8.4.0 -plotly==5.14.1 -html5lib==1.1 -stqdm==0.0.5 -openai==0.27.7 -deta==1.1.0 -streamlit==1.22.0 -streamlit-camera-input-live==0.2.0 -streamlit-card==0.0.4 -streamlit-embedcode==0.1.2 -streamlit-extras==0.2.7 -streamlit-faker==0.0.2 -streamlit-image-coordinates==0.1.3 -streamlit-keyup==0.2.0 -streamlit-lottie==0.0.3 -streamlit-toggle-switch==1.0.2 -streamlit-vertical-slider==1.0.2 +# pandas==2.0.1 +# Markdown==3.4.3 +# markdown-it-py==2.2.0 +# markdownlit==0.0.7 +# matplotlib==3.7.1 +# # Pillow==8.4.0 +# plotly==5.14.1 +# html5lib==1.1 +# stqdm==0.0.5 +# openai==0.27.7 +# deta==1.1.0 +# streamlit==1.22.0 +# streamlit-camera-input-live==0.2.0 +# streamlit-card==0.0.4 +# streamlit-embedcode==0.1.2 +# streamlit-extras==0.2.7 +# streamlit-faker==0.0.2 +# streamlit-image-coordinates==0.1.3 +# streamlit-keyup==0.2.0 +# streamlit-lottie==0.0.3 +# streamlit-toggle-switch==1.0.2 +# streamlit-vertical-slider==1.0.2 +# # aiohttp==3.8.4 +# aiosignal==1.3.1 +# altair==4.2.2 +# async-timeout==4.0.2 +# attrs==23.1.0 +# beautifulsoup4==4.12.2 +# blinker==1.6.2 +# Brotli==1.0.9 +# cachetools==5.3.0 +# certifi==2023.5.7 +# cffi==1.15.1 +# charset-normalizer==3.1.0 +# click==8.1.3 +# contourpy==1.0.7 +# cssselect2==0.7.0 +# cycler==0.11.0 +# decorator==5.1.1 +# entrypoints==0.4 +# Faker==18.9.0 +# favicon==0.7.0 +# fonttools==4.39.4 +# # frozenlist==1.3.3 +# gitdb==4.0.10 +# GitPython==3.1.31 +# htbuilder==0.6.1 +# idna==3.4 +# importlib-metadata==6.6.0 +# Jinja2==3.1.2 +# jsonschema==4.17.3 +# kiwisolver==1.4.4 +# # lxml==4.9.2 +# MarkupSafe==2.1.2 +# mdurl==0.1.2 +# more-itertools==9.1.0 +# # multidict==6.0.4 +# # numpy==1.24.3 +# packaging==23.1 +# protobuf==3.20.3 +# # pyarrow==12.0.0 +# pycparser==2.21 +# pydeck==0.8.1b0 +# pydyf==0.6.0 +# Pygments==2.15.1 +# pymdown-extensions==10.0.1 +# Pympler==1.0.1 +# pyphen==0.14.0 +# pypng==0.20220715.0 +# pyrsistent==0.19.3 +# python-dateutil==2.8.2 +# pytz==2023.3 +# # PyYAML==6.0 +# qrcode==7.4.2 +# requests==2.31.0 +# rich==13.3.5 +# six==1.16.0 +# smmap==5.0.0 +# soupsieve==2.4.1 +# st-annotated-text==4.0.0 +# tenacity==8.2.2 +# tinycss2==1.2.1 +# toml==0.10.2 +# toolz==0.12.0 +# tornado==6.3.2 +# tqdm==4.65.0 +# typing_extensions==4.6.0 +# tzdata==2023.3 +# tzlocal==5.0.1 +# urllib3==2.0.2 +# validators==0.20.0 +# watchdog==3.0.0 +# weasyprint==59.0 +# webencodings==0.5.1 +# yarl==1.9.2 +# zipp==3.15.0 +# zopfli==0.2.2 + +pandas +Markdown +markdown-it-py +markdownlit +matplotlib +# Pillow +plotly +html5lib +stqdm +openai +deta +streamlit +streamlit-camera-input-live +streamlit-card +streamlit-embedcode +streamlit-extras +streamlit-faker +streamlit-image-coordinates +streamlit-keyup +streamlit-lottie +streamlit-toggle-switch +streamlit-vertical-slider # aiohttp==3.8.4 # aiosignal==1.3.1 # altair==4.2.2 diff --git a/usuarios.txt b/usuarios.txt new file mode 100644 index 000000000..f5ad45f7a --- /dev/null +++ b/usuarios.txt @@ -0,0 +1,3 @@ +usuario1,senha1 +usuario2,senha2 +usuario3,senha3