🎯 Цель урока
В этом финальном уроке мы добавим последние крутые функции: систему избранного, персонализацию комплиментов по имени, спецэффекты для достижений и кнопку сброса. Создадим полноценное приложение с богатым пользовательским опытом!
💡 Что вы узнаете:
• Систему избранных комплиментов
• Спецэффекты и достижения
• Персонализацию с именем пользователя
• Сброс состояния приложения
• Полировку пользовательского опыта
📚 Финальные концепции
Методы для работы с массивами: проверка наличия элемента, добавление, преобразование
Диалог подтверждения действия пользователем перед критическими операциями
Конструкция для множественного выбора, альтернатива множественным if-else
Шаблонные строки с переменными: `Привет, ${имя}!` вместо "Привет, " + имя + "!"
Координация всех переменных приложения: счётчики, избранное, текущий комплимент
⭐ Система избранного
Добавим возможность сохранять понравившиеся комплименты:
// Добавляем новые переменные
let favorites = [];
let currentCompliment = '';
// Функция для добавления в избранное
function addToFavorites() {
if (!currentCompliment) {
alert('Сначала получи комплимент! 😊');
return;
}
// Проверяем, нет ли уже такого комплимента в избранном
if (favorites.includes(currentCompliment)) {
alert('Этот комплимент уже в избранном! ⭐');
return;
}
// Добавляем в избранное
favorites.push(currentCompliment);
updateFavoritesList();
alert('Комплимент добавлен в избранное! ❤️');
}
// Функция для обновления списка избранного
function updateFavoritesList() {
const favoritesList = document.getElementById('favoritesList');
if (favorites.length === 0) {
favoritesList.innerHTML = 'Пока нет избранных комплиментов';
return;
}
// Создаём HTML для избранных комплиментов
favoritesList.innerHTML = favorites
.map(fav => `<span class="favorite-item">${fav}</span>`)
.join('');
}
🔍 Как это работает:
• includes() проверяет, есть ли элемент в массиве
• push() добавляет элемент в конец массива
• map() преобразует каждый элемент в HTML
• join('') объединяет массив в строку
🎉 Спецэффекты и достижения
Добавим систему достижений для мотивации пользователей:
// Функция спецэффектов
function showSpecialEffects() {
if (totalCount === 1) {
alert('🎉 Поздравляю! Твой первый комплимент! Как настроение?');
} else if (totalCount === 10) {
alert('🌟 Отлично! 10 комплиментов! Ты точно чувствуешь себя лучше!');
} else if (totalCount === 25) {
alert('✨ Невероятно! 25 комплиментов! Ты просто сияешь от позитива!');
} else if (categoryCount === 5) {
alert(`💫 Здорово! 5 комплиментов в категории "${getCategoryName()}"!`);
}
}
// Функция для получения названия категории
function getCategoryName() {
const categoryNames = {
general: 'Общие',
smart: 'Умные',
creative: 'Творческие',
kind: 'Добрые'
};
return categoryNames[currentCategory];
}
// Обновляем функцию генерации
function generateCompliment() {
const categoryCompliments = compliments[currentCategory];
const randomIndex = Math.floor(Math.random() * categoryCompliments.length);
let compliment = categoryCompliments[randomIndex];
if (userName) {
compliment = `${userName}, ${compliment.toLowerCase()}`;
}
// Сохраняем текущий комплимент
currentCompliment = compliment;
document.getElementById('complimentDisplay').textContent = compliment;
totalCount++;
categoryCount++;
updateStats();
// Показываем спецэффекты
showSpecialEffects();
}
🔄 Функция сброса
Добавим возможность начать всё сначала:
function resetStats() {
if (confirm('Ты уверен, что хочешь сбросить всю статистику и избранное?')) {
totalCount = 0;
categoryCount = 0;
favorites = [];
currentCompliment = '';
updateStats();
updateFavoritesList();
document.getElementById('complimentDisplay').textContent =
'Статистика сброшена! Начинай получать комплименты заново! 🌈';
alert('✨ Всё сброшено! Время для новых комплиментов!');
}
}
Показывает диалог с кнопками "OK" и "Отмена", возвращает true или false
🏗️ Полная HTML структура
Добавим блок избранного и кнопки управления:
<div class="favorites">
<h4>❤️ Твои любимые комплименты:</h4>
<div id="favoritesList">
Пока нет избранных комплиментов
</div>
</div>
<div class="controls">
<button class="reset-button" onclick="addToFavorites()">
⭐ Добавить в избранное
</button>
<button class="reset-button" onclick="resetStats()">
🔄 Сбросить статистику
</button>
</div>
🎨 CSS для новых элементов
Стилизуем избранное и кнопки управления:
.favorites {
background: rgba(255, 255, 255, 0.8);
padding: 15px;
border-radius: 15px;
margin-top: 15px;
border: 2px solid #74b9ff;
}
.favorites h4 {
color: #74b9ff;
margin-top: 0;
margin-bottom: 10px;
}
.favorite-item {
background: #e17055;
color: white;
padding: 6px 12px;
border-radius: 20px;
margin: 3px;
display: inline-block;
font-size: 0.8rem;
}
.controls {
margin-top: 15px;
}
.reset-button {
background: linear-gradient(135deg, #6c5ce7, #5f3dc4);
color: white;
border: none;
padding: 10px 20px;
font-size: 0.9rem;
border-radius: 25px;
cursor: pointer;
margin: 5px;
transition: all 0.3s ease;
}
.reset-button:hover {
transform: scale(1.05);
box-shadow: 0 5px 15px rgba(108, 92, 231, 0.4);
}
🎮 Финальная демонстрация
Вот наше полностью готовое приложение:
😊 Генератор комплиментов 😊
Создай хорошее настроение себе и друзьям!
Откроется готовая игра со всеми функциями:
⭐ Избранное • 📊 Статистика • 🎯 Категории • 🎉 Достижения
🔧 Полезные улучшения
Дополнительные функции, которые можно добавить:
// Улучшенная персонализация
function generateCompliment() {
// ... существующий код ...
// Добавляем время суток
const hour = new Date().getHours();
let timeGreeting = '';
if (hour < 12) timeGreeting = 'Доброе утро';
else if (hour < 18) timeGreeting = 'Добрый день';
else timeGreeting = 'Добрый вечер';
if (userName && totalCount === 1) {
alert(`${timeGreeting}, ${userName}! Добро пожаловать! 🌅`);
}
}
// Сохранение в localStorage (продвинутый уровень)
function saveToStorage() {
localStorage.setItem('complimentStats', JSON.stringify({
totalCount,
favorites,
userName
}));
}
function loadFromStorage() {
const saved = localStorage.getItem('complimentStats');
if (saved) {
const data = JSON.parse(saved);
totalCount = data.totalCount || 0;
favorites = data.favorites || [];
userName = data.userName || '';
}
}
🎊 Поздравляем с завершением курса!
Вы создали полноценное интерактивное веб-приложение!
Ваши достижения:
- ✅ Освоили HTML структуры и формы
- ✅ Изучили продвинутый CSS с градиентами и сетками
- ✅ Создали сложную JavaScript логику
- ✅ Реализовали систему состояний
- ✅ Добавили интерактивные функции
- ✅ Создали систему достижений
- ✅ Научились работать с данными пользователя
🎓 Итоги курса
- HTML: Формы, поля ввода, семантическая разметка
- CSS: Grid, градиенты, анимации, адаптивность
- JavaScript: Объекты, массивы, события, DOM
- Архитектура: Управление состоянием, структура данных
- UX/UI: Пользовательский опыт, обратная связь
- Функциональность: Категории, избранное, статистика
🚀 Куда двигаться дальше?
• Изучите localStorage для сохранения данных
• Добавьте звуковые эффекты
• Создайте систему тем оформления
• Изучите React/Vue для более сложных приложений
• Создайте свои уникальные веб-проекты!