add files

parents
@startuml
start
:Открыть страницу с поиском;
:Пользователь вводит запрос;
:Нажимает "Поиск";
:Отображается двумерная доска\nс 5 карточками ресурсов;
:Пользователь выбирает карточку;
:Выбранный ресурс\nотображается под доской;
:Карточка выделяется;
:Запрос в Recombee для 3 похожих ресурсов;
:Появляются 3 новых карточки,\nсвязанные кривыми с выбранной;
repeat
:Пользователь выбирает новую карточку;
:Отображается ресурс;
:Recombee → 3 новых ресурса\n(исключая уже показанные);
:Добавление новых карточек\nи связей на доске;
repeat while (Пользователь продолжает строить курс)
stop
@enduml
class.png

632 KB

@startuml
!theme plain
top to bottom direction
skinparam linetype ortho
class _prisma_migrations {
checksum: varchar(64)
finished_at: timestamp with time zone
migration_name: varchar(255)
logs: text
rolled_back_at: timestamp with time zone
started_at: timestamp with time zone
applied_steps_count: integer
id: varchar(36)
}
class answer_statistic {
answer_id: integer
number_of_incorrect_answer_choices: integer
number_of_all_answer_choices: integer
id: integer
}
class auth_group {
name: varchar(150)
id: integer
}
class auth_group_permissions {
group_id: integer
permission_id: integer
id: integer
}
class auth_permission {
name: varchar(255)
content_type_id: integer
codename: varchar(100)
id: integer
}
class cards_card {
title: varchar(350)
text: text
video_url: varchar(200)
site_url: varchar(200)
created_by_id: integer
additional_text: text
card_content_type: integer
is_card_use_additional_text: boolean
is_card_use_main_content: boolean
is_card_use_main_text: boolean
is_card_use_test_before_card: boolean
is_card_use_test_in_card: boolean
test_before_card_id: integer
test_in_card_id: integer
arrow_before: varchar(200)
arrow_down: varchar(200)
arrow_next: varchar(200)
arrow_up: varchar(200)
copyright: varchar(350)
is_card_use_copyright: boolean
is_card_use_arrow_navigation: boolean
hard_level: integer
vector_column: tsvector
card_before_id: integer
card_down_id: integer
card_next_id: integer
card_up_id: integer
tag_field: text
vk_video_url: varchar(200)
id: integer
}
class cards_card_author {
card_id: integer
cardauthor_id: integer
id: integer
}
class cards_card_connected_theme {
card_id: integer
unstructuredtheme_id: integer
id: integer
}
class cards_card_sub_theme {
card_id: integer
cardsubtheme_id: integer
id: integer
}
class cards_cardauthor {
name: varchar(250)
created_by_id: integer
id: integer
}
class cards_cardbookmark {
is_bookmarked: boolean
card_id: integer
user_id: integer
id: integer
}
class cards_cardcomments {
created_at: timestamp with time zone
text: text
card_id: integer
created_by_id: integer
id: integer
}
class cards_cardcourse {
course_data: jsonb
created_by_id: integer
name: varchar(350)
id: integer
}
class cards_cardcourseimage {
image: varchar(100)
card_course_id: integer
id: integer
}
class cards_cardimage {
image: varchar(100)
card_id: integer
id: integer
}
class cards_cardrating {
rating: double precision
card_id: integer
user_id: integer
id: integer
}
class cards_cardsubtheme {
name: varchar(350)
created_by_id: integer
theme_id: integer
id: integer
}
class cards_cardtheme {
name: varchar(350)
created_by_id: integer
global_theme_id: integer
id: integer
}
class cards_globalcardtheme {
name: varchar(350)
created_by_id: integer
id: integer
}
class cards_unstructuredtheme {
text: varchar(350)
created_by_id: integer
parent_id: integer
id: integer
}
class cards_usthemesequence {
sequence: text
created_by_id: integer
id: integer
}
class django_admin_log {
action_time: timestamp with time zone
object_id: text
object_repr: varchar(200)
action_flag: smallint
change_message: text
content_type_id: integer
user_id: integer
id: integer
}
class django_content_type {
app_label: varchar(100)
model: varchar(100)
id: integer
}
class django_migrations {
app: varchar(255)
name: varchar(255)
applied: timestamp with time zone
id: integer
}
class django_session {
session_data: text
expire_date: timestamp with time zone
session_key: varchar(40)
}
class error_answer_users_report {
created_by_id: integer
answer_id: integer
text: text
createdAt: timestamp(3)
is_closed: boolean
id: integer
}
class exam_exam {
name: text
start_at: timestamp(6) with time zone
end_at: timestamp(6) with time zone
uid: text
created_by_id: integer
minutes: integer
question_sequence_id: integer
access_mode: text
help_text_level: integer
is_enable_help_text: boolean
is_enable_max_question_attempts: boolean
is_enable_password_check: boolean
is_enable_start_and_finish_time: boolean
max_question_attempts: integer
password: text
id: integer
}
class graphql_auth_userstatus {
verified: boolean
archived: boolean
secondary_email: varchar(254)
user_id: integer
id: integer
}
class help_articles {
title: text
content: text
created_by: integer
createdAt: timestamp(3)
updatedAt: timestamp(3)
url: text
video_url: text
id: integer
}
class passing_the_exam {
user_id: integer
exam_id: integer
id: integer
}
class passing_the_exam_question_status {
passing_the_exam_id: integer
question_id: integer
status: integer
statistic_id: integer
id: integer
}
class refresh_token_refreshtoken {
token: varchar(255)
created: timestamp with time zone
revoked: timestamp with time zone
user_id: integer
id: bigint
}
class social_auth_association {
server_url: varchar(255)
handle: varchar(255)
secret: varchar(255)
issued: integer
lifetime: integer
assoc_type: varchar(64)
id: integer
}
class social_auth_code {
email: varchar(254)
code: varchar(32)
verified: boolean
timestamp: timestamp with time zone
id: integer
}
class social_auth_nonce {
server_url: varchar(255)
timestamp: integer
salt: varchar(65)
id: integer
}
class social_auth_partial {
token: varchar(32)
next_step: smallint
backend: varchar(32)
data: jsonb
timestamp: timestamp with time zone
id: integer
}
class social_auth_usersocialauth {
provider: varchar(32)
uid: varchar(255)
extra_data: jsonb
user_id: integer
created: timestamp with time zone
modified: timestamp with time zone
id: integer
}
class user_group {
name: varchar(250)
id: integer
}
class user_group_to_user {
user_id: integer
user_group_id: integer
id: integer
}
class users_customuser {
password: varchar(128)
last_login: timestamp with time zone
is_superuser: boolean
username: varchar(150)
first_name: varchar(150)
last_name: varchar(150)
is_staff: boolean
is_active: boolean
date_joined: timestamp with time zone
email: varchar(254)
user_access_level: varchar(40)
id: integer
}
class users_customuser_groups {
customuser_id: integer
group_id: integer
id: integer
}
class users_customuser_user_permissions {
customuser_id: integer
permission_id: integer
id: integer
}
class users_educationorganization {
organization_name: varchar(350)
id: integer
}
class users_userprofile {
firstname: varchar(350)
lastname: varchar(350)
avatar_src: text
study_in_id: integer
group: text
user_id: integer
}
class usertests_answer {
is_true: boolean
text: text
help_textV1: text
help_textV2: text
help_textV3: text
video_url: varchar(200)
check_queue: integer
hard_level_of_answer: varchar(10)
created_by_id: integer
question_id: integer
is_deleted: boolean
is_invisible: boolean
is_required: boolean
is_image_deleted: boolean
only_for_exam: boolean
id: integer
}
class usertests_answerimage {
image: varchar(100)
owner_answer_id: integer
}
class usertests_detailquestionstatistic {
user_name: varchar(350)
is_login: boolean
statistic: jsonb
question_id: integer
authorized_user_id: integer
is_useExamMode: boolean
question_sequence_id: integer
question_has_been_completed: boolean
max_sum_of_answers_point: integer
created_at: timestamp with time zone
calculated_statistic: integer
id: integer
}
class usertests_question {
text: text
video_url: varchar(200)
created_by_id: integer
isImageQuestion: boolean
number_of_showing_answers: integer
connected_theme_id: integer
id: integer
}
class usertests_question_author {
question_id: integer
questionauthor_id: integer
id: integer
}
class usertests_question_theme {
question_id: integer
questionthemes_id: integer
id: integer
}
class usertests_questionauthor {
name: varchar(250)
created_by_id: integer
id: integer
}
class usertests_questionimage {
image: varchar(100)
owner_question_id: integer
}
class usertests_questionsequence {
sequence_data: jsonb
name: varchar(350)
created_by_id: integer
description: varchar(350)
id: integer
}
class usertests_questionstatistic {
number_of_passes: integer
sum_of_all_attempts: integer
question_id: integer
id: integer
}
class usertests_questionthemes {
name: varchar(250)
description: text
created_by_id: integer
id: integer
}
answer_statistic -[#595959,plain]-^ usertests_answer : "answer_id:id"
auth_group_permissions -[#595959,plain]-^ auth_group : "group_id:id"
auth_group_permissions -[#595959,plain]-^ auth_permission : "permission_id:id"
auth_permission -[#595959,plain]-^ django_content_type : "content_type_id:id"
cards_card -[#595959,plain]-^ cards_card : "card_down_id:id"
cards_card -[#595959,plain]-^ cards_card : "card_before_id:id"
cards_card -[#595959,plain]-^ cards_card : "card_up_id:id"
cards_card -[#595959,plain]-^ cards_card : "card_next_id:id"
cards_card -[#595959,plain]-^ users_customuser : "created_by_id:id"
cards_card -[#595959,plain]-^ usertests_question : "test_in_card_id:id"
cards_card -[#595959,plain]-^ usertests_question : "test_before_card_id:id"
cards_card_author -[#595959,plain]-^ cards_card : "card_id:id"
cards_card_author -[#595959,plain]-^ cards_cardauthor : "cardauthor_id:id"
cards_card_connected_theme -[#595959,plain]-^ cards_card : "card_id:id"
cards_card_connected_theme -[#595959,plain]-^ cards_unstructuredtheme : "unstructuredtheme_id:id"
cards_card_sub_theme -[#595959,plain]-^ cards_card : "card_id:id"
cards_card_sub_theme -[#595959,plain]-^ cards_cardsubtheme : "cardsubtheme_id:id"
cards_cardauthor -[#595959,plain]-^ users_customuser : "created_by_id:id"
cards_cardbookmark -[#595959,plain]-^ cards_card : "card_id:id"
cards_cardbookmark -[#595959,plain]-^ users_customuser : "user_id:id"
cards_cardcomments -[#595959,plain]-^ cards_card : "card_id:id"
cards_cardcomments -[#595959,plain]-^ users_customuser : "created_by_id:id"
cards_cardcourse -[#595959,plain]-^ users_customuser : "created_by_id:id"
cards_cardcourseimage -[#595959,plain]-^ cards_cardcourse : "card_course_id:id"
cards_cardimage -[#595959,plain]-^ cards_card : "card_id:id"
cards_cardrating -[#595959,plain]-^ cards_card : "card_id:id"
cards_cardrating -[#595959,plain]-^ users_customuser : "user_id:id"
cards_cardsubtheme -[#595959,plain]-^ cards_cardtheme : "theme_id:id"
cards_cardsubtheme -[#595959,plain]-^ users_customuser : "created_by_id:id"
cards_cardtheme -[#595959,plain]-^ cards_globalcardtheme : "global_theme_id:id"
cards_cardtheme -[#595959,plain]-^ users_customuser : "created_by_id:id"
cards_globalcardtheme -[#595959,plain]-^ users_customuser : "created_by_id:id"
cards_unstructuredtheme -[#595959,plain]-^ cards_unstructuredtheme : "parent_id:id"
cards_unstructuredtheme -[#595959,plain]-^ users_customuser : "created_by_id:id"
cards_usthemesequence -[#595959,plain]-^ users_customuser : "created_by_id:id"
django_admin_log -[#595959,plain]-^ django_content_type : "content_type_id:id"
django_admin_log -[#595959,plain]-^ users_customuser : "user_id:id"
error_answer_users_report -[#595959,plain]-^ users_customuser : "created_by_id:id"
error_answer_users_report -[#595959,plain]-^ usertests_answer : "answer_id:id"
exam_exam -[#595959,plain]-^ users_customuser : "created_by_id:id"
exam_exam -[#595959,plain]-^ usertests_questionsequence : "question_sequence_id:id"
graphql_auth_userstatus -[#595959,plain]-^ users_customuser : "user_id:id"
help_articles -[#595959,plain]-^ users_customuser : "created_by:id"
passing_the_exam -[#595959,plain]-^ exam_exam : "exam_id:id"
passing_the_exam -[#595959,plain]-^ users_customuser : "user_id:id"
passing_the_exam_question_status -[#595959,plain]-^ passing_the_exam : "passing_the_exam_id:id"
passing_the_exam_question_status -[#595959,plain]-^ usertests_detailquestionstatistic : "statistic_id:id"
passing_the_exam_question_status -[#595959,plain]-^ usertests_question : "question_id:id"
refresh_token_refreshtoken -[#595959,plain]-^ users_customuser : "user_id:id"
social_auth_usersocialauth -[#595959,plain]-^ users_customuser : "user_id:id"
user_group_to_user -[#595959,plain]-^ user_group : "user_group_id:id"
user_group_to_user -[#595959,plain]-^ users_customuser : "user_id:id"
users_customuser_groups -[#595959,plain]-^ auth_group : "group_id:id"
users_customuser_groups -[#595959,plain]-^ users_customuser : "customuser_id:id"
users_customuser_user_permissions -[#595959,plain]-^ auth_permission : "permission_id:id"
users_customuser_user_permissions -[#595959,plain]-^ users_customuser : "customuser_id:id"
users_userprofile -[#595959,plain]-^ users_customuser : "user_id:id"
users_userprofile -[#595959,plain]-^ users_educationorganization : "study_in_id:id"
usertests_answer -[#595959,plain]-^ users_customuser : "created_by_id:id"
usertests_answer -[#595959,plain]-^ usertests_question : "question_id:id"
usertests_answerimage -[#595959,plain]-^ usertests_answer : "owner_answer_id:id"
usertests_detailquestionstatistic -[#595959,plain]-^ users_customuser : "authorized_user_id:id"
usertests_detailquestionstatistic -[#595959,plain]-^ usertests_question : "question_id:id"
usertests_detailquestionstatistic -[#595959,plain]-^ usertests_questionsequence : "question_sequence_id:id"
usertests_question -[#595959,plain]-^ cards_unstructuredtheme : "connected_theme_id:id"
usertests_question -[#595959,plain]-^ users_customuser : "created_by_id:id"
usertests_question_author -[#595959,plain]-^ usertests_question : "question_id:id"
usertests_question_author -[#595959,plain]-^ usertests_questionauthor : "questionauthor_id:id"
usertests_question_theme -[#595959,plain]-^ usertests_question : "question_id:id"
usertests_question_theme -[#595959,plain]-^ usertests_questionthemes : "questionthemes_id:id"
usertests_questionauthor -[#595959,plain]-^ users_customuser : "created_by_id:id"
usertests_questionimage -[#595959,plain]-^ usertests_question : "owner_question_id:id"
usertests_questionsequence -[#595959,plain]-^ users_customuser : "created_by_id:id"
usertests_questionstatistic -[#595959,plain]-^ usertests_question : "question_id:id"
usertests_questionthemes -[#595959,plain]-^ users_customuser : "created_by_id:id"
@enduml
@startuml
actor User
participant "React Frontend" as Frontend
participant "Express REST API" as Express
participant "PostgreSQL"
participant "Recombee"
participant "Google Cloud Storage" as GCS
participant "Auth0"
== Загрузка главной страницы ==
User -> Frontend : Открывает главную страницу
Frontend -> Express : GET /courses
Express -> PostgreSQL : SELECT * FROM courses
PostgreSQL --> Express : Курсы
Express --> Frontend : JSON с курсами
Frontend --> User : Отображает список курсов
== Открытие курса ==
User -> Frontend : Кликает на курс
Frontend -> Express : GET /course/:id
Express -> PostgreSQL : SELECT * FROM course, resources WHERE course_id = :id
PostgreSQL --> Express : Данные курса + первый ресурс
Express --> Frontend : JSON с ресурсом
Frontend -> Recombee : logView(user_id, resource_id)
Frontend -> GCS : GET /images/res1.jpg
GCS --> Frontend : Картинка ресурса
Frontend --> User : Отображает ресурс
== Открытие теста ==
User -> Frontend : Кликает "Пройти тест"
Frontend -> Auth0 : Проверка авторизации
alt Не авторизован
Auth0 --> Frontend : Redirect на login
Frontend -> User : Перенаправление на Auth0
else Авторизован
Frontend -> Express : GET /test/:id
Express -> PostgreSQL : SELECT * FROM test, questions, answers WHERE test_id = :id
PostgreSQL --> Express : Данные теста
Express --> Frontend : JSON с тестом
loop Вопросы
Frontend -> GCS : GET /images/questionX.jpg, answerY.jpg
GCS --> Frontend : Картинки
end
Frontend --> User : Отображает тест
end
== Прохождение теста ==
User -> Frontend : Отвечает на вопросы
Frontend -> Express : POST /test-results
Express -> PostgreSQL : INSERT INTO test_results + шаги
PostgreSQL --> Express : OK
Express --> Frontend : Статистика
Frontend -> Express : GET /test-results/stats
Express -> PostgreSQL : SELECT ошибок и баллы по шагам
PostgreSQL --> Express : Данные
Express --> Frontend : JSON
Frontend --> User : Рисует графики
@enduml
@startuml
title Состояния прохождения теста
[*] --> ВыборРежима
ВыборРежима --> ОтображениеВопроса : режим выбран
ОтображениеВопроса --> ВыборОтвета : вопрос загружен
ВыборОтвета --> ПроверкаОтвета : нажата кнопка "проверить"
ПроверкаОтвета --> Завершён : ошибок нет
ПроверкаОтвета --> Подсказка : есть ошибки
Подсказка --> ВыборОтвета : пользователь меняет ответ
ВыборОтвета --> Завершён : нажата кнопка "сдаться"
Завершён --> Статистика : показать результаты
Статистика --> ПовторноеПрохождение : нажата "пройти заново"
ПовторноеПрохождение --> ВыборРежима
@endum
@startuml
title Study Ways диаграмма Use Case
actor "Студент" as Student
actor "Преподаватель" as Teacher
actor "Администратор" as Admin
actor "Студент с правом создания уроков" as StudentCreator
rectangle "Учебная платформа" {
usecase "Регистрация/Авторизация" as UC_Auth
package "Обучение" {
usecase "Просмотр курсов" as UC_ViewCourses
usecase "Изучение контента курса" as UC_StudyCourse
usecase "Поиск образовательных ресурсов" as UC_SearchResources
}
package "Тестирование" {
usecase "Прохождение тестов" as UC_TakeTests
usecase "Получение результатов теста" as UC_TestResults
}
package "Управление контентом" {
usecase "Управление курсами" as UC_ManageCourses
usecase "Управление тестами" as UC_ManageTests
usecase "Управление ресурсами" as UC_ManageResources
usecase "Управление деревом тем ресурсов" as UC_ManageThemes
}
}
' Студент
Student --> UC_Auth
Student --> UC_ViewCourses
Student --> UC_StudyCourse
Student --> UC_TakeTests
Student --> UC_TestResults
Student --> UC_SearchResources
' Преподаватель
Teacher --> UC_Auth
Teacher --> UC_ManageCourses
Teacher --> UC_ManageTests
Teacher --> UC_ManageResources
Teacher --> UC_TakeTests
Teacher --> UC_TestResults
Teacher --> UC_ManageThemes
' Администратор
Admin --> UC_Auth
Admin --> UC_ManageCourses
Admin --> UC_ManageTests
Admin --> UC_ManageResources
Admin --> UC_TakeTests
Admin --> UC_TestResults
Admin --> UC_ManageThemes
' Студент с правом создания уроков
StudentCreator --> UC_Auth
StudentCreator --> UC_ManageCourses
StudentCreator --> UC_ManageResources
StudentCreator --> UC_TakeTests
StudentCreator --> UC_TestResults
@enduml
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment