Проект MAIGENERATION - сайт, где можно сгенерировать цитаты наподобие Маевского цитатника или текст, как в ИА "Панорама МАИ". Backend написан на Java с помощью фреймворка Spring, frontend написан на React, так как генерация текста может занимать долгое время я использовал очередь сообщений RabbitMQ, сгенерированный текст сохраняется в БД (связь one-to-one). Чтобы сгенерировать текст нужно сначало авторизоваться, пользователь может посмотреть результат последнего запроса генерации текста. В качестве модели генерации текста взял medium GPT3 от Сбера, дообучал в Colaboratory.
Точка входа в приложение ингресс-контроллер, доступ настроен по хосту maigeneration.ru.
Манифесты
- Singleton
Spring по умолчанию создает ровно один экземпляр объекта, к который можно получить с помощью аннотации
Пример создание бина:
@Repository
public interface PostRepository extends JpaRepository<Posts, Long> {}
Пример получения объекта:
@Autowired
private PostRepository postRepository;
- Dependency injection и inversion of control (IOC)
IoC-контейнер в Spring, отвечает за создание объекта, связывание объектов вместе, конфигурирование объектов и обработку всего их жизненного цикла от создания до полного уничтожения.
В контейнере Spring используется инъекция зависимостей (Dependency Injection, DI) для управления компонентами приложения. Эти компоненты называются биныю
- Builder
User user = new User();
user.setEmail(sign.email());
user.setPassword(passwordEncode);
user.setUsername(sign.name());
- Chain of responsibility
Запрос проходит цепочку обработки
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.cors().and().csrf().disable()
.authorizeRequests()
.antMatchers("/getLast/**").hasRole("USER")
.antMatchers("/signout/**").hasRole("USER")
.antMatchers("/generation/**").hasRole("USER")
.and()
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
httpSecurity.headers().frameOptions().sameOrigin();
httpSecurity.addFilterBefore(filter, UsernamePasswordAuthenticationFilter.class);
return httpSecurity.build();
}
- Observer
Следит за появление сообщений в очереди.
@RabbitListener(queues = "textQueue")
public String[] listen(MyMessage message) throws URISyntaxException {
...
}
- Momento
Сериализация сообщения
@PostMapping("/generation")
public ResponseEntity<?> generate(@RequestBody GenerationModel model, Authentication authentication) throws URISyntaxException {
UserDetailsImp userDetailsImp = (UserDetailsImp) authentication.getPrincipal();
MyMessage message = new MyMessage(userDetailsImp.getId(), model.getCount(), List.of(new String[]{model.getText()}), model.getAuthor());
String[] response = (String[]) rabbitTemplate.convertSendAndReceive(exchange.getName(), "rpc", message);
return ResponseEntity.ok().body(response);
}
Десериализация сообщения
@RabbitListener(queues = "textQueue")
@Transactional
public String[] listen(MyMessage message) throws URISyntaxException {
...
}
-
repositories содержат 3 интерефейса с помощью которых можно обращаться к БД:
- PostRepository
- RoleRepository
- UserRepository
-
services содержит служебные классы - сервисы, которые выполняют бизнес-логику
- PostService
- RoleService
- UserService
-
contollers содержит контроллеры, обрабатывающие запросы.
- AuthController
- TextController
-
model содержит классы и рекорды, не реализующие никаких служебных интерфейсов сверх тех, которые нужны для бизнес-модели (нужны для получения, отправки запросов и сообщений)
-
filter - пакет, в котором содержатся классы для настройки авторизации
-
entity - пакет, в котором находятся сущности БД
-
security - пакет, в котором содержится реализация JWT токена и переопределение информация о пользователе
-
configure содержит конфигурацию приложения и очереди сообщений.
-
MaioopApplication - точка входа в приложение.
- train содержит ноутбук с обучение и датасет, maipassage - текст в стиле Маевского цитатника, panorama в стиле ИА "Панорама МАИ"
Идею взял из этой статьи - app простой сервер на фласке, обрабатывающий лишь один запрос - генерацию текста.
Использовал компоненты MaterialUI, есть несколько страниц: авторизация, регистрация, главная и страница с последним запросом