20 Commits

Author SHA1 Message Date
981f43cd7e лаб6: зроблено все по красоті 2024-05-24 18:05:54 +03:00
3a82e042c7 повідомлення 2024-05-24 17:46:33 +03:00
58ae6b04c8 лаб6: виконана 2024-05-24 16:32:20 +03:00
ba81f91189 Merge pull request 'Виправив помилки на головній сторінці звітів' (#43) from shmuliar into master
Reviewed-on: hasslesstech/edu-dis-labs#43
2024-05-20 11:50:24 +03:00
bf9e6364b9 виправив помилки на головній сторінці звітів 2024-05-20 11:48:43 +03:00
c941ac2022 Merge pull request 'лаб4: зробив рамочку навколо реляційної схеми' (#42) from shmuliar into master
Reviewed-on: hasslesstech/edu-dis-labs#42
2024-05-20 11:39:22 +03:00
2229e75644 лаб4: зробив рамочку навколо реляційної схеми 2024-05-20 11:36:37 +03:00
f71e97b6ff Merge pull request 'Лаб №4: додав SQL-скрипт та скріншот моделі' (#41) from korbut into master
Reviewed-on: hasslesstech/edu-dis-labs#41
Reviewed-by: ІО-23 Шмуляр Олег <hasslesstech@noreply.localhost>
2024-05-20 11:34:23 +03:00
3679f641e5 додав реляційну схему та скрипт до відповідних README 2024-05-20 11:27:12 +03:00
5702bdce4d видалив залишкові файли 2024-05-20 10:47:42 +03:00
c8787ad1f7 лаб4: додав SQL скрипт та скріншот ER-моделі 2024-05-20 10:23:39 +03:00
302fd36c34 Merge pull request 'Лаб №4: додавання ER-моделі' (#40) from shmuliar into master
Reviewed-on: hasslesstech/edu-dis-labs#40
2024-05-19 12:48:13 +03:00
9feddb6bac лаб4: додав типи даних полів посилання на BE-моделі 2024-05-19 12:43:34 +03:00
941c5be8f3 лаб4: додав ER-модель та оновив попередні лабораторні 2024-05-19 12:39:09 +03:00
577e565552 Merge pull request 'лаб4: BE-модель' (#39) from shmuliar into master
Reviewed-on: hasslesstech/edu-dis-labs#39
2024-05-19 10:41:12 +03:00
c70ddad444 лаб4: додав use-case-файли для керування посиланнями та оновив всі попередні лаби 2024-05-19 10:33:14 +03:00
3dc979873b Оновлення гілки 2024-05-02 11:11:26 +03:00
6fdb3b9072 Merge pull request 'table-generator: розробив аналоги основних інструментів мовою Python 3' (#37) from shmuliar-use-case into master
Reviewed-on: hasslesstech/edu-dis-labs#37
2024-05-02 11:10:55 +03:00
2c392feee6 лаб4: додав на BE-модель інформацію про посилання 2024-04-30 22:32:06 +03:00
9b538c7d8e лаб4: додав BE-модель 2024-04-30 22:06:45 +03:00
25 changed files with 623 additions and 75 deletions

5
.gitignore vendored
View File

@@ -108,3 +108,8 @@ utils/table-generator/tables/
utils/table-generator/tables.md
utils/table-generator/activities/
utils/table-generator/activities.md
# Package files
package-lock.json
yarn.lock
pnpm-lock.yaml

View File

@@ -15,7 +15,7 @@ module.exports = {
}]
],
port: 3030,
base: '/edu-dis-labs/',
base: '/edu-dis-labs-bodnar/',
theme: 'cool',
// dest: 'dist',
head: [
@@ -67,11 +67,6 @@ module.exports = {
path:"/conclusion/"
},
{
title: 'API',
path:"/api/"
}
],
sidebarDepth: 2,
displayAllHeaders: true, // Default: false
@@ -102,8 +97,8 @@ module.exports = {
// editLinkText: 'Ви можете покращити цю сторінку'
},
title: 'Expertise',
description: 'Лабораторні роботи з дисципліни "Розподілені інформаційні системи"',
title: 'Xpertise',
description: 'Лабораторні роботи з дисципліни "Організація баз даних"',
configureWebpack: {
resolve: {
alias: {

View File

@@ -6,25 +6,12 @@ actionLink: /intro/
footer: "ECL 2.0 Licensed | Copyright © 2024 [Your Name]"
---
**Виконали:**
**Виконав:**
*студенти 2-го курсу, групи ІО-23:*
*Олег ШМУЛЯР [shmuliar1@ukr.net, [@dmytrofiot23](https://t.me/dmytrofiot23)]*
*студент 2-го курсу, групи ІО-23:*
*Андрій БОДНАР [bodnarandrew123@gmail.com, [@andrux4](https://t.me/andrux4)]*
*Андрій ШВЕД [andreyfrog26@gmail.com, [@Rhinemann](https://t.me/Rhinemann)]*
*Євгеній ГОЛОВАТЕНКО [ievgeniigol@gmail.com, [@yevholova](https://t.me/yevholova)]*
*Вікторія ВОДЯНА [vodyanayaviktoria@gmail.com, [@victoriavodyana](https://t.me/victoriavodyana)]*
*Михайло КОРБУТ [korbutmykhailo@gmail.com, [@misha1tigr](https://t.me/misha1tigr)]*
*Олександр ГУРАНЕЦЬ [bacant150@gmail.com, [@Bacant150](https://t.me/Bacant150)]*
**Керівник**
*доцент кафедри ОТ ФІОТ, к.т.н., доцент*<span padding-right:5em></span> **Андрій БОЛДАК**

View File

@@ -1,12 +1,7 @@
# Висновки
У висновках наводять оцінку отриманих результатів, можливі галузі його використання. Висновки повинні містити в собі коротку узагальнену оцінку результатів розробки, у
тому числі і з погляду на їх технічно-економічну ефективність. Необхідно порівняти
отримані результати усіх характеристик об’єкта проєктування із завданням і з основними показниками сучасних аналогічних об’єктів.
В результаті проведеної роботи ми розробили модель бази даних, яку можна використовувати для реалізації систем проведення експертних опитувань. В рамках цього проєкту я розробив серверну частину, що надає RESTFUL-інтерфейс для доступу до бази даних. Вона може використовуватися для взаємодії з таблицею питань (question). Для створення RESTful сервісу було використано мови програмування Python та веб-фреймворк Flask.
Необхідно вказати яке нове технічне рішення покладене в основу проєкту і у чому її
переваги, що нового було запропоновано самим студентом.
На базі отриманих висновків можуть надаватися рекомендації по використанню розробки. Вони повинні
мати конкретний характер і бути цілком підтверджені проєктом.
Таким чином, створена система забезпечує ефективний та гнучкий інструмент для проведення експертних опитувань. Вона дозволяє автоматизувати процес збору та аналізу відповідей, що значно знижує час та ресурси, необхідні для проведення таких опитувань. Завдяки використанню сучасних технологій, таких як Flask, система має високу продуктивність та може легко масштабуватися відповідно до потреб користувачів.
Загалом, реалізована модель та серверна частина створюють міцний фундамент для подальшого розвитку та вдосконалення системи експертних опитувань, відкриваючи нові можливості для досліджень та аналізу даних.

View File

@@ -1,11 +1,6 @@
# Проєктування системи
# Проєктування бази даних
Вбудовування зображень діаграм здійснюється з використанням сервісу [plantuml.com](https://plantuml.com/).
В markdown-файлі використовується опис діаграми
```md
## BE модель
<center style="
border-radius:4px;
@@ -16,34 +11,58 @@
@startuml
participant Client
entity Account <<ENTITY>>
entity Account.username <<TEXT>>
entity Account.password <<TEXT>>
participant SR as "Service Registry"
entity Survey <<ENTITY>>
entity Survey.name <<TEXT>>
entity Survey.duration <<TEXT>>
entity Survey.isPaused <<BOOLEAN>>
entity Survey.isNamed <<BOOLEAN>>
participant Service
entity Question <<ENTITY>>
entity Question.text <<TEXT>>
Service -> SR : register
SR -> SR
SR --> Service
...
entity Responce <<ENTITY>>
entity Responce.value <<TEXT>>
SR -> Service: heartbeat
SR <-- Service: health
...
entity Link <<ENTITY>>
entity Link.usageLimit <<INT>>
entity Link.responceLimit <<INT>>
entity Link.uses <<INT>>
entity Link.responces <<INT>>
entity Link.path <<TEXT>>
Client -> SR: find
Client <-- SR: service endpoint
Client -> Service: request
Client <-- Service: response
Account.username --* Account
Account.password --* Account
Survey.name --* Survey
Survey.duration --* Survey
Survey.isPaused --* Survey
Survey.isNamed --* Survey
Link.usageLimit -u-* Link
Link.responceLimit -u-* Link
Link.uses --* Link
Link.responces --* Link
Link.path -u-* Link
Responce.value -u-* Responce
Question.text -u-* Question
Account "1,1" -- "0,*" Survey
Survey "1,1" -- "0,*" Question
Question "1,1" -r- "0,*" Responce
Account "0,1" -r- "0,*" Responce
Link "0,*" -- "1,1" Survey
@enduml
</center>
```
яка буде відображена наступним чином
## ER-модель
<center style="
border-radius:4px;
@@ -54,33 +73,58 @@ Client <-- Service: response
@startuml
@startuml
entity Account <<ENTITY>> {
id:INT
username:CHAR(64)
password:CHAR(256)
}
participant Client
entity Responce <<ENTITY>> {
id:INT
value:CHAR(16384)
}
participant SR as "Service Registry"
entity Question <<ENTITY>> {
id:INT
text:CHAR(256)
}
participant Service
Service -> SR : register
SR -> SR
SR --> Service
...
SR -> Service: heartbeat
SR <-- Service: health
...
Client -> SR: find
Client <-- SR: service endpoint
Client -> Service: request
Client <-- Service: response
entity Survey <<ENTITY>> {
id:INT
name:CHAR(256)
duration:CHAR(256)
isPaused:BOOLEAN
isNamed:BOOLEAN
}
entity Link <<ENTITY>> {
id:INT
uses:INT
responces:INT
usageLimit:INT
responceLimit:INT
path:CHAR(32)
}
Responce "0,*" --> "1,1" Question
Question "0,*" --> "1,1" Survey
Survey "0,*" --> "1,1" Account
Link "0,*" --> "1,1" Survey
Responce "0,*" --> "0,1" Account
@enduml
</center>
## Реляційна схема
<center style="
border-radius:4px;
border: 1px solid #cfd7e6;
box-shadow: 0 1px 3px 0 rgba(89,105,129,.05), 0 1px 1px 0 rgba(0,0,0,.025);
padding: 1em;"
>
![relational_schema](./relational_scheme.png)
</center>

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View File

@@ -93,6 +93,33 @@
| Виключні ситуації | 001.005 Користувач не ідентифікований |
| Основний сценарій | 1. Користувач натискає на кнопку редагування облікового запису<br>2. Система виводить інтерфейс для редагування облікового запису (можлива 001.005)<br>3. Користувач вказує бажані зміни властивостей облікового запису<br>4. Користувач натискає на кнопку внесення змін до властивостей облікового запису<br>5. Система змінює властивості облікового запису |
| ID | SURVEY.LINK.CREATE |
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| Назва | Додати посилання на опитування |
| Учасники | Користувач, система |
| Передумови | Користувач авторизований у системі |
| Результат | Нове посилання на опитування |
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
| Основний сценарій | 1. Користувач натискає кнопку створення посилання на опитування<br>2. Система виводить налаштування для нового посилання (можливі 001.005, 001.006, 001.008)<br>3. Користувач вводить налаштування для нового посилання<br>4. Користувач натискає на кнопку створення посилання<br>5. Система створює нове посилання |
| ID | SURVEY.LINK.DELETE |
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| Назва | Видалити посилання на опитування |
| Учасники | Користувач, система |
| Передумови | Користувач авторизований у системі |
| Результат | Видалення посилання на опитування |
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
| Основний сценарій | 1. Користувач натискає кнопку видалення посилання<br>2. Система виводить кнопку підтвердження видалення посилання<br>3. Користувач натискає на кнопку підтвердження видалення посилання<br>4. Система видаляє посилання (можливі 001.005, 001.006, 001.008, 001.009) |
| ID | SURVEY.LINK.MODIFY |
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| Назва | Змінити властивості посилання на опитування |
| Учасники | Користувач, система |
| Передумови | Користувач авторизований у системі |
| Результат | Зміна властивостей посилання на опитування |
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
| Основний сценарій | 1. Користувач натискає кнопку редагування властивостей посилання<br>2. Система виводить налаштування для обраного посилання (можливі 001.005, 001.006, 001.008, 001.009)<br>3. Користувач вводить юажані зміни властивостей посилання<br>4. Користувач натискає на кнопку збереження властиностей посилання<br>5. Система змінює властивості посилання |
| ID | USER.CREATE_SURVEY |
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| Назва | Створити опитування |
@@ -210,6 +237,9 @@ Cистема розділяє користувачів на дві катего
- створити опитування
- відредагувати своє опитування
- видалити своє опитування
- створити посилання на своє опитування
- редагувати властивості посилання на своє опитування
- видалити посилання на своє опитування
- призупинити своє опитування
- продовжити своє опитування
- переглянути властивості свого опитування

View File

@@ -1,3 +1,176 @@
# Реалізація інформаційного та програмного забезпечення
## SQL-скрипт для створення та початкового наповнення бази даних
```sql
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`Account`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Account` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` CHAR(255) NOT NULL,
`password` CHAR(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Survey`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Survey` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`isPaused` TINYINT UNSIGNED NOT NULL,
`isNamed` TINYINT UNSIGNED NOT NULL,
`name` CHAR(255) NULL,
`duration` CHAR(255) NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
CONSTRAINT `fk_Survey_Account1`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Account` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Question`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Question` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`Text` CHAR(255) NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
CONSTRAINT `fk_Question_Survey1`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Survey` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Response`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Response` (
`id` INT UNSIGNED NULL AUTO_INCREMENT,
`Value` VARCHAR(16384) NULL,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
PRIMARY KEY (`id`),
CONSTRAINT `fk_Response_Question`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Response_Account1`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Account` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Link`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Link` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`uses` INT NOT NULL,
`responces` INT NOT NULL,
`usageLimit` INT NULL,
`responceLimit` INT NULL,
`path` CHAR(32) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_Link_Survey1`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Survey` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
```
## RESTfull-сервіс для керування опитуваннями
Код серверу (Python, Flask) для таблиці "question":
```python
from flask import Flask, request
import mariadb as mdb
import json
def init_db():
try:
return mdb.connect(
host="10.1.1.36",
port=3306,
user="andruxa",
password="password1",
database="odb"
)
except mdb.Error as e:
print(f"Error connecting to MariaDB Platform: {e}")
return None
app = Flask(__name__)
@app.route("/api/question", methods=["GET", "POST", "PUT", "DELETE"])
def api_question():
db = init_db()
if not db:
return '{"error": "Failed to connect to database"}\n', 500
cur = db.cursor()
match request.method:
case "GET":
cur.execute("SELECT id, text, survey_id FROM question;")
result = [{"id": row[0], "text": row[1], "survey_id": row[2]} for row in cur]
db.close()
return json.dumps(result)
case "POST":
data = request.get_json()
cur.execute("INSERT INTO question (text, survey_id) VALUES (?, ?);", (data['text'], data['survey_id']))
db.commit()
db.close()
return '{"success": true}\n'
case "PUT":
data = request.get_json()
cur.execute("UPDATE question SET text = ?, survey_id = ? WHERE id = ?;", (data['text'], data['survey_id'], data['id']))
db.commit()
db.close()
return '{"success": true}\n'
case "DELETE":
data = request.get_json()
cur.execute("SELECT id, text, survey_id FROM question WHERE id = ?;", (data['id'],))
result = [{"id": row[0], "text": row[1], "survey_id": row[2]} for row in cur]
cur.execute("DELETE FROM question WHERE id = ?;", (data['id'],))
db.commit()
db.close()
return json.dumps(result)
```

View File

@@ -1,4 +1,33 @@
# Тестування працездатності системи
Для тестування системи використовувся додаток Postman
## Запуск сервера
![](./startFlask.png)
## Метод POST
### POST QUESTION
#### Запит та відповідь
![](./post.png)
#### Перевірка за допомогою GET
![](./get.png)
## Метод PUT
### PUT QUESTION
#### Запит та відповідь
![](./put.png)
#### Перевірка за допомогою GET
![](./get2.png)
## Метод DELETE
### DELETE QUESTION
#### Запит та відповідь
![](./delete.png)
#### Перевірка за допомогою GET
![](./get3.png)
*В цьому розділі необхідно вказати засоби тестування, навести вихідні коди тестів та результати тестування.*

BIN
docs/test/delete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

BIN
docs/test/get.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

BIN
docs/test/get2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

BIN
docs/test/get3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

BIN
docs/test/post.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
docs/test/put.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

BIN
docs/test/startFlask.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -17,6 +17,9 @@
(<b>ACCOUNT.CREATE</b>\nСтворити обліковий запис) as CreateAccount
(<b>ACCOUNT.DELETE</b>\nВидалити обліковий запис) as DeleteAccount
(<b>ACCOUNT.MODIFY</b>\nЗмінити властивості облікового запису) as ModifyAccount
(<b>SURVEY.LINK.CREATE</b>\nСтворити посилання на опитування) as CreateLink
(<b>SURVEY.LINK.DELETE</b>\nВидалити посилання на опитування) as DeleteLink
(<b>SURVEY.LINK.MODIFY</b>\nЗмінити властивості посилання на опитування) as ModifyLink
(<b>USER.CREATE_SURVEY</b>\nСтворити опитування) as CreateSurvey
(<b>USER.DELETE_SURVEY</b>\nВидалити опитування) as DeleteSurvey
(<b>USER.GET_SURVEY_RESULT</b>\nПереглянути відповіді на опитування) as GetSurveyResult
@@ -33,6 +36,9 @@
AuthorisedUser -r-> ModifyAccount
AuthorisedUser -u-> DeleteAccount
AuthorisedUser -r-> CreateLink
AuthorisedUser -l-> DeleteLink
AuthorisedUser -u-> ModifyLink
AuthorisedUser -u-> LogOut
AuthorisedUser --> CreateSurvey
AuthorisedUser -u-> DeleteSurvey
@@ -80,9 +86,15 @@
(<b>USER.STAT_SURVEY</b>\nПереглянути властивості опитування) as StatSurvey
(<b>USER.TAKE_ANON_SURVEY</b>\nПройти анонімне опитування) as TakeAnonSurvey
(<b>USER.TAKE_NAMED_SURVEY</b>\nПройти поіменне опитування) as TakeNamedSurvey
(<b>SURVEY.LINK.CREATE</b>\nСтворити посилання на опитування) as CreateLink
(<b>SURVEY.LINK.DELETE</b>\nВидалити посилання на опитування) as DeleteLink
(<b>SURVEY.LINK.MODIFY</b>\nЗмінити властивості посилання на опитування) as ModifyLink
AuthorisedUser -r-> ModifyAccount
AuthorisedUser -u-> DeleteAccount
AuthorisedUser -r-> CreateLink
AuthorisedUser -l-> DeleteLink
AuthorisedUser -u-> ModifyLink
AuthorisedUser -u-> LogOut
AuthorisedUser -d-> CreateSurvey
AuthorisedUser -u-> DeleteSurvey
@@ -221,6 +233,80 @@
stop
@enduml
| ID | SURVEY.LINK.CREATE |
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------:|
| Назва | Додати посилання на опитування |
| Учасники | Користувач, система |
| Передумови | Користувач авторизований у системі |
| Результат | Нове посилання на опитування |
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
@startuml
|Користувач|
start
: Натискає кнопку створення посилання на опитування;
|Система|
: Виводить налаштування для нового посилання;
note right #lightpink
<b>Можливі 001.005, 001.006, 001.008</b>
end note
|Користувач|
: Вводить налаштування для нового посилання;
: Натискає на кнопку створення посилання;
|Система|
: Створює нове посилання;
|Користувач|
stop
@enduml
| ID | SURVEY.LINK.DELETE |
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| Назва | Видалити посилання на опитування |
| Учасники | Користувач, система |
| Передумови | Користувач авторизований у системі |
| Результат | Видалення посилання на опитування |
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
@startuml
|Користувач|
start
: Натискає кнопку видалення посилання;
|Система|
: Виводить кнопку підтвердження видалення посилання;
|Користувач|
: Натискає на кнопку підтвердження видалення посилання;
|Система|
: Видаляє посилання;
note right #lightpink
<b>Можливі 001.005, 001.006, 001.008, 001.009</b>
end note
|Користувач|
stop
@enduml
| ID | SURVEY.LINK.MODIFY |
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| Назва | Змінити властивості посилання на опитування |
| Учасники | Користувач, система |
| Передумови | Користувач авторизований у системі |
| Результат | Зміна властивостей посилання на опитування |
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
@startuml
|Користувач|
start
: Натискає кнопку редагування властивостей посилання;
|Система|
: Виводить налаштування для обраного посилання;
note right #lightpink
<b>Можливі 001.005, 001.006, 001.008, 001.009</b>
end note
|Користувач|
: Вводить юажані зміни властивостей посилання;
: Натискає на кнопку збереження властиностей посилання;
|Система|
: Змінює властивості посилання;
|Користувач|
stop
@enduml
| ID | USER.CREATE_SURVEY |
|:-----------------:|:--------------------------------------------------------------------------------------------------------:|
| Назва | Створити опитування |

View File

@@ -1,2 +1,3 @@
# програмні коди
В цьому розділі розміщені програмні коди.
# JS-скрипти
В цьому розділі розміщені програмні коди javascript.

View File

@@ -0,0 +1,56 @@
from flask import Flask, request
import mariadb as mdb
import json
def init_db():
try:
return mdb.connect(
host="10.1.1.36",
port=3306,
user="andruxa",
password="password1",
database="odb"
)
except mdb.Error as e:
print(f"Error connecting to MariaDB Platform: {e}")
return None
app = Flask(__name__)
@app.route("/api/question", methods=["GET", "POST", "PUT", "DELETE"])
def api_question():
db = init_db()
if not db:
return '{"error": "Failed to connect to database"}\n', 500
cur = db.cursor()
match request.method:
case "GET":
cur.execute("SELECT id, text, survey_id FROM question;")
result = [{"id": row[0], "text": row[1], "survey_id": row[2]} for row in cur]
db.close()
return json.dumps(result)
case "POST":
data = request.get_json()
cur.execute("INSERT INTO question (text, survey_id) VALUES (?, ?);", (data['text'], data['survey_id']))
db.commit()
db.close()
return '{"success": true}\n'
case "PUT":
data = request.get_json()
cur.execute("UPDATE question SET text = ?, survey_id = ? WHERE id = ?;", (data['text'], data['survey_id'], data['id']))
db.commit()
db.close()
return '{"success": true}\n'
case "DELETE":
data = request.get_json()
cur.execute("SELECT id, text, survey_id FROM question WHERE id = ?;", (data['id'],))
result = [{"id": row[0], "text": row[1], "survey_id": row[2]} for row in cur]
cur.execute("DELETE FROM question WHERE id = ?;", (data['id'],))
db.commit()
db.close()
return json.dumps(result)

3
src/sql/README.md Normal file
View File

@@ -0,0 +1,3 @@
# SQL-скрипти
В цьому розділі розміщені сирцеві коди для створення бази даних.

107
src/sql/script.sql Normal file
View File

@@ -0,0 +1,107 @@
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`Account`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Account` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` CHAR(255) NOT NULL,
`password` CHAR(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Survey`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Survey` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`isPaused` TINYINT UNSIGNED NOT NULL,
`isNamed` TINYINT UNSIGNED NOT NULL,
`name` CHAR(255) NULL,
`duration` CHAR(255) NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
CONSTRAINT `fk_Survey_Account1`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Account` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Question`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Question` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`Text` CHAR(255) NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
CONSTRAINT `fk_Question_Survey1`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Survey` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Response`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Response` (
`id` INT UNSIGNED NULL AUTO_INCREMENT,
`Value` VARCHAR(16384) NULL,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
PRIMARY KEY (`id`),
CONSTRAINT `fk_Response_Question`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Response_Account1`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Account` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Link`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Link` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`uses` INT NOT NULL,
`responces` INT NOT NULL,
`usageLimit` INT NULL,
`responceLimit` INT NULL,
`path` CHAR(32) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_Link_Survey1`
FOREIGN KEY (`id`)
REFERENCES `mydb`.`Survey` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

View File

@@ -0,0 +1,12 @@
Назва | Додати посилання на опитування
Учасники | Користувач, система
Передумови | Користувач авторизований у системі
Результат | Нове посилання на опитування
Виключні ситуації | 001.005 Користувач не ідентифікований
| 001.006 Запитане опитування не існує
| 001.008 Користувач не є власником опитування
Основний сценарій | 1. Користувач натискає кнопку створення посилання на опитування
| 2. Система виводить налаштування для нового посилання (можливі 001.005, 001.006, 001.008)
| 3. Користувач вводить налаштування для нового посилання
| 4. Користувач натискає на кнопку створення посилання
| 5. Система створює нове посилання

View File

@@ -0,0 +1,12 @@
Назва | Видалити посилання на опитування
Учасники | Користувач, система
Передумови | Користувач авторизований у системі
Результат | Видалення посилання на опитування
Виключні ситуації | 001.005 Користувач не ідентифікований
| 001.006 Запитане опитування не існує
| 001.008 Користувач не є власником опитування
| 001.009 Запитане посилання на існує
Основний сценарій | 1. Користувач натискає кнопку видалення посилання
| 2. Система виводить кнопку підтвердження видалення посилання
| 3. Користувач натискає на кнопку підтвердження видалення посилання
| 4. Система видаляє посилання (можливі 001.005, 001.006, 001.008, 001.009)

View File

@@ -0,0 +1,13 @@
Назва | Змінити властивості посилання на опитування
Учасники | Користувач, система
Передумови | Користувач авторизований у системі
Результат | Зміна властивостей посилання на опитування
Виключні ситуації | 001.005 Користувач не ідентифікований
| 001.006 Запитане опитування не існує
| 001.008 Користувач не є власником опитування
| 001.009 Запитане посилання на існує
Основний сценарій | 1. Користувач натискає кнопку редагування властивостей посилання
| 2. Система виводить налаштування для обраного посилання (можливі 001.005, 001.006, 001.008, 001.009)
| 3. Користувач вводить юажані зміни властивостей посилання
| 4. Користувач натискає на кнопку збереження властиностей посилання
| 5. Система змінює властивості посилання