← Вернуться к урокам

✨ Финальные функции

Урок 5 из 5

🎯 Цель урока

В этом финальном уроке мы добавим последние крутые функции: систему избранного, персонализацию комплиментов по имени, спецэффекты для достижений и кнопку сброса. Создадим полноценное приложение с богатым пользовательским опытом!

💡 Что вы узнаете:

• Систему избранных комплиментов
• Спецэффекты и достижения
• Персонализацию с именем пользователя
• Сброс состояния приложения
• Полировку пользовательского опыта

📚 Финальные концепции

Array методы: includes(), push(), map()

Методы для работы с массивами: проверка наличия элемента, добавление, преобразование

confirm()

Диалог подтверждения действия пользователем перед критическими операциями

switch statement

Конструкция для множественного выбора, альтернатива множественным if-else

Template literals

Шаблонные строки с переменными: `Привет, ${имя}!` вместо "Привет, " + имя + "!"

Полное управление состоянием

Координация всех переменных приложения: счётчики, избранное, текущий комплимент

⭐ Система избранного

Добавим возможность сохранять понравившиеся комплименты:

// Добавляем новые переменные
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('✨ Всё сброшено! Время для новых комплиментов!');
  }
}
confirm()

Показывает диалог с кнопками "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 для более сложных приложений
• Создайте свои уникальные веб-проекты!