You are on page 1of 19

о МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ


“КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ
імені ІГОРЯ СІКОРСЬКОГО"

Факультет прикладної математики


Кафедра програмного забезпечення комп’ютерних систем

Лабораторна робота №3
з дисципліни “Компоненти програмної інженерії”
тема “Проектування архітектури ПЗ”

Виконали
студенти 3 курсу
групи КП-61
Казимиров Данило
Карпенко Олена

Тема: Єдиний державний реєстр осіб, які вчинили корупційні


правопорушення

Київ 2019
Мета роботи:
Уточнення даних, інтерфейсів, алгоритму функціонування,
архітектури програми. Розроблення технічного проекту, яке охоплює
проектування системи, що включає проектування архітектури системи і
детальне проектування.
Завдання на лабораторну роботу
Проаналізувати та спроектувати архітектуру програмного забезпечення
для реалізації Національного реєстру ОВКП. Створити документації із
результатами проектування. Спроектувати та створити реляційну БД
Національного реєстру ОВКП.
Структура системи
Структурно система складається із ізольованих один від одного
рівнів абстракцій, вона побудована за паттерном багаторівневневої
архітектури. Їх можно представити, як ієрархічну структуру (див рис. 1),
кожна частина якої взаємодії лише із рівнем, що знаходиться нижче за
ієрархією. Засобом спілкування рівнів слугує прикладний програмний
інтерфейс (API) яке надає відповідний рівень.

рис 1. Багаторівнева архітектура системи Реєстру ОВКП

Опис компонентів системи Реєстру ОВКП


1. Користувацький інтерфейс Реєстру ОВКП
Представляє собою веб-додаток, який може бути відкритий у веб-
браузері, містить сторінки, необхідні для реалізації функціональних вимог,
перелічених у документації до лабораторної роботи 2, надає можливість
користувачу взаємодіяти із системою Реєстру ОВКП, та напряму взаємодіє
із рівнем Бізнес логіки.
2. Бізнес логіка Реєстру ОВКП
Представляє собою веб-сервер, який доступний за адресою, відомою
Користувацькому інтерфейсу. Структурно складається із наступних
програмних модулів, які в свою чергу складаються із власних підмодулей:
● Модуль абстракції над БД:
○ Моделі сутностей користувачів системи (Користувач,
Адміністратор та Реєстратор Реєстру ОВКП)
○ Модуль запитів до БД
● Модуль поштових повідомлень
○ Функціональний модуль відправки повідомлень за протоколом
SMTP
● Модуль авторизації:
○ Функціональний модуль авторизації Реєстраторів та
Адміністраторів системи
○ Функціональний модуль відновлення паролю до системи через
лист на електронну адресу, прив’язану до профілю
користувача, який намагається авторизуватися
○ Алгоритмічний модуль підтримки хешування та генерації
ключів доступу до системи авторизованими користувачами
● Модуль для роботи із записами про ОВКП у Реєстрі ОВКП
○ Функціональний модуль створення нового запису про ОВКП
○ Функціональний модуль редагування існуючого запису про
ОВКП
○ Функціональний модуль деактивації існуючого запису про
ОВКП
○ Функціональний модуль пошуку записів про ОВКП у Реєстрі
за запитом користувача
● Модуль для роботи із логами про діяльність Реєстраторів:
○ Функціональний модуль для пошуку та перегляду логів про
діяльність обраного Реєстратора
○ Функціональний модуль для пошуку та перегляду логів про
діяльність реєстраторів за вказаний період
○ Функціональний модуль для створення нового запису у БД
логів про діяльність Реєстратора
● Модуль роботи із профілями Реєстраторів та Адміністраторів
○ Функціональний модуль створення записів про нових
Реєстраторів та Адміністраторів системи
○ Функціональний модуль для отримання відомостей про
обраного Реєстратора чи Адміністратора
○ Функціональний модуль для деактивації профілю реєстратора
чи Адміністратора
○ Функціональний модуль пошуку відомостей про реєстратора
чи адміністратора за запитом
3. БД реєстру ОВКП
Являє собою сервер СКБД. Зберігає дані про користувачів
(Адміністраторів, та Реєстраторів), про ОВКП та логи змін, внесених до
записів про ОВКП Реєстраторами.
Структура БД

рис 2. ER-модель БД
Таблиці:

- users - зберігає інформацію про акаунти Адміністраторів та


Реєстраторів (поле role визначає роль користувача) Реєстру ОВКП.
- pccos - зберігає інформацію про ОВКП, про юридичних та фізичних
осіб ( вид особи визначається за значенням стовпця is_personal).
Зберігає всі поля, які перелічені у додатку А, лабораторної роботи 1.
- pccos_updates_logs - зберігає інформацію про усі зміни, які
відбулися із записами про ОВКП ( створення, зміна, деактивація,
активація), зберігає посилання за допомогою зовнішнього ключа на
таблиці users ( той, хто вніс зміни) та на запис у pccos ( запису про
яку ОВКП ці зміни стосувалися)
- criminal_articles - зберігає інформацію про усі кримінальні статті, за
якими можливе винесення вироку для ОВКП

Зв’язки між таблицями: позначені стрілками, які визначають відношення


«Обов’язкове 1-many»

Первинні та зовнішні ключі: на схемі визначені позначками “[PK]” та


“[FK]” відповідно

Тип СУБД: реляційна база даних PostgreSQL 11


Архітектура користувацького інтерфейсу програми
Основні елементи мають збігатись із існуючим рішенням Єдиного
державного Реєстру ОВКП, яке доступне за адресою
https://corruptinfo.nazk.gov.ua

Наведемо знімки екрану основних елементів користувацького


інтерфейсу:

рис 3. Сторінка пошуку інформації про фізичну ОВКП


рис 3. Сторінка пошуку інформації про юридичну ОВКП
рис 5. Сторінка перегляду результату пошуку інформації про фізичну
ОВКП
рис 6. Сторінка додавання інформації про фізичну ОВКП
рис 7. Сторінка авторизації Реєстратора або Адміністратора у системі
Реєстру ОВКП

Засоби розробки і склад програмного забезпечення


системи
Розроблюване програмне забезпечення буде включати в себе наступні
програмні компоненти:

● Серверної частини (server-side) – включає в себе як модулі частини


бізнес логіки Реєстру ОВКП, та СКБД
● Клієнтської частини (client-side) – включає в себе керування
користувацькою частиною реєстру та обмін даними з серверною
частиною
● Тести серверної та клієнтської частини – автоматизовані тести
основного функціоналу системи
Отже, розроблювана система буде веб-орієнтованою. Як засоби
розробки буде використано мову програмування Node.js для серверної
частини, та мова програмування JavaScript із фреймворком Vue.js. В якості
СУБД виступатиме PostgreSQL 11. Програмні компоненти будуть
поміщені в Docker - контейнері та працюватимуть у віртуальній машині.

Технічне забезпечення системи


Технічне забезпечення системи Реєстру ОВКП складається із
cерверного обладнання, який зберігає код бізнес логіки, СКБД, та
клієнтської частини, а також код автоматичних тестів до серверної
частини.
Даний сервер має забезпечувати швидку та безперебійну роботу
системи , тому він має відповідати наступним вимогам:

● ОС: Linux Ubuntu > 16.10


● CPU: Quad core 3.8 GHz+
● RAM: мінімум 8 GB
● Database: space: 128 GB
● Предстановлене ПЗ: Docker

Персонал розробки системи


Персонал: Казимиро Данило, Карпено Олена
Чисельність персоналу: 2 людини.
Кваліфікації персоналу: 2 студенти кафедри програмного забезпечення
комп’ютерних систем ФПМ НТУУ “КПІ ім Ігоря Сікорського”
Функції персоналу: вчасне і якісне завершення процесу створення та
тестування ПЗ відповідно до вимог, які містяться у ТЗ системи,
розгортання системи на виділеному сервері.
Розподіл робіт між персоналом:
● Казимиров Данило – розробник частини бізнес логіки системи,
розробник технічної документації системи
● Карпенко Олена – розробник клієнтської частини системи,
розробник технічної документації системи

Структура бази даних


Далі наведено код SQL-скриптів, які використовуються частиною бізнес
логіки системи Реєстру ОВКП для оперування даними, збереженими у БД
Таблиця 1. Створення структури БД Реєстру ОВКП

init-db.sql
CREATE TYPE LOG_TYPE AS ENUM (
'UPDATE_PCCO',
'DEACTIVATE_PCCO',
'ACTIVATE_PCCO',
'CREATE_PCCO'
);

CREATE TYPE USER_ROLE AS ENUM (


'administrator',
'recorder'
)
CREATE TABLE users
(
id SERIAL NOT NULL
CONSTRAINT users_pk
PRIMARY KEY,
email VARCHAR(256) NOT NULL,
password VARCHAR(64) NOT NULL,
created_at TIMESTAMP DEFAULT now() NOT NULL,
role USER_ROLE NOT NULL
);

ALTER TABLE users


OWNER TO "user";

CREATE UNIQUE INDEX users_email_uindex


ON users (email);

CREATE UNIQUE INDEX users_id_uindex


ON users (id);

CREATE TABLE pccos


(
id SERIAL NOT NULL
CONSTRAINT pccos_pk
PRIMARY KEY,
judicature_decision_date DATE NOT NULL,
judicature_decision_number VARCHAR(64),
judicature_name TEXT NOT NULL,
litigation_number VARCHAR(64) NOT NULL,
judicature_decision_applying_date DATE NOT NULL,
criminal_action_type TEXT NOT NULL,
criminal_code_article INTEGER NOT NULL
CONSTRAINT pccos_criminal_articles_id_fk
REFERENCES criminal_articles,
offence_description TEXT NOT NULL,
first_name VARCHAR(64),
last_name VARCHAR(64),
surname VARCHAR(64),
personal_code VARCHAR(8) NOT NULL,
work_position TEXT,
work_place TEXT,
passport_series VARCHAR(2),
passport_code VARCHAR(6),
dob DATE,
place_of_birth TEXT,
residence TEXT,
imposition_disciplinary_action_details VARCHAR(128),
offence_method TEXT NOT NULL,
disciplinary_action_cancellation_date DATE,
disciplinary_action_cancellation_reason TEXT,
passport_issuing_authority TEXT,
conviction_repayment_date DATE,
conviction_repayment_reason TEXT,
disciplinary_punishment_type TEXT,
is_active BOOLEAN DEFAULT TRUE NOT NULL,
full_title TEXT,
short_title VARCHAR(64),
is_ukr_residence BOOLEAN,
legal_form TEXT,
offence_location TEXT,
cancellation_date DATE,
cancellation_reason TEXT,
is_personal BOOLEAN NOT NULL
);

CREATE TABLE criminal_articles


(
id SERIAL NOT NULL
CONSTRAINT criminal_articles_pk
PRIMARY KEY,
article TEXT NOT NULL
);

ALTER TABLE criminal_articles


OWNER TO "user";

CREATE UNIQUE INDEX criminal_articles_article_uindex


ON criminal_articles (article);

CREATE UNIQUE INDEX criminal_articles_id_uindex


ON criminal_articles (id);

COMMENT ON COLUMN pccos.judicature_decision_date IS 'дата винесення вироку судом';

COMMENT ON COLUMN pccos.judicature_decision_number IS 'номер вироку суду';

COMMENT ON COLUMN pccos.judicature_name IS 'назва суду, що виніс вирок';

COMMENT ON COLUMN pccos.litigation_number IS 'номер судової справи';

COMMENT ON COLUMN pccos.judicature_decision_applying_date IS 'дата набрання законної сили


судовим рішенням про притягнення особи до відповідальності за корупційне або пов’язане з
корупцією правопорушення;';
COMMENT ON COLUMN pccos.criminal_action_type IS 'вид покарання (стягнення), суть задоволення
позовних вимог;';

COMMENT ON COLUMN pccos.criminal_code_article IS 'стаття (частина статті) Кримінального кодексу


України або Кодексу України про адміністративні правопорушення, відповідно до якої особу
притягнуто до відповідальності;
';

COMMENT ON COLUMN pccos.offence_description IS 'склад корупційного або пов’язаного з корупцією


правопорушення;';

COMMENT ON COLUMN pccos.first_name IS 'ім''я';

COMMENT ON COLUMN pccos.last_name IS 'прізвище';

COMMENT ON COLUMN pccos.surname IS 'по-батькові';

COMMENT ON COLUMN pccos.personal_code IS 'реєстраційний номер облікової картки платника податків


(за наявності);';

COMMENT ON COLUMN pccos.work_position IS 'посада на час вчинення корупційного або пов’язаного з


корупцією правопорушення;
';

COMMENT ON COLUMN pccos.work_place IS 'місце роботи на час вчинення корупційного або пов’язаного
з корупцією правопорушення;
';

COMMENT ON COLUMN pccos.passport_series IS 'серія паспорта';

COMMENT ON COLUMN pccos.passport_code IS 'номер паспорта';

COMMENT ON COLUMN pccos.dob IS 'дата народження';

COMMENT ON COLUMN pccos.place_of_birth IS 'місце народження';

COMMENT ON COLUMN pccos.residence IS 'місце проживання (для іноземців, осіб без громадянства -
місце проживання за межами України);';

COMMENT ON COLUMN pccos.imposition_disciplinary_action_details IS 'реквізити розпорядчого


документа про накладення дисциплінарного стягнення;';

COMMENT ON COLUMN pccos.offence_method IS 'спосіб вчинення дисциплінарного проступку;';

COMMENT ON COLUMN pccos.disciplinary_action_cancellation_date IS 'дата скасування розпорядчого


документа про накладення дисциплінарного стягнення.';

COMMENT ON COLUMN pccos.disciplinary_action_cancellation_reason IS 'підстава для скасування


розпорядчого документа про накладення дисциплінарного стягнення.';

COMMENT ON COLUMN pccos.passport_issuing_authority IS 'ким виданий паспорт';

COMMENT ON COLUMN pccos.conviction_repayment_date IS 'дата зняття, погашення судимості;';

COMMENT ON COLUMN pccos.conviction_repayment_reason IS 'підстава для погашення судимості;


';

COMMENT ON COLUMN pccos.disciplinary_punishment_type IS 'вид дисциплінарного стягнення;';

COMMENT ON COLUMN pccos.full_title IS 'найменування юридичної особи (повне);';

COMMENT ON COLUMN pccos.short_title IS 'найменування юридичної особи (скорочене);';

COMMENT ON COLUMN pccos.is_ukr_residence IS 'належність до резидентів України;';

COMMENT ON COLUMN pccos.legal_form IS 'організаційно-правова форма юридичної особи;';


COMMENT ON COLUMN pccos.offence_location IS 'місцезнаходження юридичної особи на час скоєння
правопорушення;';

COMMENT ON COLUMN pccos.cancellation_date IS 'дата звільнення юридичної особи від застосування


заходів кримінально-правового характеру.';

COMMENT ON COLUMN pccos.cancellation_reason IS 'підстава для звільнення юридичної особи від


застосування заходів кримінально-правового характеру.';

COMMENT ON COLUMN pccos.is_personal IS 'це фізична особа';

ALTER TABLE pccos


OWNER TO "user";

CREATE UNIQUE INDEX pccos_id_uindex


ON pccos (id);

CREATE UNIQUE INDEX pccos_litigation_number_uindex


ON pccos (litigation_number);

CREATE UNIQUE INDEX pccos_personal_code_uindex


ON pccos (personal_code);

CREATE TABLE pccos_updates_logs


(
id BIGSERIAL NOT NULL
CONSTRAINT pccos_updates_logs_pk
PRIMARY KEY,
user_id INTEGER NOT NULL
CONSTRAINT pccos_updates_logs_users_id_fk
REFERENCES users,
created_at TIMESTAMP DEFAULT now() NOT NULL,
affected_record_id INTEGER
CONSTRAINT pccos_updates_logs_pccos_id_fk
REFERENCES pccos,
old_values JSON,
new_values JSON,
type LOG_TYPE,
updation_reason TEXT NOT NULL
);

ALTER TABLE pccos_updates_logs


OWNER TO "user";

CREATE UNIQUE INDEX pccos_updates_logs_id_uindex


ON pccos_updates_logs (id);

Таблиця 2. Додавання відомості про ОВКП до БД Реєстру ОВКП

insert_personal_pccos.sql
START TRANSACTION;
INSERT INTO pccos (first_name,
last_name,
surname,
personal_code,
passport_series,
passport_code,
dob,
place_of_birth,
passport_issuing_authority,
judicature_decision_date,
judicature_decision_number,
judicature_name,
litigation_number,
judicature_decision_applying_date,
criminal_action_type,
criminal_code_article,
offence_description,
work_position,
work_place,
residence,
offence_method,
is_personal)
VALUES ('Іванов', 'Петро', 'Васильович', '87654321', 'ВК', '123456', '1986-02-10', 'м. Житомир',
'1997-02-13 ДМА у м. Житомир', '2019-05-29',
'01/05/2019-3',
'Київський міський суд у Печерському районі', '1234567AD', '2019-05-30', 'вимагання
хабаря', 34,
'вимагав у громадянина Іванова Василя Петровича хабар в розмірі 1000$',
'сільрада с. Соковики',
'голова сільради с. Соковики', 'громадянин України',
'Дисциплінарне взискання, вилучення особистого майна, 5 років тюрми загального режиму',
TRUE);
COMMIT;

Таблиця 3. Пошук інформації про фізичну ОВКП

search_personal_pccos.sql
SELECT id,
first_name,
last_name,
surname,
personal_code,
passport_series,
passport_code,
dob,
place_of_birth,
passport_issuing_authority,
judicature_decision_date,
judicature_decision_number,
judicature_name,
litigation_number,
judicature_decision_applying_date,
criminal_action_type,
criminal_code_article,
offence_description,
work_position,
work_place,
residence,
offence_method,
is_personal
FROM pccos
WHERE pccos.first_name LIKE '%Іван%'
AND pccos.last_name LIKE '%Петров%'
AND pccos.is_personal = TRUE
AND pccos.is_active

Таблиця 4. Деактивація запису про ОВКП

deactivate_pccos.sql
UPDATE pccos
SET is_active= FALSE
WHERE id = 1
Таблиця 5. Створення запису логу про оновлення відомостей про ОВКП

insert_pccos_updates_log.sql
START TRANSACTION;
INSERT INTO pccos_updates_logs (user_id, affected_record_id, old_values, new_values, type,
updation_reason)
VALUES (1234, 4321, '{
"first_name": "Іван"
}', '{
"first_name": "Григорій"
}', 'UPDATE_PCCO', 'Постанова районого суду міста Київ № 123')
END;

You might also like