Урок 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"; ?>
Проверяем админку
- Войдите как admin
- Нажмите "Админка" в шапке
- Посмотрите статистику
- Перейдите в управление постами
- Перейдите в управление пользователями
Модуль 6 завершён!
Вы создали:
✅ Систему ролей
✅ Админ-панель
✅ Управление контентом
В последнем модуле подведём итоги и поговорим о безопасности!
Вы создали:
✅ Систему ролей
✅ Админ-панель
✅ Управление контентом
В последнем модуле подведём итоги и поговорим о безопасности!
Материалы по теме
- Глоссарий digital-терминов Глоссарий
- Статьи блога по разработке и SEO Блог
- Практические чеклисты по внедрению Чеклисты