Add MySQL public gallery, token commenters and watermark for restored photos
This commit is contained in:
+78
-10
@@ -35,9 +35,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
if ($action === 'create_section') {
|
||||
$name = trim((string)($_POST['name'] ?? ''));
|
||||
$sort = (int)($_POST['sort_order'] ?? 1000);
|
||||
if ($name === '') {
|
||||
throw new RuntimeException('Название раздела пустое');
|
||||
}
|
||||
if ($name === '') throw new RuntimeException('Название раздела пустое');
|
||||
sectionCreate($name, $sort);
|
||||
$message = 'Раздел создан';
|
||||
}
|
||||
@@ -52,9 +50,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
if ($sectionId < 1) throw new RuntimeException('Выбери раздел');
|
||||
if ($codeName === '') throw new RuntimeException('Укажи код фото (например АВФ1)');
|
||||
if (!isset($_FILES['before'])) throw new RuntimeException('Файл "до" обязателен');
|
||||
|
||||
$section = sectionById($sectionId);
|
||||
if (!$section) throw new RuntimeException('Раздел не найден');
|
||||
if (!sectionById($sectionId)) throw new RuntimeException('Раздел не найден');
|
||||
|
||||
$photoId = photoCreate($sectionId, $codeName, $description, $sortOrder);
|
||||
|
||||
@@ -68,6 +64,30 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
|
||||
$message = 'Фото добавлено';
|
||||
}
|
||||
|
||||
if ($action === 'create_commenter') {
|
||||
$displayName = trim((string)($_POST['display_name'] ?? ''));
|
||||
if ($displayName === '') throw new RuntimeException('Укажи имя комментатора');
|
||||
$u = commenterCreate($displayName);
|
||||
$link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http') . '://' . ($_SERVER['HTTP_HOST'] ?? 'localhost') . '/index-mysql.php?viewer=' . urlencode($u['token']);
|
||||
$message = 'Комментатор создан: ' . $u['display_name'] . ' | ссылка: ' . $link;
|
||||
}
|
||||
|
||||
if ($action === 'delete_commenter') {
|
||||
$id = (int)($_POST['id'] ?? 0);
|
||||
if ($id > 0) {
|
||||
commenterDelete($id);
|
||||
$message = 'Комментатор удалён (доступ отозван)';
|
||||
}
|
||||
}
|
||||
|
||||
if ($action === 'delete_comment') {
|
||||
$id = (int)($_POST['id'] ?? 0);
|
||||
if ($id > 0) {
|
||||
commentDelete($id);
|
||||
$message = 'Комментарий удалён';
|
||||
}
|
||||
}
|
||||
} catch (Throwable $e) {
|
||||
$errors[] = $e->getMessage();
|
||||
}
|
||||
@@ -76,6 +96,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$sections = sectionsAll();
|
||||
$activeSectionId = (int)($_GET['section_id'] ?? ($sections[0]['id'] ?? 0));
|
||||
$photos = $activeSectionId > 0 ? photosBySection($activeSectionId) : [];
|
||||
$commenters = commentersAll();
|
||||
$latestComments = commentsLatest(80);
|
||||
|
||||
function h(string $v): string { return htmlspecialchars($v, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
|
||||
function assetUrl(string $path): string { $f=__DIR__ . '/' . ltrim($path,'/'); $v=is_file($f)?(string)filemtime($f):(string)time(); return $path . '?v=' . rawurlencode($v); }
|
||||
@@ -128,12 +150,13 @@ function uniqueName(string $dir, string $base, string $ext): string
|
||||
<head>
|
||||
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Админка (MySQL)</title>
|
||||
<link rel="icon" type="image/svg+xml" href="<?= h(assetUrl('favicon.svg')) ?>">
|
||||
<link rel="stylesheet" href="<?= h(assetUrl('style.css')) ?>">
|
||||
<style>.wrap{max-width:1160px;margin:0 auto;padding:24px}.card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:14px;margin-bottom:14px}.grid{display:grid;gap:12px;grid-template-columns:1fr 1fr}.full{grid-column:1/-1}.in{width:100%;padding:8px;border:1px solid #d1d5db;border-radius:8px}.btn{border:0;background:#1f6feb;color:#fff;padding:8px 12px;border-radius:8px;cursor:pointer}.ok{background:#ecfdf3;padding:8px;border-radius:8px;margin-bottom:8px}.err{background:#fef2f2;padding:8px;border-radius:8px;margin-bottom:8px}.tbl{width:100%;border-collapse:collapse}.tbl td,.tbl th{padding:8px;border-bottom:1px solid #eee;vertical-align:top}</style>
|
||||
<style>.wrap{max-width:1180px;margin:0 auto;padding:24px}.card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:14px;margin-bottom:14px}.grid{display:grid;gap:12px;grid-template-columns:1fr 1fr}.full{grid-column:1/-1}.in{width:100%;padding:8px;border:1px solid #d1d5db;border-radius:8px}.btn{border:0;background:#1f6feb;color:#fff;padding:8px 12px;border-radius:8px;cursor:pointer}.btn-danger{background:#b42318}.ok{background:#ecfdf3;padding:8px;border-radius:8px;margin-bottom:8px}.err{background:#fef2f2;padding:8px;border-radius:8px;margin-bottom:8px}.tbl{width:100%;border-collapse:collapse}.tbl td,.tbl th{padding:8px;border-bottom:1px solid #eee;vertical-align:top}.small{font-size:12px;color:#667085}</style>
|
||||
</head>
|
||||
<body><div class="wrap">
|
||||
<h1>Админка (MySQL, этап 1)</h1>
|
||||
<p><a href="./?">← в галерею</a></p>
|
||||
<h1>Админка (MySQL)</h1>
|
||||
<p><a href="index-mysql.php">Открыть публичную MySQL-галерею</a></p>
|
||||
<?php if ($message!==''): ?><div class="ok"><?= h($message) ?></div><?php endif; ?>
|
||||
<?php foreach($errors as $e): ?><div class="err"><?= h($e) ?></div><?php endforeach; ?>
|
||||
|
||||
@@ -162,6 +185,31 @@ function uniqueName(string $dir, string $base, string $ext): string
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="card full">
|
||||
<h3>Комментаторы (персональные ссылки)</h3>
|
||||
<form method="post" action="?token=<?= urlencode($tokenIncoming) ?>" style="display:flex;gap:8px;align-items:center;flex-wrap:wrap">
|
||||
<input type="hidden" name="action" value="create_commenter"><input type="hidden" name="token" value="<?= h($tokenIncoming) ?>">
|
||||
<input class="in" name="display_name" placeholder="Имя (например: Александр)" style="max-width:360px" required>
|
||||
<button class="btn" type="submit">Создать</button>
|
||||
</form>
|
||||
<table class="tbl"><tr><th>ID</th><th>Имя</th><th>Статус</th><th>Действие</th></tr>
|
||||
<?php foreach($commenters as $u): ?>
|
||||
<tr>
|
||||
<td><?= (int)$u['id'] ?></td>
|
||||
<td><?= h((string)$u['display_name']) ?></td>
|
||||
<td><?= (int)$u['is_active'] ? 'active' : 'off' ?></td>
|
||||
<td>
|
||||
<form method="post" action="?token=<?= urlencode($tokenIncoming) ?>" onsubmit="return confirm('Удалить пользователя и отозвать доступ?')">
|
||||
<input type="hidden" name="action" value="delete_commenter"><input type="hidden" name="token" value="<?= h($tokenIncoming) ?>"><input type="hidden" name="id" value="<?= (int)$u['id'] ?>">
|
||||
<button class="btn btn-danger" type="submit">Удалить</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
<p class="small">После создания ссылки токен показывается один раз в зелёном сообщении.</p>
|
||||
</section>
|
||||
|
||||
<section class="card full">
|
||||
<h3>Разделы</h3>
|
||||
<table class="tbl"><tr><th>ID</th><th>Название</th><th>Порядок</th><th>Фото</th></tr>
|
||||
@@ -178,12 +226,32 @@ function uniqueName(string $dir, string $base, string $ext): string
|
||||
<tr>
|
||||
<td><?= (int)$p['id'] ?></td>
|
||||
<td><?= h((string)$p['code_name']) ?></td>
|
||||
<td><?php if (!empty($p['before_path'])): ?><img src="<?= h((string)$p['before_path']) ?>" alt="" style="width:90px;height:60px;object-fit:cover;border:1px solid #e5e7eb;border-radius:6px"><?php endif; ?></td>
|
||||
<td><?php if (!empty($p['before_file_id'])): ?><img src="index-mysql.php?action=image&file_id=<?= (int)$p['before_file_id'] ?>" alt="" style="width:90px;height:60px;object-fit:cover;border:1px solid #e5e7eb;border-radius:6px"><?php endif; ?></td>
|
||||
<td><?= h((string)($p['description'] ?? '')) ?></td>
|
||||
<td><?= (int)$p['sort_order'] ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<section class="card full">
|
||||
<h3>Последние комментарии</h3>
|
||||
<table class="tbl"><tr><th>ID</th><th>Фото</th><th>Пользователь</th><th>Комментарий</th><th></th></tr>
|
||||
<?php foreach($latestComments as $c): ?>
|
||||
<tr>
|
||||
<td><?= (int)$c['id'] ?></td>
|
||||
<td><?= h((string)$c['code_name']) ?></td>
|
||||
<td><?= h((string)($c['display_name'] ?? '—')) ?></td>
|
||||
<td><?= h((string)$c['comment_text']) ?></td>
|
||||
<td>
|
||||
<form method="post" action="?token=<?= urlencode($tokenIncoming) ?>" onsubmit="return confirm('Удалить комментарий?')">
|
||||
<input type="hidden" name="action" value="delete_comment"><input type="hidden" name="token" value="<?= h($tokenIncoming) ?>"><input type="hidden" name="id" value="<?= (int)$c['id'] ?>">
|
||||
<button class="btn btn-danger" type="submit">Удалить</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</section>
|
||||
</div>
|
||||
</div></body></html>
|
||||
|
||||
Reference in New Issue
Block a user