0_0_1
This commit is contained in:
13
Hentai_manga_model/models.py
Normal file
13
Hentai_manga_model/models.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from pymongo import MongoClient
|
||||
|
||||
client = MongoClient('mongodb://localhost:27017/')
|
||||
db = client['Manga'] # Название базы данных
|
||||
manga_collection = db['Hentai_Manga'] # Название коллекции
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
7
Hentai_manga_model/urls.py
Normal file
7
Hentai_manga_model/urls.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from django.urls import path
|
||||
from .views import show_manga, show_manga_page
|
||||
|
||||
urlpatterns = [
|
||||
path('manga/<int:manga_id>/', show_manga, name='show_manga'),
|
||||
path('manga/<int:manga_id>/page/<int:page_number>/', show_manga_page, name='show_manga_page'), # новый маршрут
|
||||
]
|
||||
19
Hentai_manga_model/views.py
Normal file
19
Hentai_manga_model/views.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from django.shortcuts import render
|
||||
from .models import manga_collection
|
||||
|
||||
def show_manga(request, manga_id):
|
||||
manga = manga_collection.find_one({"id": int(manga_id)}) # Ищем мангу по ID
|
||||
if not manga:
|
||||
return render(request, "not_found.html") # Если нет манги, показываем заглушку
|
||||
return render(request, "manga_view.html", {"manga": manga})
|
||||
|
||||
def show_manga_page(request, manga_id, page_number):
|
||||
manga = manga_collection.find_one({"id": int(manga_id)})
|
||||
if not manga or page_number < 1 or page_number > manga['len_manga']:
|
||||
return render(request, "not_found.html")
|
||||
|
||||
img_url = manga['imgs_manga'][page_number - 1] # Индекс страницы манги (начинаем с 0)
|
||||
return render(request, "manga_page.html", {"manga": manga, "img_url": img_url, "page_number": page_number})
|
||||
|
||||
|
||||
|
||||
64
templates/manga_view.html
Normal file
64
templates/manga_view.html
Normal file
@@ -0,0 +1,64 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
{% load static %}
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ manga.original_title }}</title>
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">
|
||||
<script src="{% static 'js/script.js' %}" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
|
||||
|
||||
|
||||
<!-- Основной контейнер для контента -->
|
||||
<div class="content-wrapper">
|
||||
|
||||
<div class="manga-grid-container" id="previewContainer" >
|
||||
<div class="chapter">
|
||||
<ul style="display: block">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="/manga/111">Каталог</a>
|
||||
<span class="separator">-</span>
|
||||
<a href="/manga/111">{{ manga.original_title }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Бокс с изображением -->
|
||||
<div class="image-box" id="imageBox">
|
||||
<img id="mangaImage" src="" alt="Страница">
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- Сетка-превью -->
|
||||
<div id="previewGrid" class="manga-grid">
|
||||
{% for img in manga.imgs_manga %}
|
||||
<div class="manga-preview">
|
||||
<img src="{{ img }}"
|
||||
onclick="showImage('{{ img }}')"
|
||||
alt="Стр {{ forloop.counter }}">
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Выпадающий список страниц -->
|
||||
<div class="page postload">
|
||||
<select id="drop" onchange="changePage(this)">
|
||||
<option value="preview">🔍 Превью</option>
|
||||
{% for img in manga.imgs_manga %}
|
||||
<option value="{{ img }}">Стр {{ forloop.counter }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
94
templates/static/css/style.css
Normal file
94
templates/static/css/style.css
Normal file
@@ -0,0 +1,94 @@
|
||||
.content-wrapper {
|
||||
position: relative;
|
||||
min-height: 500px;
|
||||
}
|
||||
|
||||
.image-box {
|
||||
display: none;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
#mangaImage {
|
||||
max-width: 100%;
|
||||
max-height: 90vh;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.manga-grid-container {
|
||||
width: 90%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.manga-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(9, 102px);
|
||||
gap: 10px;
|
||||
justify-content: center;
|
||||
margin: 0 auto;
|
||||
max-width: calc(6 * 102px + 5 * 10px);
|
||||
}
|
||||
|
||||
.manga-preview {
|
||||
width: 102px;
|
||||
height: 142px;
|
||||
overflow: hidden;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
.manga-preview img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
object-position: center top;
|
||||
cursor: pointer;
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
|
||||
.manga-preview img:hover {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
.breadcrumb-item {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.breadcrumb-item a {
|
||||
text-decoration: none;
|
||||
color: green; /* Сохраняет цвет текста как у родителя */
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.breadcrumb-item .separator {
|
||||
margin: 0 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Адаптивность */
|
||||
@media (max-width: 768px) {
|
||||
.manga-grid {
|
||||
grid-template-columns: repeat(4, 102px);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.manga-grid {
|
||||
grid-template-columns: repeat(3, 102px);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 360px) {
|
||||
.manga-grid {
|
||||
grid-template-columns: repeat(2, 102px);
|
||||
}
|
||||
}
|
||||
34
templates/static/js/script.js
Normal file
34
templates/static/js/script.js
Normal file
@@ -0,0 +1,34 @@
|
||||
function changePage(select) {
|
||||
const selectedImg = select.value;
|
||||
const previewContainer = document.getElementById("previewContainer");
|
||||
const imageBox = document.getElementById("imageBox");
|
||||
const mangaImage = document.getElementById("mangaImage");
|
||||
|
||||
if (selectedImg === "preview") {
|
||||
previewContainer.style.display = "block";
|
||||
imageBox.style.display = "none";
|
||||
} else {
|
||||
previewContainer.style.display = "none";
|
||||
mangaImage.src = selectedImg;
|
||||
imageBox.style.display = "block";
|
||||
}
|
||||
}
|
||||
|
||||
function showImage(imgSrc) {
|
||||
const drop = document.getElementById("drop");
|
||||
drop.value = imgSrc;
|
||||
changePage(drop);
|
||||
|
||||
// Прокрутка к изображению
|
||||
document.getElementById("imageBox").scrollIntoView({
|
||||
behavior: 'smooth',
|
||||
block: 'start'
|
||||
});
|
||||
}
|
||||
|
||||
// Инициализация при загрузке
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Убедимся, что превью отображается по умолчанию
|
||||
document.getElementById("previewContainer").style.display = "block";
|
||||
document.getElementById("imageBox").style.display = "none";
|
||||
});
|
||||
Reference in New Issue
Block a user