Разработка Java-проекта с Jmix AI Assistant

от автора

Эта заметка инспирирована статей на Хабре Разработка 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

  1. Регистрация пользователя

    • Акторы: Студент, Преподаватель, Администратор

    • Описание: Пользователь может зарегистрироваться на платформе, предоставив необходимые данные, такие как имя, адрес электронной почты и пароль.

  2. Аутентификация пользователя

    • Акторы: Студент, Преподаватель, Администратор

    • Описание: Пользователь может войти в систему, используя свои учетные данные.

  3. Просмотр доступных курсов

    • Акторы: Студент

    • Описание: Студент может просматривать список доступных курсов, включая описание, преподавателя и расписание.

  4. Запись на курс

    • Акторы: Студент

    • Описание: Студент может записаться на выбранный курс.

  5. Создание и управление курсами

    • Акторы: Преподаватель

    • Описание: Преподаватель может создавать новые курсы, добавлять материалы, устанавливать расписание и управлять содержимым курса.

  6. Проведение онлайн-занятий

    • Акторы: Преподаватель, Студент

    • Описание: Преподаватель может проводить онлайн-занятия, а студенты могут участвовать в них.

  7. Создание и проведение тестов

    • Акторы: Преподаватель

    • Описание: Преподаватель может создавать тесты и назначать их студентам.

  8. Прохождение тестов

    • Акторы: Студент

    • Описание: Студент может проходить тесты, назначенные в рамках курса.

  9. Отслеживание прогресса

    • Акторы: Студент, Преподаватель

    • Описание: Студент может отслеживать свой прогресс по курсу, а преподаватель может видеть прогресс всех студентов.

  10. Управление пользователями

    • Акторы: Администратор

    • Описание: Администратор может управлять учетными записями пользователей, включая их создание, изменение и удаление.

  11. Управление контентом

    • Акторы: Преподаватель, Администратор

    • Описание: Управление учебными материалами, включая загрузку, обновление и удаление контента.

  12. Обратная связь и оценка

    • Акторы: Студент, Преподаватель

    • Описание: Студенты могут оставлять отзывы о курсах, а преподаватели могут оценивать работу студентов.

Дополнительные 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: базовый класс для всех пользователей с общими атрибутами и методами.

    • StudentTeacherAdministrator: специализированные классы, наследуемые от User, каждый с определенными методами.

    • Course: представляет курс с такими атрибутами, как название и описание, а также методы управления контентом и учащимися.

    • Test и Question: представляют тесты и вопросы к ним, связанные с курсами.

    • Content: представляет учебные материалы в рамках курса.

    • Notification: представляет сообщения, отправленные пользователям.

    • Forum и Post: представляют дискуссионные форумы и записи в них.

  • Отношения:

    • Наследование используется для определения StudentTeacher, и Administrator как специализированных типов User.

    • Ассоциации между Course и ContentStudent и 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, мы классифицируем их на основе их функциональности и взаимосвязей. Это гарантирует, что каждый пакет будет содержать не более пяти классов, что сделает структуру более управляемой и удобной для сопровождения.

Структура пакетов

  1. Базовый пакет: ru.dva.eduplatform.model

    • Это корневой пакет для всех ваших классов моделей.

  2. Пакет User: ru.dva.eduplatform.model.user

    • Содержит классы, связанные с управлением пользователями и ролями.

  3. Пакет Course: ru.dva.eduplatform.model.course

    • Содержит классы, связанные с курсами и их компонентами.

  4. Пакет Content: ru.dva.eduplatform.model.content

    • Содержит классы, связанные с образовательным контентом и материалами.

  5. Пакет Assessment: ru.dva.eduplatform.model.assessment

    • Содержит классы, связанные с тестами, заданиями и вопросами.

  6. Пакет 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 сервисов

  • Генерация пользовательского интерфейса


ссылка на оригинал статьи https://habr.com/ru/articles/891166/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *