panel admin: asistente, backups y ayuda
This commit is contained in:
@@ -0,0 +1,219 @@
|
||||
<?php
|
||||
// 1. CONEXIÓN A LA BASE DE DATOS
|
||||
$host = "localhost";
|
||||
$user = "root";
|
||||
$pass = "";
|
||||
$db = "lapecosa";
|
||||
|
||||
$conn = new mysqli($host, $user, $pass, $db);
|
||||
|
||||
if ($conn->connect_error) {
|
||||
die("Error de conexión: " . $conn->connect_error);
|
||||
}
|
||||
|
||||
// 2. LÓGICA PARA GUARDAR CAMBIOS (PROCESAMIENTO)
|
||||
$mensaje_alerta = "";
|
||||
|
||||
// Agregar nueva pregunta CORREGIDO (Incluye keywords y categoría dinámica)
|
||||
if (isset($_POST['agregar_pregunta'])) {
|
||||
$preg = $conn->real_escape_string($_POST['nueva_pregunta']);
|
||||
$resp = $conn->real_escape_string($_POST['nueva_respuesta']);
|
||||
$keys = $conn->real_escape_string($_POST['nuevas_keywords']);
|
||||
|
||||
// Procesamiento inteligente de la categoría
|
||||
$cat_seleccionada = $_POST['categoria_existente'];
|
||||
if ($cat_seleccionada === 'nueva') {
|
||||
$cat = $conn->real_escape_string(trim(strtolower($_POST['nueva_categoria'])));
|
||||
} else {
|
||||
$cat = $conn->real_escape_string($cat_seleccionada);
|
||||
}
|
||||
|
||||
if (!empty($preg) && !empty($resp) && !empty($keys) && !empty($cat)) {
|
||||
// Ejecución del INSERT incluyendo la nueva columna
|
||||
$conn->query("INSERT INTO bot_preguntas (pregunta, respuesta, keywords, categoria) VALUES ('$preg', '$resp', '$keys', '$cat')");
|
||||
$mensaje_alerta = "Pregunta, palabras clave y categoría agregadas con éxito.";
|
||||
} else {
|
||||
$mensaje_alerta = "Error: Todos los campos del asistente virtual, incluida la categoría, son obligatorios.";
|
||||
}
|
||||
}
|
||||
|
||||
// Eliminar pregunta
|
||||
if (isset($_GET['eliminar'])) {
|
||||
$id_del = intval($_GET['eliminar']);
|
||||
$conn->query("DELETE FROM bot_preguntas WHERE id = $id_del");
|
||||
header("Location: asistente.php"); // Recargar para limpiar la URL
|
||||
exit();
|
||||
}
|
||||
|
||||
// Consultas dinámicas para la vista y el selector
|
||||
$preguntas = $conn->query("SELECT * FROM bot_preguntas ORDER BY id DESC");
|
||||
$categorias_existentes = $conn->query("SELECT DISTINCT categoria FROM bot_preguntas WHERE categoria IS NOT NULL AND categoria != '' ORDER BY categoria ASC");
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="es">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Panel Asistente Virtual | La Pecosa</title>
|
||||
<link rel="stylesheet" href="../css/all.min.css">
|
||||
<style>
|
||||
:root { --rojo: #D32F2F; --oscuro: #121212; --gris: #1e1e1e; --texto: #f5f5f5; }
|
||||
body { font-family: 'Segoe UI', sans-serif; background-color: var(--oscuro); color: var(--texto); margin: 0; padding: 20px; }
|
||||
.container { max-width: 1200px; margin: auto; }
|
||||
header { border-bottom: 2px solid var(--rojo); padding-bottom: 10px; margin-bottom: 30px; display: flex; align-items: center; }
|
||||
header h1 { color: var(--rojo); margin: 0; text-transform: uppercase; font-size: 24px; }
|
||||
header i { margin-right: 15px; font-size: 30px; color: var(--rojo); }
|
||||
|
||||
.grid { display: grid; grid-template-columns: 1fr 1.8fr; gap: 20px; }
|
||||
|
||||
.card { background: var(--gris); padding: 20px; border-radius: 12px; border: 1px solid #333; }
|
||||
h2 { font-size: 18px; border-left: 4px solid var(--rojo); padding-left: 10px; margin-bottom: 20px; }
|
||||
|
||||
.form-group { margin-bottom: 15px; }
|
||||
label { display: block; margin-bottom: 5px; font-size: 14px; color: #bbb; }
|
||||
input, textarea, select { width: 100%; padding: 10px; background: #2a2a2a; border: 1px solid #444; color: white; border-radius: 6px; box-sizing: border-box; }
|
||||
select option { background: #1e1e1e; color: white; }
|
||||
|
||||
.btn { background: var(--rojo); color: white; border: none; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; width: 100%; }
|
||||
.btn:hover { background: #b71c1c; }
|
||||
|
||||
table { width: 100%; border-collapse: collapse; margin-top: 10px; }
|
||||
th { text-align: left; background: #252525; padding: 12px; border-bottom: 2px solid var(--rojo); }
|
||||
td { padding: 12px; border-bottom: 1px solid #333; font-size: 14px; }
|
||||
.btn-del { color: #ff5252; text-decoration: none; font-size: 18px; }
|
||||
|
||||
.alerta { background: #2e7d32; color: white; padding: 15px; border-radius: 6px; margin-bottom: 20px; text-align: center; }
|
||||
.btn-volver {
|
||||
background: #252525;
|
||||
color: var(--rojo);
|
||||
padding: 10px 15px;
|
||||
border-radius: 8px;
|
||||
text-decoration: none;
|
||||
margin-right: 20px;
|
||||
border: 1px solid #444;
|
||||
transition: 0.3s;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.btn-volver:hover { background: var(--rojo); color: white; border-color: var(--rojo); }
|
||||
.badge-key { background: #444; color: #ffeb3b; padding: 2px 6px; border-radius: 4px; font-size: 12px; margin-right: 4px; display: inline-block; }
|
||||
.badge-cat { background: rgba(211, 47, 47, 0.2); color: #ff8a80; padding: 2px 6px; border-radius: 4px; font-size: 11px; font-weight: bold; text-transform: uppercase; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<header>
|
||||
<a href="dashboard.php" class="btn-volver" title="Volver al Panel Principal">
|
||||
<i class="fas fa-arrow-left"></i>
|
||||
</a>
|
||||
<i class="fas fa-robot"></i>
|
||||
<h1>Asistente Virtual La Pecosa - Administración</h1>
|
||||
</header>
|
||||
|
||||
<?php if($mensaje_alerta): ?>
|
||||
<div class="alerta"><?php echo $mensaje_alerta; ?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="grid">
|
||||
<div class="card">
|
||||
<h2>Nueva pregunta frecuente</h2>
|
||||
<form action="asistente.php" method="POST">
|
||||
<div class="form-group">
|
||||
<label>Título de la pregunta (Referencia interna):</label>
|
||||
<input type="text" name="nueva_pregunta" placeholder="Ej: Precio de las Milanesas" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Categoría del bot:</label>
|
||||
<select name="categoria_existente" id="categoria_select" onchange="alternarNuevaCategoria(this.value)" required>
|
||||
<option value="">-- Seleccioná una categoría --</option>
|
||||
<?php while($c = $categorias_existentes->fetch_assoc()): ?>
|
||||
<option value="<?php echo htmlspecialchars($c['categoria']); ?>">
|
||||
<?php echo htmlspecialchars(ucfirst($c['categoria'])); ?>
|
||||
</option>
|
||||
<?php endwhile; ?>
|
||||
<option value="nueva" style="color: #ff8a80;">+ Crear una nueva categoría...</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div id="campo_nueva_categoria" class="form-group" style="display: none;">
|
||||
<label>Nombre de la nueva categoría:</label>
|
||||
<input type="text" name="nueva_categoria" id="nueva_categoria_input" placeholder="Ej: promos, horarios, envios">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Palabras clave activadoras (Separadas por comas):</label>
|
||||
<input type="text" name="nuevas_keywords" placeholder="Ej: milanesa, milanesas, precio, cuanto cuesta" required>
|
||||
<small style="color: #aaa; font-size: 11px;">Si el usuario escribe alguna de estas palabras, el bot responderá.</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>El asistente virtual responde:</label>
|
||||
<textarea name="nueva_respuesta" placeholder="Ej: La porción de milanesa con fritas cuesta..." required></textarea>
|
||||
</div>
|
||||
<button type="submit" name="agregar_pregunta" class="btn" style="background: #e02828;">Añadir al asistente virtual</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h2>Base de conocimiento</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Pregunta / Keywords</th>
|
||||
<th>Categoría</th>
|
||||
<th>Respuesta configurada</th>
|
||||
<th>Acción</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php while($p = $preguntas->fetch_assoc()): ?>
|
||||
<tr>
|
||||
<td>
|
||||
<strong><?php echo htmlspecialchars($p['pregunta']); ?></strong><br>
|
||||
<span style="font-size: 12px; color: #bbb;">Palabras clave:</span><br>
|
||||
<?php
|
||||
$kw = explode(',', $p['keywords']);
|
||||
foreach($kw as $k) {
|
||||
if(trim($k) != "") echo '<span class="badge-key">'.htmlspecialchars(trim($k)).'</span>';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge-cat"><?php echo htmlspecialchars($p['categoria']); ?></span>
|
||||
</td>
|
||||
<td><?php echo htmlspecialchars($p['respuesta']); ?></td>
|
||||
<td align="center">
|
||||
<a href="asistente.php?eliminar=<?php echo $p['id']; ?>" class="btn-del" onclick="return confirm('¿Eliminar esta respuesta?')">
|
||||
<i class="fas fa-trash-can"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endwhile; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function alternarNuevaCategoria(valor) {
|
||||
const contenedorNueva = document.getElementById('campo_nueva_categoria');
|
||||
const inputNueva = document.getElementById('nueva_categoria_input');
|
||||
|
||||
if (valor === 'nueva') {
|
||||
contenedorNueva.style.display = 'block';
|
||||
inputNueva.required = true;
|
||||
inputNueva.focus();
|
||||
} else {
|
||||
contenedorNueva.style.display = 'none';
|
||||
inputNueva.required = false;
|
||||
inputNueva.value = '';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user