Цей репозиторій містить планування та початкову архітектуру веб-застосунку "Система управління розкладом університету" (University Schedule CMS). Головною функцією програми є надання зручного доступу до розкладу занять для студентів та викладачів, а також управління цим розкладом.
Нижче представлена UML-діаграма класів, яка відображає основні сутності та їхні взаємозв'язки в системі. Ця діаграма є основою для подальшої розробки бази даних та програмного коду.
###PlantUML Код класів UML: university_class_diagram.puml
!theme plain
' Абстрактний базовий клас для всіх типів людей '
abstract class Person {
+ Long id
+ String firstName
+ String lastName
+ String email
+ String phone
}
' Спеціалізовані типи людей (ролі) '
class Student {
+ Integer academicYear
}
class Teacher {
}
class LaboratoryAssistant {
}
class Scientist {
}
' Ролі керівництва '
class DeanOfFaculty {
}
class RectorOfUniversity {
}
' Основні структурні сутності університету '
class University {
+ String name
}
class Faculty {
+ Long id
+ String name
}
class Group {
+ Long id
+ String name
}
class Course {
+ Long courseId
+ String name
+ String description
}
class Classroom {
+ Long id
+ String name
+ Integer capacity
}
' Сутність для визначення навчального плану/програми '
class CurriculumItem {
+ Long id
+ Integer requiredAcademicYear
}
' Сутність, що стосується розкладу '
class Lesson {
+ Long id
+ LocalDateTime startTime
+ LocalDateTime endTime
+ LocalDate date
+ String lessonType
}
' Проміжна таблиця для зв'язку Студент-Курс '
class StudentCourse {
+ Long id
+ LocalDate enrollmentDate
+ String grade
+ String status
}
class StudentProject {
+ Long id
+ String projectName
+ String description
+ String projectType
}
' Зв'язки успадкування '
Person <|-- Student
Person <|-- Teacher
Person <|-- LaboratoryAssistant
Person <|-- Scientist
Person <|-- DeanOfFaculty
Person <|-- RectorOfUniversity
' Зв'язки структури університету '
University "1" -- "0..*" Faculty : has
RectorOfUniversity "1" -- "1" University : manages
DeanOfFaculty "1" -- "1" Faculty : leads
' Факультет та його складові/пропозиції '
Faculty "1" -- "0..*" Group : contains
Faculty "1" -- "0..*" Teacher : employs
Faculty "1" -- "0..*" LaboratoryAssistant : employs
Faculty "1" -- "0..*" Scientist : employs
Faculty "1" -- "0..*" CurriculumItem : offers
Course "1" -- "0..*" CurriculumItem : is offered as
' Студент та Група/Факультет '
Student "0..*" -- "1" Group : belongs to
Student "0..*" -- "1" Faculty : studies at
' Студент та зарахування на курс '
Student "1" -- "0..*" StudentCourse
Course "1" -- "0..*" StudentCourse
' Компоненти заняття '
Teacher "1" -- "0..*" Lesson
Classroom "1" -- "0..*" Lesson
Course "1" -- "0..*" Lesson
' Заняття та учасники '
Lesson "1" -- "1..*" Group
' Наукові проекти / Дипломні роботи '
Student "1" -- "0..1" StudentProject
StudentProject "0..*" -- "0..*" Scientist
@enduml
Ці історії користувачів описують ключові функціональні можливості системи з точки зору різних ролей.
###1. Перегляд розкладу для викладача Вчитель може переглядати свій щоденний розклад:
Користувач входить у систему як Вчитель. Коли він переходить до меню "Мій розклад" і обирає певну дату,
він бачить список уроків, призначених йому на цей день, включаючи назву курсу, групи, клас, час початку та час завершення уроку.
Вчитель може переглядати свій щомісячний розклад:
Користувач входить у систему як Вчитель. Коли він переходить до меню "Мій розклад" і обирає певний місяць,
він бачить календарний план занять та може розгорнути детальний список призначених йому уроків за будь яку дату цього місяця.
###2. Перегляд розкладу для студента Студент може переглядати свій щоденний розклад:
Користувач увійшов як Студент. Коли він переходить до меню "Мій розклад" і обирає певну дату,
він бачить список уроків на цю дату, які йому доступні у навчальному процесі, включаючи назву курсу (предмету навчання),
викладача, клас (номер аудиторії), час початку та час закінчення.
Студент може переглядати свій щомісячний розклад:
Користувач увійшов як Студент. Коли він переходить до меню "Мій розклад" і обирає певний місяць,
він бачить календарний план занять та може розгорнути детальний список призначених йому уроків за будь яку дату цього місяця,
які йому доступні у навчальному процесі, включаючи назву курсу (предмету навчання), викладача, клас (номер аудиторії), час початку та час закінчення.
###3. Управління розкладом (для адміністрації/викладачів) Адміністратор/Викладач може керувати потоком інформації про урок:
Користувач увійшов як Декан або Викладач (з відповідними дозволами). Коли він переходить до розділу "Управління уроками" та обирає існуючий урок,
він може редагувати будь яку інформацію про урок, таку як час початку, час завершення, дата, назва курсу (предмету навчання),
призначати/перепризначати Викладача, Клас, Курс та пов'язані групи.
###4. Управління зарахуванням студентів на курси Адміністратор/Викладач може керувати потоком реєстрації студентів на курси:
Користувач увійшов як Декан або Викладач (з відповідними дозволами). Коли вінпереходить до розділу "Реєстрація студентів" та обирає Студента або Курс (предмет навчання),
він може переглядати, додавати, редагувати або видаляти записи Студент/Курс, включаючи дату зарахування,
оцінку та статус для конкретного студента що до певного курсу (предмету навчання).
###5. Управління зарахуванням студентів в університет на факультети та у групи Адміністратор/Ректор може керувати потоком реєстрації студентів на курси:
Користувач увійшов як Ректор або Декан (з відповідними дозволами). Коли він переходить до розділу "Реєстрація студентів" та обирає Студента, Групу, Факультет, Університет,
він може переглядати, додавати, редагувати або видаляти записи щодо зарахування, переведення, відрахування студента,- включаючи дату, оцінку та статус для конкретного студента,
в тому числі переведення на наступний навчальний рік, затвердження курсових, наукових, дипломних проектів... .
- Додавання, редагування, видалення факультетів, груп, студентів і курсів (предметів навчання);
- Призначення факультетів, груп, курсів студентам;
- ID для нових студентів генеруються базою даних автоматично (використовуючи стратегію Identity);
- REST API;
- Генерація тестових даних;
- Міграція бази даних з Flyway;
- Інтеграційне тестування з Testcontainers;
Проект буде розроблений як веб-застосунок, ймовірно, з використанням:
- Java 21
- Spring Boot 3.x
- Spring Data JPA
- Hibernate
- PostgreSQL
- Flyway (міграції)
- Testcontainers (тестова база)
- Maven
- JUnit 5
- Frontend: (буде визначено пізніше)
- Version Control: Git / GitLab
university-cms/
│
├── src/
│ ├── main/
│ │ ├── java/ # Основний Java-код проекту
│ │ │ └── com/
│ │ │ └── yurii/
│ │ │ └── pavlenko/ # Кореневий пакет вашого застосунку
│ │ │ ├── application/
│ │ │ │ └── UniversityCmsApp.java # Головний клас Spring Boot
│ │ │ │ # (з @SpringBootApplication)
│ │ │ │
│ │ │ ├── model/ # Класи-сутності (JPA Entities)
│ │ │ │ ├── Person.java
│ │ │ │ ├── Student.java
│ │ │ │ ├── Teacher.java
│ │ │ │ ├── LaboratoryAssistant.java
│ │ │ │ ├── Scientist.java
│ │ │ │ ├── DeanOfFaculty.java
│ │ │ │ ├── RectorOfUniversity.java
│ │ │ │ ├── University.java
│ │ │ │ ├── Faculty.java
│ │ │ │ ├── Group.java
│ │ │ │ ├── Course.java
│ │ │ │ ├── Classroom.java
│ │ │ │ ├── Lesson.java
│ │ │ │ ├── StudentCourse.java
│ │ │ │ └── StudentProject.java
│ │ │ │
│ │ │ ├── repository/ # Інтерфейси Spring Data JPA репозиторіїв
│ │ │ │ ├── PersonRepository.java
│ │ │ │ ├── StudentRepository.java
│ │ │ │ ├── TeacherRepository.java
│ │ │ │ ├── LaboratoryAssistantRepository.java
│ │ │ │ ├── ScientistRepository.java
│ │ │ │ ├── DeanOfFacultyRepository.java
│ │ │ │ ├── RectorOfUniversityRepository.java
│ │ │ │ ├── UniversityRepository.java
│ │ │ │ ├── FacultyRepository.java
│ │ │ │ ├── GroupRepository.java
│ │ │ │ ├── CourseRepository.java
│ │ │ │ ├── ClassroomRepository.java
│ │ │ │ ├── LessonRepository.java
│ │ │ │ ├── StudentCourseRepository.java
│ │ │ │ └── StudentProjectRepository.java
│ │ │ │
│ │ │ ├── service/ # Класи бізнес-логіки
│ │ │ │ ├── ScheduleService.java
│ │ │ │ ├── StudentService.java
│ │ │ │ ├── TeacherService.java
│ │ │ │ └── ... (інші сервіси за потребою)
│ │ │ │
│ │ │ ├── controller/ # Контролери (REST API або MVC)
│ │ │ │ ├── ScheduleController.java
│ │ │ │ ├── StudentController.java
│ │ │ │ ├── TeacherController.java
│ │ │ │ └── ... (інші контролери)
│ │ │ │
│ │ │ ├── config/ # Класи конфігурації Spring
│ │ │ │ └── WebSecurityConfig.java
│ │ │ │
│ │ │ ├── dto/ # (Опціонально) Об'єкти передачі даних для API
│ │ │ │ ├── StudentScheduleDto.java
│ │ │ │ └── TeacherScheduleDto.java
│ │ │ │
│ │ │ └── exception/ # (Опціонально) Користувацькі винятки
│ │ │ └── ResourceNotFoundException.java
│ │ │
│ │ └── resources/ # Ресурси та конфігураційні файли
│ │ ├── application.yml # основна конфігурація Spring Boot
│ │ ├── db/migration/V1__init.sql # SQL-міграції
│ │ ├── static/ # Статичні файли (CSS, JavaScript, зображення)
│ │ │ ├── css/
│ │ │ ├── js/
│ │ │ └── images/
│ │ │ └── UML_Class_Diagram_University.png # Діаграма класів PNG
│ │ │
│ │ └── templates/ # Шаблони веб-сторінок (наприклад, Thymeleaf, JSP)
│ │ ├── schedule.html
│ │ └── ...
│ │
│ └── test/ # Тести
│ └── java/
│ └── com/
│ └── yurii/
│ └── pavlenko/
│ └── UniversityCmsAppTests.java # Тести для Spring Boot
│ └── repository/
│ └── service/
│ └── ...
│
├── logs/ # Директорія для файлів логів
│ └── application.log # Основний файл логів програми
├── pom.xml # Maven Project Object Model - файл конфігурації збірки
└── README.md # Опис проекту, діаграма, історії користувачів
У папці src/main/resources/db/migration/ розмісти SQL-міграції у форматі V1__init.sql, V2__insert_data.sql, тощо.
Flyway автоматично виконає їх при старті застосунку.
Для розробки можна використовувати локальний або docker-контейнер:
docker run --name university_cms_db -e POSTGRES_PASSWORD=1111 -e POSTGRES_DB=university_cms_db -p 5432:5432 -d postgres:14 datasource:
url: jdbc:postgresql://localhost:5432/university_cms_db
username: postgres
password: 1111
driver-class-name: org.postgresql.Driver
hikari:
minimum-idle: 5
maximum-pool-size: 10
jpa:
show-sql: true
hibernate:
ddl-auto: none
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.PostgreSQLDialect
flyway:
enabled: true
baseline-on-migrate: true
locations: classpath:db/migration
logging:
level:
root: info
com.yurii.pavlenko: debug
org.hibernate.SQL: debug
org.hibernate.orm.jdbc.bind: trace
report:
file:
path: C:/repository/university-cms/database-interaction-report.txt
mvn spring-boot:run
```bash
mvn clean package
java -jar target/university-cms-app.jar
Запуск з налаштуваннями бази даних через командний рядок:
Ви можете перевизначити параметри підключення до бази даних, передаючи їх як системні
властивості JVM за допомогою опції -D. Це корисно для динамічної конфігурації
без редагування файлів application.yml.
Приклад:
```bash
java -Dspring.datasource.url=jdbc:postgresql://localhost:5432/my_custom_db \
-Dspring.datasource.username=myuser \
-Dspring.datasource.password=mypassword \
-jar target/university-cms-app.jar
При перегенерації даних (після підтвердження користувачем в консолі "Y") всі таблиці бази даних
повністю очищаються за допомогою команди TRUNCATE TABLE ... RESTART IDENTITY CASCADE.
Це скидає лічильники ID для всіх таблиць, тому наступні ID починають генеруватися знову
з початкового значення (зазвичай 1).
mvn testВикористовується Testcontainers:
# src/test/resources/application-test.yml
spring:
datasource:
driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
url: jdbc:tc:postgresql:14.6:///test?currentSchema=public&TC_REUSABLE=true
username: root
password: test
hikari:
minimum-idle: 1
maximum-pool-size: 5
flyway:
enabled: true
locations: classpath:db/migration
jpa:
show-sql: false
hibernate:
ddl-auto: update
properties:
hibernate:
format_sql: false
Цей проєкт створений з навчальною метою та може бути використаний як шаблон.
