changes
This commit is contained in:
parent
76d33237b2
commit
2108ba1a36
|
|
@ -1,5 +1,3 @@
|
||||||
/* style.css - оптимизированная версия */
|
|
||||||
|
|
||||||
/* Базовые стили */
|
/* Базовые стили */
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
|
|
|
||||||
|
|
@ -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('Автосохранение включено для редактирования главы');
|
||||||
});
|
});
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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> ')
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
// Редирект на страницу входа
|
// Редирект на страницу входа
|
||||||
|
|
|
||||||
|
|
@ -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'];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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("
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -262,8 +260,7 @@ include 'views/header.php';
|
||||||
.book-content pre {
|
.book-content pre {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Оглавление в одну колонку на мобильных */
|
|
||||||
div[style*="columns: 2"] {
|
div[style*="columns: 2"] {
|
||||||
columns: 1 !important;
|
columns: 1 !important;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue