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

в 14:47, , рубрики: AI, assistant, java, кодогенерация

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

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

На следующем шаге создаем доменную модель. Задаем такой запрос для 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 для представления структуры теста.

Эта модель домена обеспечивает структурированное представление ключевых сущностей и их взаимодействий в системе образовательной платформы. Вы можете использовать эту модель в качестве основы для реализации логики бэкенда системы.

Визуализируем доменную модель с помощью того же инструмента:

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

Созданная модель сыровата, поэтому для ее доработки даем такой запрос Jmix AI Assistant:

«Уточни поля для классов Teacher, Student, Administrator».

Обновленная доменная модель выглядит так:

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

Теперь классы Teacher, Student и Administrator наследуются от базового класса User и имеют следующие дополнительные поля и связи, специфичные для каждой роли:

  • Student: Включает поля для отслеживания регистрации и прогресса.

  • Teacher: Включает поля для управления курсами и специализацией.

  • Administrator: Включает поля для управления ролями и разрешениями.

Продолжаем уточнять запрос:

«Переименуй Content в Module и добавь информацию по длительности для Material, Test и Assignment».

Получаем:

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

Теперь класс 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 сервисов

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

Автор: val6852

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js