Урок 27

Создаём админ-панель

30 мин

Структура админки

Создадим отдельную папку для админ-панели:

public/
└── admin/
    ├── index.php       ← Главная админки
    ├── posts.php       ← Управление постами
    └── users.php       ← Управление пользователями

Главная страница админки

Создайте папку public/admin и файл admin/index.php:

<?php
require_once "../includes/config.php";

// Только для админов!
requireAdmin();

$page_title = "Админ-панель — $site_name";

// Статистика
$postsCount = getPostsCount();
$usersCount = getUsersCount();

include "../includes/header.php";
?>

<h2>Админ-панель</h2>

<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin-bottom: 30px;">
    <div style="background: #e3f2fd; padding: 20px; border-radius: 8px; text-align: center;">
        <div style="font-size: 36px; font-weight: bold; color: #1976d2;"><?= $postsCount ?></div>
        <div style="color: #666;">Постов</div>
    </div>
    
    <div style="background: #e8f5e9; padding: 20px; border-radius: 8px; text-align: center;">
        <div style="font-size: 36px; font-weight: bold; color: #388e3c;"><?= $usersCount ?></div>
        <div style="color: #666;">Пользователей</div>
    </div>
</div>

<h3>Управление</h3>

<ul style="list-style: none; padding: 0;">
    <li style="margin-bottom: 10px;">
        <a href="posts.php" style="color: #F36049; font-size: 18px;">→ Управление постами</a>
    </li>
    <li style="margin-bottom: 10px;">
        <a href="users.php" style="color: #F36049; font-size: 18px;">→ Управление пользователями</a>
    </li>
</ul>

<p style="margin-top: 30px;">
    <a href="../index.php">← Вернуться на сайт</a>
</p>

<?php include "../includes/footer.php"; ?>

Добавляем функцию подсчёта

В includes/database.php добавьте:

/**
 * Получить количество пользователей
 */
function getUsersCount(): int {
    global $pdo;
    
    $stmt = $pdo->query("SELECT COUNT(*) as count FROM users");
    $result = $stmt->fetch();
    return (int)($result["count"] ?? 0);
}

/**
 * Получить всех пользователей
 */
function getAllUsers(): array {
    global $pdo;
    
    $stmt = $pdo->query("SELECT id, username, email, role, created_at FROM users ORDER BY created_at DESC");
    return $stmt->fetchAll();
}

Управление постами

Создайте admin/posts.php:

<?php
require_once "../includes/config.php";
requireAdmin();

$page_title = "Посты — Админка";

// Получаем все посты (без лимита)
$posts = getAllPosts(1000);

include "../includes/header.php";
?>

<h2>Управление постами</h2>

<p><a href="../create_post.php">+ Создать новый пост</a></p>

<table style="width: 100%; border-collapse: collapse;">
    <thead>
        <tr style="background: #f5f5f5;">
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">ID</th>
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">Заголовок</th>
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">Автор</th>
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">Дата</th>
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">Действия</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($posts as $post): ?>
        <tr>
            <td style="padding: 10px; border-bottom: 1px solid #eee;"><?= $post["id"] ?></td>
            <td style="padding: 10px; border-bottom: 1px solid #eee;">
                <a href="../post.php?id=<?= $post["id"] ?>"><?= escape(truncate($post["title"], 50)) ?></a>
            </td>
            <td style="padding: 10px; border-bottom: 1px solid #eee;"><?= escape($post["author_name"]) ?></td>
            <td style="padding: 10px; border-bottom: 1px solid #eee;"><?= formatDate($post["created_at"]) ?></td>
            <td style="padding: 10px; border-bottom: 1px solid #eee;">
                <a href="../edit_post.php?id=<?= $post["id"] ?>">Редактировать</a> |
                <a href="../delete_post.php?id=<?= $post["id"] ?>" style="color: #dc3545;">Удалить</a>
            </td>
        </tr>
        <?php endforeach; ?>
    </tbody>
</table>

<p style="margin-top: 20px;"><a href="index.php">← Назад в админку</a></p>

<?php include "../includes/footer.php"; ?>

Управление пользователями

Создайте admin/users.php:

<?php
require_once "../includes/config.php";
requireAdmin();

$page_title = "Пользователи — Админка";
$users = getAllUsers();

include "../includes/header.php";
?>

<h2>Управление пользователями</h2>

<table style="width: 100%; border-collapse: collapse;">
    <thead>
        <tr style="background: #f5f5f5;">
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">ID</th>
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">Имя</th>
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">Email</th>
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">Роль</th>
            <th style="padding: 10px; text-align: left; border-bottom: 2px solid #ddd;">Регистрация</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($users as $user): ?>
        <tr>
            <td style="padding: 10px; border-bottom: 1px solid #eee;"><?= $user["id"] ?></td>
            <td style="padding: 10px; border-bottom: 1px solid #eee;"><?= escape($user["username"]) ?></td>
            <td style="padding: 10px; border-bottom: 1px solid #eee;"><?= escape($user["email"]) ?></td>
            <td style="padding: 10px; border-bottom: 1px solid #eee;">
                <span style="background: <?= $user["role"] === "admin" ? "#ffc107" : "#e0e0e0" ?>; padding: 2px 8px; border-radius: 4px;">
                    <?= escape($user["role"]) ?>
                </span>
            </td>
            <td style="padding: 10px; border-bottom: 1px solid #eee;"><?= formatDate($user["created_at"]) ?></td>
        </tr>
        <?php endforeach; ?>
    </tbody>
</table>

<p style="margin-top: 20px;"><a href="index.php">← Назад в админку</a></p>

<?php include "../includes/footer.php"; ?>

Проверяем админку

  1. Войдите как admin
  2. Нажмите "Админка" в шапке
  3. Посмотрите статистику
  4. Перейдите в управление постами
  5. Перейдите в управление пользователями
Модуль 6 завершён!

Вы создали:
✅ Систему ролей
✅ Админ-панель
✅ Управление контентом

В последнем модуле подведём итоги и поговорим о безопасности!

Мы используем файлы cookie для улучшения работы сайта и персонализации контента. Продолжая использовать сайт, вы соглашаетесь с использованием cookies в соответствии с нашей Политикой конфиденциальности.