PRPA lb-3
This commit is contained in:
6
semester-4/ПрПА/lb-3/README.md
Normal file
6
semester-4/ПрПА/lb-3/README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
> [!NOTE]
|
||||||
|
> Викладач: Онищенко К. Г.; Афанасьєва І. В.
|
||||||
|
> Оцінка: In Progress
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> Виконано в команді
|
39
semester-4/ПрПА/lb-3/doc.yaml
Normal file
39
semester-4/ПрПА/lb-3/doc.yaml
Normal 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
|
163
semester-4/ПрПА/lb-3/uml/class.pu
Normal file
163
semester-4/ПрПА/lb-3/uml/class.pu
Normal 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
|
1
semester-4/ПрПА/lb-3/uml/class.svg
Normal file
1
semester-4/ПрПА/lb-3/uml/class.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 50 KiB |
110
semester-4/ПрПА/lb-3/uml/object.pu
Normal file
110
semester-4/ПрПА/lb-3/uml/object.pu
Normal 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
|
1
semester-4/ПрПА/lb-3/uml/object.svg
Normal file
1
semester-4/ПрПА/lb-3/uml/object.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 19 KiB |
225
semester-4/ПрПА/lb-3/uml/uc.pu
Normal file
225
semester-4/ПрПА/lb-3/uml/uc.pu
Normal 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
|
1
semester-4/ПрПА/lb-3/uml/uc.svg
Normal file
1
semester-4/ПрПА/lb-3/uml/uc.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 98 KiB |
BIN
semester-4/ПрПА/lb-3/Лр_3_TaskHub_ПЗПІ_23_2.pdf
Normal file
BIN
semester-4/ПрПА/lb-3/Лр_3_TaskHub_ПЗПІ_23_2.pdf
Normal file
Binary file not shown.
305
semester-4/ПрПА/lb-3/Лр_3_TaskHub_ПЗПІ_23_2.typ
Normal file
305
semester-4/ПрПА/lb-3/Лр_3_TaskHub_ПЗПІ_23_2.typ
Normal 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.
|
Reference in New Issue
Block a user