feat: creacion de interfaz xon simulacion de rutas

This commit is contained in:
25030248hasel
2026-05-23 08:22:39 -06:00
parent 7d07cc101d
commit 649752a6a4
4 changed files with 236 additions and 518 deletions

12
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,12 @@
{
"yaml.customTags": [
"!upload scalar",
"!remove scalar",
"!keep scalar",
"!erase scalar",
"!jwt scalar"
],
"yaml.schemas": {
"https://raw.githubusercontent.com/doanthuanthanh88/testapi6/main/schema.json": "*.yaml"
}
}

File diff suppressed because one or more lines are too long

View File

@@ -63,13 +63,12 @@ class _LoginScreenState extends State<LoginScreen>
); );
// 1. Obtener la conexión por el cable USB Mapped // 1. Obtener la conexión por el cable USB Mapped
// 1. Obtener la conexión
final conn = await MySqlService().getConnection(); final conn = await MySqlService().getConnection();
// 2. Ejecutar la búsqueda con los nombres exactos de tus columnas // 2. Modificamos el SELECT para traer también la columna 'colonia'
// 2. Modificamos el SELECT para buscar SOLO por email
final result = await conn.execute( final result = await conn.execute(
"SELECT email, contrasena_hash, rol FROM usuarios WHERE email = :email", "SELECT email, contrasena_hash, rol, colonia FROM usuarios WHERE email = :email",
{ {
"email": _identifierController.text.trim(), "email": _identifierController.text.trim(),
}, },
@@ -82,20 +81,18 @@ class _LoginScreenState extends State<LoginScreen>
final contrasenaEnBd = usuarioEncontrado['contrasena_hash']; final contrasenaEnBd = usuarioEncontrado['contrasena_hash'];
final email = usuarioEncontrado['email']; final email = usuarioEncontrado['email'];
final rol = usuarioEncontrado['rol']; final rol = usuarioEncontrado['rol'];
final colonia = usuarioEncontrado[
'colonia']; // 📍 Extraemos la colonia real de la BD
// 3. Validamos la contraseña directamente en Flutter comparando textos limpios
if (contrasenaEnBd?.trim() == _passwordController.text.trim()) { if (contrasenaEnBd?.trim() == _passwordController.text.trim()) {
if (!mounted) return; if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("¡Bienvenido de nuevo, $email ($rol)!")), SnackBar(content: Text("¡Bienvenido de nuevo, $email ($rol)!")),
); );
// 📍 CORRECCIÓN DEFINITIVA: Usamos GoRouter nativo en lugar de Navigator // 📍 Enviamos la colonia real extraída de MySQL directamente a la URL del Home
// Esto elimina por completo el conflicto de aserción en el árbol de widgets context.go('/home?colonia=$colonia');
context.go('/home?colonia=Centro');
} else { } else {
// Contraseña mal mapeada en la BD // Contraseña mal mapeada en la BD
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(

View File

@@ -1,3 +1,4 @@
import 'dart:math'; //
import '../../../../core/network/mysql_service.dart'; // 📍 Ajusta las carpetas '../' según tu proyecto import '../../../../core/network/mysql_service.dart'; // 📍 Ajusta las carpetas '../' según tu proyecto
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
@@ -129,15 +130,18 @@ class _RegisterScreenState extends State<RegisterScreen> {
'=== DEPURACIÓN: ¡Conexión obtenida! Estado connected: ${conn.connected}'); '=== DEPURACIÓN: ¡Conexión obtenida! Estado connected: ${conn.connected}');
print('=== DEPURACIÓN: Intentando ejecutar INSERT ==='); print('=== DEPURACIÓN: Intentando ejecutar INSERT ===');
final randomPhone =
'461${1000000 + Random().nextInt(9000000)}'; // 📍 ENVIANDO LA COLONIA REAL A TU NUEVA COLUMNA DE MYSQL
final result = await conn.execute( final result = await conn.execute(
"INSERT INTO usuarios (email, telefono, contrasena_hash, rol, is_verified) VALUES (:email, :telefono, :contrasena_hash, :rol, :is_verified)", "INSERT INTO usuarios (email, telefono, contrasena_hash, rol, is_verified, colonia) VALUES (:email, :telefono, :contrasena_hash, :rol, :is_verified, :colonia)",
{ {
"email": _emailController.text.trim(), "email": _emailController.text.trim(),
"telefono": "4611234567", "telefono": randomPhone, // 📍 Genera un teléfono simulado para cumplir con el esquema de tu tabla
"contrasena_hash": _passwordController.text, "contrasena_hash": _passwordController.text,
"rol": "rol": "Ciudadano",
"Ciudadano", // 📍 CORRECCIÓN: Cambia "ciudadano" por "Ciudadano" (con mayúscula)
"is_verified": 1, "is_verified": 1,
"colonia":
_selectedColonia, // 📍 Envía la colonia seleccionada en el Dropdown
}, },
); );