Загрузка данных


Практическое занятие 1, 2
Создание приложений

1	Цель работы:
1.1	Изучить основные понятия и принципы работы в С++. при подключении баз данных.
1.2	Получить практические навыки создания сложных приложений, используя элементы объектно-ориентированного программирования.
1.3	Сформировать умение самостоятельно разрабатывать приложения.

2	Создание программы для подбора кандидатов на вакантные должности, имеющиеся в банке данных.
При обращении к данной программе перед пользователем должны появиться окна, соответствующие полям базы данных, в которые он вносит свои данные для организации поиска специалиста. Данные вносятся в окна формы соответствующие полям таблицы: возраст, пол и т.д., количество полей укажите сами, либо выбирает эти параметры из предложенного списка.
Можно выполнить иначе: пользователю предъявляется одно окно, где он вводит ответы на вопросы или делает выбор из списка ответов (вопросы могут быть следующие: Какая вакансия вас интересует? Какого возраста специалист вам необходим? Указать пол специалиста и т.д.)
В результате работы пользователь должен получить список отобранных по указанным им параметрам специалистов с дополнительной информацией и контактными сведениями.
Причем пользователь не обязан заполнять все поля.

2.1 Требование к приложению
Приложение должно обеспечивать:
хранение данных о кандидатах и вакансиях в структурированном виде;
добавление, редактирование и удаление записей;
многокритериальный поиск кандидатов по параметрам вакансии;
наглядный вывод результатов.

2.2 Проектирование базы данных
Основные таблицы:
	таблица candidates (кандидаты);
	таблица vacancies (вакансии);
	таблица responses (отклики).



Связи:
- candidates.id → responses.candidate_id — 1:М (один кандидат может иметь несколько откликов на разные вакансии)
- vacancies.id → responses.vacancy_id — 1:М (одна вакансия может получить несколько откликов от разных кандидатов)
Вместе эти две связи 1:М через таблицу responses образуют М:М (многие ко многим) между кандидатами и вакансиями.

Атрибуты представлены в таблицах 1,2,3.
Таблица 1 
Атрибуты таблицы candidates (кандидаты)
Поле	Тип	Описание
id	SERIAL PK	уникальный идентификатор
full_name	VARCHAR(150)	ФИО кандидата
age	INTEGER	возраст (18-70)
gender	VARCHAR(10)	пол (мужской/женский)
phone	VARCHAR(20)	контактный телефон
email	VARCHAR(100)	электронная почта
education	VARCHAR(50)	уровень образования
experience_years	INTEGER	опыт работы (лет))
specialization	VARCHAR(100)	специализация
skills	TEXT	навыки
city	VARCHAR(50)	город
salary_expectation	INTEGER	ожидаемая зарплата (руб)
status	VARCHAR(20)	статус (Активен/В резерве/...)
staff_find	BOOLEAN	находка персонала (да/нет)
rating	INTEGER	рейтинг (1-5)
created_at	TIMESTAMP	дата добавления

Таблица 2 
Атрибуты таблицы vacancies (вакансии)
Поле	Тип	Описание
id	SERIAL PK	уникальный идентификатор
title	VARCHAR(150)	название должности
department	VARCHAR(100)	отдел
min_age	INTEGER	минимальный возраст
max_age	INTEGER	максимальный возраст
gender_req	VARCHAR(10)	требуемый пол (NULL = любой)
education_req	VARCHAR(50)	требуемое образование
min_experience	INTEGER	минимальный опыт (лет) 
specialization_req	VARCHAR(100)	требуемая специализация
required_skills	TEXT	требуемые навыки
salary_min	INTEGER	зарплата от
salary_max	INTEGER	зарплата до
city	VARCHAR(50)	город
description	TEXT	описание вакансии
is_active	BOOLEAN	активна ли вакансия
created_at	TIMESTAMP	дата создания
Таблица 3 
Атрибуты таблицы responses (отклики)
id	SERIAL PK	уникальный идентификатор
candidate_id	INTEGER FK	ссылка на candidates.id
vacancy_id	INTEGER FK	ссылка на vacancies.id
response_date	TIMESTAMP	дата отклика
status	VARCHAR(20)	статус (Рассматривается/Приглашён/Отказ/Принят)

2.3 ER-диаграмма 
Построил ER-диаграмму (нотация Чена) (рисунок 2.1).
 
Рисунок 2.1 - ER-диаграмму (нотация Чена)
2.4 Создание базы данных
Создал базу данных hr_candidates (рисунок 2.2).
 
Рисунок 2.2 – Создание базы данных hr_candidates


Создал таблицу кандидаты (candidates) (рисунок 2.3).
 
Рисунок 2.3 – SQL-запрос для создания таблицы кандидаты (candidates)

Создал таблицу вакансии (vacancies) (рисунок 2.4)
 
Рисунок 2.4 – SQL-запрос для создания таблицы вакансии (vacancies)
Создал таблицу отклики (responses) — связь кандидатов и вакансий (рисунок 2.5).
 
Рисунок 2.5 – SQL-запрос для создания таблицы отклики (responses)
2.5 ER-диаграмма из разработанной базы данных
Полученная ER-диаграмма из БД представлена на рисунке 2.6
 
Рисунок 2.6 – ER-диаграмма из БД


2.6 Заполнение таблиц данными
Заполнил данными таблицу кандидаты (candidates) (рисунок 2.7-2.8).
 
Рисунок 2.7 – SQL-запрос для заполнения данными таблицы кандидаты (candidates)

 
Рисунок 2.8 – Заполненная таблица кандидаты (candidates)
Заполнил данными таблицу вакансии (vacancies) (рисунок 2.9-2.10).
 
Рисунок 2.9 – SQL-запрос для заполнения данными таблицы вакансии (vacancies)

 
Рисунок 2.10 – Заполненная таблица вакансии (vacancies)
Заполнил данными таблицу отклики (responses) (рисунок 2.11-2.12).
 
Рисунок 2.11 – SQL-запрос для заполнения данными таблицы отклики (responses)
 
Рисунок 2.12 – Заполненная таблица отклики (responses)
2.7 Создание полезных запросов
1) Создал запрос «Все кандидаты со статусом Активен» (рисунок 2.13).
 
Рисунок 2.13 – Реализация запроса «Все кандидаты со статусом Активен»
2) Создал запрос «Кандидаты — находка персонала» (рисунок 2.14).

Рисунок 2.14 – Реализация запроса «Кандидаты — находка персонала»  
3)	Создал запрос «Подбор кандидатов под вакансию «Программист Python» (id=1)» (рисунок 2.15).
 
Рисунок 2.15 – Реализация запроса «Подбор кандидатов под вакансию «Программист Python» (id=1)»
4)	Создал запрос «Количество откликов на каждую вакансию» (рисунок 2.16).
 
Рисунок 2.16 – Реализация запроса «Количество откликов на каждую вакансию»

2.8 Создание таблицу для системы уведомлений пользователей
Создал таблицу notifications для системы уведомлений пользователей. Когда в системе будет происходить какое-то действие (добавлен кандидат, новый отклик, кандидат отмечен как «находка»), система автоматически создаст уведомление и запишет его в таблицу notifications. Пользователь увидит красный бейдж с числом непрочитанных уведомлений в шапке сайта.
Атрибуты таблицы notifications представлены в таблице 4.

Таблица 4
Атрибуты таблицы notifications
Поле	Тип	Описание
id 	SERIAL PK 	Идентификатор 
username 	VARCHAR(50) 	Имя роли PostgreSQL 
message 	TEXT 	Текст уведомления 
is_read 	BOOLEAN 	Прочитано 
created_at	TIMESTAMP	Дата создания

Таблица notifications представлена на рисунке 2.17.
 
Рисунок 2.17 -SQL-запрос для создания таблицы notifications

Заполнил таблицу notifications тестовыми данными (рисунки 2.18-2.19).
 
Рисунок 2.18 -SQL-запрос для заполнения таблицы notifications тестовыми данными

 
Рисунок 2.19 - Заполненная таблица notifications 

2.9 Создание ролей и прав доступа
Создал 3 роли: Администратор, HR-менеджер и Гость (рисунок 2.19).
 
Рисунок 2.19 -SQL-запрос для добавления ролей 

Назначение прав представлено в таблице 5.
Таблица 5
Назначение прав
Роль	Логин	Пароль	Права
role_admin	role_admin	admin123	Полный доступ ко всем таблицам (SELECT, INSERT, UPDATE, DELETE)
role_manager	role_manager	manager123	Кандидаты: SELECT, INSERT, UPDATE (без DELETE). 
Вакансии: только SELECT. 
Отклики: SELECT, INSERT, UPDATE.
Уведомления: SELECT, UPDATE
role_guest	role_guest	guest123	Только SELECT на candidates, vacancies, notifications

SQL-запросы для назначения прав представлены на рисунках 2.20, 2.21, 2.22.
 
Рисунок 2.20 -SQL-запрос для назначения прав для роли Администратор
 
Рисунок 2.21 - SQL-запрос для назначения прав для роли HR-менеджер
 
Рисунок 2.22 - SQL-запрос для назначения прав для роли Гость

Проверил список созданных ролей (рисунок 2.23).
 
Рисунок 2.23 – SQL-запрос для проверки списка созданных ролей
Проверил права конкретной роли (рисунки 2.24-2.26).
 
Рисунок 2.24 – Проверка прав HR-менеджера

 
Рисунок 2.25 –Проверка прав администратора
 
Рисунок 2.26 – Проверка прав гостя










 
3. Веб‑интерфейс (web‑приложение на Flask + HTML)

3.1 Описание технология: Python, Flask, HTML.
Для бэкенд составляющей выбрал язык программирования Python, так как это высокоуровневый, интерпретируемый, объектно-ориентированный язык программирования с динамической типизацией. 
 Веб-фреймворк: Flask. Flask — это микрофреймворк для веб-разработки на Python. Он предоставляет базовые инструменты для создания веб-приложений, но при этом остается гибким и позволяет разработчикам выбирать дополнительные библиотеки и компоненты по своему усмотрению. Flask идеально подходит для небольших и средних проектов, а также для создания API.

3.2 Структура проекта

Структура проекта представлена в таблице 6.
Таблица 6
Структура проекта
папка	файл	Назначение
web/	app.py	Flask-сервер
	requirements.txt	flask, psycopg2-binary
	database_schema.sql	создание БД и таблиц
	roles_pgadmin.sql	роли PostgreSQL и права
templates/	base.html	общий каркас
	login.html	страница входа
	index.html	поиск кандидатов
	candidates.html	список кандидатов
	candidate_form.html	форма кандидата
	vacancies.html	список вакансий
	vacancy_form.html	форма вакансии
	responses.html	отклики
	notifications.html	уведомления

3.3 Создал файл requirements.txt (рисунок 3.1) для установки списка библиотек.
 
Рисунок 3.1 - файл requirements.txt

3.4 Создал файл app.ry.

Основные пункты файла app.ry содержат:
1)	Зависимости (рисунок 3.2).
 
Рисунок 3.2 - Зависимости (фрагмент файла app.ry)

2)	Конфигурация подключения (подключение к БД, имя роли PostgreSQL, справочники) (рисунок 3.3). 
 
Рисунок 3.3 - Конфигурация подключения (фрагмент файла app.ry)

3)	Работа с БД (рисунок 3.4). 
 
Рисунок 3.4 - Работа с БД (фрагмент файла app.ry) 
4)	Контроль доступа (рисунок 3.5).
 
Рисунок 3.5 – Контроль доступа (фрагмент файла app.ry) 

5)	Авторизация (через роли PostgreSQL) (рисунок 3.6).
 
Рисунок 3.6 – Авторизация (фрагмент файла app.ry) 

6)	Поиск кандидатов (все роли) (рисунок 3.7).
 
Рисунок 3.7 – Поиск кандидатов (фрагмент файла app.ry) 


7)	Кандидаты (CRUD) (рисунок 3.8).
 
Рисунок 3.8 –Кандидаты (фрагмент файла app.ry) 
8)	Вакансии (CRUD) (рисунок 3.9).
 
Рисунок 3.9 – Вакансии (фрагмент файла app.ry) 

9)	Отклики (рисунок 3.10).
 
Рисунок 3.10 – Отклики (фрагмент файла app.ry) 

10)	Уведомления (рисунок 3.11).
 
Рисунок 3.11 – Уведомления (фрагмент файла app.ry) 

11)	Запуск (рисунок 3.12).
 
Рисунок 3.12 –Запуск (фрагмент файла app.ry) 

Полный листинг файла app.ry представлен в Приложение А.

3.5 Создал папку templates. В ней создал файлы HTML:
1)	base.html (рисунок 3.13) - общий каркас всех страниц: меню навигации, бейдж уведомлений, подключение стилей. Остальные страницы наследуются от него.
 
Рисунок 3.13 – Файл base.html
2)	login.html (рисунок 3.14) - форма входа: поля логин и пароль, отправка данных на сервер для проверки роли PostgreSQL.
 
Рисунок 3.14 – Файл login.html

3)	index.html (рисунок 3.15) - главная страница поиска кандидатов с фильтрами по нескольким критериям и подсветкой «Находок персонала».
 
Рисунок 3.15 – Файл index.html (часть 1)
 
Рисунок 3.15 – Файл index.html (часть 2)
4)	candidates.html (рисунок 3.16) - список всех кандидатов в виде таблицы с кнопками редактирования и удаления.
 
Рисунок 3.16 – Файл candidates.html

5)	candidate_form.html (рисунок 3.17) - форма добавления и редактирования кандидата: ФИО, навыки, опыт, рейтинг, отметка «Находка».
 
Рисунок 3.17 – Файл candidate_form.html (часть 1)


 
Рисунок 3.17 – Файл candidate_form.html (часть 2)

6)	vacancies.html (рисунок 3.18) - список вакансий с кнопками добавления, редактирования и удаления.
 
Рисунок 3.18 – Файл vacancies.html

7)	vacancy_form.html (рисунок 3.19) - форма добавления и редактирования вакансии: должность, требования, зарплата.

 
Рисунок 3.19 – Файл vacancy_form.html



8)	responses.html (рисунок 3.20) - таблица откликов кандидатов на вакансии с указанием статуса.

 
Рисунок 3.20– Файл responses.html

9)	notifications.html (рисунок 3.21) - список уведомлений пользователя с отметкой прочитанных и непрочитанных.
 
Рисунок 3.21 – Файл notifications.html


























 
4. Макеты интерфейсов

4.1 Страница входа представлена на рисунке 4.1.

Пользователь вводит логин и пароль роли PostgreSQL. Приложение пытается подключиться к БД.

 
Рисунок 4.1 - Страница входа

4.2. Страница поиска кандидатов (роль: admin) представлена на рисунке 4.2. Слева размещена форма с 10+ параметрами. Справа находится таблица результатов. В шапке — имя, роль, бейдж
 
Рисунок 4.2 – Поиск кандидатов