ВКР (дипломная)Информационные системыГод: 2025МТИ: Московский технологический институт
👁 21💼 0

Готовая ВКР: Информационная система подбора персонала

Загружена: 16.02.2026 05:31

Проект по разработке ИС 'Подбор персонала' для ООО 'ШСУ'. Описаны анализ процессов найма, ER‑модель и нормализованная БД, архитектура на Python/FastAPI и интерфейс Streamlit. Практическая ценность — готовый прототип и набор документов для внедрения.

Содержание

Содержание
1. Анализ предметной области для разработки ИС (БД)	10
1.1 Характеристика предприятия и анализ текущей ситуации	10
1.1.1 Общая информация об ООО ШСУ	10
1.1.2 Структура отдела подбора персонала	12
1.1.3 Описание текущих процессов найма и их проблем	14
1.2 Обоснование необходимости автоматизации	16
1.2.1 Выделение типовых задач подбора персонала	16
1.2.2 Выявление проблем при ручной обработке заявок	18
1.3 Анализ существующих решений и подходов	23
1.3.1 Обзор популярных ИС подбора персонала	23
1.3.2 Сравнение функциональности и интерфейсов	25
1.3.3 Выбор направлений проектирования ИС	27
1.4 Требования к создаваемой системе	30
1.4.1 Пользовательские роли	30
1.4.2 Ожидаемые функции и выходные документы	32
Выводы по разделу 1	34
2. РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИС (БД)	35
2.1 Проектирование базы данных	35
2.1.1 Инфологическая модель (ER-диаграмма)	35
2.1.2 Переход к логической и физической модели	37
2.1.3 Нормализация таблиц	39
2.2 Архитектура приложения	42
2.2.1 Выбор стеков технологий	42
2.2.2 Логика клиент-серверного взаимодействия	44
2.2.3 Роли и авторизация пользователей	46
2.3 Проектирование интерфейса	49
2.3.1 Ввод и редактирование резюме и вакансий	49
2.3.2 Интерфейс фильтрации и подбора.	51
2.3.3 Отчёты и результаты подбора персонала	53
2.4 Безопасность системы	55
2.4.1 Защита данных кандидатов	55
2.4.2 Ограничение доступа по ролям	57
Выводы по разделу 2	59
3. РЕАЛИЗАЦИЯ И ТЕСТИРОВАНИЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИС (БД)	60
3.1 Реализация основных модулей	60
3.1.1 Разработка backend-части	60
3.1.2 Реализация frontend	63
3.1.3 Связь с базой данных и миграции	65
3.2 Тестирование системы	67
3.2.1 Проведение функционального тестирования	67
3.2.2 Интеграционные тесты и отладка	69
3.3 Документация и демонстрация	73
3.3.1 Скриншоты и описание модулей	73
3.3.2 Руководство пользователя	77
3.4 Оценка экономической эффективности проекта	80
3.4.1 Расчёт затрат на разработку	80
3.4.2 Потенциальные выгоды от внедрения	82
Выводы по разделу 3	84
Заключение	85
Список используемой литературы	87
Приложение А. Конфигурация и подключение к БД	89
Приложение Б. Модели данных	91
Приложение В. Схемы валидации (Pydantic) — выдержки	96
Приложение Г. Безопасность и доступ	99

Введение

В условиях стремительно развивающегося рынка труда и цифровой трансформации бизнеса эффективный подбор персонала становится одним из ключевых факторов конкурентоспособности предприятия. Современные организации, включая ООО «ШСУ», сталкиваются с необходимостью оперативного и качественного закрытия вакансий, что невозможно без автоматизации процессов подбора и управления кадрами. Рост объемов информации, ограниченность времени на обработку заявок, а также высокие требования к качеству и скорости найма специалистов обуславливают необходимость создания специализированных информационных систем (ИС), способных поддерживать кадровые службы на всех этапах найма. [1]
В то время как традиционные методы подбора персонала, основанные на бумажном документообороте и ручной обработке резюме, уже не справляются с поставленными задачами, автоматизированные решения позволяют оптимизировать процессы подбора, снизить количество ошибок и ускорить принятие решений [2]. Информационная система, ориентированная на задачи найма, позволяет не только структурировать данные о кандидатах, но и внедрить алгоритмы поиска, ранжирования и аналитики, что значительно повышает эффективность деятельности отдела кадров.
ООО «ШСУ» представляет собой предприятие, деятельность которого связана с реализацией крупных инфраструктурных и инженерных проектов. В условиях интенсивного роста компании, расширения штата и увеличения количества заявок на подбор специалистов кадровая служба сталкивается с существенной нагрузкой. Отсутствие централизованной информационной системы приводит к дублированию задач, задержкам в обработке заявок, недостаточной прозрачности и слабой аналитической поддержке принимаемых решений. Разработка специализированной ИС «Подбор персонала» призвана устранить эти проблемы.
Целью данной выпускной квалификационной работы является разработка информационной системы для автоматизации процессов подбора персонала на предприятии ООО «ШСУ», которая обеспечит централизованный учет заявок, автоматизацию процессов подбора, упрощение взаимодействия между отделами и предоставление актуальной отчетности.
В соответствии с данной целью были сформулированы следующие задачи:
проанализировать структуру и специфику кадровой работы на предприятии;
выявить проблемные аспекты текущего процесса подбора персонала;
провести обзор существующих программных решений в этой области;
разработать архитектуру и функциональную модель ИС;
реализовать прототип системы с учетом требований пользователей;
протестировать работоспособность ИС и оценить ее эффективность.
В работе предполагается использовать методы системного анализа, объектно-ориентированного проектирования, моделирования бизнес-процессов и прототипирования пользовательских интерфейсов. В качестве инструментальных средств планируется применение языка программирования Python, СУБД PostgreSQL и фреймворков для построения веб-интерфейса (например, Streamlit или FastAPI) [4].
Структура ВКР включает три главы. В первой главе проводится анализ предметной области, описывается текущая ситуация и обосновывается необходимость автоматизации. Во второй главе раскрывается процесс проектирования информационной системы, включая моделирование базы данных и интерфейсов. Третья глава посвящена реализации, тестированию и оценке эффективности разработанного программного продукта.
Актуальность выбранной темы определяется острой потребностью современных предприятий в высокоэффективных инструментах управления персоналом, особенно в условиях цифровизации экономики. Разработка и внедрение такой системы для ООО «ШСУ» позволит не только оптимизировать процессы подбора, но и заложить основу для последующего масштабирования и интеграции с другими кадровыми и корпоративными ИС [1].
Объектом исследования в данной работе является процесс подбора персонала на предприятии ООО «ШСУ».
Предметом исследования выступают информационные технологии и методы автоматизации, применяемые при разработке и внедрении информационной системы для управления процессами найма сотрудников.

Заключение

В ходе выполнения выпускной квалификационной работы была разработана и внедрена информационная система «Подбор персонала» для ООО «ШСУ», предназначенная для автоматизации процесса рекрутинга и управления кадровыми данными.
На этапе анализа предметной области был изучен текущий порядок подбора сотрудников, выявлены основные проблемы — высокая трудоёмкость обработки заявок, дублирование информации, недостаточная прозрачность этапов подбора. На основании выявленных недостатков сформулированы функциональные и нефункциональные требования к системе, а также определены ключевые роли пользователей.
В процессе проектирования была разработана архитектура системы, включающая backend-часть на основе FastAPI, frontend-интерфейс с использованием библиотеки Streamlit, а также централизованную базу данных SQLite. Были реализованы модули для работы с вакансиями, резюме, заявками кандидатов, проведения собеседований, хранения документов и управления пользователями. Система поддерживает разграничение прав доступа в зависимости от роли и обеспечивает безопасность авторизации и хранения данных.
Реализация проекта сопровождалась тестированием, включающим как функциональные проверки отдельных модулей, так и интеграционные тесты для оценки совместной работы компонентов. По итогам тестирования были подтверждены корректность функционирования системы, стабильность её работы и удобство интерфейса.
Экономическая оценка проекта показала высокую эффективность внедрения. Использование системы позволяет сократить время закрытия вакансий, снизить затраты на обработку и хранение информации, а также повысить прозрачность процессов. Ожидаемая окупаемость проекта составляет менее одного года, что делает его целесообразным для внедрения в производственную деятельность предприятия.
Поставленные в работе цели и задачи полностью достигнуты. Разработанная информационная система готова к эксплуатации и способна существенно повысить эффективность работы отдела кадров ООО «ШСУ», обеспечив автоматизацию ключевых процессов и повышение качества управления подбором персонала. В приложениях указаны основные модули для работы сервиса, полный проект предоставлен в отдельном виде.
Список используемой литературы
Аршинский Л. В., Жукова М. С. Интеллектуальные информационные системы и технологии. — Иркутск: ИрГУПС, 2023. — 128 с.
Магомедов М. Н. Информационные системы и технологии. — СПбГИКиТ, 2020. — 89 с.
ГОСТ 34.601-90. Автоматизированные системы. Стадии создания. — М.: Госстандарт, 1990. https://www.prj-exp.ru/gost/gost_34-601-90.php
Бутырский Е. Ю., Цехановский В. В., Жукова Н. А. и др. Машинное обучение: учебник. — Москва: Директ-Медиа, 2023. — 368 с.
Huntflow. Официальный сайт. https://huntflow.ru
CleverStaff. Обзор возможностей. https://cleverstaff.net/ru/
Федеральный закон от 27.07.2006 № 152-ФЗ «О персональных данных». https://www.consultant.ru/document/cons_doc_LAW_61801/
ПОСЛЕДНИЙ ЛИСТ ВЫПУСКНОЙ КВАЛИФИКАЦИОННОЙ РАБОТЫ
Выпускная квалификационная работа выполнена мной совершенно самостоятельно. Все использованные в работе материалы и концепции из опубликованной научной литературы и других источников имеют ссылки на них.
«13» августа 2025 г.
________________________/ Попрукайло Роман Борисович
(подпись)		       (Ф.И.О.)
Приложение А. Конфигурация и подключение к БД
from pathlib import Path
from typing import ClassVar
from pydantic_settings import BaseSettings, SettingsConfigDict
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, DeclarativeBase
class Settings(BaseSettings):
BASE_DIR: ClassVar[Path] = Path(__file__).resolve().parent.parent
DB_PATH: ClassVar[Path] = BASE_DIR / "ir.db"
DATABASE_URL: str = f"sqlite:///{DB_PATH}"
SECRET_KEY: str = "dev_secret"
ACCESS_TOKEN_EXPIRE_MINUTES: int = 60
ALGORITHM: str = "HS256"
FILES_DIR: str = str(BASE_DIR / "files")
model_config = SettingsConfigDict(
env_file=str(BASE_DIR / ".env"),
env_file_encoding="utf-8"
)
settings = Settings()
print("DB фактический путь:", settings.DATABASE_URL)
engine = create_engine(settings.DATABASE_URL, pool_pre_ping=True, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
class Base(DeclarativeBase):
pass
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
Приложение Б. Модели данных
from sqlalchemy import (
String, Text, Integer, Date, DateTime, Enum, ForeignKey, Boolean
)
from sqlalchemy.orm import Mapped, mapped_column, relationship
from datetime import datetime
import enum
from .database import Base
class RoleEnum(str, enum.Enum):
admin = "admin"
recruiter = "recruiter"
manager = "manager"
hr = "hr"
viewer = "viewer"
class VacancyStatusEnum(str, enum.Enum):
open = "open"
in_progress = "in_progress"
closed = "closed"
class ApplicationStatusEnum(str, enum.Enum):
applied = "applied"
screening = "screening"
interview = "interview"
offer = "offer"
hired = "hired"
rejected = "rejected"
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
full_name: Mapped[str] = mapped_column(String(150))
email: Mapped[str] = mapped_column(String(255), unique=True, index=True)
password_hash: Mapped[str] = mapped_column(String(255))
role: Mapped[RoleEnum] = mapped_column(Enum(RoleEnum), default=RoleEnum.recruiter)
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
created_vacancies = relationship("Vacancy", back_populates="created_by")
class Department(Base):
__tablename__ = "departments"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(100), unique=True)
vacancies = relationship("Vacancy", back_populates="department")
class Vacancy(Base):
__tablename__ = "vacancies"
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(200))
description: Mapped[str | None] = mapped_column(Text())
status: Mapped[VacancyStatusEnum] = mapped_column(
Enum(VacancyStatusEnum), default=VacancyStatusEnum.open
)
department_id: Mapped[int | None] = mapped_column(ForeignKey("departments.id"))
created_by_id: Mapped[int | None] = mapped_column(ForeignKey("users.id"))
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
created_by = relationship("User", back_populates="created_vacancies")
department = relationship("Department", back_populates="vacancies")
applications = relationship("CandidateApplication", back_populates="vacancy")
class Request(Base):
__tablename__ = "requests"
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
position: Mapped[str] = mapped_column(String(200))
description: Mapped[str | None] = mapped_column(Text())
status: Mapped[str] = mapped_column(String(50), default="new")
submitted_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
user = relationship("User")
class Resume(Base):
__tablename__ = "resumes"
id: Mapped[int] = mapped_column(primary_key=True)
full_name: Mapped[str] = mapped_column(String(150))
birth_date: Mapped[datetime | None] = mapped_column(Date)
education: Mapped[str | None] = mapped_column(Text())
experience: Mapped[str | None] = mapped_column(Text())
contact_email: Mapped[str | None] = mapped_column(String(255))
contact_phone: Mapped[str | None] = mapped_column(String(50))
applications = relationship("CandidateApplication", back_populates="resume")
class CandidateApplication(Base):
__tablename__ = "candidate_applications"
id: Mapped[int] = mapped_column(primary_key=True)
resume_id: Mapped[int] = mapped_column(ForeignKey("resumes.id"))
vacancy_id: Mapped[int] = mapped_column(ForeignKey("vacancies.id"))
status: Mapped[ApplicationStatusEnum] = mapped_column(
Enum(ApplicationStatusEnum), default=ApplicationStatusEnum.applied
)
applied_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
resume = relationship("Resume", back_populates="applications")
vacancy = relationship("Vacancy", back_populates="applications")
interviews = relationship("Interview", back_populates="application")
class Interview(Base):
__tablename__ = "interviews"
id: Mapped[int] = mapped_column(primary_key=True)
candidate_application_id: Mapped[int] = mapped_column(ForeignKey("candidate_applications.id"))
interview_date: Mapped[datetime] = mapped_column(DateTime)
interviewer_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
result: Mapped[str | None] = mapped_column(Text())
application = relationship("CandidateApplication", back_populates="interviews")
interviewer = relationship("User")
class Document(Base):
__tablename__ = "documents"
id: Mapped[int] = mapped_column(primary_key=True)
file_name: Mapped[str] = mapped_column(String(255))
file_type: Mapped[str | None] = mapped_column(String(50))
related_resume_id: Mapped[int | None] = mapped_column(ForeignKey("resumes.id"))
related_vacancy_id: Mapped[int | None] = mapped_column(ForeignKey("vacancies.id"))
uploaded_by: Mapped[int | None] = mapped_column(ForeignKey("users.id"))
uploaded_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
Приложение В. Схемы валидации (Pydantic) — выдержки
from pydantic import BaseModel, EmailStr, Field
from datetime import datetime, date
from typing import Optional, List
from .models import RoleEnum, VacancyStatusEnum, ApplicationStatusEnum
class Token(BaseModel):
access_token: str
token_type: str = "bearer"
class UserBase(BaseModel):
full_name: str
email: EmailStr
role: RoleEnum
is_active: bool = True
class UserCreate(BaseModel):
full_name: str
email: EmailStr
password: str = Field(min_length=6)
role: RoleEnum = RoleEnum.recruiter
class UserOut(UserBase):
id: int
created_at: datetime
class Config:
from_attributes = True
class LoginIn(BaseModel):
email: EmailStr
password: str
class DepartmentOut(BaseModel):
id: int
name: str
class Config:
from_attributes = True
class VacancyIn(BaseModel):
title: str
description: Optional[str] = None
status: VacancyStatusEnum = VacancyStatusEnum.open
department_id: Optional[int] = None
class VacancyOut(VacancyIn):
id: int
created_by_id: Optional[int]
created_at: datetime
class Config:
from_attributes = True
class ResumeIn(BaseModel):
full_name: str
birth_date: Optional[date] = None
education: Optional[str] = None
experience: Optional[str] = None
contact_email: Optional[EmailStr] = None
contact_phone: Optional[str] = None
class ResumeOut(ResumeIn):
id: int
class Config:
from_attributes = True
class ApplicationIn(BaseModel):
resume_id: int
vacancy_id: int
status: ApplicationStatusEnum = ApplicationStatusEnum.applied
class ApplicationOut(ApplicationIn):
id: int
applied_at: datetime
class Config:
from_attributes = True
class InterviewIn(BaseModel):
candidate_application_id: int
interview_date: datetime
interviewer_id: int
result: Optional[str] = None
class InterviewOut(InterviewIn):
id: int
class Config:
from_attributes = True
class RequestIn(BaseModel):
position: str
description: Optional[str] = None
class RequestOut(RequestIn):
id: int
user_id: int
status: str
submitted_at: datetime
class Config:
from_attributes = True
Приложение Г. Безопасность и доступ
from datetime import datetime, timedelta, timezone
from jose import jwt
from passlib.context import CryptContext
from .database import settings
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def hash_password(password: str) -> str:
return pwd_context.hash(password)
def verify_password(plain: str, hashed: str) -> bool:
return pwd_context.verify(plain, hashed)
def create_access_token(data: dict, expires_minutes: int | None = None) -> str:
to_encode = data.copy()
if "sub" in to_encode:
to_encode["sub"] = str(to_encode["sub"])
expire = datetime.now(timezone.utc) + timedelta(
minutes=expires_minutes or settings.ACCESS_TOKEN_EXPIRE_MINUTES
)
to_encode.update({"exp": expire})
return jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM)

Список литературы

Приложение.
Дата выдачи задания __.__.202__ г.                    Задание принял (дата) __.__.202__  г.
Подпись руководителя ____________       Подпись обучающегося_

Подробное описание

📘 О чем эта работа

Выпускная квалификационная работа посвящена разработке информационной системы 'Подбор персонала' для предприятия ООО 'ШСУ'. Объект исследования — процесс найма сотрудников; предмет — методы и ИТ-инструменты автоматизации этого процесса. В работе проанализированы текущие бизнес-процессы, сформулированы требования и реализован прототип системы с базой данных и веб‑интерфейсом.

📚 Что внутри

В работе содержится полный цикл проектирования и реализации ИС:

  • Аналитическая часть: характеристика ООО 'ШСУ', схема отдела подбора, выявленные проблемы ручного документооборота и цели автоматизации.
  • Моделирование данных: инфологическая ER‑диаграмма, логическая и физическая модели для PostgreSQL, нормализация таблиц до 3НФ (users, vacancies, resumes, candidate_applications, interviews, documents, departments).
  • Архитектура и стек: сервер на Python 3.11 с FastAPI, ORM SQLAlchemy и миграции Alembic, СУБД PostgreSQL, MVP‑интерфейс на Streamlit, запуск через Uvicorn и опциональная контейнеризация Docker.
  • Реализация модулей: backend (API эндпоинты для заявок, вакансий, карточек кандидатов), frontend (формы ввода резюме, фильтрация вакансий, планировщик собеседований), интеграция импорта резюме с внешних площадок.
  • Безопасность и права: ролевая модель (администратор, рекрутер, руководитель, кадровик, просмотр), журналирование действий, реализация требований ФЗ‑152 по защите персональных данных.
  • Тестирование и документация: функциональные и интеграционные тесты (pytest), скриншоты интерфейсов, руководство пользователя и пример отчётов KPI (время закрытия вакансии, конверсия этапов).
  • Экономическая оценка: расчёт затрат на разработку и ожидаемые выгоды за счёт сокращения времени подбора и снижения ошибок при оформлении.

📊 Для кого подходит

Проект пригоден для студентов IT и HR‑специальностей, инженеров по автоматизации бизнес‑процессов, сотрудников кадровых служб и разработчиков корпоративных решений. Может использоваться как основа для дипломной работы, практического внедрения или дальнейшей доработки под корпоративную систему 1С/ERP.

✨ Особенности

Конкретные преимущества: готовая ER‑модель и SQL‑схема для PostgreSQL, примеры миграций Alembic, шаблоны офферов и соглашений на обработку персональных данных, реализованная воронка найма с этапами (отклик → интервью → согласование → оффер → выход). Включены примеры отчётов и сценарии интеграции с внешними job‑порталами. Код организован по модулям, есть примеры запросов и тестовые данные для быстрой загрузки прототипа.

❓ Частые вопросы

Подойдет ли для моего ВУЗа?
Структура универсальна и соответствует требованиям ВКР: введение, главы с аналитикой и проектированием, реализация, тестирование, заключение и приложения.

Можно адаптировать?
Да. Архитектура модульная — легко заменить Streamlit на React/Vue, расширить API, интегрировать с 1С:ЗУП или корпоративной СRM.