Fix script paths and move assets to public/ folder for Vite build compatibility

This commit is contained in:
Marcos
2026-03-22 20:45:20 -03:00
parent 304504b758
commit 57ba9d1c5f
155 changed files with 10614 additions and 26 deletions

View File

@@ -0,0 +1,144 @@
#!/usr/bin/env python3
"""
Conversor AUTOMÁTICO de CSVs para JavaScript
Lê TODAS as colunas automaticamente de cada CSV
"""
import csv
import json
import os
from datetime import datetime
# Lista de arquivos CSV para processar
CSV_FILES = {
'cantoneiras': 'BD/perfis/cantoneiras_brasil_completo.csv',
'barras_redondas': 'BD/perfis/barras_brasil_completo.csv',
'tubos_circulares': 'BD/perfis/tubos_circulares_brasil_completo.csv',
'perfis_i': 'BD/perfis/perfis_i_brasil_completo.csv',
'perfis_w': 'BD/perfis/perfis_w_brasil_completo.csv',
'tubos_rhs': 'BD/perfis/tubos_rhs_brasil_completo.csv',
'chapas': 'BD/perfis/chapas_brasil_completo.csv',
'perfis_hp': 'BD/perfis/perfis_hp_brasil_completo.csv',
'barras_roscadas': 'BD/perfis/barras_roscadas_brasil_completo.csv',
'barras_chatas': 'BD/perfis/barras_chatas_brasil_completo.csv'
}
def converter_valor(valor, coluna):
"""Converte valor para o tipo correto"""
valor = str(valor).strip().strip('"')
# Colunas numéricas
if any(x in coluna for x in ['_mm', '_kg', '_cm', '_m2', '_mpa', '_pol']):
try:
return float(valor)
except:
return 0
return valor
def ler_csv_automatico(arquivo):
"""Lê CSV automaticamente detectando todas as colunas"""
dados = []
if not os.path.exists(arquivo):
print(f"⚠️ Arquivo não encontrado: {arquivo}")
return dados, []
try:
with open(arquivo, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
colunas = reader.fieldnames
for row in reader:
item = {}
for col in colunas:
item[col] = converter_valor(row[col], col)
dados.append(item)
print(f"{arquivo}: {len(dados)} itens, {len(colunas)} colunas")
return dados, colunas
except Exception as e:
print(f"❌ Erro ao ler {arquivo}: {e}")
return dados, []
def gerar_javascript(dados_todos):
"""Gera arquivo JavaScript com todos os dados"""
timestamp = datetime.now().timestamp()
js_content = f'''/**
* BANCO DE DADOS COMPLETO - Todos os Perfis
* Dados embutidos em JavaScript para funcionamento autônomo
* Gerado automaticamente a partir dos CSVs
*
* @version 2.0.0
* @date {timestamp}
*/
const BANCO_DADOS_PERFIS = {json.dumps(dados_todos, indent=2, ensure_ascii=False)};
// Exportar para uso global
if (typeof window !== 'undefined') {{
window.BANCO_DADOS_PERFIS = BANCO_DADOS_PERFIS;
}}
console.log('✅ Banco de dados carregado:', Object.keys(BANCO_DADOS_PERFIS).length, 'tipos');
'''
return js_content
def main():
print("╔════════════════════════════════════════════════════════════╗")
print("║ Conversor AUTOMÁTICO de CSVs para JavaScript ║")
print("╠════════════════════════════════════════════════════════════╣")
print("║ Lê TODAS as colunas automaticamente de cada CSV ║")
print("╚════════════════════════════════════════════════════════════╝")
print()
dados_todos = {}
total_itens = 0
for tipo, arquivo in CSV_FILES.items():
print(f"📊 Processando {tipo}...")
dados, colunas = ler_csv_automatico(arquivo)
if dados:
dados_todos[tipo] = dados
total_itens += len(dados)
print(f" Colunas: {', '.join(colunas[:5])}...")
print()
if not dados_todos:
print("❌ Nenhum dado foi processado!")
return
print("🔧 Gerando arquivo JavaScript...")
js_content = gerar_javascript(dados_todos)
# Salvar arquivo
output_file = 'js/database/banco-dados-completo.js'
os.makedirs(os.path.dirname(output_file), exist_ok=True)
with open(output_file, 'w', encoding='utf-8') as f:
f.write(js_content)
file_size = os.path.getsize(output_file)
print(f"✅ Arquivo gerado: {output_file}")
print(f"📊 Total de itens: {total_itens}")
print(f"📁 Tamanho: {file_size} bytes (~{file_size//1024}KB)")
print()
print("╔════════════════════════════════════════════════════════════╗")
print("║ ✅ CONVERSÃO CONCLUÍDA ║")
print("╠════════════════════════════════════════════════════════════╣")
print(f"║ Arquivo gerado: {output_file:40s}")
print("║ ║")
print("║ Próximos passos: ║")
print("║ 1. Testar aplicação ║")
print("║ 2. Verificar carregamento dos dados ║")
print("║ 3. Fazer deploy ║")
print("╚════════════════════════════════════════════════════════════╝")
if __name__ == '__main__':
main()

View File

@@ -0,0 +1,172 @@
#!/usr/bin/env python3
"""
Conversor de CSVs para JavaScript
Converte todos os CSVs da pasta BD/perfis/ em um arquivo JavaScript
"""
import csv
import json
import os
from pathlib import Path
# Configuração dos arquivos CSV
CSV_CONFIG = {
'cantoneiras': {
'arquivo': 'BD/perfis/cantoneiras_brasil_completo.csv',
'colunas': ['id', 'nome', 'lado_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'momento_inercia_cm4', 'raio_giracao_cm', 'tipo']
},
'barras_redondas': {
'arquivo': 'BD/perfis/barras_brasil_completo.csv',
'colunas': ['id', 'nome', 'diametro_mm', 'peso_kg_m', 'area_cm2', 'momento_inercia_cm4', 'raio_giracao_cm', 'aplicacao', 'tipo']
},
'tubos_circulares': {
'arquivo': 'BD/perfis/tubos_circulares_brasil_completo.csv',
'colunas': ['id', 'nome', 'diametro_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'momento_inercia_cm4', 'raio_giracao_cm', 'aplicacao', 'tipo']
},
'perfis_i': {
'arquivo': 'BD/perfis/perfis_i_brasil_completo.csv',
'colunas': ['id', 'nome', 'altura_mm', 'largura_mm', 'espessura_alma_mm', 'espessura_mesa_mm', 'peso_kg_m', 'area_cm2', 'tipo']
},
'perfis_w': {
'arquivo': 'BD/perfis/perfis_w_brasil_completo.csv',
'colunas': ['id', 'nome', 'altura_mm', 'largura_mm', 'espessura_alma_mm', 'espessura_mesa_mm', 'peso_kg_m', 'area_cm2', 'tipo']
},
'tubos_rhs': {
'arquivo': 'BD/perfis/tubos_rhs_brasil_completo.csv',
'colunas': ['id', 'nome', 'largura_mm', 'altura_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'tipo']
},
'chapas': {
'arquivo': 'BD/perfis/chapas_brasil_completo.csv',
'colunas': ['id', 'nome', 'espessura_mm', 'peso_kg_m2', 'tipo']
},
'perfis_hp': {
'arquivo': 'BD/perfis/perfis_hp_brasil_completo.csv',
'colunas': ['id', 'nome', 'altura_mm', 'largura_mm', 'espessura_alma_mm', 'espessura_mesa_mm', 'peso_kg_m', 'area_cm2', 'tipo']
},
'barras_roscadas': {
'arquivo': 'BD/perfis/barras_roscadas_brasil_completo.csv',
'colunas': ['id', 'nome', 'diametro_mm', 'passo_mm', 'peso_kg_m', 'area_cm2', 'tipo']
},
'barras_chatas': {
'arquivo': 'BD/perfis/barras_chatas_brasil_completo.csv',
'colunas': ['id', 'nome', 'largura_mm', 'espessura_mm', 'peso_kg_m', 'area_cm2', 'tipo']
}
}
def converter_valor(valor, coluna):
"""Converte valor para o tipo correto"""
valor = valor.strip().strip('"')
# Colunas numéricas
if any(x in coluna for x in ['_mm', '_kg', '_cm', '_m2']):
try:
return float(valor)
except:
return 0
return valor
def ler_csv(arquivo, colunas):
"""Lê um arquivo CSV e retorna lista de dicionários"""
dados = []
if not os.path.exists(arquivo):
print(f"⚠️ Arquivo não encontrado: {arquivo}")
return dados
try:
with open(arquivo, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
item = {}
for col in colunas:
if col in row:
item[col] = converter_valor(row[col], col)
else:
item[col] = ''
dados.append(item)
print(f"{arquivo}: {len(dados)} itens")
return dados
except Exception as e:
print(f"❌ Erro ao ler {arquivo}: {e}")
return dados
def gerar_javascript(dados_todos):
"""Gera arquivo JavaScript com todos os dados"""
js_content = '''/**
* BANCO DE DADOS COMPLETO - Todos os Perfis
* Dados embutidos em JavaScript para funcionamento autônomo
* Gerado automaticamente a partir dos CSVs
*
* @version 1.0.0
* @date ''' + str(Path(__file__).stat().st_mtime) + '''
*/
const BANCO_DADOS_PERFIS = '''
js_content += json.dumps(dados_todos, indent=2, ensure_ascii=False)
js_content += ''';
// Exportar para uso global
window.BANCO_DADOS_PERFIS = BANCO_DADOS_PERFIS;
console.log('✅ Banco de dados completo carregado');
console.log('📊 Tipos disponíveis:', Object.keys(BANCO_DADOS_PERFIS));
Object.entries(BANCO_DADOS_PERFIS).forEach(([tipo, dados]) => {
console.log(` - ${tipo}: ${dados.length} itens`);
});
'''
return js_content
def main():
print("""
╔════════════════════════════════════════════════════════════╗
║ Conversor de CSVs para JavaScript ║
╠════════════════════════════════════════════════════════════╣
║ Converte todos os CSVs em um arquivo JavaScript único ║
╚════════════════════════════════════════════════════════════╝
""")
dados_todos = {}
total_itens = 0
# Processar cada CSV
for tipo, config in CSV_CONFIG.items():
print(f"\n📊 Processando {tipo}...")
dados = ler_csv(config['arquivo'], config['colunas'])
dados_todos[tipo] = dados
total_itens += len(dados)
# Gerar arquivo JavaScript
print(f"\n🔧 Gerando arquivo JavaScript...")
js_content = gerar_javascript(dados_todos)
# Salvar arquivo
output_file = 'js/database/banco-dados-completo.js'
with open(output_file, 'w', encoding='utf-8') as f:
f.write(js_content)
print(f"\n✅ Arquivo gerado: {output_file}")
print(f"📊 Total de itens: {total_itens}")
print(f"📁 Tamanho: {len(js_content)} bytes (~{len(js_content)//1024}KB)")
print("""
╔════════════════════════════════════════════════════════════╗
║ ✅ CONVERSÃO CONCLUÍDA ║
╠════════════════════════════════════════════════════════════╣
║ Arquivo gerado: js/database/banco-dados-completo.js ║
║ ║
║ Próximos passos: ║
║ 1. Adicionar script no index.html ║
║ 2. Testar aplicação ║
║ 3. Fazer deploy ║
╚════════════════════════════════════════════════════════════╝
""")
if __name__ == '__main__':
main()

View File

View File

@@ -0,0 +1,18 @@
import subprocess
repo_dir = r"m:\OFICIAIS E FUNCIONANDO\STEELBASE"
# @@ -> %40%40 (Codificação URL padrão para caracteres especiais)
remote_url = "https://admtracksteel:%40%40Gi05Br;;@git.reifonas.cloud/admtracksteel/SteelBase.git"
def run_git(args):
result = subprocess.run(["git"] + args, cwd=repo_dir, capture_output=True, text=True)
if result.returncode != 0:
print(f"Erro em git {' '.join(args)}: {result.stderr}")
else:
print(f"Sucesso em git {' '.join(args)}")
return result.returncode
run_git(["remote", "set-url", "origin", remote_url])
run_git(["branch", "-M", "main"])
print("Iniciando Push de Elite Codificado...")
run_git(["push", "-u", "origin", "main", "--force"])

27
public/scripts/server.bat Normal file
View File

@@ -0,0 +1,27 @@
@echo off
echo.
echo ╔════════════════════════════════════════════════════════════╗
echo ║ AÇO CALC PRO - Iniciando Servidor ║
echo ╚════════════════════════════════════════════════════════════╝
echo.
REM Verificar se Python está instalado
python --version >nul 2>&1
if %errorlevel% neq 0 (
echo ❌ Python não encontrado!
echo.
echo Por favor, instale Python 3:
echo https://www.python.org/downloads/
echo.
pause
exit /b 1
)
echo ✅ Python encontrado
echo.
echo 🚀 Iniciando servidor...
echo.
python server.py
pause

66
public/scripts/server.py Normal file
View File

@@ -0,0 +1,66 @@
#!/usr/bin/env python3
"""
Servidor HTTP simples para SteelBase
Execute: python server.py
Acesse: http://localhost:8000
"""
import http.server
import socketserver
import os
import webbrowser
import threading
PORT = 8000
class MyHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
def end_headers(self):
# Adicionar headers CORS
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Headers', 'Content-Type')
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
super().end_headers()
def do_GET(self):
# Se acessar a raiz, redirecionar para index.html
if self.path == '/':
self.path = '/index.html'
return super().do_GET()
def open_browser():
"""Abre o navegador automaticamente após 1 segundo"""
import time
time.sleep(1)
webbrowser.open(f'http://localhost:{PORT}/index.html')
if __name__ == '__main__':
os.chdir(os.path.dirname(os.path.abspath(__file__)))
with socketserver.TCPServer(("", PORT), MyHTTPRequestHandler) as httpd:
print(f"""
╔════════════════════════════════════════════════════════════╗
║ SteelBase - Servidor ║
╠════════════════════════════════════════════════════════════╣
║ ║
║ ✅ Servidor iniciado com sucesso! ║
║ ║
║ 🌐 Acesse: http://localhost:{PORT}/index.html ║
║ ║
║ 📁 Servindo: {os.getcwd()[:45]}... ║
║ ║
║ 🚀 Abrindo navegador automaticamente... ║
║ ║
║ ⚠️ Pressione Ctrl+C para parar o servidor ║
║ ║
╚════════════════════════════════════════════════════════════╝
""")
# Abrir navegador em thread separada
threading.Thread(target=open_browser, daemon=True).start()
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\n\n🛑 Servidor parado pelo usuário")
print("✅ Até logo!")

View File

@@ -0,0 +1,89 @@
const http = require('http');
const fs = require('fs');
const path = require('path');
// Função para verificar se os arquivos de módulo existem
function verificarArquivosModulos() {
const modulos = [
'js/core/admin-config-manager.js',
'js/core/backup-manager.js',
'js/core/toast-manager.js'
];
console.log('Verificando existência dos arquivos de módulo:');
modulos.forEach(modulo => {
const existe = fs.existsSync(path.join(__dirname, modulo));
console.log(`${modulo}: ${existe ? '✅ EXISTE' : '❌ NÃO ENCONTRADO'}`);
});
}
// Função para verificar se os módulos estão sendo carregados no HTML
function verificarCarregamentoHTML() {
const htmlPath = path.join(__dirname, 'index.html');
const htmlContent = fs.readFileSync(htmlPath, 'utf8');
const scripts = [
'js/core/admin-config-manager.js',
'js/core/backup-manager.js',
'js/core/toast-manager.js',
'js/tests/test-persistencia.js',
'js/tests/test-persistencia-simples.js',
'js/tests/verificador-persistencia.js',
'js/tests/teste-manual-disponibilidade.js'
];
console.log('\nVerificando carregamento no HTML:');
scripts.forEach(script => {
const carregado = htmlContent.includes(script);
console.log(`${script}: ${carregado ? '✅ CARREGADO' : '❌ NÃO CARREGADO'}`);
});
}
// Função para testar disponibilidade via HTTP
function testarDisponibilidadeHTTP() {
console.log('\nTestando disponibilidade via HTTP...');
const options = {
hostname: 'localhost',
port: 8000,
path: '/',
method: 'GET'
};
const req = http.request(options, (res) => {
console.log(`Status: ${res.statusCode}`);
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
// Verificar se os scripts estão no HTML retornado
const scripts = [
'js/core/admin-config-manager.js',
'js/core/backup-manager.js',
'js/core/toast-manager.js'
];
console.log('\nScripts encontrados no HTML retornado:');
scripts.forEach(script => {
const encontrado = data.includes(script);
console.log(`${script}: ${encontrado ? '✅ ENCONTRADO' : '❌ NÃO ENCONTRADO'}`);
});
});
});
req.on('error', (error) => {
console.error('Erro na requisição:', error);
});
req.end();
}
// Executar verificações
console.log('🔍 Verificação de Módulos de Persistência');
console.log('==========================================');
verificarArquivosModulos();
verificarCarregamentoHTML();
testarDisponibilidadeHTTP();