Ридми. Делал все сам, но дай бог поможет
This commit is contained in:
@@ -0,0 +1,244 @@
|
||||
# Вот промпт, который можно уложить в кодекс:
|
||||
Ты — опытный senior full‑stack архитектор и разработчик.
|
||||
Твоя задача — спроектировать и сгенерировать ПОЛНЫЙ каркас проекта
|
||||
(backend + frontend + инфраструктура), который будет использоваться
|
||||
для конвейера PDF→структурированный JSON→DOCX по шаблонам Word.
|
||||
|
||||
ВАЖНО:
|
||||
- Нужен готовый проект с понятной файловой структурой, рабочим билдом
|
||||
и запуском в Docker.
|
||||
- Нужна поддержка git: .gitignore, базовые скрипты, README.
|
||||
- Шаблоны Word создавать НЕ нужно. Нужно предусмотреть каталог,
|
||||
конфигурацию и код для их загрузки/использования, чтобы я мог сам
|
||||
положить .docx и сразу ими пользоваться.
|
||||
- Проект должен быть написан максимально понятно и аккуратно, с
|
||||
комментариями в ключевых местах.
|
||||
|
||||
---
|
||||
|
||||
## Технологический стек (можешь предлагать улучшения, но по умолчанию так):
|
||||
|
||||
### Общие требования
|
||||
- Ориентируемся на развёртывание в Linux‑среде, запуск через docker-compose.
|
||||
- Backend и frontend запускаются в отдельных контейнерах.
|
||||
- В перспективе backend будет общаться с локальной LLM (Qwen) через
|
||||
OpenAI‑совместимый API на внешнем сервере (например, Ollama),
|
||||
но до развёртывания этой модели мы будем ходить в облачную LLM.
|
||||
- Поэтому нужна конфигурируемая переменная окружения
|
||||
`LLM_BASE_URL` и `LLM_API_KEY`, а логика работы с LLM должна быть
|
||||
изолирована в отдельном слое‑адаптере.
|
||||
|
||||
### Backend
|
||||
- Язык: TypeScript.
|
||||
- Фреймворк: Node.js + NestJS ИЛИ Express + modular architecture
|
||||
(если считаешь, что Nest избыточен, обоснуй в комментариях README).
|
||||
- HTTP API (REST), без GraphQL.
|
||||
- Работа с файлами: загружать PDF, временно хранить их на диске,
|
||||
отдавать готовый DOCX, хранить метаданные задач в БД.
|
||||
- База данных: PostgreSQL (через Prisma или TypeORM — выбери один и
|
||||
задокументируй выбор).
|
||||
- Логирование: простой логгер (winston/pino) с выводом в консоль.
|
||||
- Конфигурация: через .env (используй библиотеку наподобие
|
||||
dotenv / @nestjs/config).
|
||||
- Поддержка CORS для фронтенда.
|
||||
|
||||
### Frontend
|
||||
- Язык: TypeScript.
|
||||
- Фреймворк: React + Vite или Next.js (на твой выбор, но без SSR‑сложностей,
|
||||
достаточно SPA, если берёшь Vite/React).
|
||||
- UI‑задача:
|
||||
- Страница с формой загрузки PDF:
|
||||
- поле выбора файла;
|
||||
- выбор типа документа/шаблона (просто select с dummy‑значениями
|
||||
вроде "ГОСТ‑1", "ГОСТ‑2" — пока они только передаются на backend);
|
||||
- кнопка «Отправить на обработку».
|
||||
- Отображение списка задач:
|
||||
- идентификатор задачи;
|
||||
- имя исходного файла;
|
||||
- статус (QUEUED / PROCESSING / DONE / ERROR);
|
||||
- ссылка для скачивания результата, если есть DOCX.
|
||||
- Простая страница деталей задачи (по id):
|
||||
- метаданные;
|
||||
- простой лог/ошибки, если были.
|
||||
- Верстка может быть минимальной, без сложного дизайна, главное —
|
||||
чистая архитектура и удобство доработки.
|
||||
|
||||
---
|
||||
|
||||
## Бизнес‑логика, которую нужно учесть
|
||||
|
||||
Цель системы: офисные сотрудники загружают PDF‑файл с технической документацией (ТЗ по ГОСТу и т.п.).
|
||||
Backend:
|
||||
|
||||
1. Принимает PDF и создаёт “задачу обработки” в БД.
|
||||
2. Сохраняет PDF в файловой системе (например, каталог `storage/input`).
|
||||
3. Отправляет PDF в отдельный n8n‑workflow ИЛИ обрабатывает локально
|
||||
цепочкой шагов (сейчас — просто заглушка, позже я подвяжу n8n).
|
||||
4. В перспективе pipeline будет такой:
|
||||
- PDF → парсер (вытаскиваем текст/Markdown);
|
||||
- Markdown → LLM (Qwen) → унифицированный JSON структуры документа;
|
||||
- JSON + Word‑шаблон → генератор DOCX;
|
||||
- результат сохраняем как DOCX в `storage/output`.
|
||||
Но в рамках этого задания тебе нужно:
|
||||
- СДЕЛАТЬ кодовые заготовки для этих шагов (интерфейсы, классы,
|
||||
абстракции, контроллеры, DTO, сервисы),
|
||||
- Реализовать «заглушки» (например, вместо реального вызова LLM и
|
||||
генератора DOCX возвращать фиктивный JSON/файл),
|
||||
- Чётко показать точки интеграции, где я потом подключу реальную
|
||||
обработку.
|
||||
|
||||
5. Backend должен предоставлять API:
|
||||
- `POST /api/jobs` — загрузка PDF:
|
||||
- multipart/form-data, поле `file`, опционально `templateType`.
|
||||
- возвращает объект задачи `{ id, status, fileName, createdAt }`.
|
||||
- `GET /api/jobs` — список задач (с пагинацией, query‑параметры).
|
||||
- `GET /api/jobs/:id` — детальная информация о задаче, включая
|
||||
путь/URL к результату, лог ошибок.
|
||||
- `GET /api/jobs/:id/result` — скачивание готового DOCX.
|
||||
- `GET /api/templates` — список доступных Word‑шаблонов (backend
|
||||
должен сканировать папку `templates/` и возвращать названия файлов /
|
||||
метаданные; сами .docx я положу вручную).
|
||||
- `POST /api/templates/reload` — принудительное перечитывание списка
|
||||
шаблонов (на будущее).
|
||||
|
||||
6. Статусы задач:
|
||||
- QUEUED, PROCESSING, DONE, ERROR.
|
||||
- Нужен enum и таблица/модель `Job` с полями:
|
||||
- id (uuid),
|
||||
- originalFileName,
|
||||
- storedFilePath,
|
||||
- resultFilePath (nullable),
|
||||
- status,
|
||||
- errorMessage (nullable),
|
||||
- templateType (строка),
|
||||
- createdAt, updatedAt.
|
||||
|
||||
7. Адаптер к LLM:
|
||||
- Нужен отдельный сервис/модуль (например, `llm/llmClient.ts`),
|
||||
который:
|
||||
- берёт на вход текст/markdown и возвращает JSON структуры
|
||||
документа (пока можно вернуть фиктивный JSON).
|
||||
- конфигурируется через переменные окружения:
|
||||
- `LLM_BASE_URL` — URL OpenAI‑совместимого API
|
||||
(в будущем это будет адрес локального Qwen на сервере Ollama).
|
||||
- `LLM_API_KEY` — токен для облачной модели (сейчас).
|
||||
- `LLM_MODEL` — имя модели (например, `gpt-4.1-mini` или другое).
|
||||
- Весь остальной код НЕ должен знать детали формата API конкретного
|
||||
поставщика, только использовать этот клиент/адаптер.
|
||||
|
||||
8. Адаптер генерации DOCX:
|
||||
- Отдельный сервис (например, `docx/docxGenerator.ts`), который:
|
||||
- принимает JSON структуры и имя шаблона;
|
||||
- находит шаблон в папке `templates/` (но сам шаблон не создаёт);
|
||||
- создаёт DOCX в `storage/output/<jobId>.docx`.
|
||||
- На этом этапе достаточно сделать заглушку:
|
||||
- например, создать простой текстовый DOCX через любую
|
||||
библиотеку (или даже временно создавать `.txt` файл, но
|
||||
оставить интерфейс и структуру под DOCX).
|
||||
- Важно: предусмотреть удобное место, куда я положу свои .docx
|
||||
шаблоны, и в README описать, как они должны называться
|
||||
и как выбираются.
|
||||
|
||||
***
|
||||
|
||||
## Инфраструктура и структура проекта
|
||||
|
||||
Пожалуйста, СГЕНЕРИРУЙ и ОПИШИ:
|
||||
|
||||
1. Общая структура репозитория (monorepo или два отдельных проекта — opиши выбор).
|
||||
Пример, если это monorepo:
|
||||
- `backend/`
|
||||
- `frontend/`
|
||||
- `docker/` (общие конфиги)
|
||||
- `templates/` (каталог для Word‑шаблонов)
|
||||
- `storage/input/` (исходные PDF, .gitignore внутри)
|
||||
- `storage/output/` (результирующие DOCX, .gitignore внутри)
|
||||
- `README.md`
|
||||
- `.gitignore`
|
||||
- `docker-compose.yml`
|
||||
|
||||
2. Файловая структура backend:
|
||||
- `src/main.ts`, `src/app.module.ts` (для Nest) или аналог для Express.
|
||||
- Модуль/пакет `jobs`:
|
||||
- контроллер для API задач;
|
||||
- сервис работы с задачами;
|
||||
- DTO и entity/модель для БД.
|
||||
- Модуль/пакет `files`:
|
||||
- загрузка файлов;
|
||||
- валидация типов;
|
||||
- работа с путями хранения.
|
||||
- Модуль/пакет `llm`:
|
||||
- клиент для LLM;
|
||||
- интерфейсы типов ответов.
|
||||
- Модуль/пакет `docx`:
|
||||
- генератор DOCX;
|
||||
- адаптер к будущему шаблонизатору Docx (docxtemplater/Pandoc/и т.п.).
|
||||
- Общий модуль `config` для работы с .env.
|
||||
- Конфиг Prisma/TypeORM и миграции для таблицы `Job`.
|
||||
|
||||
3. Файловая структура frontend:
|
||||
- Точка входа и маршрут `/` с формой загрузки и списком задач.
|
||||
- Компоненты:
|
||||
- `UploadForm`
|
||||
- `JobsList`
|
||||
- `JobDetails`
|
||||
- Сервис для общения с backend (например, `api/client.ts`), где:
|
||||
- базовый URL API берётся из env (`VITE_API_BASE_URL` и т.п.).
|
||||
- Простая система типов TypeScript для сущностей Job и Template.
|
||||
|
||||
4. .gitignore:
|
||||
- Исключить:
|
||||
- node_modules,
|
||||
- build‑артефакты,
|
||||
- .env и другие секреты,
|
||||
- `storage/input`, `storage/output`,
|
||||
- временные файлы IDE.
|
||||
|
||||
5. Docker:
|
||||
- `Dockerfile` для backend.
|
||||
- `Dockerfile` для frontend.
|
||||
- `docker-compose.yml`, который поднимает:
|
||||
- `backend` (с зависимостью от `db`);
|
||||
- `frontend`;
|
||||
- `db` (PostgreSQL);
|
||||
- Переменные окружения для docker‑compose с примером (файл `.env.example`).
|
||||
|
||||
6. README:
|
||||
- Пошаговая инструкция:
|
||||
- как установить зависимости;
|
||||
- как запустить проект локально без Docker;
|
||||
- как запустить через `docker-compose up`;
|
||||
- как добавить новый Word‑шаблон (куда положить .docx, как он
|
||||
подхватывается API `/api/templates`).
|
||||
- Пример запроса к API загрузки файла (curl).
|
||||
- Краткое объяснение архитектуры:
|
||||
- где слой LLM‑адаптера;
|
||||
- где слой генерации DOCX;
|
||||
- как в будущем подключить n8n и локальную Qwen.
|
||||
|
||||
***
|
||||
|
||||
## Формат ответа
|
||||
|
||||
Сформируй ответ в три части:
|
||||
|
||||
1. Краткое текстовое объяснение архитектуры (2–3 абзаца).
|
||||
2. Подробная структура файлов/папок в формате дерева с комментариями.
|
||||
3. Основные файлы кода как СНИППЕТЫ:
|
||||
- `docker-compose.yml`;
|
||||
- `backend/Dockerfile`, `frontend/Dockerfile`;
|
||||
- key‑файлы backend (main, контроллер задач, модель Job, LLM‑клиент,
|
||||
заглушка генератора DOCX);
|
||||
- key‑файлы frontend (главная страница, клиент API);
|
||||
- `.gitignore`;
|
||||
- `.env.example`;
|
||||
- выдержки из README с инструкциями.
|
||||
|
||||
Код можно не доводить до идеального продакшена, но он должен быть:
|
||||
- компилируемым,
|
||||
- структурированным,
|
||||
- с понятными комментариями, что и где доработать, чтобы подключить
|
||||
реальную LLM и реальный генератор DOCX по шаблонам Word.
|
||||
|
||||
Не упрощай задачу: сгенерируй именно полноценный каркас проекта,
|
||||
как если бы ты начинал реальный коммерческий проект под эту задачу.
|
||||
Reference in New Issue
Block a user