enrollments;
+```
+
+В этом сценарии мы выбираем ленивую загрузку (`FetchType.LAZY`). Поскольку нам не всегда нужно получать доступ ко всем записям курса, ленивая загрузка гарантирует, что записи будут извлечены только при явном запросе.
+
+---
+
+# [Далее: Создание Репозитория](../interacting/repository.md)
diff --git a/docs/ru/jpa/practice/creation/relationships.md b/docs/ru/jpa/practice/creation/relationships.md
new file mode 100644
index 0000000..9040aab
--- /dev/null
+++ b/docs/ru/jpa/practice/creation/relationships.md
@@ -0,0 +1,44 @@
+# Определение Связей Между Сущностями
+
+## Введение
+
+Это руководство посвящено пониманию и реализации связей между сущностями в проекте Spring Boot с использованием JPA (Java Persistence API). Конкретно мы рассмотрим отношение между сущностью `Enrollment` и ее связанными сущностями `Student` и `Course`.
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по определению и пониманию связей сущностей в проекте Spring Boot с JPA. К концу этого руководства вы поймете, как установить ассоциации между сущностями и реализовать их в вашем приложении.
+
+## Связи Между Сущностями
+
+
+### Характеристики Сущности Enrollment:
+
+- `id` (UUID): Первичный ключ для сущности.
+- `student` (Student): Студент, связанный с записью на курс.
+- `course` (Course): Курс, связанный с записью на курс.
+- `enrollmentDate` (Date): Дата записи на курс.
+- `grade` (int): Оценка, полученная за курс.
+
+#### Отношение со Студентом
+
+Отношение между сущностью `Enrollment` и сущностью `Student` представляет собой сценарий, когда студент записывается на курс. Это отношение Многие-к-Одному, где много записей на курс может быть связано с одним студентом. Чтобы установить это отношение, аннотируйте атрибут `student` в сущности `Enrollment` аннотацией `@ManyToOne`.
+
+```java
+@ManyToOne
+@JoinColumn(name = "student_id")
+private Student student;
+```
+
+#### Отношение с Курсом
+
+Аналогично отношение между сущностью `Enrollment` и сущностью `Course` означает сценарий, когда на курс записывается несколько студентов. Это также отношение Многие-к-Одному, где много записей на курс может быть связано с одним курсом. Аннотируйте атрибут `course` в сущности `Enrollment` аннотацией `@ManyToOne`.
+
+```java
+@ManyToOne
+@JoinColumn(name = "course_id")
+private Course course;
+```
+
+---
+
+# [Далее: Стратегии Извлечения](fetching.md)
diff --git a/docs/ru/jpa/practice/dependencies/driver.md b/docs/ru/jpa/practice/dependencies/driver.md
new file mode 100644
index 0000000..5867be1
--- /dev/null
+++ b/docs/ru/jpa/practice/dependencies/driver.md
@@ -0,0 +1,100 @@
+# JPA: Настройка зависимостей
+
+## Введение
+
+Это руководство сосредотачивается на настройке зависимостей для проекта Spring Boot с использованием JPA (Java Persistence API). Оно охватывает необходимые шаги по включению драйверов базы данных для различных баз данных, таких как PostgreSQL, MySQL, Oracle, MongoDB и Microsoft SQL Server. Следуя этому руководству, вы настроите все необходимые зависимости для установления соединений с этими базами данных в вашем приложении Spring Boot.
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с особенным акцентом на драйверах баз данных для различных баз данных.
+
+## Настройка зависимостей
+
+### Драйверы баз данных
+
+Для подключения к различным базам данных в вашем приложении Spring Boot включите соответствующие драйверы баз данных.
+
+#### PostgreSQL
+
+**Для Gradle:**
+```groovy
+implementation "org.postgresql:postgresql"
+```
+
+**Для Maven:**
+```xml
+
+ org.postgresql
+ postgresql
+ INSERT_VERSION_HERE
+
+```
+
+#### MySQL
+
+**Для Gradle:**
+```groovy
+implementation "mysql:mysql-connector-java"
+```
+
+**Для Maven:**
+```xml
+
+ mysql
+ mysql-connector-java
+ INSERT_VERSION_HERE
+
+```
+
+#### Драйвер Oracle Database
+
+**Для Gradle:**
+```groovy
+implementation 'com.oracle.database.jdbc:ojdbc8'
+```
+
+**Для Maven:**
+```xml
+
+ com.oracle.database.jdbc
+ ojdbc8
+
+```
+
+#### Драйвер MongoDB (MongoDB Java Driver)
+
+**Для Gradle:**
+```groovy
+implementation 'org.mongodb:mongodb-driver-sync:4.4.3'
+```
+
+**Для Maven:**
+```xml
+
+ org.mongodb
+ mongodb-driver-sync
+ 4.4.3
+
+```
+
+#### Драйвер Microsoft SQL Server JDBC
+
+**Для Gradle:**
+```groovy
+implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11'
+```
+
+**Для Maven:**
+```xml
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+ 9.4.0.jre11
+
+```
+
+Эти зависимости облегчают подключение к базам данных.
+
+---
+
+# [Далее: JPA Настройка зависимостей](jpa.md)
\ No newline at end of file
diff --git a/docs/ru/jpa/practice/dependencies/jpa.md b/docs/ru/jpa/practice/dependencies/jpa.md
new file mode 100644
index 0000000..4f68d7a
--- /dev/null
+++ b/docs/ru/jpa/practice/dependencies/jpa.md
@@ -0,0 +1,183 @@
+# Настройка зависимостей JPA
+
+## Введение
+
+Это руководство сосредоточено на настройке зависимостей для проекта Spring Boot с использованием JPA (Java Persistence API). Оно охватывает необходимые шаги для включения зависимостей Spring Boot Starter JDBC и Spring Boot Starter Data JPA.
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с акцентом на зависимостях Spring Boot Starter JDBC и Spring Boot Starter Data JPA.
+
+## Настройка зависимостей
+
+### Spring Boot Starter JDBC
+
+Для включения поддержки JDBC в вашем приложении Spring Boot:
+
+#### Gradle
+
+```groovy
+implementation "org.springframework.boot:spring-boot-starter-jdbc"
+```
+
+#### Maven
+
+```xml
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+```
+
+Эта зависимость обеспечивает автоконфигурацию для доступа к данным на основе JDBC.
+
+### Spring Boot Starter Data JPA
+
+Для включения поддержки JPA (Java Persistence API) в вашем приложении Spring Boot:
+
+#### Gradle
+
+```groovy
+implementation "org.springframework.boot:spring-boot-starter-data-jpa"
+```
+
+#### Maven
+
+```xml
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+```
+
+Эта зависимость упрощает настройку репозиториев на основе JPA и предоставляет конфигурации по умолчанию для Hibernate.
+
+### Дополнительная конфигурация для Spring WebMVC
+
+Если вы используете Spring WebMVC, вам необходимо добавить дополнительную конфигурацию для настройки бинов и свойств, связанных с сохранением состояния.
+
+#### Создание класса конфигурации Persistence
+
+Создайте новый класс с именем `PersistenceConfig` в пакете `com.example.config`:
+
+```java
+package com.example.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+
+/**
+ * Класс конфигурации для настройки бинов и свойств, связанных с сохранением состояния.
+ *
+ *
+ * Этот класс настраивает источник данных, фабрику менеджеров сущностей и менеджер транзакций для JPA.
+ * Он считывает свойства подключения к базе данных из внешнего файла свойств.
+ *
+ */
+@Configuration
+@EnableTransactionManagement
+@EnableJpaRepositories(basePackages = "com.example.repository")
+@PropertySource({"classpath:application.properties"})
+public class PersistenceConfig {
+
+ @Value("${spring.datasource.driver}")
+ private String dbDriver;
+
+ @Value("${spring.datasource.url}")
+ private String dbUrl;
+
+ @Value("${spring.datasource.username}")
+ private String dbUsername;
+
+ @Value("${spring.datasource.password}")
+ private String dbPassword;
+
+ @Value("${spring.jpa.properties.hibernate.dialect}")
+ private String hibernateDialect;
+
+ @Value("${spring.jpa.properties.hibernate.show_sql}")
+ private boolean hibernateShowSql;
+
+ @Value("${spring.jpa.hibernate.ddl-auto}")
+ private String hibernateHbm2ddlAuto;
+
+ /**
+ * Определение бина DataSource.
+ *
+ *
+ * Этот метод настраивает источник данных, используя свойства, определенные в файле application.properties.
+ *
+ *
+ * @return Бин DataSource
+ */
+ @Bean
+ public DataSource dataSource() {
+ DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName(dbDriver);
+ dataSource.setUrl(dbUrl);
+ dataSource.setUsername(dbUsername);
+ dataSource.setPassword(dbPassword);
+ return dataSource;
+ }
+
+ /**
+ * Определение бина EntityManagerFactory.
+ *
+ *
+ * Этот метод настраивает фабрику менеджеров сущност
+
+ей с использованием настроенного источника данных и свойств Hibernate.
+ *
+ *
+ * @param dataSource бин источника данных
+ * @return Бин EntityManagerFactory
+ */
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
+ LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(dataSource);
+ em.setPackagesToScan("com.example.entity");
+
+ HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+ vendorAdapter.setDatabasePlatform(hibernateDialect);
+ vendorAdapter.setShowSql(hibernateShowSql);
+ vendorAdapter.setGenerateDdl("update".equalsIgnoreCase(hibernateHbm2ddlAuto));
+ em.setJpaVendorAdapter(vendorAdapter);
+
+ return em;
+ }
+
+ /**
+ * Определение бина TransactionManager Spring.
+ *
+ *
+ * Этот метод настраивает менеджер транзакций для JPA с использованием настроенной фабрики менеджеров сущностей.
+ *
+ *
+ * @param entityManagerFactory бин фабрики менеджеров сущностей
+ * @return Бин TransactionManager
+ */
+ @Bean
+ public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
+ JpaTransactionManager txManager = new JpaTransactionManager();
+ txManager.setEntityManagerFactory(entityManagerFactory);
+ return txManager;
+ }
+}
+```
+
+---
+
+# [Следующий: Создание сущностей](../creation/create-entity.md)
\ No newline at end of file
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository.md b/docs/ru/jpa/practice/interacting/jpa-repository.md
new file mode 100644
index 0000000..fd57f6f
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository.md
@@ -0,0 +1,52 @@
+# Создание JpaRepository
+
+## Введение
+
+Это руководство демонстрирует, как создать репозиторий для управления сущностями в проекте Spring Boot с использованием JPA (Java Persistence API) с помощью JpaRepository.
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по настройке репозитория для управления сущностями в приложении Spring Boot. По окончании этого руководства вы сможете создать классы репозитория и сервиса для сущности `Course`.
+
+## Структура каталогов
+
+```
+src/
+└── main/
+ └── java/
+ └── com/
+ └── example/
+ └── demo/
+ ├── data/
+ │ └── entities/
+ │ ├── Student.java
+ │ ├── Enrollment.java
+ │ └── Course.java
+ └── repository/
+ ├── StudentRepository.java
+ └── CourseRepository.java
+
+```
+
+## Класс репозитория
+
+### CourseRepository.java
+
+```java
+package com.yourcompany.yourproject.repository;
+
+import com.yourcompany.yourproject.model.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+ // Добавьте методы репозитория для сущности курса
+}
+```
+
+Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring.
+
+---
+
+# [Далее: Создание записи](jpa-repository/create.md)
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/create.md b/docs/ru/jpa/practice/interacting/jpa-repository/create.md
new file mode 100644
index 0000000..eda726e
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository/create.md
@@ -0,0 +1,38 @@
+# Создание записей в таблице с использованием JpaRepository
+
+## Введение
+
+Это руководство демонстрирует, как создавать записи в таблице, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository.
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс создания записей в таблице путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository.
+
+## Метод репозитория
+
+### CourseRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import java.util.UUID;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+
+ Course save(Course course);
+}
+```
+
+### Объяснение
+
+Метод `save(Course course)`, предоставленный JpaRepository, позволяет нам сохранить новую запись в таблице `Course`.
+
+Вызывая этот метод и передавая объект `Course` в качестве параметра, JpaRepository автоматически обрабатывает процесс сохранения сущности в базе данных.
+
+---
+
+# [Далее: Чтение записи](read.md)
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/delete.md b/docs/ru/jpa/practice/interacting/jpa-repository/delete.md
new file mode 100644
index 0000000..adea12c
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository/delete.md
@@ -0,0 +1,41 @@
+# Удаление записей из таблицы с использованием JpaRepository
+
+## Введение
+
+В этом руководстве показано, как удалять записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository.
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс удаления записей из таблицы путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository.
+
+## Метод репозитория
+
+### CourseRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import java.util.UUID;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+
+ void deleteById(UUID id);
+}
+```
+
+## Объяснение
+
+Метод `deleteById(UUID id)` следует соглашению, распознаваемому JpaRepository, для удаления записей на основе их уникального идентификатора.
+
+- Ключевое слово `delete` указывает, что этот метод используется для удаления данных.
+- `ById` указывает критерий для идентификации записи, которую нужно удалить. В данном случае мы нацелены на запись с определенным идентификатором.
+
+Следуя этому соглашению по именованию, JpaRepository автоматически генерирует соответствующий SQL-запрос для удаления желаемой записи из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы на удаление, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих предполагаемые операции удаления данных.
+
+---
+
+# [Далее: Пользовательский запрос](query.md)
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/query.md b/docs/ru/jpa/practice/interacting/jpa-repository/query.md
new file mode 100644
index 0000000..5d2c4b5
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository/query.md
@@ -0,0 +1,43 @@
+# Пользовательский запрос с использованием JpaRepository
+
+## Введение
+
+Это руководство демонстрирует, как реализовать методы пользовательского запроса, используя аннотацию `@Query` в слое репозитория приложения Spring Boot с JPA (Java Persistence API) и JpaRepository.
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс создания методов пользовательского запроса в интерфейсе репозитория для выполнения определенных операций с базой данных, адаптированных к требованиям приложения.
+
+## Метод репозитория
+
+### CourseRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+import java.util.List;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+
+ @Query("SELECT c FROM Course c WHERE c.instructor = :instructor")
+ List findCoursesByInstructor(@Param("instructor") String instructor);
+}
+```
+
+### Объяснение
+
+Аннотация `@Query` позволяет нам определять пользовательские запросы JPQL (Java Persistence Query Language) непосредственно в интерфейсе репозитория.
+
+- `"SELECT c FROM Course c WHERE c.instructor = :instructor"` - это запрос JPQL, который выбирает все курсы, где имя инструктора соответствует предоставленному значению.
+- Аннотация `@Param("instructor")` привязывает параметр метода `instructor` к именованному параметру `:instructor` в запросе JPQL.
+
+Используя `@Query`, мы можем создавать сложные запросы, адаптированные к конкретным потребностям извлечения данных, обеспечивая гибкость и контроль над операциями с базой данных.
+
+---
+
+# [Next: Tasks](../../../lab-work.md)
\ No newline at end of file
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/read.md b/docs/ru/jpa/practice/interacting/jpa-repository/read.md
new file mode 100644
index 0000000..7cd66e0
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository/read.md
@@ -0,0 +1,42 @@
+# Чтение записей из таблицы с использованием JpaRepository
+
+## Введение
+
+Это руководство демонстрирует, как извлекать данные из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository.
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс чтения данных из таблицы путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository.
+
+## Метод репозитория
+
+### CourseRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import java.util.List;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+
+ List findCoursesByInstructor(String instructor);
+}
+```
+
+### Объяснение
+
+Сигнатура метода `findCoursesByInstructor(String instructor)` следует определенному соглашению по именованию, распознаваемому Spring Data JPA.
+
+- Ключевое слово `find` указывает, что этот метод используется для извлечения данных.
+- `Courses` представляет тип сущности, который мы хотим извлечь.
+- `ByInstructor` указывает критерий для фильтрации результатов. В данном случае мы запрашиваем курсы на основе атрибута `instructor`.
+
+Следуя этому соглашению по именованию, Spring Data JPA автоматически генерирует соответствующий SQL-запрос за кулисами, чтобы извлечь необходимые данные из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих желаемые операции извлечения данных.
+
+---
+
+# [Далее: Удаление записи](delete.md)
diff --git a/docs/ru/jpa/practice/interacting/repository.md b/docs/ru/jpa/practice/interacting/repository.md
new file mode 100644
index 0000000..16e82e1
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository.md
@@ -0,0 +1,50 @@
+# Создание репозитория
+
+## Введение
+
+Это руководство демонстрирует, как создать репозиторий для управления сущностями в проекте Spring Boot с использованием JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по настройке репозитория для управления сущностями в приложении Spring Boot. По окончании этого руководства вы сможете создать репозиторий для сущности `Student`.
+
+## Структура каталогов
+
+```
+src/
+└── main/
+ └── java/
+ └── com/
+ └── example/
+ └── demo/
+ ├── data/
+ │ └── entites/
+ │ ├── Student.java
+ │ ├── Enrollment.java
+ │ └── Course.java
+ └── repository/
+ └── StudentRepository.java
+
+```
+
+## Класс репозитория
+
+### StudentRepository.java
+
+```java
+package com.yourcompany.yourproject.repository;
+
+import com.yourcompany.yourproject.model.Student;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class StudentRepository {
+ // Добавьте методы репозитория для сущности студента
+}
+```
+
+Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring.
+
+---
+
+# [Далее: Создание записи](repository/create.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/create.md b/docs/ru/jpa/practice/interacting/repository/create.md
new file mode 100644
index 0000000..8fbbbf9
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/create.md
@@ -0,0 +1,46 @@
+# Создание новых записей в таблице с использованием слоя репозитория
+
+## Введение
+
+Это руководство иллюстрирует, как создавать новые записи в таблице, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - продемонстрировать процесс создания новых записей в таблице с использованием слоя репозитория. Мы достигнем этого, реализовав метод в интерфейсе `StudentRepository`, используя `EntityManager` вместо `JpaRepository`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public void saveStudent(Student student) {
+ entityManager.persist(student);
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.persist(student)`: Этот код сохраняет новую сущность `Student` в базе данных.
+
+---
+
+# [Далее: Чтение записи](read.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/delete.md b/docs/ru/jpa/practice/interacting/repository/delete.md
new file mode 100644
index 0000000..c6ade0d
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/delete.md
@@ -0,0 +1,47 @@
+# Удаление записей из таблицы с использованием слоя репозитория
+
+## Введение
+
+В этом руководстве показано, как удалять записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - продемонстрировать процесс удаления записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public void deleteStudent(UUID id) {
+ Student studentToDelete = entityManager.find(Student.class, id);
+ entityManager.remove(studentToDelete);
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.remove(studentToDelete)`: Этот код удаляет сущность `Student` из базы данных.
+
+---
+
+# [Далее: Пользовательский запрос](query.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/query.md b/docs/ru/jpa/practice/interacting/repository/query.md
new file mode 100644
index 0000000..b25f84d
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/query.md
@@ -0,0 +1,48 @@
+# Создание пользовательских запросов в таблице с использованием слоя репозитория
+
+## Введение
+
+В этом руководстве показано, как создавать пользовательские запросы для извлечения записей из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс создания пользовательских запросов для извлечения записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.List;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public List findStudentsByMajor(String major) {
+ return entityManager.createQuery("SELECT s FROM Student s WHERE s.major = :major", Student.class)
+ .setParameter("major", major)
+ .getResultList();
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.createQuery(...)`: Этот код создает пользовательский запрос на JPQL (Java Persistence Query Language) для извлечения записей на основе предоставленного критерия (`major` в этом примере).
+
+---
+
+# [Далее: Создание JpaRepository](../jpa-repository.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/read.md b/docs/ru/jpa/practice/interacting/repository/read.md
new file mode 100644
index 0000000..36e6af3
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/read.md
@@ -0,0 +1,46 @@
+# Чтение записей из таблицы с использованием слоя репозитория
+
+## Введение
+
+В этом руководстве показано, как читать записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс чтения записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.UUID;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public Student findStudentById(UUID id) {
+ return entityManager.find(Student.class, id);
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.find(Student.class, id)`: Этот код извлекает сущность `Student` из базы данных на основе предоставленного `id`.
+
+---
+
+# [Далее: Обновление записи](update.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/update.md b/docs/ru/jpa/practice/interacting/repository/update.md
new file mode 100644
index 0000000..2fe9b31
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/update.md
@@ -0,0 +1,46 @@
+# Обновление записей в таблице с использованием слоя репозитория
+
+## Введение
+
+Это руководство иллюстрирует, как обновлять записи в таблице с использованием слоя репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - продемонстрировать процесс обновления записей в таблице, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public Student updateStudent(Student student) {
+ return entityManager.merge(student);
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.merge(student)`: Этот код обновляет сущность `Student` в базе данных.
+
+---
+
+# [Далее: Удаление записи](delete.md)
diff --git a/docs/ru/springsecurity/lab-work.md b/docs/ru/springsecurity/lab-work.md
index f4554d7..2166b50 100644
--- a/docs/ru/springsecurity/lab-work.md
+++ b/docs/ru/springsecurity/lab-work.md
@@ -1,10 +1,12 @@
+[English](../../en/springsecurity/lab-work.md) | [中文](../../cn/springsecurity/lab-work.md) | Русский
+
# Лабораторные работы по Spring Security
-Добро пожаловать в лабораторные работы по Spring Security! Цель этой серии задач - помочь вам практиковаться и познакомиться с Spring Security, а также создать достаточно полноценный проект. Будь вы начинающим или стремитесь улучшить свои навыки, эти практические задачи помогут вам разобраться в различных аспектах интеграции безопасности в приложение на Spring.
+Добро пожаловать в лабораторные работы по Spring Security! Цель этой серии задач - помочь вам на практике познакомиться с Spring Security, а также создать почти полноценный проект. Если вы начинающий или просто стремитесь улучшить свои навыки, эти практические задачи помогут вам разобраться в различных аспектах интеграции безопасности в приложение на Spring.
## Цель лабораторных работ
-Основная цель этих лабораторных работ - предоставить вам практический опыт и уверенность в использовании безопасности в среде Spring. Spring Security широко используется для аутентификации, авторизации и обеспечения безопасности вашего проекта, и через эти задачи вы получите ценные знания о его конфигурации, аутентификации, авторизации и многом другом.
+Основная цель этих лабораторных работ - предоставить вам практический опыт и уверенность в использовании безопасности в среде Spring. Spring Security широко используется для аутентификации, авторизации и обеспечения безопасности вашего приложения, и через эти задачи вы получите полезные знания о конфигурации, аутентификации, авторизации и многом другом.
## Задачи практики
@@ -34,7 +36,7 @@
Определение различных пользовательских ролей (Менеджер, Учитель, Студент) и их соответствующих полномочий.
### Задача 3: Настройка Безопасности в Контроллерах
-Защита конечных точек с использованием контроля доступа на основе ролей.
+Защита путей приложения (endpoins) с использованием контроля доступа на основе ролей.
#### Детали реализации
**Роль Менеджера**:
@@ -57,4 +59,4 @@
Ограничение доступа к элементам пользовательского интерфейса на основе ролей пользователей.
### Задача 5: Тестирование Контроля Доступа на Основе Ролей
-Убедитесь, что конечные точки и элементы пользовательского интерфейса правильно защищены.
\ No newline at end of file
+Убедитесь, что enpoints и элементы пользовательского интерфейса правильно защищены.
diff --git a/docs/ru/springsecurity/practice/authorize-client-authenticated.md b/docs/ru/springsecurity/practice/authorize-client-authenticated.md
new file mode 100644
index 0000000..2fb7c91
--- /dev/null
+++ b/docs/ru/springsecurity/practice/authorize-client-authenticated.md
@@ -0,0 +1,54 @@
+# Авторизация аутентифицированных пользователей (на клиентской стороне)
+
+Этот файл описывает процесс авторизации пользователей на основе их статуса аутентификации на клиентской стороне с использованием Thymeleaf. Путем отображения или скрытия элементов в представлении в зависимости от статуса аутентификации пользователя можно контролировать видимость определенных функциональностей или действий.
+
+## Цель
+
+Контролировать видимость элементов, связанных с добавлением и удалением студентов, в зависимости от статуса аутентификации пользователя в представлениях Thymeleaf.
+
+## Шаги
+
+1. **Обновление шаблонов Thymeleaf:**
+
+ Измените шаблоны Thymeleaf для условного отображения элементов в зависимости от статуса аутентификации пользователя.
+
+ ```html
+
+
+
+ Управление студентами
+
+
+ Управление студентами
+
+
+
+
+
+
+
+
+
+
Добро пожаловать в систему управления студентами. Здесь вы можете управлять записями студентов.
+
+
+
+ ```
+
+ В этом шаблоне:
+ - Используется выражение `th:if="${#authorization.expression('isAuthenticated()')}"`, чтобы условно отображать кнопки "Добавить студента" и "Удалить студента" только если пользователь аутентифицирован.
+
+## Объяснение
+
+- **Диалект безопасности Thymeleaf**: Объект `#authorization` является частью диалекта безопасности Thymeleaf, который интегрирует Spring Security с Thymeleaf.
+- **Условное отображение**: Атрибут `th:if` используется для условного отображения или скрытия элементов в зависимости от статуса аутентификации пользователя.
+
+Следуя этим шагам, вы можете контролировать видимость элементов в ваших представлениях Thymeleaf в зависимости от статуса аутентификации пользователя, обеспечивая, что только аутентифицированные пользователи могут видеть и взаимодействовать с определенными функциональностями.
+
+---
+
+# [СЛЕДУЮЩАЯ ЗАДАЧА: Авторизация по ролям](authorize-client-role.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/authorize-client-authority.md b/docs/ru/springsecurity/practice/authorize-client-authority.md
new file mode 100644
index 0000000..f4a6842
--- /dev/null
+++ b/docs/ru/springsecurity/practice/authorize-client-authority.md
@@ -0,0 +1,55 @@
+# Авторизация по авторитету (клиентская сторона)
+
+Это задание описывает процесс авторизации пользователей на клиентской стороне веб-интерфейса с использованием Thymeleaf. Путем отображения или скрытия элементов на основе авторитетов пользователя вы можете контролировать видимость определенных функций или действий.
+
+## Цель
+
+Контроль видимости элементов, связанных с добавлением и удалением студентов, в зависимости от авторитетов пользователя в представлениях Thymeleaf.
+
+## Шаги
+
+1. **Обновление шаблонов Thymeleaf:**
+
+ Измените шаблоны Thymeleaf, чтобы условно отображать элементы в зависимости от авторитетов пользователя.
+
+ ```html
+
+
+
+ Управление студентами
+
+
+ Управление студентами
+
+
+
+
+
+
+
+
+
+
Добро пожаловать в систему управления студентами. Здесь вы можете управлять записями студентов.
+
+
+
+ ```
+
+ В этом шаблоне:
+ - Используется оператор `th:if="${#authorization.expression('hasAuthority(''WRITE'')')}"`, чтобы условно отображать кнопку "Добавить студента" только в том случае, если у пользователя есть авторитет `WRITE`.
+ - Аналогично, оператор `th:if="${#authorization.expression('hasAuthority(''DELETE'')')}"` используется для условного отображения кнопки "Удалить студента" только в том случае, если у пользователя есть авторитет `DELETE`.
+
+## Объяснение
+
+- **Диалект безопасности Thymeleaf**: Объект `#authorization` является частью диалекта безопасности Thymeleaf, который интегрирует Spring Security с Thymeleaf.
+- **Условное отображение**: Атрибут `th:if` используется для условного отображения или скрытия элементов на основе авторитетов пользователя.
+
+Следуя этим шагам, вы можете контролировать видимость элементов в ваших представлениях Thymeleaf в зависимости от авторитетов пользователей, гарантируя, что только авторизованные пользователи могут видеть и взаимодействовать с определенными функциями.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Пользовательская форма входа](custom-login-form.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/authorize-client-role.md b/docs/ru/springsecurity/practice/authorize-client-role.md
new file mode 100644
index 0000000..ca031bb
--- /dev/null
+++ b/docs/ru/springsecurity/practice/authorize-client-role.md
@@ -0,0 +1,55 @@
+# Авторизация по ролям (клиентская сторона)
+
+Это задание описывает процесс авторизации пользователей на клиентской стороне веб-интерфейса с использованием Thymeleaf. Путем отображения или скрытия элементов на основе ролей пользователя можно контролировать видимость определенных функций или действий.
+
+## Цель
+
+Контроль видимости элементов, связанных с добавлением и удалением студентов, в зависимости от ролей пользователя в представлениях Thymeleaf.
+
+## Шаги
+
+1. **Обновление шаблонов Thymeleaf:**
+
+ Измените шаблоны Thymeleaf, чтобы условно отображать элементы в зависимости от ролей пользователя.
+
+ ```html
+
+
+
+ Управление студентами
+
+
+ Управление студентами
+
+
+
+
+
+
+
+
+
+
Добро пожаловать в систему управления студентами. Здесь вы можете управлять записями студентов.
+
+
+
+ ```
+
+ В этом шаблоне:
+ - Используется оператор `th:if="${#authorization.expression('hasRole(''ROLE_ADMIN'')')}"`, чтобы условно отображать кнопку "Добавить студента" только в том случае, если у пользователя есть роль `ROLE_ADMIN`.
+ - Аналогично, оператор `th:if="${#authorization.expression('hasRole(''ROLE_MANAGER'')')}"` используется для условного отображения кнопки "Удалить студента" только в том случае, если у пользователя есть роль `ROLE_MANAGER`.
+
+## Объяснение
+
+- **Диалект безопасности Thymeleaf**: Объект `#authorization` является частью диалекта безопасности Thymeleaf, который интегрирует Spring Security с Thymeleaf.
+- **Условное отображение**: Атрибут `th:if` используется для условного отображения или скрытия элементов на основе ролей пользователя.
+
+Следуя этим шагам, вы можете контролировать видимость элементов в ваших представлениях Thymeleaf в зависимости от ролей пользователей, гарантируя, что только авторизованные пользователи могут видеть и взаимодействовать с определенными функциями.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по авторитету](authorize-client-authority.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/authorize-server-authenticated.md b/docs/ru/springsecurity/practice/authorize-server-authenticated.md
index 93f418e..61c8b67 100644
--- a/docs/ru/springsecurity/practice/authorize-server-authenticated.md
+++ b/docs/ru/springsecurity/practice/authorize-server-authenticated.md
@@ -33,6 +33,6 @@
- Мы используем `.authorizeHttpRequests()`, чтобы определить правила авторизации.
- Заявление `.requestMatchers("/second").authenticated()` указывает, что доступ к пути `/second` должен быть ограничен только для аутентифицированных пользователей.
-## Заключение
+---
-Вы успешно настроили авторизацию для разрешения доступа к пути `/second` только для аутентифицированных пользователей. Путем требования аутентификации для этого пути.
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по роли](authorize-server-role.md)
diff --git a/docs/ru/springsecurity/practice/authorize-server-authority.md b/docs/ru/springsecurity/practice/authorize-server-authority.md
index d6f7346..2040e86 100644
--- a/docs/ru/springsecurity/practice/authorize-server-authority.md
+++ b/docs/ru/springsecurity/practice/authorize-server-authority.md
@@ -34,6 +34,6 @@
- Заявление `.requestMatchers("/addStudent").hasAuthority("WRITE")` указывает, что доступ к пути `/addStudent` должен быть ограничен для пользователей с правами `WRITE`.
- Аналогично, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` ограничивает доступ к пути `/removeStudent` для пользователей с правами `DELETE`.
-## Заключение
+---
-Вы успешно настроили контроль доступа на основе прав для путей `/addStudent` и `/removeStudent` в вашем приложении. Присваивая конкретные права пользователям, вы можете контролировать доступ к различным функциональностям или действиям на основе их разрешений.
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Настройка безопасности Thymeleaf](configure-thymeleaf-security.md)
diff --git a/docs/ru/springsecurity/practice/authorize-server-role.md b/docs/ru/springsecurity/practice/authorize-server-role.md
index 6b6ff73..ce374bc 100644
--- a/docs/ru/springsecurity/practice/authorize-server-role.md
+++ b/docs/ru/springsecurity/practice/authorize-server-role.md
@@ -34,6 +34,6 @@
- Заявление `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` указывает, что доступ к пути `/third` должен быть ограничен для пользователей с авторитетом `ROLE_MODERATOR`.
- Аналогично, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` ограничивает доступ к пути `/fourth` для пользователей с авторитетом `ROLE_ADMIN`.
-## Заключение
+---
-Вы успешно настроили контроль доступа на основе ролей для путей `/third` и `/fourth` в вашем приложении. Присваивая конкретные роли пользователям, вы можете контролировать доступ к различным частям вашего приложения на основе их разрешений.
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по полномочию](authorize-server-authority.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/base-implementation-user.md b/docs/ru/springsecurity/practice/base-implementation-user.md
index 83c9688..694a173 100644
--- a/docs/ru/springsecurity/practice/base-implementation-user.md
+++ b/docs/ru/springsecurity/practice/base-implementation-user.md
@@ -181,6 +181,6 @@ src
Эта структура папок показывает, где создать класс `CustomUserDetailsService` и интерфейс `UsersRepository` в вашем проекте. Организация ваших классов таким образом помогает поддерживать чистый и структурированный код.
-## Заключение
+---
-Поздравляю! Вы успешно создали базовую реализацию для управления пользователями в вашем приложении. С UserDetails, UsersRepository и UserDetailsService вы можете аутентифицировать пользователей, управлять их данными и выполнять операции, связанные с пользователями, эффективно.
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/configure-spring-security.md b/docs/ru/springsecurity/practice/configure-spring-security.md
index f556b3f..4ef55f5 100644
--- a/docs/ru/springsecurity/practice/configure-spring-security.md
+++ b/docs/ru/springsecurity/practice/configure-spring-security.md
@@ -33,7 +33,7 @@
2. **Создание класса конфигурации безопасности**
- Создайте новый класс Java с именем `WebSecurityConfig` в структуре исходных файлов вашего проекта. Обычно этот класс располагается в пакете `config`. Файл должен называться `WebSecurityConfig.java`.
+ Создайте новый Java класс с именем `WebSecurityConfig` в структуре вашего проекта. Обычно этот класс располагается в пакете `config`. Файл должен называться `WebSecurityConfig.java`.
Структура папок вашего проекта должна выглядеть примерно так:
@@ -74,6 +74,6 @@
}
```
-## Заключение
+---
-Поздравляем! Вы успешно настроили Spring Security в своем проекте. Ваше приложение теперь обладает надежными средствами безопасности для защиты от несанкционированного доступа и обеспечения конфиденциальности и целостности данных пользователей.
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md)
diff --git a/docs/ru/springsecurity/practice/configure-thymeleaf-security.md b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md
index 78960e2..0e0cc51 100644
--- a/docs/ru/springsecurity/practice/configure-thymeleaf-security.md
+++ b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md
@@ -25,5 +25,6 @@
```
-## Заключение
-После добавления зависимости Thymeleaf будет настроен для работы с Spring Security, предоставляя дополнительные функции и утилиты для интеграции функциональности, связанной с безопасностью, в ваше веб-приложение. Не забудьте синхронизировать ваш проект, чтобы загрузить зависимость и сделать ее доступной для использования.
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создать базовую реализацию для пользователя](base-implementation-user.md)
diff --git a/docs/ru/springsecurity/practice/create-identity-to-users.md b/docs/ru/springsecurity/practice/create-identity-to-users.md
index e96f03c..fc0880a 100644
--- a/docs/ru/springsecurity/practice/create-identity-to-users.md
+++ b/docs/ru/springsecurity/practice/create-identity-to-users.md
@@ -56,6 +56,6 @@
- Полномочия представлены объектами `SimpleGrantedAuthority` и добавляются в профили пользователей соответственно.
- Кроме того, мы устанавливаем роль для каждого пользователя, чтобы в дальнейшем использовать контроль доступа на основе ролей.
-## Заключение
+---
-Вы успешно улучшили профили пользователей в вашем приложении, назначив роли и полномочия фиктивным пользователям. Определив их идентификацию и разрешения на доступ, теперь вы можете контролировать действия и функциональность, доступные каждому пользователю в приложении.
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создать базу для авторизации на сервере](setup-server-authorization.md)
diff --git a/docs/ru/springsecurity/practice/custom-login-form.md b/docs/ru/springsecurity/practice/custom-login-form.md
index c9a9681..e7e6d64 100644
--- a/docs/ru/springsecurity/practice/custom-login-form.md
+++ b/docs/ru/springsecurity/practice/custom-login-form.md
@@ -35,6 +35,6 @@
- Оператор `.loginPage("/custom-login-page")` указывает URL пользовательской страницы входа.
- Вы можете добавить дополнительные конфигурации для настройки поведения формы входа, такие как установка URL для успешного или неудачного входа, определение имен полей формы и т. д.
-## Заключение
+---
-Вы успешно активировали пользовательскую страницу формы входа для аутентификации в вашем приложении. Пользователи теперь могут получить доступ к пользовательской странице входа, чтобы безопасно войти и аутентифицироваться в системе.
+# [СЛЕДУЮЩЕЕ: ЗАДАНИЯ](../lab-work.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/password-encryption.md b/docs/ru/springsecurity/practice/password-encryption.md
index 30633f9..97a78d4 100644
--- a/docs/ru/springsecurity/practice/password-encryption.md
+++ b/docs/ru/springsecurity/practice/password-encryption.md
@@ -77,6 +77,6 @@
Этот метод принимает объект CustomUserDetails, представляющий пользователя для регистрации. Он шифрует пароль пользователя с использованием бина BCryptPasswordEncoder, а затем сохраняет пользователя в базе данных.
-## Заключение
+---
-Поздравляем! Вы успешно настроили шифрование паролей с использованием BCryptPasswordEncoder в вашем приложении, использующем Spring Security. Шифрование паролей повышает безопасность аутентификации пользователей и защищает конфиденциальные данные пользователей.
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Добавить тестовых пользователей](add-dummy-users.md)
diff --git a/docs/ru/thymeleaf/lab-work.md b/docs/ru/thymeleaf/lab-work.md
new file mode 100644
index 0000000..dd9bd8e
--- /dev/null
+++ b/docs/ru/thymeleaf/lab-work.md
@@ -0,0 +1,74 @@
+[English](../../en/thymeleaf/lab-work.md) | [中文](../../cn/thymeleaf/lab-work.md) | Русский
+
+
+# Лабораторная работа по Thymeleaf
+
+Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf - шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложении Spring.
+
+## Цель лабораторной работы
+
+Цель этой лабораторной работы - помочь вам изучить Thymeleaf в среде Spring на практике. Thymeleaf широко используется для серверного рендеринга в веб-разработке. Прорешав эти задания, вы получите полезные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом.
+
+## Практические задачи
+
+1. [Задача 1: Настройка Thymeleaf в Spring](practice/configure-thymeleaf.md)
+2. [Задача 2: Создание первого представления](practice/create-first-view.md)
+3. [Задача 3: Работа с переменными](practice/working-with-variables.md)
+4. [Задача 4: Переменные и контроллер](practice/variables-and-controller.md)
+5. [Задача 5: Итерация](practice/iteration.md)
+6. [Задача 6: Литералы](practice/literals.md)
+7. [Задача 7: Формы](practice/forms.md)
+8. [Задача 8: Обработка форм](practice/form-handling.md)
+9. [Задача 9: Query Parameter и валидация](practice/validation.md)
+10. [Задача 10: Фрагменты и макеты](practice/fragments-and-layouts.md)
+
+
+## Задачи лабораторной работы
+
+1. **Задача 1: Создание HTML-макета с фрагментами**
+
+ - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, header и подвал.
+ - Соберите эти фрагменты в один HTML-файл, чтобы создать полноценный макет веб страницы.
+ - Например:
+
+ 
+
+2. **Задача 2: Создание домашней страницы с локализацией**
+
+ - Реализуйте домашнюю страницу, доступную по пути `/`.
+ - Используйте созданный в Задаче 1 макет для структурирования домашней страницы.
+ - Используйте выражения `#{}` для всего текстового содержимого на домашней странице, демонстрируя локализацию или сообщения из файла .properties.
+ - Например:
+
+ 
+
+3. **Задача 3: Создание форм входа и регистрации**
+
+ - Создайте формы входа и регистрации для аутентификации пользователей.
+ - Используйте привязку модели Thymeleaf для обработки данных формы.
+ - Например:
+
+ 
+
+ 
+
+4. **Задача 4: Валидация действий входа и регистрации**
+
+ - Реализуйте валидацию для действий входа и регистрации.
+ - Используйте параметры запроса для передачи сообщений об ошибках в случае неудачной валидации.
+ - Обеспечьте безопасное и правильное обращение с вводом пользователя.
+ - Например:
+
+ 
+
+5. **Задача 5: Создание страницы пользователей**
+
+ - Разработайте страницу "Пользователи", отображающую таблицу пользователей.
+ - Реализуйте итерацию для динамического заполнения таблицы данными пользователей.
+ - Реализуйте функциональность для удаления или изменения записей пользователя на странице.
+ - Например:
+
+ 
+
+ 
+
diff --git a/docs/ru/thymeleaf/practice/configure-thymeleaf.md b/docs/ru/thymeleaf/practice/configure-thymeleaf.md
new file mode 100644
index 0000000..1031ed8
--- /dev/null
+++ b/docs/ru/thymeleaf/practice/configure-thymeleaf.md
@@ -0,0 +1,115 @@
+# Настройка Thymeleaf в Spring
+
+**Описание:**
+
+Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения легкой интеграции шаблонного движка для веб-разработки.
+
+## **Шаги:**
+
+1. **Создайте Класс Конфигурации Thymeleaf:**
+ - В вашем проекте Spring создайте новый Java-класс, аннотированный `@Configuration`. Мы рекомендуем разместить этот класс в пакете `config`.
+ - Расширьте класс с `WebMvcConfigurer`.
+
+ Пример:
+
+ ```java
+ package edu.labs.thymeleaf.config;
+
+ import org.springframework.context.annotation.Configuration;
+ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+ @Configuration
+ public class WebMvcConfig implements WebMvcConfigurer {
+ // Код конфигурации размещается здесь
+ }
+ ```
+
+ Размещение класса конфигурации в пакете `config` помогает правильно структурировать ваш код. Скорректируйте имя пэкеджа в зависимости от структуры вашего проекта.
+
+2. **Настройте Разрешитель Шаблонов Thymeleaf:**
+ - Создайте метод с аннотацией `@Bean` для конфигурации шаблонизатора Thymeleaf.
+ - Используйте `ClassLoaderTemplateResolver` и установите префикс, суффикс, режим шаблона и кодировку символов.
+
+ ```java
+ @Bean
+ public ClassLoaderTemplateResolver templateResolver() {
+ // Создайте bean ClassLoaderTemplateResolver
+ ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
+
+ // Установите путь, где Thymeleaf будет искать шаблоны
+ templateResolver.setPrefix("/templates/");
+
+ // Установите расширение файла для шаблонов
+ templateResolver.setSuffix(".html");
+
+ // Установите режим шаблона в HTML
+ templateResolver.setTemplateMode(TemplateMode.HTML);
+
+ // Установите кодировку символов для шаблонов
+ templateResolver.setCharacterEncoding("UTF-8");
+
+ // Верните настроенный bean разрешителя шаблонов
+ return templateResolver;
+ }
+ ```
+
+3. **Настройте Источник Сообщений:**
+ - Добавьте метод, аннотированный `@Bean`, для настройки источника сообщений с использованием `ReloadableResourceBundleMessageSource`.
+ - Установите кодировку по умолчанию.
+
+ ```java
+ @Bean
+ public MessageSource messageSource() {
+ // Создайте bean ReloadableResourceBundleMessageSource
+ ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
+
+ // Установите кодировку по умолчанию для сообщений
+ messageSource.setDefaultEncoding("UTF-8");
+
+ // Верните настроенный bean источника сообщений
+ return messageSource;
+ }
+ ```
+
+4. **Настройте Разрешитель Представлений Thymeleaf:**
+ - Создайте метод, аннотированный `@Bean`, для настройки Thymeleaf.
+ - Установите шаблонный движок.
+
+ ```java
+ @Bean
+ public ViewResolver thymeleafViewResolver() {
+ // Создайте bean ThymeleafViewResolver
+ ThymeleafViewResolver resolver = new ThymeleafViewResolver();
+
+ // Установите шаблонный движок для разрешителя представлений
+ resolver.setTemplateEngine(templateEngine());
+
+ // Верните настроенный bean ThymeleafViewResolver
+ return resolver;
+ }
+ ```
+
+5. **Настройте Шаблонный Движок Thymeleaf:**
+ - Реализуйте метод, аннотированный `@Bean`, для настройки шаблонного движка Thymeleaf.
+ - Установите разрешитель шаблонов и источник сообщений шаблонного движка.
+
+ ```java
+ @Bean
+ public SpringTemplateEngine templateEngine() {
+ // Создайте bean SpringTemplateEngine
+ SpringTemplateEngine templateEngine = new SpringTemplateEngine();
+
+ // Установите разрешитель шаблонов для шаблонного движка
+ templateEngine.setTemplateResolver(templateResolver());
+
+ // Установите источник сообщений шаблонного движка
+ templateEngine.setTemplateEngineMessageSource(messageSource());
+
+ // Верните настроенный bean SpringTemplateEngine
+ return templateEngine;
+ }
+ ```
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md)
diff --git a/docs/ru/thymeleaf/practice/create-first-view.md b/docs/ru/thymeleaf/practice/create-first-view.md
new file mode 100644
index 0000000..c9527d3
--- /dev/null
+++ b/docs/ru/thymeleaf/practice/create-first-view.md
@@ -0,0 +1,59 @@
+# Создание Первого Представления
+
+**Описание:**
+
+В данной задаче мы создадим первое представление Thymeleaf для вашего приложения Spring. Следуйте указанному пути к файлам, определенному в конфигурации Thymeleaf, и зарегистрируйте представление в приложении.
+
+## **Шаги:**
+
+1. **Создайте Файл Представления:**
+ - Перейдите в каталог, указанный в конфигурации Thymeleaf как префикс для шаблонов.
+ - По умолчанию префикс настроен как `/templates/`. Следовательно, создайте файл представления Thymeleaf в этом каталоге.
+
+ ```plaintext
+ Каталог Проекта
+ └── src
+ └── main
+ └── resources
+ └── templates
+ └── practice
+ └── first.html
+ ```
+
+ Убедитесь, что файл представления имеет правильное имя (например, `first.html`). Каталог `/templates/` важен для того, чтобы Thymeleaf мог правильно находить и обрабатывать ваши шаблоны.
+
+2. **Зарегистрируйте Представление в Конфигурационном Классе:**
+ - Откройте конфигурационный класс, где вы настраивали Thymeleaf (например, `WebMvcConfig`).
+ - Добавьте следующий метод для регистрации представления Thymeleaf:
+
+ ```java
+ public void addViewControllers(ViewControllerRegistry registry) {
+ // Первое представление
+ registry.addViewController("/first").setViewName("practice/first");
+ }
+ ```
+
+ Этот метод сопоставляет URL-путь `/first` с представлением Thymeleaf с именем "practice/first". Скорректируйте путь в соответствии с структурой вашего проекта.
+
+3. **Проверьте Представление:**
+ - Запустите ваше приложение Spring.
+ - Откройте веб-браузер и перейдите по адресу `http://localhost:8080/first`. Вы должны увидеть отображенное представление Thymeleaf.
+
+4. **Дополнительно: Настройте Перенаправление с Корневого Пути:**
+ - Чтобы установить первое представление в качестве страницы по умолчанию, вы можете добавить перенаправление с корневого пути ("/") на путь первого представления в методе `addViewControllers`:
+
+ ```java
+ public void addViewControllers(ViewControllerRegistry registry) {
+ // Первое представление
+ registry.addViewController("/first").setViewName("practice/first");
+
+ // Перенаправление с корневого пути на первое представление
+ registry.addRedirectViewController("/", "/first");
+ }
+ ```
+
+ Теперь при посещении `http://localhost:8080/` произойдет автоматическое перенаправление на первое представление.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Работа с Переменными*](working-with-variables.md)
\ No newline at end of file
diff --git a/docs/ru/thymeleaf/practice/form-handling.md b/docs/ru/thymeleaf/practice/form-handling.md
new file mode 100644
index 0000000..a9eec58
--- /dev/null
+++ b/docs/ru/thymeleaf/practice/form-handling.md
@@ -0,0 +1,72 @@
+# Обработка Формы
+
+**Описание:**
+
+В этом продолжении мы сосредоточимся на обработке отправки форм и отображении представления с использованием `PracticeController`. Это включает передачу модели в представление при его отображении и реализацию логики обработки отправки формы.
+
+**Шаги:**
+
+1. **Отображение Представления Формы (PracticeController):**
+
+ - Откройте класс `PracticeController` и добавьте метод для отображения представления формы:
+
+ ```java
+ import org.springframework.stereotype.Controller;
+ import org.springframework.ui.Model;
+ import org.springframework.web.bind.annotation.GetMapping;
+
+ @Controller
+ public class PracticeController {
+
+ // Другие методы...
+
+ @GetMapping("/third")
+ public String showAddStudentForm(Model model) {
+ model.addAttribute("model", new StudentModel());
+ return "practice/third";
+ }
+ }
+ ```
+
+ - Объяснение:
+ - `@GetMapping("/third")`: Эта аннотация сопоставляет метод с обработкой GET-запросов для конечной точки `/third`.
+ - `showAddStudentForm(Model model)`: Этот метод принимает параметр `Model`, добавляет в него новый объект `StudentModel` и возвращает имя представления (`"thirdView"` в данном случае). Обновлено для отражения правильного названия представления.
+ - Модель заполняется новым экземпляром `StudentModel`, который будет использоваться для привязки полей формы.
+
+2. **Обработка Отправки Формы (PracticeController):**
+
+ - Добавьте метод в `PracticeController` для обработки отправки формы:
+
+ ```java
+ import org.springframework.stereotype.Controller;
+ import org.springframework.ui.Model;
+ import org.springframework.web.bind.annotation.*;
+
+ import java.util.ArrayList;
+ import java.util.List;
+
+ @Controller
+ public class PracticeController {
+
+ private final List students = new ArrayList<>();
+
+ // Другие методы...
+
+ @PostMapping("/addStudent")
+ public String addStudent(@ModelAttribute("model") StudentModel model) {
+ students.add(model);
+
+ return "redirect:/third";
+ }
+ }
+ ```
+
+ - Объяснение:
+ - `@PostMapping("/addStudent")`: Эта аннотация сопоставляет метод с обработкой POST-запросов для конечной точки `/addStudent`.
+ - `addStudent(@ModelAttribute("model") StudentModel model)`: Этот метод принимает атрибут `model` из отправленной формы (`@ModelAttribute`) и обрабатывает его. Данные формы автоматически привязываются к объекту `model`.
+ - Логика внутри этого метода добавляет студента в список `students`. В реальном сценарии вы обычно бы сохраняли студента в базу данных или выполняли другие необходимые действия.
+ - `return "redirect:/third";`: Эта строка перенаправляет пользователя обратно к представлению формы (`/third`).
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Параметры Запроса и Валидация*](validation.md)
\ No newline at end of file
diff --git a/docs/ru/thymeleaf/practice/forms.md b/docs/ru/thymeleaf/practice/forms.md
new file mode 100644
index 0000000..3ace17c
--- /dev/null
+++ b/docs/ru/thymeleaf/practice/forms.md
@@ -0,0 +1,118 @@
+# Формы
+
+**Описание:**
+
+В этом задании вы создадите новое представление Thymeleaf с именем `third.html` и реализуете логику обработки форм в контроллере `PracticeController`. Форма позволит пользователям добавлять новых студентов с определенными данными, и контроллер будет обрабатывать отправку формы.
+
+**Шаги:**
+
+1. **Создайте третье представление (third.html):**
+
+ - Создайте новый файл представления Thymeleaf с именем `third.html` в каталоге `/src/main/resources/templates/practice`.
+
+ ```html
+
+
+
+
+ Добавление студента
+
+
+
+
+
+ ```
+
+2. **Настройте отправку формы:**
+
+ - В теге `form` настройте детали отправки формы:
+
+ ```html
+