Aplicación de blog/CMS ligera desarrollada en PHP (sin frameworks) y MySQL. Incluye panel de administración, autenticación de usuarios, sistema de posts, categorías, comentarios, notificaciones y tema claro/oscuro.
- PHP 7.4 o superior (extensión PDO y PDO_MySQL habilitadas)
- MySQL 5.7+ (o MariaDB compatible)
- Git (para clonar)
- Clona el repositorio y accede al proyecto:
git clone https://github.com/BHMario/php-cms.git
cd php-cms- Configura la base de datos:
- Por defecto
config/config.phpcontiene estos valores:
return [
'host' => 'localhost',
'dbname' => 'blog_cms',
'user' => 'root',
'password' => '',
'charset' => 'utf8mb4'
];- Crea la base de datos e importa el dump incluido:
# Crear la base de datos (si no existe)
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS blog_cms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# Importar estructura/datos iniciales
mysql -u root -p blog_cms < database\blog.sqlAlternativa: si prefieres usar las migraciones incluidas en el proyecto:
php scripts/migrate.php- Crear el usuario administrador (opcional — el script crea admin por defecto si no existe):
# Crea el admin con usuario 'admin' y contraseña 'admin123'
php scripts/create_admin.php
# O crea admin personalizado:
php scripts/create_admin.php miadmin miclaveSegura- Levantar servidor de desarrollo (sirve
public/):
php -S localhost:8000 -t publicAccede luego en tu navegador a: http://localhost:8000
-
Panel administrador (creado por
scripts/create_admin.phpsi lo ejecutas sin argumentos):- Usuario:
admin - Contraseña:
admin123
- Usuario:
-
Clientes:
- Registrate con tu nombre de usuario y tu contrasea
- Inicia sesión con esas mismas credenciales
-
Base de datos (valor por defecto en
config/config.php):- Host:
localhost - Nombre BD:
blog_cms - Usuario:
root - Contraseña: `` (vacía)
- Host:
- Importar DB:
mysql -u root -p blog_cms < database\blog.sql - Ejecutar migraciones:
php scripts/migrate.php - Crear admin:
php scripts/create_admin.php <usuario> <contraseña> - Levantar servidor local:
php -S localhost:8000 -t public
/— Inicio/login— Iniciar sesión/register— Registro/admin— Dashboard (requiere rol admin)
La lista completa de rutas está en este repositorio y el enrutador principal (app/Router.php).
// En PostController.php
public function store()
{
$title = trim($_POST['title']);
$content = trim($_POST['content']);
$categoryId = $_POST['category_id'] ?? null;
$postModel = new Post();
$postModel->create($title, $content, $_SESSION['user_id'], $categoryId);
header("Location: /posts");
exit;
}// En Post.php (Modelo)
public function getAll($limit = 10, $offset = 0, $categoryId = null)
{
$sql = "SELECT p.*, u.username, c.name as category_name
FROM posts p
LEFT JOIN users u ON p.user_id = u.id
LEFT JOIN categories c ON p.category_id = c.id
WHERE 1=1";
if ($categoryId) {
$sql .= " AND p.category_id = :category_id";
}
$sql .= " ORDER BY p.created_at DESC LIMIT :limit OFFSET :offset";
$stmt = $this->db->prepare($sql);
// ... bindear parámetros
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}php-cms/
├── app/
│ ├── Controllers/ # Controladores (MVC)
│ │ ├── AdminCategoriesController.php
│ │ ├── AdminController.php
│ │ ├── AdminPostsController.php
│ │ ├── AdminUsersController.php
│ │ ├── HomeController.php
│ │ ├── NotificationController.php
│ │ ├── PostController.php (✨ con slugs)
│ │ └── UserController.php
│ ├── Models/ # Modelos (BD + POO)
│ │ ├── BaseModel.php # ✨ Clase abstracta (encapsulación)
│ │ ├── Category.php
│ │ ├── Comment.php
│ │ ├── Database.php # PDO preparadas (sin SQL injection)
│ │ ├── Follower.php
│ │ ├── Like.php
│ │ ├── Notification.php
│ │ ├── Post.php # ✨ Slugs SEO (generateSlug, getBySlug)
│ │ ├── Tag.php
│ │ └── User.php
│ ├── Services/ # ✨ Servicios (Dependency Injection)
│ │ ├── Uploader.php # Gestión de uploads
│ ├── Interfaces/ # ✨ Interfaces (Polimorfismo)
│ │ └── Uploadable.php # Interface para subidas de archivos
│ ├── Views/ # Vistas (HTML/PHP)
│ │ ├── layout/ # Plantillas base
│ │ │ ├── admin_footer.php
│ │ │ ├── admin_header.php
│ │ │ ├── footer.php
│ │ │ ├── header.php
│ │ │ └── sidebar.php
│ │ ├── admin/ # Sección administrativa
│ │ │ ├── dashboard.php
│ │ │ ├── categories/
│ │ │ │ ├── create.php
│ │ │ │ ├── edit.php
│ │ │ │ └── index.php
│ │ │ ├── posts/
│ │ │ │ ├── create.php
│ │ │ │ ├── edit.php
│ │ │ │ ├── index.php
│ │ │ │ └── show.php
│ │ │ └── users/
│ │ │ ├── create.php
│ │ │ ├── edit.php
│ │ │ └── index.php
│ │ ├── home/ # Página de inicio
│ │ │ └── index.php
│ │ ├── notification/ # Sistema de notificaciones
│ │ │ └── inbox.php
│ │ ├── post/ # Gestión de posts
│ │ │ ├── create.php
│ │ │ ├── edit.php
│ │ │ ├── index.php
│ │ │ └── show.php (✨ con slugs)
│ │ └── user/ # Gestión de usuarios
│ │ ├── login.php
│ │ ├── profile.php
│ │ ├── register.php
│ │ └── view.php
│ └── Router.php # ✨ Enrutador (dual routing: ID + slugs)
├── config/
│ └── config.php # Configuración BD
├── database/
│ ├── init.php # ✨ Inicializador BD centralizado
│ └── blog.sql # Estructura de BD
├── scripts/
│ ├── create_admin.php
│ └── migrate.sql
├── public/
│ ├── index.php # Punto de entrada
│ ├── assets/
│ │ ├── css/
│ │ │ └── style.css # Estilos (dark mode incluido)
│ │ ├── js/
│ │ │ └── scripts.js # Interactividad (modales, lightbox)
│ │ ├── images/ # Imágenes del sitio
│ │ │ └── default-avatar.svg # Avatar por defecto
│ │ └── uploads/
├── .git/ # Control de versiones
├── .gitignore # Archivos ignorados
└── README.md # Este archivo
Mario Sánchez Ruiz
- GitHub: @BHMario
- Email: mariosanrui1612@gmail.com