migrate on nuxt3
This commit is contained in:
172
pages/books/[titlesSlug]/[titlesSlug].vue
Normal file
172
pages/books/[titlesSlug]/[titlesSlug].vue
Normal file
@ -0,0 +1,172 @@
|
||||
<template>
|
||||
<div v-if="titles" class="relative z-50 min-h-screen text-white mb-[208px]">
|
||||
<section class="flex flex-col relative z-40 mt-40 ml-18">
|
||||
<UiHeading
|
||||
tag="H1"
|
||||
class="whitespace-pre-line [&]:font-normal mb-10 -ml-5"
|
||||
size="500"
|
||||
>
|
||||
{{ titles.title }}
|
||||
</UiHeading>
|
||||
|
||||
<div class="flex flex-col gap-6">
|
||||
<div
|
||||
v-for="(section, index) in titles.sections"
|
||||
:key="index"
|
||||
class="flex flex-col gap-4"
|
||||
>
|
||||
<!-- Main section title -->
|
||||
<UiHeading tag="H2" size="300" class="text-three [&]:font-normal">
|
||||
{{ section.title }}
|
||||
</UiHeading>
|
||||
|
||||
<!-- Subsections -->
|
||||
<div v-if="section.subsections" class="ml-6 flex flex-col gap-4">
|
||||
<div
|
||||
v-for="(subsection, subIndex) in section.subsections"
|
||||
:key="subIndex"
|
||||
class="flex flex-col gap-2"
|
||||
>
|
||||
<!-- Subsection with image -->
|
||||
<div
|
||||
v-if="typeof subsection.title === 'object'"
|
||||
class="flex items-center gap-3 -ml-10"
|
||||
>
|
||||
<img
|
||||
v-if="subsection.title.img"
|
||||
:src="subsection.title.img"
|
||||
:alt="subsection.title.text"
|
||||
class="w-6 h-6"
|
||||
/>
|
||||
<UiHeading tag="H3" size="300" class="[&]:font-normal">
|
||||
{{ subsection.title.text }}
|
||||
</UiHeading>
|
||||
</div>
|
||||
<!-- Regular subsection -->
|
||||
<UiHeading
|
||||
v-else
|
||||
tag="H3"
|
||||
size="300"
|
||||
class="[&]:text-gray-200 [&]:font-normal"
|
||||
>
|
||||
{{ subsection.title }}
|
||||
</UiHeading>
|
||||
|
||||
<!-- Items list -->
|
||||
<ul
|
||||
v-if="subsection.items"
|
||||
class="ml-6 flex flex-col gap-2 list-decimal"
|
||||
>
|
||||
<li
|
||||
v-for="(item, itemIndex) in subsection.items"
|
||||
:key="itemIndex"
|
||||
>
|
||||
<UiParagraph
|
||||
size="300"
|
||||
class="[&]:text-gray-200 [&]:font-normal"
|
||||
> {{ item }}</UiParagraph
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Nested subsections -->
|
||||
<div v-if="subsection.subsections" class="flex flex-col gap-2">
|
||||
<div
|
||||
v-for="(nestedSub, nestedIndex) in subsection.subsections"
|
||||
:key="nestedIndex"
|
||||
>
|
||||
<UiHeading
|
||||
tag="H4"
|
||||
size="300"
|
||||
class="[&]:text-gray-200 [&]:font-normal"
|
||||
>
|
||||
{{ nestedSub.title }}
|
||||
</UiHeading>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<div v-else class="text-white text-center py-20">Содержание не найдено.</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, computed, watch } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
import UiHeading from "@/components/Typography/UiHeading.vue";
|
||||
import UiParagraph from "@/components/Typography/UiParagraph.vue";
|
||||
// import { useHead } from '@vueuse/head'
|
||||
|
||||
interface SubsectionTitle {
|
||||
text: string;
|
||||
img?: string;
|
||||
}
|
||||
|
||||
interface Subsection {
|
||||
title: string | SubsectionTitle;
|
||||
items?: string[];
|
||||
subsections?: Array<{
|
||||
title: string;
|
||||
}>;
|
||||
}
|
||||
|
||||
interface Section {
|
||||
title: string;
|
||||
subsections?: Subsection[];
|
||||
}
|
||||
|
||||
interface TitlesData {
|
||||
title: string;
|
||||
titleMeta: string;
|
||||
sections: Section[];
|
||||
}
|
||||
|
||||
const route = useRoute();
|
||||
|
||||
const currentTitlesData = ref<TitlesData | null>(null);
|
||||
|
||||
const titles = computed(() => currentTitlesData.value);
|
||||
|
||||
const loadTitlesData = async (slug: string) => {
|
||||
try {
|
||||
const module = await import(`./_data/${slug}.json`);
|
||||
currentTitlesData.value = module.default as TitlesData;
|
||||
} catch (error) {
|
||||
console.error(`Ошибка при загрузке содержания с slug '${slug}':`, error);
|
||||
currentTitlesData.value = null;
|
||||
}
|
||||
};
|
||||
|
||||
watch(
|
||||
() => route.params.titlesSlug,
|
||||
async (newSlug) => {
|
||||
if (newSlug) {
|
||||
await loadTitlesData(newSlug as string);
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
);
|
||||
|
||||
watch(titles, (newTitles) => {
|
||||
if (newTitles) {
|
||||
useHead({
|
||||
title: `${newTitles.titleMeta} | Vino Galante`,
|
||||
meta: [
|
||||
{
|
||||
name: "description",
|
||||
content: "Содержание книги Vino Galante",
|
||||
},
|
||||
],
|
||||
link: [
|
||||
{
|
||||
rel: "canonical",
|
||||
href: `https://ebook.miduway.space/books/${route.params.slug}/${route.params.titlesSlug}`,
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
187
pages/books/[titlesSlug]/_data/title-1.json
Normal file
187
pages/books/[titlesSlug]/_data/title-1.json
Normal file
@ -0,0 +1,187 @@
|
||||
{
|
||||
"id": "title-1",
|
||||
"title": "Оглавление",
|
||||
"titleMeta": "Оглавление - Книга I",
|
||||
"sections": [
|
||||
{
|
||||
"title": "Благодарности"
|
||||
},
|
||||
{
|
||||
"title": "Введение",
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Работа с любым печатным материалом"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Глава 1. Перезагрузка",
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Введение"
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Убеждения соблазнительницы",
|
||||
"img": "/img/svg/books/1/titles-1/flowbite_wine-glass-solid.svg"
|
||||
},
|
||||
"items": [
|
||||
"Всё всегда хорошо",
|
||||
"Другие девушки не помеха для меня",
|
||||
"Парней много, я одна",
|
||||
"Использовать мужчин – это естественно и приятно",
|
||||
"Отшивать мужчин – это естественно",
|
||||
"Ты имеешь ровно то, что заслужила",
|
||||
"Ты достойна гораздо больше того, что имеешь на данный момент",
|
||||
"Все, о чем ты способна мечтать, ты способна иметь",
|
||||
"Проявлять активность успешной девушке естественно",
|
||||
"Все мужчины, с которыми ты общаешься до замужества – всего лишь твои тренажеры",
|
||||
"Мужчина должен относиться к тебе уважительно",
|
||||
"Среди мужчин встречается идиоты",
|
||||
"Тебе выгодно, если мужчина хочет тебя",
|
||||
"Мужчина общается с тобой только тогда, когда ему от тебя что-то нужно",
|
||||
"Пока мужчина тебя не трахнул, ты не проиграла",
|
||||
"Если ты получаешь удовольствие от общения с мужчиной – все идет по плану",
|
||||
"Ты ничего не должна мужчине, даже если он подарил тебе дворец и яхту",
|
||||
"Соблазнение – всего лишь очень интересная игра, в которой нет проигравших",
|
||||
"У мужчин две ахиллесовых пяты – это и секс. Это в сто раз важнее секса",
|
||||
"Мужчины – очень хорошие создания",
|
||||
"Мужчины не примитивные",
|
||||
"Мужчинам нужен далеко не только секс (Мужчине нужен от тебя только секс, если ты больше ничего ему дать не можешь)",
|
||||
"Смысл жизни – развитие",
|
||||
"Иметь запасной аэродром правильно и естественно для женщины",
|
||||
"Сексом мужчину не удержать",
|
||||
"Общение с мужчиной должно приносить радость",
|
||||
"Мужчины стремятся не к хорошим, а к высокоранговым женщинам",
|
||||
"Мир вокруг тебя – отражение тебя самой"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Секс на первом свидании",
|
||||
"img": "/img/svg/books/1/titles-1/healthicons_sexual-reproductive-health.svg"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Глава 2. Свобода",
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Введение"
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Поля-тараканы",
|
||||
"img": "/img/svg/books/1/titles-1/simple-icons_cockroachlabs.svg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Техника безопасности при работе в полях"
|
||||
},
|
||||
{
|
||||
"title": "Восстановление сил"
|
||||
},
|
||||
{
|
||||
"title": "Главный принцип развития"
|
||||
},
|
||||
{
|
||||
"title": "Техники выхода в аптайм"
|
||||
},
|
||||
{
|
||||
"title": "Действия"
|
||||
},
|
||||
{
|
||||
"title": "Результат"
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Калибровка",
|
||||
"img": "/img/svg/books/1/titles-1/material-symbols_editor-choice-rounded.svg"
|
||||
},
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Азбука калибровки"
|
||||
},
|
||||
{
|
||||
"title": "Как наблюдать, не вызывая подозрений"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Стратегия сближений",
|
||||
"img": "/img/svg/books/1/titles-1/ph_strategy-fill.svg"
|
||||
},
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Определение и классификация"
|
||||
},
|
||||
{
|
||||
"title": "Псевдопассивная. Этап первый"
|
||||
},
|
||||
{
|
||||
"title": "Псевдопассивная. Этап второй"
|
||||
},
|
||||
{
|
||||
"title": "Активный тип стратегии"
|
||||
},
|
||||
{
|
||||
"title": "Третий этап. Степени кокетства"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Глава 3. Затравка",
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Введение"
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Теория женской привлекательности",
|
||||
"img": "/img/svg/books/1/titles-1/icon-park-outline_women.svg"
|
||||
},
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Введение"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Физическое здоровье"
|
||||
},
|
||||
{
|
||||
"title": "Ментальный посыл. Стильность"
|
||||
},
|
||||
{
|
||||
"title": "Ментальный посыл. Внутреннее ощущение мира"
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Ошибки резидента",
|
||||
"img": "/img/svg/books/1/titles-1/si_error-line.svg"
|
||||
},
|
||||
"items": [
|
||||
"Косак 1",
|
||||
"Косак 2",
|
||||
"Полукосак 3",
|
||||
"Косак 4",
|
||||
"МетаКосак 5 – опасный",
|
||||
"МетаКосак 6 – опасный",
|
||||
"Косак 7",
|
||||
"МетаКосак 8 – крайне опасно",
|
||||
"МетаКосак 9 – опасно",
|
||||
"Косак 10",
|
||||
"Косак 11"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "В следующей книге"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
170
pages/books/[titlesSlug]/_data/title-2.json
Normal file
170
pages/books/[titlesSlug]/_data/title-2.json
Normal file
@ -0,0 +1,170 @@
|
||||
{
|
||||
"id": "title-1",
|
||||
"title": "Оглавление",
|
||||
"titleMeta": "Оглавление - Книга II",
|
||||
"sections": [
|
||||
{
|
||||
"title": "Введение"
|
||||
},
|
||||
{
|
||||
"title": "Глава 1. Перед боем",
|
||||
"subsections": [
|
||||
{
|
||||
"title": {
|
||||
"text": "Закон Вино Галанте или закон неотвратимости успеха",
|
||||
"img": "/img/svg/books/2/titles-2/octicon_law-24.svg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Запасной аэродром",
|
||||
"img": "/img/svg/books/2/titles-2/mingcute_airplane-line.svg"
|
||||
},
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Экскурс в историю"
|
||||
},
|
||||
{
|
||||
"title": "Правила формирования запасного аэродрома"
|
||||
},
|
||||
{
|
||||
"title": "Подробнее о пятом пункте или как не врать"
|
||||
},
|
||||
{
|
||||
"title": "Следствия наличия запасного аэродрома"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Свидания",
|
||||
"img": "/img/svg/books/2/titles-2/mdi_heart-outline (1).svg"
|
||||
},
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Одежда"
|
||||
},
|
||||
{
|
||||
"title": "Правильные места для свиданий"
|
||||
},
|
||||
{
|
||||
"title": "Самое важное в свиданиях"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Глава 2. Ближний бой",
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Введение"
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Техника влюбления",
|
||||
"img": "/img/svg/books/2/titles-2/Vector (4).svg"
|
||||
},
|
||||
"items": [
|
||||
"Механизм мужской и женской влюбленностей",
|
||||
"Главный секрет влюбления",
|
||||
"Ментальная подстройка",
|
||||
"Подстройка по ценностям",
|
||||
"Качество девушки",
|
||||
"Поведение",
|
||||
"Как правильно хвалить мужчину",
|
||||
"Игра “Ближе-дальше”",
|
||||
"Дикий крышечок “Полярный разрыв”",
|
||||
"Полярный разрыв в действии или крышечок на грани фола",
|
||||
"Фишка “Рассмеяться как зло”",
|
||||
"Фишка “АХ”",
|
||||
"Техника влюбления “Отмененная помощь”",
|
||||
"Техника влюбления “Не тот поворот”",
|
||||
"Техника влюбления “Неожиданный разрыв”",
|
||||
"Техника влюбления “Обещанный звонок”",
|
||||
"Техника влюбления “Парень – подружка”",
|
||||
"Фишка “Бросок кобры”",
|
||||
"Фишка “Мягкий язык”",
|
||||
"Вызов ревности"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Типичные неэффективные фишки девушек",
|
||||
"img": "/img/svg/books/2/titles-2/Group.svg"
|
||||
},
|
||||
"items": ["Я выхожу замуж", "Я скучаю по парню", "Желание казаться круче, чем ты есть"]
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Чего никогда нельзя делать",
|
||||
"img": "/img/svg/books/2/titles-2/Group (1).svg"
|
||||
},
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Введение"
|
||||
},
|
||||
{
|
||||
"title": "Оральные ласки"
|
||||
},
|
||||
{
|
||||
"title": "Минет"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "СМС-переписка",
|
||||
"img": "/img/svg/books/2/titles-2/Vector (6).svg"
|
||||
},
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Российские школы соблазнения"
|
||||
},
|
||||
{
|
||||
"title": "Как найти соблазнителя"
|
||||
},
|
||||
{
|
||||
"title": "История рождения одного термина"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Секс и девичья невинность",
|
||||
"img": "/img/svg/books/2/titles-2/Vector (7).svg"
|
||||
},
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Как парни воспринимают секс"
|
||||
},
|
||||
{
|
||||
"title": "Девичья невинность"
|
||||
},
|
||||
{
|
||||
"title": "Прожим девственницы. Метод Галанте."
|
||||
},
|
||||
{
|
||||
"title": "Прожим девственницы. Классический метод."
|
||||
},
|
||||
{
|
||||
"title": "Прожим девственницы. Метод пикапера."
|
||||
},
|
||||
{
|
||||
"title": "Вместо эпилога"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Что делать, если попался «сложный красавчик»"
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"text": "Словарь",
|
||||
"img": "/img/svg/books/2/titles-2/Vector (8).svg"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
Reference in New Issue
Block a user