Эта заметка инспирирована статей на Хабре Разработка Java-проекта с ChatGPT-4: от идеи до реализации [1]. После ее прочтения автор начал экспериментировать в разработке ПО с различными AI ассистентами.
Увидев статью блога Jmix AI Assistant — ваш помощник в освоении Jmix [2], решил реализовать с помощью Jmix AI Assistant приложение аналогичное приведенному в статье [1].
Главное отличие от указанной статьи в том, что вся разработка будет вестись с помощью одного инструмента Jmix AI Assistant без использования сторонних генераторов кода.
Первая фаза эксперимента: анализ предметной области и генерация UML
Как и в статье [1] мы будем создавать с нуля образовательную платформу по типу условных Udemy или Coursera.
«Я хочу создать систему Образовательная платформа: создание системы для проведения онлайн курсов, тестирования и отслеживания прогресса студентов.
Укажи use cases для данной системы».
И получаем такой ответ:
Для системы образовательной платформы, предназначенной для проведения онлайн-курсов, тестирования и отслеживания прогресса студентов, можно выделить следующие основные сценарии использования (use cases):
Основные Use Cases
-
Регистрация пользователя
-
Акторы: Студент, Преподаватель, Администратор
-
Описание: Пользователь может зарегистрироваться на платформе, предоставив необходимые данные, такие как имя, адрес электронной почты и пароль.
-
-
Аутентификация пользователя
-
Акторы: Студент, Преподаватель, Администратор
-
Описание: Пользователь может войти в систему, используя свои учетные данные.
-
-
Просмотр доступных курсов
-
Акторы: Студент
-
Описание: Студент может просматривать список доступных курсов, включая описание, преподавателя и расписание.
-
-
Запись на курс
-
Акторы: Студент
-
Описание: Студент может записаться на выбранный курс.
-
-
Создание и управление курсами
-
Акторы: Преподаватель
-
Описание: Преподаватель может создавать новые курсы, добавлять материалы, устанавливать расписание и управлять содержимым курса.
-
-
Проведение онлайн-занятий
-
Акторы: Преподаватель, Студент
-
Описание: Преподаватель может проводить онлайн-занятия, а студенты могут участвовать в них.
-
-
Создание и проведение тестов
-
Акторы: Преподаватель
-
Описание: Преподаватель может создавать тесты и назначать их студентам.
-
-
Прохождение тестов
-
Акторы: Студент
-
Описание: Студент может проходить тесты, назначенные в рамках курса.
-
-
Отслеживание прогресса
-
Акторы: Студент, Преподаватель
-
Описание: Студент может отслеживать свой прогресс по курсу, а преподаватель может видеть прогресс всех студентов.
-
-
Управление пользователями
-
Акторы: Администратор
-
Описание: Администратор может управлять учетными записями пользователей, включая их создание, изменение и удаление.
-
-
Управление контентом
-
Акторы: Преподаватель, Администратор
-
Описание: Управление учебными материалами, включая загрузку, обновление и удаление контента.
-
-
Обратная связь и оценка
-
Акторы: Студент, Преподаватель
-
Описание: Студенты могут оставлять отзывы о курсах, а преподаватели могут оценивать работу студентов.
-
Дополнительные Use Cases
-
Уведомления и напоминания
-
Акторы: Студент, Преподаватель
-
Описание: Система отправляет уведомления о предстоящих занятиях, дедлайнах и других важных событиях.
-
-
Форумы и обсуждения
-
Акторы: Студент, Преподаватель
-
Описание: Возможность участия в форумах и обсуждениях, связанных с курсами.
-
Эти сценарии использования помогут в проектировании и разработке системы, обеспечивая основные функции, необходимые для эффективного обучения и управления образовательным процессом.
Описанные в ответе сценарии звучат логично, попробуем визуализировать эти требования.
Пишем следующий запрос для Jmix AI Assistant:
«Разработай UML-диаграмму в формате PlantUML для этих use cases.
Уточняющий запрос: могу ли я не использовать псевдонимы UC1, UC2, и т. д.? И разместить эту диаграмму вертикально, чтобы teacher был под student?»
Скрытый текст
Для создания UML-диаграммы use case в формате PlantUML, мы можем использовать текстовый формат, который будет описывать взаимодействие между актерами (студент, преподаватель, администратор) и системой. Мы можем не использовать псевдонимы UC1, UC2 и т. д., и разместить диаграмму вертикально, чтобы актёры были расположены один под другим.
Вот пример PlantUML кода для вашей системы образовательной платформы:
@startuml
left to right direction
actor Student
actor Teacher
actor Administrator
usecase "Регистрация пользователя" as UC_Register
usecase "Аутентификация пользователя" as UC_Authenticate
usecase "Просмотр доступных курсов" as UC_ViewCourses
usecase "Запись на курс" as UC_Enroll
usecase "Создание и управление курсами" as UC_ManageCourses
usecase "Проведение онлайн-занятий" as UC_ConductClasses
usecase "Создание и проведение тестов" as UC_CreateTests
usecase "Прохождение тестов" as UC_TakeTests
usecase "Отслеживание прогресса" as UC_TrackProgress
usecase "Управление пользователями" as UC_ManageUsers
usecase "Управление контентом" as UC_ManageContent
usecase "Обратная связь и оценка" as UC_Feedback
usecase "Уведомления и напоминания" as UC_Notifications
usecase "Форумы и обсуждения" as UC_Forums
Student --> UC_Register
Student --> UC_Authenticate
Student --> UC_ViewCourses
Student --> UC_Enroll
Student --> UC_TakeTests
Student --> UC_TrackProgress
Student --> UC_Feedback
Student --> UC_Notifications
Student --> UC_Forums
Teacher --> UC_Authenticate
Teacher --> UC_ManageCourses
Teacher --> UC_ConductClasses
Teacher --> UC_CreateTests
Teacher --> UC_TrackProgress
Teacher --> UC_ManageContent
Teacher --> UC_Feedback
Teacher --> UC_Notifications
Teacher --> UC_Forums
Administrator --> UC_Authenticate
Administrator --> UC_ManageUsers
Administrator --> UC_ManageContent
@enduml
Объяснение:
-
Актёры: Student, Teacher, и Admin представляют пользователей системы.
-
Сценарии использования: Каждый use case описывает функциональность, доступную для актёров.
-
Связи: Стрелки показывают, какие актёры могут выполнять какие сценарии использования.
Вертикальное расположение:
-
В PlantUML актёры по умолчанию располагаются горизонтально. Чтобы изменить это, можно использовать вертикальное расположение, как показано выше, где Teacher и Admin расположены под Student.
Эта диаграмма поможет визуализировать взаимодействие пользователей с системой и определить основные функциональные требования. Вы можете скопировать этот код в любой PlantUML-редактор, чтобы сгенерировать диаграмму.
Сгенерированный UML-скрипт был затем визуализирован с помощью опенсорсного инструмента PlantUML:

На следующем шаге создаем доменную модель. Задаем такой запрос для Jmix AI Assistant:
«Разработай доменную модель для системы, описанной на use case диаграмме: <сюда подставляем UML-скрипт>».
Получаем доменную модель с ключевыми сущностями, связанными с образовательной платформой, такими как пользователи, курсы, уроки, материалы, тесты, задания и другие:
Скрытый текст
Чтобы разработать модель домена для системы образовательной платформы, описанной в диаграмме вариантов использования, нам необходимо определить ключевые сущности и их взаимосвязи. Модель домена будет представлять основные понятия и их взаимодействие в системе.
Модель домена в PlantUML
Ниже приведен код PlantUML для модели домена образовательной платформы:
@startuml
class User {
+String username
+String password
+String email
+register()
+authenticate()
}
class Student {
+enrollInCourse(Course)
+takeTest(Test)
+trackProgress()
+giveFeedback(Course)
}
class Teacher {
+createCourse()
+manageCourse(Course)
+conductClass(Course)
+createTest(Course)
+trackStudentProgress(Student)
+manageContent(Content)
}
class Administrator {
+manageUsers(User)
+manageContent(Content)
}
class Course {
+String title
+String description
+List<Content> contents
+List<Student> enrolledStudents
+addContent(Content)
+removeContent(Content)
}
class Test {
+String title
+Date date
+Course course
+List<Question> questions
+addQuestion(Question)
+removeQuestion(Question)
}
class Content {
+String title
+String type
+String data
}
class Question {
+String text
+List<String> options
+String correctAnswer
}
class Notification {
+String message
+Date date
+sendTo(User)
}
class Forum {
+String topic
+List<Post> posts
+addPost(Post)
}
class Post {
+String author
+String content
+Date date
}
User <|-- Student
User <|-- Teacher
User <|-- Administrator
Course "1" -- "*" Content
Course "1" -- "*" Student
Course "1" -- "*" Test
Test "1" -- "*" Question
Forum "1" -- "*" Post
@enduml
Объяснение:
-
Сущности:
-
User: базовый класс для всех пользователей с общими атрибутами и методами.
-
Student, Teacher, Administrator: специализированные классы, наследуемые от User, каждый с определенными методами.
-
Course: представляет курс с такими атрибутами, как название и описание, а также методы управления контентом и учащимися.
-
Test и Question: представляют тесты и вопросы к ним, связанные с курсами.
-
Content: представляет учебные материалы в рамках курса.
-
Notification: представляет сообщения, отправленные пользователям.
-
Forum и Post: представляют дискуссионные форумы и записи в них.
-
-
Отношения:
-
Наследование используется для определения Student, Teacher, и Administrator как специализированных типов User.
-
Ассоциации между Course и Content, Student и Test используется для представления их отношений.
-
Test связан ассоциацией с Question для представления структуры теста.
-
Эта модель домена обеспечивает структурированное представление ключевых сущностей и их взаимодействий в системе образовательной платформы. Вы можете использовать эту модель в качестве основы для реализации логики бэкенда системы.
Визуализируем доменную модель с помощью того же инструмента:

Созданная модель сыровата, поэтому для ее доработки даем такой запрос Jmix AI Assistant:
«Уточни поля для классов Teacher, Student, Administrator».
Обновленная доменная модель выглядит так:

Теперь классы Teacher, Student и Administrator наследуются от базового класса User и имеют следующие дополнительные поля и связи, специфичные для каждой роли:
-
Student: Включает поля для отслеживания регистрации и прогресса.
-
Teacher: Включает поля для управления курсами и специализацией.
-
Administrator: Включает поля для управления ролями и разрешениями.
Продолжаем уточнять запрос:
«Переименуй Content в Module и добавь информацию по длительности для Material, Test и Assignment».
Получаем:

Теперь класс Content переименован в Module, а для классов Material, Test и Assignment добавлено новое поле «duration» для отражения длительности материала, теста или задания. Эта длительность может быть измерена в минутах, часах или днях в зависимости от контекста и требований системы.
Вторая фаза эксперимента: использование Jmix AI Assistant для реализации доменной модели на Java
Главное отличие от статьи [1] заключается в том, что разработка кода будет вестись с помощью Jmix AI Assistant без использования сторонних генераторов кода.
Для реализации доменной модели на Java даем такой запрос Jmix AI Assistant:
Реализовать доменную модель на JMIX
Получаем ответ:
Чтобы реализовать доменную модель образовательной платформы в Jmix, вам нужно определить сущности, которые представляют основные компоненты вашей системы. Ниже приведено пошаговое руководство по созданию этих сущностей с помощью Jmix, основанное на информации, полученной из документации и форумов.
Скрытый текст
Пошаговое решение
-
Создайте проект Jmix:
-
Убедитесь, что в IntelliJ IDEA установлена Jmix Studio.
-
Создайте новый проект Jmix или откройте существующий.
-
-
Определите сущности:
-
В Jmix сущности - это классы Java, аннотированные @JmixEntity и обычно расширяющие StandardEntity или BaseUuidEntity для автоматической генерации идентификаторов.
-
-
Создайте сущность User:
-
Это будет базовый класс для Student, Teacher и Administrator.
-
@JmixEntity
@Table(name = "USER")
@Entity
public class User extends BaseUuidEntity {
@Column(name = "USERNAME", nullable = false, unique = true)
private String username;
@Column(name = "PASSWORD", nullable = false)
private String password;
@Column(name = "EMAIL", nullable = false)
private String email;
// Getters and setters
}
-
Создайте сущность Student:
-
Расширьте класс User и добавьте определенные поля.
-
@JmixEntity
@Table(name = "STUDENT")
@Entity
public class Student extends User {
@Column(name = "STUDENT_ID", nullable = false, unique = true)
private String studentId;
@Column(name = "ENROLLMENT_DATE")
private LocalDate enrollmentDate;
// Relationships and additional fields
}
-
Создайте сущность Teacher:
-
Расширьте класс User и добавьте определенные поля.
-
@JmixEntity
@Table(name = "TEACHER")
@Entity
public class Teacher extends User {
@Column(name = "TEACHER_ID", nullable = false, unique = true)
private String teacherId;
@Column(name = "HIRE_DATE")
private LocalDate hireDate;
@Column(name = "SPECIALIZATION")
private String specialization;
// Relationships and additional fields
}
-
Создайте сущность Administrator:
-
Расширьте класс User и добавьте определенные поля.
-
@JmixEntity
@Table(name = "ADMINISTRATOR")
@Entity
public class Administrator extends User {
@Column(name = "ADMIN_ID", nullable = false, unique = true)
private String adminId;
@Column(name = "ROLE")
private String role;
// Additional fields
}
-
Создайте сущность Course:
-
Определите структуру курса и взаимосвязи.
-
@JmixEntity
@Table(name = "COURSE")
@Entity
public class Course extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "DESCRIPTION")
private String description;
// Relationships with Module, Student, etc.
}
-
Создайте сущность Module:
-
Представляет собой модуль в рамках курса.
-
@JmixEntity
@Table(name = "MODULE")
@Entity
public class Module extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "DESCRIPTION")
private String description;
// Relationships with Material, Test, Assignment
}
-
Создайте сущности Material, Test и Assignment:
-
Включите поля продолжительности duration.
-
@JmixEntity
@Table(name = "MATERIAL")
@Entity
public class Material extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "TYPE")
private String type;
@Column(name = "DATA")
private String data;
@Column(name = "DURATION")
private Integer duration; // Duration in minutes
}
@JmixEntity
@Table(name = "TEST")
@Entity
public class Test extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "DATE")
private LocalDate date;
@Column(name = "DURATION")
private Integer duration; // Duration in minutes
// Relationships with Question
}
@JmixEntity
@Table(name = "ASSIGNMENT")
@Entity
public class Assignment extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "DESCRIPTION")
private String description;
@Column(name = "DURATION")
private Integer duration; // Duration in minutes
@Column(name = "DUE_DATE")
private LocalDate dueDate;
}
Объяснение:
-
Наследование: Student, Teacher и Administrator расширяют сущность User для повторного использования общих полей.
-
Аннотации: Используйте @JmixEntity и @Table для определения сущностей и их таблиц базы данных.
-
Отношения: При необходимости определите отношения между объектами, используя аннотации JPA, такие как @OneToMany, @ManyToOne и т.д.
Это определяет комплексную доменную модель для вашей образовательной платформы, используя возможности Jmix по управлению сущностями и их сохранению.
Просим нейросеть разбить классы по пакетам:
Разбей все классы по пакетам, если базовый пакет ru.dva.eduplatform.model.
Каждый пакет должен содержать не более 5 классов.
Получаем ответ:
Чтобы организовать ваши классы модели предметной области в пакеты в базовом пакете ru.dva.eduplatform.model, мы классифицируем их на основе их функциональности и взаимосвязей. Это гарантирует, что каждый пакет будет содержать не более пяти классов, что сделает структуру более управляемой и удобной для сопровождения.
Структура пакетов
-
Базовый пакет: ru.dva.eduplatform.model
-
Это корневой пакет для всех ваших классов моделей.
-
-
Пакет User: ru.dva.eduplatform.model.user
-
Содержит классы, связанные с управлением пользователями и ролями.
-
-
Пакет Course: ru.dva.eduplatform.model.course
-
Содержит классы, связанные с курсами и их компонентами.
-
-
Пакет Content: ru.dva.eduplatform.model.content
-
Содержит классы, связанные с образовательным контентом и материалами.
-
-
Пакет Assessment: ru.dva.eduplatform.model.assessment
-
Содержит классы, связанные с тестами, заданиями и вопросами.
-
-
Пакет Communication: ru.dva.eduplatform.model.communication
-
Содержит классы, связанные с уведомлениями и форумами.
-
Подробное распределение классов
1. Пакет User: ru.dva.eduplatform.model.user
-
Классы:
-
User
-
Student
-
Teacher
-
Administrator
-
2. Пакет Course: ru.dva.eduplatform.model.course
-
Классы:
-
Course
-
Module
-
3. Пакет Content: ru.dva.eduplatform.model.content
-
Классы:
-
Material
-
4. Пакет Assessment: ru.dva.eduplatform.model.assessment
-
Классы:
-
Test
-
Assignment
-
Question
-
5. Пакет Communication: ru.dva.eduplatform.model.communication
-
Классы:
-
Notification
-
Forum
-
Post
-
Пример определения класса в пакете
Вот как можно определить класс User в пакете user:
package ru.dva.eduplatform.model.user;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@JmixEntity
@Table(name = "USER")
@Entity
public class User extends BaseUuidEntity {
@Column(name = "USERNAME", nullable = false, unique = true)
private String username;
@Column(name = "PASSWORD", nullable = false)
private String password;
@Column(name = "EMAIL", nullable = false)
private String email;
// Getters and setters
}
Объяснение:
-
Организация пакетов: Каждый пакет группирует связанные классы, при этом ни один пакет не превышает пяти классов.
-
Модульность: Такая структура повышает модульность, облегчая управление и расширение приложения.
-
Ремонтопригодность: Благодаря организации классов в логические пакеты кодовая база становится более удобной для сопровождения и навигации.
Эта структура пакетов поможет вам поддерживать чистую и организованную кодовую базу для вашей образовательной платформы.
Просим нейросеть разбить все классы по пакетам:
Убедись, что все импорты корректны и соответствуют созданным пакетам.
Выведи код всех классов, указав название пакета каждого класса и импорты.
Для каждого класса должен быть указан пакет.
Убедись, что в результатах есть все классы.
Получаем ответ:
Ниже приведен полный код для всех классов, организованный в соответствующие пакеты с правильным импортом. Каждый класс включает объявление пакета и необходимый импорт.
Скрытый текст
User Package: ru.dva.eduplatform.model.user
User.java
package ru.dva.eduplatform.model.user;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@JmixEntity
@Table(name = "USER")
@Entity
public class User extends BaseUuidEntity {
@Column(name = "USERNAME", nullable = false, unique = true)
private String username;
@Column(name = "PASSWORD", nullable = false)
private String password;
@Column(name = "EMAIL", nullable = false)
private String email;
// Getters and setters
}
Student.java
package ru.dva.eduplatform.model.user;
import io.jmix.core.metamodel.annotation.JmixEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import ru.dva.eduplatform.model.course.Course;
@JmixEntity
@Table(name = "STUDENT")
@Entity
public class Student extends User {
@Column(name = "STUDENT_ID", nullable = false, unique = true)
private String studentId;
@Column(name = "ENROLLMENT_DATE")
private LocalDate enrollmentDate;
// Relationships and additional fields
}
Teacher.java
package ru.dva.eduplatform.model.user;
import io.jmix.core.metamodel.annotation.JmixEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.time.LocalDate;
import java.util.List;
import ru.dva.eduplatform.model.course.Course;
import ru.dva.eduplatform.model.content.Content;
@JmixEntity
@Table(name = "TEACHER")
@Entity
public class Teacher extends User {
@Column(name = "TEACHER_ID", nullable = false, unique = true)
private String teacherId;
@Column(name = "HIRE_DATE")
private LocalDate hireDate;
@Column(name = "SPECIALIZATION")
private String specialization;
// Relationships and additional fields
}
Administrator.java
package ru.dva.eduplatform.model.user;
import io.jmix.core.metamodel.annotation.JmixEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Set;
import ru.dva.eduplatform.model.content.Content;
@JmixEntity
@Table(name = "ADMINISTRATOR")
@Entity
public class Administrator extends User {
@Column(name = "ADMIN_ID", nullable = false, unique = true)
private String adminId;
@Column(name = "ROLE")
private String role;
// Additional fields
}
Course Package: ru.dva.eduplatform.model.course
Course.java
package ru.dva.eduplatform.model.course;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.List;
import ru.dva.eduplatform.model.user.Student;
import ru.dva.eduplatform.model.content.Module;
@JmixEntity
@Table(name = "COURSE")
@Entity
public class Course extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "DESCRIPTION")
private String description;
// Relationships with Module, Student, etc.
}
Module.java
package ru.dva.eduplatform.model.course;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.List;
import ru.dva.eduplatform.model.content.Material;
import ru.dva.eduplatform.model.assessment.Test;
import ru.dva.eduplatform.model.assessment.Assignment;
@JmixEntity
@Table(name = "MODULE")
@Entity
public class Module extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "DESCRIPTION")
private String description;
// Relationships with Material, Test, Assignment
}
Content Package: ru.dva.eduplatform.model.content
Material.java
package ru.dva.eduplatform.model.content;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@JmixEntity
@Table(name = "MATERIAL")
@Entity
public class Material extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "TYPE")
private String type;
@Column(name = "DATA")
private String data;
@Column(name = "DURATION")
private Integer duration; // Duration in minutes
}
Assessment Package: ru.dva.eduplatform.model.assessment
Test.java
package ru.dva.eduplatform.model.assessment;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.time.LocalDate;
import java.util.List;
import ru.dva.eduplatform.model.course.Course;
import ru.dva.eduplatform.model.assessment.Question;
@JmixEntity
@Table(name = "TEST")
@Entity
public class Test extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "DATE")
private LocalDate date;
@Column(name = "DURATION")
private Integer duration; // Duration in minutes
// Relationships with Question
}
Assignment.java
package ru.dva.eduplatform.model.assessment;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.time.LocalDate;
@JmixEntity
@Table(name = "ASSIGNMENT")
@Entity
public class Assignment extends BaseUuidEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "DESCRIPTION")
private String description;
@Column(name = "DURATION")
private Integer duration; // Duration in minutes
@Column(name = "DUE_DATE")
private LocalDate dueDate;
}
Question.java
package ru.dva.eduplatform.model.assessment;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.List;
@JmixEntity
@Table(name = "QUESTION")
@Entity
public class Question extends BaseUuidEntity {
@Column(name = "TEXT", nullable = false)
private String text;
@Column(name = "OPTIONS")
private List<String> options;
@Column(name = "CORRECT_ANSWER")
private String correctAnswer;
}
Communication Package: ru.dva.eduplatform.model.communication
Notification.java
package ru.dva.eduplatform.model.communication;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.time.LocalDate;
import ru.dva.eduplatform.model.user.User;
@JmixEntity
@Table(name = "NOTIFICATION")
@Entity
public class Notification extends BaseUuidEntity {
@Column(name = "MESSAGE", nullable = false)
private String message;
@Column(name = "DATE")
private LocalDate date;
// Method to send notification to a user
}
Forum.java
package ru.dva.eduplatform.model.communication;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.List;
import ru.dva.eduplatform.model.communication.Post;
@JmixEntity
@Table(name = "FORUM")
@Entity
public class Forum extends BaseUuidEntity {
@Column(name = "TOPIC", nullable = false)
private String topic;
// Relationships with Post
}
Post.java
package ru.dva.eduplatform.model.communication;
import io.jmix.core.metamodel.annotation.JmixEntity;
import io.jmix.core.entity.BaseUuidEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.time.LocalDate;
@JmixEntity
@Table(name = "POST")
@Entity
public class Post extends BaseUuidEntity {
@Column(name = "AUTHOR", nullable = false)
private String author;
@Column(name = "CONTENT", nullable = false)
private String content;
@Column(name = "DATE")
private LocalDate date;
}
Объяснение:
-
Организация пакетов: Каждый класс помещается в пакет, отражающий его роль в системе, при этом ни один пакет не должен превышать пяти классов.
-
Импорт: Включены все необходимые файлы импорта, гарантирующие, что каждый класс может корректно функционировать в своем пакете.
-
Аннотации: Аннотации Jmix используются для определения сущностей и их сохранения в базе данных.
Этот код обеспечивает хорошо организованную и функциональную модель предметной области для вашей образовательной платформы с использованием Jmix.
Заключение
В рамках одной небольшой заметки невозможно рассказать обо всех наших экспериментах по разработке кода с помощью искусственного интеллекта.
Выполнение описанных экспериментов заняло не более пяти минут. К сожалению их описание потребовало значительно больше времени. Вероятно и прочтение этой заметки потребовало больше пяти минут.
Если эта тема интересна для читателей автор готов продолжить описание экспериментов по разработке кода с помощью Jmix AI Assistant, включая следующие:
-
Генерация класса, заполняющего доменную модель тестовыми данными
-
Обеспечение персистентности базы данных
-
Реализация REST API для модели домена, включая создание контроллеров и REST сервисов
-
Генерация пользовательского интерфейса
Автор: val6852