1
0

PRPA lb-3

This commit is contained in:
Sytnyk Yehor
2025-05-30 22:56:25 +03:00
parent e79109c81a
commit 84f7393e78
10 changed files with 851 additions and 0 deletions

View File

@ -0,0 +1,6 @@
> [!NOTE]
> Викладач: Онищенко К. Г.; Афанасьєва І. В.
> Оцінка: In Progress
> [!TIP]
> Виконано в команді

View File

@ -0,0 +1,39 @@
title: "Проектування та розробка проекту. Метод мозкового штурму. Структурні діаграми: діаграма класів, об'єктів"
subject: ПП
doctype: ЛБ
worknumber: 3
mentors:
- name: Онищенко К. Г.,
gender: m,
degree: ст. викладач кафедри ПІ,
- name: Афанасьєва І. В.,
gender: f,
degree: доц. каф. ПІ,
edu_program: &EDU ПЗПІ
university: ХНУРЕ
authors:
- name: Ситник Є. С.
course: 2
edu: *EDU
gender: m
group: 23-2
- name: Малишкін. А. С.
course: 2
edu: *EDU
gender: m
group: 23-2
- name: Краснокутська Ю. Є.
course: 2
edu: *EDU
gender: f
group: 23-2
- name: Семьонов. О. О.
course: 2
edu: *EDU
gender: m
group: 23-2
- name: Петах С. І.
course: 2
edu: *EDU
gender: m
group: 23-2

View File

@ -0,0 +1,163 @@
@startuml
skin rose
skinparam backgroundColor #EEEBDC
/' left to right direction '/
enum AttachmentType {
+ Description
+ DueDate
+ File
+ Url
+ Text
+ Tip
+ Hint
+ Warning
+ Progress
+ Importance
}
enum RequestType {
+ Add
+ Update
+ Remove
}
enum AccessLevel {
+ View
+ AddSolutions
+ Edit
+ AddUsers
+ FullAccess
}
enum MembershipLevel {
+ View
+ AddTasks
+ Edit
+ AddUsers
+ FullAccess
}
enum TaskVisibility {
+ Private
+ Public
+ Paid
}
enum SolutionType {
+ File
+ Url
+ Text
}
hide AccessLevel methods
hide MembershipLevel methods
hide AttachmentType methods
hide TaskVisibility methods
hide SolutionType methods
hide RequestType methods
class User {
- id : int
+ name : String
+ email : String
+ password : String
+ register()
+ login()
+ changePassword()
}
class Access {
- userId : int
- taskId : int
+ accessLevel : AccessLevel
+ changeAccessLevel()
}
class Task {
- id : int
+ attachments : List<Attachment>
+ solutions : List<Solution>
+ requests : List<Request>
+ name : String
+ visibility : TaskVisibility
+ create()
+ remove()
+ fork()
+ changeVisibility()
+ transferOwnership()
}
class Attachment {
+ type : AttachmentType
+ data : Blob
+ isPrivate: boolean
+ description : String
}
class Solution {
+ description: String
+ type: SolutionType
+ data: blob
+ approve()
+ decline()
}
class TaskGroup {
+ tasks : List<Task>
+ name : String
+ description : String
+ addTask()
+ removeTask()
+ addUser()
+ removeUser()
}
class Membership {
- userId : int
+ taskGroupId : int
+ membershipLevel: MembershipLevel
+ changeMembershipLevel()
}
class Request {
- id : int
- userId : int
- attachmentId : int
+ type : RequestType
+ message : String
+ isApplied
+ isRejected
+ apply()
+ reject()
+ revoke()
}
hide Attachment methods
User -u.> Access : <<manages>>
User -u.> Membership : <<manages>>
User -u.> Attachment : <<owns>>
User -u.> Request : <<supervises>>
User -u.> Solution : <<supervises>>
Task -d.> Access : <<grants>>
TaskGroup -d.> Membership : <<grants>>
Task -d-> Attachment : contains
Task -d-> Request : associates
Task -d-> Solution : associates
Request <-u- Attachment : associates
TaskGroup -u-> Task : manages
AttachmentType --* Attachment
RequestType -r-* Request
AccessLevel --* Access
MembershipLevel --* Membership
TaskVisibility --* Task
SolutionType -u-* Solution
@enduml

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -0,0 +1,110 @@
@startuml
skin rose
skinparam backgroundColor #EEEBDC
object "user1: User" as user1 {
id = 1
name = "Alice Smith"
email = "alice@example.com"
}
object "user2: User" as user2 {
id = 2
name = "Bob Johnson"
email = "bob@example.com"
}
object "proj_team_alpha: TaskGroup" as taskGroup1 {
name = "Project Alpha Team"
description = "Tasks for Project Alpha"
}
object "task_design_ui: Task" as task1 {
id = 101
name = "Design UI Mockups"
visibility = Public
}
object "task_refactor_code: Task" as task2 {
id = 102
name = "Refactor Legacy Code"
visibility = Private
}
object "attach_new_icon: Attachment" as attach1 {
type = File
description = "New icon suggestion"
isPrivate = false
}
object "sol_ui_mockups: Solution" as sol1 {
description = "Figma link to mockups"
type = Url
}
object "req_add_icon: Request" as req1 {
id = 201
userId = 2
attachmentId = 301
type = Add
message = "Proposing new icon for homepage."
isApplied = false
isRejected = false
}
object "access_ui_task1: Access" as access1 {
userId = 1
taskId = 101
accessLevel = FullAccess
}
object "access_ui_task2: Access" as access2 {
userId = 2
taskId = 101
accessLevel = View
}
object "access_refactor_task1: Access" as access3 {
userId = 2
taskId = 102
accessLevel = FullAccess
}
object "memb_user1_proj: Membership" as memb1 {
userId = 1
taskGroupId = 1
membershipLevel = FullAccess
}
object "memb_user2_proj: Membership" as memb2 {
userId = 2
taskGroupId = 1
membershipLevel = View
}
taskGroup1 -r- memb1
taskGroup1 -u---- memb2
memb1 -u- user1
memb2 -u- user2
taskGroup1 -u-- task1
access1 -d- user1
access2 -u- user2
access3 -l- user2
access1 -l- task1
access2 -d- task1
access3 -r- task2
sol1 -u- task1
sol1 -- user1
attach1 -- req1
attach1 -l- task1
req1 -- task1
req1 -u- user2
@enduml

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,225 @@
@startuml
skin rose
skinparam backgroundColor #EEEBDC
left to right direction
!define Cloud(name, description) usecase "description" as name [[name]] #DarkGray
!define Kite(name, description) usecase "description" as name [[name]] #Yellow
!define Sea(name, description) usecase "description" as name [[name]] #LightBlue
!define Fish(name, description) usecase "description" as name [[name]] #LightGray
!define Clam(name, description) usecase "description" as name [[name]] #Silver
<style>
package {
LineColor transparent
BackgroundColor transparent
Shadowing 0
FontColor transparent
}
</style>
<style>
.visiblePackage {
LineColor black
Shadowing 1
FontColor black
}
</style>
hide <<visiblePackage>> stereotype
/' package "TaskHub" <<visiblePackage>> { '/
package "TaskHub" {
actor User as user
actor Guest as guest
actor Admin as admin
' Auth
package "Auth" {
actor "Google Auth Provider" as google
/' Cloud(auth, "Authentication") '/
/' guest '1' -- '' auth '/
Kite(auth_login, "Login")
Kite(auth_register, "Registration")
guest "1" --- "0..1" auth_login
guest "1" --- "0..*" auth_register
Sea(register_email, "Register via Email")
auth_register ..> register_email : <<include>>
Fish(enter_email, "Enter Email without confirmation")
Fish(enter_email_confirm, "Enter Email with confirmation")
Fish(enter_password, "Enter Passwounrd")
Fish(enter_username, "Enter Username")
register_email ..> enter_email_confirm : <<include>>
register_email ..> enter_password: <<include>>
register_email ..> enter_username : <<include>>
Sea(login_google, "Login via Google OAuth")
auth_login <.. login_google : <<extend>>
Fish(choose_account, "Choose Google account")
login_google ..> choose_account : <<include>>
choose_account "0..*" -- "1" google
Sea(login_email, "Login via Email")
auth_login <.. login_email: <<extend>>
login_email ..> enter_email : <<include>>
login_email ..> enter_password: <<include>>
Sea(recover_password, "Password Recovery")
auth_login <.. recover_password : <<extend>>
Fish(enter_password_new, "Enter New Password")
recover_password ..> enter_email_confirm : <<include>>
recover_password ..> enter_password_new : <<include>>
}
package "Own Task Managment" {
Kite(own_task_create, "Create new Task")
user "1" --- "0..*" own_task_create
Sea(own_task_create_name, "Enter Task Name")
Sea(own_task_create_visibility, "Select Task Visibility")
own_task_create ..> own_task_create_name : <<include>>
own_task_create ..> own_task_create_visibility : <<include>>
Kite(own_task_delete, "Delete Task")
user "1" --- "0..*" own_task_delete
Sea(own_task_delete_confirm, "Enter Confirmation Code form Email")
own_task_delete ..> own_task_delete_confirm : <<include>>
Kite(own_task_update, "Update Task Attachments")
user "1" --- "0..*" own_task_update
Sea(own_task_update_type, "Select Attachment Type")
Sea(own_task_update_content, "Select Attachment Content")
Sea(own_task_update_visibility, "Select Attachment visibility")
own_task_update ..> own_task_update_type : <<include>>
own_task_update ..> own_task_update_content : <<include>>
own_task_update ..> own_task_update_visibility : <<include>>
Kite(own_task_visibility, "Change visibility of the Task")
user "1" --- "0..*" own_task_visibility
Sea(own_task_visibility_private, "Set Private Task Visibility")
Sea(own_task_visibility_public, "Set Public Task Visibility")
Sea(own_task_visibility_paid, "Set Paid Task Visibility")
own_task_visibility <.. own_task_visibility_private : <<extend>>
own_task_visibility <.. own_task_visibility_public : <<extend>>
own_task_visibility <.. own_task_visibility_paid : <<extend>>
Kite(own_task_requests, "Manage Tasks Requests")
user "1" --- "0..*" own_task_requests
Sea(own_task_request_approve, "Approve Task Request")
Sea(own_task_request_decline, "Decline Task Request")
own_task_requests <.. own_task_request_approve : <<extend>>
own_task_requests <.. own_task_request_decline : <<extend>>
Kite(own_task_access, "Manage Task Access Rights")
user "1" --- "0..*" own_task_access
Sea(own_task_access_add, "Give Access for User")
Sea(own_task_access_remove, "Remove Access of the User")
Sea(own_task_access_update, "Update Access of the User")
own_task_access <.. own_task_access_add : <<extend>>
own_task_access <.. own_task_access_remove : <<extend>>
own_task_access <.. own_task_access_update : <<extend>>
/' } '/
package "Other Tasks Interactions" {
actor "Payment Provider" as payment
Kite(task_fork, "Fork existing Task")
user "1" --- "0..*" task_fork
Sea(task_fork_options, "Select Fork Options")
task_fork ..> task_fork_options : <<include>>
Kite(other_task_request_managment, "Manage Task Requests")
user "1" --- "0..*" other_task_request_managment
Sea(request_add, "Add Attachment Request")
Sea(request_update, "Update Attachment Request")
Sea(request_remove, "Remove Attachment Request")
Sea(request_revoke, "Revoke existing Request")
other_task_request_managment <.. request_add : <<extend>>
other_task_request_managment <.. request_update: <<extend>>
other_task_request_managment <.. request_remove : <<extend>>
other_task_request_managment <.. request_revoke : <<extend>>
Kite(buy_task, "Buy Paid Task")
user "1" --- "0..*" buy_task
Sea(select_payment, "Select Payment Method")
buy_task ..> select_payment : <<include>>
select_payment "0..*" -- "1" payment
}
package "Admin Panel" {
Kite(manage_users, "Manage Users")
admin "1" --- "0..*" manage_users
Sea(review_users, "Review User Details")
manage_users ..> review_users : <<include>>
Fish(create_user, "Create New User")
Fish(view_user_profile, "View Private Data")
Fish(delete_user_admin, "Delete User")
Fish(block_user_admin, "Block User")
review_users <.. create_user : <<extend>>
review_users <.. view_user_profile : <<extend>>
review_users <.. delete_user_admin : <<extend>>
review_users <.. block_user_admin : <<extend>>
Kite(manage_content, "Manage Content")
admin "1" --- "0..*" manage_content
Sea(review_content, "Review Content Details")
manage_content ..> review_content : <<include>>
Fish(approve_content, "Approve Content")
Fish(remove_content, "Remove Content")
Fish(warn_user, "Warn Content Author")
review_content <.. approve_content : <<extend>>
review_content <.. remove_content : <<extend>>
review_content <.. warn_user : <<extend>>
}
package "Task Group Management" {
actor "Github Integration Provider" as github
Kite(manage_tasks_in_groups, "Manage Tasks in Groups")
Kite(manage_user_access, "Manage User's Access")
Kite(manage_users_tg, "Manage Users")
Kite(tg_manage_github, "Manage Github Integration")
user "1" --- "0..*" manage_users_tg
user "1" --- "0..*" manage_tasks_in_groups
user "1" --- "0..*" manage_user_access
user "1" --- "0..*" tg_manage_github
Sea(add_user, "Add User")
Sea(delete_user, "Delete User")
manage_users_tg ..> add_user : <<include>>
manage_users_tg ..> delete_user : <<include>>
Sea(set_user_access, "Change Access Level")
manage_user_access ..> set_user_access : <<include>>
Sea(tg_add_task, "Add Task to Group")
Sea(tg_create_task, "Create new Task in Group")
Sea(tg_remove_task, "Remove Task from Group")
manage_tasks_in_groups <.. tg_add_task : <<extend>>
manage_tasks_in_groups <.. tg_create_task : <<extend>>
manage_tasks_in_groups <.. tg_remove_task : <<extend>>
Sea(github_link_repository, "Link GitHub repository to the Group")
Sea(github_unlink_repository, "Unlink GitHub repository from the Group")
tg_manage_github <.. github_link_repository : <<extend>>
tg_manage_github <.. github_unlink_repository : <<extend>>
github_link_repository "0..*" -- "1" github
github_unlink_repository "0..*" -- "1" github
}
}
@enduml

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 98 KiB

View File

@ -0,0 +1,305 @@
#import "@local/nure:0.1.0": *
#import calc: max
#import table: cell
#show: pz-lb.with(..yaml("doc.yaml"))
#set text(size: 14pt)
#let map-column(items, min-height, column) = {
return for i in range(0, min-height) {
(items.at(i, default: ""),)
}.map(e => cell(x: column)[_ #e _])
}
#let crc-card(
name: "Name",
subclasses: (),
superclasses: (),
responsibilities: ("responsibilities",),
collaborators: (),
description: "description",
attributes: ("attributes",),
) = figure(
table(
align: left, column-gutter: (0cm, 0.5cm), columns: (3fr, 2fr, 4fr),
cell(x: 0, y: 0, colspan: 2)[_ #name _],
cell(x: 0, y: 1, colspan: 2)[subclasses: _ #subclasses.join(", ") _],
cell(x: 0, y: 2, colspan: 2)[superclasses: _ #superclasses.join(", ") _],
table.cell(x: 0, y: 3)[responsibilities],
..map-column(responsibilities, 5, 0),
cell(x: 1, y: 3)[collaborators],
..map-column(collaborators, 5, 1),
cell(x: 2, y: 0)[_ #name _],
cell(x: 2, y: 1)[#linebreak()],
cell(x: 2, y: 2)[Description:],
cell(x: 2, y: 3)[_ #description _],
cell(x: 2, y: 4)[Attributes:],
..map-column(attributes, 4, 2),
),
)
#let crc-cards = (
// User
(
name: "User",
description: "Represents a platform user with authentication, profile management, and subscription capabilities",
attributes: (
"email",
"username",
"password",
"profileInfo",
"subscriptionTier",
),
subclasses: (),
superclasses: (),
responsibilities: (
"Authenticate user credentials",
"Manage user profile information",
"Track subscription status and limits",
"Maintain user activity history",
"Handle user preferences and settings",
),
collaborators: (
"Task",
"Solution",
"Attachment",
"Payment",
"Subscription",
),
),
// Task
(
name: "Task",
description: "Core entity representing a task with description, attachments, access controls, and monetization options",
attributes: (
"title",
"owner",
"tags",
"attachments",
"accessType",
"price",
),
subclasses: (),
superclasses: (),
responsibilities: (
"Store task information and metadata",
"Manage task access permissions",
"Handle task pricing and monetization",
"Track task completion status",
"Maintain task versioning and history",
"Support task cloning/forking",
"Manage attached files and resources",
),
collaborators: (
"User",
"Solution",
"TaskGroup",
"Comment",
"Payment",
"Attachment",
),
),
// Attachment
(
name: "Attachment",
description: "Manages attachments for tasks and solutions with storage limits and security controls",
attributes: (
"creator",
"target",
"type",
"data",
),
subclasses: (),
superclasses: (),
responsibilities: (
"Enforce storage limits per subscription tier",
"Handle file upload and download",
"Support multiple formats",
"Generate secure URLs",
),
collaborators: (
"Task",
"Solution",
"User",
"Subscription",
),
),
// Solution
(
name: "Solution",
description: "Represents user-submitted solutions to tasks with various formats and evaluation capabilities",
attributes: (
"task",
"owner",
"content",
"attachments",
"status",
"rating",
"isPublic",
),
subclasses: (),
superclasses: (),
responsibilities: (
"Store solution content and attachments",
"Track solution submission status",
"Handle solution evaluation and rating",
"Manage solution visibility settings",
"Support various solution formats",
"Maintain solution history",
),
collaborators: (
"User",
"Task",
"Comment",
"Rating",
"Attachment",
),
),
// TaskGroup
(
name: "TaskGroup",
description: "Organizes related tasks into thematic or project-based collections with shared access settings",
attributes: (
"name",
"description",
"owner",
"tasks",
"accessType",
"price",
),
subclasses: (),
superclasses: (),
responsibilities: (
"Group related tasks together",
"Manage group-level access permissions",
"Handle group monetization settings",
"Integrate with GitHub repositories",
"Support bulk operations on tasks",
"Maintain group metadata",
),
collaborators: (
"Task",
"User",
"Payment",
),
),
// Comment
(
name: "Comment",
description: "Enables user interaction through comments on tasks with rating capabilities",
attributes: (
"user",
"target",
"content",
),
subclasses: (),
superclasses: (),
responsibilities: (
"Store comment content and metadata",
"Track comment timestamps",
"Handle comment moderation",
),
collaborators: (
"User",
"Task",
"Solution",
),
),
// Payment
(
name: "Payment",
description: "Handles financial transactions for task access, solutions, and subscriptions",
attributes: (
"user",
"target",
"amount",
"currency",
"status",
"paymentMethod",
),
subclasses: (),
superclasses: (),
responsibilities: (
"Process payment transactions",
"Validate payment information",
"Handle payment failures and retries",
"Track payment history",
"Integrate with payment providers",
"Manage refunds and chargebacks",
),
collaborators: (
"User",
"Task",
"TaskGroup",
"Subscription",
),
),
// Subscription
(
name: "Subscription",
description: "Manages user subscription tiers, limits, and billing cycles",
attributes: (
"user",
"tier",
"startDate",
"endDate",
"status",
"taskLimit",
"storageLimit",
"price",
"billingCycle",
),
subclasses: (),
superclasses: (),
responsibilities: (
"Manage subscription lifecycle",
"Enforce subscription limits",
"Handle subscription upgrades/downgrades",
"Track usage against limits",
"Process subscription renewals",
),
collaborators: (
"User",
"Payment",
),
),
)
#v(-spacing)
== Мета роботи
Отримати навички побудови статичного представлення логічної моделі
проектованої інформаційної системи у вигляді CRC-карток, об'єктної моделі,
діаграми класів UML.
== Хід роботи
#v(-spacing)
=== Створення Smart Use Case діаграми
SMART Use Case Diagram це один з інструментів моделювання в UML, що візуально відображає функціональні вимоги до системи з точки зору користувача. Вона складається з акторів, варіантів використання та зв'язків між ними, демонструючи, хто і як використовує систему для досягнення певних цілей. Ця діаграма допомагає розробникам, замовникам та іншим зацікавленим сторонам краще зрозуміти обсяг та призначення системи, сприяючи ефективній комунікації та збору вимог на ранніх етапах розробки програмного забезпечення.
#figure(image("uml/uc.svg"), caption: [SMART Use Case діаграма])
=== Проєктування системи методом мозкового штурму (CRC-картки)
CRC-картки це інструмент для об'єктно-орієнтованого дизайну, що використовується переважно на початкових етапах розробки програмного забезпечення. Вони допомагають команді швидко обговорювати та визначати, які класи потрібні системі, за що відповідає кожен клас, і з якими іншими класами він взаємодіє для виконання своїх завдань.
Під час мозкового штурму нами було виділено картки із наступними класами:
#crc-cards.map(e => e.name).join(", ");
#crc-cards.map(e => crc-card(..e)).join(line(length: 100%, stroke: 1pt + gray));
=== Створення діаграми класів
Діаграма класів показує класи, їхні атрибути та операції а також зв'язки між ними. Це основна діаграма, що визначає архітектуру системи та взаємодію її компонентів.
#figure(image("uml/class.svg"), caption: [Діаграма класів])
=== Створення діаграми об'єктів
Діаграма об'єктів є миттєвим станом системи в конкретний момент часу, що демонструє конкретні екземпляри класів (об'єкти) та їхні зв'язки. На відміну від діаграми класів, яка показує загальну структуру та можливі зв'язки, діаграма об'єктів відображає реальні об'єкти з їхніми поточними значеннями атрибутів і фактичними зв'язками між ними. Вона використовується для візуалізації конкретних сценаріїв виконання та допомагає перевірити правильність діаграми класів.
#figure(image("uml/object.svg"), caption: [Діаграма об'єктів])
== Висновки
За результатами цієї лабораторної роботи ми отримали навички побудови статичного представлення логічної моделі
проектованої інформаційної системи у вигляді CRC-карток, об'єктної моделі та діаграми класів UML.