This commit is contained in:
mirivlad 2025-11-21 22:25:00 +08:00
parent 76d33237b2
commit 2108ba1a36
14 changed files with 14 additions and 33 deletions

View File

@ -1,5 +1,3 @@
/* style.css - оптимизированная версия */
/* Базовые стили */ /* Базовые стили */
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {
margin-bottom: 1rem; margin-bottom: 1rem;

View File

@ -5,7 +5,6 @@ document.addEventListener('DOMContentLoaded', function() {
const statusSelect = document.getElementById('status'); const statusSelect = document.getElementById('status');
// Проверяем, что это редактирование существующей главы // Проверяем, что это редактирование существующей главы
// Если в URL есть параметр 'id', значит это редактирование
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const isEditMode = urlParams.has('id'); const isEditMode = urlParams.has('id');
@ -95,5 +94,5 @@ document.addEventListener('DOMContentLoaded', function() {
} }
}); });
console.log('Автосохранение включено для редактирования главы'); //console.log('Автосохранение включено для редактирования главы');
}); });

View File

@ -149,7 +149,7 @@ document.addEventListener('DOMContentLoaded', function() {
const controlsContainer = document.createElement('div'); const controlsContainer = document.createElement('div');
controlsContainer.className = 'editor-controls'; controlsContainer.className = 'editor-controls';
const fullscreenBtn = createButton('', 'Полноэкранный режим', toggleFullscreen); const fullscreenBtn = createButton('🔲', 'Полноэкранный режим', toggleFullscreen);
const helpBtn = createButton('❓', 'Справка по Markdown', showHelp); const helpBtn = createButton('❓', 'Справка по Markdown', showHelp);
controlsContainer.appendChild(fullscreenBtn); controlsContainer.appendChild(fullscreenBtn);

View File

@ -53,7 +53,7 @@ function transliterate($text) {
return str_replace($cyr, $lat, $text); return str_replace($cyr, $lat, $text);
} }
// Функция для очистки имени файла с транслитерацией // Функция для очистки имени файла
function cleanFilename($filename) { function cleanFilename($filename) {
// Сначала транслитерируем // Сначала транслитерируем
$filename = transliterate($filename); $filename = transliterate($filename);
@ -130,7 +130,6 @@ function handleCoverUpload($file, $book_id) {
} }
function optimizeImage($file_path) { function optimizeImage($file_path) {
// Простая оптимизация - ресайз до максимальных размеров
list($width, $height, $type) = getimagesize($file_path); list($width, $height, $type) = getimagesize($file_path);
$max_width = 800; $max_width = 800;
@ -190,8 +189,6 @@ function optimizeImage($file_path) {
} }
} }
// В includes/functions.php, после функции handleCoverUpload
function handleAvatarUpload($file, $user_id) { function handleAvatarUpload($file, $user_id) {
global $pdo; global $pdo;

View File

@ -3,13 +3,12 @@ require_once 'Parsedown.php';
class ParsedownExtra extends Parsedown { class ParsedownExtra extends Parsedown {
protected function blockQuote($Line) { protected function blockQuote($Line) {
// Îáðàáîòêà äèàëîãîâ if (preg_match('/^<5E>\s+/', $Line['text'])) {
if (preg_match('/^—\s+/', $Line['text'])) {
return array( return array(
'element' => array( 'element' => array(
'name' => 'div', 'name' => 'div',
'attributes' => array('class' => 'dialogue'), 'attributes' => array('class' => 'dialogue'),
'text' => ltrim($Line['text'], ' ') 'text' => ltrim($Line['text'], '<EFBFBD> ')
) )
); );
} }

View File

@ -4,7 +4,7 @@ require_once 'config/config.php';
// Очищаем все данные сессии // Очищаем все данные сессии
$_SESSION = []; $_SESSION = [];
// Если нужно полностью уничтожить сессию
if (ini_get("session.use_cookies")) { if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params(); $params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, setcookie(session_name(), '', time() - 42000,
@ -13,7 +13,6 @@ if (ini_get("session.use_cookies")) {
); );
} }
// Уничтожаем сессию
session_destroy(); session_destroy();
// Редирект на страницу входа // Редирект на страницу входа

View File

@ -82,7 +82,7 @@ class Book {
try { try {
$this->pdo->beginTransaction(); $this->pdo->beginTransaction();
// Удаляем главы книги (сработает CASCADE, но лучше явно) // Удаляем главы книги
$stmt = $this->pdo->prepare("DELETE FROM chapters WHERE book_id = ?"); $stmt = $this->pdo->prepare("DELETE FROM chapters WHERE book_id = ?");
$stmt->execute([$id]); $stmt->execute([$id]);
@ -127,7 +127,7 @@ class Book {
} }
public function deleteCover($book_id) { public function deleteCover($book_id) {
// Сначала получаем текущее имя файла
$book = $this->findById($book_id); $book = $this->findById($book_id);
$old_filename = $book['cover_image']; $old_filename = $book['cover_image'];

View File

@ -30,13 +30,11 @@ class Chapter {
} }
public function create($data) { public function create($data) {
// Сначала получаем максимальный sort_order для этой книги
$stmt = $this->pdo->prepare("SELECT MAX(sort_order) as max_order FROM chapters WHERE book_id = ?"); $stmt = $this->pdo->prepare("SELECT MAX(sort_order) as max_order FROM chapters WHERE book_id = ?");
$stmt->execute([$data['book_id']]); $stmt->execute([$data['book_id']]);
$result = $stmt->fetch(); $result = $stmt->fetch();
$next_order = ($result['max_order'] ?? 0) + 1; $next_order = ($result['max_order'] ?? 0) + 1;
// Подсчитываем количество слов
$word_count = $this->countWords($data['content']); $word_count = $this->countWords($data['content']);
$stmt = $this->pdo->prepare(" $stmt = $this->pdo->prepare("
@ -81,7 +79,6 @@ class Chapter {
} }
private function countWords($text) { private function countWords($text) {
// Простой подсчет слов (можно улучшить)
$text = strip_tags($text); $text = strip_tags($text);
$text = preg_replace('/[^\p{L}\p{N}\s]/u', ' ', $text); $text = preg_replace('/[^\p{L}\p{N}\s]/u', ' ', $text);
$words = preg_split('/\s+/', $text); $words = preg_split('/\s+/', $text);

View File

@ -85,11 +85,9 @@ class Series {
try { try {
$this->pdo->beginTransaction(); $this->pdo->beginTransaction();
// Убираем серию у всех книг
$stmt = $this->pdo->prepare("UPDATE books SET series_id = NULL, sort_order_in_series = NULL WHERE series_id = ? AND user_id = ?"); $stmt = $this->pdo->prepare("UPDATE books SET series_id = NULL, sort_order_in_series = NULL WHERE series_id = ? AND user_id = ?");
$stmt->execute([$id, $user_id]); $stmt->execute([$id, $user_id]);
// Удаляем саму серию
$stmt = $this->pdo->prepare("DELETE FROM series WHERE id = ? AND user_id = ?"); $stmt = $this->pdo->prepare("DELETE FROM series WHERE id = ? AND user_id = ?");
$result = $stmt->execute([$id, $user_id]); $result = $stmt->execute([$id, $user_id]);
@ -126,7 +124,6 @@ class Series {
return ($result['max_order'] ?? 0) + 1; return ($result['max_order'] ?? 0) + 1;
} }
// Новый метод для получения статистики по серии
public function getSeriesStats($series_id, $user_id = null) { public function getSeriesStats($series_id, $user_id = null) {
$sql = " $sql = "
SELECT SELECT

View File

@ -35,7 +35,6 @@ class User {
public function create($data) { public function create($data) {
$password_hash = password_hash($data['password'], PASSWORD_DEFAULT); $password_hash = password_hash($data['password'], PASSWORD_DEFAULT);
// Определяем статус активности: по умолчанию неактивен, если не указано иное
$is_active = $data['is_active'] ?? 0; $is_active = $data['is_active'] ?? 0;
$stmt = $this->pdo->prepare(" $stmt = $this->pdo->prepare("

View File

@ -49,7 +49,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
]; ];
// Если пользователя создает администратор - сразу активный // Если пользователя создает администратор - сразу активный
// Если пользователь регистрируется сам - неактивный (требует активации) // Если пользователь регистрируется сам - требует активации
if ($is_admin) { if ($is_admin) {
$user_data['is_active'] = 1; $user_data['is_active'] = 1;
} else { } else {

View File

@ -12,7 +12,7 @@ foreach ($series as &$ser) {
$ser['book_count'] = $stats['book_count'] ?? 0; $ser['book_count'] = $stats['book_count'] ?? 0;
$ser['total_words'] = $stats['total_words'] ?? 0; $ser['total_words'] = $stats['total_words'] ?? 0;
} }
unset($ser); // разрываем ссылку unset($ser);
$page_title = "Мои серии книг"; $page_title = "Мои серии книг";
include 'views/header.php'; include 'views/header.php';

View File

@ -61,7 +61,6 @@ include 'views/header.php';
<?php endif; ?> <?php endif; ?>
<h1 style="margin-bottom: 0.5rem;"><?= e($book['title']) ?></h1> <h1 style="margin-bottom: 0.5rem;"><?= e($book['title']) ?></h1>
<!-- В view_book.php, после информации об авторе -->
<?php if ($book['series_id']): ?> <?php if ($book['series_id']): ?>
<?php <?php
$series_stmt = $pdo->prepare("SELECT id, title FROM series WHERE id = ?"); $series_stmt = $pdo->prepare("SELECT id, title FROM series WHERE id = ?");
@ -240,7 +239,6 @@ include 'views/header.php';
background: #f5f5f5; background: #f5f5f5;
} }
/* Адаптивность для оглавления */
@media (max-width: 768px) { @media (max-width: 768px) {
.book-content { .book-content {
font-size: 16px; font-size: 16px;
@ -263,7 +261,6 @@ include 'views/header.php';
font-size: 14px; font-size: 14px;
} }
/* Оглавление в одну колонку на мобильных */
div[style*="columns: 2"] { div[style*="columns: 2"] {
columns: 1 !important; columns: 1 !important;
} }

View File

@ -21,10 +21,6 @@
<li><a href="/dashboard.php">📊 Панель</a></li> <li><a href="/dashboard.php">📊 Панель</a></li>
<li><a href="/series.php">📚 Мои серии</a></li> <li><a href="/series.php">📚 Мои серии</a></li>
<li><a href="/books.php">📚 Мои книги</a></li> <li><a href="/books.php">📚 Мои книги</a></li>
<?php if ($_SESSION['user_id'] == 1): ?>
<li><a href="/admin/users.php">👥 Пользователи</a></li>
<?php endif; ?>
<li> <li>
<details role="list" dir="rtl"> <details role="list" dir="rtl">
<summary aria-haspopup="listbox" role="link" style="display: flex; align-items: center; gap: 0.5rem;"> <summary aria-haspopup="listbox" role="link" style="display: flex; align-items: center; gap: 0.5rem;">
@ -39,6 +35,9 @@
<ul role="listbox"> <ul role="listbox">
<li><a href="/profile.php">Настройки профиля</a></li> <li><a href="/profile.php">Настройки профиля</a></li>
<li><a href="/author.php?id=<?= $_SESSION['user_id'] ?>" target="_blank">Моя публичная страница</a></li> <li><a href="/author.php?id=<?= $_SESSION['user_id'] ?>" target="_blank">Моя публичная страница</a></li>
<?php if ($_SESSION['user_id'] == 1): ?>
<li><a href="/admin/users.php">👥 Пользователи</a></li>
<?php endif; ?>
<li><a href="/logout.php">Выйти</a></li> <li><a href="/logout.php">Выйти</a></li>
</ul> </ul>
</details> </details>