Compare commits
No commits in common. "master" and "b03dc5fbfcf708a7eb5377326af37a87b8a4e706" have entirely different histories.
master
...
b03dc5fbfc
|
@ -1,110 +0,0 @@
|
||||||
# Logs
|
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
lerna-debug.log*
|
|
||||||
|
|
||||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
|
||||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
|
||||||
|
|
||||||
# Runtime data
|
|
||||||
pids
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
*.pid.lock
|
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
||||||
lib-cov
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
|
||||||
coverage
|
|
||||||
*.lcov
|
|
||||||
|
|
||||||
# nyc test coverage
|
|
||||||
.nyc_output
|
|
||||||
|
|
||||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
|
||||||
.grunt
|
|
||||||
|
|
||||||
# Bower dependency directory (https://bower.io/)
|
|
||||||
bower_components
|
|
||||||
|
|
||||||
# node-waf configuration
|
|
||||||
.lock-wscript
|
|
||||||
|
|
||||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
|
||||||
build/Release
|
|
||||||
|
|
||||||
# Dependency directories
|
|
||||||
node_modules/
|
|
||||||
jspm_packages/
|
|
||||||
|
|
||||||
# TypeScript v1 declaration files
|
|
||||||
typings/
|
|
||||||
|
|
||||||
# TypeScript cache
|
|
||||||
*.tsbuildinfo
|
|
||||||
|
|
||||||
# Optional npm cache directory
|
|
||||||
.npm
|
|
||||||
|
|
||||||
# Optional eslint cache
|
|
||||||
.eslintcache
|
|
||||||
|
|
||||||
# Microbundle cache
|
|
||||||
.rpt2_cache/
|
|
||||||
.rts2_cache_cjs/
|
|
||||||
.rts2_cache_es/
|
|
||||||
.rts2_cache_umd/
|
|
||||||
|
|
||||||
# Optional REPL history
|
|
||||||
.node_repl_history
|
|
||||||
|
|
||||||
# Output of 'npm pack'
|
|
||||||
*.tgz
|
|
||||||
|
|
||||||
# Yarn Integrity file
|
|
||||||
.yarn-integrity
|
|
||||||
|
|
||||||
# dotenv environment variables file
|
|
||||||
.env
|
|
||||||
.env.test
|
|
||||||
|
|
||||||
# parcel-bundler cache (https://parceljs.org/)
|
|
||||||
.cache
|
|
||||||
|
|
||||||
# Next.js build output
|
|
||||||
.next
|
|
||||||
|
|
||||||
# Nuxt.js build / generate output
|
|
||||||
.nuxt
|
|
||||||
dist
|
|
||||||
|
|
||||||
# Gatsby files
|
|
||||||
.cache/
|
|
||||||
# Comment in the public line in if your project uses Gatsby and *not* Next.js
|
|
||||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
|
||||||
# public
|
|
||||||
|
|
||||||
# vuepress build output
|
|
||||||
.vuepress/dist
|
|
||||||
|
|
||||||
# Serverless directories
|
|
||||||
.serverless/
|
|
||||||
|
|
||||||
# FuseBox cache
|
|
||||||
.fusebox/
|
|
||||||
|
|
||||||
# DynamoDB Local files
|
|
||||||
.dynamodb/
|
|
||||||
|
|
||||||
# TernJS port file
|
|
||||||
.tern-port
|
|
||||||
|
|
||||||
# utils/table-generator generated files
|
|
||||||
utils/table-generator/tables/
|
|
||||||
utils/table-generator/tables.md
|
|
||||||
utils/table-generator/activities/
|
|
||||||
utils/table-generator/activities.md
|
|
|
@ -1,8 +0,0 @@
|
||||||
# Default ignored files
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
||||||
# Editor-based HTTP Client requests
|
|
||||||
/httpRequests/
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/dataSources/
|
|
||||||
/dataSources.local.xml
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/edu-dis-labs.iml" filepath="$PROJECT_DIR$/.idea/edu-dis-labs.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
32
LICENSE
|
@ -1,16 +1,16 @@
|
||||||
ECL 2.0
|
ECL 2.0
|
||||||
|
|
||||||
Copyright (c) 2021 Andrey Boldak
|
Copyright (c) 2021 Andrey Boldak
|
||||||
|
|
||||||
Licensed under the
|
Licensed under the
|
||||||
Educational Community License, Version 2.0 (the "License"); you may
|
Educational Community License, Version 2.0 (the "License"); you may
|
||||||
not use this file except in compliance with the License. You may
|
not use this file except in compliance with the License. You may
|
||||||
obtain a copy of the License at
|
obtain a copy of the License at
|
||||||
|
|
||||||
https://opensource.org/licenses/ECL-2.0
|
https://opensource.org/licenses/ECL-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
Unless required by applicable law or agreed to in writing,
|
||||||
software distributed under the License is distributed on an "AS IS"
|
software distributed under the License is distributed on an "AS IS"
|
||||||
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||||||
or implied. See the License for the specific language governing
|
or implied. See the License for the specific language governing
|
||||||
permissions and limitations under the License.
|
permissions and limitations under the License.
|
||||||
|
|
124
README.md
|
@ -1,62 +1,62 @@
|
||||||
# Шаблон репозиторію для виконання лабораторних робіт з дисципліни "Розподілені інформаційні системи"
|
# Шаблон репозиторію для виконання лабораторних робіт з дисципліни "Розподілені інформаційні системи"
|
||||||
|
|
||||||
## Як використовувати
|
## Як використовувати
|
||||||
|
|
||||||
В цьому репозиторії знаходиться шаблон для виконання лабораторних робіт.
|
В цьому репозиторії знаходиться шаблон для виконання лабораторних робіт.
|
||||||
|
|
||||||
Для виконання лабораторних робіт необхідно зробити ```fork``` цього репозіторію, склонувати вже власний репозіторій та розміщувати документацію у відповідних діректоріях ```./docs```.
|
Для виконання лабораторних робіт необхідно зробити ```fork``` цього репозіторію, склонувати вже власний репозіторій та розміщувати документацію у відповідних діректоріях ```./docs```.
|
||||||
|
|
||||||
В цьому файлі необхідно вказати назву проекту. Коротку загальну характеристику
|
В цьому файлі необхідно вказати назву проекту. Коротку загальну характеристику
|
||||||
проекту, контактні дані виконавців.
|
проекту, контактні дані виконавців.
|
||||||
|
|
||||||
|
|
||||||
Шаблон публікування підготовлено з використанням [VuePress](https://vuepress.vuejs.org/), та стартера
|
Шаблон публікування підготовлено з використанням [VuePress](https://vuepress.vuejs.org/), та стартера
|
||||||
[FriendlyUser/vuepress-theme-cool-starter](https://github.com/FriendlyUser/vuepress-theme-cool-starter).
|
[FriendlyUser/vuepress-theme-cool-starter](https://github.com/FriendlyUser/vuepress-theme-cool-starter).
|
||||||
|
|
||||||
Щоб опублікувати проект у Github Pages, налаштовуємо Github Pages (гілка ```gh-pages```), змінюємо файл ```./publish.sh```
|
Щоб опублікувати проект у Github Pages, налаштовуємо Github Pages (гілка ```gh-pages```), змінюємо файл ```./publish.sh```
|
||||||
|
|
||||||
```sh {24}
|
```sh {24}
|
||||||
|
|
||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
# abort on errors
|
# abort on errors
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# build
|
# build
|
||||||
npm run docs:build
|
npm run docs:build
|
||||||
|
|
||||||
# navigate into the build output directory
|
# navigate into the build output directory
|
||||||
cd docs/.vuepress/dist
|
cd docs/.vuepress/dist
|
||||||
|
|
||||||
# if you are deploying to a custom domain
|
# if you are deploying to a custom domain
|
||||||
# echo 'www.example.com' > CNAME
|
# echo 'www.example.com' > CNAME
|
||||||
|
|
||||||
git init
|
git init
|
||||||
git add -A
|
git add -A
|
||||||
git commit -m 'deploy'
|
git commit -m 'deploy'
|
||||||
|
|
||||||
# if you are deploying to https://<USERNAME>.github.io
|
# if you are deploying to https://<USERNAME>.github.io
|
||||||
# git push -f git@github.com:boldak/<USERNAME>.github.io.git master
|
# git push -f git@github.com:boldak/<USERNAME>.github.io.git master
|
||||||
|
|
||||||
# if you are deploying to https://<USERNAME>.github.io/<REPO>
|
# if you are deploying to https://<USERNAME>.github.io/<REPO>
|
||||||
git push -f https://github.com/<USERNAME>/dis-edu.git master:gh-pages
|
git push -f https://github.com/<USERNAME>/dis-edu.git master:gh-pages
|
||||||
|
|
||||||
cd -
|
cd -
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Потім запускаємо
|
Потім запускаємо
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run publish
|
npm run publish
|
||||||
```
|
```
|
||||||
|
|
||||||
Для відлагодження документації в локальному режимі запускаємо
|
Для відлагодження документації в локальному режимі запускаємо
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run docs:dev
|
npm run docs:dev
|
||||||
```
|
```
|
||||||
|
|
||||||
Доступ до локально опублікованої версії документації [http://localhost:3030](http://localhost:3030)
|
Доступ до локально опублікованої версії документації [http://localhost:3030](http://localhost:3030)
|
||||||
|
|
||||||
***Happy learning! Happy coding!***
|
***Happy learning! Happy coding!***
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
css
|
|
||||||
dist
|
|
|
@ -1,39 +0,0 @@
|
||||||
<template>
|
|
||||||
<details><summary>{{title}}</summary>{{content}} </details>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'Details',
|
|
||||||
props: {
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: "title"
|
|
||||||
},
|
|
||||||
content: {
|
|
||||||
type: String,
|
|
||||||
default: "title"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
||||||
<style scoped lang="styl">
|
|
||||||
details {
|
|
||||||
border-radius: 3px;
|
|
||||||
background: #EEE;
|
|
||||||
}
|
|
||||||
details summary {
|
|
||||||
font-size: 17px;
|
|
||||||
vertical-align: top;
|
|
||||||
background: #333;
|
|
||||||
color: #FFF;
|
|
||||||
border-radius: 3px;
|
|
||||||
/* padding: 5px 10px; */
|
|
||||||
padding: 5px 0px;
|
|
||||||
outline: none;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,324 +0,0 @@
|
||||||
<template>
|
|
||||||
<!--container-->
|
|
||||||
<section class="container">
|
|
||||||
|
|
||||||
<!-- transition -->
|
|
||||||
<transition :duration="{ enter: 500, leave: 300 }" enter-active-class="animated zoomIn" leave-active-class="animated zoomOut" mode="out-in">
|
|
||||||
|
|
||||||
<!--questionContainer-->
|
|
||||||
<div class="questionContainer" v-if="questionIndex<quiz.questions.length" v-bind:key="questionIndex">
|
|
||||||
<header>
|
|
||||||
<div class="shell">
|
|
||||||
<div class="bar" :style="{width: questionIndex/quiz.questions.length*100 + '%' }">
|
|
||||||
<span>{{(questionIndex/quiz.questions.length)*100}}%</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<!--/progress-->
|
|
||||||
|
|
||||||
<!-- questionTitle -->
|
|
||||||
<h2 class="titleContainer title">{{ quiz.questions[questionIndex] && quiz.questions[questionIndex].text }}</h2>
|
|
||||||
<!-- /questionTitle -->
|
|
||||||
<!-- quizOptions -->
|
|
||||||
<div class="optionContainer" v-if="quiz.questions[questionIndex]">
|
|
||||||
<div class="option" v-for="(response, index) in quiz.questions[questionIndex].responses" @click="selectOption(index)" :class="{ 'is-selected': userResponses[questionIndex] == index}" :key="index">
|
|
||||||
{{ index | charIndex }}. {{ response.text || "Mpthasdng"}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--quizFooter: navigation and progress-->
|
|
||||||
<footer class="questionFooter">
|
|
||||||
|
|
||||||
<!--pagination-->
|
|
||||||
<nav class="pagination" role="navigation" aria-label="pagination">
|
|
||||||
|
|
||||||
<!-- back button -->
|
|
||||||
<a class="button" v-on:click="prev();" :disabled="questionIndex < 1">
|
|
||||||
Back
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<!-- next button -->
|
|
||||||
<a class="button" :class="(userResponses[questionIndex]==null)?'':'is-active'" v-on:click="next();" :disabled="questionIndex>=quiz.questions.length">
|
|
||||||
{{ (userResponses[questionIndex]==null)?'Skip':'Next' }}
|
|
||||||
</a>
|
|
||||||
|
|
||||||
</nav>
|
|
||||||
<!--/pagination-->
|
|
||||||
|
|
||||||
</footer>
|
|
||||||
<!--/quizFooter-->
|
|
||||||
</div>
|
|
||||||
<!--/questionBox-->
|
|
||||||
<!--quizCompletedResult-->
|
|
||||||
<div v-if="questionIndex >= quiz.questions.length" v-bind:key="questionIndex" class="quizCompleted has-text-centered">
|
|
||||||
<!-- quizCompletedIcon: Achievement Icon -->
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fa" :class="score() > 3 ?'fa-check-circle-o is-active':'fa-times-circle'"></i>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<!--resultTitleBlock-->
|
|
||||||
<h2 class="title">
|
|
||||||
You did {{ (score() / quiz.questions.length > 0.7 ?'an amazing':(score() / quiz.questions.length < 0.4 ?'a poor':'a good')) }} job!
|
|
||||||
</h2>
|
|
||||||
<p class="subtitle">
|
|
||||||
Total score: {{ score() }} / {{ quiz.questions.length }}
|
|
||||||
</p>
|
|
||||||
<br>
|
|
||||||
<a class="button" @click="restart()">restart <i class="fa fa-refresh"></i></a>
|
|
||||||
<!--/resultTitleBlock-->
|
|
||||||
</div>
|
|
||||||
</transition>
|
|
||||||
<!--/quizCompetedResult-->
|
|
||||||
</section>
|
|
||||||
<!--/container-->
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import * as quizzes from '../quizzes'
|
|
||||||
import Vue from 'vue';
|
|
||||||
export default {
|
|
||||||
name: 'Quiz',
|
|
||||||
props: {
|
|
||||||
quizNum: Number
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
let quizData
|
|
||||||
switch (this.quizNum) {
|
|
||||||
case 1:
|
|
||||||
quizData = quizzes.quiz1
|
|
||||||
break
|
|
||||||
case 2:
|
|
||||||
quizData = quizzes.quiz2
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
quizData = quizzes.quiz1
|
|
||||||
break
|
|
||||||
}
|
|
||||||
const userResponseSkelaton = Array(quizData.questions.length).fill(null);
|
|
||||||
return {
|
|
||||||
quiz: quizData,
|
|
||||||
questionIndex: 0,
|
|
||||||
userResponses: userResponseSkelaton,
|
|
||||||
isActive: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
filters: {
|
|
||||||
charIndex: function(i) {
|
|
||||||
return String.fromCharCode(97 + i);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
restart: function(){
|
|
||||||
this.questionIndex=0;
|
|
||||||
this.userResponses=Array(this.quiz.questions.length).fill(null);
|
|
||||||
},
|
|
||||||
selectOption: function(index) {
|
|
||||||
this.$set(this.userResponses, this.questionIndex, index);
|
|
||||||
},
|
|
||||||
next: function() {
|
|
||||||
if (this.questionIndex < this.quiz.questions.length)
|
|
||||||
this.questionIndex++;
|
|
||||||
},
|
|
||||||
|
|
||||||
prev: function() {
|
|
||||||
if (this.quiz.questions.length > 0) this.questionIndex--;
|
|
||||||
},
|
|
||||||
// Return "true" count in userResponses
|
|
||||||
score: function() {
|
|
||||||
var score = 0;
|
|
||||||
for (let i = 0; i < this.userResponses.length; i++) {
|
|
||||||
if (
|
|
||||||
typeof this.quiz.questions[i].responses[
|
|
||||||
this.userResponses[i]
|
|
||||||
] !== "undefined" &&
|
|
||||||
this.quiz.questions[i].responses[this.userResponses[i]].correct
|
|
||||||
) {
|
|
||||||
score = score + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// calculate percentage
|
|
||||||
return score;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
||||||
<style scoped>
|
|
||||||
@import url("https://fonts.googleapis.com/css?family=Montserrat:400,400i,700");
|
|
||||||
@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,400i,700");
|
|
||||||
.button {
|
|
||||||
transition: 0.3s;
|
|
||||||
}
|
|
||||||
.title, .subtitle {
|
|
||||||
font-family: Montserrat, sans-serif;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
.animated {
|
|
||||||
transition-duration: 0.15s;
|
|
||||||
}
|
|
||||||
.container {
|
|
||||||
margin: 0 0.5rem;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.questionBox {
|
|
||||||
max-width: 30rem;
|
|
||||||
width: 30rem;
|
|
||||||
min-height: 30rem;
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
border-radius: 0.5rem;
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
|
|
||||||
}
|
|
||||||
.questionContainer header {
|
|
||||||
background-color: rgba(124, 32, 32, 0.025);
|
|
||||||
background: rgba(124, 32, 32, 0.025);
|
|
||||||
padding: 1.5rem;
|
|
||||||
text-align: center;
|
|
||||||
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
.questionContainer header h1 {
|
|
||||||
font-weight: bold;
|
|
||||||
margin-bottom: 1rem !important;
|
|
||||||
}
|
|
||||||
.progressContainer {
|
|
||||||
width: 60%;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.titleContainer {
|
|
||||||
text-align: center;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 1.5rem;
|
|
||||||
}
|
|
||||||
.quizForm {
|
|
||||||
display: block;
|
|
||||||
white-space: normal;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.quizForm .quizFormContainer {
|
|
||||||
height: 100%;
|
|
||||||
margin: 15px 18px;
|
|
||||||
}
|
|
||||||
.quizForm .quizFormContainer .field-label {
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
.quizCompleted {
|
|
||||||
width: 100%;
|
|
||||||
padding: 1rem;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.quizCompleted > .icon {
|
|
||||||
color: #f86c6b;
|
|
||||||
font-size: 5rem;
|
|
||||||
}
|
|
||||||
.quizCompleted > .icon .is-active {
|
|
||||||
color: #4dbd74;
|
|
||||||
}
|
|
||||||
.questionContainer {
|
|
||||||
white-space: normal;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.questionContainer .optionContainer {
|
|
||||||
margin-top: 12px;
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
.questionContainer .optionContainer .option {
|
|
||||||
border-radius: 290486px;
|
|
||||||
padding: 9px 18px;
|
|
||||||
margin: 0 18px;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
transition: 0.3s;
|
|
||||||
cursor: pointer;
|
|
||||||
background-color: #73818f;
|
|
||||||
color: #f0f3f5;
|
|
||||||
border: transparent 1px solid;
|
|
||||||
}
|
|
||||||
.questionContainer .optionContainer .option.is-selected {
|
|
||||||
border-color: rgba(0, 0, 0, 0.25);
|
|
||||||
background-color: #834c9d;
|
|
||||||
}
|
|
||||||
.questionContainer .optionContainer .option:hover {
|
|
||||||
background-color: #B589D6;
|
|
||||||
}
|
|
||||||
.questionContainer .optionContainer .option:active {
|
|
||||||
transform: scaleX(0.9);
|
|
||||||
}
|
|
||||||
.questionContainer .questionFooter {
|
|
||||||
background: rgba(0, 0, 0, 0.025);
|
|
||||||
border-top: 1px solid rgba(0, 0, 0, 0.1);
|
|
||||||
width: 100%;
|
|
||||||
align-self: flex-end;
|
|
||||||
}
|
|
||||||
.questionContainer .questionFooter .pagination {
|
|
||||||
margin: 15px 25px;
|
|
||||||
}
|
|
||||||
.pagination {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
.button {
|
|
||||||
padding: 0.5rem 1rem;
|
|
||||||
border: 1px solid rgba(0, 0, 0, 0.25);
|
|
||||||
border-radius: 5rem;
|
|
||||||
margin: 0 0.25rem;
|
|
||||||
transition: 0.3s;
|
|
||||||
}
|
|
||||||
.button:hover {
|
|
||||||
cursor: pointer;
|
|
||||||
background: #552586;
|
|
||||||
border-color: rgba(0, 0, 0, 0.25);
|
|
||||||
}
|
|
||||||
.button.is-active {
|
|
||||||
background: #834c9d;
|
|
||||||
color: white;
|
|
||||||
border-color: transparent;
|
|
||||||
}
|
|
||||||
.button.is-active:hover {
|
|
||||||
background: #0a2ffe;
|
|
||||||
}
|
|
||||||
@media screen and (min-width: 769px) {
|
|
||||||
.questionBox {
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.questionContainer {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media screen and (max-width: 768px) {
|
|
||||||
.sidebar {
|
|
||||||
height: auto !important;
|
|
||||||
border-radius: 6px 6px 0px 0px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Custom Progress bar */
|
|
||||||
.shell {
|
|
||||||
height: 20px;
|
|
||||||
width: 250px;
|
|
||||||
border: 1px solid #73818f;
|
|
||||||
border-radius: 13px;
|
|
||||||
padding: 3px;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.bar {
|
|
||||||
background: linear-gradient(to right, #B589D6, #804FB3);
|
|
||||||
height: 20px;
|
|
||||||
width: 15px;
|
|
||||||
border-radius: 9px;
|
|
||||||
}
|
|
||||||
.bar span {
|
|
||||||
float: right;
|
|
||||||
padding: 4px 5px;
|
|
||||||
color: #f0f3f5;
|
|
||||||
font-size: 0.7em;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,10 +0,0 @@
|
||||||
<script>
|
|
||||||
import "vue-good-table/dist/vue-good-table.css";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "Styles",
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
|
@ -1,56 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<vue-good-table
|
|
||||||
:columns="columns"
|
|
||||||
:rows="rows"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { VueGoodTable } from 'vue-good-table';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'my-component',
|
|
||||||
|
|
||||||
// add to component
|
|
||||||
components: {
|
|
||||||
VueGoodTable,
|
|
||||||
},
|
|
||||||
data(){
|
|
||||||
return {
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
label: 'Name',
|
|
||||||
field: 'name',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Age',
|
|
||||||
field: 'age',
|
|
||||||
type: 'number',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Created On',
|
|
||||||
field: 'createdAt',
|
|
||||||
type: 'date',
|
|
||||||
dateInputFormat: 'yyyy-mm-dd',
|
|
||||||
dateOutputFormat: 'MMM Do yy',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Percent',
|
|
||||||
field: 'score',
|
|
||||||
type: 'percentage',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
rows: [
|
|
||||||
{ id:1, name:"John", age: 20, createdAt: '2011-10-31',score: 0.03343 },
|
|
||||||
{ id:2, name:"Jane", age: 24, createdAt: '2019-10-31', score: 0.03343 },
|
|
||||||
{ id:3, name:"Susan", age: 16, createdAt: '2011-10-30', score: 0.03343 },
|
|
||||||
{ id:4, name:"Chris", age: 55, createdAt: '2011-10-11', score: 0.03343 },
|
|
||||||
{ id:5, name:"Dan", age: 40, createdAt: '2011-10-21', score: 0.03343 },
|
|
||||||
{ id:6, name:"John", age: 20, createdAt: '2011-10-31', score: 0.03343 },
|
|
||||||
],
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
|
@ -1,35 +0,0 @@
|
||||||
// .vuepress/components/sample-timeline.vue
|
|
||||||
<template>
|
|
||||||
<timeline timeline-theme="lightblue">
|
|
||||||
<timeline-title bg-color="#09FFAA">Prehistoric hunters cross over into Canada from Asia</timeline-title>
|
|
||||||
<timeline-item bg-color="#9dd8e0"> Leif Ericsson leads a Viking expedition to the New World</timeline-item>
|
|
||||||
<timeline-item bg-color="#9dFFe0">First Year 1B</timeline-item>
|
|
||||||
<timeline-item bg-color="#FFF000">Accepted Computer Engineering</timeline-item>
|
|
||||||
<timeline-item bg-color="#cFe8eF">The Iroquois Confederacy is formed</timeline-item>
|
|
||||||
<timeline-item bg-color="#97Aec8">John Cabot reaches Newfoundland (or perhaps Cape Breton)</timeline-item>
|
|
||||||
<timeline-item bg-color="#5744D4">Jacques Cartier first explores the St. Lawrence region</timeline-item>
|
|
||||||
<timeline-item bg-color="#0F4859">Second Year 2B</timeline-item>
|
|
||||||
<timeline-item bg-color="#094341">Samuel de Champlain establishes a French colony at Québec City</timeline-item>
|
|
||||||
<timeline-item bg-color="#825F03">Hudson’s Bay Company is formed</timeline-item>
|
|
||||||
<timeline-item bg-color="#954F08">Expulsion of the Acadians</timeline-item>
|
|
||||||
<timeline-item bg-color="#A71490">Battle of the Plains of Abraham: Québec City is captured</timeline-item>
|
|
||||||
<timeline-item bg-color="#C084A9">New France is formally ceded to Britain; Pontiac Rebellion erupts</timeline-item>
|
|
||||||
<timeline-item bg-color="#7B71C2">Loyalist refugees begin arriving after the American Revolution</timeline-item>
|
|
||||||
<timeline-item bg-color="#2348B1">War of 1812: U.S. invades Canada</timeline-item>
|
|
||||||
<timeline-item bg-color="#915F15">Rebellions against British rule in Upper and Lower Canada</timeline-item>
|
|
||||||
<timeline-item bg-color="#0909FA"> Responsible government is won, first in Nova Scotia, then in Canada</timeline-item>
|
|
||||||
</timeline>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { Timeline, TimelineItem, TimelineTitle } from 'vue-cute-timeline'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'sample-timeline',
|
|
||||||
components: {
|
|
||||||
Timeline,
|
|
||||||
TimelineItem,
|
|
||||||
TimelineTitle,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
|
@ -1,211 +0,0 @@
|
||||||
// .vuepress/config.js
|
|
||||||
// missing markdownItAds boostnote admonitions
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
const util = require('util')
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
base: '/vuepress-theme-cool-starter/',
|
|
||||||
theme: 'cool',
|
|
||||||
//dest: 'dist',
|
|
||||||
head: [
|
|
||||||
['link', { rel: 'icon', href: '/faviconCustom.ico' }],
|
|
||||||
['link', { rel: 'stylesheet', href: 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.5.1/katex.min.css' }],
|
|
||||||
['link', {href: 'https://fonts.googleapis.com/icon?family=Material+Icons', rel :'stylesheet'}]
|
|
||||||
],
|
|
||||||
plugins: [
|
|
||||||
'@vuepress/last-updated',
|
|
||||||
'@vuepress/back-to-top',
|
|
||||||
'@vuepress/pwa'
|
|
||||||
],
|
|
||||||
themeConfig: {
|
|
||||||
// logo: './myAvatar.png',
|
|
||||||
sidebar: genSideBar('.'),
|
|
||||||
sidebarDepth: 2,
|
|
||||||
displayAllHeaders: true, // Default: false themeConfig: {
|
|
||||||
nav: genNavBarList(),
|
|
||||||
lastUpdated: 'Last Updated', // string | boolean
|
|
||||||
// Assumes GitHub. Can also be a full GitLab url.
|
|
||||||
repo: 'FriendlyUser/vuepress-theme-cool-starter',
|
|
||||||
// Customising the header label
|
|
||||||
// Defaults to "GitHub"/"GitLab"/"Bitbucket" depending on `themeConfig.repo`
|
|
||||||
repoLabel: 'Contribute!',
|
|
||||||
// Optional options for generating "Edit this page" link
|
|
||||||
// if your docs are in a different repo from your main project:
|
|
||||||
//docsRepo: 'FriendlyUser/markdown-notes-template',
|
|
||||||
// if your docs are not at the root of the repo:
|
|
||||||
//docsDir: 'docs',
|
|
||||||
// if your docs are in a specific branch (defaults to 'master'):
|
|
||||||
docsBranch: 'gh-pages',
|
|
||||||
// defaults to false, set to true to enable
|
|
||||||
editLinks: true,
|
|
||||||
// custom text for edit link. Defaults to "Edit this page"
|
|
||||||
editLinkText: 'Help us improve this page!'
|
|
||||||
|
|
||||||
},
|
|
||||||
title: 'Vuepress Theme Cool Starter',
|
|
||||||
description: 'Example project to get started with the vuepress-theme-cool',
|
|
||||||
configureWebpack: {
|
|
||||||
resolve: {
|
|
||||||
alias: {
|
|
||||||
'@alias': '../img'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
plugins: {
|
|
||||||
'@vuepress/pwa': { serviceWorker: true,
|
|
||||||
updatePopup: {
|
|
||||||
message: "New content is available.",
|
|
||||||
buttonText: "Refresh"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
markdown: {
|
|
||||||
extendMarkdown: md => {
|
|
||||||
md.set({ html: true })
|
|
||||||
md.use(require('markdown-it-katex'))
|
|
||||||
md.use(require('markdown-it-plantuml'))
|
|
||||||
md.use(require('markdown-it-admonition'))
|
|
||||||
md.use(require('markdown-it-task-lists'))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Helper functions
|
|
||||||
function fromDir(startPath,filter,callback){
|
|
||||||
|
|
||||||
//console.log('Starting from dir '+startPath+'/');
|
|
||||||
if (!fs.existsSync(startPath)){
|
|
||||||
console.log("no dir ",startPath);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var files=fs.readdirSync(startPath);
|
|
||||||
for(var i=0;i<files.length;i++){
|
|
||||||
var filename=path.join(startPath,files[i]);
|
|
||||||
var stat = fs.lstatSync(filename);
|
|
||||||
if (stat.isDirectory()){
|
|
||||||
fromDir(filename,filter,callback); //recurse
|
|
||||||
}
|
|
||||||
else if (filter.test(filename)) callback(filename);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
function getDirectories(path) {
|
|
||||||
return fs.readdirSync(path).filter(function (file) {
|
|
||||||
if (file != '.vuepress') {
|
|
||||||
return fs.statSync(path+'/'+file).isDirectory();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getFilesInDir(directoryName) {
|
|
||||||
var files = []
|
|
||||||
// sidebar settings
|
|
||||||
const relPath = path.join('docs', directoryName)
|
|
||||||
fromDir(relPath,/\.md$/,function(filename){
|
|
||||||
console.log('-- found: ',filename);
|
|
||||||
files.push(filename)
|
|
||||||
});
|
|
||||||
return files
|
|
||||||
}
|
|
||||||
|
|
||||||
// Base file names with removed file extensions
|
|
||||||
function getFilesInDirBase(directoryName) {
|
|
||||||
var files = []
|
|
||||||
// sidebar settings
|
|
||||||
const relPath = path.join('docs', directoryName)
|
|
||||||
fromDir(relPath,/\.md$/,function(filename){
|
|
||||||
let baseName = path.basename(filename)
|
|
||||||
// this it will fail on files without extension, see https://stackoverflow.com/questions/4250364/how-to-trim-a-file-extension-from-a-string-in-javascript
|
|
||||||
baseName = baseName.split('.').slice(0, -1).join('.')
|
|
||||||
|
|
||||||
// Add README as '', and everything else as standard
|
|
||||||
if (baseName.toUpperCase() == 'README') {
|
|
||||||
files.push('Home')
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
files.push(baseName)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return files
|
|
||||||
}
|
|
||||||
|
|
||||||
// pass in the folder relative to the folder docs
|
|
||||||
function genSideBarConfigFolder (titleName, directoryName) {
|
|
||||||
const rawFilePaths = getFilesInDirBase(directoryName)
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
title: titleName,
|
|
||||||
collapsable: true,
|
|
||||||
children: rawFilePaths
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
function genSideBar (directoryName) {
|
|
||||||
const dirNames = getFilesInDirBase(directoryName)
|
|
||||||
let markdownArray = []
|
|
||||||
for (var i = 0; i < dirNames.length; i++) {
|
|
||||||
let stringValue = dirNames[i].toString()
|
|
||||||
if(stringValue === 'Home' || stringValue === '') {
|
|
||||||
markdownArray.push('')
|
|
||||||
} else {
|
|
||||||
markdownArray.push(stringValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const sideBarConfig = {
|
|
||||||
'/': markdownArray
|
|
||||||
}
|
|
||||||
console.log(sideBarConfig)
|
|
||||||
return sideBarConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
// doesn't work, fix later, can't figure out how to generate { text: link:} recursively? Or maybe have another function that returns text: link
|
|
||||||
function genNavBarList() {
|
|
||||||
let dirNames = []
|
|
||||||
// navbar settings
|
|
||||||
dirNames = getFilesInDirBase('.')
|
|
||||||
let navBarNames = [];
|
|
||||||
|
|
||||||
var numOfDirs = dirNames.length;
|
|
||||||
for (var i = 0; i < numOfDirs; i++) {
|
|
||||||
let stringValue = dirNames[i].toString()
|
|
||||||
// convert - to capitialization
|
|
||||||
stringValue = transformToUpperCase(stringValue)
|
|
||||||
let linkValue = '/'
|
|
||||||
if (stringValue !== 'Home') {
|
|
||||||
linkValue = `/${stringValue}/`
|
|
||||||
}
|
|
||||||
|
|
||||||
// @todo change loop to iterate for nested directories
|
|
||||||
if (true) {
|
|
||||||
navBarNames.push(genNavBarItem(stringValue,linkValue))
|
|
||||||
}
|
|
||||||
// last entry
|
|
||||||
else {
|
|
||||||
//navBarNames = navBarNames + "{ text : \'" + stringValue + "\', " + "link: " + "\'/" + stringValue + "/\'}, \n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return navBarNames
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function genNavBarItem(textValue, linkValue) {
|
|
||||||
return {
|
|
||||||
text: textValue,
|
|
||||||
link: linkValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function transformToUpperCase(str) {
|
|
||||||
let upperString = str
|
|
||||||
upperString = upperString.replace(/-/g, ' ');
|
|
||||||
upperString = upperString.split(" ");
|
|
||||||
for (var i = 0, x = upperString.length; i < x; i++) {
|
|
||||||
upperString[i] = upperString[i][0].toUpperCase() + upperString[i].substr(1);
|
|
||||||
}
|
|
||||||
return upperString.join(" ");
|
|
||||||
}
|
|
|
@ -1,118 +0,0 @@
|
||||||
// .vuepress/config.js
|
|
||||||
module.exports = {
|
|
||||||
plugins: [
|
|
||||||
'@vuepress/back-to-top',
|
|
||||||
'@vuepress/pwa',
|
|
||||||
{
|
|
||||||
serviceWorker: true,
|
|
||||||
updatePopup: true
|
|
||||||
},
|
|
||||||
,
|
|
||||||
['container', {
|
|
||||||
type: 'vue',
|
|
||||||
before: '<pre class="vue-container"><code>',
|
|
||||||
after: '</code></pre>'
|
|
||||||
}]
|
|
||||||
],
|
|
||||||
port: 3030,
|
|
||||||
base: '/edu-dis-labs/',
|
|
||||||
theme: 'cool',
|
|
||||||
// dest: 'dist',
|
|
||||||
head: [
|
|
||||||
['link', { rel: 'icon', href: '/favicon.ico' }],
|
|
||||||
['link', { rel: 'stylesheet', href: 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.5.1/katex.min.css' }],
|
|
||||||
['link', {href: 'https://fonts.googleapis.com/icon?family=Material+Icons', rel :'stylesheet'}],
|
|
||||||
|
|
||||||
],
|
|
||||||
themeConfig: {
|
|
||||||
// logo: './myAvatar.png',
|
|
||||||
sidebar: [
|
|
||||||
|
|
||||||
{
|
|
||||||
title: 'Вступ',
|
|
||||||
path:"/intro/"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: 'Розроблення вимог до системи',
|
|
||||||
path:"/requirements/",
|
|
||||||
children: [
|
|
||||||
"/requirements/state-of-the-art",
|
|
||||||
"/requirements/stakeholders-needs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: 'Розроблення вимог до функціональности системи',
|
|
||||||
path:"/use-cases/"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: 'Проєктування архітектури системи',
|
|
||||||
path:"/design/"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: 'Реалізація інформаційного та програмного забезпечення',
|
|
||||||
path:"/software/"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: 'Тестування працездатності системи',
|
|
||||||
path:"/test/"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: 'Висновки',
|
|
||||||
path:"/conclusion/"
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
],
|
|
||||||
sidebarDepth: 2,
|
|
||||||
displayAllHeaders: true, // Default: false
|
|
||||||
|
|
||||||
|
|
||||||
nav: [
|
|
||||||
{ text: 'Початок', link: '/' },
|
|
||||||
],
|
|
||||||
|
|
||||||
lastUpdated: 'Останнє оновлення', // string | boolean
|
|
||||||
// Assumes GitHub. Can also be a full GitLab url.
|
|
||||||
repo: 'http://139.162.162.130:3000/hasslesstech/edu-dis-labs',
|
|
||||||
// Customising the header label
|
|
||||||
// Defaults to "GitHub"/"GitLab"/"Bitbucket" depending on `themeConfig.repo`
|
|
||||||
repoLabel: 'Gitea',
|
|
||||||
|
|
||||||
// Optional options for generating "Edit this page" link
|
|
||||||
|
|
||||||
// if your docs are in a different repo from your main project:
|
|
||||||
// docsRepo: 'boldak/dis-edu',
|
|
||||||
// if your docs are not at the root of the repo:
|
|
||||||
docsDir: 'docs',
|
|
||||||
// if your docs are in a specific branch (defaults to 'master'):
|
|
||||||
docsBranch: 'master',
|
|
||||||
// defaults to false, set to true to enable
|
|
||||||
// editLinks: true,
|
|
||||||
// custom text for edit link. Defaults to "Edit this page"
|
|
||||||
// editLinkText: 'Ви можете покращити цю сторінку'
|
|
||||||
|
|
||||||
},
|
|
||||||
title: 'Xpertise',
|
|
||||||
description: 'Лабораторні роботи з дисципліни "Організація баз даних"',
|
|
||||||
configureWebpack: {
|
|
||||||
resolve: {
|
|
||||||
alias: {
|
|
||||||
'@alias': '../img'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
markdown: {
|
|
||||||
extendMarkdown: md => {
|
|
||||||
md.set({ html: true })
|
|
||||||
md.use(require('markdown-it-katex'))
|
|
||||||
md.use(require('markdown-it-plantuml'))
|
|
||||||
md.use(require('markdown-it-admonition'))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
import Vuex from 'vuex'
|
|
||||||
|
|
||||||
import VueChartkick from 'vue-chartkick'
|
|
||||||
import Chart from 'chart.js'
|
|
||||||
import VueGoodTablePlugin from 'vue-good-table';
|
|
||||||
|
|
||||||
// The styles are important in another component because of the way webpack is configured
|
|
||||||
// import 'vue-good-table/dist/vue-good-table.css'
|
|
||||||
export default ({ Vue, options, router, siteData }) => {
|
|
||||||
Vue.use(Vuex)
|
|
||||||
Vue.use(VueChartkick, {adapter: Chart})
|
|
||||||
Vue.use(VueGoodTablePlugin)
|
|
||||||
Vue.mixin({
|
|
||||||
computed: {
|
|
||||||
$title() {
|
|
||||||
const page = this.$page
|
|
||||||
const siteTitle = this.$siteTitle
|
|
||||||
const selfTitle = page.frontmatter.home ? null : (
|
|
||||||
page.frontmatter.title || // explicit title
|
|
||||||
(page.title ? page.title.replace(/[_`]/g, '') : '') // inferred title
|
|
||||||
)
|
|
||||||
return siteTitle
|
|
||||||
? selfTitle
|
|
||||||
? (selfTitle + ' | ' + siteTitle)
|
|
||||||
: siteTitle
|
|
||||||
: selfTitle || 'VuePress'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
Before Width: | Height: | Size: 278 KiB |
Before Width: | Height: | Size: 232 KiB |
Before Width: | Height: | Size: 236 KiB |
Before Width: | Height: | Size: 218 KiB |
Before Width: | Height: | Size: 264 KiB |
Before Width: | Height: | Size: 246 KiB |
Before Width: | Height: | Size: 273 KiB |
Before Width: | Height: | Size: 281 KiB |
Before Width: | Height: | Size: 247 KiB |
Before Width: | Height: | Size: 262 KiB |
Before Width: | Height: | Size: 266 KiB |
Before Width: | Height: | Size: 125 KiB |
Before Width: | Height: | Size: 139 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 163 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 266 KiB |
Before Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 214 KiB |
Before Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 314 KiB |
Before Width: | Height: | Size: 121 KiB |
Before Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 162 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 243 KiB |
Before Width: | Height: | Size: 274 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 31 KiB |
|
@ -1,16 +0,0 @@
|
||||||
<pre>
|
|
||||||
|
|
||||||
Copyright 2021 Andrey Boldak Licensed under the
|
|
||||||
Educational Community License, Version 2.0 (the "License"); you may
|
|
||||||
not use this file except in compliance with the License. You may
|
|
||||||
obtain a copy of the License at
|
|
||||||
|
|
||||||
https://opensource.org/licenses/ECL-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an "AS IS"
|
|
||||||
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
|
||||||
or implied. See the License for the specific language governing
|
|
||||||
permissions and limitations under the License.
|
|
||||||
|
|
||||||
</pre>
|
|
Before Width: | Height: | Size: 1.5 KiB |
|
@ -1,7 +0,0 @@
|
||||||
import quiz1 from './quiz1.json'
|
|
||||||
import quiz2 from './quiz2.json'
|
|
||||||
|
|
||||||
export {
|
|
||||||
quiz1,
|
|
||||||
quiz2
|
|
||||||
}
|
|
|
@ -1,185 +0,0 @@
|
||||||
{
|
|
||||||
"user": "Dave",
|
|
||||||
"questions": [
|
|
||||||
{
|
|
||||||
"text": "What is the full form of HTTP?",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "Hyper text transfer package"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Hyper text transfer protocol",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Hyphenation text test program"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "None of the above"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "HTML document start and end with which tag pairs?",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "HTML",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "WEB"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "HEAD"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "BODY"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Which tag is used to create body text in HTML?",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "HEAD"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "BODY",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "TITLE"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "TEXT"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Outlook Express is _________",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "E-Mail Client",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Browser"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Search Engine"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "None of the above"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "What is a search engine?",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "A hardware component "
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "A machinery engine that search data"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "A web site that searches anything",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "A program that searches engines"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "What does the .com domain represents?",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "Network"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Education"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Commercial",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "None of the above"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "In Satellite based communication, VSAT stands for? ",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": " Very Small Aperture Terminal",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Varying Size Aperture Terminal "
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Very Small Analog Terminal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "None of the above"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "What is the full form of TCP/IP? ",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "Telephone call protocol / international protocol"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Transmission control protocol / internet protocol",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Transport control protocol / internet protocol "
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "None of the above"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "What is the full form of HTML?",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "Hyper text marking language"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Hyphenation text markup language "
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Hyper text markup language",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Hyphenation test marking language"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "\"Yahoo\", \"Infoseek\" and \"Lycos\" are _________?",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "Browsers "
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Search Engines",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "News Group"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "None of the above"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
{
|
|
||||||
"user": "Dave",
|
|
||||||
"questions": [
|
|
||||||
{
|
|
||||||
"text": "Who is the Batman",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "Laughing Bat"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Bruce Wayne",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Dick Grayson"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "None of the above"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "\"Yahoo\", \"Infoseek\" and \"Lycos\" are _________?",
|
|
||||||
"responses": [
|
|
||||||
{
|
|
||||||
"text": "Browsers "
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Search Engines",
|
|
||||||
"correct": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "News Group"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "None of the above"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,179 +0,0 @@
|
||||||
@import url(https://fonts.googleapis.com/icon?family=Material+Icons)
|
|
||||||
.admonition.note,
|
|
||||||
.admonition.hint,
|
|
||||||
.admonition.danger,
|
|
||||||
.admonition.caution,
|
|
||||||
.admonition.error,
|
|
||||||
.admonition.attention {
|
|
||||||
box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 1px 5px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.2);
|
|
||||||
position: relative;
|
|
||||||
margin: 1.5625em 0;
|
|
||||||
padding: 0 1.2rem;
|
|
||||||
border-left: 0.4rem solid #448aff;
|
|
||||||
border-radius: 0.2rem;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
html .admonition>:last-child {
|
|
||||||
margin-bottom: 1.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition .admonition {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition p {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.note>.admonition-title:before,
|
|
||||||
.admonition.hint>.admonition-title:before,
|
|
||||||
.admonition.danger>.admonition-title:before,
|
|
||||||
.admonition.caution>.admonition-title:before,
|
|
||||||
.admonition.error>.admonition-title:before,
|
|
||||||
.admonition.attention>.admonition-title:before {
|
|
||||||
position: absolute;
|
|
||||||
left: 1.2rem;
|
|
||||||
font-family: "Material Icons";
|
|
||||||
font-size: 24px;
|
|
||||||
display: inline-block;
|
|
||||||
line-height: 1;
|
|
||||||
text-transform: none;
|
|
||||||
letter-spacing: normal;
|
|
||||||
word-wrap: normal;
|
|
||||||
white-space: nowrap;
|
|
||||||
direction: ltr;
|
|
||||||
/* Support for all WebKit browsers. */
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
/* Support for Safari and Chrome. */
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
/* Support for Firefox. */
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
/* Support for IE. */
|
|
||||||
font-feature-settings: 'liga';
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.note>.admonition-title,
|
|
||||||
.admonition.hint>.admonition-title,
|
|
||||||
.admonition.danger>.admonition-title,
|
|
||||||
.admonition.caution>.admonition-title,
|
|
||||||
.admonition.error>.admonition-title,
|
|
||||||
.admonition.attention>.admonition-title {
|
|
||||||
margin: 0 -1.2rem;
|
|
||||||
padding: 0.8rem 1.2rem 0.8rem 4rem;
|
|
||||||
border-bottom: 0.1rem solid rgba(68,138,255,0.1);
|
|
||||||
background-color: rgba(68,138,255,0.1);
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition>.admonition-title:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.note {
|
|
||||||
border-left-color: #448aff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.note>.admonition-title {
|
|
||||||
border-bottom-color: 0.1rem solid rgba(68,138,255,0.1);
|
|
||||||
background-color: rgba(68,138,255,0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.note>.admonition-title:before {
|
|
||||||
color: #448aff;
|
|
||||||
content: "note";
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.hint {
|
|
||||||
border-left-color: #00bfa5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.hint>.admonition-title {
|
|
||||||
border-bottom-color: 0.1rem solid rgba(0,191,165,0.1);
|
|
||||||
background-color: rgba(0,191,165,0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.hint>.admonition-title:before {
|
|
||||||
color: #00bfa5;
|
|
||||||
content: "info";
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.danger {
|
|
||||||
border-left-color: #ff1744;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.danger>.admonition-title {
|
|
||||||
border-bottom-color: 0.1rem solid rgba(255,23,68,0.1);
|
|
||||||
background-color: rgba(255,23,68,0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.danger>.admonition-title:before {
|
|
||||||
color: #ff1744;
|
|
||||||
content: "block";
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.caution {
|
|
||||||
border-left-color: #ff9100;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.caution>.admonition-title {
|
|
||||||
border-bottom-color: 0.1rem solid rgba(255,145,0,0.1);
|
|
||||||
background-color: rgba(255,145,0,0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.caution>.admonition-title:before {
|
|
||||||
color: #ff9100;
|
|
||||||
content: "warning";
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.error {
|
|
||||||
border-left-color: #ff1744;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.error>.admonition-title {
|
|
||||||
border-bottom-color: 0.1rem solid rgba(255,23,68,0.1);
|
|
||||||
background-color: rgba(255,23,68,0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.error>.admonition-title:before {
|
|
||||||
color: #ff1744;
|
|
||||||
content: "error";
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.attention {
|
|
||||||
border-left-color: #64dd17;
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.attention>.admonition-title {
|
|
||||||
border-bottom-color: 0.1rem solid rgba(100,221,23,0.1);
|
|
||||||
background-color: rgba(100,221,23,0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.admonition.attention>.admonition-title:before {
|
|
||||||
color: #64dd17;
|
|
||||||
content: "priority_high";
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-size 16px;
|
|
||||||
text-align: justify;
|
|
||||||
}
|
|
||||||
|
|
||||||
.theme-default-content:not(.custom) {
|
|
||||||
max-width: 950px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-heading {
|
|
||||||
color: #2c3e50;
|
|
||||||
transition: color 0.15s ease;
|
|
||||||
cursor: pointer;
|
|
||||||
font-size: 1em !important;
|
|
||||||
font-weight: 500 !important;
|
|
||||||
padding: 0.35rem 1.5rem 0.35rem 1.25rem;
|
|
||||||
width: 100%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
margin: 0;
|
|
||||||
border-left: 0.25rem solid transparent;
|
|
||||||
}
|
|
|
@ -1,89 +0,0 @@
|
||||||
// showing default values
|
|
||||||
$accentColor = #0984e3
|
|
||||||
$textColor = #2c3e50
|
|
||||||
$borderColor = #eaecef
|
|
||||||
$codeBgColor = #282c34
|
|
||||||
|
|
||||||
$admonition
|
|
||||||
box-shadow 0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)
|
|
||||||
position relative
|
|
||||||
margin 1.5625em 0
|
|
||||||
padding 0 1.2rem
|
|
||||||
border-left .4rem solid #448aff
|
|
||||||
border-radius .2rem
|
|
||||||
overflow auto
|
|
||||||
|
|
||||||
html .admonition>:last-child
|
|
||||||
margin-bottom 1.2rem
|
|
||||||
|
|
||||||
.admonition .admonition
|
|
||||||
margin 1em 0
|
|
||||||
|
|
||||||
.admonition p
|
|
||||||
margin-top: 0.5em
|
|
||||||
|
|
||||||
$admonition-icon
|
|
||||||
position absolute
|
|
||||||
left 1.2rem
|
|
||||||
font-family: "Material Icons"
|
|
||||||
font-weight: normal;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 24px
|
|
||||||
display: inline-block;
|
|
||||||
line-height: 1;
|
|
||||||
text-transform: none;
|
|
||||||
letter-spacing: normal;
|
|
||||||
word-wrap: normal;
|
|
||||||
white-space: nowrap;
|
|
||||||
direction: ltr;
|
|
||||||
|
|
||||||
/* Support for all WebKit browsers. */
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
/* Support for Safari and Chrome. */
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
|
|
||||||
/* Support for Firefox. */
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
|
|
||||||
/* Support for IE. */
|
|
||||||
font-feature-settings: 'liga';
|
|
||||||
|
|
||||||
$admonition-title
|
|
||||||
margin 0 -1.2rem
|
|
||||||
padding .8rem 1.2rem .8rem 4rem
|
|
||||||
border-bottom .1rem solid rgba(68,138,255,.1)
|
|
||||||
background-color rgba(68,138,255,.1)
|
|
||||||
font-weight 700
|
|
||||||
|
|
||||||
.admonition>.admonition-title:last-child
|
|
||||||
margin-bottom 0
|
|
||||||
|
|
||||||
admonition_types = {
|
|
||||||
note: {color: #0288D1, icon: "edit_sharp"},
|
|
||||||
abstract: {color: #c5d845, icon: "speaker_notes_filled"},
|
|
||||||
info: {color: #19d8f5, icon: "info"}
|
|
||||||
tip: {color: #00bfa5, icon: "code"},
|
|
||||||
success: {color: #00c853, icon: "check_circle_outline"},
|
|
||||||
question: {color: #64dd17, icon: "help"},
|
|
||||||
warning: {color: #ff9100, icon: "warning"},
|
|
||||||
failure: {color: #ff5252, icon: "close"},
|
|
||||||
danger: {color: #c2185b, icon: "flash_on"},
|
|
||||||
bug: {color: #e040fb, icon: "bug_report"},
|
|
||||||
example: {color: #651fff, icon: "format_list_numbered_rtl"},
|
|
||||||
quote: {color: #9e9e9e, icon: "format_quote"}
|
|
||||||
}
|
|
||||||
|
|
||||||
for name, val in admonition_types
|
|
||||||
.admonition.{name}
|
|
||||||
@extend $admonition
|
|
||||||
border-left-color: val[color]
|
|
||||||
|
|
||||||
.admonition.{name}>.admonition-title
|
|
||||||
@extend $admonition-title
|
|
||||||
border-bottom-color: .1rem solid rgba(val[color], 0.2)
|
|
||||||
background-color: rgba(val[color], 0.2)
|
|
||||||
|
|
||||||
.admonition.{name}>.admonition-title:before
|
|
||||||
@extend $admonition-icon
|
|
||||||
color: val[color]
|
|
||||||
content: val[icon]
|
|
|
@ -1,26 +1,26 @@
|
||||||
---
|
---
|
||||||
home: true
|
home: true
|
||||||
actionText: Розпочати →
|
actionText: Розпочати →
|
||||||
actionLink: /intro/
|
actionLink: /intro/
|
||||||
|
|
||||||
footer: "ECL 2.0 Licensed | Copyright © 2024 [Your Name]"
|
footer: "ECL 2.0 Licensed | Copyright © 2024 [Your Name]"
|
||||||
---
|
---
|
||||||
|
|
||||||
**Виконала:**
|
**Виконала:**
|
||||||
|
|
||||||
*студентка 2-го курсу, групи ІО-23:*
|
*студентка 2-го курсу, групи ІО-23:*
|
||||||
|
|
||||||
*Вікторія ВОДЯНА [vodyanayaviktoria@gmail.com, [@victoriavodyana](https://t.me/victoriavodyana)]*
|
*Вікторія ВОДЯНА [vodyanayaviktoria@gmail.com, [@victoriavodyana](https://t.me/victoriavodyana)]*
|
||||||
|
|
||||||
|
|
||||||
**Керівник**
|
**Керівник**
|
||||||
|
|
||||||
*доцент кафедри ОТ ФІОТ, к.т.н., доцент*<span padding-right:5em></span> **Андрій БОЛДАК**
|
*доцент кафедри ОТ ФІОТ, к.т.н., доцент*<span padding-right:5em></span> **Андрій БОЛДАК**
|
||||||
|
|
||||||
[НТУУ "КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ імені ІГОРЯ СІКОРСЬКОГО](https://kpi.ua/)
|
[НТУУ "КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ імені ІГОРЯ СІКОРСЬКОГО](https://kpi.ua/)
|
||||||
|
|
||||||
[Факультет інформатики та обчислювальної техніки](https://fiot.kpi.ua/)
|
[Факультет інформатики та обчислювальної техніки](https://fiot.kpi.ua/)
|
||||||
|
|
||||||
[Кафедра обчислювальної техніки](https://comsys.kpi.ua/)
|
[Кафедра обчислювальної техніки](https://comsys.kpi.ua/)
|
||||||
|
|
||||||
Київ
|
Київ
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
# Висновки
|
# Висновки
|
||||||
|
|
||||||
У цьому проєкті була використана локальна база даних для зберігання інформації. Розроблена серверна частина надає RESTful-інтерфейс для доступу до цієї бази даних. Цей інтерфейс може використовуватися для взаємодії з таблицею питань (survey), що дозволяє здійснювати операції читання, запису, оновлення та видалення даних через HTTP-запити. Такий підхід забезпечує зручний та ефективний спосіб взаємодії з базою даних і відкриває широкі можливості для розвитку та розширення функціональності системи.
|
У цьому проєкті була використана локальна база даних для зберігання інформації. Розроблена серверна частина надає RESTful-інтерфейс для доступу до цієї бази даних. Цей інтерфейс може використовуватися для взаємодії з таблицею питань (survey), що дозволяє здійснювати операції читання, запису, оновлення та видалення даних через HTTP-запити. Такий підхід забезпечує зручний та ефективний спосіб взаємодії з базою даних і відкриває широкі можливості для розвитку та розширення функціональності системи.
|
||||||
|
|
||||||
|
|
||||||
Технічне рішення, що покладене в основу проєкту, полягає у використанні мови програмування Python та веб-фреймворку Flask для створення RESTful сервісу. Це дозволило забезпечити швидку реалізацію системи та забезпечити її продуктивність та масштабованість.
|
Технічне рішення, що покладене в основу проєкту, полягає у використанні мови програмування Python та веб-фреймворку Flask для створення RESTful сервісу. Це дозволило забезпечити швидку реалізацію системи та забезпечити її продуктивність та масштабованість.
|
||||||
|
|
||||||
Отримана система дозволяє автоматизувати процес збору та аналізу відповідей, що значно знижує час та ресурси, необхідні для проведення таких опитувань. Завдяки використанню сучасних технологій, таких як Flask, система має високу продуктивність та може легко масштабуватися відповідно до потреб користувачів.
|
Отримана система дозволяє автоматизувати процес збору та аналізу відповідей, що значно знижує час та ресурси, необхідні для проведення таких опитувань. Завдяки використанню сучасних технологій, таких як Flask, система має високу продуктивність та може легко масштабуватися відповідно до потреб користувачів.
|
||||||
|
|
||||||
|
|
|
@ -1,130 +1,130 @@
|
||||||
# Проєктування бази даних
|
# Проєктування бази даних
|
||||||
|
|
||||||
## BE модель
|
## BE модель
|
||||||
|
|
||||||
<center style="
|
<center style="
|
||||||
border-radius:4px;
|
border-radius:4px;
|
||||||
border: 1px solid #cfd7e6;
|
border: 1px solid #cfd7e6;
|
||||||
box-shadow: 0 1px 3px 0 rgba(89,105,129,.05), 0 1px 1px 0 rgba(0,0,0,.025);
|
box-shadow: 0 1px 3px 0 rgba(89,105,129,.05), 0 1px 1px 0 rgba(0,0,0,.025);
|
||||||
padding: 1em;"
|
padding: 1em;"
|
||||||
>
|
>
|
||||||
|
|
||||||
@startuml
|
@startuml
|
||||||
|
|
||||||
entity Account <<ENTITY>>
|
entity Account <<ENTITY>>
|
||||||
entity Account.username <<TEXT>>
|
entity Account.username <<TEXT>>
|
||||||
entity Account.password <<TEXT>>
|
entity Account.password <<TEXT>>
|
||||||
|
|
||||||
entity Survey <<ENTITY>>
|
entity Survey <<ENTITY>>
|
||||||
entity Survey.name <<TEXT>>
|
entity Survey.name <<TEXT>>
|
||||||
entity Survey.duration <<TEXT>>
|
entity Survey.duration <<TEXT>>
|
||||||
entity Survey.isPaused <<BOOLEAN>>
|
entity Survey.isPaused <<BOOLEAN>>
|
||||||
entity Survey.isNamed <<BOOLEAN>>
|
entity Survey.isNamed <<BOOLEAN>>
|
||||||
|
|
||||||
entity Question <<ENTITY>>
|
entity Question <<ENTITY>>
|
||||||
entity Question.text <<TEXT>>
|
entity Question.text <<TEXT>>
|
||||||
|
|
||||||
entity Responce <<ENTITY>>
|
entity Responce <<ENTITY>>
|
||||||
entity Responce.value <<TEXT>>
|
entity Responce.value <<TEXT>>
|
||||||
|
|
||||||
entity Link <<ENTITY>>
|
entity Link <<ENTITY>>
|
||||||
entity Link.usageLimit <<INT>>
|
entity Link.usageLimit <<INT>>
|
||||||
entity Link.responceLimit <<INT>>
|
entity Link.responceLimit <<INT>>
|
||||||
entity Link.uses <<INT>>
|
entity Link.uses <<INT>>
|
||||||
entity Link.responces <<INT>>
|
entity Link.responces <<INT>>
|
||||||
entity Link.path <<TEXT>>
|
entity Link.path <<TEXT>>
|
||||||
|
|
||||||
Account.username --* Account
|
Account.username --* Account
|
||||||
Account.password --* Account
|
Account.password --* Account
|
||||||
|
|
||||||
Survey.name --* Survey
|
Survey.name --* Survey
|
||||||
Survey.duration --* Survey
|
Survey.duration --* Survey
|
||||||
Survey.isPaused --* Survey
|
Survey.isPaused --* Survey
|
||||||
Survey.isNamed --* Survey
|
Survey.isNamed --* Survey
|
||||||
|
|
||||||
Link.usageLimit -u-* Link
|
Link.usageLimit -u-* Link
|
||||||
Link.responceLimit -u-* Link
|
Link.responceLimit -u-* Link
|
||||||
Link.uses --* Link
|
Link.uses --* Link
|
||||||
Link.responces --* Link
|
Link.responces --* Link
|
||||||
Link.path -u-* Link
|
Link.path -u-* Link
|
||||||
|
|
||||||
Responce.value -u-* Responce
|
Responce.value -u-* Responce
|
||||||
|
|
||||||
Question.text -u-* Question
|
Question.text -u-* Question
|
||||||
|
|
||||||
Account "1,1" -- "0,*" Survey
|
Account "1,1" -- "0,*" Survey
|
||||||
Survey "1,1" -- "0,*" Question
|
Survey "1,1" -- "0,*" Question
|
||||||
Question "1,1" -r- "0,*" Responce
|
Question "1,1" -r- "0,*" Responce
|
||||||
Account "0,1" -r- "0,*" Responce
|
Account "0,1" -r- "0,*" Responce
|
||||||
Link "0,*" -- "1,1" Survey
|
Link "0,*" -- "1,1" Survey
|
||||||
|
|
||||||
@enduml
|
@enduml
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
## ER-модель
|
## ER-модель
|
||||||
|
|
||||||
<center style="
|
<center style="
|
||||||
border-radius:4px;
|
border-radius:4px;
|
||||||
border: 1px solid #cfd7e6;
|
border: 1px solid #cfd7e6;
|
||||||
box-shadow: 0 1px 3px 0 rgba(89,105,129,.05), 0 1px 1px 0 rgba(0,0,0,.025);
|
box-shadow: 0 1px 3px 0 rgba(89,105,129,.05), 0 1px 1px 0 rgba(0,0,0,.025);
|
||||||
padding: 1em;"
|
padding: 1em;"
|
||||||
>
|
>
|
||||||
|
|
||||||
@startuml
|
@startuml
|
||||||
|
|
||||||
entity Account <<ENTITY>> {
|
entity Account <<ENTITY>> {
|
||||||
id:INT
|
id:INT
|
||||||
username:CHAR(64)
|
username:CHAR(64)
|
||||||
password:CHAR(256)
|
password:CHAR(256)
|
||||||
}
|
}
|
||||||
|
|
||||||
entity Responce <<ENTITY>> {
|
entity Responce <<ENTITY>> {
|
||||||
id:INT
|
id:INT
|
||||||
value:CHAR(16384)
|
value:CHAR(16384)
|
||||||
}
|
}
|
||||||
|
|
||||||
entity Question <<ENTITY>> {
|
entity Question <<ENTITY>> {
|
||||||
id:INT
|
id:INT
|
||||||
text:CHAR(256)
|
text:CHAR(256)
|
||||||
}
|
}
|
||||||
|
|
||||||
entity Survey <<ENTITY>> {
|
entity Survey <<ENTITY>> {
|
||||||
id:INT
|
id:INT
|
||||||
name:CHAR(256)
|
name:CHAR(256)
|
||||||
duration:CHAR(256)
|
duration:CHAR(256)
|
||||||
isPaused:BOOLEAN
|
isPaused:BOOLEAN
|
||||||
isNamed:BOOLEAN
|
isNamed:BOOLEAN
|
||||||
}
|
}
|
||||||
|
|
||||||
entity Link <<ENTITY>> {
|
entity Link <<ENTITY>> {
|
||||||
id:INT
|
id:INT
|
||||||
uses:INT
|
uses:INT
|
||||||
responces:INT
|
responces:INT
|
||||||
usageLimit:INT
|
usageLimit:INT
|
||||||
responceLimit:INT
|
responceLimit:INT
|
||||||
path:CHAR(32)
|
path:CHAR(32)
|
||||||
}
|
}
|
||||||
|
|
||||||
Responce "0,*" --> "1,1" Question
|
Responce "0,*" --> "1,1" Question
|
||||||
Question "0,*" --> "1,1" Survey
|
Question "0,*" --> "1,1" Survey
|
||||||
Survey "0,*" --> "1,1" Account
|
Survey "0,*" --> "1,1" Account
|
||||||
Link "0,*" --> "1,1" Survey
|
Link "0,*" --> "1,1" Survey
|
||||||
Responce "0,*" --> "0,1" Account
|
Responce "0,*" --> "0,1" Account
|
||||||
|
|
||||||
@enduml
|
@enduml
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
## Реляційна схема
|
## Реляційна схема
|
||||||
|
|
||||||
<center style="
|
<center style="
|
||||||
border-radius:4px;
|
border-radius:4px;
|
||||||
border: 1px solid #cfd7e6;
|
border: 1px solid #cfd7e6;
|
||||||
box-shadow: 0 1px 3px 0 rgba(89,105,129,.05), 0 1px 1px 0 rgba(0,0,0,.025);
|
box-shadow: 0 1px 3px 0 rgba(89,105,129,.05), 0 1px 1px 0 rgba(0,0,0,.025);
|
||||||
padding: 1em;"
|
padding: 1em;"
|
||||||
>
|
>
|
||||||
|
|
||||||
![relational_schema](./relational_scheme.png)
|
![relational_schema](./relational_scheme.png)
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
# Вступ
|
# Вступ
|
||||||
|
|
||||||
У вступі описується мета роботи і розглядається поставлене завдання з позиції її
|
У вступі описується мета роботи і розглядається поставлене завдання з позиції її
|
||||||
актуальності, значення її розв’язання для тієї предметної області, до якої відноситься
|
актуальності, значення її розв’язання для тієї предметної області, до якої відноситься
|
||||||
тема бакалаврського проєкту.
|
тема бакалаврського проєкту.
|
||||||
|
|
||||||
Коротко характеризується сучасний рівень розв’язання
|
Коротко характеризується сучасний рівень розв’язання
|
||||||
даного завдання і взаємозв’язок з іншими проєктами по цій тематиці.
|
даного завдання і взаємозв’язок з іншими проєктами по цій тематиці.
|
||||||
|
|
||||||
Наводяться
|
Наводяться
|
||||||
основні технічні характеристики розробки й очікуваний технічно-економічний ефект
|
основні технічні характеристики розробки й очікуваний технічно-економічний ефект
|
||||||
від її реалізації.
|
від її реалізації.
|
|
@ -1,4 +1,4 @@
|
||||||
# Розроблення загальних вимог до системи
|
# Розроблення загальних вимог до системи
|
||||||
|
|
||||||
- [Аналіз предметної області](state-of-the-art.md)
|
- [Аналіз предметної області](state-of-the-art.md)
|
||||||
- [Запити зацікавлених осіб](stakeholders-needs.md)
|
- [Запити зацікавлених осіб](stakeholders-needs.md)
|
||||||
|
|
|
@ -1,281 +1,281 @@
|
||||||
# Запити зацікавлених осіб
|
# Запити зацікавлених осіб
|
||||||
|
|
||||||
## Вступ
|
## Вступ
|
||||||
|
|
||||||
У даному розділі розкриваються ключові терміни та процеси, пов'язані з розробкою високоякісного програмного забезпечення. Ці матеріали надаються для зацікавлених користувачів, які прагнуть отримати глибше розуміння суті проекту та його основних завдань.
|
У даному розділі розкриваються ключові терміни та процеси, пов'язані з розробкою високоякісного програмного забезпечення. Ці матеріали надаються для зацікавлених користувачів, які прагнуть отримати глибше розуміння суті проекту та його основних завдань.
|
||||||
|
|
||||||
### Мета
|
### Мета
|
||||||
|
|
||||||
Метою є формування стратегії подальшого розвитку проекту на основі аналізу запитів цільової аудиторії, функціональних потреб та досягнення оптимальної продуктивності для створення якісного програмного забезпечення.
|
Метою є формування стратегії подальшого розвитку проекту на основі аналізу запитів цільової аудиторії, функціональних потреб та досягнення оптимальної продуктивності для створення якісного програмного забезпечення.
|
||||||
|
|
||||||
### Контекст
|
### Контекст
|
||||||
|
|
||||||
Даний документ містить теоретичні відомості, визначення та загальний огляд функціональності, які допоможуть розробникам розуміти напрямок роботи над програмним продуктом, а клієнтам - зрозуміти очікування від нього.
|
Даний документ містить теоретичні відомості, визначення та загальний огляд функціональності, які допоможуть розробникам розуміти напрямок роботи над програмним продуктом, а клієнтам - зрозуміти очікування від нього.
|
||||||
|
|
||||||
|
|
||||||
### Основні визначення та скорочення
|
### Основні визначення та скорочення
|
||||||
|
|
||||||
[Зацікавлені сторони (особи)](https://uk.wikipedia.org/wiki/Зацікавлені_сторони) - фізичні та юридичні особи, які мають легітимний інтерес у діяльності організації, тобто певною мірою залежать від неї або можуть впливати на її діяльність.
|
[Зацікавлені сторони (особи)](https://uk.wikipedia.org/wiki/Зацікавлені_сторони) - фізичні та юридичні особи, які мають легітимний інтерес у діяльності організації, тобто певною мірою залежать від неї або можуть впливати на її діяльність.
|
||||||
|
|
||||||
[FURPS](https://en.wikipedia.org/wiki/FURPS) - абревіатура, що репрезентує модель класифікації якостей програмного забезпечення (функціональні і нефункціональні вимоги):
|
[FURPS](https://en.wikipedia.org/wiki/FURPS) - абревіатура, що репрезентує модель класифікації якостей програмного забезпечення (функціональні і нефункціональні вимоги):
|
||||||
- *Functionality* (Функціональність) - можливості (розмір та загальний набір функцій), повторне використання (сумісність, інтероперабельність, портативність), безпека (безпека та можливість експлуатації);
|
- *Functionality* (Функціональність) - можливості (розмір та загальний набір функцій), повторне використання (сумісність, інтероперабельність, портативність), безпека (безпека та можливість експлуатації);
|
||||||
- *Usability* (Використовуваність) (UX) - людський фактор, естетика, узгодженість, документація, швидкість реагування;
|
- *Usability* (Використовуваність) (UX) - людський фактор, естетика, узгодженість, документація, швидкість реагування;
|
||||||
- *Reliability* (Надійність) - доступність (частота відмов (надійність/довговічність/стійкість), ступінь і тривалість відмов (відновлюваність/живучість)), передбачуваність (стабільність), точність (частота/серйозність помилок);
|
- *Reliability* (Надійність) - доступність (частота відмов (надійність/довговічність/стійкість), ступінь і тривалість відмов (відновлюваність/живучість)), передбачуваність (стабільність), точність (частота/серйозність помилок);
|
||||||
- *Perfomance* (Продуктивність) - швидкість, ефективність, споживання ресурсів (живлення, оперативна пам'ять, кеш і т.д.), пропускна здатність, ємність, масштабованість;
|
- *Perfomance* (Продуктивність) - швидкість, ефективність, споживання ресурсів (живлення, оперативна пам'ять, кеш і т.д.), пропускна здатність, ємність, масштабованість;
|
||||||
- *Supportability* (Підтримка) (ремонтопридатність, підтримуваність, стійкість, швидкість відновлення) - тестуємість, гнучкість (модифікованість, конфігурованість, адаптованість, розширюваність, модульність), встановлюваність, локалізованість.
|
- *Supportability* (Підтримка) (ремонтопридатність, підтримуваність, стійкість, швидкість відновлення) - тестуємість, гнучкість (модифікованість, конфігурованість, адаптованість, розширюваність, модульність), встановлюваність, локалізованість.
|
||||||
|
|
||||||
[API](https://uk.wikipedia.org/wiki/Прикладний_програмний_інтерфейс) (з англ. application programming interface “прикладни́й програ́мний інтерфе́йс”) - підхід до архітектури мережевих протоколів, які надають доступ до інформаційних ресурсів.
|
[API](https://uk.wikipedia.org/wiki/Прикладний_програмний_інтерфейс) (з англ. application programming interface “прикладни́й програ́мний інтерфе́йс”) - підхід до архітектури мережевих протоколів, які надають доступ до інформаційних ресурсів.
|
||||||
|
|
||||||
[REST](https://uk.wikipedia.org/wiki/REST) (з англ. Representational State Transfer, «передача репрезентативного стану») — підхід до архітектури мережевих протоколів, які надають доступ до інформаційних ресурсів.
|
[REST](https://uk.wikipedia.org/wiki/REST) (з англ. Representational State Transfer, «передача репрезентативного стану») — підхід до архітектури мережевих протоколів, які надають доступ до інформаційних ресурсів.
|
||||||
|
|
||||||
[MVC](https://en.wikipedia.org/wiki/Model–view–controller#Components) (з англ. Model-view-controller) - це патерн проектування програмного забезпечення, який зазвичай використовується для розробки користувацьких інтерфейсів, що розділяє відповідну програмну логіку на три взаємопов'язані елементи. Це робиться для того, щоб відокремити внутрішнє представлення інформації від способів її представлення користувачеві та отримання від нього.
|
[MVC](https://en.wikipedia.org/wiki/Model–view–controller#Components) (з англ. Model-view-controller) - це патерн проектування програмного забезпечення, який зазвичай використовується для розробки користувацьких інтерфейсів, що розділяє відповідну програмну логіку на три взаємопов'язані елементи. Це робиться для того, щоб відокремити внутрішнє представлення інформації від способів її представлення користувачеві та отримання від нього.
|
||||||
|
|
||||||
[SOLID](https://en.wikipedia.org/wiki/SOLID) - це мнемонічна абревіатура для п'яти принципів проектування, призначених для того, щоб зробити об'єктно-орієнтовані проекти більш зрозумілими, гнучкими та зручними в обслуговуванні.
|
[SOLID](https://en.wikipedia.org/wiki/SOLID) - це мнемонічна абревіатура для п'яти принципів проектування, призначених для того, щоб зробити об'єктно-орієнтовані проекти більш зрозумілими, гнучкими та зручними в обслуговуванні.
|
||||||
- *Принцип єдиної відповідальності*: "Ніколи не повинно бути більше однієї причини для зміни класу”. Іншими словами, кожен клас повинен мати лише одну відповідальність.
|
- *Принцип єдиної відповідальності*: "Ніколи не повинно бути більше однієї причини для зміни класу”. Іншими словами, кожен клас повинен мати лише одну відповідальність.
|
||||||
- *Принцип відкритості-закритості*: "Сутності програмного забезпечення ... повинні бути відкритими для розширення, але закритими для модифікації.
|
- *Принцип відкритості-закритості*: "Сутності програмного забезпечення ... повинні бути відкритими для розширення, але закритими для модифікації.
|
||||||
- *Принцип заміщення Ліскова*: "Функції, які використовують вказівники або посилання на базові класи, повинні мати можливість використовувати об'єкти похідних класів, не знаючи про це.
|
- *Принцип заміщення Ліскова*: "Функції, які використовують вказівники або посилання на базові класи, повинні мати можливість використовувати об'єкти похідних класів, не знаючи про це.
|
||||||
- *Принцип розділення інтерфейсів*: "Клієнти не повинні бути змушені залежати від інтерфейсів, якими вони не користуються".
|
- *Принцип розділення інтерфейсів*: "Клієнти не повинні бути змушені залежати від інтерфейсів, якими вони не користуються".
|
||||||
- *Принцип інверсії залежності*: "Покладайтеся на абстракції, а не на конкретику".
|
- *Принцип інверсії залежності*: "Покладайтеся на абстракції, а не на конкретику".
|
||||||
|
|
||||||
[DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)(з англ. don’t repeat yourself - “не повторюйся”) - це принцип розробки програмного забезпечення, спрямований на зменшення повторення інформації, яка може змінитися, заміну її абстракціями, які менш схильні до змін, або використання нормалізації даних, яка дозволяє уникнути надмірності в першу чергу.
|
[DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)(з англ. don’t repeat yourself - “не повторюйся”) - це принцип розробки програмного забезпечення, спрямований на зменшення повторення інформації, яка може змінитися, заміну її абстракціями, які менш схильні до змін, або використання нормалізації даних, яка дозволяє уникнути надмірності в першу чергу.
|
||||||
|
|
||||||
[ORM](https://uk.wikipedia.org/wiki/Об%27єктно-реляційне_відображення) - (англ. Object-relational mapping, Об'єктно-реляційна проекція) — технологія програмування, яка зв'язує бази даних з концепціями об'єктно-орієнтованих мов програмування, створюючи «віртуальну об'єктну базу даних».
|
[ORM](https://uk.wikipedia.org/wiki/Об%27єктно-реляційне_відображення) - (англ. Object-relational mapping, Об'єктно-реляційна проекція) — технологія програмування, яка зв'язує бази даних з концепціями об'єктно-орієнтованих мов програмування, створюючи «віртуальну об'єктну базу даних».
|
||||||
|
|
||||||
|
|
||||||
### Посилання
|
### Посилання
|
||||||
|
|
||||||
1. [https://uk.wikipedia.org/wiki/Зацікавлені_сторони](https://uk.wikipedia.org/wiki/Зацікавлені_сторони)
|
1. [https://uk.wikipedia.org/wiki/Зацікавлені_сторони](https://uk.wikipedia.org/wiki/Зацікавлені_сторони)
|
||||||
2. [https://en.wikipedia.org/wiki/FURPS](https://en.wikipedia.org/wiki/FURPS)
|
2. [https://en.wikipedia.org/wiki/FURPS](https://en.wikipedia.org/wiki/FURPS)
|
||||||
3. [https://uk.wikipedia.org/wiki/Прикладний_програмний_інтерфейс](https://uk.wikipedia.org/wiki/Прикладний_програмний_інтерфейс)
|
3. [https://uk.wikipedia.org/wiki/Прикладний_програмний_інтерфейс](https://uk.wikipedia.org/wiki/Прикладний_програмний_інтерфейс)
|
||||||
4. [https://uk.wikipedia.org/wiki/REST](https://uk.wikipedia.org/wiki/REST)
|
4. [https://uk.wikipedia.org/wiki/REST](https://uk.wikipedia.org/wiki/REST)
|
||||||
5. [https://en.wikipedia.org/wiki/Model–view–controller#Components](https://en.wikipedia.org/wiki/Model–view–controller#Components)
|
5. [https://en.wikipedia.org/wiki/Model–view–controller#Components](https://en.wikipedia.org/wiki/Model–view–controller#Components)
|
||||||
6. [https://en.wikipedia.org/wiki/SOLID](https://en.wikipedia.org/wiki/SOLID)
|
6. [https://en.wikipedia.org/wiki/SOLID](https://en.wikipedia.org/wiki/SOLID)
|
||||||
7. [https://en.wikipedia.org/wiki/Don%27t_repeat_yourself](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)
|
7. [https://en.wikipedia.org/wiki/Don%27t_repeat_yourself](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)
|
||||||
8. [https://uk.wikipedia.org/wiki/Об%27єктно-реляційне_відображення](https://uk.wikipedia.org/wiki/Об%27єктно-реляційне_відображення)
|
8. [https://uk.wikipedia.org/wiki/Об%27єктно-реляційне_відображення](https://uk.wikipedia.org/wiki/Об%27єктно-реляційне_відображення)
|
||||||
|
|
||||||
|
|
||||||
## Короткий зміст
|
## Короткий зміст
|
||||||
|
|
||||||
- [Характеристика ділових процесів](#характеристика-ділових-процесів)
|
- [Характеристика ділових процесів](#характеристика-ділових-процесів)
|
||||||
- [Короткий огляд продукту](#короткии-огляд-продукту)
|
- [Короткий огляд продукту](#короткии-огляд-продукту)
|
||||||
- [Функціональність](#функціональність)
|
- [Функціональність](#функціональність)
|
||||||
- [Практичність](#практичність)
|
- [Практичність](#практичність)
|
||||||
- [Надійність](#надіиність)
|
- [Надійність](#надіиність)
|
||||||
- [Продуктивність](#продуктивність)
|
- [Продуктивність](#продуктивність)
|
||||||
- [Експлуатаційна придатність](#експлуатаціина-придатність)
|
- [Експлуатаційна придатність](#експлуатаціина-придатність)
|
||||||
|
|
||||||
## Характеристика ділових процесів
|
## Характеристика ділових процесів
|
||||||
|
|
||||||
| ID | ACCOUNT.CREATE |
|
| ID | ACCOUNT.CREATE |
|
||||||
|:-----------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Створити обліковий запис |
|
| Назва | Створити обліковий запис |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Відсутні |
|
| Передумови | Відсутні |
|
||||||
| Результат | Обліковий запис користувача |
|
| Результат | Обліковий запис користувача |
|
||||||
| Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму<br>001.002 Ідентичний псевдонім вже існує |
|
| Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму<br>001.002 Ідентичний псевдонім вже існує |
|
||||||
| Основний сценарій | 1. Користувач вводить бажаний псевдонім у поле вводу псевдоніму<br>2. Користувач вводить пароль у поле вводу паролю<br>3. Користувач натискає на кнопку створення облікового запису<br>4. Система створює обліковий запис користувача (можливі 001.001, 001.002) |
|
| Основний сценарій | 1. Користувач вводить бажаний псевдонім у поле вводу псевдоніму<br>2. Користувач вводить пароль у поле вводу паролю<br>3. Користувач натискає на кнопку створення облікового запису<br>4. Система створює обліковий запис користувача (можливі 001.001, 001.002) |
|
||||||
|
|
||||||
| ID | ACCOUNT.DELETE |
|
| ID | ACCOUNT.DELETE |
|
||||||
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Видалити обліковий запис |
|
| Назва | Видалити обліковий запис |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач ідентифікований в системі |
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
| Результат | Відсутність облікового запису користувача |
|
| Результат | Відсутність облікового запису користувача |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
||||||
| Основний сценарій | 1. Користувач натискає на кнопку видалення облікового запису<br>2. Система виводить кнопку-запит на підтвердження видалення облікового запису<br>3. Користувач натискає на кнопку підтвердження видалення облікового запису<br>4. Система видаляє обліковий запис (можлива 001.005) |
|
| Основний сценарій | 1. Користувач натискає на кнопку видалення облікового запису<br>2. Система виводить кнопку-запит на підтвердження видалення облікового запису<br>3. Користувач натискає на кнопку підтвердження видалення облікового запису<br>4. Система видаляє обліковий запис (можлива 001.005) |
|
||||||
|
|
||||||
| ID | ACCOUNT.MODIFY |
|
| ID | ACCOUNT.MODIFY |
|
||||||
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Змінити властивості облікового запису |
|
| Назва | Змінити властивості облікового запису |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач ідентифікований в системі |
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
| Результат | Зміна властивостей облікового запису |
|
| Результат | Зміна властивостей облікового запису |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
||||||
| Основний сценарій | 1. Користувач натискає на кнопку редагування облікового запису<br>2. Система виводить інтерфейс для редагування облікового запису (можлива 001.005)<br>3. Користувач вказує бажані зміни властивостей облікового запису<br>4. Користувач натискає на кнопку внесення змін до властивостей облікового запису<br>5. Система змінює властивості облікового запису |
|
| Основний сценарій | 1. Користувач натискає на кнопку редагування облікового запису<br>2. Система виводить інтерфейс для редагування облікового запису (можлива 001.005)<br>3. Користувач вказує бажані зміни властивостей облікового запису<br>4. Користувач натискає на кнопку внесення змін до властивостей облікового запису<br>5. Система змінює властивості облікового запису |
|
||||||
|
|
||||||
| ID | SURVEY.LINK.CREATE |
|
| ID | SURVEY.LINK.CREATE |
|
||||||
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Додати посилання на опитування |
|
| Назва | Додати посилання на опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач авторизований у системі |
|
| Передумови | Користувач авторизований у системі |
|
||||||
| Результат | Нове посилання на опитування |
|
| Результат | Нове посилання на опитування |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
| Основний сценарій | 1. Користувач натискає кнопку створення посилання на опитування<br>2. Система виводить налаштування для нового посилання (можливі 001.005, 001.006, 001.008)<br>3. Користувач вводить налаштування для нового посилання<br>4. Користувач натискає на кнопку створення посилання<br>5. Система створює нове посилання |
|
| Основний сценарій | 1. Користувач натискає кнопку створення посилання на опитування<br>2. Система виводить налаштування для нового посилання (можливі 001.005, 001.006, 001.008)<br>3. Користувач вводить налаштування для нового посилання<br>4. Користувач натискає на кнопку створення посилання<br>5. Система створює нове посилання |
|
||||||
|
|
||||||
| ID | SURVEY.LINK.DELETE |
|
| ID | SURVEY.LINK.DELETE |
|
||||||
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Видалити посилання на опитування |
|
| Назва | Видалити посилання на опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач авторизований у системі |
|
| Передумови | Користувач авторизований у системі |
|
||||||
| Результат | Видалення посилання на опитування |
|
| Результат | Видалення посилання на опитування |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
|
| Виключні ситуації | 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) |
|
| Основний сценарій | 1. Користувач натискає кнопку видалення посилання<br>2. Система виводить кнопку підтвердження видалення посилання<br>3. Користувач натискає на кнопку підтвердження видалення посилання<br>4. Система видаляє посилання (можливі 001.005, 001.006, 001.008, 001.009) |
|
||||||
|
|
||||||
| ID | SURVEY.LINK.MODIFY |
|
| ID | SURVEY.LINK.MODIFY |
|
||||||
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Змінити властивості посилання на опитування |
|
| Назва | Змінити властивості посилання на опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач авторизований у системі |
|
| Передумови | Користувач авторизований у системі |
|
||||||
| Результат | Зміна властивостей посилання на опитування |
|
| Результат | Зміна властивостей посилання на опитування |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування<br>001.009 Запитане посилання на існує |
|
| Виключні ситуації | 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. Система змінює властивості посилання |
|
| Основний сценарій | 1. Користувач натискає кнопку редагування властивостей посилання<br>2. Система виводить налаштування для обраного посилання (можливі 001.005, 001.006, 001.008, 001.009)<br>3. Користувач вводить юажані зміни властивостей посилання<br>4. Користувач натискає на кнопку збереження властиностей посилання<br>5. Система змінює властивості посилання |
|
||||||
|
|
||||||
| ID | USER.CREATE_SURVEY |
|
| ID | USER.CREATE_SURVEY |
|
||||||
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Створити опитування |
|
| Назва | Створити опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач ідентифікований в системі |
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
| Результат | Створене опитування |
|
| Результат | Створене опитування |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.007 Користувач ввів неприпустимі символи в назві опитування |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.007 Користувач ввів неприпустимі символи в назві опитування |
|
||||||
| Основний сценарій | 1. Користувач переходить на сторінку створення опитування (можлива 001.005)<br>2. Система виводить інтерфейс створення опитування<br>3. Користувач задає інформацію про запитання та тип опитування<br>4. Користувач натискає кнопку збереження опитування<br>5. Система створює опитування (можлива 001.007)<br>6. Система виводить посилання на проходження опитування |
|
| Основний сценарій | 1. Користувач переходить на сторінку створення опитування (можлива 001.005)<br>2. Система виводить інтерфейс створення опитування<br>3. Користувач задає інформацію про запитання та тип опитування<br>4. Користувач натискає кнопку збереження опитування<br>5. Система створює опитування (можлива 001.007)<br>6. Система виводить посилання на проходження опитування |
|
||||||
|
|
||||||
| ID | USER.DELETE_SURVEY |
|
| ID | USER.DELETE_SURVEY |
|
||||||
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Видалити опитування |
|
| Назва | Видалити опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
||||||
| Результат | Відсутність опитування |
|
| Результат | Відсутність опитування |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
| Основний сценарій | 1. Користувач натискає на кнопку видалення опитування<br>2. Система виводить запит на підтвердження видалення опитування<br>3. Користувач натискає на кнопку підтвердження видалення опитування<br>4. Система видаляє опитування (можливі 001.005, 001.006, 001.008) |
|
| Основний сценарій | 1. Користувач натискає на кнопку видалення опитування<br>2. Система виводить запит на підтвердження видалення опитування<br>3. Користувач натискає на кнопку підтвердження видалення опитування<br>4. Система видаляє опитування (можливі 001.005, 001.006, 001.008) |
|
||||||
|
|
||||||
| ID | USER.GET_SURVEY_RESULT |
|
| ID | USER.GET_SURVEY_RESULT |
|
||||||
|:-----------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Переглянути відповіді на опитування |
|
| Назва | Переглянути відповіді на опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
||||||
| Результат | Інформація про відповіді на опитування |
|
| Результат | Інформація про відповіді на опитування |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
| Основний сценарій | 1. Користувач натискає на кнопку перегляду відповідей на опитування<br>2. Система виводить інформацію про відповіді на опитування (можливі 001.005, 001.006, 001.008) |
|
| Основний сценарій | 1. Користувач натискає на кнопку перегляду відповідей на опитування<br>2. Система виводить інформацію про відповіді на опитування (можливі 001.005, 001.006, 001.008) |
|
||||||
|
|
||||||
| ID | USER.LOGIN |
|
| ID | USER.LOGIN |
|
||||||
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Пройти ідентифікацію в системі |
|
| Назва | Пройти ідентифікацію в системі |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач має обліковий запис |
|
| Передумови | Користувач має обліковий запис |
|
||||||
| Результат | Користувач ідентифікований в системі |
|
| Результат | Користувач ідентифікований в системі |
|
||||||
| Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму<br>001.003 Користувач ввів псевдонім, якого не існує в системі<br>001.004 Користувач ввів неправильний пароль до облікового запису |
|
| Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму<br>001.003 Користувач ввів псевдонім, якого не існує в системі<br>001.004 Користувач ввів неправильний пароль до облікового запису |
|
||||||
| Основний сценарій | 1. Користувач вводить псевдонім у поле вводу псевдоніму<br>2. Користувач вводить пароль у поле вводу паролю<br>3. Користувач натискає кнопку ідентифікації<br>4. Система ідентифікує користувача (можливі 001.001, 001.003, 001.004) |
|
| Основний сценарій | 1. Користувач вводить псевдонім у поле вводу псевдоніму<br>2. Користувач вводить пароль у поле вводу паролю<br>3. Користувач натискає кнопку ідентифікації<br>4. Система ідентифікує користувача (можливі 001.001, 001.003, 001.004) |
|
||||||
|
|
||||||
| ID | USER.LOGOUT |
|
| ID | USER.LOGOUT |
|
||||||
|:-----------------:|:-------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:-------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Скинути дані про ідентифікацію в системі |
|
| Назва | Скинути дані про ідентифікацію в системі |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач ідентифікований в системі |
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
| Результат | Користувач не ідентифікований в системі |
|
| Результат | Користувач не ідентифікований в системі |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований |
|
||||||
| Основний сценарій | 1. Користувач натискає на кнопку виходу з облікового запису<br>2. Система скидає інформацію про ідентифікацію користувача (можлива 001.005) |
|
| Основний сценарій | 1. Користувач натискає на кнопку виходу з облікового запису<br>2. Система скидає інформацію про ідентифікацію користувача (можлива 001.005) |
|
||||||
|
|
||||||
| ID | USER.MODIFY_SURVEY |
|
| ID | USER.MODIFY_SURVEY |
|
||||||
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Редагувати опитування |
|
| Назва | Редагувати опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
||||||
| Результат | Змінене опитування |
|
| Результат | Змінене опитування |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
| Основний сценарій | 1. Користувач переходить на сторінку редагування опитування<br>2. Система виводить інтерфейс редагування опитування (можливі 001.005, 001.006, 001.008)<br>3. Користувач задає інформацію про зміни в опитуванні<br>4. Користувач натискає кнопку збереження змін в опитуванні<br>5. Система змінює опитування |
|
| Основний сценарій | 1. Користувач переходить на сторінку редагування опитування<br>2. Система виводить інтерфейс редагування опитування (можливі 001.005, 001.006, 001.008)<br>3. Користувач задає інформацію про зміни в опитуванні<br>4. Користувач натискає кнопку збереження змін в опитуванні<br>5. Система змінює опитування |
|
||||||
|
|
||||||
| ID | USER.STAT_SURVEY |
|
| ID | USER.STAT_SURVEY |
|
||||||
|:-----------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Переглянути властивості опитування |
|
| Назва | Переглянути властивості опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
| Передумови | Користувач ідентифікований в системі, користувач є власником опитування |
|
||||||
| Результат | Інформація про властивості опитування |
|
| Результат | Інформація про властивості опитування |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує<br>001.008 Користувач не є власником опитування |
|
||||||
| Основний сценарій | 1. Користувач натискає на кнопку перегляду інформації про опитування<br>2. Система виводить інформацію про опитування (можливі 001.005, 001.006, 001.008) |
|
| Основний сценарій | 1. Користувач натискає на кнопку перегляду інформації про опитування<br>2. Система виводить інформацію про опитування (можливі 001.005, 001.006, 001.008) |
|
||||||
|
|
||||||
| ID | USER.TAKE_ANON_SURVEY |
|
| ID | USER.TAKE_ANON_SURVEY |
|
||||||
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Пройти анонімне опитування |
|
| Назва | Пройти анонімне опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Відсутні |
|
| Передумови | Відсутні |
|
||||||
| Результат | Запис відповідей на опитування |
|
| Результат | Запис відповідей на опитування |
|
||||||
| Виключні ситуації | 001.006 Запитане опитування не існує |
|
| Виключні ситуації | 001.006 Запитане опитування не існує |
|
||||||
| Основний сценарій | 1. Користувач переходить на сторінку проходження опитування<br>2. Система виводить перелік запитань опитування (можлива 001.006)<br>3. Користувач вводить відповіді на запитання<br>4. Користувач натискає кнопку надсилання відповідей<br>5. Система записує відповіді на опитування (можлива 001.006)<br>6. Система виводить прощальне повідомлення |
|
| Основний сценарій | 1. Користувач переходить на сторінку проходження опитування<br>2. Система виводить перелік запитань опитування (можлива 001.006)<br>3. Користувач вводить відповіді на запитання<br>4. Користувач натискає кнопку надсилання відповідей<br>5. Система записує відповіді на опитування (можлива 001.006)<br>6. Система виводить прощальне повідомлення |
|
||||||
|
|
||||||
| ID | USER.TAKE_NAMED_SURVEY |
|
| ID | USER.TAKE_NAMED_SURVEY |
|
||||||
|:-----------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
|:-----------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
| Назва | Пройти поіменне опитування |
|
| Назва | Пройти поіменне опитування |
|
||||||
| Учасники | Користувач, система |
|
| Учасники | Користувач, система |
|
||||||
| Передумови | Користувач ідентифікований в системі |
|
| Передумови | Користувач ідентифікований в системі |
|
||||||
| Результат | Запис відповідей на опитування та відомості про користувача |
|
| Результат | Запис відповідей на опитування та відомості про користувача |
|
||||||
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує |
|
| Виключні ситуації | 001.005 Користувач не ідентифікований<br>001.006 Запитане опитування не існує |
|
||||||
| Основний сценарій | 1. Користувач переходить на сторінку проходження опитування<br>2. Система виводить перелік запитань опитування (можливі 001.005, 001.006)<br>3. Користувач вводить відповіді на запитання<br>4. Користувач натискає кнопку надсилання відповідей<br>5. Система записує відповіді на опитування та відомості про користувача (можлива 001.006)<br>6. Система виводить прощальне повідомлення |
|
| Основний сценарій | 1. Користувач переходить на сторінку проходження опитування<br>2. Система виводить перелік запитань опитування (можливі 001.005, 001.006)<br>3. Користувач вводить відповіді на запитання<br>4. Користувач натискає кнопку надсилання відповідей<br>5. Система записує відповіді на опитування та відомості про користувача (можлива 001.006)<br>6. Система виводить прощальне повідомлення |
|
||||||
|
|
||||||
## Короткий огляд продукту
|
## Короткий огляд продукту
|
||||||
|
|
||||||
<center>
|
<center>
|
||||||
<img width=60% src="http://139.162.162.130:16660/img/logo2-web.svg">
|
<img width=60% src="http://139.162.162.130:16660/img/logo2-web.svg">
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
Xpertise - це система для проведення будь-яких опитувань.
|
Xpertise - це система для проведення будь-яких опитувань.
|
||||||
Вона дозволяє користувачам створювати опитування, збирати відповіді на них та переглядати докладну й узагальнену статистику.
|
Вона дозволяє користувачам створювати опитування, збирати відповіді на них та переглядати докладну й узагальнену статистику.
|
||||||
У користувачів є можливість створювати не лише анонімні, але й поіменні опитування, тому платформа також задовольнить потреби в проведенні голосувань для прийняття спільних рішень у командах.
|
У користувачів є можливість створювати не лише анонімні, але й поіменні опитування, тому платформа також задовольнить потреби в проведенні голосувань для прийняття спільних рішень у командах.
|
||||||
|
|
||||||
## Функціональність
|
## Функціональність
|
||||||
|
|
||||||
Наша система спрямована, в першу чергу, на взаємодію з користувачами.
|
Наша система спрямована, в першу чергу, на взаємодію з користувачами.
|
||||||
|
|
||||||
***Користувач** - це особа, що взаємодіє із системою.*
|
***Користувач** - це особа, що взаємодіє із системою.*
|
||||||
|
|
||||||
Cистема розділяє користувачів на дві категорії:
|
Cистема розділяє користувачів на дві категорії:
|
||||||
- гість
|
- гість
|
||||||
- авторизований користувач
|
- авторизований користувач
|
||||||
|
|
||||||
***Гість** - це користувач, що не пройшов ідентифікацію в системі. Такого користувача не можна зіставити з жодним обліковим записом.*
|
***Гість** - це користувач, що не пройшов ідентифікацію в системі. Такого користувача не можна зіставити з жодним обліковим записом.*
|
||||||
|
|
||||||
Гість може:
|
Гість може:
|
||||||
- створити обліковий запис
|
- створити обліковий запис
|
||||||
- пройти ідентифікацію в системі
|
- пройти ідентифікацію в системі
|
||||||
- пройти анонімне опитування
|
- пройти анонімне опитування
|
||||||
|
|
||||||
***Зареєстрований користувач** - це користувач, котрий успішно пройшов ідентифікацію в системі. Такого користувача можна однозначно зіставити з обліковим записом, що наявний у системі.*
|
***Зареєстрований користувач** - це користувач, котрий успішно пройшов ідентифікацію в системі. Такого користувача можна однозначно зіставити з обліковим записом, що наявний у системі.*
|
||||||
|
|
||||||
Зареєстрований користувач може:
|
Зареєстрований користувач може:
|
||||||
- редагувати властивості свого облікового запису
|
- редагувати властивості свого облікового запису
|
||||||
- видалити свій обліковий запис
|
- видалити свій обліковий запис
|
||||||
- скинути дані про ідентицікацію в системі
|
- скинути дані про ідентицікацію в системі
|
||||||
- створити опитування
|
- створити опитування
|
||||||
- відредагувати своє опитування
|
- відредагувати своє опитування
|
||||||
- видалити своє опитування
|
- видалити своє опитування
|
||||||
- створити посилання на своє опитування
|
- створити посилання на своє опитування
|
||||||
- редагувати властивості посилання на своє опитування
|
- редагувати властивості посилання на своє опитування
|
||||||
- видалити посилання на своє опитування
|
- видалити посилання на своє опитування
|
||||||
- призупинити своє опитування
|
- призупинити своє опитування
|
||||||
- продовжити своє опитування
|
- продовжити своє опитування
|
||||||
- переглянути властивості свого опитування
|
- переглянути властивості свого опитування
|
||||||
- переглянути результати свого опитування
|
- переглянути результати свого опитування
|
||||||
- пройти анонімне опитування
|
- пройти анонімне опитування
|
||||||
- пройти поіменне опитування
|
- пройти поіменне опитування
|
||||||
|
|
||||||
*[Респондент](https://slovnyk.ua/index.php?swrd=%D1%80%D0%B5%D1%81%D0%BF%D0%BE%D0%BD%D0%B4%D0%B5%D0%BD%D1%82) - той, хто відповідає на питання анкети; опитуваний.*
|
*[Респондент](https://slovnyk.ua/index.php?swrd=%D1%80%D0%B5%D1%81%D0%BF%D0%BE%D0%BD%D0%B4%D0%B5%D0%BD%D1%82) - той, хто відповідає на питання анкети; опитуваний.*
|
||||||
|
|
||||||
***Опитування** - це перелік запитань, кожне з яких передбачає обов'язкову або необов'язкову відповідь. Кожна відповідь має визначений тип.*
|
***Опитування** - це перелік запитань, кожне з яких передбачає обов'язкову або необов'язкову відповідь. Кожна відповідь має визначений тип.*
|
||||||
|
|
||||||
***Анонімне опитування** - це опитування, відповідь на яке може не містити інформації про обліковий запис респондента (*респондент все одно може вирішити надати таку інформацію).*
|
***Анонімне опитування** - це опитування, відповідь на яке може не містити інформації про обліковий запис респондента (*респондент все одно може вирішити надати таку інформацію).*
|
||||||
|
|
||||||
***Поіменне опитування** - це опитування, відповідь на яке обов'язково містить дані про обліковий запис респондента.*
|
***Поіменне опитування** - це опитування, відповідь на яке обов'язково містить дані про обліковий запис респондента.*
|
||||||
|
|
||||||
## Практичність
|
## Практичність
|
||||||
|
|
||||||
- Наявність зручного інструменту для побудови опитувань
|
- Наявність зручного інструменту для побудови опитувань
|
||||||
- Можливість легко замінити брендинг та кольорову палітру
|
- Можливість легко замінити брендинг та кольорову палітру
|
||||||
- Перегляд аналітики в реальному часі
|
- Перегляд аналітики в реальному часі
|
||||||
- Формування статистики відповідей у зручному інтерфейсі
|
- Формування статистики відповідей у зручному інтерфейсі
|
||||||
- Можливість експорту результатів опитування через API
|
- Можливість експорту результатів опитування через API
|
||||||
- Підтримка програмування реакцій на події (hooks)
|
- Підтримка програмування реакцій на події (hooks)
|
||||||
|
|
||||||
## Надійність
|
## Надійність
|
||||||
|
|
||||||
- Шифрування з'єднань (TLS)
|
- Шифрування з'єднань (TLS)
|
||||||
- Автоматичне резервне копіювання
|
- Автоматичне резервне копіювання
|
||||||
- Автоматичне відновлення з резервних копій
|
- Автоматичне відновлення з резервних копій
|
||||||
|
|
||||||
## Продуктивність
|
## Продуктивність
|
||||||
|
|
||||||
- Низьке використання мережі базовим протоколом
|
- Низьке використання мережі базовим протоколом
|
||||||
- Незалежність від сторонніх веб-хостингів
|
- Незалежність від сторонніх веб-хостингів
|
||||||
|
|
||||||
## Експлуатаційна придатність
|
## Експлуатаційна придатність
|
||||||
|
|
||||||
- Наявність докладної документації для користувачів, адміністраторів та розробників
|
- Наявність докладної документації для користувачів, адміністраторів та розробників
|
||||||
- Доступність онлайн-підтримки
|
- Доступність онлайн-підтримки
|
||||||
|
|
|
@ -1,221 +1,221 @@
|
||||||
# Розроблення вимог до системи
|
# Розроблення вимог до системи
|
||||||
|
|
||||||
## Вступ
|
## Вступ
|
||||||
У даному розділі проводиться аналіз предметної області, пов'язаної з системою організації та управління експертними опитуваннями. Представлені такі категорії:
|
У даному розділі проводиться аналіз предметної області, пов'язаної з системою організації та управління експертними опитуваннями. Представлені такі категорії:
|
||||||
|
|
||||||
- [Основні визначення](#основні-визначення), котрі можна зустріти в сфері експертних опитувань
|
- [Основні визначення](#основні-визначення), котрі можна зустріти в сфері експертних опитувань
|
||||||
- [Підходи та способи вирішення завдання](#підходи-та-способи-вирішення-завдання) опитування експертів
|
- [Підходи та способи вирішення завдання](#підходи-та-способи-вирішення-завдання) опитування експертів
|
||||||
- [Порівняльна характеристика наявних засобів вирішення завдання](#порівняльна-характеристика-існуючих-засобів-вирішення-завдання) опитування експертів
|
- [Порівняльна характеристика наявних засобів вирішення завдання](#порівняльна-характеристика-існуючих-засобів-вирішення-завдання) опитування експертів
|
||||||
- [Висновки](#висновки) щодо доцільності розробки нової системи
|
- [Висновки](#висновки) щодо доцільності розробки нової системи
|
||||||
- [Література](#література), де наведені посилання на джерела інформації
|
- [Література](#література), де наведені посилання на джерела інформації
|
||||||
|
|
||||||
## Основні визначення
|
## Основні визначення
|
||||||
### Технічні визначення
|
### Технічні визначення
|
||||||
**База даних** [](https://uk.wikipedia.org/wiki/База_даних)
|
**База даних** [](https://uk.wikipedia.org/wiki/База_даних)
|
||||||
|
|
||||||
База даних (англ. database) – сукупність даних, організованих відповідно до концепції, яка описує характеристику цих даних і взаємозв'язки між їх елементами; ця сукупність підтримує щонайменше одну з областей застосування (за стандартом ISO/IEC 2382:2015). В загальному випадку база даних містить схеми, таблиці, подання, збережені процедури та інші об'єкти. Дані у базі організовують відповідно до моделі організації даних. Таким чином, сучасна база даних, крім самих даних, містить їх опис та може містити засоби для їх обробки.
|
База даних (англ. database) – сукупність даних, організованих відповідно до концепції, яка описує характеристику цих даних і взаємозв'язки між їх елементами; ця сукупність підтримує щонайменше одну з областей застосування (за стандартом ISO/IEC 2382:2015). В загальному випадку база даних містить схеми, таблиці, подання, збережені процедури та інші об'єкти. Дані у базі організовують відповідно до моделі організації даних. Таким чином, сучасна база даних, крім самих даних, містить їх опис та може містити засоби для їх обробки.
|
||||||
|
|
||||||
**SQL** [](https://uk.wikipedia.org/wiki/SQL)
|
**SQL** [](https://uk.wikipedia.org/wiki/SQL)
|
||||||
|
|
||||||
SQL (англ. Structured query language — мова структурованих запитів) — декларативна мова програмування для взаємодії користувача з базами даних, що застосовується для формування запитів, оновлення і керування реляційними БД, створення схеми бази даних та її модифікації, системи контролю за доступом до бази даних. Сама по собі SQL не є ані системою керування базами даних, ані окремим програмним продуктом. На відміну від дійсних мов програмування (C або Pascal), SQL може формувати інтерактивні запити або, бувши вбудованою в прикладні програми, виступати як інструкції для керування даними. Окрім цього, стандарт SQL містить функції для визначення зміни, перевірки та захисту даних.
|
SQL (англ. Structured query language — мова структурованих запитів) — декларативна мова програмування для взаємодії користувача з базами даних, що застосовується для формування запитів, оновлення і керування реляційними БД, створення схеми бази даних та її модифікації, системи контролю за доступом до бази даних. Сама по собі SQL не є ані системою керування базами даних, ані окремим програмним продуктом. На відміну від дійсних мов програмування (C або Pascal), SQL може формувати інтерактивні запити або, бувши вбудованою в прикладні програми, виступати як інструкції для керування даними. Окрім цього, стандарт SQL містить функції для визначення зміни, перевірки та захисту даних.
|
||||||
|
|
||||||
### Загальні визначення
|
### Загальні визначення
|
||||||
**Опитування** [](https://uk.wikipedia.org/wiki/Опитування)
|
**Опитування** [](https://uk.wikipedia.org/wiki/Опитування)
|
||||||
|
|
||||||
Опи́тування — це метод збору соціологічної інформації про досліджуваний об'єкт під час безпосереднього (усне опитування, інтерв'ю) або опосередкованого (письмове опитування, анкетування) спілкування того хто опитує з респондентом. Опитування бувають соціологічні, політологічні, маркетингові, психологічні — залежно від предмету дослідження. Залежно від кількості опитуваних (вибірки, вибіркової сукупності) вони також можуть бути масовими, вибірковими, індивідуальними, експертними. Також використовується для вимірювання «громадської думки» з різних питань.
|
Опи́тування — це метод збору соціологічної інформації про досліджуваний об'єкт під час безпосереднього (усне опитування, інтерв'ю) або опосередкованого (письмове опитування, анкетування) спілкування того хто опитує з респондентом. Опитування бувають соціологічні, політологічні, маркетингові, психологічні — залежно від предмету дослідження. Залежно від кількості опитуваних (вибірки, вибіркової сукупності) вони також можуть бути масовими, вибірковими, індивідуальними, експертними. Також використовується для вимірювання «громадської думки» з різних питань.
|
||||||
|
|
||||||
**Експерт** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
**Експерт** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
||||||
|
|
||||||
Експертом називають людину, що є фахівцем (спеціалістом) у певній предметній області (ПО) і може пояснити свої дії та міркування. Предметною областю називають будь-яку галузь діяльності людини, наприклад, “Технічні засоби автоматизації”, “Охорона довкілля”, “Системи штучного інтелекту” тощо.
|
Експертом називають людину, що є фахівцем (спеціалістом) у певній предметній області (ПО) і може пояснити свої дії та міркування. Предметною областю називають будь-яку галузь діяльності людини, наприклад, “Технічні засоби автоматизації”, “Охорона довкілля”, “Системи штучного інтелекту” тощо.
|
||||||
**Експертне опитування**
|
**Експертне опитування**
|
||||||
Експертне опитування або опитування фахівців — це особливий метод маркетингового (і/або соціологічного) дослідження. В рамках такого опитування досліджувана тема обговорюється з експертами, компетентними в даній сфері.
|
Експертне опитування або опитування фахівців — це особливий метод маркетингового (і/або соціологічного) дослідження. В рамках такого опитування досліджувана тема обговорюється з експертами, компетентними в даній сфері.
|
||||||
### Методи експертного опитування
|
### Методи експертного опитування
|
||||||
#### Активні методи
|
#### Активні методи
|
||||||
Активні методи передбачають спілкування між організаторами та експертами. Можливі два напрямки активної роботи з експертами: індивідуальна робота з експертом (анонімна чи відкрита) та робота з групою в цілому.
|
Активні методи передбачають спілкування між організаторами та експертами. Можливі два напрямки активної роботи з експертами: індивідуальна робота з експертом (анонімна чи відкрита) та робота з групою в цілому.
|
||||||
***
|
***
|
||||||
#### До індивідуальних активних методів належать анкетування, інтерв’ю, діалог з експертом, ігри з експертом.
|
#### До індивідуальних активних методів належать анкетування, інтерв’ю, діалог з експертом, ігри з експертом.
|
||||||
|
|
||||||
**Інтерв’ю** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
**Інтерв’ю** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
||||||
|
|
||||||
Інтерв’ю – це форма спілкування між дослідником та експертом, при якій дослідник ставить заздалегідь підготовлену чергу запитань. Можна замінити ці запитання на інші у відповідності до ситуації.
|
Інтерв’ю – це форма спілкування між дослідником та експертом, при якій дослідник ставить заздалегідь підготовлену чергу запитань. Можна замінити ці запитання на інші у відповідності до ситуації.
|
||||||
|
|
||||||
**Діалог** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
**Діалог** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
||||||
|
|
||||||
Діалог – це метод отримання знань у формі бесіди між дослідником та експертом, коли немає жорстко регламентованого плану проведеня і визначеного заздалегідь переліку запитань.
|
Діалог – це метод отримання знань у формі бесіди між дослідником та експертом, коли немає жорстко регламентованого плану проведеня і визначеного заздалегідь переліку запитань.
|
||||||
|
|
||||||
**Ігри з експертом** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
**Ігри з експертом** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
||||||
|
|
||||||
Ігри з експертом (експертні ігри) – це експерименти, у яких фахівцю пропонують важливі ситуації з предметної області. Фахівець повинен запропонувати рішення по виходу з цих ситуацій на основі свого життєвого досвіду, спеціальних знань та уявлень.
|
Ігри з експертом (експертні ігри) – це експерименти, у яких фахівцю пропонують важливі ситуації з предметної області. Фахівець повинен запропонувати рішення по виходу з цих ситуацій на основі свого життєвого досвіду, спеціальних знань та уявлень.
|
||||||
***
|
***
|
||||||
#### До методів активної роботи з групою в цілому належать методи круглого столу, мозкового штурму та рольові ігри.
|
#### До методів активної роботи з групою в цілому належать методи круглого столу, мозкового штурму та рольові ігри.
|
||||||
|
|
||||||
**Круглий стіл** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
**Круглий стіл** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
||||||
|
|
||||||
“Круглий стіл” передбачає обговорення певної проблеми, у якому приймають участь експерти з однаковими правами. Задача дискусії – вивчити проблему всебічно, тому слід запрошувати експертів, які належать до різних наукових напрямків, мають різний вік, стать і т.ін. Цей метод не передбачає терміновості прийняття рішення.
|
“Круглий стіл” передбачає обговорення певної проблеми, у якому приймають участь експерти з однаковими правами. Задача дискусії – вивчити проблему всебічно, тому слід запрошувати експертів, які належать до різних наукових напрямків, мають різний вік, стать і т.ін. Цей метод не передбачає терміновості прийняття рішення.
|
||||||
|
|
||||||
**Мозковий штурм** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
**Мозковий штурм** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
||||||
|
|
||||||
“Мозковий штурм (атака)” – один із найбільш поширених методів активізації думок. Його застосовують у тих випадках, коли потрібно знайти вирішення певної проблеми за дуже короткий час. Під час такого обговоренння кожний експерт повинен запропонувати свій шлях розвязання задачі або розвинути думку іншого учасника.
|
“Мозковий штурм (атака)” – один із найбільш поширених методів активізації думок. Його застосовують у тих випадках, коли потрібно знайти вирішення певної проблеми за дуже короткий час. Під час такого обговоренння кожний експерт повинен запропонувати свій шлях розвязання задачі або розвинути думку іншого учасника.
|
||||||
|
|
||||||
**Рольові ігри** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
**Рольові ігри** [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
||||||
|
|
||||||
Рольові ігри (експертні ігри) – це експерименти, у яких колективу спеціалістів пропонують складні ситуації з предметної області. Спеціалісти у процесі відкритого обговорення приймають рішення про шляхи виходу з цих ситуацій.
|
Рольові ігри (експертні ігри) – це експерименти, у яких колективу спеціалістів пропонують складні ситуації з предметної області. Спеціалісти у процесі відкритого обговорення приймають рішення про шляхи виходу з цих ситуацій.
|
||||||
***
|
***
|
||||||
#### Пасивні методи
|
#### Пасивні методи
|
||||||
До пасивних методів належать спостереження за діяльністю експертів, запис їхніх міркувань у процесі роботи (так звані *“думки вголос”*), лекції, які вони можуть прочитати. [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
До пасивних методів належать спостереження за діяльністю експертів, запис їхніх міркувань у процесі роботи (так звані *“думки вголос”*), лекції, які вони можуть прочитати. [](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
||||||
|
|
||||||
|
|
||||||
## Підходи та способи вирішення завдання
|
## Підходи та способи вирішення завдання
|
||||||
|
|
||||||
[Методисти виділяють методи **заочного** та **очного** експертного опитування.](http://elbib.in.ua/vidi-ekspertnogo-opituvannya-metodologiya-ta-metodi-sotsiologichnih-doslidjen.html)
|
[Методисти виділяють методи **заочного** та **очного** експертного опитування.](http://elbib.in.ua/vidi-ekspertnogo-opituvannya-metodologiya-ta-metodi-sotsiologichnih-doslidjen.html)
|
||||||
|
|
||||||
До методів **заочного** опитування відносять:
|
До методів **заочного** опитування відносять:
|
||||||
- письмове опитування («збір думок»);
|
- письмове опитування («збір думок»);
|
||||||
- анкетування;
|
- анкетування;
|
||||||
- дельфійська техніка;
|
- дельфійська техніка;
|
||||||
|
|
||||||
До **очних** методів належать:
|
До **очних** методів належать:
|
||||||
- «мозкова атака».
|
- «мозкова атака».
|
||||||
|
|
||||||
Письмове опитування (або «збір думок») – вважається найпростішим методом заочного опитування експертів. Він полягає в тому, що експертам надають спеціально підготовлені опитувальні листи, в яких вони повинні викласти свою думку по суті поставлених питань. При складанні експертного опитувальника від 50 до 90% використовуються відкриті питання. Збір думок подібний вільному інтерв'ю і відрізняється від нього лише письмовою формою опитування.
|
Письмове опитування (або «збір думок») – вважається найпростішим методом заочного опитування експертів. Він полягає в тому, що експертам надають спеціально підготовлені опитувальні листи, в яких вони повинні викласти свою думку по суті поставлених питань. При складанні експертного опитувальника від 50 до 90% використовуються відкриті питання. Збір думок подібний вільному інтерв'ю і відрізняється від нього лише письмовою формою опитування.
|
||||||
|
|
||||||
Плюси: дає можливість залучити велику кількість експертів.
|
Плюси: дає можливість залучити велику кількість експертів.
|
||||||
|
|
||||||
Мінуси: заочний опитування пов'язане з організаційними труднощами, зумовленими низьким рівнем повернення анкет.
|
Мінуси: заочний опитування пов'язане з організаційними труднощами, зумовленими низьким рівнем повернення анкет.
|
||||||
|
|
||||||
Анкетування – даний тип опитування може бути сформований як у відкритій, так і в закритій формі. Сильно відрізняється від письмового збору думок, оскільки спрямоване на з’ясування оцінок фахівцями тих чи інших аспектів готового рішення.
|
Анкетування – даний тип опитування може бути сформований як у відкритій, так і в закритій формі. Сильно відрізняється від письмового збору думок, оскільки спрямоване на з’ясування оцінок фахівцями тих чи інших аспектів готового рішення.
|
||||||
|
|
||||||
Плюси: можливість анонімного збору даних; значно спрощує можливість збору даних; стандартизація.
|
Плюси: можливість анонімного збору даних; значно спрощує можливість збору даних; стандартизація.
|
||||||
|
|
||||||
Мінуси: учасники можуть відмовитися від відповідей або дати неправильні відповіді через обмежену варіативність; негнучкість методу (негативна сторона стандартизованості).
|
Мінуси: учасники можуть відмовитися від відповідей або дати неправильні відповіді через обмежену варіативність; негнучкість методу (негативна сторона стандартизованості).
|
||||||
|
|
||||||
Метод Дельфі – опитування експертної групи в кілька турів з узгодженням думок експертів. Суть цього методу в тому, щоб за допомогою серії послідовних дій - опитувань, інтерв'ю, мозкових штурмів - домогтися максимального консенсусу при визначенні правильного рішення. Метод передбачає опитування експертів в кілька турів (зазвичай 2-3), обробку результатів кожного туру, інформування їх про ці результати і знову повторення такої ж процедури. У першому турі відповіді даються без аргументації. Після обробки виділяються крайні і середні судження і повідомляються експертам. У другому турі опитувані знову звертаються до своїх оцінок. Так як вони мали досить часу на роздуми і дізналися про існування інших позицій з цього приводу, вони можуть переглянути свої погляди або, навпаки, посилити їх аргументацію. Після другого туру обробляються нові оцінки - крайні і середні думки узагальнюються, підсумки знову доповідають експертам. Так повторюється 3-4 рази. Практика показує, що після третього або четвертого туру думки експертів не змінюються. В ході подібної процедури виробляється узгоджена оцінка, причому дослідник не повинен нехтувати громадською думкою тих, хто після неодноразових опитувань залишився на своїй позиції.
|
Метод Дельфі – опитування експертної групи в кілька турів з узгодженням думок експертів. Суть цього методу в тому, щоб за допомогою серії послідовних дій - опитувань, інтерв'ю, мозкових штурмів - домогтися максимального консенсусу при визначенні правильного рішення. Метод передбачає опитування експертів в кілька турів (зазвичай 2-3), обробку результатів кожного туру, інформування їх про ці результати і знову повторення такої ж процедури. У першому турі відповіді даються без аргументації. Після обробки виділяються крайні і середні судження і повідомляються експертам. У другому турі опитувані знову звертаються до своїх оцінок. Так як вони мали досить часу на роздуми і дізналися про існування інших позицій з цього приводу, вони можуть переглянути свої погляди або, навпаки, посилити їх аргументацію. Після другого туру обробляються нові оцінки - крайні і середні думки узагальнюються, підсумки знову доповідають експертам. Так повторюється 3-4 рази. Практика показує, що після третього або четвертого туру думки експертів не змінюються. В ході подібної процедури виробляється узгоджена оцінка, причому дослідник не повинен нехтувати громадською думкою тих, хто після неодноразових опитувань залишився на своїй позиції.
|
||||||
|
|
||||||
Плюси: подібна техніка дозволяє зменшити вплив недостатньо компетентних експертів на групову оцінку, як це спостерігається при простому анкетуванні. Воно досягається за рахунок отриманої цінної інформації від більш компетентних експертів.
|
Плюси: подібна техніка дозволяє зменшити вплив недостатньо компетентних експертів на групову оцінку, як це спостерігається при простому анкетуванні. Воно досягається за рахунок отриманої цінної інформації від більш компетентних експертів.
|
||||||
|
|
||||||
Мінуси: часові витрати; можливість втрати мотивації учасників.
|
Мінуси: часові витрати; можливість втрати мотивації учасників.
|
||||||
|
|
||||||
Метод «мозкового штурму (атаки)»
|
Метод «мозкового штурму (атаки)»
|
||||||
|
|
||||||
Плюси: стимулювання творчості; розширення горизонтів.
|
Плюси: стимулювання творчості; розширення горизонтів.
|
||||||
|
|
||||||
Мінуси: відсутність структури; можливість домінування деяких учасників.
|
Мінуси: відсутність структури; можливість домінування деяких учасників.
|
||||||
|
|
||||||
## Порівняльна характеристика існуючих засобів вирішення завдання
|
## Порівняльна характеристика існуючих засобів вирішення завдання
|
||||||
|
|
||||||
Розглядатимемо такі найпопулярніші інструменти для проведення анкетувань:
|
Розглядатимемо такі найпопулярніші інструменти для проведення анкетувань:
|
||||||
|
|
||||||
[Google Forms](https://uk.wikipedia.org/wiki/Google_Форми)
|
[Google Forms](https://uk.wikipedia.org/wiki/Google_Форми)
|
||||||
|
|
||||||
Google Forms — програмне забезпечення для адміністрування опитування,
|
Google Forms — програмне забезпечення для адміністрування опитування,
|
||||||
що входить до складу безкоштовного веб-пакету Google Docs Editors,
|
що входить до складу безкоштовного веб-пакету Google Docs Editors,
|
||||||
пропонованого Google. Послуга також включає Google Docs, Google Sheets,
|
пропонованого Google. Послуга також включає Google Docs, Google Sheets,
|
||||||
Google Slides, Google Drawings, Google Sites і Google Keep. Google Форми
|
Google Slides, Google Drawings, Google Sites і Google Keep. Google Форми
|
||||||
доступні лише як веб-додаток. Додаток дозволяє користувачам створювати та
|
доступні лише як веб-додаток. Додаток дозволяє користувачам створювати та
|
||||||
редагувати опитування в Інтернеті, співпрацюючи з іншими користувачами
|
редагувати опитування в Інтернеті, співпрацюючи з іншими користувачами
|
||||||
в режимі реального часу. Зібрану інформацію можна автоматично внести в
|
в режимі реального часу. Зібрану інформацію можна автоматично внести в
|
||||||
електронну таблицю.
|
електронну таблицю.
|
||||||
|
|
||||||
[SurveyMonkey](https://en.wikipedia.org/wiki/SurveyMonkey)
|
[SurveyMonkey](https://en.wikipedia.org/wiki/SurveyMonkey)
|
||||||
|
|
||||||
SurveyMonkey - це служба як для створення простих і невеликих опитувань,
|
SurveyMonkey - це служба як для створення простих і невеликих опитувань,
|
||||||
так і для масової розсилки анкет, виявлення тенденцій і складання більших
|
так і для масової розсилки анкет, виявлення тенденцій і складання більших
|
||||||
досліджень. Сервіс дозволяє швидко створювати опитування, налаштовувати
|
досліджень. Сервіс дозволяє швидко створювати опитування, налаштовувати
|
||||||
їх зовнішній вигляд, змінювати місцями питання, проводити А/Б-тестування,
|
їх зовнішній вигляд, змінювати місцями питання, проводити А/Б-тестування,
|
||||||
вставляти опитування на сайти та соціальні мережі, складати дуже детальні
|
вставляти опитування на сайти та соціальні мережі, складати дуже детальні
|
||||||
та наочні звіти, захищати дані та інтегрувати засоби з MailChimp,
|
та наочні звіти, захищати дані та інтегрувати засоби з MailChimp,
|
||||||
GroSocial та іншими сервісами.
|
GroSocial та іншими сервісами.
|
||||||
|
|
||||||
[Responsly](https://www.responsly.com)
|
[Responsly](https://www.responsly.com)
|
||||||
|
|
||||||
Responsly - платформа, яка дозволяє створювати онлайн-опитування та
|
Responsly - платформа, яка дозволяє створювати онлайн-опитування та
|
||||||
анкети всього за кілька секунд і надсилати їх тисячам одержувачів одним
|
анкети всього за кілька секунд і надсилати їх тисячам одержувачів одним
|
||||||
натисканням кнопки. Також є вбудована технологія штучного інтелекту, яка
|
натисканням кнопки. Також є вбудована технологія штучного інтелекту, яка
|
||||||
надає широкий вибір типів питань для опитувань, вибраних спеціально для
|
надає широкий вибір типів питань для опитувань, вибраних спеціально для
|
||||||
певної аудиторії.
|
певної аудиторії.
|
||||||
|
|
||||||
[Jotform](https://en.wikipedia.org/wiki/Jotform)
|
[Jotform](https://en.wikipedia.org/wiki/Jotform)
|
||||||
|
|
||||||
Jotform — це потужна онлайн програма, яка дозволяє будь-кому швидко
|
Jotform — це потужна онлайн програма, яка дозволяє будь-кому швидко
|
||||||
створювати власні онлайн форми. Інтуїтивно зрозумілий інтерфейс
|
створювати власні онлайн форми. Інтуїтивно зрозумілий інтерфейс
|
||||||
конструктора форм робить створення форм неймовірно простим, без написання
|
конструктора форм робить створення форм неймовірно простим, без написання
|
||||||
жодного рядка коду. За допомогою Jotform користувачі можуть створювати та
|
жодного рядка коду. За допомогою Jotform користувачі можуть створювати та
|
||||||
публікувати форми, інтегрувати їх у свій веб-сайт та отримувати відповіді
|
публікувати форми, інтегрувати їх у свій веб-сайт та отримувати відповіді
|
||||||
електронною поштою. Jotform дозволяє створювати онлайн форми, отримувати
|
електронною поштою. Jotform дозволяє створювати онлайн форми, отримувати
|
||||||
відповіді безпосередньо в електронних листах та створювати PDF форми для
|
відповіді безпосередньо в електронних листах та створювати PDF форми для
|
||||||
заповнення.
|
заповнення.
|
||||||
|
|
||||||
[QuestionPro](https://questionpro.com/)
|
[QuestionPro](https://questionpro.com/)
|
||||||
|
|
||||||
QuestionPro — це програмне забезпечення для створення та розповсюдження
|
QuestionPro — це програмне забезпечення для створення та розповсюдження
|
||||||
опитувань. Воно складається з інтуїтивно зрозумілого інтерфейсу для
|
опитувань. Воно складається з інтуїтивно зрозумілого інтерфейсу для
|
||||||
створення запитань для опитувань, інструментів для їх розповсюдження
|
створення запитань для опитувань, інструментів для їх розповсюдження
|
||||||
електронною поштою або на веб-сайті та інструментів для аналізу та
|
електронною поштою або на веб-сайті та інструментів для аналізу та
|
||||||
перегляду результатів.
|
перегляду результатів.
|
||||||
|
|
||||||
[Fillout](https://www.fillout.com/)
|
[Fillout](https://www.fillout.com/)
|
||||||
|
|
||||||
Fillout — це платформа для створення форм, опитувань і тестів. Fillout
|
Fillout — це платформа для створення форм, опитувань і тестів. Fillout
|
||||||
інтегрується з інструментами, які вже використовує користувач, щоб
|
інтегрується з інструментами, які вже використовує користувач, щоб
|
||||||
допомогти автоматизувати робочі процеси та масштабувати операції. Час
|
допомогти автоматизувати робочі процеси та масштабувати операції. Час
|
||||||
безперебійної роботи платформи та безпека додатків є двома пріоритетами
|
безперебійної роботи платформи та безпека додатків є двома пріоритетами
|
||||||
Fillout. Для компаній із суворими вимогами щодо резидентності даних та
|
Fillout. Для компаній із суворими вимогами щодо резидентності даних та
|
||||||
іншими вимогами Fillout пропонує корпоративне рішення для безпечного
|
іншими вимогами Fillout пропонує корпоративне рішення для безпечного
|
||||||
отримання даних у будь-якому масштабі.
|
отримання даних у будь-якому масштабі.
|
||||||
|
|
||||||
Порівняймо наведені вище сервіси із нашим проєктом.
|
Порівняймо наведені вище сервіси із нашим проєктом.
|
||||||
|
|
||||||
Умовні позначення в таблиці порівняння:
|
Умовні позначення в таблиці порівняння:
|
||||||
- 🔴 засіб не відповідає критерію
|
- 🔴 засіб не відповідає критерію
|
||||||
- 🟡 засіб частково відповідає критерію або вимагає коштів для повноцінного функціоналу
|
- 🟡 засіб частково відповідає критерію або вимагає коштів для повноцінного функціоналу
|
||||||
- 🟢 засіб цілком відповідає критерію в безкоштовній версії
|
- 🟢 засіб цілком відповідає критерію в безкоштовній версії
|
||||||
- ⚪ засіб частково або повністю не надав інформацію щодо критерію
|
- ⚪ засіб частково або повністю не надав інформацію щодо критерію
|
||||||
|
|
||||||
| Критерій |Xpertise (наш проєкт)|Google Forms|SurveyMonkey|Responsly|Jotform|QuestionPro|Fillout|
|
| Критерій |Xpertise (наш проєкт)|Google Forms|SurveyMonkey|Responsly|Jotform|QuestionPro|Fillout|
|
||||||
|:-----------:|:-------------------:|:----------:|:----------:|:-------:|:-----:|:---------:|:-----:|
|
|:-----------:|:-------------------:|:----------:|:----------:|:-------:|:-----:|:---------:|:-----:|
|
||||||
|**Functionality**| | | | | | | |
|
|**Functionality**| | | | | | | |
|
||||||
|Мобільна версія| 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 |
|
|Мобільна версія| 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 |
|
||||||
|Типи відповідей| 4 шт. |⚪ |4 шт. (до 13 шт.)|⚪ |⚪|30 шт. (до 52 шт.)|40+ шт.|
|
|Типи відповідей| 4 шт. |⚪ |4 шт. (до 13 шт.)|⚪ |⚪|30 шт. (до 52 шт.)|40+ шт.|
|
||||||
|К-ть запитань в одній формі|50|безліч|10 (до безмежності)| безліч |100 (до 1 тис.)|безліч|безліч|
|
|К-ть запитань в одній формі|50|безліч|10 (до безмежності)| безліч |100 (до 1 тис.)|безліч|безліч|
|
||||||
|К-ть форм | 50 (до 10 тис.) |безліч | безліч |3| 5 (до 100)|10 (до безмежності)| безліч |
|
|К-ть форм | 50 (до 10 тис.) |безліч | безліч |3| 5 (до 100)|10 (до безмежності)| безліч |
|
||||||
|Макс. к-ть опитаних|10 тис. (до 10 млн.)|безліч | 25/міс. (до 40 тис./рік) |10/міс. (до 10 тис./міс.)|100/міс. (до 10 тис./міс.)|200/форму (до 100 тис./рік)|1 тис./міс. (до 10 тис./міс.)|
|
|Макс. к-ть опитаних|10 тис. (до 10 млн.)|безліч | 25/міс. (до 40 тис./рік) |10/міс. (до 10 тис./міс.)|100/міс. (до 10 тис./міс.)|200/форму (до 100 тис./рік)|1 тис./міс. (до 10 тис./міс.)|
|
||||||
|Випадкова послідовність запитань|🟢| 🔴 | €99/міс. | $79/міс. | ⚪ | 🟡 | ⚪ |
|
|Випадкова послідовність запитань|🟢| 🔴 | €99/міс. | $79/міс. | ⚪ | 🟡 | ⚪ |
|
||||||
|Умовні переходи| 🟢 | 🔴 | €39/міс. | 🟡 | ⚪ | 🟡 | 🟢 |
|
|Умовні переходи| 🟢 | 🔴 | €39/міс. | 🟡 | ⚪ | 🟡 | 🟢 |
|
||||||
|Квота відповідей| 🟢 | ⚪ | €432/рік | $79/міс. | ⚪ | ⚪ | ⚪ |
|
|Квота відповідей| 🟢 | ⚪ | €432/рік | $79/міс. | ⚪ | ⚪ | ⚪ |
|
||||||
|Таймер закінчення опитування| 🟢 | 🟢 | ⚪ | ⚪ | ⚪ | $1188/рік | $15/місяць |
|
|Таймер закінчення опитування| 🟢 | 🟢 | ⚪ | ⚪ | ⚪ | $1188/рік | $15/місяць |
|
||||||
|Перегляд недозаповнених форм| 🟢 | 🔴 | ⚪ | ⚪ | ⚪ | ⚪ | $75/міс. |
|
|Перегляд недозаповнених форм| 🟢 | 🔴 | ⚪ | ⚪ | ⚪ | ⚪ | $75/міс. |
|
||||||
|Завантаження файлів| 🟢 | 🟢 | €432/рік | ⚪ | 🟢 | ⚪ | 🟢 |
|
|Завантаження файлів| 🟢 | 🟢 | €432/рік | ⚪ | 🟢 | ⚪ | 🟢 |
|
||||||
|Доступне файлове сховище| 2 Гб (до 1 Тб) | 15 Гб (до 5 Тб) | без меж | - | 100 Мб (до 100 Гб) | - | 20 Мб/файл (до 1 Гб/файл |
|
|Доступне файлове сховище| 2 Гб (до 1 Тб) | 15 Гб (до 5 Тб) | без меж | - | 100 Мб (до 100 Гб) | - | 20 Мб/файл (до 1 Гб/файл |
|
||||||
|**Usability**|||||||||
|
|**Usability**|||||||||
|
||||||
|Простий будівельник форм|🟢|🟢|🟢|🟢|🟢|🟢|🟢|
|
|Простий будівельник форм|🟢|🟢|🟢|🟢|🟢|🟢|🟢|
|
||||||
|AI-помічник| 🔴 | 🔴 | 🔴 | $49/міс. | 🔴 | 🔴 | 🟢 |
|
|AI-помічник| 🔴 | 🔴 | 🔴 | $49/міс. | 🔴 | 🔴 | 🟢 |
|
||||||
|Заміна брендингу на власний|🟢 | $12/міс. | €1188/рік. | $159/міс. | 🟡 | $1188/рік | $40/міс. |
|
|Заміна брендингу на власний|🟢 | $12/міс. | €1188/рік. | $159/міс. | 🟡 | $1188/рік | $40/міс. |
|
||||||
|Налаштування кольорової палітри|🟢 | 🟢 | €432/рік | $159/міс. | ⚪ | $15/міс. | $40/міс. |
|
|Налаштування кольорової палітри|🟢 | 🟢 | €432/рік | $159/міс. | ⚪ | $15/міс. | $40/міс. |
|
||||||
|Перегляд аналітики в реальному часі| 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟡 |
|
|Перегляд аналітики в реальному часі| 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟡 |
|
||||||
|**Reliability**||||||||
|
|**Reliability**||||||||
|
||||||
|Автоматичні резервні копії| 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 |
|
|Автоматичні резервні копії| 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 |
|
||||||
|Шифрування з'єднань| 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 |
|
|Шифрування з'єднань| 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 |
|
||||||
|**Performance**||||||||
|
|**Performance**||||||||
|
||||||
|Оптимальне використання мережі| 🟢 | 🔴 | 🟡 | 🟢 | 🔴 | 🟡 | 🟡 |
|
|Оптимальне використання мережі| 🟢 | 🔴 | 🟡 | 🟢 | 🔴 | 🟡 | 🟡 |
|
||||||
|**Supportability**||||||||
|
|**Supportability**||||||||
|
||||||
|Інструкція з використання| 🟢 | ⚪ | ⚪ | 🟢 | 🟢 | 🟢 | 🟢 |
|
|Інструкція з використання| 🟢 | ⚪ | ⚪ | 🟢 | 🟢 | 🟢 | 🟢 |
|
||||||
|Онлайн-підтримка| 🟢 | $72/рік | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 |
|
|Онлайн-підтримка| 🟢 | $72/рік | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 |
|
||||||
|
|
||||||
## Висновки
|
## Висновки
|
||||||
Завдяки проведеному дослідженню ринку бачимо, що більшість сучасних платформ не надають безкоштовної можливості налаштовувати умовні переходи між сторінками опитування, а також значно обмежують максимальну кількість зібраних відповідей. Комбінація цих функцій у безкоштовній версії нашого сервісу може стати вагомою перевагою для певних груп користувачів.
|
Завдяки проведеному дослідженню ринку бачимо, що більшість сучасних платформ не надають безкоштовної можливості налаштовувати умовні переходи між сторінками опитування, а також значно обмежують максимальну кількість зібраних відповідей. Комбінація цих функцій у безкоштовній версії нашого сервісу може стати вагомою перевагою для певних груп користувачів.
|
||||||
|
|
||||||
Також додаткові функції (такі як квоти відповідей або перегляд недозаповнених форм), що наявні в безкоштовній версії продукту, можуть привабити додаткових користувачів, що бажають отримати такі інструменти, проте не хочуть віддавати чималі гроші за коштовні сервіси. З огляду на це вважаємо, що розробка такого проєкту має сенс.
|
Також додаткові функції (такі як квоти відповідей або перегляд недозаповнених форм), що наявні в безкоштовній версії продукту, можуть привабити додаткових користувачів, що бажають отримати такі інструменти, проте не хочуть віддавати чималі гроші за коштовні сервіси. З огляду на це вважаємо, що розробка такого проєкту має сенс.
|
||||||
|
|
||||||
## Література
|
## Література
|
||||||
|
|
||||||
1. [https://uk.wikipedia.org/wiki/База_даних](https://uk.wikipedia.org/wiki/База_даних)
|
1. [https://uk.wikipedia.org/wiki/База_даних](https://uk.wikipedia.org/wiki/База_даних)
|
||||||
2. [https://uk.wikipedia.org/wiki/SQL](https://uk.wikipedia.org/wiki/SQL)
|
2. [https://uk.wikipedia.org/wiki/SQL](https://uk.wikipedia.org/wiki/SQL)
|
||||||
3. [https://uk.wikipedia.org/wiki/Опитування](https://uk.wikipedia.org/wiki/Опитування)
|
3. [https://uk.wikipedia.org/wiki/Опитування](https://uk.wikipedia.org/wiki/Опитування)
|
||||||
4. [https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
4. [https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content](https://ela.kpi.ua/server/api/core/bitstreams/8a8030cf-bfc1-4586-b197-1c7e3bf02700/content)
|
||||||
5. [http://elbib.in.ua/vidi-ekspertnogo-opituvannya-metodologiya-ta-metodi-sotsiologichnih-doslidjen.html](http://elbib.in.ua/vidi-ekspertnogo-opituvannya-metodologiya-ta-metodi-sotsiologichnih-doslidjen.html)
|
5. [http://elbib.in.ua/vidi-ekspertnogo-opituvannya-metodologiya-ta-metodi-sotsiologichnih-doslidjen.html](http://elbib.in.ua/vidi-ekspertnogo-opituvannya-metodologiya-ta-metodi-sotsiologichnih-doslidjen.html)
|
||||||
6. [https://uk.wikipedia.org/wiki/Google_Форми](https://uk.wikipedia.org/wiki/Google_Форми)
|
6. [https://uk.wikipedia.org/wiki/Google_Форми](https://uk.wikipedia.org/wiki/Google_Форми)
|
||||||
7. [https://en.wikipedia.org/wiki/SurveyMonkey](https://en.wikipedia.org/wiki/SurveyMonkey)
|
7. [https://en.wikipedia.org/wiki/SurveyMonkey](https://en.wikipedia.org/wiki/SurveyMonkey)
|
||||||
8. [https://www.responsly.com](https://www.responsly.com)
|
8. [https://www.responsly.com](https://www.responsly.com)
|
||||||
9. [https://en.wikipedia.org/wiki/Jotform](https://en.wikipedia.org/wiki/Jotform)
|
9. [https://en.wikipedia.org/wiki/Jotform](https://en.wikipedia.org/wiki/Jotform)
|
||||||
10. [https://questionpro.com/](https://questionpro.com/)
|
10. [https://questionpro.com/](https://questionpro.com/)
|
||||||
11. [https://www.fillout.com/](https://www.fillout.com/)
|
11. [https://www.fillout.com/](https://www.fillout.com/)
|
||||||
|
|
|
@ -1,176 +1,176 @@
|
||||||
# Реалізація інформаційного та програмного забезпечення
|
# Реалізація інформаційного та програмного забезпечення
|
||||||
|
|
||||||
## SQL-скрипт для створення та початкового наповнення бази даних
|
## SQL-скрипт для створення та початкового наповнення бази даних
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
-- MySQL Workbench Forward Engineering
|
-- MySQL Workbench Forward Engineering
|
||||||
|
|
||||||
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
|
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
|
||||||
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_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';
|
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
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Schema mydb
|
-- Schema mydb
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
|
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
|
||||||
USE `mydb` ;
|
USE `mydb` ;
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Account`
|
-- Table `mydb`.`Account`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Account` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Account` (
|
||||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`username` CHAR(255) NOT NULL,
|
`username` CHAR(255) NOT NULL,
|
||||||
`password` CHAR(255) NOT NULL,
|
`password` CHAR(255) NOT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
|
UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Survey`
|
-- Table `mydb`.`Survey`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Survey` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Survey` (
|
||||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`isPaused` TINYINT UNSIGNED NOT NULL,
|
`isPaused` TINYINT UNSIGNED NOT NULL,
|
||||||
`isNamed` TINYINT UNSIGNED NOT NULL,
|
`isNamed` TINYINT UNSIGNED NOT NULL,
|
||||||
`name` CHAR(255) NULL,
|
`name` CHAR(255) NULL,
|
||||||
`duration` CHAR(255) NULL,
|
`duration` CHAR(255) NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
CONSTRAINT `fk_Survey_Account1`
|
CONSTRAINT `fk_Survey_Account1`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Account` (`id`)
|
REFERENCES `mydb`.`Account` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION)
|
ON UPDATE NO ACTION)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Question`
|
-- Table `mydb`.`Question`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Question` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Question` (
|
||||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`Text` CHAR(255) NULL,
|
`Text` CHAR(255) NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
CONSTRAINT `fk_Question_Survey1`
|
CONSTRAINT `fk_Question_Survey1`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Survey` (`id`)
|
REFERENCES `mydb`.`Survey` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION)
|
ON UPDATE NO ACTION)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Response`
|
-- Table `mydb`.`Response`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Response` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Response` (
|
||||||
`id` INT UNSIGNED NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NULL AUTO_INCREMENT,
|
||||||
`Value` VARCHAR(16384) NULL,
|
`Value` VARCHAR(16384) NULL,
|
||||||
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
CONSTRAINT `fk_Response_Question`
|
CONSTRAINT `fk_Response_Question`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Question` (`id`)
|
REFERENCES `mydb`.`Question` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION,
|
ON UPDATE NO ACTION,
|
||||||
CONSTRAINT `fk_Response_Account1`
|
CONSTRAINT `fk_Response_Account1`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Account` (`id`)
|
REFERENCES `mydb`.`Account` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION)
|
ON UPDATE NO ACTION)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Link`
|
-- Table `mydb`.`Link`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Link` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Link` (
|
||||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`uses` INT NOT NULL,
|
`uses` INT NOT NULL,
|
||||||
`responces` INT NOT NULL,
|
`responces` INT NOT NULL,
|
||||||
`usageLimit` INT NULL,
|
`usageLimit` INT NULL,
|
||||||
`responceLimit` INT NULL,
|
`responceLimit` INT NULL,
|
||||||
`path` CHAR(32) NOT NULL,
|
`path` CHAR(32) NOT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
CONSTRAINT `fk_Link_Survey1`
|
CONSTRAINT `fk_Link_Survey1`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Survey` (`id`)
|
REFERENCES `mydb`.`Survey` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION)
|
ON UPDATE NO ACTION)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
SET SQL_MODE=@OLD_SQL_MODE;
|
SET SQL_MODE=@OLD_SQL_MODE;
|
||||||
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|
||||||
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
|
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
|
||||||
```
|
```
|
||||||
## RESTfull-сервіс для керування опитуваннями
|
## RESTfull-сервіс для керування опитуваннями
|
||||||
|
|
||||||
Код серверу (Python, Flask) для таблиці "survey":
|
Код серверу (Python, Flask) для таблиці "survey":
|
||||||
```from flask import Flask, request, jsonify
|
```from flask import Flask, request, jsonify
|
||||||
from flask_sqlalchemy import SQLAlchemy
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234@localhost/odb'
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234@localhost/odb'
|
||||||
db = SQLAlchemy(app)
|
db = SQLAlchemy(app)
|
||||||
|
|
||||||
class Survey(db.Model):
|
class Survey(db.Model):
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
isPaused = db.Column(db.Boolean)
|
isPaused = db.Column(db.Boolean)
|
||||||
isNamed = db.Column(db.Boolean)
|
isNamed = db.Column(db.Boolean)
|
||||||
name = db.Column(db.String(255))
|
name = db.Column(db.String(255))
|
||||||
duration = db.Column(db.Integer)
|
duration = db.Column(db.Integer)
|
||||||
account_id = db.Column(db.Integer)
|
account_id = db.Column(db.Integer)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<Survey {self.name}>"
|
return f"<Survey {self.name}>"
|
||||||
|
|
||||||
def as_dict(self):
|
def as_dict(self):
|
||||||
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
||||||
|
|
||||||
@app.route("/api/survey", methods=["GET", "POST"])
|
@app.route("/api/survey", methods=["GET", "POST"])
|
||||||
def api_survey():
|
def api_survey():
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
surveys = Survey.query.all()
|
surveys = Survey.query.all()
|
||||||
return jsonify([survey.as_dict() for survey in surveys])
|
return jsonify([survey.as_dict() for survey in surveys])
|
||||||
|
|
||||||
elif request.method == "POST":
|
elif request.method == "POST":
|
||||||
data = request.json
|
data = request.json
|
||||||
new_survey = Survey(isPaused=data['isPaused'], isNamed=data['isNamed'], name=data['name'],
|
new_survey = Survey(isPaused=data['isPaused'], isNamed=data['isNamed'], name=data['name'],
|
||||||
duration=data['duration'], account_id=data['account_id'])
|
duration=data['duration'], account_id=data['account_id'])
|
||||||
db.session.add(new_survey)
|
db.session.add(new_survey)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify({'success': True}), 201
|
return jsonify({'success': True}), 201
|
||||||
|
|
||||||
@app.route("/api/survey/<int:survey_id>", methods=["GET", "PUT", "DELETE"])
|
@app.route("/api/survey/<int:survey_id>", methods=["GET", "PUT", "DELETE"])
|
||||||
def api_survey_numbered(survey_id):
|
def api_survey_numbered(survey_id):
|
||||||
survey = Survey.query.get_or_404(survey_id)
|
survey = Survey.query.get_or_404(survey_id)
|
||||||
|
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
return jsonify(survey.as_dict())
|
return jsonify(survey.as_dict())
|
||||||
|
|
||||||
elif request.method == "PUT":
|
elif request.method == "PUT":
|
||||||
data = request.json
|
data = request.json
|
||||||
survey.isPaused = data['isPaused']
|
survey.isPaused = data['isPaused']
|
||||||
survey.isNamed = data['isNamed']
|
survey.isNamed = data['isNamed']
|
||||||
survey.name = data['name']
|
survey.name = data['name']
|
||||||
survey.duration = data['duration']
|
survey.duration = data['duration']
|
||||||
survey.account_id = data['account_id']
|
survey.account_id = data['account_id']
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify({'success': True})
|
return jsonify({'success': True})
|
||||||
|
|
||||||
elif request.method == "DELETE":
|
elif request.method == "DELETE":
|
||||||
db.session.delete(survey)
|
db.session.delete(survey)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify({'success': True})
|
return jsonify({'success': True})
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(debug=True)
|
app.run(debug=True)
|
||||||
'''
|
'''
|
|
@ -1,34 +1,34 @@
|
||||||
# Тестування працездатності системи
|
# Тестування працездатності системи
|
||||||
|
|
||||||
Тестування працездатності системи
|
Тестування працездатності системи
|
||||||
Для тестування системи використовувся додаток Postman
|
Для тестування системи використовувся додаток Postman
|
||||||
|
|
||||||
Запуск сервера:
|
Запуск сервера:
|
||||||
![alt text](image.png)
|
![alt text](image.png)
|
||||||
|
|
||||||
Метод POST
|
Метод POST
|
||||||
POST Survey
|
POST Survey
|
||||||
Запит та відповідь:
|
Запит та відповідь:
|
||||||
![alt text](image-1.png)
|
![alt text](image-1.png)
|
||||||
|
|
||||||
Перевірка за допомогою GET:
|
Перевірка за допомогою GET:
|
||||||
![![alt text](image-2.png)](image-2.png)
|
![![alt text](image-2.png)](image-2.png)
|
||||||
|
|
||||||
Метод PUT
|
Метод PUT
|
||||||
PUT Survey
|
PUT Survey
|
||||||
Запит та відповідь:
|
Запит та відповідь:
|
||||||
![alt text](image-3.png)
|
![alt text](image-3.png)
|
||||||
|
|
||||||
Перевірка за допомогою GET:
|
Перевірка за допомогою GET:
|
||||||
![alt text](image-4.png)
|
![alt text](image-4.png)
|
||||||
|
|
||||||
Метод DELETE
|
Метод DELETE
|
||||||
DELETE Survey
|
DELETE Survey
|
||||||
Запит та відповідь:
|
Запит та відповідь:
|
||||||
![alt text](image-5.png)
|
![alt text](image-5.png)
|
||||||
|
|
||||||
Перевірка за допомогою GET:
|
Перевірка за допомогою GET:
|
||||||
![alt text](image-6.png)
|
![alt text](image-6.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
44
jsdoc.json
|
@ -1,23 +1,23 @@
|
||||||
{
|
{
|
||||||
"tags": {
|
"tags": {
|
||||||
"allowUnknownTags": false
|
"allowUnknownTags": false
|
||||||
},
|
},
|
||||||
"source": {
|
"source": {
|
||||||
"include": "src/",
|
"include": "src/",
|
||||||
"includePattern": ".js$",
|
"includePattern": ".js$",
|
||||||
"excludePattern": "(node_modules/|docs)"
|
"excludePattern": "(node_modules/|docs)"
|
||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"plugins/markdown"
|
"plugins/markdown"
|
||||||
],
|
],
|
||||||
"opts": {
|
"opts": {
|
||||||
"encoding": "utf8",
|
"encoding": "utf8",
|
||||||
"destination": "./.public/docs/",
|
"destination": "./.public/docs/",
|
||||||
"recurse": true,
|
"recurse": true,
|
||||||
"verbose": true
|
"verbose": true
|
||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"cleverLinks": false,
|
"cleverLinks": false,
|
||||||
"monospaceLinks": false
|
"monospaceLinks": false
|
||||||
}
|
}
|
||||||
}
|
}
|
52
package.json
|
@ -1,26 +1,26 @@
|
||||||
{
|
{
|
||||||
"name": "dis-edu",
|
"name": "dis-edu",
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"description": "Databases course work template",
|
"description": "Databases course work template",
|
||||||
"repository": "http://139.162.162.130:3000/hasslesstech/edu-dis-labs",
|
"repository": "http://139.162.162.130:3000/hasslesstech/edu-dis-labs",
|
||||||
"author": "Andrey Boldak <boldak.andrey@gmail.com>",
|
"author": "Andrey Boldak <boldak.andrey@gmail.com>",
|
||||||
"license": "ECL 2.0",
|
"license": "ECL 2.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"docs:api": "jsdoc2md src/**/*.js > docs/api/README.md",
|
"docs:api": "jsdoc2md src/**/*.js > docs/api/README.md",
|
||||||
"docs:dev": "npm run docs:api && npx vuepress dev docs",
|
"docs:dev": "npm run docs:api && npx vuepress dev docs",
|
||||||
"docs:build": "npm run docs:api && npx vuepress build docs",
|
"docs:build": "npm run docs:api && npx vuepress build docs",
|
||||||
"publish": "publish.sh"
|
"publish": "publish.sh"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vuepress/plugin-back-to-top": "^1.7.1",
|
"@vuepress/plugin-back-to-top": "^1.7.1",
|
||||||
"@vuepress/plugin-pwa": "^1.7.1",
|
"@vuepress/plugin-pwa": "^1.7.1",
|
||||||
"vuepress": "^1.7.1",
|
"vuepress": "^1.7.1",
|
||||||
"vuepress-theme-cool": "^1.3.1"
|
"vuepress-theme-cool": "^1.3.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"jest": "^27.1.0",
|
"jest": "^27.1.0",
|
||||||
"jsdoc-to-markdown": "^7.0.1"
|
"jsdoc-to-markdown": "^7.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
# abort on errors
|
# abort on errors
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# build
|
# build
|
||||||
npm run docs:build
|
npm run docs:build
|
||||||
|
|
||||||
# navigate into the build output directory
|
# navigate into the build output directory
|
||||||
cd docs/.vuepress/dist
|
cd docs/.vuepress/dist
|
||||||
|
|
||||||
# if you are deploying to a custom domain
|
# if you are deploying to a custom domain
|
||||||
# echo 'www.example.com' > CNAME
|
# echo 'www.example.com' > CNAME
|
||||||
|
|
||||||
git init
|
git init
|
||||||
git add -A
|
git add -A
|
||||||
git commit -m '[automated]: pushing regenerated documentation'
|
git commit -m '[automated]: pushing regenerated documentation'
|
||||||
|
|
||||||
# if you are deploying to https://<USERNAME>.github.io
|
# if you are deploying to https://<USERNAME>.github.io
|
||||||
# git push -f git@github.com:boldak/<USERNAME>.github.io.git master
|
# git push -f git@github.com:boldak/<USERNAME>.github.io.git master
|
||||||
|
|
||||||
# if you are deploying to https://<USERNAME>.github.io/<REPO>
|
# if you are deploying to https://<USERNAME>.github.io/<REPO>
|
||||||
git push -f http://10.1.1.1:3000/hasslesstech/edu-dis-labs master:gh-pages
|
git push -f http://10.1.1.1:3000/hasslesstech/edu-dis-labs master:gh-pages
|
||||||
|
|
||||||
cd -
|
cd -
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
# JS-скрипти
|
# JS-скрипти
|
||||||
|
|
||||||
В цьому розділі розміщені програмні коди javascript.
|
В цьому розділі розміщені програмні коди javascript.
|
|
@ -1,63 +1,63 @@
|
||||||
from flask import Flask, request, jsonify
|
from flask import Flask, request, jsonify
|
||||||
from flask_sqlalchemy import SQLAlchemy
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234@localhost/odb'
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234@localhost/odb'
|
||||||
db = SQLAlchemy(app)
|
db = SQLAlchemy(app)
|
||||||
|
|
||||||
class Survey(db.Model):
|
class Survey(db.Model):
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
isPaused = db.Column(db.Boolean)
|
isPaused = db.Column(db.Boolean)
|
||||||
isNamed = db.Column(db.Boolean)
|
isNamed = db.Column(db.Boolean)
|
||||||
name = db.Column(db.String(255))
|
name = db.Column(db.String(255))
|
||||||
duration = db.Column(db.Integer)
|
duration = db.Column(db.Integer)
|
||||||
account_id = db.Column(db.Integer)
|
account_id = db.Column(db.Integer)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<Survey {self.name}>"
|
return f"<Survey {self.name}>"
|
||||||
|
|
||||||
def as_dict(self):
|
def as_dict(self):
|
||||||
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
|
||||||
|
|
||||||
@app.route("/api/survey", methods=["GET", "POST"])
|
@app.route("/api/survey", methods=["GET", "POST"])
|
||||||
def api_survey():
|
def api_survey():
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
surveys = Survey.query.all()
|
surveys = Survey.query.all()
|
||||||
return jsonify([survey.as_dict() for survey in surveys])
|
return jsonify([survey.as_dict() for survey in surveys])
|
||||||
|
|
||||||
elif request.method == "POST":
|
elif request.method == "POST":
|
||||||
data = request.json
|
data = request.json
|
||||||
new_survey = Survey(isPaused=data['isPaused'], isNamed=data['isNamed'], name=data['name'],
|
new_survey = Survey(isPaused=data['isPaused'], isNamed=data['isNamed'], name=data['name'],
|
||||||
duration=data['duration'], account_id=data['account_id'])
|
duration=data['duration'], account_id=data['account_id'])
|
||||||
db.session.add(new_survey)
|
db.session.add(new_survey)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify({'success': True}), 201
|
return jsonify({'success': True}), 201
|
||||||
|
|
||||||
@app.route("/api/survey/<int:survey_id>", methods=["GET", "PUT", "DELETE"])
|
@app.route("/api/survey/<int:survey_id>", methods=["GET", "PUT", "DELETE"])
|
||||||
def api_survey_numbered(survey_id):
|
def api_survey_numbered(survey_id):
|
||||||
survey = Survey.query.get_or_404(survey_id)
|
survey = Survey.query.get_or_404(survey_id)
|
||||||
|
|
||||||
|
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
return jsonify(survey.as_dict())
|
return jsonify(survey.as_dict())
|
||||||
|
|
||||||
elif request.method == "PUT":
|
elif request.method == "PUT":
|
||||||
data = request.json
|
data = request.json
|
||||||
|
|
||||||
|
|
||||||
survey.isPaused = data['isPaused']
|
survey.isPaused = data['isPaused']
|
||||||
survey.isNamed = data['isNamed']
|
survey.isNamed = data['isNamed']
|
||||||
survey.name = data['name']
|
survey.name = data['name']
|
||||||
survey.duration = data['duration']
|
survey.duration = data['duration']
|
||||||
survey.account_id = data['account_id']
|
survey.account_id = data['account_id']
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify({'success': True})
|
return jsonify({'success': True})
|
||||||
|
|
||||||
elif request.method == "DELETE":
|
elif request.method == "DELETE":
|
||||||
db.session.delete(survey)
|
db.session.delete(survey)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify({'success': True})
|
return jsonify({'success': True})
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(debug=True)
|
app.run(debug=True)
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
# SQL-скрипти
|
# SQL-скрипти
|
||||||
|
|
||||||
В цьому розділі розміщені сирцеві коди для створення бази даних.
|
В цьому розділі розміщені сирцеві коди для створення бази даних.
|
|
@ -1,107 +1,107 @@
|
||||||
-- MySQL Workbench Forward Engineering
|
-- MySQL Workbench Forward Engineering
|
||||||
|
|
||||||
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
|
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
|
||||||
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_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';
|
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
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Schema mydb
|
-- Schema mydb
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
|
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
|
||||||
USE `mydb` ;
|
USE `mydb` ;
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Account`
|
-- Table `mydb`.`Account`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Account` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Account` (
|
||||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`username` CHAR(255) NOT NULL,
|
`username` CHAR(255) NOT NULL,
|
||||||
`password` CHAR(255) NOT NULL,
|
`password` CHAR(255) NOT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
|
UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Survey`
|
-- Table `mydb`.`Survey`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Survey` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Survey` (
|
||||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`isPaused` TINYINT UNSIGNED NOT NULL,
|
`isPaused` TINYINT UNSIGNED NOT NULL,
|
||||||
`isNamed` TINYINT UNSIGNED NOT NULL,
|
`isNamed` TINYINT UNSIGNED NOT NULL,
|
||||||
`name` CHAR(255) NULL,
|
`name` CHAR(255) NULL,
|
||||||
`duration` CHAR(255) NULL,
|
`duration` CHAR(255) NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
CONSTRAINT `fk_Survey_Account1`
|
CONSTRAINT `fk_Survey_Account1`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Account` (`id`)
|
REFERENCES `mydb`.`Account` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION)
|
ON UPDATE NO ACTION)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Question`
|
-- Table `mydb`.`Question`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Question` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Question` (
|
||||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`Text` CHAR(255) NULL,
|
`Text` CHAR(255) NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
CONSTRAINT `fk_Question_Survey1`
|
CONSTRAINT `fk_Question_Survey1`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Survey` (`id`)
|
REFERENCES `mydb`.`Survey` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION)
|
ON UPDATE NO ACTION)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Response`
|
-- Table `mydb`.`Response`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Response` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Response` (
|
||||||
`id` INT UNSIGNED NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NULL AUTO_INCREMENT,
|
||||||
`Value` VARCHAR(16384) NULL,
|
`Value` VARCHAR(16384) NULL,
|
||||||
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
CONSTRAINT `fk_Response_Question`
|
CONSTRAINT `fk_Response_Question`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Question` (`id`)
|
REFERENCES `mydb`.`Question` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION,
|
ON UPDATE NO ACTION,
|
||||||
CONSTRAINT `fk_Response_Account1`
|
CONSTRAINT `fk_Response_Account1`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Account` (`id`)
|
REFERENCES `mydb`.`Account` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION)
|
ON UPDATE NO ACTION)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
-- Table `mydb`.`Link`
|
-- Table `mydb`.`Link`
|
||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `mydb`.`Link` (
|
CREATE TABLE IF NOT EXISTS `mydb`.`Link` (
|
||||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`uses` INT NOT NULL,
|
`uses` INT NOT NULL,
|
||||||
`responces` INT NOT NULL,
|
`responces` INT NOT NULL,
|
||||||
`usageLimit` INT NULL,
|
`usageLimit` INT NULL,
|
||||||
`responceLimit` INT NULL,
|
`responceLimit` INT NULL,
|
||||||
`path` CHAR(32) NOT NULL,
|
`path` CHAR(32) NOT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
CONSTRAINT `fk_Link_Survey1`
|
CONSTRAINT `fk_Link_Survey1`
|
||||||
FOREIGN KEY (`id`)
|
FOREIGN KEY (`id`)
|
||||||
REFERENCES `mydb`.`Survey` (`id`)
|
REFERENCES `mydb`.`Survey` (`id`)
|
||||||
ON DELETE NO ACTION
|
ON DELETE NO ACTION
|
||||||
ON UPDATE NO ACTION)
|
ON UPDATE NO ACTION)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
SET SQL_MODE=@OLD_SQL_MODE;
|
SET SQL_MODE=@OLD_SQL_MODE;
|
||||||
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|
||||||
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
|
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
|
||||||
|
|
|
@ -1,305 +1,305 @@
|
||||||
#!/bin/python3
|
#!/bin/python3
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
|
||||||
# magic values
|
# magic values
|
||||||
NO = 0
|
NO = 0
|
||||||
AUTO = 1
|
AUTO = 1
|
||||||
YES = 2
|
YES = 2
|
||||||
|
|
||||||
def convert_generic_v1(data):
|
def convert_generic_v1(data):
|
||||||
split_raw_lines = [i.strip().split("|") for i in data.split("\n") if i]
|
split_raw_lines = [i.strip().split("|") for i in data.split("\n") if i]
|
||||||
|
|
||||||
return generate_table(split_raw_lines)
|
return generate_table(split_raw_lines)
|
||||||
|
|
||||||
def convert_usecase_v1(filename, data):
|
def convert_usecase_v1(filename, data):
|
||||||
split_raw_lines_from_file = [i.split(" | ") for i in data.split("\n") if i]
|
split_raw_lines_from_file = [i.split(" | ") for i in data.split("\n") if i]
|
||||||
|
|
||||||
if '/' in filename:
|
if '/' in filename:
|
||||||
use_case_name = filename.rsplit("/", 1)[1].upper()
|
use_case_name = filename.rsplit("/", 1)[1].upper()
|
||||||
elif '\\' in filename:
|
elif '\\' in filename:
|
||||||
use_case_name = filename.rsplit("\\", 1)[1].upper()
|
use_case_name = filename.rsplit("\\", 1)[1].upper()
|
||||||
else:
|
else:
|
||||||
use_case_name = filename.upper()
|
use_case_name = filename.upper()
|
||||||
|
|
||||||
split_raw_lines = [["ID", use_case_name]] + split_raw_lines_from_file
|
split_raw_lines = [["ID", use_case_name]] + split_raw_lines_from_file
|
||||||
|
|
||||||
merged_lines = []
|
merged_lines = []
|
||||||
for i in split_raw_lines:
|
for i in split_raw_lines:
|
||||||
if i[0].replace(" ", "") == "":
|
if i[0].replace(" ", "") == "":
|
||||||
merged_lines[-1][1] += "<br>" + i[1]
|
merged_lines[-1][1] += "<br>" + i[1]
|
||||||
else:
|
else:
|
||||||
merged_lines.append(i)
|
merged_lines.append(i)
|
||||||
|
|
||||||
return generate_table(merged_lines)
|
return generate_table(merged_lines)
|
||||||
|
|
||||||
def convert_activity_v1(filename, data):
|
def convert_activity_v1(filename, data):
|
||||||
split_raw_lines_from_file = [i.split(" | ") for i in data.split("\n") if i]
|
split_raw_lines_from_file = [i.split(" | ") for i in data.split("\n") if i]
|
||||||
|
|
||||||
if '/' in filename:
|
if '/' in filename:
|
||||||
use_case_name = filename.rsplit("/", 1)[1].upper()
|
use_case_name = filename.rsplit("/", 1)[1].upper()
|
||||||
elif '\\' in filename:
|
elif '\\' in filename:
|
||||||
use_case_name = filename.rsplit("\\", 1)[1].upper()
|
use_case_name = filename.rsplit("\\", 1)[1].upper()
|
||||||
else:
|
else:
|
||||||
use_case_name = filename.upper()
|
use_case_name = filename.upper()
|
||||||
|
|
||||||
split_raw_lines = [["ID", use_case_name]] + split_raw_lines_from_file
|
split_raw_lines = [["ID", use_case_name]] + split_raw_lines_from_file
|
||||||
|
|
||||||
merged_lines = []
|
merged_lines = []
|
||||||
for i in split_raw_lines:
|
for i in split_raw_lines:
|
||||||
if i[0].replace(" ", "") == "":
|
if i[0].replace(" ", "") == "":
|
||||||
merged_lines[-1][1] += "<br>" + i[1]
|
merged_lines[-1][1] += "<br>" + i[1]
|
||||||
else:
|
else:
|
||||||
merged_lines.append(i)
|
merged_lines.append(i)
|
||||||
|
|
||||||
return generate_table_with_activity_diagram(merged_lines)
|
return generate_table_with_activity_diagram(merged_lines)
|
||||||
|
|
||||||
def generate_table(raw_table_data):
|
def generate_table(raw_table_data):
|
||||||
table_lines = raw_table_data
|
table_lines = raw_table_data
|
||||||
transposed_table = list(zip(*table_lines))
|
transposed_table = list(zip(*table_lines))
|
||||||
|
|
||||||
field_sizes = [max([max([len(k)+2 for k in j.split("\n")]) for j in i]) for i in transposed_table]
|
field_sizes = [max([max([len(k)+2 for k in j.split("\n")]) for j in i]) for i in transposed_table]
|
||||||
|
|
||||||
formatted_table_lines = []
|
formatted_table_lines = []
|
||||||
|
|
||||||
l = "|"
|
l = "|"
|
||||||
for i, field in enumerate(table_lines[0]):
|
for i, field in enumerate(table_lines[0]):
|
||||||
l += field.center(field_sizes[i])
|
l += field.center(field_sizes[i])
|
||||||
l += "|"
|
l += "|"
|
||||||
|
|
||||||
formatted_table_lines.append(l)
|
formatted_table_lines.append(l)
|
||||||
formatted_table_lines.append(f"|{'|'.join([':'+'-'*(i-2)+':' for i in field_sizes])}|")
|
formatted_table_lines.append(f"|{'|'.join([':'+'-'*(i-2)+':' for i in field_sizes])}|")
|
||||||
|
|
||||||
for line in table_lines[1:]:
|
for line in table_lines[1:]:
|
||||||
l = "|"
|
l = "|"
|
||||||
for i, field in enumerate(line):
|
for i, field in enumerate(line):
|
||||||
l += field.center(field_sizes[i])
|
l += field.center(field_sizes[i])
|
||||||
l += "|"
|
l += "|"
|
||||||
|
|
||||||
formatted_table_lines.append(l)
|
formatted_table_lines.append(l)
|
||||||
|
|
||||||
return "\n".join(formatted_table_lines)
|
return "\n".join(formatted_table_lines)
|
||||||
|
|
||||||
def convert_line_to_activity_diagram(line):
|
def convert_line_to_activity_diagram(line):
|
||||||
split_line = line[1].split("<br>")
|
split_line = line[1].split("<br>")
|
||||||
|
|
||||||
result = "@startuml\n %PLACEHOLDER%\nstop\n@enduml"
|
result = "@startuml\n %PLACEHOLDER%\nstop\n@enduml"
|
||||||
|
|
||||||
last_swimline_name = ""
|
last_swimline_name = ""
|
||||||
initiator_name = ""
|
initiator_name = ""
|
||||||
|
|
||||||
for i in split_line:
|
for i in split_line:
|
||||||
clear_line = i.lstrip("1234567890. ")
|
clear_line = i.lstrip("1234567890. ")
|
||||||
swimline_label, combined_action = clear_line.split(" ", 1)
|
swimline_label, combined_action = clear_line.split(" ", 1)
|
||||||
|
|
||||||
action_and_exceptions = combined_action.split(" (")
|
action_and_exceptions = combined_action.split(" (")
|
||||||
|
|
||||||
if len(action_and_exceptions) > 1:
|
if len(action_and_exceptions) > 1:
|
||||||
action = action_and_exceptions[0].strip().capitalize()
|
action = action_and_exceptions[0].strip().capitalize()
|
||||||
exceptions = action_and_exceptions[1].strip(") ").capitalize()
|
exceptions = action_and_exceptions[1].strip(") ").capitalize()
|
||||||
else:
|
else:
|
||||||
action = action_and_exceptions[0].strip().capitalize()
|
action = action_and_exceptions[0].strip().capitalize()
|
||||||
exceptions = ""
|
exceptions = ""
|
||||||
|
|
||||||
# запам'ятовуємо назву користувача системи
|
# запам'ятовуємо назву користувача системи
|
||||||
# (він завжди починає взаємодію, а, отже,
|
# (він завжди починає взаємодію, а, отже,
|
||||||
# перша дія завжди належить йому)
|
# перша дія завжди належить йому)
|
||||||
if not initiator_name:
|
if not initiator_name:
|
||||||
initiator_name = swimline_label
|
initiator_name = swimline_label
|
||||||
|
|
||||||
# змінюємо swinline, якщо керування перейшло до іншого актора
|
# змінюємо swinline, якщо керування перейшло до іншого актора
|
||||||
if last_swimline_name != swimline_label:
|
if last_swimline_name != swimline_label:
|
||||||
result = result.replace("%PLACEHOLDER%", f"|{swimline_label}|\n %PLACEHOLDER%")
|
result = result.replace("%PLACEHOLDER%", f"|{swimline_label}|\n %PLACEHOLDER%")
|
||||||
|
|
||||||
# якщо це перша дія, то вказуємо start
|
# якщо це перша дія, то вказуємо start
|
||||||
if not last_swimline_name:
|
if not last_swimline_name:
|
||||||
result = result.replace("%PLACEHOLDER%", f"start\n %PLACEHOLDER%")
|
result = result.replace("%PLACEHOLDER%", f"start\n %PLACEHOLDER%")
|
||||||
|
|
||||||
# зберігаємо нове ім'я актора
|
# зберігаємо нове ім'я актора
|
||||||
last_swimline_name = swimline_label
|
last_swimline_name = swimline_label
|
||||||
|
|
||||||
# прописуємо поточну дію актора
|
# прописуємо поточну дію актора
|
||||||
result = result.replace("%PLACEHOLDER%", f": {action};\n %PLACEHOLDER%")
|
result = result.replace("%PLACEHOLDER%", f": {action};\n %PLACEHOLDER%")
|
||||||
|
|
||||||
# якщо є виключні ситуації, додаємо інформацію про них
|
# якщо є виключні ситуації, додаємо інформацію про них
|
||||||
if exceptions:
|
if exceptions:
|
||||||
result = result.replace("%PLACEHOLDER%", f"note right #lightpink\n <b>{exceptions}</b>\n end note\n %PLACEHOLDER%")
|
result = result.replace("%PLACEHOLDER%", f"note right #lightpink\n <b>{exceptions}</b>\n end note\n %PLACEHOLDER%")
|
||||||
|
|
||||||
# впенюємося, що взаємодія закінчується на swinline користувача
|
# впенюємося, що взаємодія закінчується на swinline користувача
|
||||||
if last_swimline_name != initiator_name:
|
if last_swimline_name != initiator_name:
|
||||||
result = result.replace("%PLACEHOLDER%", f"|{initiator_name}|\n %PLACEHOLDER%")
|
result = result.replace("%PLACEHOLDER%", f"|{initiator_name}|\n %PLACEHOLDER%")
|
||||||
|
|
||||||
# видаляємо мітку %PLACEHOLDER%
|
# видаляємо мітку %PLACEHOLDER%
|
||||||
result = result.replace("%PLACEHOLDER%\n", "")
|
result = result.replace("%PLACEHOLDER%\n", "")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def generate_table_with_activity_diagram(raw_table_data):
|
def generate_table_with_activity_diagram(raw_table_data):
|
||||||
table_lines = raw_table_data[:-1]
|
table_lines = raw_table_data[:-1]
|
||||||
activity_line = raw_table_data[-1]
|
activity_line = raw_table_data[-1]
|
||||||
|
|
||||||
transposed_table = list(zip(*table_lines))
|
transposed_table = list(zip(*table_lines))
|
||||||
|
|
||||||
field_sizes = [max([max([len(k)+2 for k in j.split("\n")]) for j in i]) for i in transposed_table]
|
field_sizes = [max([max([len(k)+2 for k in j.split("\n")]) for j in i]) for i in transposed_table]
|
||||||
|
|
||||||
formatted_table_lines = []
|
formatted_table_lines = []
|
||||||
|
|
||||||
l = "|"
|
l = "|"
|
||||||
for i, field in enumerate(table_lines[0]):
|
for i, field in enumerate(table_lines[0]):
|
||||||
l += field.center(field_sizes[i])
|
l += field.center(field_sizes[i])
|
||||||
l += "|"
|
l += "|"
|
||||||
|
|
||||||
formatted_table_lines.append(l)
|
formatted_table_lines.append(l)
|
||||||
formatted_table_lines.append(f"|{'|'.join([':'+'-'*(i-2)+':' for i in field_sizes])}|")
|
formatted_table_lines.append(f"|{'|'.join([':'+'-'*(i-2)+':' for i in field_sizes])}|")
|
||||||
|
|
||||||
for line in table_lines[1:]:
|
for line in table_lines[1:]:
|
||||||
l = "|"
|
l = "|"
|
||||||
for i, field in enumerate(line):
|
for i, field in enumerate(line):
|
||||||
l += field.center(field_sizes[i])
|
l += field.center(field_sizes[i])
|
||||||
l += "|"
|
l += "|"
|
||||||
|
|
||||||
formatted_table_lines.append(l)
|
formatted_table_lines.append(l)
|
||||||
|
|
||||||
activity_diagram = convert_line_to_activity_diagram(activity_line)
|
activity_diagram = convert_line_to_activity_diagram(activity_line)
|
||||||
|
|
||||||
return "\n".join(formatted_table_lines) + "\n" + activity_diagram
|
return "\n".join(formatted_table_lines) + "\n" + activity_diagram
|
||||||
|
|
||||||
|
|
||||||
if __name__=="__main__":
|
if __name__=="__main__":
|
||||||
# parse args
|
# parse args
|
||||||
files = []
|
files = []
|
||||||
|
|
||||||
write_to_file = AUTO
|
write_to_file = AUTO
|
||||||
write_to_stdout = AUTO
|
write_to_stdout = AUTO
|
||||||
usecase_formatting = AUTO
|
usecase_formatting = AUTO
|
||||||
verbose = AUTO
|
verbose = AUTO
|
||||||
process_table_files = AUTO
|
process_table_files = AUTO
|
||||||
convert_to_activity_diagram = AUTO
|
convert_to_activity_diagram = AUTO
|
||||||
file_output_path = None
|
file_output_path = None
|
||||||
|
|
||||||
# 1 pass (argument harvest)
|
# 1 pass (argument harvest)
|
||||||
for n, i in enumerate(sys.argv[1:]):
|
for n, i in enumerate(sys.argv[1:]):
|
||||||
if i.startswith("-"):
|
if i.startswith("-"):
|
||||||
# записувати таблицю в файл
|
# записувати таблицю в файл
|
||||||
if i in ["-f", "--file"]:
|
if i in ["-f", "--file"]:
|
||||||
write_to_file = YES
|
write_to_file = YES
|
||||||
elif i in ["-nf", "--no-file"]:
|
elif i in ["-nf", "--no-file"]:
|
||||||
write_to_file = NO
|
write_to_file = NO
|
||||||
|
|
||||||
# виводити таблицю у стандартний вивід
|
# виводити таблицю у стандартний вивід
|
||||||
elif i in ["-o", "--stdout"]:
|
elif i in ["-o", "--stdout"]:
|
||||||
write_to_stdout = YES
|
write_to_stdout = YES
|
||||||
elif i in ["-no", "--no-stdout"]:
|
elif i in ["-no", "--no-stdout"]:
|
||||||
write_to_stdout = NO
|
write_to_stdout = NO
|
||||||
|
|
||||||
# форматувати таблицю як use-case
|
# форматувати таблицю як use-case
|
||||||
elif i in ["-u", "--usecase", "--use-case"]:
|
elif i in ["-u", "--usecase", "--use-case"]:
|
||||||
usecase_formatting = YES
|
usecase_formatting = YES
|
||||||
elif i in ["-nu", "--no-usecase", "--no-use-case"]:
|
elif i in ["-nu", "--no-usecase", "--no-use-case"]:
|
||||||
usecase_formatting = NO
|
usecase_formatting = NO
|
||||||
|
|
||||||
# виводити на екран додаткову інформацію
|
# виводити на екран додаткову інформацію
|
||||||
elif i in ["-v", "--verbose"]:
|
elif i in ["-v", "--verbose"]:
|
||||||
verbose = YES
|
verbose = YES
|
||||||
elif i in ["-nv", "--no-verbose"]:
|
elif i in ["-nv", "--no-verbose"]:
|
||||||
verbose = NO
|
verbose = NO
|
||||||
|
|
||||||
# дозволити обробку файлів .table
|
# дозволити обробку файлів .table
|
||||||
elif i in ["-t", "--process-table"]:
|
elif i in ["-t", "--process-table"]:
|
||||||
process_table_files = YES
|
process_table_files = YES
|
||||||
elif i in ["-nt", "--no-process-table"]:
|
elif i in ["-nt", "--no-process-table"]:
|
||||||
process_table_files = NO
|
process_table_files = NO
|
||||||
|
|
||||||
# перетворює останню клітинку таблиці в діаграму активностей
|
# перетворює останню клітинку таблиці в діаграму активностей
|
||||||
if i in ["-a", "--convert-to-activity-diagram"]:
|
if i in ["-a", "--convert-to-activity-diagram"]:
|
||||||
convert_to_activity_diagram = YES
|
convert_to_activity_diagram = YES
|
||||||
elif i in ["-na", "--no-convert-to-activity-diagram"]:
|
elif i in ["-na", "--no-convert-to-activity-diagram"]:
|
||||||
convert_to_activity_diagram = NO
|
convert_to_activity_diagram = NO
|
||||||
|
|
||||||
# задає папку, в яку необхідно зберігати конвертовані таблиці
|
# задає папку, в яку необхідно зберігати конвертовані таблиці
|
||||||
elif i in ["-d", "--destination"]:
|
elif i in ["-d", "--destination"]:
|
||||||
file_output_path = sys.argv[n+2]
|
file_output_path = sys.argv[n+2]
|
||||||
sys.argv.remove(sys.argv[n+2])
|
sys.argv.remove(sys.argv[n+2])
|
||||||
|
|
||||||
# 2 pass (filename harvest)
|
# 2 pass (filename harvest)
|
||||||
for i in sys.argv[1:]:
|
for i in sys.argv[1:]:
|
||||||
if not i.startswith("-"):
|
if not i.startswith("-"):
|
||||||
if i.endswith(".table") and process_table_files <= AUTO:
|
if i.endswith(".table") and process_table_files <= AUTO:
|
||||||
print(f"[Warning]: Excluding {i} to prevent processing of an already processed file (pass --process-table to override this behaviour)")
|
print(f"[Warning]: Excluding {i} to prevent processing of an already processed file (pass --process-table to override this behaviour)")
|
||||||
else:
|
else:
|
||||||
files.append(i)
|
files.append(i)
|
||||||
|
|
||||||
if len(files) < 1:
|
if len(files) < 1:
|
||||||
print("You need to pass at least one file as CLI argument", file=sys.stderr)
|
print("You need to pass at least one file as CLI argument", file=sys.stderr)
|
||||||
print("Exiting...", file=sys.stderr)
|
print("Exiting...", file=sys.stderr)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
if len(files) == 1:
|
if len(files) == 1:
|
||||||
name = files[0]
|
name = files[0]
|
||||||
data = open(name, encoding = "utf-8").read()
|
data = open(name, encoding = "utf-8").read()
|
||||||
|
|
||||||
if usecase_formatting == YES:
|
if usecase_formatting == YES:
|
||||||
if verbose == YES:
|
if verbose == YES:
|
||||||
print(f"Force-formatting {name} as a use-case\n")
|
print(f"Force-formatting {name} as a use-case\n")
|
||||||
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
||||||
elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO:
|
elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO:
|
||||||
if verbose == YES:
|
if verbose == YES:
|
||||||
print(f"Auto-detected use-case in file {name}\n")
|
print(f"Auto-detected use-case in file {name}\n")
|
||||||
|
|
||||||
if convert_to_activity_diagram == YES:
|
if convert_to_activity_diagram == YES:
|
||||||
if verbose == YES:
|
if verbose == YES:
|
||||||
print(f"Converting file {name} to activity diagram\n")
|
print(f"Converting file {name} to activity diagram\n")
|
||||||
|
|
||||||
formatted_table_data = convert_activity_v1(name.rsplit(".", 1)[0], data)
|
formatted_table_data = convert_activity_v1(name.rsplit(".", 1)[0], data)
|
||||||
else:
|
else:
|
||||||
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
||||||
else:
|
else:
|
||||||
formatted_table_data = convert_generic_v1(data)
|
formatted_table_data = convert_generic_v1(data)
|
||||||
|
|
||||||
if write_to_stdout >= AUTO:
|
if write_to_stdout >= AUTO:
|
||||||
print(formatted_table_data)
|
print(formatted_table_data)
|
||||||
|
|
||||||
if write_to_file > AUTO:
|
if write_to_file > AUTO:
|
||||||
if file_output_path:
|
if file_output_path:
|
||||||
open(os.path.join(file_output_path, os.path.basename(name)) \
|
open(os.path.join(file_output_path, os.path.basename(name)) \
|
||||||
+ ".table", 'w', encoding = "utf-8") \
|
+ ".table", 'w', encoding = "utf-8") \
|
||||||
.write(formatted_table_data+"\n")
|
.write(formatted_table_data+"\n")
|
||||||
else:
|
else:
|
||||||
open(name + ".table", 'w', encoding = "utf-8").write(formatted_table_data+"\n")
|
open(name + ".table", 'w', encoding = "utf-8").write(formatted_table_data+"\n")
|
||||||
|
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
for no, name in enumerate(files):
|
for no, name in enumerate(files):
|
||||||
print(f"Converting {no+1:02d}/{len(files)}: {name}")
|
print(f"Converting {no+1:02d}/{len(files)}: {name}")
|
||||||
|
|
||||||
data = open(name, encoding = "utf-8").read()
|
data = open(name, encoding = "utf-8").read()
|
||||||
|
|
||||||
if usecase_formatting == YES:
|
if usecase_formatting == YES:
|
||||||
if verbose >= AUTO:
|
if verbose >= AUTO:
|
||||||
print(f"Force-formatting {name} as a use-case")
|
print(f"Force-formatting {name} as a use-case")
|
||||||
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
||||||
elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO:
|
elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO:
|
||||||
if verbose >= AUTO:
|
if verbose >= AUTO:
|
||||||
print(f"Auto-detected use-case in file {name}")
|
print(f"Auto-detected use-case in file {name}")
|
||||||
|
|
||||||
if convert_to_activity_diagram == YES:
|
if convert_to_activity_diagram == YES:
|
||||||
if verbose == YES:
|
if verbose == YES:
|
||||||
print(f"Converting file {name} to activity diagram\n")
|
print(f"Converting file {name} to activity diagram\n")
|
||||||
|
|
||||||
formatted_table_data = convert_activity_v1(name.rsplit(".", 1)[0], data)
|
formatted_table_data = convert_activity_v1(name.rsplit(".", 1)[0], data)
|
||||||
else:
|
else:
|
||||||
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data)
|
||||||
else:
|
else:
|
||||||
formatted_table_data = convert_generic_v1(data)
|
formatted_table_data = convert_generic_v1(data)
|
||||||
|
|
||||||
if write_to_stdout > AUTO:
|
if write_to_stdout > AUTO:
|
||||||
print(formatted_table_data)
|
print(formatted_table_data)
|
||||||
|
|
||||||
if write_to_file >= AUTO:
|
if write_to_file >= AUTO:
|
||||||
if file_output_path:
|
if file_output_path:
|
||||||
open(os.path.join(file_output_path, os.path.basename(name)) \
|
open(os.path.join(file_output_path, os.path.basename(name)) \
|
||||||
+ ".table", 'w', encoding = "utf-8") \
|
+ ".table", 'w', encoding = "utf-8") \
|
||||||
.write(formatted_table_data+"\n")
|
.write(formatted_table_data+"\n")
|
||||||
else:
|
else:
|
||||||
open(name + ".table", 'w', encoding = "utf-8").write(formatted_table_data+"\n")
|
open(name + ".table", 'w', encoding = "utf-8").write(formatted_table_data+"\n")
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
grep -E '\|\ [0-9]{3}\.[0-9]{3}' use-cases/*.uc \
|
grep -E '\|\ [0-9]{3}\.[0-9]{3}' use-cases/*.uc \
|
||||||
| cut -d '|' -f 2 \
|
| cut -d '|' -f 2 \
|
||||||
| sort | uniq -c
|
| sort | uniq -c
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
import updater
|
import updater
|
||||||
|
|
||||||
target_folder = "activities"
|
target_folder = "activities"
|
||||||
converter_args = "-a -nv"
|
converter_args = "-a -nv"
|
||||||
|
|
||||||
updater.process(target_folder, converter_args)
|
updater.process(target_folder, converter_args)
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
mkdir -p activities/
|
mkdir -p activities/
|
||||||
./convert.py use-cases/* -a -nv -d activities/
|
./convert.py use-cases/* -a -nv -d activities/
|
||||||
|
|
||||||
if [ -f activities.md ]; then
|
if [ -f activities.md ]; then
|
||||||
rm activities.md
|
rm activities.md
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for i in activities/*; do
|
for i in activities/*; do
|
||||||
cat $i >> activities.md
|
cat $i >> activities.md
|
||||||
echo "" >> activities.md
|
echo "" >> activities.md
|
||||||
done
|
done
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
import updater
|
import updater
|
||||||
|
|
||||||
target_folder = "tables"
|
target_folder = "tables"
|
||||||
converter_args = "-nv"
|
converter_args = "-nv"
|
||||||
|
|
||||||
updater.process(target_folder, converter_args)
|
updater.process(target_folder, converter_args)
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
mkdir -p tables/
|
mkdir -p tables/
|
||||||
./convert.py use-cases/* -nv -d tables/
|
./convert.py use-cases/* -nv -d tables/
|
||||||
|
|
||||||
if [ -f tables.md ]; then
|
if [ -f tables.md ]; then
|
||||||
rm tables.md
|
rm tables.md
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for i in tables/*; do
|
for i in tables/*; do
|
||||||
cat $i >> tables.md
|
cat $i >> tables.md
|
||||||
echo "" >> tables.md
|
echo "" >> tables.md
|
||||||
done
|
done
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
|
||||||
PYTHON_INTERPRETER = sys.executable
|
PYTHON_INTERPRETER = sys.executable
|
||||||
|
|
||||||
def process(target_folder, converter_args):
|
def process(target_folder, converter_args):
|
||||||
if os.path.exists(target_folder):
|
if os.path.exists(target_folder):
|
||||||
shutil.rmtree(target_folder)
|
shutil.rmtree(target_folder)
|
||||||
|
|
||||||
os.mkdir(target_folder)
|
os.mkdir(target_folder)
|
||||||
os.system(f"{PYTHON_INTERPRETER} convert.py use-cases/* {converter_args} -d {target_folder}/")
|
os.system(f"{PYTHON_INTERPRETER} convert.py use-cases/* {converter_args} -d {target_folder}/")
|
||||||
|
|
||||||
result_file = open(f"{target_folder}.md", "w")
|
result_file = open(f"{target_folder}.md", "w")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
for i in os.listdir(target_folder):
|
for i in os.listdir(target_folder):
|
||||||
with open(os.path.abspath(f"{target_folder}/{i}")) as f:
|
with open(os.path.abspath(f"{target_folder}/{i}")) as f:
|
||||||
result_file.write(f.read())
|
result_file.write(f.read())
|
||||||
result_file.write("\n")
|
result_file.write("\n")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"File {target_folder}/{i} has raised exception {e}")
|
print(f"File {target_folder}/{i} has raised exception {e}")
|
||||||
|
|
||||||
result_file.close()
|
result_file.close()
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
Назва | Створити обліковий запис
|
Назва | Створити обліковий запис
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Відсутні
|
Передумови | Відсутні
|
||||||
Результат | Обліковий запис користувача
|
Результат | Обліковий запис користувача
|
||||||
Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму
|
Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму
|
||||||
| 001.002 Ідентичний псевдонім вже існує
|
| 001.002 Ідентичний псевдонім вже існує
|
||||||
Основний сценарій | 1. Користувач вводить бажаний псевдонім у поле вводу псевдоніму
|
Основний сценарій | 1. Користувач вводить бажаний псевдонім у поле вводу псевдоніму
|
||||||
| 2. Користувач вводить пароль у поле вводу паролю
|
| 2. Користувач вводить пароль у поле вводу паролю
|
||||||
| 3. Користувач натискає на кнопку створення облікового запису
|
| 3. Користувач натискає на кнопку створення облікового запису
|
||||||
| 4. Система створює обліковий запис користувача (можливі 001.001, 001.002)
|
| 4. Система створює обліковий запис користувача (можливі 001.001, 001.002)
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
Назва | Видалити обліковий запис
|
Назва | Видалити обліковий запис
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач ідентифікований в системі
|
Передумови | Користувач ідентифікований в системі
|
||||||
Результат | Відсутність облікового запису користувача
|
Результат | Відсутність облікового запису користувача
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
Основний сценарій | 1. Користувач натискає на кнопку видалення облікового запису
|
Основний сценарій | 1. Користувач натискає на кнопку видалення облікового запису
|
||||||
| 2. Система виводить кнопку-запит на підтвердження видалення облікового запису
|
| 2. Система виводить кнопку-запит на підтвердження видалення облікового запису
|
||||||
| 3. Користувач натискає на кнопку підтвердження видалення облікового запису
|
| 3. Користувач натискає на кнопку підтвердження видалення облікового запису
|
||||||
| 4. Система видаляє обліковий запис (можлива 001.005)
|
| 4. Система видаляє обліковий запис (можлива 001.005)
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
Назва | Змінити властивості облікового запису
|
Назва | Змінити властивості облікового запису
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач ідентифікований в системі
|
Передумови | Користувач ідентифікований в системі
|
||||||
Результат | Зміна властивостей облікового запису
|
Результат | Зміна властивостей облікового запису
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
Основний сценарій | 1. Користувач натискає на кнопку редагування облікового запису
|
Основний сценарій | 1. Користувач натискає на кнопку редагування облікового запису
|
||||||
| 2. Система виводить інтерфейс для редагування облікового запису (можлива 001.005)
|
| 2. Система виводить інтерфейс для редагування облікового запису (можлива 001.005)
|
||||||
| 3. Користувач вказує бажані зміни властивостей облікового запису
|
| 3. Користувач вказує бажані зміни властивостей облікового запису
|
||||||
| 4. Користувач натискає на кнопку внесення змін до властивостей облікового запису
|
| 4. Користувач натискає на кнопку внесення змін до властивостей облікового запису
|
||||||
| 5. Система змінює властивості облікового запису
|
| 5. Система змінює властивості облікового запису
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
Назва | Додати посилання на опитування
|
Назва | Додати посилання на опитування
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач авторизований у системі
|
Передумови | Користувач авторизований у системі
|
||||||
Результат | Нове посилання на опитування
|
Результат | Нове посилання на опитування
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
| 001.006 Запитане опитування не існує
|
| 001.006 Запитане опитування не існує
|
||||||
| 001.008 Користувач не є власником опитування
|
| 001.008 Користувач не є власником опитування
|
||||||
Основний сценарій | 1. Користувач натискає кнопку створення посилання на опитування
|
Основний сценарій | 1. Користувач натискає кнопку створення посилання на опитування
|
||||||
| 2. Система виводить налаштування для нового посилання (можливі 001.005, 001.006, 001.008)
|
| 2. Система виводить налаштування для нового посилання (можливі 001.005, 001.006, 001.008)
|
||||||
| 3. Користувач вводить налаштування для нового посилання
|
| 3. Користувач вводить налаштування для нового посилання
|
||||||
| 4. Користувач натискає на кнопку створення посилання
|
| 4. Користувач натискає на кнопку створення посилання
|
||||||
| 5. Система створює нове посилання
|
| 5. Система створює нове посилання
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
Назва | Видалити посилання на опитування
|
Назва | Видалити посилання на опитування
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач авторизований у системі
|
Передумови | Користувач авторизований у системі
|
||||||
Результат | Видалення посилання на опитування
|
Результат | Видалення посилання на опитування
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
| 001.006 Запитане опитування не існує
|
| 001.006 Запитане опитування не існує
|
||||||
| 001.008 Користувач не є власником опитування
|
| 001.008 Користувач не є власником опитування
|
||||||
| 001.009 Запитане посилання на існує
|
| 001.009 Запитане посилання на існує
|
||||||
Основний сценарій | 1. Користувач натискає кнопку видалення посилання
|
Основний сценарій | 1. Користувач натискає кнопку видалення посилання
|
||||||
| 2. Система виводить кнопку підтвердження видалення посилання
|
| 2. Система виводить кнопку підтвердження видалення посилання
|
||||||
| 3. Користувач натискає на кнопку підтвердження видалення посилання
|
| 3. Користувач натискає на кнопку підтвердження видалення посилання
|
||||||
| 4. Система видаляє посилання (можливі 001.005, 001.006, 001.008, 001.009)
|
| 4. Система видаляє посилання (можливі 001.005, 001.006, 001.008, 001.009)
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
Назва | Змінити властивості посилання на опитування
|
Назва | Змінити властивості посилання на опитування
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач авторизований у системі
|
Передумови | Користувач авторизований у системі
|
||||||
Результат | Зміна властивостей посилання на опитування
|
Результат | Зміна властивостей посилання на опитування
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
| 001.006 Запитане опитування не існує
|
| 001.006 Запитане опитування не існує
|
||||||
| 001.008 Користувач не є власником опитування
|
| 001.008 Користувач не є власником опитування
|
||||||
| 001.009 Запитане посилання на існує
|
| 001.009 Запитане посилання на існує
|
||||||
Основний сценарій | 1. Користувач натискає кнопку редагування властивостей посилання
|
Основний сценарій | 1. Користувач натискає кнопку редагування властивостей посилання
|
||||||
| 2. Система виводить налаштування для обраного посилання (можливі 001.005, 001.006, 001.008, 001.009)
|
| 2. Система виводить налаштування для обраного посилання (можливі 001.005, 001.006, 001.008, 001.009)
|
||||||
| 3. Користувач вводить юажані зміни властивостей посилання
|
| 3. Користувач вводить юажані зміни властивостей посилання
|
||||||
| 4. Користувач натискає на кнопку збереження властиностей посилання
|
| 4. Користувач натискає на кнопку збереження властиностей посилання
|
||||||
| 5. Система змінює властивості посилання
|
| 5. Система змінює властивості посилання
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
Назва | Створити опитування
|
Назва | Створити опитування
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач ідентифікований в системі
|
Передумови | Користувач ідентифікований в системі
|
||||||
Результат | Створене опитування
|
Результат | Створене опитування
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
| 001.007 Користувач ввів неприпустимі символи в назві опитування
|
| 001.007 Користувач ввів неприпустимі символи в назві опитування
|
||||||
Основний сценарій | 1. Користувач переходить на сторінку створення опитування (можлива 001.005)
|
Основний сценарій | 1. Користувач переходить на сторінку створення опитування (можлива 001.005)
|
||||||
| 2. Система виводить інтерфейс створення опитування
|
| 2. Система виводить інтерфейс створення опитування
|
||||||
| 3. Користувач задає інформацію про запитання та тип опитування
|
| 3. Користувач задає інформацію про запитання та тип опитування
|
||||||
| 4. Користувач натискає кнопку збереження опитування
|
| 4. Користувач натискає кнопку збереження опитування
|
||||||
| 5. Система створює опитування (можлива 001.007)
|
| 5. Система створює опитування (можлива 001.007)
|
||||||
| 6. Система виводить посилання на проходження опитування
|
| 6. Система виводить посилання на проходження опитування
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
Назва | Видалити опитування
|
Назва | Видалити опитування
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач ідентифікований в системі, користувач є власником опитування
|
Передумови | Користувач ідентифікований в системі, користувач є власником опитування
|
||||||
Результат | Відсутність опитування
|
Результат | Відсутність опитування
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
| 001.006 Запитане опитування не існує
|
| 001.006 Запитане опитування не існує
|
||||||
| 001.008 Користувач не є власником опитування
|
| 001.008 Користувач не є власником опитування
|
||||||
Основний сценарій | 1. Користувач натискає на кнопку видалення опитування
|
Основний сценарій | 1. Користувач натискає на кнопку видалення опитування
|
||||||
| 2. Система виводить запит на підтвердження видалення опитування
|
| 2. Система виводить запит на підтвердження видалення опитування
|
||||||
| 3. Користувач натискає на кнопку підтвердження видалення опитування
|
| 3. Користувач натискає на кнопку підтвердження видалення опитування
|
||||||
| 4. Система видаляє опитування (можливі 001.005, 001.006, 001.008)
|
| 4. Система видаляє опитування (можливі 001.005, 001.006, 001.008)
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
Назва | Переглянути відповіді на опитування
|
Назва | Переглянути відповіді на опитування
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач ідентифікований в системі, користувач є власником опитування
|
Передумови | Користувач ідентифікований в системі, користувач є власником опитування
|
||||||
Результат | Інформація про відповіді на опитування
|
Результат | Інформація про відповіді на опитування
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
| 001.006 Запитане опитування не існує
|
| 001.006 Запитане опитування не існує
|
||||||
| 001.008 Користувач не є власником опитування
|
| 001.008 Користувач не є власником опитування
|
||||||
Основний сценарій | 1. Користувач натискає на кнопку перегляду відповідей на опитування
|
Основний сценарій | 1. Користувач натискає на кнопку перегляду відповідей на опитування
|
||||||
| 2. Система виводить інформацію про відповіді на опитування (можливі 001.005, 001.006, 001.008)
|
| 2. Система виводить інформацію про відповіді на опитування (можливі 001.005, 001.006, 001.008)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
Назва | Пройти ідентифікацію в системі
|
Назва | Пройти ідентифікацію в системі
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач має обліковий запис
|
Передумови | Користувач має обліковий запис
|
||||||
Результат | Користувач ідентифікований в системі
|
Результат | Користувач ідентифікований в системі
|
||||||
Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму
|
Виключні ситуації | 001.001 Користувач ввів заборонені символи в поле псевдоніму
|
||||||
| 001.003 Користувач ввів псевдонім, якого не існує в системі
|
| 001.003 Користувач ввів псевдонім, якого не існує в системі
|
||||||
| 001.004 Користувач ввів неправильний пароль до облікового запису
|
| 001.004 Користувач ввів неправильний пароль до облікового запису
|
||||||
Основний сценарій | 1. Користувач вводить псевдонім у поле вводу псевдоніму
|
Основний сценарій | 1. Користувач вводить псевдонім у поле вводу псевдоніму
|
||||||
| 2. Користувач вводить пароль у поле вводу паролю
|
| 2. Користувач вводить пароль у поле вводу паролю
|
||||||
| 3. Користувач натискає кнопку ідентифікації
|
| 3. Користувач натискає кнопку ідентифікації
|
||||||
| 4. Система ідентифікує користувача (можливі 001.001, 001.003, 001.004)
|
| 4. Система ідентифікує користувача (можливі 001.001, 001.003, 001.004)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
Назва | Скинути дані про ідентифікацію в системі
|
Назва | Скинути дані про ідентифікацію в системі
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач ідентифікований в системі
|
Передумови | Користувач ідентифікований в системі
|
||||||
Результат | Користувач не ідентифікований в системі
|
Результат | Користувач не ідентифікований в системі
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
Основний сценарій | 1. Користувач натискає на кнопку виходу з облікового запису
|
Основний сценарій | 1. Користувач натискає на кнопку виходу з облікового запису
|
||||||
| 2. Система скидає інформацію про ідентифікацію користувача (можлива 001.005)
|
| 2. Система скидає інформацію про ідентифікацію користувача (можлива 001.005)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
Назва | Редагувати опитування
|
Назва | Редагувати опитування
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач ідентифікований в системі, користувач є власником опитування
|
Передумови | Користувач ідентифікований в системі, користувач є власником опитування
|
||||||
Результат | Змінене опитування
|
Результат | Змінене опитування
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
| 001.006 Запитане опитування не існує
|
| 001.006 Запитане опитування не існує
|
||||||
| 001.008 Користувач не є власником опитування
|
| 001.008 Користувач не є власником опитування
|
||||||
Основний сценарій | 1. Користувач переходить на сторінку редагування опитування
|
Основний сценарій | 1. Користувач переходить на сторінку редагування опитування
|
||||||
| 2. Система виводить інтерфейс редагування опитування (можливі 001.005, 001.006, 001.008)
|
| 2. Система виводить інтерфейс редагування опитування (можливі 001.005, 001.006, 001.008)
|
||||||
| 3. Користувач задає інформацію про зміни в опитуванні
|
| 3. Користувач задає інформацію про зміни в опитуванні
|
||||||
| 4. Користувач натискає кнопку збереження змін в опитуванні
|
| 4. Користувач натискає кнопку збереження змін в опитуванні
|
||||||
| 5. Система змінює опитування
|
| 5. Система змінює опитування
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
Назва | Переглянути властивості опитування
|
Назва | Переглянути властивості опитування
|
||||||
Учасники | Користувач, система
|
Учасники | Користувач, система
|
||||||
Передумови | Користувач ідентифікований в системі, користувач є власником опитування
|
Передумови | Користувач ідентифікований в системі, користувач є власником опитування
|
||||||
Результат | Інформація про властивості опитування
|
Результат | Інформація про властивості опитування
|
||||||
Виключні ситуації | 001.005 Користувач не ідентифікований
|
Виключні ситуації | 001.005 Користувач не ідентифікований
|
||||||
| 001.006 Запитане опитування не існує
|
| 001.006 Запитане опитування не існує
|
||||||
| 001.008 Користувач не є власником опитування
|
| 001.008 Користувач не є власником опитування
|
||||||
Основний сценарій | 1. Користувач натискає на кнопку перегляду інформації про опитування
|
Основний сценарій | 1. Користувач натискає на кнопку перегляду інформації про опитування
|
||||||
| 2. Система виводить інформацію про опитування (можливі 001.005, 001.006, 001.008)
|
| 2. Система виводить інформацію про опитування (можливі 001.005, 001.006, 001.008)
|
||||||
|
|