12 subscribers
182 photos
3 videos
212 links
Programmer - Курсы программирования. Канал для тех, кто не хочет остаться на задворках цивилизации.
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Safety🪬, [02.04.2025 16:00]
🚀 Полное руководство по PHP – Глава 38

📌 Тема: Безопасность в PHP – Защита от SQL-инъекций и XSS

Привет, кодеры! 👨‍💻 В этой главе разберём ключевые аспекты безопасности PHP-приложений.

### 🔒 1. Защита от SQL-инъекций
Используйте подготовленные выражения (Prepared Statements) вместо прямой вставки переменных в SQL-запросы.

Пример с PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();



Пример с MySQLi:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();



### 🛡 2. Защита от XSS (Cross-Site Scripting)
Всегда экранируйте вывод с помощью htmlspecialchars():
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');



### 🔐 3. Валидация и фильтрация данных
Используйте filter_var():
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if ($email === false) {
die("Некорректный email!");
}



### 🚫 4. Защита от CSRF (межсайтовая подделка запроса)
Используйте CSRF-токены:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("Ошибка CSRF-токена!");
}
// Обработка формы
}
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));



📢 Подписывайтесь на канал [Safety_Y](https://t.me/Safety_Y) – больше полезного о безопасности в IT!

#PHP #Безопасность #WebDev #Программирование #SQL #XSS
HTML и CSS для начинающих

Не секрет, что в 21-м веке наибольшим спросом пользуются IT-специалисты, причём во всём мире. И Web-мастера здесь занимают далеко не последнюю роль, достаточно посмотреть, сколько сайтов и сервисов в Интернете, и насколько они облегчают нашу жизнь. И таких сервисов придумают ещё уйму, и делать их будут как раз Web-мастера.

И если Вас интересует IT-тематика и если Вы хотите стать Web-мастером и делать сайты: самостоятельно на заказ или на работе, или, быть может, у Вас есть какая-то идея сайта, - то Вам в обязательном порядке придётся осваивать HTML и CSS.

И сегодня я хочу порекомендовать один бесплатный, но при этом очень подробный курс, который просмотрел я сам: https://Hottab.programsite.ru/freemakeup2

Данный курс содержит несколько часов видеоуроков (больше 6-ти) по HTML и CSS, и он даст Вам всё необходимое, что нужно знать по этим Web-технологиям. К курсу так же идут упражнения, что очень полезно и очень удивительно для бесплатного курса.

Поэтому данный курс я рекомендую абсолютно всем, кто хочет заниматься сайтостроением: https://Hottab.programsite.ru/freemakeup2
This media is not supported in your browser
VIEW IN TELEGRAM
🚀 Полное руководство по PHP – Глава 39

📌 Тема: Работа с файлами и загрузка файлов на сервер

Привет, разработчики! 👨‍💻 В этой главе разберём, как безопасно работать с файлами в PHP и реализовать загрузку файлов на сервер.

### 📂 1. Основы работы с файлами
Чтение файла:
$content = file_get_contents('example.txt');
echo $content;



Запись в файл:
file_put_contents('example.txt', 'Hello, PHP!');



Проверка существования файла:
if (file_exists('example.txt')) {
echo "Файл существует!";
}



### ⚠️ 2. Безопасная загрузка файлов
Пример обработки загружаемого файла:
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
$uploadDir = 'uploads/';
$fileName = basename($_FILES['file']['name']);
$filePath = $uploadDir . $fileName;
$fileType = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));

// Проверка типа файла (например, только изображения)
$allowedTypes = ['jpg', 'png', 'jpeg', 'gif'];
if (!in_array($fileType, $allowedTypes)) {
die("Недопустимый тип файла!");
}

// Проверка размера файла (например, не более 2MB)
if ($_FILES['file']['size'] > 2 * 1024 * 1024) {
die("Файл слишком большой!");
}

// Перемещение файла в нужную директорию
if (move_uploaded_file($_FILES['file']['tmp_name'], $filePath)) {
echo "Файл успешно загружен!";
} else {
echo "Ошибка загрузки файла!";
}
}



### 🔒 3. Безопасность при работе с файлами
- Проверяйте MIME-тип файла ($_FILES['file']['type']).
- Генерируйте случайные имена для файлов, чтобы избежать перезаписи.
- Ограничивайте права доступа к папке загрузок (chmod).
- Используйте `is_uploaded_file()` для проверки легитимности файла.

📢 Подписывайтесь на канал [Safety_Y](https://t.me/Safety_Y) – больше полезного о безопасности в IT!

#PHP #Файлы #WebDev #Безопасность #Программирование #ЗагрузкаФайлов
🚀 Веб-разработка с нуля: Урок 1

Привет, будущие разработчики! 👋
Сегодня мы начинаем наш увлекательный путь в мир веб-разработки. Готовы погрузиться в создание сайтов и приложений? Тогда поехали!

📌 Что такое веб-разработка?
Веб-разработка — это процесс создания веб-сайтов или веб-приложений. Она делится на две основные части:
1. Frontend — то, что видит пользователь (дизайн, кнопки, анимации).
2. Backend — то, что работает на сервере (базы данных, логика сайта).

🛠 С чего начать?
1. HTML — основа любого сайта. Это язык разметки, который создает структуру страницы.
2. CSS — добавляет стили: цвета, шрифты, отступы.
3. JavaScript — делает сайт интерактивным.

📝 Практика:
Создайте свою первую HTML-страницу!
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
</head>
<body>
<h1>Привет, мир!</h1>
<p>Это мой первый шаг в веб-разработке.</p>
</body>
</html>



Сохраните файл с расширением .html и откройте его в браузере. Поздравляю, вы создали свой первый сайт! 🎉

👉 В следующем уроке:
Разберем, как добавить стили с помощью CSS и сделать ваш сайт красивым.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими успехами в комментариях! 💬

#вебразработка #html #программирование #rm_programmer
This media is not supported in your browser
VIEW IN TELEGRAM
🚀 Полное руководство по PHP – Глава 40

📌 Тема: Аутентификация и авторизация в PHP

Привет, кодерам! 👋 В этой главе разберём, как правильно реализовать вход пользователей и управление их правами.

### 🔑 1. Базовая аутентификация
Хранение паролей:
Всегда используйте password_hash() и password_verify()!

// Регистрация  
$hashedPassword = password_hash($_POST['password'], PASSWORD_DEFAULT);
// Сохраняем $hashedPassword в БД

// Вход
$user = getUserFromDB($_POST['login']);
if ($user && password_verify($_POST['password'], $user['password'])) {
$_SESSION['user_id'] = $user['id'];
header('Location: /dashboard.php');
} else {
die('Неверный логин или пароль!');
}



### 🛡 2. Защита сессий
session_start([  
'cookie_secure' => true, // Только HTTPS
'cookie_httponly' => true, // Запрет JS-доступа
'use_strict_mode' => true // Защита от фиксации
]);

// Регенерация ID сессии после входа
session_regenerate_id(true);



### 🔐 3. Ролевая модель (авторизация)
// Проверка прав  
function checkPermission($requiredRole) {
if ($_SESSION['user_role'] !== $requiredRole) {
header('HTTP/1.0 403 Forbidden');
die('Доступ запрещён!');
}
}

// Использование
checkPermission('admin');



### ⚠️ 4. Защита от bruteforce
// Ограничение попыток входа  
if ($_SESSION['login_attempts'] > 5) {
die('Превышено число попыток. Попробуйте позже.');
}



### 🔥 Бонус: JWT-авторизация (для API)
use Firebase\JWT\JWT;  

// Генерация токена
$payload = [
'user_id' => 123,
'exp' => time() + 3600 // 1 час
];
$jwt = JWT::encode($payload, 'your_secret_key', 'HS256');

// Проверка токена
try {
$decoded = JWT::decode($jwt, 'your_secret_key', ['HS256']);
} catch (Exception $e) {
http_response_code(401);
die('Недействительный токен!');
}



📢 Больше о безопасности: [Safety_Y](https://t.me/Safety_Y)
#PHP #Безопасность #Аутентификация #JWT #WebDev #Программирование

P.S. В следующей главе разберём OAuth-интеграцию! 💡
🚀 Веб-разработка с нуля: Урок 2

Привет, будущие разработчики! 👋
В прошлом уроке мы создали свою первую HTML-страницу. Сегодня мы добавим ей стилей с помощью CSS и сделаем наш сайт красивым!

📌 Что такое CSS?
CSS (Cascading Style Sheets) — это язык стилей, который отвечает за внешний вид вашего сайта: цвета, шрифты, отступы, анимации и многое другое.

🛠 Как подключить CSS к HTML?
Есть три способа:
1. Inline-стили — прямо в HTML-теге.
2. Внутри HTML-файла — с помощью тега <style>.
3. Отдельный файл — самый удобный способ.

📝 Практика:
Давайте подключим CSS к нашей странице и добавим стили.

1. Создайте файл styles.css и подключите его к HTML:
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Привет, мир!</h1>
<p>Это мой первый шаг в веб-разработке.</p>
</body>
</html>



2. Добавьте стили в файл styles.css:
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
text-align: center;
padding: 50px;
}

h1 {
color: #333;
font-size: 2.5em;
}

p {
color: #666;
font-size: 1.2em;
}



Сохраните файлы и откройте HTML-страницу в браузере. Теперь ваш сайт выглядит стильно! 🎨

👉 В следующем уроке:
Мы добавим интерактивности с помощью JavaScript и сделаем сайт динамичным.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими результатами в комментариях! 💬

#вебразработка #css #html #программирование #rm_programmer
🚀 Веб-разработка с нуля: Урок 3

Привет, будущие разработчики! 👋
В прошлых уроках мы создали HTML-страницу и добавили ей стили с помощью CSS. Сегодня мы сделаем наш сайт интерактивным с помощью JavaScript!

📌 Что такое JavaScript?
JavaScript — это язык программирования, который позволяет добавлять динамику на ваш сайт: анимации, обработку кликов, взаимодействие с пользователем и многое другое.

🛠 Как подключить JavaScript к HTML?
Есть два основных способа:
1. Inline-скрипт — прямо в HTML-файле с помощью тега <script>.
2. Отдельный файл — самый удобный способ.

📝 Практика:
Давайте добавим простой скрипт, который будет показывать сообщение при клике на кнопку.

1. Создайте файл script.js и подключите его к HTML:
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Привет, мир!</h1>
<p>Это мой первый шаг в веб-разработке.</p>
<button id="myButton">Нажми на меня</button>
<script src="script.js"></script>
</body>
</html>



2. Добавьте скрипт в файл script.js:
document.getElementById("myButton").addEventListener("click", function() {
alert("Вы нажали на кнопку! 🎉");
});



Сохраните файлы и откройте HTML-страницу в браузере. Теперь при нажатии на кнопку вы увидите сообщение! 🚀

👉 В следующем уроке:
Мы начнем изучать основы работы с DOM (Document Object Model) и узнаем, как динамически изменять содержимое страницы.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими результатами в комментариях! 💬

#вебразработка #javascript #html #css #программирование #rm_programmer
🚀 Веб-разработка с нуля: Урок 4

Привет, будущие разработчики! 👋
В прошлом уроке мы добавили интерактивности на сайт с помощью JavaScript. Сегодня мы углубимся в работу с DOM (Document Object Model) и научимся динамически изменять содержимое страницы.

📌 Что такое DOM?
DOM — это программный интерфейс, который позволяет JavaScript взаимодействовать с HTML-документом. С его помощью можно изменять структуру, стили и содержимое страницы "на лету".

🛠 Основные методы работы с DOM:
1. Выбор элементов:
- document.getElementById("id") — выбор элемента по id.
- document.querySelector(".class") — выбор элемента по классу или тегу.
2. Изменение содержимого:
- element.textContent — изменение текста внутри элемента.
- element.innerHTML — изменение HTML-содержимого.
3. Добавление и удаление элементов:
- document.createElement("div") — создание нового элемента.
- element.appendChild(newElement) — добавление элемента в DOM.

📝 Практика:
Давайте создадим кнопку, которая будет добавлять новый элемент на страницу.

1. Обновите ваш HTML-файл:
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Привет, мир!</h1>
<p>Это мой первый шаг в веб-разработке.</p>
<button id="addButton">Добавить элемент</button>
<div id="container"></div>
<script src="script.js"></script>
</body>
</html>



2. Добавьте стили в styles.css (по желанию):
#container {
margin-top: 20px;
}

.new-element {
background-color: #e0e0e0;
padding: 10px;
margin: 5px 0;
border-radius: 5px;
}



3. Напишите скрипт в script.js:
document.getElementById("addButton").addEventListener("click", function() {
// Создаем новый элемент
const newElement = document.createElement("div");
newElement.textContent = "Новый элемент добавлен!";
newElement.classList.add("new-element");

// Добавляем его в контейнер
document.getElementById("container").appendChild(newElement);
});



Сохраните файлы и откройте HTML-страницу в браузере. Теперь при нажатии на кнопку "Добавить элемент" на странице будут появляться новые блоки! 🎉

👉 В следующем уроке:
Мы начнем изучать основы адаптивной верстки и сделаем наш сайт удобным для мобильных устройств.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими результатами в комментариях! 💬

#вебразработка #javascript #DOM #html #css #программирование #rm_programmer
🚀 Веб-разработка с нуля: Урок 5

Привет, будущие разработчики! 👋
В прошлом уроке мы научились работать с DOM и динамически изменять содержимое страницы. Сегодня мы поговорим о адаптивной верстке — сделаем наш сайт удобным для просмотра на любых устройствах: от смартфонов до компьютеров.

📌 Что такое адаптивная верстка?
Адаптивная верстка — это подход, при котором сайт автоматически подстраивается под размер экрана устройства. Это достигается с помощью медиазапросов (Media Queries) в CSS.

🛠 Основы адаптивной верстки:
1. Метатег viewport:
Добавьте этот тег в <head> вашего HTML-файла, чтобы сайт корректно отображался на мобильных устройствах:

   <meta name="viewport" content="width=device-width, initial-scale=1.0">



2. Медиазапросы:
Медиазапросы позволяют применять стили в зависимости от ширины экрана. Например:

   @media (max-width: 768px) {
body {
background-color: lightblue;
}
}



📝 Практика:
Давайте сделаем наш сайт адаптивным.

1. Обновите ваш HTML-файл:
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Привет, мир!</h1>
<p>Это мой первый шаг в веб-разработке.</p>
<button id="addButton">Добавить элемент</button>
<div id="container"></div>
<script src="script.js"></script>
</body>
</html>



2. Добавьте адаптивные стили в styles.css:
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
text-align: center;
padding: 20px;
}

h1 {
color: #333;
font-size: 2.5em;
}

p {
color: #666;
font-size: 1.2em;
}

#container {
margin-top: 20px;
}

.new-element {
background-color: #e0e0e0;
padding: 10px;
margin: 5px 0;
border-radius: 5px;
}

/* Медиазапрос для мобильных устройств */
@media (max-width: 768px) {
h1 {
font-size: 2em;
}

p {
font-size: 1em;
}

.new-element {
padding: 8px;
font-size: 0.9em;
}
}



3. Проверьте результат:
Откройте сайт на разных устройствах или измените размер окна браузера. Вы увидите, как стили адаптируются под размер экрана! 📱💻

👉 В следующем уроке:
Мы начнем изучать Flexbox — мощный инструмент для создания гибких макетов.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими результатами в комментариях! 💬

#вебразработка #адаптивнаяверстка #css #html #программирование #rm_programmer
🚀 Веб-разработка с нуля: Урок 6

Привет, будущие разработчики! 👋
В прошлом уроке мы познакомились с адаптивной версткой и научились делать сайты удобными для любых устройств. Сегодня мы изучим Flexbox — мощный инструмент для создания гибких и современных макетов.

📌 Что такое Flexbox?
Flexbox (Flexible Box Layout) — это модуль CSS, который позволяет легко управлять расположением элементов на странице: выравнивание, распределение пространства, порядок отображения и многое другое.

🛠 Основы Flexbox:
1. Flex-контейнер:
Чтобы сделать элемент flex-контейнером, добавьте свойство:

   display: flex;



2. Основные свойства Flexbox:
- justify-content — выравнивание по горизонтали.
- align-items — выравнивание по вертикали.
- flex-direction — направление элементов (ряд или колонка).
- flex-wrap — перенос элементов на новую строку.

📝 Практика:
Давайте создадим простой макет с использованием Flexbox.

1. Обновите ваш HTML-файл:
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</body>
</html>



2. Добавьте стили с Flexbox в styles.css:
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
}

.container {
display: flex;
justify-content: space-between; /* Равномерное распределение */
align-items: center; /* Выравнивание по центру */
padding: 20px;
background-color: #fff;
border-radius: 10px;
margin: 20px;
}

.item {
background-color: #007bff;
color: #fff;
padding: 20px;
border-radius: 5px;
text-align: center;
font-size: 1.5em;
flex: 1; /* Равномерное распределение пространства */
margin: 0 10px; /* Отступы между элементами */
}



3. Проверьте результат:
Откройте страницу в браузере. Вы увидите, как элементы равномерно распределились по контейнеру и выровнялись по центру! 🎉

👉 В следующем уроке:
Мы углубимся в изучение Flexbox и создадим более сложные макеты.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими результатами в комментариях! 💬

#вебразработка #flexbox #css #html #программирование #rm_programmer
🚀 Веб-разработка с нуля: Урок 7

Привет, будущие разработчики! 👋
В прошлом уроке мы познакомились с основами Flexbox и создали простой макет. Сегодня мы углубимся в изучение Flexbox и создадим более сложный и функциональный макет.

📌 Что нового мы изучим?
1. Управление порядком элементов:
Свойство order позволяет менять порядок отображения элементов.
2. Гибкость элементов:
Свойства flex-grow, flex-shrink и flex-basis управляют тем, как элементы растягиваются или сжимаются.
3. Многострочные контейнеры:
Свойство flex-wrap позволяет элементам переноситься на новую строку.

📝 Практика:
Давайте создадим макет с несколькими элементами, которые будут менять порядок и адаптироваться под размер экрана.

1. Обновите ваш HTML-файл:
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<div class="item item-1">1</div>
<div class="item item-2">2</div>
<div class="item item-3">3</div>
<div class="item item-4">4</div>
<div class="item item-5">5</div>
</div>
</body>
</html>



2. Добавьте стили с Flexbox в styles.css:
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
}

.container {
display: flex;
flex-wrap: wrap; /* Перенос элементов на новую строку */
justify-content: space-between; /* Равномерное распределение */
padding: 20px;
background-color: #fff;
border-radius: 10px;
margin: 20px;
}

.item {
background-color: #007bff;
color: #fff;
padding: 20px;
border-radius: 5px;
text-align: center;
font-size: 1.5em;
margin: 10px;
flex: 1 1 200px; /* Гибкость элементов */
}

.item-1 {
order: 2; /* Меняем порядок */
}

.item-2 {
order: 1;
}

.item-3 {
order: 3;
}

.item-4 {
order: 5;
}

.item-5 {
order: 4;
}

/* Адаптивность для мобильных устройств */
@media (max-width: 768px) {
.item {
flex: 1 1 100%; /* Элементы занимают всю ширину */
}
}



3. Проверьте результат:
Откройте страницу в браузере и измените размер окна. Вы увидите, как элементы меняют порядок и адаптируются под размер экрана! 📱💻

👉 В следующем уроке:
Мы начнем изучать CSS Grid — еще более мощный инструмент для создания сложных макетов.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими результатами в комментариях! 💬

#вебразработка #flexbox #css #html #программирование #rm_programmer
🚀 Веб-разработка с нуля: Урок 8

Привет, будущие разработчики! 👋
В прошлом уроке мы углубились в Flexbox и создали адаптивный макет. Сегодня мы познакомимся с CSS Grid — мощным инструментом для создания сложных и гибких макетов.

📌 Что такое CSS Grid?
CSS Grid — это система для создания двумерных макетов. В отличие от Flexbox, который работает в одном направлении (ряд или колонка), Grid позволяет управлять как строками, так и столбцами одновременно.

🛠 Основы CSS Grid:
1. Создание сетки:
Используйте свойство display: grid; для контейнера.
2. Определение столбцов и строк:
- grid-template-columns — задает количество и размер столбцов.
- grid-template-rows — задает количество и размер строк.
3. Размещение элементов:
- grid-column и grid-row — определяют, где будет расположен элемент.

📝 Практика:
Давайте создадим простой макет с использованием CSS Grid.

1. Обновите ваш HTML-файл:
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<div class="item item-1">1</div>
<div class="item item-2">2</div>
<div class="item item-3">3</div>
<div class="item item-4">4</div>
<div class="item item-5">5</div>
<div class="item item-6">6</div>
</div>
</body>
</html>



2. Добавьте стили с CSS Grid в styles.css:
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
}

.container {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 3 столбца */
grid-template-rows: repeat(2, 150px); /* 2 строки */
gap: 10px; /* Расстояние между элементами */
padding: 20px;
background-color: #fff;
border-radius: 10px;
margin: 20px;
}

.item {
background-color: #007bff;
color: #fff;
padding: 20px;
border-radius: 5px;
text-align: center;
font-size: 1.5em;
display: flex;
align-items: center;
justify-content: center;
}

.item-1 {
grid-column: 1 / 3; /* Занимает первые два столбца */
}

.item-2 {
grid-column: 3 / 4; /* Занимает третий столбец */
grid-row: 1 / 3; /* Занимает две строки */
}

.item-3 {
grid-column: 1 / 2; /* Занимает первый столбец */
grid-row: 2 / 3; /* Занимает вторую строку */
}

.item-4 {
grid-column: 2 / 3; /* Занимает второй столбец */
grid-row: 2 / 3; /* Занимает вторую строку */
}

/* Адаптивность для мобильных устройств */
@media (max-width: 768px) {
.container {
grid-template-columns: 1fr; /* Один столбец */
grid-template-rows: auto; /* Автоматическая высота строк */
}

.item {
grid-column: 1 / 2; /* Все элементы занимают один столбец */
grid-row: auto; /* Автоматическое размещение строк */
}
}



3. Проверьте результат:
Откройте страницу в браузере и измените размер окна. Вы увидите, как элементы адаптируются под размер экрана, создавая красивый и функциональный макет! 📱💻

👉 В следующем уроке:
Мы углубимся в изучение CSS Grid и создадим более сложные макеты.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими результатами в комментариях! 💬

#вебразработка #CSSGrid #css #html #программирование #rm_programmer
🚀 Веб-разработка с нуля: Урок 9

Привет, будущие разработчики! 👋
В прошлом уроке мы познакомились с CSS Grid и создали простой макет. Сегодня мы углубимся в изучение Grid и создадим более сложный и функциональный макет, который можно использовать для реальных проектов.

📌 Что нового мы изучим?
1. Именованные области:
С помощью grid-template-areas можно задавать именованные области для элементов.
2. Автоматическое размещение:
Свойство grid-auto-flow управляет тем, как элементы заполняют сетку.
3. Минимальная и максимальная высота строк:
Используйте minmax() для гибкости строк и столбцов.

📝 Практика:
Давайте создадим макет страницы с шапкой, боковой панелью, основным содержимым и футером.

1. Обновите ваш HTML-файл:
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<header class="header">Шапка</header>
<aside class="sidebar">Боковая панель</aside>
<main class="content">Основное содержимое</main>
<footer class="footer">Футер</footer>
</div>
</body>
</html>



2. Добавьте стили с CSS Grid в styles.css:
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
}

.container {
display: grid;
grid-template-columns: 200px 1fr; /* Боковая панель и основное содержимое */
grid-template-rows: 80px 1fr 60px; /* Шапка, содержимое, футер */
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
gap: 10px; /* Расстояние между элементами */
height: 100vh; /* На всю высоту экрана */
padding: 10px;
}

.header {
grid-area: header;
background-color: #007bff;
color: #fff;
padding: 20px;
border-radius: 5px;
text-align: center;
font-size: 1.5em;
}

.sidebar {
grid-area: sidebar;
background-color: #333;
color: #fff;
padding: 20px;
border-radius: 5px;
text-align: center;
font-size: 1.2em;
}

.content {
grid-area: content;
background-color: #fff;
padding: 20px;
border-radius: 5px;
font-size: 1.2em;
}

.footer {
grid-area: footer;
background-color: #007bff;
color: #fff;
padding: 20px;
border-radius: 5px;
text-align: center;
font-size: 1.2em;
}

/* Адаптивность для мобильных устройств */
@media (max-width: 768px) {
.container {
grid-template-columns: 1fr; /* Один столбец */
grid-template-rows: 80px auto 1fr 60px; /* Автоматическая высота для боковой панели */
grid-template-areas:
"header"
"sidebar"
"content"
"footer";
}
}



3. Проверьте результат:
Откройте страницу в браузере и измените размер окна. Вы увидите, как макет адаптируется под разные устройства, сохраняя свою структуру! 📱💻

👉 В следующем уроке:
Мы начнем изучать JavaScript более глубоко и добавим интерактивности на наш сайт.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими результатами в комментариях! 💬

#вебразработка #CSSGrid #css #html #программирование #rm_programmer
🚀 Веб-разработка с нуля: Урок 10

Привет, будущие разработчики! 👋
В прошлых уроках мы изучили основы HTML, CSS, Flexbox и CSS Grid, создавая макеты и адаптивные страницы. Сегодня мы переходим к JavaScript и добавим интерактивности на наш сайт!

📌 Что такое JavaScript?
JavaScript — это язык программирования, который позволяет "оживить" ваш сайт: добавлять анимации, обрабатывать действия пользователя, взаимодействовать с сервером и многое другое.

🛠 Основы JavaScript:
1. Переменные:
Используйте let, const или var для хранения данных.
2. Функции:
Функции позволяют выполнять код по требованию.
3. События:
JavaScript может реагировать на действия пользователя, например, клики или наведение мыши.

📝 Практика:
Давайте создадим кнопку, которая будет менять цвет фона страницы при нажатии.

1. Обновите ваш HTML-файл:
<!DOCTYPE html>
<html>
<head>
<title>Мой первый сайт</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<h1>Привет, мир!</h1>
<button id="colorButton">Изменить цвет фона</button>
</div>
<script src="script.js"></script>
</body>
</html>



2. Добавьте стили в styles.css:
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}

.container {
text-align: center;
}

h1 {
color: #333;
font-size: 2.5em;
}

button {
padding: 10px 20px;
font-size: 1.2em;
background-color: #007bff;
color: #fff;
border: none;
border-radius: 5px;
cursor: pointer;
}

button:hover {
background-color: #0056b3;
}



3. Добавьте JavaScript в script.js:
const button = document.getElementById("colorButton");
const colors = ["#ffcccc", "#ccffcc", "#ccccff", "#ffccff", "#ccffff"];
let currentIndex = 0;

button.addEventListener("click", function() {
document.body.style.backgroundColor = colors[currentIndex];
currentIndex = (currentIndex + 1) % colors.length; // Переход к следующему цвету
});



4. Проверьте результат:
Откройте страницу в браузере и нажмите на кнопку. Фон страницы будет меняться при каждом клике! 🎨

👉 В следующем уроке:
Мы изучим, как работать с DOM (Document Object Model) и динамически изменять содержимое страницы.

Подписывайтесь на канал, чтобы не пропустить новые уроки: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими результатами в комментариях! 💬

#вебразработка #javascript #html #css #программирование #rm_programmer
🚀 Веб-разработка с нуля: Урок 11

Привет, кодерам! 👨💻👩💻
Сегодня мы сделаем настоящий прорыв — научимся динамически изменять содержимое страницы с помощью JavaScript и DOM!

🔥 Что будем изучать:
1. Глубокую работу с DOM-элементами
2. Создание и удаление элементов "на лету"
3. Обработку пользовательского ввода

💻 Практический пример:
Создадим интерактивный список дел (To-Do List)

1. Обновляем HTML:
<!DOCTYPE html>
<html>
<head>
<title>Мой To-Do List</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<h1>Мой список дел</h1>
<div class="input-group">
<input type="text" id="taskInput" placeholder="Новая задача...">
<button id="addButton">Добавить</button>
</div>
<ul id="taskList"></ul>
</div>
<script src="script.js"></script>
</body>
</html>


2. Добавляем стили (styles.css):
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f5f5f5;
margin: 0;
padding: 20px;
}

.container {
max-width: 600px;
margin: 0 auto;
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}

h1 {
color: #333;
text-align: center;
}

.input-group {
display: flex;
margin-bottom: 20px;
}

#taskInput {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 16px;
}

button {
padding: 10px 15px;
background-color: #28a745;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
margin-left: 10px;
}

button:hover {
background-color: #218838;
}

#taskList {
list-style: none;
padding: 0;
}

#taskList li {
padding: 10px;
background: #f9f9f9;
border: 1px solid #eee;
margin-bottom: 5px;
border-radius: 4px;
display: flex;
justify-content: space-between;
align-items: center;
}

.delete-btn {
background-color: #dc3545;
color: white;
border: none;
border-radius: 3px;
padding: 5px 10px;
cursor: pointer;
}


3. Пишем JavaScript (script.js):
document.addEventListener('DOMContentLoaded', function() {
const taskInput = document.getElementById('taskInput');
const addButton = document.getElementById('addButton');
const taskList = document.getElementById('taskList');

// Добавление новой задачи
addButton.addEventListener('click', function() {
if (taskInput.value.trim() !== '') {
addTask(taskInput.value);
taskInput.value = '';
}
});

// Добавление по Enter
taskInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter' && taskInput.value.trim() !== '') {
addTask(taskInput.value);
taskInput.value = '';
}
});

function addTask(taskText) {
const li = document.createElement('li');

const taskSpan = document.createElement('span');
taskSpan.textContent = taskText;

const deleteBtn = document.createElement('button');
deleteBtn.textContent = 'Удалить';
deleteBtn.className = 'delete-btn';

deleteBtn.addEventListener('click', function() {
li.remove();
});

li.appendChild(taskSpan);
li.appendChild(deleteBtn);
taskList.appendChild(li);
}
});


🎯 Что мы получили:
Рабочий список задач с добавлением элементов
Возможность удаления задач
Красивый и удобный интерфейс
Обработку нажатия Enter

📌 Советы по улучшению:
1. Добавьте localStorage для сохранения задач
2. Реализуйте отметку выполненных задач
3. Добавьте анимации при добавлении/удалении

👉 В следующем уроке:
Мы научимся сохранять данные между сеансами с помощью localStorage!

Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Пишите в комментариях — какие функции добавить в список дел? 💬
🚀 Веб-разработка с нуля: Урок 12 - Сохраняем данные с localStorage

Привет, будущие профи! 👨💻👩💻
Сегодня сделаем наш To-Do List по-настоящему полезным — научимся сохранять задачи между перезагрузками страницы!

🔥 Что нового узнаем:
1. Работу с localStorage браузера
2. JSON-методы (stringify/parse)
3. Загрузку данных при старте приложения

💾 Основы localStorage:
- Хранит данные в формате ключ-значение
- Данные сохраняются после закрытия браузера
- Лимит около 5-10MB на домен

💻 Модернизируем наш To-Do List:

1. Обновляем JavaScript (script.js):
document.addEventListener('DOMContentLoaded', function() {
const taskInput = document.getElementById('taskInput');
const addButton = document.getElementById('addButton');
const taskList = document.getElementById('taskList');

// Загружаем задачи при старте
loadTasks();

// Добавление новой задачи
addButton.addEventListener('click', addTaskFromInput);
taskInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter') addTaskFromInput();
});

function addTaskFromInput() {
if (taskInput.value.trim() !== '') {
addTask(taskInput.value);
taskInput.value = '';
saveTasks();
}
}

function addTask(taskText, isCompleted = false) {
const li = document.createElement('li');
if (isCompleted) li.classList.add('completed');

const taskSpan = document.createElement('span');
taskSpan.textContent = taskText;

const completeBtn = document.createElement('button');
completeBtn.textContent = isCompleted ? '✓' : '◻️';
completeBtn.className = 'complete-btn';

const deleteBtn = document.createElement('button');
deleteBtn.textContent = '×';
deleteBtn.className = 'delete-btn';

completeBtn.addEventListener('click', function() {
li.classList.toggle('completed');
completeBtn.textContent = li.classList.contains('completed') ? '✓' : '◻️';
saveTasks();
});

deleteBtn.addEventListener('click', function() {
li.remove();
saveTasks();
});

li.appendChild(completeBtn);
li.appendChild(taskSpan);
li.appendChild(deleteBtn);
taskList.appendChild(li);
}

function saveTasks() {
const tasks = [];
document.querySelectorAll('#taskList li').forEach(li => {
tasks.push({
text: li.querySelector('span').textContent,
completed: li.classList.contains('completed')
});
});
localStorage.setItem('tasks', JSON.stringify(tasks));
}

function loadTasks() {
const savedTasks = localStorage.getItem('tasks');
if (savedTasks) {
JSON.parse(savedTasks).forEach(task => {
addTask(task.text, task.completed);
});
}
}
});


2. Добавляем новые стили:
.completed {
text-decoration: line-through;
opacity: 0.7;
}

.complete-btn {
background: none;
border: 1px solid #28a745;
color: #28a745;
border-radius: 3px;
margin-right: 8px;
cursor: pointer;
}

.delete-btn {
background: none;
border: 1px solid #dc3545;
color: #dc3545;
border-radius: 3px;
margin-left: 8px;
}

li:hover .delete-btn {
background-color: #dc3545;
color: white;
}

li:hover .complete-btn {
background-color: #28a745;
color: white;
}


🎯 Что улучшили:
Сохранение задач между сеансами
Отметку выполненных задач
Красивые интерактивные кнопки
Загрузку состояния при открытии

💡 Полезные советы:
1. Всегда обрабатывайте ошибки при работе с localStorage
2. Используйте JSON для сложных структур данных
3. Учитывайте лимит хранилища (5MB обычно)

👉 В следующем уроке:
Создадим модальное окно для редактирования задач!

Подписывайтесь: [t.me/rm_programmer](https://t.me/rm_programmer)
Делитесь своими To-Do листами в комментариях! 💬