Ясно
Маркетплейс «от потребности к решению»: заказчик по сценарию уточняет и публикует карточку задачи с рейтингом готовности, исполнители находят её в…
О проекте
Команда: А да нууууу
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Маркетплейс «от потребности к решению»: заказчик по сценарию уточняет и публикует карточку задачи с рейтингом готовности, исполнители находят её в каталоге, присылают решения и переписываются, заказчик выбирает одно.
Как устроено
React + TypeScript + Vite через единый HTTP-адаптер обращается к модульному монолиту на Java 21 / Spring Boot (пользователи, потребности, предложения, чат). Данные в PostgreSQL с миграциями Flyway, авторизация через cookie-сессию и CSRF. Рейтинг готовности на 7 критериев (до 100 баллов) начисляется только за подтверждённые владельцем поля. Уточняющий диалог скриптовый, ИИ пока не подключён. Есть автономный mock-режим фронтенда.
Ключевые решения
- rule-based readiness rating
- scripted clarification dialog
- session auth + CSRF
- Flyway migrations
Особенности
Единственный в пачке Java/Spring-бэкенд с полноценной регистрацией, профилями исполнителей и перепиской. Правка сведений снимает подтверждение соответствующего критерия рейтинга.
Стек
Java 21 · Spring Boot · PostgreSQL · Flyway · React · TypeScript · Vite · Docker · Playwright · Maven
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-aa1c5b09-team.
README
README.mdЯсно — от потребности к решению
MVP команды «А да нууууу». React-фронтенд подключён к Java/Spring backend через единый HTTP-адаптер.
Потребитель описывает идею → отвечает на уточняющие вопросы → проверяет и публикует карточку. Исполнитель находит её в каталоге → отправляет решение → обсуждает его с заказчиком. Заказчик выбирает исполнителя; в «Моих предложениях» обновляется статус. В текущем MVP уточняющий диалог работает по сценарию; подключение модели ИИ — следующий этап.
Возможности MVP
- Регистрация, вход, личный и публичный профиль исполнителя.
- Создание и дополнение карточки потребности, общий каталог с поиском и фильтрами.
- Предложения решений, переписка заказчика с исполнителем и выбор одного решения.
- Рейтинг готовности задачи: семь критериев, до 100 баллов, явное подтверждение владельцем.
Архитектура
Веб-клиент React + TypeScript + Vite обращается к REST API Java 21 / Spring Boot. Бэкенд организован как модульный монолит: пользователи, потребности, предложения и переписка. Данные хранятся в PostgreSQL, миграции применяются Flyway. Авторизация — серверная cookie-сессия с CSRF-защитой. В режиме разработки Vite перенаправляет /api на порт 8080.
| Каталог | Содержимое |
|---|---|
frontend/ | Интерфейс, HTTP-адаптер и автономный деморежим |
backend/ | Java API, миграции и тесты |
scripts/ | Совместный запуск приложения |
demo/ | Ранний JavaFX-пример, не используется веб-приложением |
Полный запуск с backend
Нужны Docker Desktop, Java 21+ и Node.js 22.12+. Сначала запустите Docker Desktop, затем из корня проекта:
./scripts/start-dev.sh
Откройте http://127.0.0.1:5173. Скрипт запускает PostgreSQL на 5433, backend на 8080 и frontend на 5173. Остановка — Ctrl+C; контейнер базы сохраняет данные между запусками.
Если файл backend/.env отсутствует, для локальной базы используется пароль needboard-local-dev. Свой пароль можно задать в backend/.env по примеру backend/.env.example.
На Windows этот скрипт запускается в Git Bash. Альтернатива без Docker — установленный PostgreSQL 18 и два окна PowerShell из корня проекта.
Первое окно — база и бэкенд:
powershell -NoProfile -ExecutionPolicy Bypass -File .\backend\scripts\Start-Dev.ps1
Второе окно — фронтенд с настоящим API:
cd frontend
npm.cmd ci
$env:VITE_API_MODE = 'http'
$env:VITE_API_BASE_URL = '/api'
npm.cmd run dev -- --host 127.0.0.1 --port 5173 --strictPort
Путь к PostgreSQL при необходимости передаётся в Start-Dev.ps1 параметром -PostgresBin. Используйте один способ запуска базы; оба занимают порт 5433.
Рейтинг готовности
| Критерий | Баллы |
|---|---|
| Контекст и потребность | 20 |
| Данные и материалы | 20 |
| Ожидаемый результат | 15 |
| Критерии успеха | 15 |
| Ограничения | 10 |
| Пользователи | 10 |
| Связь с бизнесом | 10 |
Баллы начисляются за заполненные и подтверждённые владельцем сведения. После изменения сведений подтверждение соответствующего критерия снимается. Уровни: 0–39 — требует уточнения, 40–69 — рабочая, 70–89 — готовая, 90–100 — приоритетная. Низкий рейтинг не скрывает опубликованную задачу и не запрещает отклик. По умолчанию каталог поднимает готовые и приоритетные задачи выше; приоритетные также выделяются визуально.
Сервер возвращает итог и разбивку по критериям. Контракт рейтинга, REST API.
Сценарий демонстрации
- Зарегистрировать заказчика, создать потребность и ответить на вопросы.
- В редакторе указать ожидаемый результат и критерии успеха, сохранить карточку. Подтвердить заполненные критерии рейтинга и опубликовать задачу.
- В другом профиле браузера зарегистрировать исполнителя, найти задачу в каталоге и отправить предложение решения.
- Обменяться сообщениями и выбрать предложение со стороны заказчика.
Сборка
cd frontend
npm ci
npm run build
cd ../backend
./mvnw -DskipTests package
В PowerShell используйте npm.cmd и .\mvnw.cmd. Эти команды собирают приложение без запуска тестов. Инструкции проверки с отдельной тестовой базой приведены в backend/README.md.
Только frontend-демо
Нужен Node.js 22.12+ (проверено на Node.js 24).
cd frontend
npm ci
npm run dev
Открыть http://127.0.0.1:5173 и нажать «Открыть демо». Этот режим не требует Docker и Java.
По умолчанию используется mock без сервера. Данные сохраняются в браузере. ИИ и подготовленные демоисполнители отвечают по сценарию; между локальными аккаунтами можно отправлять свои предложения и сообщения. Кнопка «Демо исполнителя» открывает вторую сторону сценария. На опубликованную заявку также добавляются три демонстрационных предложения.
В серверном режиме регистрация автоматически выполняет вход, карточки и предложения хранятся в PostgreSQL, а сообщения передаются через backend. Уточняющий диалог пока использует локальный сценарий вопросов в браузере; итоговая карточка сохраняется на сервере.
Подробности: frontend/README.md, backend/README.md.
Технологии и архитектура описаны в техническом отчёте.
Авторы коммитов
История коммитов
- 2026-09-23 17:47docs: add technical project reporterasyl
- 2026-09-23 17:36feat: integrate task readiness rating and document MVP deliveryAnyar
- 2026-09-23 17:19feat: add personal and public provider profileserasyl
- 2026-09-23 17:01feat: integrate frontend with backend and add dev runerasyl
- 2026-09-23 16:23Merge remote-tracking branch 'origin/main'erasyl
- 2026-09-23 16:22feat: complete marketplace frontend flowerasyl
- 2026-09-23 16:07Merge remote-tracking branch 'origin/main'Anyar
- 2026-09-23 16:05BACKEND ANU2Anyar
Все коммиты (12)
- 2026-09-23 16:03BACKEND ANUAnyar
- 2026-09-23 15:38feat: add Yasno MVP frontenderasyl
- 2026-09-23 15:36frontenderasyl
- 2026-09-23 14:36new moduleAnyar
Структура репозитория (118 файлов)
.gitignore README.md TECHNICAL_REPORT.md backend/.env.example backend/.gitattributes backend/.gitignore backend/.mvn/wrapper/maven-wrapper.properties backend/README.md backend/TEAM_TASKS.md backend/compose.yaml backend/docs/READINESS_RATING.md backend/docs/api/READINESS.md backend/docs/api/README.md backend/mvnw backend/mvnw.cmd backend/pom.xml backend/scripts/Demo-Api.ps1 backend/scripts/Start-Dev.ps1 backend/scripts/Test-Backend.ps1 backend/src/main/java/kz/needboard/NeedboardApplication.java backend/src/main/java/kz/needboard/chat/ChatController.java backend/src/main/java/kz/needboard/chat/ChatMessage.java backend/src/main/java/kz/needboard/chat/ChatMessageRepository.java backend/src/main/java/kz/needboard/chat/ChatMessageView.java backend/src/main/java/kz/needboard/chat/ChatService.java backend/src/main/java/kz/needboard/common/ApiError.java backend/src/main/java/kz/needboard/common/ApiException.java backend/src/main/java/kz/needboard/common/ApiExceptionHandler.java backend/src/main/java/kz/needboard/common/PageResponse.java backend/src/main/java/kz/needboard/config/PasswordConfig.java backend/src/main/java/kz/needboard/config/SecurityConfig.java backend/src/main/java/kz/needboard/identity/AuthController.java backend/src/main/java/kz/needboard/identity/CurrentUser.java backend/src/main/java/kz/needboard/identity/ProviderController.java backend/src/main/java/kz/needboard/identity/ProviderProfileView.java backend/src/main/java/kz/needboard/identity/UserAccount.java backend/src/main/java/kz/needboard/identity/UserPrincipal.java backend/src/main/java/kz/needboard/identity/UserRepository.java backend/src/main/java/kz/needboard/identity/UserService.java backend/src/main/java/kz/needboard/identity/UserView.java backend/src/main/java/kz/needboard/needs/Need.java backend/src/main/java/kz/needboard/needs/NeedController.java backend/src/main/java/kz/needboard/needs/NeedRepository.java backend/src/main/java/kz/needboard/needs/NeedService.java backend/src/main/java/kz/needboard/needs/NeedStatus.java backend/src/main/java/kz/needboard/needs/api/NeedCardDraft.java backend/src/main/java/kz/needboard/needs/api/NeedCardRules.java backend/src/main/java/kz/needboard/needs/api/NeedView.java backend/src/main/java/kz/needboard/needs/api/NeedWriteRequest.java backend/src/main/java/kz/needboard/needs/api/ReadinessConfirmationRequest.java backend/src/main/java/kz/needboard/needs/api/ReadinessCriterion.java backend/src/main/java/kz/needboard/needs/api/ReadinessRating.java backend/src/main/java/kz/needboard/proposals/Proposal.java backend/src/main/java/kz/needboard/proposals/ProposalController.java backend/src/main/java/kz/needboard/proposals/ProposalRepository.java backend/src/main/java/kz/needboard/proposals/ProposalRequest.java backend/src/main/java/kz/needboard/proposals/ProposalService.java backend/src/main/java/kz/needboard/proposals/ProposalStatus.java backend/src/main/java/kz/needboard/proposals/ProposalView.java backend/src/main/resources/application.yml backend/src/main/resources/db/migration/V1__core.sql backend/src/main/resources/db/migration/V2__frontend_compatibility.sql backend/src/main/resources/db/migration/V3__provider_profiles.sql backend/src/main/resources/db/migration/V4__need_readiness.sql backend/src/test/java/kz/needboard/BackendIntegrationTests.java backend/src/test/java/kz/needboard/ReadinessRatingTests.java backend/src/test/resources/application-test.yml demo/.mvn/wrapper/maven-wrapper.jar demo/.mvn/wrapper/maven-wrapper.properties demo/demo.iml demo/mvnw demo/mvnw.cmd demo/pom.xml demo/src/main/java/com/example/demo/HelloApplication.java demo/src/main/java/com/example/demo/HelloController.java demo/src/main/java/com/example/demo/Launcher.java demo/src/main/java/module-info.java demo/src/main/resources/com/example/demo/hello-view.fxml frontend/.env.example frontend/API.md frontend/README.md frontend/index.html frontend/package-lock.json frontend/package.json frontend/playwright.config.ts frontend/public/favicon.svg frontend/src/api/http.ts frontend/src/api/index.ts frontend/src/api/mock.ts frontend/src/api/readiness.ts frontend/src/api/types.ts frontend/src/components/ChatPanel.tsx frontend/src/components/NeedPreview.tsx frontend/src/components/OfferForm.tsx frontend/src/components/OfferSummary.tsx frontend/src/components/Readiness.tsx frontend/src/components/SearchBanner.tsx frontend/src/components/Shell.tsx frontend/src/components/ui.tsx frontend/src/main.tsx frontend/src/pages/Auth.tsx frontend/src/pages/Catalog.tsx frontend/src/pages/Dashboard.tsx frontend/src/pages/Editor.tsx frontend/src/pages/Messages.tsx frontend/src/pages/MyOffers.tsx frontend/src/pages/Profile.tsx frontend/src/pages/RequestDetail.tsx frontend/src/styles/App.module.css frontend/src/styles/Profile.module.css frontend/src/styles/global.css frontend/src/vite-env.d.ts frontend/tests/http.spec.ts frontend/tests/journey.spec.ts frontend/tests/marketplace.spec.ts frontend/tsconfig.json frontend/vite.config.ts scripts/start-dev.sh
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.